ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggYmJhY2E2ZC4uNzNjZTQ4MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTEsNCArMSwzIEBACi0jV2VkIE1hciAwMiAxNjowMDowNiBQU1QgMjAxMQogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9CkBAIC04LDYgKzcsOCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCkBAIC04MiwzNSArODMsMzcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTgwCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj00OAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbj0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeT04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2g9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKQEAgLTEyMSwzMCArMTI0LDMxIEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9sYW1iZGFfYm9keT1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTEyMAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2phdmFkb2NfYm91bmRhcmllcz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5wcmVzZXJ2ZV93aGl0ZV9zcGFjZV9iZXR3ZWVuX2NvZGVfYW5kX2xpbmVfY29tbWVudHM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5kaXNhYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9mZgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmVuYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvbgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKQEAgLTE1OCwxOCArMTYyLDE3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9maWVsZD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9sb2NhbF92YXJpYWJsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZW1iZXI9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWw9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfdHlwZV9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydApAQCAtMjE3LDYgKzIyMCw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0yMzUsMTIgKzIzOSwxNCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CkBAIC0yNjQsNiArMjcwLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0CkBAIC0yOTEsNiArMjk4LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0zMTksNiArMzI3LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3RyeT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydApAQCAtMzI4LDYgKzMzNyw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0zNDMsMTUgKzM1MywxNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTIwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj1zcGFjZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX29uX29mZl90YWdzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YUZvcm1hdHRlcj1vcmcuZWNsaXBzZS5qZHQuY29yZS5kZWZhdWx0SmF2YUZvcm1hdHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmluZGV4IDdlN2ZlNzMuLjZjOTgwMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTEsNyArMSw2NSBAQAorY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbWV0aG9kcz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zX2ludGVyZmFjZV9tZXRob2RzPXRydWUKK2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X2Z1bmN0aW9uYWxfaW50ZXJmYWNlcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCitjbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlX2NoYW5nZXNfb25seT1mYWxzZQorY2xlYW51cC5pbnNlcnRfaW5mZXJyZWRfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV9yZWR1bmRhbnRfdHlwZV9hcmd1bWVudHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Fub255bW91c19jbGFzc19jcmVhdGlvbj1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPXRydWUKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9sYW1iZGE9dHJ1ZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3R5cGVfYXJndW1lbnRzPWZhbHNlCitjbGVhbnVwX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIENsZWFuIFVwCiBjbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIGVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X015bHluIGJhc2VkIG9uIEVjbGlwc2UKK2Zvcm1hdHRlcl9wcm9maWxlPV9WaXJnbyBXZWIgU2VydmVyIC0gQ29kZSBGb3JtYXR0ZXIKIGZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEyCiBpbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAogb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvQnVuZGxvckNvcmVQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvQnVuZGxvckNvcmVQbHVnaW4uamF2YQppbmRleCA1NzBlZjExLi5kMzdkMDlmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci9pbnRlcm5hbC9jb3JlL0J1bmRsb3JDb3JlUGx1Z2luLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9CdW5kbG9yQ29yZVBsdWdpbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwpAQCAtMTUsNzUgKzE2LDc1IEBACiAKIC8qKgogICogQnVuZGxlIEFjdGl2YXRvciBvZiB0aGUgYnVuZGxvci5jb3JlIHBsdWdpbi4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBMZW8gRG9zIFNhbnRvcwogICogQHNpbmNlIDEuMS4yCiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbG9yQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7CiAKLQkvKiogVGhlIGJ1bmRsZSBzeW1ib2xpYyBuYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUiOworICAgIC8qKiBUaGUgYnVuZGxlIHN5bWJvbGljIG5hbWUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZSI7CiAKLQkvKiogVGhlIGlkIG9mIHRoZSBidW5kbG9yIGJ1aWxkZXIgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREVSX0lEID0gUExVR0lOX0lEICsgIi5idWlsZGVyIjsKKyAgICAvKiogVGhlIGlkIG9mIHRoZSBidW5kbG9yIGJ1aWxkZXIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMREVSX0lEID0gUExVR0lOX0lEICsgIi5idWlsZGVyIjsKIAotCS8qKiBUaGUgcHJvcGVydGllcyBrZXkgZm9yIHByb3BlcnRpZXMgZmlsZXMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9QUk9QRVJUSUVTX0ZJTEVfS0VZID0gInRlbXBsYXRlLnByb3BlcnRpZXMuZmlsZXMiOworICAgIC8qKiBUaGUgcHJvcGVydGllcyBrZXkgZm9yIHByb3BlcnRpZXMgZmlsZXMgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9QUk9QRVJUSUVTX0ZJTEVfS0VZID0gInRlbXBsYXRlLnByb3BlcnRpZXMuZmlsZXMiOwogCi0JLyoqIERlZmF1bHQgcHJvcGVydHkgdmFsdWUgZm9yIHByb3BlcnRpZXMgZmlsZXMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9QUk9QRVJUSUVTX0ZJTEVfREVGQVVMVCA9ICJ0ZW1wbGF0ZS5wcm9wZXJ0aWVzO2J1aWxkLnByb3BlcnRpZXMiOworICAgIC8qKiBEZWZhdWx0IHByb3BlcnR5IHZhbHVlIGZvciBwcm9wZXJ0aWVzIGZpbGVzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfUFJPUEVSVElFU19GSUxFX0RFRkFVTFQgPSAidGVtcGxhdGUucHJvcGVydGllcztidWlsZC5wcm9wZXJ0aWVzIjsKIAotCS8qKiBUaGUgcHJvcGVydGllcyBrZXkgZm9yIGJ5dGUgY29kZSB2cyBzb3VyY2UgY29kZSBzY2FubmluZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0JZVEVfQ09ERV9TQ0FOTklOR19LRVkgPSAiYnl0ZS5jb2RlLnNjYW5uaW5nIjsKKyAgICAvKiogVGhlIHByb3BlcnRpZXMga2V5IGZvciBieXRlIGNvZGUgdnMgc291cmNlIGNvZGUgc2Nhbm5pbmcgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9CWVRFX0NPREVfU0NBTk5JTkdfS0VZID0gImJ5dGUuY29kZS5zY2FubmluZyI7CiAKLQkvKiogRGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZSBmb3IgYnl0ZSBjb2RlIHZzIHNvdXJjZSBjb2RlIHNjYW5uaW5nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFRFTVBMQVRFX0JZVEVfQ09ERV9TQ0FOTklOR19ERUZBVUxUID0gZmFsc2U7CisgICAgLyoqIERlZmF1bHQgcHJvcGVydHkgdmFsdWUgZm9yIGJ5dGUgY29kZSB2cyBzb3VyY2UgY29kZSBzY2FubmluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBURU1QTEFURV9CWVRFX0NPREVfU0NBTk5JTkdfREVGQVVMVCA9IGZhbHNlOwogCi0JLyoqIFRoZSBwcm9wZXJ0aWVzIGtleSBmb3IgYXV0by1mb3JtYXR0aW5nIGdlbmVyYXRlZCBtYW5pZmVzdHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfR0VORVJBVEVEX01BTklGRVNUU19LRVkgPSAiYnVuZGxvci5nZW5lcmF0ZWQubWFuaWZlc3QuYXV0b2Zvcm1hdHRpbmciOworICAgIC8qKiBUaGUgcHJvcGVydGllcyBrZXkgZm9yIGF1dG8tZm9ybWF0dGluZyBnZW5lcmF0ZWQgbWFuaWZlc3RzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX0dFTkVSQVRFRF9NQU5JRkVTVFNfS0VZID0gImJ1bmRsb3IuZ2VuZXJhdGVkLm1hbmlmZXN0LmF1dG9mb3JtYXR0aW5nIjsKIAotCS8qKiBEZWZhdWx0IHByb3BlcnR5IHZhbHVlIGZvciBhdXRvLWZvcm1hdHRpbmcgZ2VuZXJhdGVkIG1hbmlmZXN0cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBGT1JNQVRfR0VORVJBVEVEX01BTklGRVNUU19ERUZBVUxUID0gZmFsc2U7CisgICAgLyoqIERlZmF1bHQgcHJvcGVydHkgdmFsdWUgZm9yIGF1dG8tZm9ybWF0dGluZyBnZW5lcmF0ZWQgbWFuaWZlc3RzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEZPUk1BVF9HRU5FUkFURURfTUFOSUZFU1RTX0RFRkFVTFQgPSBmYWxzZTsKIAotCS8qKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlICovCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxvckNvcmVQbHVnaW4gcGx1Z2luOworICAgIC8qKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQnVuZGxvckNvcmVQbHVnaW4gcGx1Z2luOwogCi0JLyoqIEhvbGRzIHJlZmVyZW5jZXMgdG8ge0BsaW5rIEluY3JlbWVudGFsUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3R9ICovCi0JcHJpdmF0ZSBJbmNyZW1lbnRhbFBhcnRpYWxNYW5pZmVzdE1hbmFnZXIgbWFuaWZlc3RNYW5hZ2VyOworICAgIC8qKiBIb2xkcyByZWZlcmVuY2VzIHRvIHtAbGluayBJbmNyZW1lbnRhbFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0fSAqLworICAgIHByaXZhdGUgSW5jcmVtZW50YWxQYXJ0aWFsTWFuaWZlc3RNYW5hZ2VyIG1hbmlmZXN0TWFuYWdlcjsKIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQkJbWFuaWZlc3RNYW5hZ2VyID0gbmV3IEluY3JlbWVudGFsUGFydGlhbE1hbmlmZXN0TWFuYWdlcigpOworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKKyAgICAgICAgcGx1Z2luID0gdGhpczsKKyAgICAgICAgdGhpcy5tYW5pZmVzdE1hbmFnZXIgPSBuZXcgSW5jcmVtZW50YWxQYXJ0aWFsTWFuaWZlc3RNYW5hZ2VyKCk7CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGx1Z2luID0gbnVsbDsKKyAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBCdW5kbG9yQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdW5kbG9yQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgeworICAgICAgICByZXR1cm4gcGx1Z2luOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHtAbGluayBJbmNyZW1lbnRhbFBhcnRpYWxNYW5pZmVzdE1hbmFnZXJ9LgotCSAqLwotCXB1YmxpYyBJbmNyZW1lbnRhbFBhcnRpYWxNYW5pZmVzdE1hbmFnZXIgZ2V0TWFuaWZlc3RNYW5hZ2VyKCkgewotCQlyZXR1cm4gbWFuaWZlc3RNYW5hZ2VyOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSW5jcmVtZW50YWxQYXJ0aWFsTWFuaWZlc3RNYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5jcmVtZW50YWxQYXJ0aWFsTWFuaWZlc3RNYW5hZ2VyIGdldE1hbmlmZXN0TWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWFuaWZlc3RNYW5hZ2VyOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9CdW5kbG9yUHJvamVjdEJ1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvQnVuZGxvclByb2plY3RCdWlsZGVyLmphdmEKaW5kZXggMDUyNGU5Ni4uMjQ3NjllYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9CdW5kbG9yUHJvamVjdEJ1aWxkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci9pbnRlcm5hbC9jb3JlL0J1bmRsb3JQcm9qZWN0QnVpbGRlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwpAQCAtOTMsNyArOTQsNyBAQAogLyoqCiAgKiB7QGxpbmsgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcn0gdGhhdCBydW5zIG9uIGEgYnVuZGxlIHByb2plY3QgYW5kIGdlbmVyYXRlcyB0aGUgTUFOSUZFU1QuTUYgYmFzZWQgb24gYWN0dWFsCiAgKiBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc291cmNlIGNvZGUgYW5kIHRoZSBCdW5kbG9yIHRlbXBsYXRlLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAYXV0aG9yIExlbyBEb3MgU2FudG9zCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgpAQCAtMTAyLDgwNCArMTAzLDc3MiBAQAogQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKIHB1YmxpYyBjbGFzcyBCdW5kbG9yUHJvamVjdEJ1aWxkZXIgZXh0ZW5kcyBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfWE1MX1BBVEggPSAiV0VCLUlORi93ZWIueG1sIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1hNTF9QQVRIID0gIldFQi1JTkYvd2ViLnhtbCI7CiAKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfRklMRV9FWFRFTlNJT04gPSAiLmNsYXNzIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfRklMRV9FWFRFTlNJT04gPSAiLmNsYXNzIjsKIAotCS8qKiBEZWxldGVkIHNvdXJjZXMgZnJvbSBhIHNvdXJjZSBkaXJlY3RvcnkgKi8KLQlwcml2YXRlIGZpbmFsIFNldDxJUmVzb3VyY2U+IGRlbGV0ZWRTb3VyY2VSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxJUmVzb3VyY2U+KCk7CisgICAgLyoqIERlbGV0ZWQgc291cmNlcyBmcm9tIGEgc291cmNlIGRpcmVjdG9yeSAqLworICAgIHByaXZhdGUgZmluYWwgU2V0PElSZXNvdXJjZT4gZGVsZXRlZFNvdXJjZVJlc291cmNlcyA9IG5ldyBIYXNoU2V0PElSZXNvdXJjZT4oKTsKIAotCS8qKiBEZWxldGVkIHNvdXJjZXMgZnJvbSBhIHRlc3Qgc291cmNlIGRpcmVjdG9yeSAqLwotCXByaXZhdGUgZmluYWwgU2V0PElSZXNvdXJjZT4gZGVsZXRlZFRlc3RSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxJUmVzb3VyY2U+KCk7CisgICAgLyoqIERlbGV0ZWQgc291cmNlcyBmcm9tIGEgdGVzdCBzb3VyY2UgZGlyZWN0b3J5ICovCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVJlc291cmNlPiBkZWxldGVkVGVzdFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PElSZXNvdXJjZT4oKTsKIAotCS8qKiBDaGFuZ2Ugb3IgbmV3IHNvdXJjZXMgZnJvbSBhIHNvdXJjZSBkaXJlY3RvcnkgKi8KLQlwcml2YXRlIGZpbmFsIFNldDxJUmVzb3VyY2U+IHNvdXJjZVJlc291cmNlcyA9IG5ldyBIYXNoU2V0PElSZXNvdXJjZT4oKTsKKyAgICAvKiogQ2hhbmdlIG9yIG5ldyBzb3VyY2VzIGZyb20gYSBzb3VyY2UgZGlyZWN0b3J5ICovCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVJlc291cmNlPiBzb3VyY2VSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxJUmVzb3VyY2U+KCk7CiAKLQkvKiogQ2hhbmdlIG9yIG5ldyBzb3VyY2VzIGZyb20gYSB0ZXN0IHNvdXJjZSBkaXJlY3RvcnkgKi8KLQlwcml2YXRlIGZpbmFsIFNldDxJUmVzb3VyY2U+IHRlc3RSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxJUmVzb3VyY2U+KCk7CisgICAgLyoqIENoYW5nZSBvciBuZXcgc291cmNlcyBmcm9tIGEgdGVzdCBzb3VyY2UgZGlyZWN0b3J5ICovCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVJlc291cmNlPiB0ZXN0UmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8SVJlc291cmNlPigpOwogCi0JLyoqCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBNQU5JRkVTVC5NRiwgVEVTVC5NRiBvciB0ZW1wbGF0ZS5tZiBoYXMgYmVlbiBjaGFuZ2VkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZvcmNlRnVsbEJ1aWxkID0gZmFsc2U7CisgICAgLyoqCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBNQU5JRkVTVC5NRiwgVEVTVC5NRiBvciB0ZW1wbGF0ZS5tZiBoYXMgYmVlbiBjaGFuZ2VkCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGZvcmNlRnVsbEJ1aWxkID0gZmFsc2U7CiAKLQkvKiogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgQnVuZGxvciBzaG91bGQgc2NhbiBieXRlIGNvZGUgaW5zdGVhZCBvZiBzb3VyY2UgY29kZSAqLwotCXByaXZhdGUgYm9vbGVhbiBzY2FuQnl0ZUNvZGUgPSB0cnVlOworICAgIC8qKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBCdW5kbG9yIHNob3VsZCBzY2FuIGJ5dGUgY29kZSBpbnN0ZWFkIG9mIHNvdXJjZSBjb2RlICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNjYW5CeXRlQ29kZSA9IHRydWU7CiAKLQlwcml2YXRlIGZpbmFsIExpc3Q8SW1wb3J0ZWRQYWNrYWdlPiB0ZW1wbGF0ZVBhY2thZ2VJbXBvcnRzID0gbmV3IEFycmF5TGlzdDxJbXBvcnRlZFBhY2thZ2U+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEltcG9ydGVkUGFja2FnZT4gdGVtcGxhdGVQYWNrYWdlSW1wb3J0cyA9IG5ldyBBcnJheUxpc3Q8SW1wb3J0ZWRQYWNrYWdlPigpOwogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUHJvamVjdFtdIGJ1aWxkKGludCBraW5kLCBNYXAgYXJncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBJUHJvamVjdFtdIGJ1aWxkKGludCBraW5kLCBNYXAgYXJncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAKLQkJLy8gQ2xlYW4gb3V0IG9sZCBzdGF0ZQotCQlkZWxldGVkU291cmNlUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCXNvdXJjZVJlc291cmNlcy5jbGVhcigpOwotCQlkZWxldGVkVGVzdFJlc291cmNlcy5jbGVhcigpOwotCQl0ZXN0UmVzb3VyY2VzLmNsZWFyKCk7Ci0JCXRlbXBsYXRlUGFja2FnZUltcG9ydHMuY2xlYXIoKTsKLQkJZm9yY2VGdWxsQnVpbGQgPSBmYWxzZTsKKyAgICAgICAgLy8gQ2xlYW4gb3V0IG9sZCBzdGF0ZQorICAgICAgICB0aGlzLmRlbGV0ZWRTb3VyY2VSZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgdGhpcy5zb3VyY2VSZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgdGhpcy5kZWxldGVkVGVzdFJlc291cmNlcy5jbGVhcigpOworICAgICAgICB0aGlzLnRlc3RSZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgdGhpcy50ZW1wbGF0ZVBhY2thZ2VJbXBvcnRzLmNsZWFyKCk7CisgICAgICAgIHRoaXMuZm9yY2VGdWxsQnVpbGQgPSBmYWxzZTsKIAotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGdldERlbHRhKHByb2plY3QpOworICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOworICAgICAgICBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGdldERlbHRhKHByb2plY3QpOwogCi0JCS8vIEdldCB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5nCi0JCXNjYW5CeXRlQ29kZSA9IGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KS5nZXRCb29sZWFuKEJ1bmRsb3JDb3JlUGx1Z2luLlRFTVBMQVRFX0JZVEVfQ09ERV9TQ0FOTklOR19LRVksCi0JCQkJQnVuZGxvckNvcmVQbHVnaW4uVEVNUExBVEVfQllURV9DT0RFX1NDQU5OSU5HX0RFRkFVTFQpOworICAgICAgICAvLyBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZworICAgICAgICB0aGlzLnNjYW5CeXRlQ29kZSA9IGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KS5nZXRCb29sZWFuKEJ1bmRsb3JDb3JlUGx1Z2luLlRFTVBMQVRFX0JZVEVfQ09ERV9TQ0FOTklOR19LRVksCisgICAgICAgICAgICBCdW5kbG9yQ29yZVBsdWdpbi5URU1QTEFURV9CWVRFX0NPREVfU0NBTk5JTkdfREVGQVVMVCk7CiAKLQkJLy8gUHJlcGFyZSB0aGUgbGlzdCBvZiBjaGFuZ2VkIHJlc291cmNlcwotCQl2aXNpdFJlc291cmNlRGVsdGEocHJvamVjdCwga2luZCwgZGVsdGEpOworICAgICAgICAvLyBQcmVwYXJlIHRoZSBsaXN0IG9mIGNoYW5nZWQgcmVzb3VyY2VzCisgICAgICAgIHZpc2l0UmVzb3VyY2VEZWx0YShwcm9qZWN0LCBraW5kLCBkZWx0YSk7CiAKLQkJLy8gVHJpZ2dlciBidWlsZAotCQlidWlsZChraW5kLCBtb25pdG9yKTsKKyAgICAgICAgLy8gVHJpZ2dlciBidWlsZAorICAgICAgICBidWlsZChraW5kLCBtb25pdG9yKTsKIAotCQkvLyBSZWZyZXNoIFBERSBtYW5pZmVzdCBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdAotCQlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQorICAgICAgICAvLyBSZWZyZXNoIFBERSBtYW5pZmVzdCBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdAorICAgICAgICBJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOworICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKyAgICAgICAgfQogCi0JCXJldHVybiBudWxsOwotCX0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB7QGxpbmsgSVJlc291cmNlfSBpcyBlaXRoZXIgb24gc291cmNlIG9yIHRlc3Qgc291cmNlIGZvbGRlcnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJlc291cmNlSWZJblNvdXJjZUZvbGRlcihJUmVzb3VyY2UgcmVzb3VyY2UsIFNldDxJQ2xhc3NwYXRoRW50cnk+IGNsYXNzcGF0aEVudHJpZXMsCi0JCQlTZXQ8SUNsYXNzcGF0aEVudHJ5PiB0ZXN0Q2xhc3NwYXRoRW50cmllcykgewotCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGNsYXNzcGF0aEVudHJpZXMpIHsKLQkJCWlmIChlbnRyeS5nZXRQYXRoKCkuaXNQcmVmaXhPZihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSkgewotCQkJCXNvdXJjZVJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IHRlc3RDbGFzc3BhdGhFbnRyaWVzKSB7Ci0JCQlpZiAoZW50cnkuZ2V0UGF0aCgpLmlzUHJlZml4T2YocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSkpIHsKLQkJCQl0ZXN0UmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4ge0BsaW5rIElSZXNvdXJjZX0gaXMgZWl0aGVyIG9uIHNvdXJjZSBvciB0ZXN0IHNvdXJjZSBmb2xkZXJzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRSZXNvdXJjZUlmSW5Tb3VyY2VGb2xkZXIoSVJlc291cmNlIHJlc291cmNlLCBTZXQ8SUNsYXNzcGF0aEVudHJ5PiBjbGFzc3BhdGhFbnRyaWVzLCBTZXQ8SUNsYXNzcGF0aEVudHJ5PiB0ZXN0Q2xhc3NwYXRoRW50cmllcykgeworICAgICAgICBmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGNsYXNzcGF0aEVudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRQYXRoKCkuaXNQcmVmaXhPZihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSkgeworICAgICAgICAgICAgICAgIHRoaXMuc291cmNlUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogdGVzdENsYXNzcGF0aEVudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRQYXRoKCkuaXNQcmVmaXhPZihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSkgeworICAgICAgICAgICAgICAgIHRoaXMudGVzdFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgdm9pZCBidWlsZChpbnQga2luZCwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSB2b2lkIGJ1aWxkKGludCBraW5kLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAotCQltb25pdG9yLmJlZ2luVGFzaygiU2Nhbm5pbmcgc291cmNlIGNvZGUgdG8gZ2VuZXJhdGUgTUFOSUZFU1QuTUYiLCBzb3VyY2VSZXNvdXJjZXMuc2l6ZSgpICsgdGVzdFJlc291cmNlcy5zaXplKCkpOworICAgICAgICBtb25pdG9yLmJlZ2luVGFzaygiU2Nhbm5pbmcgc291cmNlIGNvZGUgdG8gZ2VuZXJhdGUgTUFOSUZFU1QuTUYiLCB0aGlzLnNvdXJjZVJlc291cmNlcy5zaXplKCkgKyB0aGlzLnRlc3RSZXNvdXJjZXMuc2l6ZSgpKTsKIAotCQkvLyBObyByZXNvdXJjZXMgc2VsZWN0ZWQgLT4gb24gcmVsZXZhbnQgY2hhbmdlCi0JCWlmIChzb3VyY2VSZXNvdXJjZXMuc2l6ZSgpID09IDAgJiYgdGVzdFJlc291cmNlcy5zaXplKCkgPT0gMCAmJiBkZWxldGVkU291cmNlUmVzb3VyY2VzLnNpemUoKSA9PSAwCi0JCQkJJiYgZGVsZXRlZFRlc3RSZXNvdXJjZXMuc2l6ZSgpID09IDAgJiYgIWZvcmNlRnVsbEJ1aWxkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KKyAgICAgICAgLy8gTm8gcmVzb3VyY2VzIHNlbGVjdGVkIC0+IG9uIHJlbGV2YW50IGNoYW5nZQorICAgICAgICBpZiAodGhpcy5zb3VyY2VSZXNvdXJjZXMuc2l6ZSgpID09IDAgJiYgdGhpcy50ZXN0UmVzb3VyY2VzLnNpemUoKSA9PSAwICYmIHRoaXMuZGVsZXRlZFNvdXJjZVJlc291cmNlcy5zaXplKCkgPT0gMAorICAgICAgICAgICAgJiYgdGhpcy5kZWxldGVkVGVzdFJlc291cmNlcy5zaXplKCkgPT0gMCAmJiAhdGhpcy5mb3JjZUZ1bGxCdWlsZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJLy8gSW5jcmVhc2Ugc2NvcGUgb2YgYnVpbGQgdG8gRlVMTF9CVUlMRCBpZiB0ZW1wbGF0ZS5tZiwgTUFOSUZFU1QuTUYgb3IKLQkJLy8gVEVTVC5NRiBoYXMgY2hhbmdlZAotCQlpZiAoZm9yY2VGdWxsQnVpbGQpIHsKLQkJCWtpbmQgPSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQ7Ci0JCX0KKyAgICAgICAgLy8gSW5jcmVhc2Ugc2NvcGUgb2YgYnVpbGQgdG8gRlVMTF9CVUlMRCBpZiB0ZW1wbGF0ZS5tZiwgTUFOSUZFU1QuTUYgb3IKKyAgICAgICAgLy8gVEVTVC5NRiBoYXMgY2hhbmdlZAorICAgICAgICBpZiAodGhpcy5mb3JjZUZ1bGxCdWlsZCkgeworICAgICAgICAgICAga2luZCA9IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRDsKKyAgICAgICAgfQogCi0JCUluY3JlbWVudGFsUGFydGlhbE1hbmlmZXN0TWFuYWdlciBtYW5pZmVzdE1hbmFnZXIgPSBCdW5kbG9yQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TWFuaWZlc3RNYW5hZ2VyKCk7CisgICAgICAgIEluY3JlbWVudGFsUGFydGlhbE1hbmlmZXN0TWFuYWdlciBtYW5pZmVzdE1hbmFnZXIgPSBCdW5kbG9yQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TWFuaWZlc3RNYW5hZ2VyKCk7CiAKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGdldFByb2plY3QoKSk7CisgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShnZXRQcm9qZWN0KCkpOwogCi0JCS8vIE5vIGluY3JlbWVudGFsIG1hbmlmZXN0IG1vZGVsIGhhcyBiZWVuIHJlY29yZGVkIG9yIHRoZSBidWlsZCBpcyBhCi0JCS8vIGZ1bGwgYnVpbGQKLQkJZmluYWwgYm9vbGVhbiBpc0Z1bGxCdWlsZCA9ICFtYW5pZmVzdE1hbmFnZXIuaGFzUGFydGlhbE1hbmlmZXN0KGphdmFQcm9qZWN0KQotCQkJCXx8IGtpbmQgPT0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxEOworICAgICAgICAvLyBObyBpbmNyZW1lbnRhbCBtYW5pZmVzdCBtb2RlbCBoYXMgYmVlbiByZWNvcmRlZCBvciB0aGUgYnVpbGQgaXMgYQorICAgICAgICAvLyBmdWxsIGJ1aWxkCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNGdWxsQnVpbGQgPSAhbWFuaWZlc3RNYW5hZ2VyLmhhc1BhcnRpYWxNYW5pZmVzdChqYXZhUHJvamVjdCkgfHwga2luZCA9PSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQ7CiAKLQkJZmluYWwgUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3QgbW9kZWwgPSBtYW5pZmVzdE1hbmFnZXIuZ2V0UGFydGlhbE1hbmlmZXN0KGphdmFQcm9qZWN0LCBmYWxzZSwgaXNGdWxsQnVpbGQpOwotCQlmaW5hbCBSZWFkYWJsZVBhcnRpYWxNYW5pZmVzdCB0ZXN0TW9kZWwgPSBtYW5pZmVzdE1hbmFnZXIuZ2V0UGFydGlhbE1hbmlmZXN0KGphdmFQcm9qZWN0LCB0cnVlLCBpc0Z1bGxCdWlsZCk7CisgICAgICAgIGZpbmFsIFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0IG1vZGVsID0gbWFuaWZlc3RNYW5hZ2VyLmdldFBhcnRpYWxNYW5pZmVzdChqYXZhUHJvamVjdCwgZmFsc2UsIGlzRnVsbEJ1aWxkKTsKKyAgICAgICAgZmluYWwgUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3QgdGVzdE1vZGVsID0gbWFuaWZlc3RNYW5hZ2VyLmdldFBhcnRpYWxNYW5pZmVzdChqYXZhUHJvamVjdCwgdHJ1ZSwgaXNGdWxsQnVpbGQpOwogCi0JCVByb3BlcnRpZXNTb3VyY2VbXSBwcm9wZXJ0aWVzU291cmNlcyA9IGNyZWF0ZVByb3BlcnRpZXNTb3VyY2UoamF2YVByb2plY3QpOworICAgICAgICBQcm9wZXJ0aWVzU291cmNlW10gcHJvcGVydGllc1NvdXJjZXMgPSBjcmVhdGVQcm9wZXJ0aWVzU291cmNlKGphdmFQcm9qZWN0KTsKIAotCQkvLyBGaXJzdGx5IGNyZWF0ZSB0aGUgTUFORklFU1QuTUYKLQkJQXJ0aWZhY3RBbmFseXplciBhcnRlZmFjdEFuYWx5c2VyID0gKHNjYW5CeXRlQ29kZQotCQkJCT8gbmV3IFByb2dyZXNzUmVwb3J0aW5nQXNtVHlwZUFydGVmYWN0QW5hbHlzZXIobW9uaXRvcikKLQkJCQk6IG5ldyBQcm9ncmVzc1JlcG9ydGluZ0FzdFR5cGVBcnRlZmFjdEFuYWx5c2VyKGphdmFQcm9qZWN0LCBtb25pdG9yKSk7CisgICAgICAgIC8vIEZpcnN0bHkgY3JlYXRlIHRoZSBNQU5GSUVTVC5NRgorICAgICAgICBBcnRpZmFjdEFuYWx5emVyIGFydGVmYWN0QW5hbHlzZXIgPSB0aGlzLnNjYW5CeXRlQ29kZSA/IG5ldyBQcm9ncmVzc1JlcG9ydGluZ0FzbVR5cGVBcnRlZmFjdEFuYWx5c2VyKG1vbml0b3IpCisgICAgICAgICAgICA6IG5ldyBQcm9ncmVzc1JlcG9ydGluZ0FzdFR5cGVBcnRlZmFjdEFuYWx5c2VyKGphdmFQcm9qZWN0LCBtb25pdG9yKTsKIAotCQl0cnkgewotCQkJQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBnZW5lcmF0ZU1hbmlmZXN0KGphdmFQcm9qZWN0LCBtb2RlbCwKLQkJCQkJTWFuaWZlc3RHZW5lcmF0b3JGYWN0b3J5LmNyZWF0ZShtb2RlbCwgYXJ0ZWZhY3RBbmFseXNlciwgcHJvcGVydGllc1NvdXJjZXMpLCBzb3VyY2VSZXNvdXJjZXMsCi0JCQkJCWlzRnVsbEJ1aWxkLCBmYWxzZSk7Ci0JCQkvLyBTZWNvbmRseSBjcmVhdGUgdGhlIFRFU1QuTUYKLQkJCUJ1bmRsZU1hbmlmZXN0IHRlc3RNYW5pZmVzdCA9IGdlbmVyYXRlTWFuaWZlc3QoamF2YVByb2plY3QsIHRlc3RNb2RlbCwKLQkJCQkJTWFuaWZlc3RHZW5lcmF0b3JGYWN0b3J5LmNyZWF0ZSh0ZXN0TW9kZWwsIGFydGVmYWN0QW5hbHlzZXIsIHByb3BlcnRpZXNTb3VyY2VzKSwgdGVzdFJlc291cmNlcywKLQkJCQkJaXNGdWxsQnVpbGQsIHRydWUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBnZW5lcmF0ZU1hbmlmZXN0KGphdmFQcm9qZWN0LCBtb2RlbCwKKyAgICAgICAgICAgICAgICBNYW5pZmVzdEdlbmVyYXRvckZhY3RvcnkuY3JlYXRlKG1vZGVsLCBhcnRlZmFjdEFuYWx5c2VyLCBwcm9wZXJ0aWVzU291cmNlcyksIHRoaXMuc291cmNlUmVzb3VyY2VzLCBpc0Z1bGxCdWlsZCwgZmFsc2UpOworICAgICAgICAgICAgLy8gU2Vjb25kbHkgY3JlYXRlIHRoZSBURVNULk1GCisgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdCB0ZXN0TWFuaWZlc3QgPSBnZW5lcmF0ZU1hbmlmZXN0KGphdmFQcm9qZWN0LCB0ZXN0TW9kZWwsCisgICAgICAgICAgICAgICAgTWFuaWZlc3RHZW5lcmF0b3JGYWN0b3J5LmNyZWF0ZSh0ZXN0TW9kZWwsIGFydGVmYWN0QW5hbHlzZXIsIHByb3BlcnRpZXNTb3VyY2VzKSwgdGhpcy50ZXN0UmVzb3VyY2VzLCBpc0Z1bGxCdWlsZCwgdHJ1ZSk7CiAKLQkJCS8vIExhc3RseSBtZXJnZSB0aGUgbWFuaWZlc3RzCi0JCQltZXJnZU1hbmlmZXN0cyhqYXZhUHJvamVjdCwgbWFuaWZlc3QsIHRlc3RNYW5pZmVzdCk7CisgICAgICAgICAgICAvLyBMYXN0bHkgbWVyZ2UgdGhlIG1hbmlmZXN0cworICAgICAgICAgICAgbWVyZ2VNYW5pZmVzdHMoamF2YVByb2plY3QsIG1hbmlmZXN0LCB0ZXN0TWFuaWZlc3QpOwogCi0JCQltb25pdG9yLmRvbmUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBCdW5kbG9yQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCSJFeGNlcHRpb24gd2hpbGUgZ2VuZXJhdGluZyBtYW5pZmVzdC4iLCBlKSk7Ci0JCX0KKyAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEJ1bmRsb3JDb3JlUGx1Z2luLlBMVUdJTl9JRCwgIkV4Y2VwdGlvbiB3aGlsZSBnZW5lcmF0aW5nIG1hbmlmZXN0LiIsIGUpKTsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIFNldCB1cCB7QGxpbmsgUHJvcGVydGllc1NvdXJjZX0gaW5zdGFuY2VzIGZvciBjb25maWd1cmVkIHByb3BlcnRpZXMgZmlsZXMuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzU291cmNlW10gY3JlYXRlUHJvcGVydGllc1NvdXJjZShmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKiBTZXQgdXAge0BsaW5rIFByb3BlcnRpZXNTb3VyY2V9IGluc3RhbmNlcyBmb3IgY29uZmlndXJlZCBwcm9wZXJ0aWVzIGZpbGVzLgorICAgICAqLworICAgIHByaXZhdGUgUHJvcGVydGllc1NvdXJjZVtdIGNyZWF0ZVByb3BlcnRpZXNTb3VyY2UoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAKLQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKLQkJU3RyaW5nIHByb3BlcnRpZXNGaWxlcyA9IHByZWZlcmVuY2VzLmdldChCdW5kbG9yQ29yZVBsdWdpbi5URU1QTEFURV9QUk9QRVJUSUVTX0ZJTEVfS0VZLAotCQkJCUJ1bmRsb3JDb3JlUGx1Z2luLlRFTVBMQVRFX1BST1BFUlRJRVNfRklMRV9ERUZBVUxUKTsKLQkJU3RyaW5nW10gcHJvcGVydGllcyA9IFN0cmluZ1V0aWxzLnNwbGl0KHByb3BlcnRpZXNGaWxlcywgIjsiKTsKKyAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKKyAgICAgICAgSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKKyAgICAgICAgU3RyaW5nIHByb3BlcnRpZXNGaWxlcyA9IHByZWZlcmVuY2VzLmdldChCdW5kbG9yQ29yZVBsdWdpbi5URU1QTEFURV9QUk9QRVJUSUVTX0ZJTEVfS0VZLCBCdW5kbG9yQ29yZVBsdWdpbi5URU1QTEFURV9QUk9QRVJUSUVTX0ZJTEVfREVGQVVMVCk7CisgICAgICAgIFN0cmluZ1tdIHByb3BlcnRpZXMgPSBTdHJpbmdVdGlscy5zcGxpdChwcm9wZXJ0aWVzRmlsZXMsICI7Iik7CiAKLQkJTGlzdDxJUGF0aD4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0PElQYXRoPigpOwotCQlpZiAocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMubGVuZ3RoID4gMCkgewotCQkJZm9yIChTdHJpbmcgcHJvcGVydGllc0ZpbGUgOiBwcm9wZXJ0aWVzKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKyAgICAgICAgTGlzdDxJUGF0aD4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0PElQYXRoPigpOworICAgICAgICBpZiAocHJvcGVydGllcyAhPSBudWxsICYmIHByb3BlcnRpZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgcHJvcGVydGllc0ZpbGUgOiBwcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICAgICAgLy8gQXNzdW1lIGZpbGUgaXMgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QgYnV0IHN0aWxsIGluIHRoZQorICAgICAgICAgICAgICAgIC8vIHdvcmtzcGFjZQorICAgICAgICAgICAgICAgIElQYXRoIGxvY2F0aW9uID0gbmV3IFBhdGgocHJvcGVydGllc0ZpbGUpOworICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0LmV4aXN0cyhsb2NhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgSUZpbGUgcHJvcGVydGllc1Jlc291cmNlID0gcHJvamVjdC5nZXRGaWxlKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnRpZXNSZXNvdXJjZS5pc0xpbmtlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5hZGQocHJvcGVydGllc1Jlc291cmNlLmdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHMuYWRkKHByb3BlcnRpZXNSZXNvdXJjZS5nZXRSYXdMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQkvLyBBc3N1bWUgZmlsZSBpcyByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBidXQgc3RpbGwgaW4gdGhlCi0JCQkJLy8gd29ya3NwYWNlCi0JCQkJSVBhdGggbG9jYXRpb24gPSBuZXcgUGF0aChwcm9wZXJ0aWVzRmlsZSk7Ci0JCQkJaWYgKHByb2plY3QuZXhpc3RzKGxvY2F0aW9uKSkgewotCQkJCQlJRmlsZSBwcm9wZXJ0aWVzUmVzb3VyY2UgPSBwcm9qZWN0LmdldEZpbGUobG9jYXRpb24pOwotCQkJCQlpZiAocHJvcGVydGllc1Jlc291cmNlLmlzTGlua2VkKCkpIHsKLQkJCQkJCXBhdGhzLmFkZChwcm9wZXJ0aWVzUmVzb3VyY2UuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXRocy5hZGQocHJvcGVydGllc1Jlc291cmNlLmdldFJhd0xvY2F0aW9uKCkpOwotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KKyAgICAgICAgICAgICAgICAvLyBBc3N1bWUgZmlsZSBpcyByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCBhbmQgY2FuIGJlIG91dHNpZGUgb2YKKyAgICAgICAgICAgICAgICAvLyB0aGUgcHJvamVjdCBhbmQgd29ya3NwYWNlCisgICAgICAgICAgICAgICAgSVBhdGggcHJvamVjdFJlbGF0aXZlTG9jYXRpb24gPSBwcm9qZWN0LmdldExvY2F0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKHByb2plY3RSZWxhdGl2ZUxvY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdFJlbGF0aXZlTG9jYXRpb24gPSBwcm9qZWN0LmdldFJhd0xvY2F0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByb2plY3RSZWxhdGl2ZUxvY2F0aW9uID0gcHJvamVjdFJlbGF0aXZlTG9jYXRpb24uYXBwZW5kKHByb3BlcnRpZXNGaWxlKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvamVjdFJlbGF0aXZlTG9jYXRpb24udG9GaWxlKCkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aHMuYWRkKHByb2plY3RSZWxhdGl2ZUxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJLy8gQXNzdW1lIGZpbGUgaXMgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QgYW5kIGNhbiBiZSBvdXRzaWRlIG9mCi0JCQkJLy8gdGhlIHByb2plY3QgYW5kIHdvcmtzcGFjZQotCQkJCUlQYXRoIHByb2plY3RSZWxhdGl2ZUxvY2F0aW9uID0gcHJvamVjdC5nZXRMb2NhdGlvbigpOwotCQkJCWlmIChwcm9qZWN0UmVsYXRpdmVMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCXByb2plY3RSZWxhdGl2ZUxvY2F0aW9uID0gcHJvamVjdC5nZXRSYXdMb2NhdGlvbigpOwotCQkJCX0KLQkJCQlwcm9qZWN0UmVsYXRpdmVMb2NhdGlvbiA9IHByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLmFwcGVuZChwcm9wZXJ0aWVzRmlsZSk7Ci0JCQkJaWYgKHByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCXBhdGhzLmFkZChwcm9qZWN0UmVsYXRpdmVMb2NhdGlvbik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KKyAgICAgICAgICAgICAgICAvLyBBc3N1bWUgZmlsZSBpcyByZWxhdGl2ZSB0byB0aGUgd29ya3NwYWNlCisgICAgICAgICAgICAgICAgSVBhdGggd29ya3NwYWNlUmVsYXRpdmVMb2NhdGlvbiA9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkuYXBwZW5kKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAod29ya3NwYWNlUmVsYXRpdmVMb2NhdGlvbi50b0ZpbGUoKS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBwYXRocy5hZGQod29ya3NwYWNlUmVsYXRpdmVMb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KIAotCQkJCS8vIEFzc3VtZSBmaWxlIGlzIHJlbGF0aXZlIHRvIHRoZSB3b3Jrc3BhY2UKLQkJCQlJUGF0aCB3b3Jrc3BhY2VSZWxhdGl2ZUxvY2F0aW9uID0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQobG9jYXRpb24pOwotCQkJCWlmICh3b3Jrc3BhY2VSZWxhdGl2ZUxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCXBhdGhzLmFkZCh3b3Jrc3BhY2VSZWxhdGl2ZUxvY2F0aW9uKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQorICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBhYnNvbHV0ZSBwYXRoCisgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGhzLmFkZChsb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUT0RPIENEIHdlIGNvdWxkIGFkZCBhbiBlcnJvciBtYXJrZXIgZm9yIHRob3NlIGZpbGVzIHRoYXQKKyAgICAgICAgICAgICAgICAvLyBjYW4ndCBiZSByZXNvbHZlZCB0byBhIHJlc291cmNlCisgICAgICAgICAgICAgICAgU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgQnVuZGxvckNvcmVQbHVnaW4uUExVR0lOX0lELCAiQnVuZGxvciBwcm9wZXJ0eSBzdWJzdGl0dXRpb24gaXMgc2tpcHBpbmcgb3ZlciBmaWxlICIgKyBsb2NhdGlvbi50b1N0cmluZygpCisgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiBiZWNhdXNlIGl0IGNvdWxkIG5vdCBiZSBmb3VuZC4iKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJCS8vIEFzc3VtZSBhYnNvbHV0ZSBwYXRoCi0JCQkJaWYgKGxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCXBhdGhzLmFkZChsb2NhdGlvbik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvLyBUT0RPIENEIHdlIGNvdWxkIGFkZCBhbiBlcnJvciBtYXJrZXIgZm9yIHRob3NlIGZpbGVzIHRoYXQKLQkJCQkvLyBjYW4ndCBiZSByZXNvbHZlZCB0byBhIHJlc291cmNlCi0JCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEJ1bmRsb3JDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkJIkJ1bmRsb3IgcHJvcGVydHkgc3Vic3RpdHV0aW9uIGlzIHNraXBwaW5nIG92ZXIgZmlsZSAiICsgbG9jYXRpb24udG9TdHJpbmcoKQotCQkJCQkJCQkJCSsgIiBmb3IgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGJlY2F1c2UgaXQgY291bGQgbm90IGJlIGZvdW5kLiIpKTsKLQkJCX0KLQkJfQorICAgICAgICAvLyBBZGQgaW4gcHJvcGVydGllcyBzb3VyY2VzIGZvciB0aGUgcmVzb2x2ZWQgcHJvcGVydGllcyBmaWxlcworICAgICAgICBTZXQ8UHJvcGVydGllc1NvdXJjZT4gcHJvcGVydGllc1NvdXJjZXMgPSBuZXcgSGFzaFNldDxQcm9wZXJ0aWVzU291cmNlPigpOworICAgICAgICBmb3IgKElQYXRoIHBhdGggOiBwYXRocykgeworICAgICAgICAgICAgcHJvcGVydGllc1NvdXJjZXMuYWRkKG5ldyBGaWxlU3lzdGVtUHJvcGVydGllc1NvdXJjZShwYXRoLnRvRmlsZSgpKSk7CisgICAgICAgIH0KIAotCQkvLyBBZGQgaW4gcHJvcGVydGllcyBzb3VyY2VzIGZvciB0aGUgcmVzb2x2ZWQgcHJvcGVydGllcyBmaWxlcwotCQlTZXQ8UHJvcGVydGllc1NvdXJjZT4gcHJvcGVydGllc1NvdXJjZXMgPSBuZXcgSGFzaFNldDxQcm9wZXJ0aWVzU291cmNlPigpOwotCQlmb3IgKElQYXRoIHBhdGggOiBwYXRocykgewotCQkJcHJvcGVydGllc1NvdXJjZXMuYWRkKG5ldyBGaWxlU3lzdGVtUHJvcGVydGllc1NvdXJjZShwYXRoLnRvRmlsZSgpKSk7Ci0JCX0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb2plY3QgaGFzIGEgcG9tLnhtbCBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCBmaWxlIHN0cnVjdHVyZQorICAgICAgICBpZiAoTWF2ZW5Qcm9wZXJ0aWVzU291cmNlRmFjdG9yeS5zaG91bGRDcmVhdGUoZ2V0UHJvamVjdCgpKSkgeworICAgICAgICAgICAgcHJvcGVydGllc1NvdXJjZXMuYWRkKE1hdmVuUHJvcGVydGllc1NvdXJjZUZhY3RvcnkuY3JlYXRlUHJvcGVydGllc1NvdXJjZShnZXRQcm9qZWN0KCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvcGVydGllc1NvdXJjZXMudG9BcnJheShuZXcgUHJvcGVydGllc1NvdXJjZVtdIHt9KTsKKyAgICB9CiAKLQkJLy8gQ2hlY2sgaWYgdGhlIHByb2plY3QgaGFzIGEgcG9tLnhtbCBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCBmaWxlIHN0cnVjdHVyZQotCQlpZiAoTWF2ZW5Qcm9wZXJ0aWVzU291cmNlRmFjdG9yeS5zaG91bGRDcmVhdGUoZ2V0UHJvamVjdCgpKSkgewotCQkJcHJvcGVydGllc1NvdXJjZXMuYWRkKE1hdmVuUHJvcGVydGllc1NvdXJjZUZhY3RvcnkuY3JlYXRlUHJvcGVydGllc1NvdXJjZShnZXRQcm9qZWN0KCkpKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllc1NvdXJjZXMudG9BcnJheShuZXcgUHJvcGVydGllc1NvdXJjZVtdIHt9KTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rIE1hbmlmZXN0fSBpbnN0YW5jZSBmcm9tIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBwYXRoLgorICAgICAqLworICAgIHByaXZhdGUgTWFuaWZlc3RDb250ZW50cyBjcmVhdGVNYW5pZmVzdEZyb21QYXRoKElSZXNvdXJjZSB0ZW1wbGF0ZVJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAodGVtcGxhdGVSZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBNYW5pZmVzdFBhcnNlciBwYXJzZXIgPSBuZXcgUmVjb3ZlcmluZ01hbmlmZXN0UGFyc2VyKCk7CisgICAgICAgICAgICBNYW5pZmVzdENvbnRlbnRzIG1hbmlmZXN0ID0gbnVsbDsKKyAgICAgICAgICAgIG1hbmlmZXN0ID0gcGFyc2VyLnBhcnNlKG5ldyBGaWxlUmVhZGVyKHRlbXBsYXRlUmVzb3VyY2UuZ2V0UmF3TG9jYXRpb24oKS50b1N0cmluZygpKSk7CisgICAgICAgICAgICByZXR1cm4gbWFuaWZlc3Q7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ3JlYXRlIG5ldyBlbXB0eSBNQU5JRkVTVAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlTWFuaWZlc3RDb250ZW50cygpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlIGEge0BsaW5rIE1hbmlmZXN0fSBpbnN0YW5jZSBmcm9tIHRoZSBmaWxlIGF0IHRoZSBnaXZlbiBwYXRoLgotCSAqLwotCXByaXZhdGUgTWFuaWZlc3RDb250ZW50cyBjcmVhdGVNYW5pZmVzdEZyb21QYXRoKElSZXNvdXJjZSB0ZW1wbGF0ZVJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAodGVtcGxhdGVSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlNYW5pZmVzdFBhcnNlciBwYXJzZXIgPSBuZXcgUmVjb3ZlcmluZ01hbmlmZXN0UGFyc2VyKCk7Ci0JCQlNYW5pZmVzdENvbnRlbnRzIG1hbmlmZXN0ID0gbnVsbDsKLQkJCW1hbmlmZXN0ID0gcGFyc2VyLnBhcnNlKG5ldyBGaWxlUmVhZGVyKHRlbXBsYXRlUmVzb3VyY2UuZ2V0UmF3TG9jYXRpb24oKS50b1N0cmluZygpKSk7Ci0JCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JCX0KLQkJLy8gQ3JlYXRlIG5ldyBlbXB0eSBNQU5JRkVTVAotCQllbHNlIHsKLQkJCXJldHVybiBuZXcgU2ltcGxlTWFuaWZlc3RDb250ZW50cygpOwotCQl9Ci0JfQorICAgIHByaXZhdGUgdm9pZCBkb0dldEFmZmVjdGVkUmVzb3VyY2VzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIGludCBkZWx0YUtpbmQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAotCXByaXZhdGUgdm9pZCBkb0dldEFmZmVjdGVkUmVzb3VyY2VzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIGludCBkZWx0YUtpbmQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgSUphdmFQcm9qZWN0IHByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJSUphdmFQcm9qZWN0IHByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoZ2V0UHJvamVjdCgpKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9CisgICAgICAgIElXb3Jrc3BhY2VSb290IHdzUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CiAKLQkJSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKyAgICAgICAgLy8gR2V0IHRoZSBzb3VyY2UgZm9sZGVycworICAgICAgICBTZXQ8SUNsYXNzcGF0aEVudHJ5PiBjbGFzc3BhdGhFbnRyaWVzID0gU2VydmVyTW9kdWxlRGVsZWdhdGUuZ2V0U291cmNlQ2xhc3NwYXRoRW50cmllcyhyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGZhbHNlKTsKKyAgICAgICAgU2V0PElDbGFzc3BhdGhFbnRyeT4gdGVzdENsYXNzcGF0aEVudHJpZXMgPSBTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZS5nZXRTb3VyY2VDbGFzc3BhdGhFbnRyaWVzKHJlc291cmNlLmdldFByb2plY3QoKSwgdHJ1ZSk7CiAKLQkJLy8gR2V0IHRoZSBzb3VyY2UgZm9sZGVycwotCQlTZXQ8SUNsYXNzcGF0aEVudHJ5PiBjbGFzc3BhdGhFbnRyaWVzID0gU2VydmVyTW9kdWxlRGVsZWdhdGUuZ2V0U291cmNlQ2xhc3NwYXRoRW50cmllcyhyZXNvdXJjZS5nZXRQcm9qZWN0KCksCi0JCQkJZmFsc2UpOwotCQlTZXQ8SUNsYXNzcGF0aEVudHJ5PiB0ZXN0Q2xhc3NwYXRoRW50cmllcyA9IFNlcnZlck1vZHVsZURlbGVnYXRlLmdldFNvdXJjZUNsYXNzcGF0aEVudHJpZXMoCi0JCQkJcmVzb3VyY2UuZ2V0UHJvamVjdCgpLCB0cnVlKTsKKyAgICAgICAgLy8gSmF2YSBzb3VyY2UgZmlsZXMKKyAgICAgICAgaWYgKCF0aGlzLnNjYW5CeXRlQ29kZSAmJiByZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoImphdmEiKSkgeyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBJSmF2YUVsZW1lbnQgZWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZSk7CisgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKS5pc09uQ2xhc3NwYXRoKGVsZW1lbnQpKSB7CisgICAgICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkgPSByb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogY2xhc3NwYXRoRW50cmllcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEVudHJ5LmVxdWFscyhlbnRyeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFLaW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkU291cmNlUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiB0ZXN0Q2xhc3NwYXRoRW50cmllcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEVudHJ5LmVxdWFscyhlbnRyeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFLaW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkVGVzdFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGVzdFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpbiBjYXNlIG9mIC5qYXZhIHJlc291cmNlcyBub3Qgb24gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzcGF0aCBvZiB0aGUgcHJvamVjdAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBKYXZhIGJ5dGUgY29kZQorICAgICAgICBlbHNlIGlmICh0aGlzLnNjYW5CeXRlQ29kZSAmJiByZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoQ0xBU1NfRklMRV9FWFRFTlNJT04pKSB7CisgICAgICAgICAgICBJUGF0aCBjbGFzc0ZpbGVQYXRoID0gcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKTsKIAotCQkvLyBKYXZhIHNvdXJjZSBmaWxlcwotCQlpZiAoIXNjYW5CeXRlQ29kZSAmJiByZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoImphdmEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZSk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKS5pc09uQ2xhc3NwYXRoKGVsZW1lbnQpKSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudC5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKLQkJCQl0cnkgewotCQkJCQlJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkgPSByb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCk7Ci0JCQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogY2xhc3NwYXRoRW50cmllcykgewotCQkJCQkJaWYgKGNsYXNzcGF0aEVudHJ5LmVxdWFscyhlbnRyeSkpIHsKLQkJCQkJCQlpZiAoZGVsdGFLaW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJCQkJZGVsZXRlZFNvdXJjZVJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNvdXJjZVJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IHRlc3RDbGFzc3BhdGhFbnRyaWVzKSB7Ci0JCQkJCQlpZiAoY2xhc3NwYXRoRW50cnkuZXF1YWxzKGVudHJ5KSkgewotCQkJCQkJCWlmIChkZWx0YUtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQkJCQlkZWxldGVkVGVzdFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXRlc3RSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUaGlzIGNhbiBoYXBwZW4gaW4gY2FzZSBvZiAuamF2YSByZXNvdXJjZXMgbm90IG9uIHRoZQotCQkJCQkvLyBjbGFzc3BhdGggb2YgdGhlIHByb2plY3QKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gSmF2YSBieXRlIGNvZGUKLQkJZWxzZSBpZiAoc2NhbkJ5dGVDb2RlICYmIHJlc291cmNlLmdldE5hbWUoKS5lbmRzV2l0aChDTEFTU19GSUxFX0VYVEVOU0lPTikpIHsKLQkJCUlQYXRoIGNsYXNzRmlsZVBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOworICAgICAgICAgICAgLy8gQ2hlY2sgZGVmYXVsdCBvdXRwdXQgZm9sZGVycworICAgICAgICAgICAgSVBhdGggZGVmYXVsdE91dHB1dExvY2F0aW9uID0gcHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOworICAgICAgICAgICAgaWYgKGRlZmF1bHRPdXRwdXRMb2NhdGlvbi5pc1ByZWZpeE9mKGNsYXNzRmlsZVBhdGgpKSB7CisgICAgICAgICAgICAgICAgLy8gT2sgd2Uga25vdyB0aGF0IHRoZSBmaWxlIGlzIGEgY2xhc3MgaW4gdGhlIGRlZmF1bHQgb3V0cHV0CisgICAgICAgICAgICAgICAgLy8gbG9jYXRpb247IGxldCdzIGdldCB0aGUgY2xhc3MgbmFtZQorICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc0ZpbGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoZGVmYXVsdE91dHB1dExvY2F0aW9uLnNlZ21lbnRDb3VudCgpKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmxlbmd0aCgpIC0gQ0xBU1NfRklMRV9FWFRFTlNJT04ubGVuZ3RoKCkpOwogCi0JCQkvLyBDaGVjayBkZWZhdWx0IG91dHB1dCBmb2xkZXJzCi0JCQlJUGF0aCBkZWZhdWx0T3V0cHV0TG9jYXRpb24gPSBwcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQlpZiAoZGVmYXVsdE91dHB1dExvY2F0aW9uLmlzUHJlZml4T2YoY2xhc3NGaWxlUGF0aCkpIHsKLQkJCQkvLyBPayB3ZSBrbm93IHRoYXQgdGhlIGZpbGUgaXMgYSBjbGFzcyBpbiB0aGUgZGVmYXVsdCBvdXRwdXQKLQkJCQkvLyBsb2NhdGlvbjsgbGV0J3MgZ2V0IHRoZSBjbGFzcyBuYW1lCi0JCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzRmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhkZWZhdWx0T3V0cHV0TG9jYXRpb24uc2VnbWVudENvdW50KCkpLnRvU3RyaW5nKCk7Ci0JCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWUubGVuZ3RoKCkgLSBDTEFTU19GSUxFX0VYVEVOU0lPTi5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaW50IGl4ID0gY2xhc3NOYW1lLmluZGV4T2YoJyQnKTsKKyAgICAgICAgICAgICAgICBpZiAoaXggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgaXgpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCWludCBpeCA9IGNsYXNzTmFtZS5pbmRleE9mKCckJyk7Ci0JCQkJaWYgKGl4ID4gMCkgewotCQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGl4KTsKLQkJCQl9CisgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lICsgIi5qYXZhIjsKIAotCQkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZSArICIuamF2YSI7CisgICAgICAgICAgICAgICAgaWYgKGRlbHRhS2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlZFNvdXJjZVJlc291cmNlcy5hZGQocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbGV0ZWRUZXN0UmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKIAotCQkJCWlmIChkZWx0YUtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQlkZWxldGVkU291cmNlUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCWRlbGV0ZWRUZXN0UmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBjbGFzc3BhdGhFbnRyaWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCBzb3VyY2VMb2NhdGlvbiA9IGVudHJ5LmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZSBzb3VyY2VGb2xkZXIgPSB3c1Jvb3QuZmluZE1lbWJlcihzb3VyY2VMb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlRm9sZGVyIGluc3RhbmNlb2YgSUZvbGRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKElGb2xkZXIpIHNvdXJjZUZvbGRlcikuZmluZE1lbWJlcihjbGFzc05hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogdGVzdENsYXNzcGF0aEVudHJpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIHNvdXJjZUxvY2F0aW9uID0gZW50cnkuZ2V0UGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIHNvdXJjZUZvbGRlciA9IHdzUm9vdC5maW5kTWVtYmVyKHNvdXJjZUxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VGb2xkZXIgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoSUZvbGRlcikgc291cmNlRm9sZGVyKS5maW5kTWVtYmVyKGNsYXNzTmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlc3RSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogY2xhc3NwYXRoRW50cmllcykgewotCQkJCQkJSVBhdGggc291cmNlTG9jYXRpb24gPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQkJCQlJUmVzb3VyY2Ugc291cmNlRm9sZGVyID0gd3NSb290LmZpbmRNZW1iZXIoc291cmNlTG9jYXRpb24pOwotCQkJCQkJaWYgKHNvdXJjZUZvbGRlciBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJCQlpZiAoKChJRm9sZGVyKSBzb3VyY2VGb2xkZXIpLmZpbmRNZW1iZXIoY2xhc3NOYW1lKSAhPSBudWxsKSB7Ci0JCQkJCQkJCXNvdXJjZVJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiB0ZXN0Q2xhc3NwYXRoRW50cmllcykgewotCQkJCQkJSVBhdGggc291cmNlTG9jYXRpb24gPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQkJCQlJUmVzb3VyY2Ugc291cmNlRm9sZGVyID0gd3NSb290LmZpbmRNZW1iZXIoc291cmNlTG9jYXRpb24pOwotCQkJCQkJaWYgKHNvdXJjZUZvbGRlciBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJCQlpZiAoKChJRm9sZGVyKSBzb3VyY2VGb2xkZXIpLmZpbmRNZW1iZXIoY2xhc3NOYW1lKSAhPSBudWxsKSB7Ci0JCQkJCQkJCXRlc3RSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgLy8gQ2hlY2sgb3V0cHV0IGZvbGRlcnMgb2Ygc291cmNlIGZvbGRlcnMKKyAgICAgICAgICAgIGZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogY2xhc3NwYXRoRW50cmllcykgeworICAgICAgICAgICAgICAgIElQYXRoIG91dHB1dExvY2F0aW9uID0gZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0TG9jYXRpb24gIT0gbnVsbCAmJiBvdXRwdXRMb2NhdGlvbi5pc1ByZWZpeE9mKGNsYXNzRmlsZVBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YUtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkU291cmNlUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZVJlc291cmNlcy5hZGQocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCS8vIENoZWNrIG91dHB1dCBmb2xkZXJzIG9mIHNvdXJjZSBmb2xkZXJzCi0JCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGNsYXNzcGF0aEVudHJpZXMpIHsKLQkJCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJaWYgKG91dHB1dExvY2F0aW9uICE9IG51bGwgJiYgb3V0cHV0TG9jYXRpb24uaXNQcmVmaXhPZihjbGFzc0ZpbGVQYXRoKSkgewotCQkJCQlpZiAoZGVsdGFLaW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJCWRlbGV0ZWRTb3VyY2VSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXNvdXJjZVJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQl9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICAvLyBDaGVjayBvdXRwdXQgZm9sZGVycyBmb3IgdGVzdCBzb3VyY2UgZm9sZGVycworICAgICAgICAgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiB0ZXN0Q2xhc3NwYXRoRW50cmllcykgeworICAgICAgICAgICAgICAgIElQYXRoIG91dHB1dExvY2F0aW9uID0gZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0TG9jYXRpb24gIT0gbnVsbCAmJiBvdXRwdXRMb2NhdGlvbi5pc1ByZWZpeE9mKGNsYXNzRmlsZVBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YUtpbmQgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWxldGVkVGVzdFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXN0UmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJLy8gQ2hlY2sgb3V0cHV0IGZvbGRlcnMgZm9yIHRlc3Qgc291cmNlIGZvbGRlcnMKLQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogdGVzdENsYXNzcGF0aEVudHJpZXMpIHsKLQkJCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJaWYgKG91dHB1dExvY2F0aW9uICE9IG51bGwgJiYgb3V0cHV0TG9jYXRpb24uaXNQcmVmaXhPZihjbGFzc0ZpbGVQYXRoKSkgewotCQkJCQlpZiAoZGVsdGFLaW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJCWRlbGV0ZWRUZXN0UmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0ZXN0UmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFNvbWUgdGVtcGxhdGUgb3IgYWN0dWFsIG1hbmlmZXN0IGZpbGUgKHdoZXRoZXIgb3Igbm90IGl0IGFjdHVhbGx5CisgICAgICAgIC8vIGFmZmVjdHMgcGFja2FnZWQgYnVpbGQpIGhhcyBjaGFuZ2VkLiBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQKKyAgICAgICAgLy8gYmVoYXZpb3IgdGhhbgorICAgICAgICAvLyBwcmUtVmlyZ28gc2VydmVyLiBTdGlsbCwgaXQgc2VlbXMgcmVhc29uYWJseSBjb25zZXJ2YXRpdmUgYXMgd29yc3QKKyAgICAgICAgLy8gY2FzZSB3ZSdsbCBiZSByZS1idWlsZGluZyB0aGUgcHJvamVjdCB3aGVuIHdlIHJlYWxseSBkb24ndCBuZWVkIHRvLAorICAgICAgICAvLyBhbmQgYmVzdCBjYXNlIHdlJ2xsIGNhdGNoIGFuIGVkZ2UgY2FzZSB0aGF0IHdlIHdvdWxkIGhhdmUgb3RoZXJ3aXNlCisgICAgICAgIC8vIG1pc3NlZC4KKyAgICAgICAgZWxzZSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscygidGVtcGxhdGUubWYiKSB8fCByZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKCJNQU5JRkVTVC5NRiIpKSB7CisgICAgICAgICAgICB0aGlzLmZvcmNlRnVsbEJ1aWxkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBIaWJlcm5hdGUgbWFwcGluZyBmaWxlcworICAgICAgICBlbHNlIGlmIChyZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5oYm0iKSkgeworICAgICAgICAgICAgYWRkUmVzb3VyY2VJZkluU291cmNlRm9sZGVyKHJlc291cmNlLCBjbGFzc3BhdGhFbnRyaWVzLCB0ZXN0Q2xhc3NwYXRoRW50cmllcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gSlBBIHBlcnNpc3RlbmNlIGRlc2NyaXB0b3IKKyAgICAgICAgZWxzZSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscygicGVyc2lzdGVuY2UueG1sIikgJiYgcmVzb3VyY2UuZ2V0UGFyZW50KCkgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRQYXJlbnQoKS5nZXROYW1lKCkuZXF1YWxzKCJNRVRBLUlORiIpKSB7CisgICAgICAgICAgICBhZGRSZXNvdXJjZUlmSW5Tb3VyY2VGb2xkZXIocmVzb3VyY2UsIGNsYXNzcGF0aEVudHJpZXMsIHRlc3RDbGFzc3BhdGhFbnRyaWVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc1dlYlhNTChyZXNvdXJjZSkpIHsKKyAgICAgICAgICAgIHRoaXMuc291cmNlUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gU3ByaW5nIGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICAgICBlbHNlIGlmIChyZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoIi54bWwiKSkgeworICAgICAgICAgICAgYWRkUmVzb3VyY2VJZkluU291cmNlRm9sZGVyKHJlc291cmNlLCBjbGFzc3BhdGhFbnRyaWVzLCB0ZXN0Q2xhc3NwYXRoRW50cmllcyk7CisgICAgICAgIH0KKyAgICB9CiAKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIFNvbWUgdGVtcGxhdGUgb3IgYWN0dWFsIG1hbmlmZXN0IGZpbGUgKHdoZXRoZXIgb3Igbm90IGl0IGFjdHVhbGx5Ci0JCS8vIGFmZmVjdHMgcGFja2FnZWQgYnVpbGQpIGhhcyBjaGFuZ2VkLiBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQKLQkJLy8gYmVoYXZpb3IgdGhhbgotCQkvLyBwcmUtVmlyZ28gc2VydmVyLiBTdGlsbCwgaXQgc2VlbXMgcmVhc29uYWJseSBjb25zZXJ2YXRpdmUgYXMgd29yc3QKLQkJLy8gY2FzZSB3ZSdsbCBiZSByZS1idWlsZGluZyB0aGUgcHJvamVjdCB3aGVuIHdlIHJlYWxseSBkb24ndCBuZWVkIHRvLAotCQkvLyBhbmQgYmVzdCBjYXNlIHdlJ2xsIGNhdGNoIGFuIGVkZ2UgY2FzZSB0aGF0IHdlIHdvdWxkIGhhdmUgb3RoZXJ3aXNlCi0JCS8vIG1pc3NlZC4KLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscygidGVtcGxhdGUubWYiKSB8fCByZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKCJNQU5JRkVTVC5NRiIpKSB7Ci0JCQlmb3JjZUZ1bGxCdWlsZCA9IHRydWU7Ci0JCX0KLQkJLy8gSGliZXJuYXRlIG1hcHBpbmcgZmlsZXMKLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuaGJtIikpIHsKLQkJCWFkZFJlc291cmNlSWZJblNvdXJjZUZvbGRlcihyZXNvdXJjZSwgY2xhc3NwYXRoRW50cmllcywgdGVzdENsYXNzcGF0aEVudHJpZXMpOwotCQl9Ci0JCS8vIEpQQSBwZXJzaXN0ZW5jZSBkZXNjcmlwdG9yCi0JCWVsc2UgaWYgKHJlc291cmNlLmdldE5hbWUoKS5lcXVhbHMoInBlcnNpc3RlbmNlLnhtbCIpICYmIHJlc291cmNlLmdldFBhcmVudCgpICE9IG51bGwKLQkJCQkmJiByZXNvdXJjZS5nZXRQYXJlbnQoKS5nZXROYW1lKCkuZXF1YWxzKCJNRVRBLUlORiIpKSB7Ci0JCQlhZGRSZXNvdXJjZUlmSW5Tb3VyY2VGb2xkZXIocmVzb3VyY2UsIGNsYXNzcGF0aEVudHJpZXMsIHRlc3RDbGFzc3BhdGhFbnRyaWVzKTsKLQkJfSBlbHNlIGlmIChpc1dlYlhNTChyZXNvdXJjZSkpIHsKLQkJCXNvdXJjZVJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0JCS8vIFNwcmluZyBjb25maWd1cmF0aW9uIGZpbGUKLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVuZHNXaXRoKCIueG1sIikpIHsKLQkJCWFkZFJlc291cmNlSWZJblNvdXJjZUZvbGRlcihyZXNvdXJjZSwgY2xhc3NwYXRoRW50cmllcywgdGVzdENsYXNzcGF0aEVudHJpZXMpOwotCQl9Ci0JfQorICAgIHByaXZhdGUgYm9vbGVhbiBpc1dlYlhNTChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS5lbmRzV2l0aChXRUJfWE1MX1BBVEgpICYmIEZhY2V0VXRpbHMuaGFzUHJvamVjdEZhY2V0KHJlc291cmNlLCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKTsKKyAgICB9CiAKLQlwcml2YXRlIGJvb2xlYW4gaXNXZWJYTUwoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoV0VCX1hNTF9QQVRIKQotCQkJCSYmIEZhY2V0VXRpbHMuaGFzUHJvamVjdEZhY2V0KHJlc291cmNlLCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKTsKLQl9CisgICAgLyoqCisgICAgICogR2VuZXJhdGUgYSBuZXcgb3IgdXBkYXRlIHRoZSBleGlzdGluZyBtYW5pZmVzdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ1bmRsZU1hbmlmZXN0IGdlbmVyYXRlTWFuaWZlc3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBSZWFkYWJsZVBhcnRpYWxNYW5pZmVzdCBtb2RlbCwgTWFuaWZlc3RHZW5lcmF0b3IgZ2VuZXJhdG9yLAorICAgICAgICBTZXQ8SVJlc291cmNlPiByZXNvdXJjZXMsIGJvb2xlYW4gaXNGdWxsQnVpbGQsIGJvb2xlYW4gaXNUZXN0TWFuaWZlc3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAotCS8qKgotCSAqIEdlbmVyYXRlIGEgbmV3IG9yIHVwZGF0ZSB0aGUgZXhpc3RpbmcgbWFuaWZlc3QuCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgQnVuZGxlTWFuaWZlc3QgZ2VuZXJhdGVNYW5pZmVzdChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0IG1vZGVsLAotCQkJTWFuaWZlc3RHZW5lcmF0b3IgZ2VuZXJhdG9yLCBTZXQ8SVJlc291cmNlPiByZXNvdXJjZXMsIGJvb2xlYW4gaXNGdWxsQnVpbGQsIGJvb2xlYW4gaXNUZXN0TWFuaWZlc3QpCi0JCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwogCi0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworICAgICAgICBTZXQ8U3RyaW5nPiBmb2xkZXJzID0gZ2V0U291cmNlRm9sZGVycyhqYXZhUHJvamVjdCwgcm9vdCwgaXNUZXN0TWFuaWZlc3QpOwogCi0JCVNldDxTdHJpbmc+IGZvbGRlcnMgPSBnZXRTb3VyY2VGb2xkZXJzKGphdmFQcm9qZWN0LCByb290LCBpc1Rlc3RNYW5pZmVzdCk7CisgICAgICAgIC8vIFJlbW92ZWQgZGVsZXRlZCByZXNvdXJjZXMKKyAgICAgICAgZm9yIChJUmVzb3VyY2UgZGVsZXRlZFJlc291cmNlIDogaXNUZXN0TWFuaWZlc3QgPyB0aGlzLmRlbGV0ZWRUZXN0UmVzb3VyY2VzIDogdGhpcy5kZWxldGVkU291cmNlUmVzb3VyY2VzKSB7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGRlbGV0ZWRSZXNvdXJjZS5nZXRSYXdMb2NhdGlvbigpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBmb2xkZXIgOiBmb2xkZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChmb2xkZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhmb2xkZXIubGVuZ3RoKCkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgRW50cnlTY2FubmVyTGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoRW50cnlTY2FubmVyTGlzdGVuZXIpIG1vZGVsKS5vbkJlZ2luRW50cnkocGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKChFbnRyeVNjYW5uZXJMaXN0ZW5lcikgbW9kZWwpLm9uRW5kRW50cnkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLyBSZW1vdmVkIGRlbGV0ZWQgcmVzb3VyY2VzCi0JCWZvciAoSVJlc291cmNlIGRlbGV0ZWRSZXNvdXJjZSA6IChpc1Rlc3RNYW5pZmVzdCA/IGRlbGV0ZWRUZXN0UmVzb3VyY2VzIDogZGVsZXRlZFNvdXJjZVJlc291cmNlcykpIHsKLQkJCVN0cmluZyBwYXRoID0gZGVsZXRlZFJlc291cmNlLmdldFJhd0xvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCWZvciAoU3RyaW5nIGZvbGRlciA6IGZvbGRlcnMpIHsKLQkJCQlpZiAocGF0aC5zdGFydHNXaXRoKGZvbGRlcikpIHsKLQkJCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKGZvbGRlci5sZW5ndGgoKSArIDEpOwotCQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBFbnRyeVNjYW5uZXJMaXN0ZW5lcikgewotCQkJCQkJKChFbnRyeVNjYW5uZXJMaXN0ZW5lcikgbW9kZWwpLm9uQmVnaW5FbnRyeShwYXRoKTsKLQkJCQkJfQotCQkJCQkoKEVudHJ5U2Nhbm5lckxpc3RlbmVyKSBtb2RlbCkub25FbmRFbnRyeSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlSZXNvdXJjZSB0ZW1wbGF0ZVJlc291cmNlID0gZ2V0UHJvamVjdCgpLmZpbmRNZW1iZXIoInRlbXBsYXRlLm1mIik7CisgICAgICAgIElSZXNvdXJjZSB0ZW1wbGF0ZVJlc291cmNlID0gZ2V0UHJvamVjdCgpLmZpbmRNZW1iZXIoInRlbXBsYXRlLm1mIik7CiAKLQkJTWFuaWZlc3RDb250ZW50cyB0ZW1wbGF0ZU1hbmlmZXN0ID0gY3JlYXRlTWFuaWZlc3RGcm9tUGF0aCh0ZW1wbGF0ZVJlc291cmNlKTsKKyAgICAgICAgTWFuaWZlc3RDb250ZW50cyB0ZW1wbGF0ZU1hbmlmZXN0ID0gY3JlYXRlTWFuaWZlc3RGcm9tUGF0aCh0ZW1wbGF0ZVJlc291cmNlKTsKIAotCQkvLyBUZXN0LUltcG9ydC1QYWNrYWdlIGFuZCBUZXN0LUltcG9ydC1CdW5kbGUgLT4gSW1wb3J0LVBhY2thZ2UgYW5kCi0JCS8vIEltcG9ydC1CdW5kbGUKLQkJaWYgKGlzVGVzdE1hbmlmZXN0KSB7Ci0JCQl0ZW1wbGF0ZU1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSk7Ci0JCQl0ZW1wbGF0ZU1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSk7Ci0JCQl0ZW1wbGF0ZU1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlkpOworICAgICAgICAvLyBUZXN0LUltcG9ydC1QYWNrYWdlIGFuZCBUZXN0LUltcG9ydC1CdW5kbGUgLT4gSW1wb3J0LVBhY2thZ2UgYW5kCisgICAgICAgIC8vIEltcG9ydC1CdW5kbGUKKyAgICAgICAgaWYgKGlzVGVzdE1hbmlmZXN0KSB7CisgICAgICAgICAgICB0ZW1wbGF0ZU1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSk7CisgICAgICAgICAgICB0ZW1wbGF0ZU1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSk7CisgICAgICAgICAgICB0ZW1wbGF0ZU1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlkpOwogCi0JCQlpZiAodGVtcGxhdGVNYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLmNvbnRhaW5zS2V5KElIZWFkZXJDb25zdGFudHMuVEVTVF9JTVBPUlRfQlVORExFKSkgewotCQkJCXRlbXBsYXRlTWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5wdXQoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfQlVORExFLAotCQkJCQkJdGVtcGxhdGVNYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLmdldChJSGVhZGVyQ29uc3RhbnRzLlRFU1RfSU1QT1JUX0JVTkRMRSkpOwotCQkJfQotCQkJaWYgKHRlbXBsYXRlTWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5jb250YWluc0tleShJSGVhZGVyQ29uc3RhbnRzLlRFU1RfSU1QT1JUX1BBQ0tBR0UpKSB7Ci0JCQkJdGVtcGxhdGVNYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsCi0JCQkJCQl0ZW1wbGF0ZU1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkuZ2V0KElIZWFkZXJDb25zdGFudHMuVEVTVF9JTVBPUlRfUEFDS0FHRSkpOwotCQkJfQotCQkJaWYgKHRlbXBsYXRlTWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5jb250YWluc0tleShJSGVhZGVyQ29uc3RhbnRzLlRFU1RfSU1QT1JUX0xJQlJBUlkpKSB7Ci0JCQkJdGVtcGxhdGVNYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLnB1dChJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9MSUJSQVJZLAotCQkJCQkJdGVtcGxhdGVNYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLmdldChJSGVhZGVyQ29uc3RhbnRzLlRFU1RfSU1QT1JUX0xJQlJBUlkpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBpbXBvcnRQYWNrYWdlSGVhZGVyID0gdGVtcGxhdGVNYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLmdldChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UpOwotCQkJRGljdGlvbmFyeTxTdHJpbmcsIFN0cmluZz4gY29udGVudHMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOwotCQkJaWYgKGltcG9ydFBhY2thZ2VIZWFkZXIgIT0gbnVsbCkgewotCQkJCWNvbnRlbnRzLnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsIGltcG9ydFBhY2thZ2VIZWFkZXIpOwotCQkJfQotCQkJdGVtcGxhdGVQYWNrYWdlSW1wb3J0cy5hZGRBbGwoQnVuZGxlTWFuaWZlc3RGYWN0b3J5LmNyZWF0ZUJ1bmRsZU1hbmlmZXN0KGNvbnRlbnRzKQotCQkJCQkuZ2V0SW1wb3J0UGFja2FnZSgpCi0JCQkJCS5nZXRJbXBvcnRlZFBhY2thZ2VzKCkpOwotCQl9CisgICAgICAgICAgICBpZiAodGVtcGxhdGVNYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLmNvbnRhaW5zS2V5KElIZWFkZXJDb25zdGFudHMuVEVTVF9JTVBPUlRfQlVORExFKSkgeworICAgICAgICAgICAgICAgIHRlbXBsYXRlTWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5wdXQoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfQlVORExFLAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZU1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkuZ2V0KElIZWFkZXJDb25zdGFudHMuVEVTVF9JTVBPUlRfQlVORExFKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGVtcGxhdGVNYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLmNvbnRhaW5zS2V5KElIZWFkZXJDb25zdGFudHMuVEVTVF9JTVBPUlRfUEFDS0FHRSkpIHsKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZU1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucHV0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVNYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLmdldChJSGVhZGVyQ29uc3RhbnRzLlRFU1RfSU1QT1JUX1BBQ0tBR0UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0ZW1wbGF0ZU1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkuY29udGFpbnNLZXkoSUhlYWRlckNvbnN0YW50cy5URVNUX0lNUE9SVF9MSUJSQVJZKSkgeworICAgICAgICAgICAgICAgIHRlbXBsYXRlTWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5wdXQoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSwKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVNYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLmdldChJSGVhZGVyQ29uc3RhbnRzLlRFU1RfSU1QT1JUX0xJQlJBUlkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBpbXBvcnRQYWNrYWdlSGVhZGVyID0gdGVtcGxhdGVNYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLmdldChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UpOworICAgICAgICAgICAgRGljdGlvbmFyeTxTdHJpbmcsIFN0cmluZz4gY29udGVudHMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICAgICAgaWYgKGltcG9ydFBhY2thZ2VIZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRlbnRzLnB1dChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UsIGltcG9ydFBhY2thZ2VIZWFkZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhY2thZ2VJbXBvcnRzLmFkZEFsbChCdW5kbGVNYW5pZmVzdEZhY3RvcnkuY3JlYXRlQnVuZGxlTWFuaWZlc3QoY29udGVudHMpLmdldEltcG9ydFBhY2thZ2UoKS5nZXRJbXBvcnRlZFBhY2thZ2VzKCkpOworICAgICAgICB9CiAKLQkJTWFuaWZlc3RDb250ZW50cyBtYW5pZmVzdCA9IG51bGw7Ci0JCUxpc3Q8Q2xhc3NQYXRoPiBjbGFzc3BhdGhFbnRyaWVzID0gbmV3IEFycmF5TGlzdDxDbGFzc1BhdGg+KCk7Ci0JCVN0YW5kYXJkQ2xhc3NQYXRoRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFN0YW5kYXJkQ2xhc3NQYXRoRmFjdG9yeSgpOwotCQlpZiAoaXNGdWxsQnVpbGQpIHsKLQkJCWZvciAoU3RyaW5nIGZvbGRlciA6IGZvbGRlcnMpIHsKLQkJCQljbGFzc3BhdGhFbnRyaWVzLmFkZChmYWN0b3J5LmNyZWF0ZShmb2xkZXIpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoU3RyaW5nIGZvbGRlciA6IGZvbGRlcnMpIHsKLQkJCQljbGFzc3BhdGhFbnRyaWVzLmFkZChuZXcgRmlsdGVyaW5nQ2xhc3NQYXRoKHJlc291cmNlcywgZm9sZGVyKSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgTWFuaWZlc3RDb250ZW50cyBtYW5pZmVzdCA9IG51bGw7CisgICAgICAgIExpc3Q8Q2xhc3NQYXRoPiBjbGFzc3BhdGhFbnRyaWVzID0gbmV3IEFycmF5TGlzdDxDbGFzc1BhdGg+KCk7CisgICAgICAgIFN0YW5kYXJkQ2xhc3NQYXRoRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFN0YW5kYXJkQ2xhc3NQYXRoRmFjdG9yeSgpOworICAgICAgICBpZiAoaXNGdWxsQnVpbGQpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGZvbGRlciA6IGZvbGRlcnMpIHsKKyAgICAgICAgICAgICAgICBjbGFzc3BhdGhFbnRyaWVzLmFkZChmYWN0b3J5LmNyZWF0ZShmb2xkZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGZvbGRlciA6IGZvbGRlcnMpIHsKKyAgICAgICAgICAgICAgICBjbGFzc3BhdGhFbnRyaWVzLmFkZChuZXcgRmlsdGVyaW5nQ2xhc3NQYXRoKHJlc291cmNlcywgZm9sZGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQltYW5pZmVzdCA9IGdlbmVyYXRvci5nZW5lcmF0ZSh0ZW1wbGF0ZU1hbmlmZXN0LAotCQkJCWNsYXNzcGF0aEVudHJpZXMudG9BcnJheShuZXcgQ2xhc3NQYXRoW2NsYXNzcGF0aEVudHJpZXMuc2l6ZSgpXSkpOwotCQlyZXR1cm4gb3JnLmVjbGlwc2UudmlyZ28uYnVuZGxvci51dGlsLkJ1bmRsZU1hbmlmZXN0VXRpbHMuY3JlYXRlQnVuZGxlTWFuaWZlc3QobWFuaWZlc3QpOwotCX0KKyAgICAgICAgbWFuaWZlc3QgPSBnZW5lcmF0b3IuZ2VuZXJhdGUodGVtcGxhdGVNYW5pZmVzdCwgY2xhc3NwYXRoRW50cmllcy50b0FycmF5KG5ldyBDbGFzc1BhdGhbY2xhc3NwYXRoRW50cmllcy5zaXplKCldKSk7CisgICAgICAgIHJldHVybiBvcmcuZWNsaXBzZS52aXJnby5idW5kbG9yLnV0aWwuQnVuZGxlTWFuaWZlc3RVdGlscy5jcmVhdGVCdW5kbGVNYW5pZmVzdChtYW5pZmVzdCk7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc291cmNlIGZvbGRlcnMgb2YgdGhlIGdpdmVuIHtAbGluayBJSmF2YVByb2plY3R9LgotCSAqLwotCXByaXZhdGUgU2V0PFN0cmluZz4gZ2V0U291cmNlRm9sZGVycyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElXb3Jrc3BhY2VSb290IHJvb3QsIGJvb2xlYW4gdGVzdEZvbGRlcnMpCi0JCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU2V0PFN0cmluZz4gZm9sZGVycyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZS5nZXRTb3VyY2VDbGFzc3BhdGhFbnRyaWVzKGdldFByb2plY3QoKSwgdGVzdEZvbGRlcnMpKSB7Ci0JCQlJUmVzb3VyY2Ugc291cmNlRm9sZGVyID0gcm9vdC5maW5kTWVtYmVyKGVudHJ5LmdldFBhdGgoKSk7Ci0JCQlpZiAoc291cmNlRm9sZGVyIGluc3RhbmNlb2YgSUZvbGRlciAmJiAhKHNvdXJjZUZvbGRlciBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSkgewotCQkJCWZvbGRlcnMuYWRkKCgoSUZvbGRlcikgc291cmNlRm9sZGVyKS5nZXRSYXdMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSBmb2xkZXJzIG9mIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFQcm9qZWN0fS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IGdldFNvdXJjZUZvbGRlcnMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJV29ya3NwYWNlUm9vdCByb290LCBib29sZWFuIHRlc3RGb2xkZXJzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKKyAgICAgICAgU2V0PFN0cmluZz4gZm9sZGVycyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZS5nZXRTb3VyY2VDbGFzc3BhdGhFbnRyaWVzKGdldFByb2plY3QoKSwgdGVzdEZvbGRlcnMpKSB7CisgICAgICAgICAgICBJUmVzb3VyY2Ugc291cmNlRm9sZGVyID0gcm9vdC5maW5kTWVtYmVyKGVudHJ5LmdldFBhdGgoKSk7CisgICAgICAgICAgICBpZiAoc291cmNlRm9sZGVyIGluc3RhbmNlb2YgSUZvbGRlciAmJiAhKHNvdXJjZUZvbGRlciBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSkgeworICAgICAgICAgICAgICAgIGZvbGRlcnMuYWRkKCgoSUZvbGRlcikgc291cmNlRm9sZGVyKS5nZXRSYXdMb2NhdGlvbigpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQogCi0JCQlpZiAoc2NhbkJ5dGVDb2RlICYmIGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCUlSZXNvdXJjZSBjbGFzc0ZvbGRlciA9IHJvb3QuZmluZE1lbWJlcihlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCQlpZiAoY2xhc3NGb2xkZXIgaW5zdGFuY2VvZiBJRm9sZGVyICYmICEoY2xhc3NGb2xkZXIgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkpIHsKLQkJCQkJZm9sZGVycy5hZGQoKChJRm9sZGVyKSBjbGFzc0ZvbGRlcikuZ2V0UmF3TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIGlmICh0aGlzLnNjYW5CeXRlQ29kZSAmJiBlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJUmVzb3VyY2UgY2xhc3NGb2xkZXIgPSByb290LmZpbmRNZW1iZXIoZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgaWYgKGNsYXNzRm9sZGVyIGluc3RhbmNlb2YgSUZvbGRlciAmJiAhKGNsYXNzRm9sZGVyIGluc3RhbmNlb2YgSVdvcmtzcGFjZVJvb3QpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvbGRlcnMuYWRkKCgoSUZvbGRlcikgY2xhc3NGb2xkZXIpLmdldFJhd0xvY2F0aW9uKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJaWYgKHNjYW5CeXRlQ29kZSkgewotCQkJSVJlc291cmNlIHNvdXJjZUZvbGRlciA9IHJvb3QuZmluZE1lbWJlcihqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCWlmIChzb3VyY2VGb2xkZXIgaW5zdGFuY2VvZiBJRm9sZGVyICYmICEoc291cmNlRm9sZGVyIGluc3RhbmNlb2YgSVdvcmtzcGFjZVJvb3QpKSB7Ci0JCQkJZm9sZGVycy5hZGQoKChJRm9sZGVyKSBzb3VyY2VGb2xkZXIpLmdldFJhd0xvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKHRoaXMuc2NhbkJ5dGVDb2RlKSB7CisgICAgICAgICAgICBJUmVzb3VyY2Ugc291cmNlRm9sZGVyID0gcm9vdC5maW5kTWVtYmVyKGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCkpOworICAgICAgICAgICAgaWYgKHNvdXJjZUZvbGRlciBpbnN0YW5jZW9mIElGb2xkZXIgJiYgIShzb3VyY2VGb2xkZXIgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkpIHsKKyAgICAgICAgICAgICAgICBmb2xkZXJzLmFkZCgoKElGb2xkZXIpIHNvdXJjZUZvbGRlcikuZ2V0UmF3TG9jYXRpb24oKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vIEFkZCBwYXJlbnQgZm9sZGVyIG9mIHdlYi54bWwKLQkJaWYgKCF0ZXN0Rm9sZGVycyAmJiBGYWNldFV0aWxzLmhhc1Byb2plY3RGYWNldChnZXRQcm9qZWN0KCksIEZhY2V0Q29yZVBsdWdpbi5XRUJfRkFDRVRfSUQpKSB7Ci0JCQkvLyBXZSdyZSByZWFsbHkgY2hlYXRpbmcgYSBiaXQgaGVyZSwgYXMgd2UgYXJlbid0IGhhbmRsaW5nIHRoZSBjYXNlCi0JCQkvLyB3aGVyZSB0aGUgdXNlciBoYXMgbXVsdGlwbGUgV0VCLUlORiBkaXJzLCBidXQgdGhhdCBzZWVtcyBsaWtlIGFuCi0JCQkvLyBlZGdlIGNhc2UuCi0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRQcm9qZWN0KCkuZmluZE1lbWJlcihXRUJfWE1MX1BBVEgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlmb2xkZXJzLmFkZChyZXNvdXJjZS5nZXRSYXdMb2NhdGlvbigpLnJlbW92ZUxhc3RTZWdtZW50cygyKS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQorICAgICAgICAvLyBBZGQgcGFyZW50IGZvbGRlciBvZiB3ZWIueG1sCisgICAgICAgIGlmICghdGVzdEZvbGRlcnMgJiYgRmFjZXRVdGlscy5oYXNQcm9qZWN0RmFjZXQoZ2V0UHJvamVjdCgpLCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKSkgeworICAgICAgICAgICAgLy8gV2UncmUgcmVhbGx5IGNoZWF0aW5nIGEgYml0IGhlcmUsIGFzIHdlIGFyZW4ndCBoYW5kbGluZyB0aGUgY2FzZQorICAgICAgICAgICAgLy8gd2hlcmUgdGhlIHVzZXIgaGFzIG11bHRpcGxlIFdFQi1JTkYgZGlycywgYnV0IHRoYXQgc2VlbXMgbGlrZSBhbgorICAgICAgICAgICAgLy8gZWRnZSBjYXNlLgorICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZ2V0UHJvamVjdCgpLmZpbmRNZW1iZXIoV0VCX1hNTF9QQVRIKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9sZGVycy5hZGQocmVzb3VyY2UuZ2V0UmF3TG9jYXRpb24oKS5yZW1vdmVMYXN0U2VnbWVudHMoMikudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlyZXR1cm4gZm9sZGVyczsKLQl9CisgICAgICAgIHJldHVybiBmb2xkZXJzOworICAgIH0KIAotCS8qKgotCSAqIE1lcmdlcyB0aGUgbWFuaWZlc3RzLgotCSAqLwotCXByaXZhdGUgdm9pZCBtZXJnZU1hbmlmZXN0cyhmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0LCBCdW5kbGVNYW5pZmVzdCB0ZXN0TWFuaWZlc3QpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgLyoqCisgICAgICogTWVyZ2VzIHRoZSBtYW5pZmVzdHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG1lcmdlTWFuaWZlc3RzKGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QsIEJ1bmRsZU1hbmlmZXN0IHRlc3RNYW5pZmVzdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCi0JCS8vIENoZWNrIGlmIHRoZXJlIGlzIGEgbWFuaWZlc3QKLQkJaWYgKG1hbmlmZXN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQorICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIG1hbmlmZXN0CisgICAgICAgIGlmIChtYW5pZmVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotCQlCdW5kbGVNYW5pZmVzdCBjbGVhblRlc3RNYW5pZmVzdCA9IG51bGw7Ci0JCWlmICh0ZXN0TWFuaWZlc3QgIT0gbnVsbCkgeworICAgICAgICBCdW5kbGVNYW5pZmVzdCBjbGVhblRlc3RNYW5pZmVzdCA9IG51bGw7CisgICAgICAgIGlmICh0ZXN0TWFuaWZlc3QgIT0gbnVsbCkgewogCi0JCQkvKgotCQkJICogQXMgdGhlIHRlc3QgbWFuaWZlc3Qgc2hvdWxkIG5vdCBjb250YWluIGltcG9ydGVkIHBhY2thZ2VzLAotCQkJICogYnVuZGxlcyBhbmQgbGlicmFyaWVzIHRob3NlIG5lZWQgdG8gYmUgcmVtb3ZlZC4gRnVydGhlcm1vcmUgdGhlcmUKLQkJCSAqIHNob3VsZG4ndCBiZSBhbnkgYnVuZGxvciByZWxhdGVkIGhlYWRlcnMgaW4gdGhlIG1hbmlmZXN0LgotCQkJICovCi0JCQljbGVhblRlc3RNYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0RmFjdG9yeS5jcmVhdGVCdW5kbGVNYW5pZmVzdCgpOwotCQkJY2xlYW5UZXN0TWFuaWZlc3Quc2V0QnVuZGxlTWFuaWZlc3RWZXJzaW9uKDIpOwotCQkJaWYgKHRlc3RNYW5pZmVzdC5nZXRJbXBvcnRCdW5kbGUoKSAhPSBudWxsICYmIHRlc3RNYW5pZmVzdC5nZXRJbXBvcnRCdW5kbGUoKS5nZXRJbXBvcnRlZEJ1bmRsZXMoKSAhPSBudWxsCi0JCQkJCSYmIHRlc3RNYW5pZmVzdC5nZXRJbXBvcnRCdW5kbGUoKS5nZXRJbXBvcnRlZEJ1bmRsZXMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJY2xlYW5UZXN0TWFuaWZlc3QuZ2V0SW1wb3J0QnVuZGxlKCkKLQkJCQkJCS5nZXRJbXBvcnRlZEJ1bmRsZXMoKQotCQkJCQkJLmFkZEFsbCh0ZXN0TWFuaWZlc3QuZ2V0SW1wb3J0QnVuZGxlKCkuZ2V0SW1wb3J0ZWRCdW5kbGVzKCkpOwotCQkJfQotCQkJaWYgKHRlc3RNYW5pZmVzdC5nZXRJbXBvcnRMaWJyYXJ5KCkgIT0gbnVsbAotCQkJCQkmJiB0ZXN0TWFuaWZlc3QuZ2V0SW1wb3J0TGlicmFyeSgpLmdldEltcG9ydGVkTGlicmFyaWVzKCkgIT0gbnVsbAotCQkJCQkmJiB0ZXN0TWFuaWZlc3QuZ2V0SW1wb3J0TGlicmFyeSgpLmdldEltcG9ydGVkTGlicmFyaWVzKCkuc2l6ZSgpID4gMCkgewotCQkJCWNsZWFuVGVzdE1hbmlmZXN0LmdldEltcG9ydExpYnJhcnkoKQotCQkJCQkJLmdldEltcG9ydGVkTGlicmFyaWVzKCkKLQkJCQkJCS5hZGRBbGwodGVzdE1hbmlmZXN0LmdldEltcG9ydExpYnJhcnkoKS5nZXRJbXBvcnRlZExpYnJhcmllcygpKTsKLQkJCX0KLQkJCWZvciAoSW1wb3J0ZWRQYWNrYWdlIHBhY2thZ2VJbXBvcnQgOiB0ZXN0TWFuaWZlc3QuZ2V0SW1wb3J0UGFja2FnZSgpLmdldEltcG9ydGVkUGFja2FnZXMoKSkgewotCQkJCWJvb2xlYW4gbm90SW1wb3J0ZWQgPSB0cnVlOwotCQkJCWZvciAoSW1wb3J0ZWRQYWNrYWdlIG1hbmlmZXN0UGFja2FnZUltcG9ydCA6IG1hbmlmZXN0LmdldEltcG9ydFBhY2thZ2UoKS5nZXRJbXBvcnRlZFBhY2thZ2VzKCkpIHsKLQkJCQkJaWYgKG1hbmlmZXN0UGFja2FnZUltcG9ydC5nZXRQYWNrYWdlTmFtZSgpLmVxdWFscyhwYWNrYWdlSW1wb3J0LmdldFBhY2thZ2VOYW1lKCkpKSB7Ci0JCQkJCQlub3RJbXBvcnRlZCA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXMgdGhlIHRlc3QgbWFuaWZlc3Qgc2hvdWxkIG5vdCBjb250YWluIGltcG9ydGVkIHBhY2thZ2VzLCBidW5kbGVzIGFuZCBsaWJyYXJpZXMgdGhvc2UgbmVlZCB0byBiZQorICAgICAgICAgICAgICogcmVtb3ZlZC4gRnVydGhlcm1vcmUgdGhlcmUgc2hvdWxkbid0IGJlIGFueSBidW5kbG9yIHJlbGF0ZWQgaGVhZGVycyBpbiB0aGUgbWFuaWZlc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNsZWFuVGVzdE1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RGYWN0b3J5LmNyZWF0ZUJ1bmRsZU1hbmlmZXN0KCk7CisgICAgICAgICAgICBjbGVhblRlc3RNYW5pZmVzdC5zZXRCdW5kbGVNYW5pZmVzdFZlcnNpb24oMik7CisgICAgICAgICAgICBpZiAodGVzdE1hbmlmZXN0LmdldEltcG9ydEJ1bmRsZSgpICE9IG51bGwgJiYgdGVzdE1hbmlmZXN0LmdldEltcG9ydEJ1bmRsZSgpLmdldEltcG9ydGVkQnVuZGxlcygpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiB0ZXN0TWFuaWZlc3QuZ2V0SW1wb3J0QnVuZGxlKCkuZ2V0SW1wb3J0ZWRCdW5kbGVzKCkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGNsZWFuVGVzdE1hbmlmZXN0LmdldEltcG9ydEJ1bmRsZSgpLmdldEltcG9ydGVkQnVuZGxlcygpLmFkZEFsbCh0ZXN0TWFuaWZlc3QuZ2V0SW1wb3J0QnVuZGxlKCkuZ2V0SW1wb3J0ZWRCdW5kbGVzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRlc3RNYW5pZmVzdC5nZXRJbXBvcnRMaWJyYXJ5KCkgIT0gbnVsbCAmJiB0ZXN0TWFuaWZlc3QuZ2V0SW1wb3J0TGlicmFyeSgpLmdldEltcG9ydGVkTGlicmFyaWVzKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHRlc3RNYW5pZmVzdC5nZXRJbXBvcnRMaWJyYXJ5KCkuZ2V0SW1wb3J0ZWRMaWJyYXJpZXMoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgY2xlYW5UZXN0TWFuaWZlc3QuZ2V0SW1wb3J0TGlicmFyeSgpLmdldEltcG9ydGVkTGlicmFyaWVzKCkuYWRkQWxsKHRlc3RNYW5pZmVzdC5nZXRJbXBvcnRMaWJyYXJ5KCkuZ2V0SW1wb3J0ZWRMaWJyYXJpZXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKEltcG9ydGVkUGFja2FnZSBwYWNrYWdlSW1wb3J0IDogdGVzdE1hbmlmZXN0LmdldEltcG9ydFBhY2thZ2UoKS5nZXRJbXBvcnRlZFBhY2thZ2VzKCkpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIG5vdEltcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3IgKEltcG9ydGVkUGFja2FnZSBtYW5pZmVzdFBhY2thZ2VJbXBvcnQgOiBtYW5pZmVzdC5nZXRJbXBvcnRQYWNrYWdlKCkuZ2V0SW1wb3J0ZWRQYWNrYWdlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYW5pZmVzdFBhY2thZ2VJbXBvcnQuZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMocGFja2FnZUltcG9ydC5nZXRQYWNrYWdlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm90SW1wb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogCi0JCQkJaWYgKG5vdEltcG9ydGVkKSB7Ci0JCQkJCWJvb2xlYW4gc2tpcCA9IGZhbHNlOwotCQkJCQlmb3IgKEV4cG9ydGVkUGFja2FnZSBwYWNrYWdlRXhwb3J0IDogbWFuaWZlc3QuZ2V0RXhwb3J0UGFja2FnZSgpLmdldEV4cG9ydGVkUGFja2FnZXMoKSkgewotCQkJCQkJU3RyaW5nIHBhY2thZ2VJbXBvcnROYW1lID0gcGFja2FnZUltcG9ydC5nZXRQYWNrYWdlTmFtZSgpOwotCQkJCQkJaWYgKHBhY2thZ2VFeHBvcnQuZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMocGFja2FnZUltcG9ydE5hbWUpKSB7Ci0JCQkJCQkJc2tpcCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFza2lwKSB7Ci0JCQkJCQljbGVhblRlc3RNYW5pZmVzdC5nZXRJbXBvcnRQYWNrYWdlKCkuZ2V0SW1wb3J0ZWRQYWNrYWdlcygpLmFkZChwYWNrYWdlSW1wb3J0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgIGlmIChub3RJbXBvcnRlZCkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNraXAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChFeHBvcnRlZFBhY2thZ2UgcGFja2FnZUV4cG9ydCA6IG1hbmlmZXN0LmdldEV4cG9ydFBhY2thZ2UoKS5nZXRFeHBvcnRlZFBhY2thZ2VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlSW1wb3J0TmFtZSA9IHBhY2thZ2VJbXBvcnQuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlRXhwb3J0LmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKHBhY2thZ2VJbXBvcnROYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXAgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghc2tpcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5UZXN0TWFuaWZlc3QuZ2V0SW1wb3J0UGFja2FnZSgpLmdldEltcG9ydGVkUGFja2FnZXMoKS5hZGQocGFja2FnZUltcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKgotCQkgKiBOZXZlciBldmVyIGltcG9ydCBwYWNrYWdlcyB0aGF0IGFyZSBleHBvcnRlZCBhbHJlYWR5OyB3ZSBuZWVkIHRoaXMgYXMKLQkJICogdGhlIFNUUyBpbnRlZ3JhdGVkIHN1cHBvcnQgd2lsbCBzb21ldGltZXMgdHJ5IHRvIGltcG9ydCBjZXJ0YWluCi0JCSAqIHBhY2thZ2VzIHRoYXQgYXJlIHVzdWFsbHkgZXhwb3J0ZWQgYWxyZWFkeSBpZiB0aGUgY2xhc3NwYXRoIGlzCi0JCSAqIGluY29tcGxldGUuCi0JCSAqLwotCQlMaXN0PEltcG9ydGVkUGFja2FnZT4gaW1wb3J0ZWRQYWNrYWdlc0NvcHkgPSBuZXcgQXJyYXlMaXN0PEltcG9ydGVkUGFja2FnZT4obWFuaWZlc3QuZ2V0SW1wb3J0UGFja2FnZSgpCi0JCQkJLmdldEltcG9ydGVkUGFja2FnZXMoKSk7Ci0JCWZvciAoRXhwb3J0ZWRQYWNrYWdlIHBhY2thZ2VFeHBvcnQgOiBtYW5pZmVzdC5nZXRFeHBvcnRQYWNrYWdlKCkuZ2V0RXhwb3J0ZWRQYWNrYWdlcygpKSB7Ci0JCQlmb3IgKEltcG9ydGVkUGFja2FnZSBwYWNrYWdlSW1wb3J0IDogaW1wb3J0ZWRQYWNrYWdlc0NvcHkpIHsKLQkJCQlpZiAocGFja2FnZUV4cG9ydC5nZXRQYWNrYWdlTmFtZSgpLmVxdWFscyhwYWNrYWdlSW1wb3J0LmdldFBhY2thZ2VOYW1lKCkpKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIE5ldmVyIGV2ZXIgaW1wb3J0IHBhY2thZ2VzIHRoYXQgYXJlIGV4cG9ydGVkIGFscmVhZHk7IHdlIG5lZWQgdGhpcyBhcyB0aGUgU1RTIGludGVncmF0ZWQgc3VwcG9ydCB3aWxsCisgICAgICAgICAqIHNvbWV0aW1lcyB0cnkgdG8gaW1wb3J0IGNlcnRhaW4gcGFja2FnZXMgdGhhdCBhcmUgdXN1YWxseSBleHBvcnRlZCBhbHJlYWR5IGlmIHRoZSBjbGFzc3BhdGggaXMgaW5jb21wbGV0ZS4KKyAgICAgICAgICovCisgICAgICAgIExpc3Q8SW1wb3J0ZWRQYWNrYWdlPiBpbXBvcnRlZFBhY2thZ2VzQ29weSA9IG5ldyBBcnJheUxpc3Q8SW1wb3J0ZWRQYWNrYWdlPihtYW5pZmVzdC5nZXRJbXBvcnRQYWNrYWdlKCkuZ2V0SW1wb3J0ZWRQYWNrYWdlcygpKTsKKyAgICAgICAgZm9yIChFeHBvcnRlZFBhY2thZ2UgcGFja2FnZUV4cG9ydCA6IG1hbmlmZXN0LmdldEV4cG9ydFBhY2thZ2UoKS5nZXRFeHBvcnRlZFBhY2thZ2VzKCkpIHsKKyAgICAgICAgICAgIGZvciAoSW1wb3J0ZWRQYWNrYWdlIHBhY2thZ2VJbXBvcnQgOiBpbXBvcnRlZFBhY2thZ2VzQ29weSkgeworICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlRXhwb3J0LmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKHBhY2thZ2VJbXBvcnQuZ2V0UGFja2FnZU5hbWUoKSkpIHsKIAotCQkJCQlib29sZWFuIHJlbW92ZSA9IHRydWU7Ci0JCQkJCS8vIEl0IG1pZ2h0IHN0aWxsIGJlIHRoYXQgdGhlIHVzZXIgZXhwbGljaXRseSB3YW50cyB0aGUKLQkJCQkJLy8gcGFja2FnZSBpbXBvcnQgaW4gdGhlIHRlbXBsYXRlLm1mCi0JCQkJCWZvciAoSW1wb3J0ZWRQYWNrYWdlIHRlbXBsYXRlUGFja2FnZUltcG9ydCA6IHRlbXBsYXRlUGFja2FnZUltcG9ydHMpIHsKLQkJCQkJCWlmIChwYWNrYWdlRXhwb3J0LmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKHRlbXBsYXRlUGFja2FnZUltcG9ydC5nZXRQYWNrYWdlTmFtZSgpKSkgewotCQkJCQkJCXJlbW92ZSA9IGZhbHNlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChyZW1vdmUpIHsKLQkJCQkJCW1hbmlmZXN0LmdldEltcG9ydFBhY2thZ2UoKS5nZXRJbXBvcnRlZFBhY2thZ2VzKCkucmVtb3ZlKHBhY2thZ2VJbXBvcnQpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZW1vdmUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAvLyBJdCBtaWdodCBzdGlsbCBiZSB0aGF0IHRoZSB1c2VyIGV4cGxpY2l0bHkgd2FudHMgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHBhY2thZ2UgaW1wb3J0IGluIHRoZSB0ZW1wbGF0ZS5tZgorICAgICAgICAgICAgICAgICAgICBmb3IgKEltcG9ydGVkUGFja2FnZSB0ZW1wbGF0ZVBhY2thZ2VJbXBvcnQgOiB0aGlzLnRlbXBsYXRlUGFja2FnZUltcG9ydHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlRXhwb3J0LmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKHRlbXBsYXRlUGFja2FnZUltcG9ydC5nZXRQYWNrYWdlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0LmdldEltcG9ydFBhY2thZ2UoKS5nZXRJbXBvcnRlZFBhY2thZ2VzKCkucmVtb3ZlKHBhY2thZ2VJbXBvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlJUmVzb3VyY2UgbWFuaWZlc3RSZXNvdXJjZSA9IEJ1bmRsZU1hbmlmZXN0VXRpbHMubG9jYXRlTWFuaWZlc3QoamF2YVByb2plY3QsIGZhbHNlKTsKLQkJaWYgKG1hbmlmZXN0UmVzb3VyY2UgPT0gbnVsbCkgewotCQkJbWFuaWZlc3RSZXNvdXJjZSA9IEJ1bmRsZU1hbmlmZXN0VXRpbHMuZ2V0Rmlyc3RQb3NzaWJsZU1hbmlmZXN0RmlsZShnZXRQcm9qZWN0KCksIGZhbHNlKTsKLQkJfQotCQlJUmVzb3VyY2UgdGVzdE1hbmlmZXN0UmVzb3VyY2UgPSBCdW5kbGVNYW5pZmVzdFV0aWxzLmxvY2F0ZU1hbmlmZXN0KGphdmFQcm9qZWN0LCB0cnVlKTsKLQkJaWYgKHRlc3RNYW5pZmVzdFJlc291cmNlID09IG51bGwpIHsKLQkJCXRlc3RNYW5pZmVzdFJlc291cmNlID0gQnVuZGxlTWFuaWZlc3RVdGlscy5nZXRGaXJzdFBvc3NpYmxlTWFuaWZlc3RGaWxlKGdldFByb2plY3QoKSwgdHJ1ZSk7Ci0JCX0KKyAgICAgICAgSVJlc291cmNlIG1hbmlmZXN0UmVzb3VyY2UgPSBCdW5kbGVNYW5pZmVzdFV0aWxzLmxvY2F0ZU1hbmlmZXN0KGphdmFQcm9qZWN0LCBmYWxzZSk7CisgICAgICAgIGlmIChtYW5pZmVzdFJlc291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1hbmlmZXN0UmVzb3VyY2UgPSBCdW5kbGVNYW5pZmVzdFV0aWxzLmdldEZpcnN0UG9zc2libGVNYW5pZmVzdEZpbGUoZ2V0UHJvamVjdCgpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgSVJlc291cmNlIHRlc3RNYW5pZmVzdFJlc291cmNlID0gQnVuZGxlTWFuaWZlc3RVdGlscy5sb2NhdGVNYW5pZmVzdChqYXZhUHJvamVjdCwgdHJ1ZSk7CisgICAgICAgIGlmICh0ZXN0TWFuaWZlc3RSZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0ZXN0TWFuaWZlc3RSZXNvdXJjZSA9IEJ1bmRsZU1hbmlmZXN0VXRpbHMuZ2V0Rmlyc3RQb3NzaWJsZU1hbmlmZXN0RmlsZShnZXRQcm9qZWN0KCksIHRydWUpOworICAgICAgICB9CiAKLQkJYm9vbGVhbiBmb3JtYXRQcmVmID0gZ2V0UHJvamVjdFByZWZlcmVuY2VzKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSkuZ2V0Qm9vbGVhbigKLQkJCQlCdW5kbG9yQ29yZVBsdWdpbi5GT1JNQVRfR0VORVJBVEVEX01BTklGRVNUU19LRVksIEJ1bmRsb3JDb3JlUGx1Z2luLkZPUk1BVF9HRU5FUkFURURfTUFOSUZFU1RTX0RFRkFVTFQpOwotCQlpZiAobWFuaWZlc3RSZXNvdXJjZSAhPSBudWxsICYmIG1hbmlmZXN0UmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCW1hbmlmZXN0LndyaXRlKHdyaXRlcik7Ci0JCQkJSW5wdXRTdHJlYW0gbWFuaWZlc3RTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0od3JpdGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7Ci0JCQkJaWYgKGZvcm1hdFByZWYpIHsKLQkJCQkJbWFuaWZlc3RTdHJlYW0gPSBmb3JtYXRNYW5pZmVzdCgoSUZpbGUpIG1hbmlmZXN0UmVzb3VyY2UsIG1hbmlmZXN0U3RyZWFtKTsKLQkJCQl9Ci0JCQkJSVN0YXR1cyB2YWxpZCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQobmV3IElGaWxlW10geyAoSUZpbGUpIG1hbmlmZXN0UmVzb3VyY2UgfSwKLQkJCQkJCUlXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUKTsKLQkJCQlpZiAodmFsaWQuaXNPSygpKSB7Ci0JCQkJCSgoSUZpbGUpIG1hbmlmZXN0UmVzb3VyY2UpLnNldENvbnRlbnRzKG1hbmlmZXN0U3RyZWFtLCBJUmVzb3VyY2UuRk9SQ0UgfCBJUmVzb3VyY2UuS0VFUF9ISVNUT1JZLAotCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCQltYW5pZmVzdFN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQorICAgICAgICBib29sZWFuIGZvcm1hdFByZWYgPSBnZXRQcm9qZWN0UHJlZmVyZW5jZXMoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKS5nZXRCb29sZWFuKEJ1bmRsb3JDb3JlUGx1Z2luLkZPUk1BVF9HRU5FUkFURURfTUFOSUZFU1RTX0tFWSwKKyAgICAgICAgICAgIEJ1bmRsb3JDb3JlUGx1Z2luLkZPUk1BVF9HRU5FUkFURURfTUFOSUZFU1RTX0RFRkFVTFQpOworICAgICAgICBpZiAobWFuaWZlc3RSZXNvdXJjZSAhPSBudWxsICYmIG1hbmlmZXN0UmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICAgICAgICAgIG1hbmlmZXN0LndyaXRlKHdyaXRlcik7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gbWFuaWZlc3RTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0od3JpdGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdFByZWYpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RTdHJlYW0gPSBmb3JtYXRNYW5pZmVzdCgoSUZpbGUpIG1hbmlmZXN0UmVzb3VyY2UsIG1hbmlmZXN0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSVN0YXR1cyB2YWxpZCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQobmV3IElGaWxlW10geyAoSUZpbGUpIG1hbmlmZXN0UmVzb3VyY2UgfSwgSVdvcmtzcGFjZS5WQUxJREFURV9QUk9NUFQpOworICAgICAgICAgICAgICAgIGlmICh2YWxpZC5pc09LKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKChJRmlsZSkgbWFuaWZlc3RSZXNvdXJjZSkuc2V0Q29udGVudHMobWFuaWZlc3RTdHJlYW0sIElSZXNvdXJjZS5GT1JDRSB8IElSZXNvdXJjZS5LRUVQX0hJU1RPUlksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBtYW5pZmVzdFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQogCi0JCX0KLQkJaWYgKHRlc3RNYW5pZmVzdFJlc291cmNlICE9IG51bGwgJiYgdGVzdE1hbmlmZXN0UmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCWNsZWFuVGVzdE1hbmlmZXN0LndyaXRlKHdyaXRlcik7Ci0JCQkJSW5wdXRTdHJlYW0gdGVzdE1hbmlmZXN0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHdyaXRlci50b1N0cmluZygpLmdldEJ5dGVzKCkpOwotCQkJCWlmIChmb3JtYXRQcmVmKSB7Ci0JCQkJCXRlc3RNYW5pZmVzdFN0cmVhbSA9IGZvcm1hdE1hbmlmZXN0KChJRmlsZSkgdGVzdE1hbmlmZXN0UmVzb3VyY2UsIHRlc3RNYW5pZmVzdFN0cmVhbSk7Ci0JCQkJfQotCQkJCUlTdGF0dXMgdmFsaWQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KAotCQkJCQkJbmV3IElGaWxlW10geyAoSUZpbGUpIHRlc3RNYW5pZmVzdFJlc291cmNlIH0sIElXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUKTsKLQkJCQlpZiAodmFsaWQuaXNPSygpKSB7Ci0JCQkJCSgoSUZpbGUpIHRlc3RNYW5pZmVzdFJlc291cmNlKS5zZXRDb250ZW50cyh0ZXN0TWFuaWZlc3RTdHJlYW0sIElSZXNvdXJjZS5GT1JDRQotCQkJCQkJCXwgSVJlc291cmNlLktFRVBfSElTVE9SWSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJCXRlc3RNYW5pZmVzdFN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQorICAgICAgICB9CisgICAgICAgIGlmICh0ZXN0TWFuaWZlc3RSZXNvdXJjZSAhPSBudWxsICYmIHRlc3RNYW5pZmVzdFJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgICAgICBjbGVhblRlc3RNYW5pZmVzdC53cml0ZSh3cml0ZXIpOworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHRlc3RNYW5pZmVzdFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh3cml0ZXIudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0UHJlZikgeworICAgICAgICAgICAgICAgICAgICB0ZXN0TWFuaWZlc3RTdHJlYW0gPSBmb3JtYXRNYW5pZmVzdCgoSUZpbGUpIHRlc3RNYW5pZmVzdFJlc291cmNlLCB0ZXN0TWFuaWZlc3RTdHJlYW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJU3RhdHVzIHZhbGlkID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChuZXcgSUZpbGVbXSB7IChJRmlsZSkgdGVzdE1hbmlmZXN0UmVzb3VyY2UgfSwgSVdvcmtzcGFjZS5WQUxJREFURV9QUk9NUFQpOworICAgICAgICAgICAgICAgIGlmICh2YWxpZC5pc09LKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKChJRmlsZSkgdGVzdE1hbmlmZXN0UmVzb3VyY2UpLnNldENvbnRlbnRzKHRlc3RNYW5pZmVzdFN0cmVhbSwgSVJlc291cmNlLkZPUkNFIHwgSVJlc291cmNlLktFRVBfSElTVE9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0ZXN0TWFuaWZlc3RTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgSW5wdXRTdHJlYW0gZm9ybWF0TWFuaWZlc3QoSUZpbGUgZmlsZSwgSW5wdXRTdHJlYW0gbWFuaWZlc3RJbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3ByaW5nQnVuZGxlTW9kZWwgbW9kZWwgPSBuZXcgU3ByaW5nQnVuZGxlTW9kZWwoIiIsIHRydWUpOwotCQlTcHJpbmdCdW5kbGVNb2RlbEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTcHJpbmdCdW5kbGVNb2RlbEZhY3RvcnkobW9kZWwpOwotCQl0cnkgewotCQkJTWFwIGhlYWRlcnMgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VCdW5kbGVNYW5pZmVzdChtYW5pZmVzdElucHV0LCBudWxsKTsKLQkJCWZvciAoT2JqZWN0IG9iaiA6IGhlYWRlcnMua2V5U2V0KCkpIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgb2JqOwotCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGhlYWRlcnMuZ2V0KGtleSk7Ci0JCQkJTWFuaWZlc3RIZWFkZXIgaGVhZGVyID0gKE1hbmlmZXN0SGVhZGVyKSBmYWN0b3J5LmNyZWF0ZUhlYWRlcihrZXksIHZhbHVlKTsKLQkJCQloZWFkZXIudXBkYXRlKGZhbHNlKTsKLQkJCQlTdHJpbmcgcmVzdWx0ID0gaGVhZGVyLndyaXRlKCk7Ci0JCQkJd3JpdGVyLndyaXRlKHJlc3VsdCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJU3RyaW5nIG1hbmlmZXN0T3V0cHV0ID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0JCXdyaXRlci5jbG9zZSgpOwotCQltYW5pZmVzdElucHV0LmNsb3NlKCk7Ci0JCW1vZGVsLmRpc3Bvc2UoKTsKLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtYW5pZmVzdE91dHB1dC5nZXRCeXRlcygpKTsKLQl9CisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBmb3JtYXRNYW5pZmVzdChJRmlsZSBmaWxlLCBJbnB1dFN0cmVhbSBtYW5pZmVzdElucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBTcHJpbmdCdW5kbGVNb2RlbCBtb2RlbCA9IG5ldyBTcHJpbmdCdW5kbGVNb2RlbCgiIiwgdHJ1ZSk7CisgICAgICAgIFNwcmluZ0J1bmRsZU1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFNwcmluZ0J1bmRsZU1vZGVsRmFjdG9yeShtb2RlbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNYXAgaGVhZGVycyA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUJ1bmRsZU1hbmlmZXN0KG1hbmlmZXN0SW5wdXQsIG51bGwpOworICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqIDogaGVhZGVycy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBvYmo7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgaGVhZGVycy5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICBNYW5pZmVzdEhlYWRlciBoZWFkZXIgPSAoTWFuaWZlc3RIZWFkZXIpIGZhY3RvcnkuY3JlYXRlSGVhZGVyKGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgIGhlYWRlci51cGRhdGUoZmFsc2UpOworICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSBoZWFkZXIud3JpdGUoKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUocmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbWFuaWZlc3RPdXRwdXQgPSB3cml0ZXIudG9TdHJpbmcoKTsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgIG1hbmlmZXN0SW5wdXQuY2xvc2UoKTsKKyAgICAgICAgbW9kZWwuZGlzcG9zZSgpOworICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1hbmlmZXN0T3V0cHV0LmdldEJ5dGVzKCkpOworICAgIH0KIAotCS8qKgotCSAqIFZpc2l0IHRoZSB7QGxpbmsgSVJlc291cmNlRGVsdGF9IGFuZCBwcmVwYXJlIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmVzIG9mIGNoYW5nZWQgYW5kIHJlbW92ZWQgcmVzb3VyY2VzLgotCSAqLwotCXByaXZhdGUgdm9pZCB2aXNpdFJlc291cmNlRGVsdGEoSVByb2plY3QgcHJvamVjdCwgZmluYWwgaW50IGtpbmQsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWx0YSA9PSBudWxsIHx8IGtpbmQgPT0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxEKSB7Ci0JCQlJUmVzb3VyY2VWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlVmlzaXRvcigpIHsKKyAgICAvKioKKyAgICAgKiBWaXNpdCB0aGUge0BsaW5rIElSZXNvdXJjZURlbHRhfSBhbmQgcHJlcGFyZSB0aGUgaW50ZXJuYWwgc3RydWN0dXJlcyBvZiBjaGFuZ2VkIGFuZCByZW1vdmVkIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmlzaXRSZXNvdXJjZURlbHRhKElQcm9qZWN0IHByb2plY3QsIGZpbmFsIGludCBraW5kLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBpZiAoZGVsdGEgPT0gbnVsbCB8fCBraW5kID09IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCkgeworICAgICAgICAgICAgSVJlc291cmNlVmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7CiAKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJZG9HZXRBZmZlY3RlZFJlc291cmNlcyhyZXNvdXJjZSwgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfTsKLQkJCXByb2plY3QuYWNjZXB0KHZpc2l0b3IpOwotCQl9IGVsc2UgewotCQkJSVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBkb0dldEFmZmVjdGVkUmVzb3VyY2VzKHJlc291cmNlLCBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgcHJvamVjdC5hY2NlcHQodmlzaXRvcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7CiAKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlkb0dldEFmZmVjdGVkUmVzb3VyY2VzKGRlbHRhLmdldFJlc291cmNlKCksIGtpbmQsIGRlbHRhLmdldEtpbmQoKSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX07Ci0JCQlkZWx0YS5hY2NlcHQodmlzaXRvcik7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgZG9HZXRBZmZlY3RlZFJlc291cmNlcyhkZWx0YS5nZXRSZXNvdXJjZSgpLCBraW5kLCBkZWx0YS5nZXRLaW5kKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgZGVsdGEuYWNjZXB0KHZpc2l0b3IpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0UHJvamVjdFByZWZlcmVuY2VzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVNjb3BlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KTsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gY29udGV4dC5nZXROb2RlKEJ1bmRsb3JDb3JlUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCXJldHVybiBub2RlOwotCX0KKyAgICBwdWJsaWMgSUVjbGlwc2VQcmVmZXJlbmNlcyBnZXRQcm9qZWN0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCkgeworICAgICAgICBJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpOworICAgICAgICBJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBjb250ZXh0LmdldE5vZGUoQnVuZGxvckNvcmVQbHVnaW4uUExVR0lOX0lEKTsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQogCi0JLyoqCi0JICogRXh0ZW5zaW9uIHRvIHtAbGluayBBc3RUeXBlQXJ0aWZhY3RBbmFseXNlcn0gdGhhdCB0YWtlcyBhIHtAbGluayBJUHJvZ3Jlc3NNb25pdG9yfSB0byByZXBvcnQgbW9uaXRvcgotCSAqLwotCWNsYXNzIFByb2dyZXNzUmVwb3J0aW5nQXN0VHlwZUFydGVmYWN0QW5hbHlzZXIgZXh0ZW5kcyBBc3RUeXBlQXJ0aWZhY3RBbmFseXNlciB7CisgICAgLyoqCisgICAgICogRXh0ZW5zaW9uIHRvIHtAbGluayBBc3RUeXBlQXJ0aWZhY3RBbmFseXNlcn0gdGhhdCB0YWtlcyBhIHtAbGluayBJUHJvZ3Jlc3NNb25pdG9yfSB0byByZXBvcnQgbW9uaXRvcgorICAgICAqLworICAgIGNsYXNzIFByb2dyZXNzUmVwb3J0aW5nQXN0VHlwZUFydGVmYWN0QW5hbHlzZXIgZXh0ZW5kcyBBc3RUeXBlQXJ0aWZhY3RBbmFseXNlciB7CiAKLQkJcHJpdmF0ZSBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7CisgICAgICAgIHByaXZhdGUgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwogCi0JCXB1YmxpYyBQcm9ncmVzc1JlcG9ydGluZ0FzdFR5cGVBcnRlZmFjdEFuYWx5c2VyKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlzdXBlcihqYXZhUHJvamVjdCk7Ci0JCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQl9CisgICAgICAgIHB1YmxpYyBQcm9ncmVzc1JlcG9ydGluZ0FzdFR5cGVBcnRlZmFjdEFuYWx5c2VyKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisgICAgICAgICAgICBzdXBlcihqYXZhUHJvamVjdCk7CisgICAgICAgICAgICB0aGlzLm1vbml0b3IgPSBtb25pdG9yOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFuYWx5c2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBuYW1lLCBQYXJ0aWFsTWFuaWZlc3QgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQkJbW9uaXRvci5zdWJUYXNrKCJTY2FubmluZyAnIiArIG5hbWUgKyAiJyIpOwotCQkJc3VwZXIuYW5hbHlzZShpcywgbmFtZSwgbW9kZWwpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhbmFseXNlKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgbmFtZSwgUGFydGlhbE1hbmlmZXN0IG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRoaXMubW9uaXRvci5zdWJUYXNrKCJTY2FubmluZyAnIiArIG5hbWUgKyAiJyIpOworICAgICAgICAgICAgc3VwZXIuYW5hbHlzZShpcywgbmFtZSwgbW9kZWwpOworICAgICAgICAgICAgdGhpcy5tb25pdG9yLndvcmtlZCgxKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwotCSAqIEBzaW5jZSAyLjEuMQotCSAqLwotCWNsYXNzIFByb2dyZXNzUmVwb3J0aW5nQXNtVHlwZUFydGVmYWN0QW5hbHlzZXIgZXh0ZW5kcyBFeHRlbnNpYmxlQXNtVHlwZUFydGVmYWN0QW5hbHlzZXIgeworICAgIC8qKgorICAgICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcworICAgICAqIEBzaW5jZSAyLjEuMQorICAgICAqLworICAgIGNsYXNzIFByb2dyZXNzUmVwb3J0aW5nQXNtVHlwZUFydGVmYWN0QW5hbHlzZXIgZXh0ZW5kcyBFeHRlbnNpYmxlQXNtVHlwZUFydGVmYWN0QW5hbHlzZXIgewogCi0JCXByaXZhdGUgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOworICAgICAgICBwcml2YXRlIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKIAotCQlwdWJsaWMgUHJvZ3Jlc3NSZXBvcnRpbmdBc21UeXBlQXJ0ZWZhY3RBbmFseXNlcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCX0KKyAgICAgICAgcHVibGljIFByb2dyZXNzUmVwb3J0aW5nQXNtVHlwZUFydGVmYWN0QW5hbHlzZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisgICAgICAgICAgICB0aGlzLm1vbml0b3IgPSBtb25pdG9yOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFuYWx5c2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBuYW1lLCBQYXJ0aWFsTWFuaWZlc3QgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQkJbW9uaXRvci5zdWJUYXNrKCJTY2FubmluZyAnIiArIG5hbWUgKyAiJyIpOwotCQkJc3VwZXIuYW5hbHlzZShpcywgbmFtZSwgbW9kZWwpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhbmFseXNlKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgbmFtZSwgUGFydGlhbE1hbmlmZXN0IG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRoaXMubW9uaXRvci5zdWJUYXNrKCJTY2FubmluZyAnIiArIG5hbWUgKyAiJyIpOworICAgICAgICAgICAgc3VwZXIuYW5hbHlzZShpcywgbmFtZSwgbW9kZWwpOworICAgICAgICAgICAgdGhpcy5tb25pdG9yLndvcmtlZCgxKTsKKyAgICAgICAgfQorICAgIH0KIAotCWNsYXNzIEZpbHRlcmluZ0NsYXNzUGF0aCBpbXBsZW1lbnRzIENsYXNzUGF0aCB7CisgICAgY2xhc3MgRmlsdGVyaW5nQ2xhc3NQYXRoIGltcGxlbWVudHMgQ2xhc3NQYXRoIHsKIAotCQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzUGF0aEVudHJ5PiBlbnRyaWVzOworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzUGF0aEVudHJ5PiBlbnRyaWVzOwogCi0JCXB1YmxpYyBGaWx0ZXJpbmdDbGFzc1BhdGgoU2V0PElSZXNvdXJjZT4gcmVzb3VyY2VzLCBTdHJpbmcgZm9sZGVyKSB7Ci0JCQl0aGlzLmVudHJpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzUGF0aEVudHJ5PigpOworICAgICAgICBwdWJsaWMgRmlsdGVyaW5nQ2xhc3NQYXRoKFNldDxJUmVzb3VyY2U+IHJlc291cmNlcywgU3RyaW5nIGZvbGRlcikgeworICAgICAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzc1BhdGhFbnRyeT4oKTsKIAotCQkJZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiByZXNvdXJjZXMpIHsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQlTdHJpbmcgcGF0aCA9IHJlc291cmNlLmdldFJhd0xvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQkJaWYgKHBhdGguc3RhcnRzV2l0aChmb2xkZXIpKSB7Ci0JCQkJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoZm9sZGVyLmxlbmd0aCgpICsgMSk7Ci0JCQkJCQllbnRyaWVzLnB1dChwYXRoLCBuZXcgRmlsZUNsYXNzUGF0aEVudHJ5KHBhdGgsIChJRmlsZSkgcmVzb3VyY2UpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICAgICAgZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiByZXNvdXJjZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHJlc291cmNlLmdldFJhd0xvY2F0aW9uKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChmb2xkZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoZm9sZGVyLmxlbmd0aCgpICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXMucHV0KHBhdGgsIG5ldyBGaWxlQ2xhc3NQYXRoRW50cnkocGF0aCwgKElGaWxlKSByZXNvdXJjZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCQkvLyBOb3RoaW5nIHRvIGNsb3NlCi0JCX0KKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGNsb3NlCisgICAgICAgIH0KIAotCQlwdWJsaWMgQ2xhc3NQYXRoRW50cnkgZ2V0RW50cnkoU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBlbnRyaWVzLmdldChuYW1lKTsKLQkJfQorICAgICAgICBwdWJsaWMgQ2xhc3NQYXRoRW50cnkgZ2V0RW50cnkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KG5hbWUpOworICAgICAgICB9CiAKLQkJcHVibGljIEl0ZXJhdG9yPENsYXNzUGF0aEVudHJ5PiBpdGVyYXRvcigpIHsKLQkJCXJldHVybiBlbnRyaWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPENsYXNzUGF0aEVudHJ5PiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCWNsYXNzIEZpbGVDbGFzc1BhdGhFbnRyeSBpbXBsZW1lbnRzIENsYXNzUGF0aEVudHJ5IHsKKyAgICBjbGFzcyBGaWxlQ2xhc3NQYXRoRW50cnkgaW1wbGVtZW50cyBDbGFzc1BhdGhFbnRyeSB7CiAKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKIAotCQlwcml2YXRlIGZpbmFsIElGaWxlIGZpbGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUZpbGUgZmlsZTsKIAotCQlwdWJsaWMgRmlsZUNsYXNzUGF0aEVudHJ5KFN0cmluZyBuYW1lLCBJRmlsZSBmaWxlKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maWxlID0gZmlsZTsKLQkJfQorICAgICAgICBwdWJsaWMgRmlsZUNsYXNzUGF0aEVudHJ5KFN0cmluZyBuYW1lLCBJRmlsZSBmaWxlKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZpbGUuZ2V0Q29udGVudHModHJ1ZSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGUuZ2V0Q29udGVudHModHJ1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgUmVhZGVyIGdldFJlYWRlcigpIHsKLQkJCXJldHVybiBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCX0KKyAgICAgICAgcHVibGljIFJlYWRlciBnZXRSZWFkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U3RyZWFtUmVhZGVyKGdldElucHV0U3RyZWFtKCkpOworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvSW5jcmVtZW50YWxQYXJ0aWFsTWFuaWZlc3RNYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci9pbnRlcm5hbC9jb3JlL0luY3JlbWVudGFsUGFydGlhbE1hbmlmZXN0TWFuYWdlci5qYXZhCmluZGV4IDU0NDRjZTkuLmMyNDMwOTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvSW5jcmVtZW50YWxQYXJ0aWFsTWFuaWZlc3RNYW5hZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9JbmNyZW1lbnRhbFBhcnRpYWxNYW5pZmVzdE1hbmFnZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTE5LDEwMSArMjAsOTUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5idW5kbG9yLnN1cHBvcnQucGFydGlhbG1hbmlmZXN0LlJlYWRhYmxlUGFydGlhbE1hbmlmZXN0OwogCiAvKioKLSAqIE1hbmFnZXMgdGhlIHtAbGluayBJbmNyZW1lbnRhbFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0fSBpbnN0YW5jZXMgYnkKLSAqIHtAbGluayBJSmF2YVByb2plY3R9LgotICogCisgKiBNYW5hZ2VzIHRoZSB7QGxpbmsgSW5jcmVtZW50YWxSZWFkYWJsZVBhcnRpYWxNYW5pZmVzdH0gaW5zdGFuY2VzIGJ5IHtAbGluayBJSmF2YVByb2plY3R9LgorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMS4yCiAgKi8KIHB1YmxpYyBjbGFzcyBJbmNyZW1lbnRhbFBhcnRpYWxNYW5pZmVzdE1hbmFnZXIgewogCi0JLyoqCi0JICogSW50ZXJuYWwgcmVhZCB3cml0ZSBsb2NrIHRvIHByb3RlY3QgdGhlIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMgb2YgdGhlCi0JICogaW50ZXJuYWwgY2FjaGVzCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIHJ3bCA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgLyoqCisgICAgICogSW50ZXJuYWwgcmVhZCB3cml0ZSBsb2NrIHRvIHByb3RlY3QgdGhlIHJlYWQgYW5kIHdyaXRlIG9wZXJhdGlvbnMgb2YgdGhlIGludGVybmFsIGNhY2hlcworICAgICAqLworICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayByd2wgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOwogCi0JLyoqIFdyaXRlIGxvY2sgdG8gcHJvdGVjdCB0aGUgbW9kZWwgZnJvbSBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KLQlwcml2YXRlIGZpbmFsIExvY2sgdyA9IHJ3bC53cml0ZUxvY2soKTsKKyAgICAvKiogV3JpdGUgbG9jayB0byBwcm90ZWN0IHRoZSBtb2RlbCBmcm9tIGNvbmN1cnJlbnQgd3JpdGUgb3BlcmF0aW9ucyAqLworICAgIHByaXZhdGUgZmluYWwgTG9jayB3ID0gdGhpcy5yd2wud3JpdGVMb2NrKCk7CiAKLQkvKiogUmVhZCBsb2NrIHRvIHByb3RlY3QgZnJvbSByZWFkaW5nIHdoaWxlIHdyaXRpbmcgdG8gdGhlIG1vZGVsIHJlc291cmNlcyAqLwotCXByaXZhdGUgZmluYWwgTG9jayByID0gcndsLnJlYWRMb2NrKCk7CisgICAgLyoqIFJlYWQgbG9jayB0byBwcm90ZWN0IGZyb20gcmVhZGluZyB3aGlsZSB3cml0aW5nIHRvIHRoZSBtb2RlbCByZXNvdXJjZXMgKi8KKyAgICBwcml2YXRlIGZpbmFsIExvY2sgciA9IHRoaXMucndsLnJlYWRMb2NrKCk7CiAKLQkvKioKLQkgKiBJbnRlcm5hbCBzdHJ1Y3R1cmUgdG8gYXNzb2NpYXRlCi0JICoge0BsaW5rIEluY3JlbWVudGFsUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3R9cyB0byB7QGxpbmsgSUphdmFQcm9qZWN0fXMKLQkgKi8KLQlwcml2YXRlIE1hcDxJSmF2YVByb2plY3QsIFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0PiBtYW5pZmVzdHMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SUphdmFQcm9qZWN0LCBSZWFkYWJsZVBhcnRpYWxNYW5pZmVzdD4oKTsKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBzdHJ1Y3R1cmUgdG8gYXNzb2NpYXRlIHtAbGluayBJbmNyZW1lbnRhbFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0fXMgdG8ge0BsaW5rIElKYXZhUHJvamVjdH1zCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8SUphdmFQcm9qZWN0LCBSZWFkYWJsZVBhcnRpYWxNYW5pZmVzdD4gbWFuaWZlc3RzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPElKYXZhUHJvamVjdCwgUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3Q+KCk7CiAKLQkvKioKLQkgKiBJbnRlcm5hbCBzdHJ1Y3R1cmUgdG8gYXNzb2NpYXRlCi0JICoge0BsaW5rIEluY3JlbWVudGFsUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3R9cyB0aGF0IHJlcHJlc2VudCB0aGUgdGVzdAotCSAqIG1hbmlmZXN0cyB0byB7QGxpbmsgSUphdmFQcm9qZWN0fXMKLQkgKi8KLQlwcml2YXRlIE1hcDxJSmF2YVByb2plY3QsIFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0PiB0ZXN0TWFuaWZlc3RzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPElKYXZhUHJvamVjdCwgUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3Q+KCk7CisgICAgLyoqCisgICAgICogSW50ZXJuYWwgc3RydWN0dXJlIHRvIGFzc29jaWF0ZSB7QGxpbmsgSW5jcmVtZW50YWxSZWFkYWJsZVBhcnRpYWxNYW5pZmVzdH1zIHRoYXQgcmVwcmVzZW50IHRoZSB0ZXN0IG1hbmlmZXN0cyB0bworICAgICAqIHtAbGluayBJSmF2YVByb2plY3R9cworICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTWFwPElKYXZhUHJvamVjdCwgUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3Q+IHRlc3RNYW5pZmVzdHMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SUphdmFQcm9qZWN0LCBSZWFkYWJsZVBhcnRpYWxNYW5pZmVzdD4oKTsKIAotCS8qKgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEluY3JlbWVudGFsUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3R9IGZvciB0aGUKLQkgKiBnaXZlbiB7QGxpbmsgSUphdmFQcm9qZWN0fS4KLQkgKi8KLQlwdWJsaWMgUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3QgZ2V0UGFydGlhbE1hbmlmZXN0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiBpc1Rlc3RNYW5pZmVzdCwKLQkJCWJvb2xlYW4gY3JlYXRlTmV3KSB7Ci0JCWlmICghY3JlYXRlTmV3KSB7Ci0JCQl0cnkgewotCQkJCXIubG9jaygpOwotCQkJCWlmICghaXNUZXN0TWFuaWZlc3QpIHsKLQkJCQkJaWYgKG1hbmlmZXN0cy5jb250YWluc0tleShqYXZhUHJvamVjdCkpIHsKLQkJCQkJCXJldHVybiBtYW5pZmVzdHMuZ2V0KGphdmFQcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICh0ZXN0TWFuaWZlc3RzLmNvbnRhaW5zS2V5KGphdmFQcm9qZWN0KSkgewotCQkJCQkJcmV0dXJuIHRlc3RNYW5pZmVzdHMuZ2V0KGphdmFQcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJci51bmxvY2soKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJdy5sb2NrKCk7Ci0JCQlSZWFkYWJsZVBhcnRpYWxNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBJbmNyZW1lbnRhbFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0KCk7Ci0JCQlpZiAoIWlzVGVzdE1hbmlmZXN0KSB7Ci0JCQkJbWFuaWZlc3RzLnB1dChqYXZhUHJvamVjdCwgbWFuaWZlc3QpOwotCQkJfSBlbHNlIHsKLQkJCQl0ZXN0TWFuaWZlc3RzLnB1dChqYXZhUHJvamVjdCwgbWFuaWZlc3QpOwotCQkJfQotCQkJcmV0dXJuIG1hbmlmZXN0OwotCQl9IGZpbmFsbHkgewotCQkJdy51bmxvY2soKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBJbmNyZW1lbnRhbFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0fSBmb3IgdGhlIGdpdmVuIHtAbGluayBJSmF2YVByb2plY3R9LgorICAgICAqLworICAgIHB1YmxpYyBSZWFkYWJsZVBhcnRpYWxNYW5pZmVzdCBnZXRQYXJ0aWFsTWFuaWZlc3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBib29sZWFuIGlzVGVzdE1hbmlmZXN0LCBib29sZWFuIGNyZWF0ZU5ldykgeworICAgICAgICBpZiAoIWNyZWF0ZU5ldykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLnIubG9jaygpOworICAgICAgICAgICAgICAgIGlmICghaXNUZXN0TWFuaWZlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFuaWZlc3RzLmNvbnRhaW5zS2V5KGphdmFQcm9qZWN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuaWZlc3RzLmdldChqYXZhUHJvamVjdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50ZXN0TWFuaWZlc3RzLmNvbnRhaW5zS2V5KGphdmFQcm9qZWN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVzdE1hbmlmZXN0cy5nZXQoamF2YVByb2plY3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0aGlzLnIudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMudy5sb2NrKCk7CisgICAgICAgICAgICBSZWFkYWJsZVBhcnRpYWxNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBJbmNyZW1lbnRhbFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0KCk7CisgICAgICAgICAgICBpZiAoIWlzVGVzdE1hbmlmZXN0KSB7CisgICAgICAgICAgICAgICAgdGhpcy5tYW5pZmVzdHMucHV0KGphdmFQcm9qZWN0LCBtYW5pZmVzdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMudGVzdE1hbmlmZXN0cy5wdXQoamF2YVByb2plY3QsIG1hbmlmZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRoaXMudy51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHtAbGluayBJSmF2YVByb2plY3R9IGhhcwotCSAqIHtAbGluayBJbmNyZW1lbnRhbFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0fSBhc3NvY2lhdGVkIHdpdGggaXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUGFydGlhbE1hbmlmZXN0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQl0cnkgewotCQkJci5sb2NrKCk7Ci0JCQlyZXR1cm4gbWFuaWZlc3RzLmNvbnRhaW5zS2V5KGphdmFQcm9qZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXIudW5sb2NrKCk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4ge0BsaW5rIElKYXZhUHJvamVjdH0gaGFzIHtAbGluayBJbmNyZW1lbnRhbFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0fQorICAgICAqIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQYXJ0aWFsTWFuaWZlc3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLnIubG9jaygpOworICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFuaWZlc3RzLmNvbnRhaW5zS2V5KGphdmFQcm9qZWN0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRoaXMuci51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIENsZWFycyBvdXQgZXhpc3RpbmcgbWFuaWZlc3QgbW9kZWxzLgotCSAqIDxwPgotCSAqIFVzZWQgZm9ybSB0aGUgVUkgdG8gdHJpZ2dlciBhIGNsZWFuIG1vZGVsIGNyZWF0aW9uIG9uIHRoZSBuZXh0IHJ1bi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclBhcnRpYWxNYW5pZmVzdChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCXcubG9jaygpOwotCQkJbWFuaWZlc3RzLnJlbW92ZShqYXZhUHJvamVjdCk7Ci0JCQl0ZXN0TWFuaWZlc3RzLnJlbW92ZShqYXZhUHJvamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl3LnVubG9jaygpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIENsZWFycyBvdXQgZXhpc3RpbmcgbWFuaWZlc3QgbW9kZWxzLgorICAgICAqIDxwPgorICAgICAqIFVzZWQgZm9ybSB0aGUgVUkgdG8gdHJpZ2dlciBhIGNsZWFuIG1vZGVsIGNyZWF0aW9uIG9uIHRoZSBuZXh0IHJ1bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhclBhcnRpYWxNYW5pZmVzdChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMudy5sb2NrKCk7CisgICAgICAgICAgICB0aGlzLm1hbmlmZXN0cy5yZW1vdmUoamF2YVByb2plY3QpOworICAgICAgICAgICAgdGhpcy50ZXN0TWFuaWZlc3RzLnJlbW92ZShqYXZhUHJvamVjdCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0aGlzLncudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvSW5jcmVtZW50YWxSZWFkYWJsZVBhcnRpYWxNYW5pZmVzdC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9JbmNyZW1lbnRhbFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0LmphdmEKaW5kZXggNGM4ZDRjMS4uNDk4ZTdiMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9JbmNyZW1lbnRhbFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9JbmNyZW1lbnRhbFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0LmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtMjEsMjMyICsyMiwyMzIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5idW5kbG9yLnN1cHBvcnQucGFydGlhbG1hbmlmZXN0LlN0YW5kYXJkUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3Q7CiAKIC8qKgotICogRXh0ZW5zaW9uIHRvIHtAbGluayBTdGFuZGFyZFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0fSB0byBhbGxvdyBmb3IKLSAqIHJlLXJlY29yZGluZyBvZiB0eXBlIGRlcGVuZGVuY2llcyBpbiBhbiBpbmNyZW1lbnRhbCBtYW5uZXIgPC9wPi4KLSAqIAorICogRXh0ZW5zaW9uIHRvIHtAbGluayBTdGFuZGFyZFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0fSB0byBhbGxvdyBmb3IgcmUtcmVjb3JkaW5nIG9mIHR5cGUgZGVwZW5kZW5jaWVzIGluIGFuIGluY3JlbWVudGFsCisgKiBtYW5uZXIKKyAqIDwvcD4KKyAqIC4KKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIEluY3JlbWVudGFsUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3QgZXh0ZW5kcyBTdGFuZGFyZFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0IGltcGxlbWVudHMKLQkJRW50cnlTY2FubmVyTGlzdGVuZXIgeworcHVibGljIGZpbmFsIGNsYXNzIEluY3JlbWVudGFsUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3QgZXh0ZW5kcyBTdGFuZGFyZFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0IGltcGxlbWVudHMgRW50cnlTY2FubmVyTGlzdGVuZXIgewogCi0JLyoqIEFzc29jaWF0aW9uIG9mIGFuYWx5emVkIHR5cGVzIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMgKi8KLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFR5cGVEZXBlbmRlbmNpZXM+IHJlY29yZGVkVHlwZURlcGVuZGVuY2llcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVHlwZURlcGVuZGVuY2llcz4oKTsKKyAgICAvKiogQXNzb2NpYXRpb24gb2YgYW5hbHl6ZWQgdHlwZXMgYW5kIHRoZWlyIGRlcGVuZGVuY2llcyAqLworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVHlwZURlcGVuZGVuY2llcz4gcmVjb3JkZWRUeXBlRGVwZW5kZW5jaWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUeXBlRGVwZW5kZW5jaWVzPigpOwogCi0JcHJpdmF0ZSBmaW5hbCBTdGFjazxTdHJpbmc+IGN1cnJlbnRseUFuYWx5c2VkRW50cmllcyA9IG5ldyBTdGFjazxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTdGFjazxTdHJpbmc+IGN1cnJlbnRseUFuYWx5c2VkRW50cmllcyA9IG5ldyBTdGFjazxTdHJpbmc+KCk7CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVjb3JkUmVmZXJlbmNlZFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJVHlwZURlcGVuZGVuY2llcyB0eXBlRGVwZW5kZW5jaWVzID0gY3JlYXRlVHlwZURlcGVuZGVuY2llcyhudWxsKTsKLQkJaWYgKHR5cGVEZXBlbmRlbmNpZXMgIT0gbnVsbCkgewotCQkJdHlwZURlcGVuZGVuY2llcy5hZGRJbXBvcnRlZFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCX0KLQkJc3VwZXIucmVjb3JkUmVmZXJlbmNlZFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWNvcmRSZWZlcmVuY2VkVHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgeworICAgICAgICBUeXBlRGVwZW5kZW5jaWVzIHR5cGVEZXBlbmRlbmNpZXMgPSBjcmVhdGVUeXBlRGVwZW5kZW5jaWVzKG51bGwpOworICAgICAgICBpZiAodHlwZURlcGVuZGVuY2llcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0eXBlRGVwZW5kZW5jaWVzLmFkZEltcG9ydGVkVHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5yZWNvcmRSZWZlcmVuY2VkVHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIHZvaWQgcmVjb3JkUmVmZXJlbmNlZFBhY2thZ2UoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkUGFja2FnZU5hbWUpIHsKLQkJVHlwZURlcGVuZGVuY2llcyB0eXBlRGVwZW5kZW5jaWVzID0gY3JlYXRlVHlwZURlcGVuZGVuY2llcyhudWxsKTsKLQkJaWYgKHR5cGVEZXBlbmRlbmNpZXMgIT0gbnVsbCkgewotCQkJdHlwZURlcGVuZGVuY2llcy5hZGRJbXBvcnRlZFBhY2thZ2UoZnVsbHlRdWFsaWZpZWRQYWNrYWdlTmFtZSk7Ci0JCX0KLQkJc3VwZXIucmVjb3JkUmVmZXJlbmNlZFBhY2thZ2UoZnVsbHlRdWFsaWZpZWRQYWNrYWdlTmFtZSk7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWNvcmRSZWZlcmVuY2VkUGFja2FnZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRQYWNrYWdlTmFtZSkgeworICAgICAgICBUeXBlRGVwZW5kZW5jaWVzIHR5cGVEZXBlbmRlbmNpZXMgPSBjcmVhdGVUeXBlRGVwZW5kZW5jaWVzKG51bGwpOworICAgICAgICBpZiAodHlwZURlcGVuZGVuY2llcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0eXBlRGVwZW5kZW5jaWVzLmFkZEltcG9ydGVkUGFja2FnZShmdWxseVF1YWxpZmllZFBhY2thZ2VOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5yZWNvcmRSZWZlcmVuY2VkUGFja2FnZShmdWxseVF1YWxpZmllZFBhY2thZ2VOYW1lKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVjb3JkVHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQljcmVhdGVUeXBlRGVwZW5kZW5jaWVzKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWNvcmRUeXBlKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7CisgICAgICAgIGNyZWF0ZVR5cGVEZXBlbmRlbmNpZXMoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CiAKLQkJc3VwZXIucmVjb3JkVHlwZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQl9CisgICAgICAgIHN1cGVyLnJlY29yZFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlY29yZFVzZXNQYWNrYWdlKFN0cmluZyB1c2luZ1BhY2thZ2UsIFN0cmluZyB1c2VkUGFja2FnZSkgewotCQlUeXBlRGVwZW5kZW5jaWVzIHR5cGVEZXBlbmRlbmNpZXMgPSBjcmVhdGVUeXBlRGVwZW5kZW5jaWVzKG51bGwpOwotCQlpZiAodHlwZURlcGVuZGVuY2llcyAhPSBudWxsKSB7Ci0JCQl0eXBlRGVwZW5kZW5jaWVzLmFkZFVzZXModXNpbmdQYWNrYWdlLCB1c2VkUGFja2FnZSk7Ci0JCX0KLQkJc3VwZXIucmVjb3JkVXNlc1BhY2thZ2UodXNpbmdQYWNrYWdlLCB1c2VkUGFja2FnZSk7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWNvcmRVc2VzUGFja2FnZShTdHJpbmcgdXNpbmdQYWNrYWdlLCBTdHJpbmcgdXNlZFBhY2thZ2UpIHsKKyAgICAgICAgVHlwZURlcGVuZGVuY2llcyB0eXBlRGVwZW5kZW5jaWVzID0gY3JlYXRlVHlwZURlcGVuZGVuY2llcyhudWxsKTsKKyAgICAgICAgaWYgKHR5cGVEZXBlbmRlbmNpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgdHlwZURlcGVuZGVuY2llcy5hZGRVc2VzKHVzaW5nUGFja2FnZSwgdXNlZFBhY2thZ2UpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnJlY29yZFVzZXNQYWNrYWdlKHVzaW5nUGFja2FnZSwgdXNlZFBhY2thZ2UpOworICAgIH0KIAotCS8qKgotCSAqIFJlbW92ZSBhIHJlY29yZGVkIHR5cGUgZnJvbSB0aGUgcGFydGlhbCBtYW5pZmVzdDsgYWxzbyByZW1vdmVzIGFsbAotCSAqIGluZHVjZWQgZGVwZW5kZW5jaWVzIHRoYXQgdGhpcyB0eXBlIGNyZWF0ZWQuCi0JICogCi0JICogQHBhcmFtIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgdGhlIHR5cGUgdG8gcmVtb3ZlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVucmVjb3JkVHlwZSgpIHsKLQkJU3RyaW5nIGN1cnJlbnRFbnRyeSA9IGN1cnJlbnRFbnRyeSgpOwotCQlpZiAocmVjb3JkZWRUeXBlRGVwZW5kZW5jaWVzLmNvbnRhaW5zS2V5KGN1cnJlbnRFbnRyeSkpIHsKLQkJCVR5cGVEZXBlbmRlbmNpZXMgZXhpc3RpbmdUeXBlRGVwZW5kZW5jaWVzID0gcmVjb3JkZWRUeXBlRGVwZW5kZW5jaWVzLmdldChjdXJyZW50RW50cnkpOwotCQkJU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgPSBleGlzdGluZ1R5cGVEZXBlbmRlbmNpZXMuZ2V0RnVsbFF1YWxpZmllZFR5cGVOYW1lKCk7CisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcmVjb3JkZWQgdHlwZSBmcm9tIHRoZSBwYXJ0aWFsIG1hbmlmZXN0OyBhbHNvIHJlbW92ZXMgYWxsIGluZHVjZWQgZGVwZW5kZW5jaWVzIHRoYXQgdGhpcyB0eXBlIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSB0aGUgdHlwZSB0byByZW1vdmUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdW5yZWNvcmRUeXBlKCkgeworICAgICAgICBTdHJpbmcgY3VycmVudEVudHJ5ID0gY3VycmVudEVudHJ5KCk7CisgICAgICAgIGlmICh0aGlzLnJlY29yZGVkVHlwZURlcGVuZGVuY2llcy5jb250YWluc0tleShjdXJyZW50RW50cnkpKSB7CisgICAgICAgICAgICBUeXBlRGVwZW5kZW5jaWVzIGV4aXN0aW5nVHlwZURlcGVuZGVuY2llcyA9IHRoaXMucmVjb3JkZWRUeXBlRGVwZW5kZW5jaWVzLmdldChjdXJyZW50RW50cnkpOworICAgICAgICAgICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgPSBleGlzdGluZ1R5cGVEZXBlbmRlbmNpZXMuZ2V0RnVsbFF1YWxpZmllZFR5cGVOYW1lKCk7CiAKLQkJCS8vIFJlbW92ZSBpbiBvcmRlciB0byBpdGVyYXRlIG92ZXIgdGhlIHJlbWFpbmluZwotCQkJcmVjb3JkZWRUeXBlRGVwZW5kZW5jaWVzLnJlbW92ZShjdXJyZW50RW50cnkpOworICAgICAgICAgICAgLy8gUmVtb3ZlIGluIG9yZGVyIHRvIGl0ZXJhdGUgb3ZlciB0aGUgcmVtYWluaW5nCisgICAgICAgICAgICB0aGlzLnJlY29yZGVkVHlwZURlcGVuZGVuY2llcy5yZW1vdmUoY3VycmVudEVudHJ5KTsKIAotCQkJU3RyaW5nIG9sZFBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgb2xkUGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKIAotCQkJLy8gUmVtb3ZlIHRoZSBhY3R1YWwgdHlwZQotCQkJdW5yZWNvcmRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOworICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBhY3R1YWwgdHlwZQorICAgICAgICAgICAgdW5yZWNvcmRUeXBlKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOwogCi0JCQkvLyBSZW1vdmUgdGhlIGFjdHVhbCBwYWNrYWdlIG5hbWUgZnJvbSB0aGUgZXhwb3J0IHBhY2thZ2Ugc2V0Ci0JCQlib29sZWFuIG90aGVyVHlwZXMgPSBmYWxzZTsKLQkJCWZvciAoVHlwZURlcGVuZGVuY2llcyBleGlzdGluZ1R5cGVEZXBlbmRlbmN5IDogcmVjb3JkZWRUeXBlRGVwZW5kZW5jaWVzLnZhbHVlcygpKSB7Ci0JCQkJU3RyaW5nIGV4aXN0aW5nUGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZShleGlzdGluZ1R5cGVEZXBlbmRlbmN5LmdldEZ1bGxRdWFsaWZpZWRUeXBlTmFtZSgpKTsKLQkJCQlpZiAoZXhpc3RpbmdQYWNrYWdlTmFtZSAhPSBudWxsICYmIGV4aXN0aW5nUGFja2FnZU5hbWUuZXF1YWxzKG9sZFBhY2thZ2VOYW1lKSkgewotCQkJCQlvdGhlclR5cGVzID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFvdGhlclR5cGVzICYmIG9sZFBhY2thZ2VOYW1lICE9IG51bGwpIHsKLQkJCQl1bnJlY29yZEV4cG9ydFBhY2thZ2Uob2xkUGFja2FnZU5hbWUpOwotCQkJfQorICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBhY3R1YWwgcGFja2FnZSBuYW1lIGZyb20gdGhlIGV4cG9ydCBwYWNrYWdlIHNldAorICAgICAgICAgICAgYm9vbGVhbiBvdGhlclR5cGVzID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKFR5cGVEZXBlbmRlbmNpZXMgZXhpc3RpbmdUeXBlRGVwZW5kZW5jeSA6IHRoaXMucmVjb3JkZWRUeXBlRGVwZW5kZW5jaWVzLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGV4aXN0aW5nUGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZShleGlzdGluZ1R5cGVEZXBlbmRlbmN5LmdldEZ1bGxRdWFsaWZpZWRUeXBlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdQYWNrYWdlTmFtZSAhPSBudWxsICYmIGV4aXN0aW5nUGFja2FnZU5hbWUuZXF1YWxzKG9sZFBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBvdGhlclR5cGVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFvdGhlclR5cGVzICYmIG9sZFBhY2thZ2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1bnJlY29yZEV4cG9ydFBhY2thZ2Uob2xkUGFja2FnZU5hbWUpOworICAgICAgICAgICAgfQogCi0JCQkvLyBSZW1vdmUgYW55IGltcG9ydGVkIHR5cGVzCi0JCQlmb3IgKFN0cmluZyBpbXBvcnRlZFR5cGUgOiBleGlzdGluZ1R5cGVEZXBlbmRlbmNpZXMuZ2V0SW1wb3J0ZWRUeXBlcygpKSB7Ci0JCQkJYm9vbGVhbiBvdGhlckltcG9ydHMgPSBmYWxzZTsKLQkJCQlmb3IgKFR5cGVEZXBlbmRlbmNpZXMgZXhpc3RpbmdUeXBlUGFydGlhbE1hbmlmZXN0IDogcmVjb3JkZWRUeXBlRGVwZW5kZW5jaWVzLnZhbHVlcygpKSB7Ci0JCQkJCWZvciAoU3RyaW5nIGV4aXN0aW5nSW1wb3J0ZWRUeXBlIDogZXhpc3RpbmdUeXBlUGFydGlhbE1hbmlmZXN0LmdldEltcG9ydGVkVHlwZXMoKSkgewotCQkJCQkJaWYgKGltcG9ydGVkVHlwZS5lcXVhbHMoZXhpc3RpbmdJbXBvcnRlZFR5cGUpKSB7Ci0JCQkJCQkJb3RoZXJJbXBvcnRzID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIW90aGVySW1wb3J0cykgewotCQkJCQlyZW1vdmVJbXBvcnRlZFR5cGUoaW1wb3J0ZWRUeXBlKTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICAvLyBSZW1vdmUgYW55IGltcG9ydGVkIHR5cGVzCisgICAgICAgICAgICBmb3IgKFN0cmluZyBpbXBvcnRlZFR5cGUgOiBleGlzdGluZ1R5cGVEZXBlbmRlbmNpZXMuZ2V0SW1wb3J0ZWRUeXBlcygpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBvdGhlckltcG9ydHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKFR5cGVEZXBlbmRlbmNpZXMgZXhpc3RpbmdUeXBlUGFydGlhbE1hbmlmZXN0IDogdGhpcy5yZWNvcmRlZFR5cGVEZXBlbmRlbmNpZXMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZXhpc3RpbmdJbXBvcnRlZFR5cGUgOiBleGlzdGluZ1R5cGVQYXJ0aWFsTWFuaWZlc3QuZ2V0SW1wb3J0ZWRUeXBlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRUeXBlLmVxdWFscyhleGlzdGluZ0ltcG9ydGVkVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlckltcG9ydHMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb3RoZXJJbXBvcnRzKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUltcG9ydGVkVHlwZShpbXBvcnRlZFR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJLy8gUmVtb3ZlIGFueSByZWZlcmVuY2VkIHBhY2thZ2UKLQkJCWZvciAoU3RyaW5nIHJlZmVyZW5jZWRQYWNrYWdlIDogZXhpc3RpbmdUeXBlRGVwZW5kZW5jaWVzLmdldFJlZmVyZW5jZWRQYWNrYWdlcygpKSB7Ci0JCQkJYm9vbGVhbiBvdGhlclJlZmVyZW5jZXMgPSBmYWxzZTsKLQkJCQlmb3IgKFR5cGVEZXBlbmRlbmNpZXMgZXhpc3RpbmdUeXBlUGFydGlhbE1hbmlmZXN0IDogcmVjb3JkZWRUeXBlRGVwZW5kZW5jaWVzLnZhbHVlcygpKSB7Ci0JCQkJCWZvciAoU3RyaW5nIGV4aXN0aW5nUmVmZXJlbmNlZFBhY2thZ2UgOiBleGlzdGluZ1R5cGVQYXJ0aWFsTWFuaWZlc3QuZ2V0UmVmZXJlbmNlZFBhY2thZ2VzKCkpIHsKLQkJCQkJCWlmIChyZWZlcmVuY2VkUGFja2FnZS5lcXVhbHMoZXhpc3RpbmdSZWZlcmVuY2VkUGFja2FnZSkpIHsKLQkJCQkJCQlvdGhlclJlZmVyZW5jZXMgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghb3RoZXJSZWZlcmVuY2VzKSB7Ci0JCQkJCXJlbW92ZVJlZmVyZW5jZWRQYWNrYWdlKHJlZmVyZW5jZWRQYWNrYWdlKTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICAvLyBSZW1vdmUgYW55IHJlZmVyZW5jZWQgcGFja2FnZQorICAgICAgICAgICAgZm9yIChTdHJpbmcgcmVmZXJlbmNlZFBhY2thZ2UgOiBleGlzdGluZ1R5cGVEZXBlbmRlbmNpZXMuZ2V0UmVmZXJlbmNlZFBhY2thZ2VzKCkpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIG90aGVyUmVmZXJlbmNlcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoVHlwZURlcGVuZGVuY2llcyBleGlzdGluZ1R5cGVQYXJ0aWFsTWFuaWZlc3QgOiB0aGlzLnJlY29yZGVkVHlwZURlcGVuZGVuY2llcy52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBleGlzdGluZ1JlZmVyZW5jZWRQYWNrYWdlIDogZXhpc3RpbmdUeXBlUGFydGlhbE1hbmlmZXN0LmdldFJlZmVyZW5jZWRQYWNrYWdlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlZFBhY2thZ2UuZXF1YWxzKGV4aXN0aW5nUmVmZXJlbmNlZFBhY2thZ2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJSZWZlcmVuY2VzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW90aGVyUmVmZXJlbmNlcykgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVSZWZlcmVuY2VkUGFja2FnZShyZWZlcmVuY2VkUGFja2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQkvLyBSZW1vdmUgYW55IHVzZXMgY29uc3RyYWludHMKLQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgU2V0PFN0cmluZz4+IG9sZFVzZXMgOiBleGlzdGluZ1R5cGVEZXBlbmRlbmNpZXMuZ2V0VXNlcygpLmVudHJ5U2V0KCkpIHsKLQkJCQlmb3IgKFR5cGVEZXBlbmRlbmNpZXMgZXhpc3RpbmdUeXBlUGFydGlhbE1hbmlmZXN0IDogcmVjb3JkZWRUeXBlRGVwZW5kZW5jaWVzLnZhbHVlcygpKSB7Ci0JCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgU2V0PFN0cmluZz4+IGV4aXN0aW5nVXNlcyA6IGV4aXN0aW5nVHlwZVBhcnRpYWxNYW5pZmVzdC5nZXRVc2VzKCkuZW50cnlTZXQoKSkgewotCQkJCQkJaWYgKGV4aXN0aW5nVXNlcy5nZXRLZXkoKS5lcXVhbHMob2xkVXNlcy5nZXRLZXkoKSkpIHsKLQkJCQkJCQlvbGRVc2VzLmdldFZhbHVlKCkucmVtb3ZlQWxsKGV4aXN0aW5nVXNlcy5nZXRWYWx1ZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KKyAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgdXNlcyBjb25zdHJhaW50cworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gb2xkVXNlcyA6IGV4aXN0aW5nVHlwZURlcGVuZGVuY2llcy5nZXRVc2VzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGZvciAoVHlwZURlcGVuZGVuY2llcyBleGlzdGluZ1R5cGVQYXJ0aWFsTWFuaWZlc3QgOiB0aGlzLnJlY29yZGVkVHlwZURlcGVuZGVuY2llcy52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFNldDxTdHJpbmc+PiBleGlzdGluZ1VzZXMgOiBleGlzdGluZ1R5cGVQYXJ0aWFsTWFuaWZlc3QuZ2V0VXNlcygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1VzZXMuZ2V0S2V5KCkuZXF1YWxzKG9sZFVzZXMuZ2V0S2V5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkVXNlcy5nZXRWYWx1ZSgpLnJlbW92ZUFsbChleGlzdGluZ1VzZXMuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlyZW1vdmVVc2VzKG9sZFVzZXMuZ2V0S2V5KCksIG9sZFVzZXMuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgcmVtb3ZlVXNlcyhvbGRVc2VzLmdldEtleSgpLCBvbGRVc2VzLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBUeXBlRGVwZW5kZW5jaWVzIGNyZWF0ZVR5cGVEZXBlbmRlbmNpZXMoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSB7Ci0JCVN0cmluZyBjdXJyZW50RW50cnkgPSBjdXJyZW50RW50cnkoKTsKLQkJaWYgKHJlY29yZGVkVHlwZURlcGVuZGVuY2llcy5jb250YWluc0tleShjdXJyZW50RW50cnkpKSB7Ci0JCQlyZXR1cm4gcmVjb3JkZWRUeXBlRGVwZW5kZW5jaWVzLmdldChjdXJyZW50RW50cnkpOwotCQl9Ci0JCVR5cGVEZXBlbmRlbmNpZXMgdHlwZURlcGVuZGVuY3kgPSBuZXcgVHlwZURlcGVuZGVuY2llcyhmdWxseVF1YWxpZmllZENsYXNzTmFtZSk7Ci0JCXJlY29yZGVkVHlwZURlcGVuZGVuY2llcy5wdXQoY3VycmVudEVudHJ5LCB0eXBlRGVwZW5kZW5jeSk7Ci0JCXJldHVybiB0eXBlRGVwZW5kZW5jeTsKLQl9CisgICAgcHJpdmF0ZSBUeXBlRGVwZW5kZW5jaWVzIGNyZWF0ZVR5cGVEZXBlbmRlbmNpZXMoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKSB7CisgICAgICAgIFN0cmluZyBjdXJyZW50RW50cnkgPSBjdXJyZW50RW50cnkoKTsKKyAgICAgICAgaWYgKHRoaXMucmVjb3JkZWRUeXBlRGVwZW5kZW5jaWVzLmNvbnRhaW5zS2V5KGN1cnJlbnRFbnRyeSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnJlY29yZGVkVHlwZURlcGVuZGVuY2llcy5nZXQoY3VycmVudEVudHJ5KTsKKyAgICAgICAgfQorICAgICAgICBUeXBlRGVwZW5kZW5jaWVzIHR5cGVEZXBlbmRlbmN5ID0gbmV3IFR5cGVEZXBlbmRlbmNpZXMoZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUpOworICAgICAgICB0aGlzLnJlY29yZGVkVHlwZURlcGVuZGVuY2llcy5wdXQoY3VycmVudEVudHJ5LCB0eXBlRGVwZW5kZW5jeSk7CisgICAgICAgIHJldHVybiB0eXBlRGVwZW5kZW5jeTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBvbkJlZ2luRW50cnkoU3RyaW5nIG5hbWUpIHsKLQkJbmFtZSA9IG5hbWUucmVwbGFjZSgnXFwnLCAnLycpOwotCQl0aGlzLmN1cnJlbnRseUFuYWx5c2VkRW50cmllcy5wdXNoKG5hbWUpOwotCQl1bnJlY29yZFR5cGUoKTsKLQl9CisgICAgcHVibGljIHZvaWQgb25CZWdpbkVudHJ5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICAgICAgdGhpcy5jdXJyZW50bHlBbmFseXNlZEVudHJpZXMucHVzaChuYW1lKTsKKyAgICAgICAgdW5yZWNvcmRUeXBlKCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgb25FbmRFbnRyeSgpIHsKLQkJdGhpcy5jdXJyZW50bHlBbmFseXNlZEVudHJpZXMucG9wKCk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIG9uRW5kRW50cnkoKSB7CisgICAgICAgIHRoaXMuY3VycmVudGx5QW5hbHlzZWRFbnRyaWVzLnBvcCgpOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgY3VycmVudEVudHJ5KCkgewotCQlpZiAoIXRoaXMuY3VycmVudGx5QW5hbHlzZWRFbnRyaWVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuY3VycmVudGx5QW5hbHlzZWRFbnRyaWVzLnBlZWsoKTsKLQkJfQotCQlyZXR1cm4gInRlbXBsYXRlLm1mIjsKLQl9CisgICAgcHVibGljIFN0cmluZyBjdXJyZW50RW50cnkoKSB7CisgICAgICAgIGlmICghdGhpcy5jdXJyZW50bHlBbmFseXNlZEVudHJpZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50bHlBbmFseXNlZEVudHJpZXMucGVlaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAidGVtcGxhdGUubWYiOworICAgIH0KIAotCS8qKgotCSAqIFN0cnVjdHVyZSB0aGF0IGtlZXBzIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGEgdHlwZSBhbmQgaXRzIGRlcGVuZGVuY2llcwotCSAqLwotCWNsYXNzIFR5cGVEZXBlbmRlbmNpZXMgeworICAgIC8qKgorICAgICAqIFN0cnVjdHVyZSB0aGF0IGtlZXBzIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGEgdHlwZSBhbmQgaXRzIGRlcGVuZGVuY2llcworICAgICAqLworICAgIGNsYXNzIFR5cGVEZXBlbmRlbmNpZXMgewogCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bGxRdWFsaWZpZWRUeXBlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbFF1YWxpZmllZFR5cGVOYW1lOwogCi0JCXByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gaW1wb3J0ZWRUeXBlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBpbXBvcnRlZFR5cGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwogCi0JCXByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gcmVmZXJlbmNlZFBhY2thZ2VzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IHJlZmVyZW5jZWRQYWNrYWdlcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKIAotCQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiB1c2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gdXNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2V0PFN0cmluZz4+KCk7CiAKLQkJcHVibGljIFR5cGVEZXBlbmRlbmNpZXMoU3RyaW5nIGZ1bGxRdWFsaWZpZWRUeXBlTmFtZSkgewotCQkJdGhpcy5mdWxsUXVhbGlmaWVkVHlwZU5hbWUgPSBmdWxsUXVhbGlmaWVkVHlwZU5hbWU7Ci0JCX0KKyAgICAgICAgcHVibGljIFR5cGVEZXBlbmRlbmNpZXMoU3RyaW5nIGZ1bGxRdWFsaWZpZWRUeXBlTmFtZSkgeworICAgICAgICAgICAgdGhpcy5mdWxsUXVhbGlmaWVkVHlwZU5hbWUgPSBmdWxsUXVhbGlmaWVkVHlwZU5hbWU7CisgICAgICAgIH0KIAotCQl2b2lkIGFkZEltcG9ydGVkVHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQkJaWYgKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgIT0gbnVsbCkgewotCQkJCXRoaXMuaW1wb3J0ZWRUeXBlcy5hZGQoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgdm9pZCBhZGRJbXBvcnRlZFR5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKKyAgICAgICAgICAgIGlmIChmdWxseVF1YWxpZmllZFR5cGVOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmltcG9ydGVkVHlwZXMuYWRkKGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJdm9pZCBhZGRVc2VzKFN0cmluZyB1c2luZ1BhY2thZ2UsIFN0cmluZyB1c2VkUGFja2FnZSkgewotCQkJaWYgKGlzUmVjb3JkYWJsZVBhY2thZ2UodXNpbmdQYWNrYWdlKSAmJiBpc1JlY29yZGFibGVQYWNrYWdlKHVzZWRQYWNrYWdlKQotCQkJCSYmICF1c2luZ1BhY2thZ2UuZXF1YWxzKHVzZWRQYWNrYWdlKSkgewotCQkJCVNldDxTdHJpbmc+IHVzZXNTZXQgPSBnZXRVc2VzU2V0KHVzaW5nUGFja2FnZSk7Ci0JCQkJdXNlc1NldC5hZGQodXNlZFBhY2thZ2UpOwotCQkJfQotCQl9CisgICAgICAgIHZvaWQgYWRkVXNlcyhTdHJpbmcgdXNpbmdQYWNrYWdlLCBTdHJpbmcgdXNlZFBhY2thZ2UpIHsKKyAgICAgICAgICAgIGlmIChpc1JlY29yZGFibGVQYWNrYWdlKHVzaW5nUGFja2FnZSkgJiYgaXNSZWNvcmRhYmxlUGFja2FnZSh1c2VkUGFja2FnZSkgJiYgIXVzaW5nUGFja2FnZS5lcXVhbHModXNlZFBhY2thZ2UpKSB7CisgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gdXNlc1NldCA9IGdldFVzZXNTZXQodXNpbmdQYWNrYWdlKTsKKyAgICAgICAgICAgICAgICB1c2VzU2V0LmFkZCh1c2VkUGFja2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQl2b2lkIGFkZEltcG9ydGVkUGFja2FnZShTdHJpbmcgaW1wb3J0ZWRQYWNrYWdlKSB7Ci0JCQlpZiAoaW1wb3J0ZWRQYWNrYWdlICE9IG51bGwgJiYgaXNSZWNvcmRhYmxlUGFja2FnZShpbXBvcnRlZFBhY2thZ2UpKSB7Ci0JCQkJcmVmZXJlbmNlZFBhY2thZ2VzLmFkZChpbXBvcnRlZFBhY2thZ2UpOwotCQkJfQotCQl9CisgICAgICAgIHZvaWQgYWRkSW1wb3J0ZWRQYWNrYWdlKFN0cmluZyBpbXBvcnRlZFBhY2thZ2UpIHsKKyAgICAgICAgICAgIGlmIChpbXBvcnRlZFBhY2thZ2UgIT0gbnVsbCAmJiBpc1JlY29yZGFibGVQYWNrYWdlKGltcG9ydGVkUGFja2FnZSkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZWRQYWNrYWdlcy5hZGQoaW1wb3J0ZWRQYWNrYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXByaXZhdGUgU2V0PFN0cmluZz4gZ2V0VXNlc1NldChTdHJpbmcgZXhwb3J0aW5nUGFja2FnZSkgewotCQkJU2V0PFN0cmluZz4gdXNlc1NldCA9IHRoaXMudXNlcy5nZXQoZXhwb3J0aW5nUGFja2FnZSk7Ci0JCQlpZiAodXNlc1NldCA9PSBudWxsKSB7Ci0JCQkJdXNlc1NldCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJCQl0aGlzLnVzZXMucHV0KGV4cG9ydGluZ1BhY2thZ2UsIHVzZXNTZXQpOwotCQkJfQotCQkJcmV0dXJuIHVzZXNTZXQ7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBnZXRVc2VzU2V0KFN0cmluZyBleHBvcnRpbmdQYWNrYWdlKSB7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiB1c2VzU2V0ID0gdGhpcy51c2VzLmdldChleHBvcnRpbmdQYWNrYWdlKTsKKyAgICAgICAgICAgIGlmICh1c2VzU2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1c2VzU2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIHRoaXMudXNlcy5wdXQoZXhwb3J0aW5nUGFja2FnZSwgdXNlc1NldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdXNlc1NldDsKKyAgICAgICAgfQogCi0JCVN0cmluZyBnZXRGdWxsUXVhbGlmaWVkVHlwZU5hbWUoKSB7Ci0JCQlyZXR1cm4gZnVsbFF1YWxpZmllZFR5cGVOYW1lOwotCQl9CisgICAgICAgIFN0cmluZyBnZXRGdWxsUXVhbGlmaWVkVHlwZU5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5mdWxsUXVhbGlmaWVkVHlwZU5hbWU7CisgICAgICAgIH0KIAotCQlTZXQ8U3RyaW5nPiBnZXRJbXBvcnRlZFR5cGVzKCkgewotCQkJcmV0dXJuIGltcG9ydGVkVHlwZXM7Ci0JCX0KKyAgICAgICAgU2V0PFN0cmluZz4gZ2V0SW1wb3J0ZWRUeXBlcygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmltcG9ydGVkVHlwZXM7CisgICAgICAgIH0KIAotCQlTZXQ8U3RyaW5nPiBnZXRSZWZlcmVuY2VkUGFja2FnZXMoKSB7Ci0JCQlyZXR1cm4gcmVmZXJlbmNlZFBhY2thZ2VzOwotCQl9CisgICAgICAgIFNldDxTdHJpbmc+IGdldFJlZmVyZW5jZWRQYWNrYWdlcygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZmVyZW5jZWRQYWNrYWdlczsKKyAgICAgICAgfQogCi0JCU1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiBnZXRVc2VzKCkgewotCQkJcmV0dXJuIHVzZXM7Ci0JCX0KLQl9CisgICAgICAgIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiBnZXRVc2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMudXNlczsKKyAgICAgICAgfQorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9NYW5pZmVzdEdlbmVyYXRvckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvTWFuaWZlc3RHZW5lcmF0b3JGYWN0b3J5LmphdmEKaW5kZXggN2Y2ODU4YS4uNWM5N2Y3NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9NYW5pZmVzdEdlbmVyYXRvckZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci9pbnRlcm5hbC9jb3JlL01hbmlmZXN0R2VuZXJhdG9yRmFjdG9yeS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtNDYsMTU4ICs0NywxNTYgQEAKIAogLyoqCiAgKiBGYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgTWFuaWZlc3RHZW5lcmF0b3J9LgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMi4zLjAKICAqLwogY2xhc3MgTWFuaWZlc3RHZW5lcmF0b3JGYWN0b3J5IHsKIAotCXB1YmxpYyBzdGF0aWMgTWFuaWZlc3RHZW5lcmF0b3IgY3JlYXRlKFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0IHBhcnRpYWxNYW5pZmVzdCwgQXJ0aWZhY3RBbmFseXplciBhcnRpZmFjdEFuYWx5emVyLAotCQkJUHJvcGVydGllc1NvdXJjZS4uLiBwcm9wZXJ0aWVzKSB7Ci0JCU1hbmlmZXN0R2VuZXJhdG9yQ29udHJpYnV0b3JzIGNvbnRyaWJ1dG9ycyA9IGNyZWF0ZShhcnRpZmFjdEFuYWx5emVyLCBwcm9wZXJ0aWVzKTsKKyAgICBwdWJsaWMgc3RhdGljIE1hbmlmZXN0R2VuZXJhdG9yIGNyZWF0ZShSZWFkYWJsZVBhcnRpYWxNYW5pZmVzdCBwYXJ0aWFsTWFuaWZlc3QsIEFydGlmYWN0QW5hbHl6ZXIgYXJ0aWZhY3RBbmFseXplciwKKyAgICAgICAgUHJvcGVydGllc1NvdXJjZS4uLiBwcm9wZXJ0aWVzKSB7CisgICAgICAgIE1hbmlmZXN0R2VuZXJhdG9yQ29udHJpYnV0b3JzIGNvbnRyaWJ1dG9ycyA9IGNyZWF0ZShhcnRpZmFjdEFuYWx5emVyLCBwcm9wZXJ0aWVzKTsKIAotCQkvLyBSZW1vdmUgY3VzdG9tIGhlYWRlcnMKLQkJY29udHJpYnV0b3JzLmFkZE1hbmlmZXN0TW9kaWZpZXIobmV3IEhlYWRlclJlbW92aW5nTWFuaWZlc3RNb2RpZmllcigpKTsKLQkJY29udHJpYnV0b3JzLmFkZE1hbmlmZXN0VGVtcGxhdGVNb2RpZmllcihuZXcgSGVhZGVyUmVtb3ZpbmdUZW1wbGF0ZU1hbmlmZXN0TW9kaWZpZXIoKSk7CisgICAgICAgIC8vIFJlbW92ZSBjdXN0b20gaGVhZGVycworICAgICAgICBjb250cmlidXRvcnMuYWRkTWFuaWZlc3RNb2RpZmllcihuZXcgSGVhZGVyUmVtb3ZpbmdNYW5pZmVzdE1vZGlmaWVyKCkpOworICAgICAgICBjb250cmlidXRvcnMuYWRkTWFuaWZlc3RUZW1wbGF0ZU1vZGlmaWVyKG5ldyBIZWFkZXJSZW1vdmluZ1RlbXBsYXRlTWFuaWZlc3RNb2RpZmllcigpKTsKIAotCQkvLyBBZGQgcGFydGlhbCBtYW5pZmVzdCBtb2RlbAotCQljb250cmlidXRvcnMuc2V0UmVhZGFibGVQYXJ0aWFsTWFuaWZlc3QocGFydGlhbE1hbmlmZXN0KTsKKyAgICAgICAgLy8gQWRkIHBhcnRpYWwgbWFuaWZlc3QgbW9kZWwKKyAgICAgICAgY29udHJpYnV0b3JzLnNldFJlYWRhYmxlUGFydGlhbE1hbmlmZXN0KHBhcnRpYWxNYW5pZmVzdCk7CiAKLQkJaWYgKHBhcnRpYWxNYW5pZmVzdCBpbnN0YW5jZW9mIEVudHJ5U2Nhbm5lckxpc3RlbmVyKSB7Ci0JCQljb250cmlidXRvcnMuYWRkRW50cnlTY2FubmVyTGlzdGVuZXIoKEVudHJ5U2Nhbm5lckxpc3RlbmVyKSBwYXJ0aWFsTWFuaWZlc3QpOwotCQl9CisgICAgICAgIGlmIChwYXJ0aWFsTWFuaWZlc3QgaW5zdGFuY2VvZiBFbnRyeVNjYW5uZXJMaXN0ZW5lcikgeworICAgICAgICAgICAgY29udHJpYnV0b3JzLmFkZEVudHJ5U2Nhbm5lckxpc3RlbmVyKChFbnRyeVNjYW5uZXJMaXN0ZW5lcikgcGFydGlhbE1hbmlmZXN0KTsKKyAgICAgICAgfQogCi0JCXJldHVybiBuZXcgU3RhbmRhcmRNYW5pZmVzdEdlbmVyYXRvcihjb250cmlidXRvcnMpOwotCX0KKyAgICAgICAgcmV0dXJuIG5ldyBTdGFuZGFyZE1hbmlmZXN0R2VuZXJhdG9yKGNvbnRyaWJ1dG9ycyk7CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgTWFuaWZlc3RHZW5lcmF0b3JDb250cmlidXRvcnMgY3JlYXRlKEFydGlmYWN0QW5hbHl6ZXIgYXJ0aWZhY3RBbmFseXplciwKLQkJCVByb3BlcnRpZXNTb3VyY2UuLi4gcHJvcGVydGllc1NvdXJjZXMpIHsKLQkJTWFuaWZlc3RHZW5lcmF0b3JDb250cmlidXRvcnMgY29udHJpYnV0b3JzID0gbmV3IE1hbmlmZXN0R2VuZXJhdG9yQ29udHJpYnV0b3JzKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgTWFuaWZlc3RHZW5lcmF0b3JDb250cmlidXRvcnMgY3JlYXRlKEFydGlmYWN0QW5hbHl6ZXIgYXJ0aWZhY3RBbmFseXplciwgUHJvcGVydGllc1NvdXJjZS4uLiBwcm9wZXJ0aWVzU291cmNlcykgeworICAgICAgICBNYW5pZmVzdEdlbmVyYXRvckNvbnRyaWJ1dG9ycyBjb250cmlidXRvcnMgPSBuZXcgTWFuaWZlc3RHZW5lcmF0b3JDb250cmlidXRvcnMoKTsKIAotCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBjb21iaW5lUHJvcGVydGllcyhwcm9wZXJ0aWVzU291cmNlcyk7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IGNvbWJpbmVQcm9wZXJ0aWVzKHByb3BlcnRpZXNTb3VyY2VzKTsKIAotCQlCbHVlcHJpbnRBcnRpZmFjdEFuYWx5emVyIGJsdWVwcmludEFydGlmYWN0QW5hbHl6ZXIgPSBuZXcgQmx1ZXByaW50QXJ0aWZhY3RBbmFseXplcigpOwotCQlJZ25vcmVkRXhpc3RpbmdIZWFkZXJzTWFuaWZlc3RNb2RpZmllciBpZ25vcmVkRXhpc3RpbmdIZWFkZXJzTWFuaWZlc3RNb2RpZmllciA9IG5ldyBJZ25vcmVkRXhpc3RpbmdIZWFkZXJzTWFuaWZlc3RNb2RpZmllcigpOwotCQlFeGNsdWRlZEltcG9ydEFuZEV4cG9ydFBhcnRpYWxNYW5pZmVzdE1vZGlmaWVyIGV4Y2x1ZGVkSW1wb3J0QW5kRXhwb3J0UGFydGlhbE1hbmlmZXN0TW9kaWZpZXIgPSBuZXcgRXhjbHVkZWRJbXBvcnRBbmRFeHBvcnRQYXJ0aWFsTWFuaWZlc3RNb2RpZmllcigpOwotCQlQbGFjZWhvbGRlck1hbmlmZXN0QW5kVGVtcGxhdGVNb2RpZmllciBwbGFjZWhvbGRlck1hbmlmZXN0QW5kVGVtcGxhdGVNb2RpZmllciA9IG5ldyBQbGFjZWhvbGRlck1hbmlmZXN0QW5kVGVtcGxhdGVNb2RpZmllcigKLQkJCXByb3BlcnRpZXMpOwotCQlNYW5pZmVzdFRlbXBsYXRlRGlyZWN0aXZlTWlncmF0b3IgbWFuaWZlc3RUZW1wbGF0ZURpcmVjdGl2ZU1pZ3JhdG9yID0gbmV3IE1hbmlmZXN0VGVtcGxhdGVEaXJlY3RpdmVNaWdyYXRvcigpOwotCQlTdGFuZGFyZFBhcnRpYWxNYW5pZmVzdFJlc29sdmVyIHBhcnRpYWxNYW5pZmVzdFJlc29sdmVyID0gbmV3IFN0YW5kYXJkUGFydGlhbE1hbmlmZXN0UmVzb2x2ZXIoKTsKKyAgICAgICAgQmx1ZXByaW50QXJ0aWZhY3RBbmFseXplciBibHVlcHJpbnRBcnRpZmFjdEFuYWx5emVyID0gbmV3IEJsdWVwcmludEFydGlmYWN0QW5hbHl6ZXIoKTsKKyAgICAgICAgSWdub3JlZEV4aXN0aW5nSGVhZGVyc01hbmlmZXN0TW9kaWZpZXIgaWdub3JlZEV4aXN0aW5nSGVhZGVyc01hbmlmZXN0TW9kaWZpZXIgPSBuZXcgSWdub3JlZEV4aXN0aW5nSGVhZGVyc01hbmlmZXN0TW9kaWZpZXIoKTsKKyAgICAgICAgRXhjbHVkZWRJbXBvcnRBbmRFeHBvcnRQYXJ0aWFsTWFuaWZlc3RNb2RpZmllciBleGNsdWRlZEltcG9ydEFuZEV4cG9ydFBhcnRpYWxNYW5pZmVzdE1vZGlmaWVyID0gbmV3IEV4Y2x1ZGVkSW1wb3J0QW5kRXhwb3J0UGFydGlhbE1hbmlmZXN0TW9kaWZpZXIoKTsKKyAgICAgICAgUGxhY2Vob2xkZXJNYW5pZmVzdEFuZFRlbXBsYXRlTW9kaWZpZXIgcGxhY2Vob2xkZXJNYW5pZmVzdEFuZFRlbXBsYXRlTW9kaWZpZXIgPSBuZXcgUGxhY2Vob2xkZXJNYW5pZmVzdEFuZFRlbXBsYXRlTW9kaWZpZXIocHJvcGVydGllcyk7CisgICAgICAgIE1hbmlmZXN0VGVtcGxhdGVEaXJlY3RpdmVNaWdyYXRvciBtYW5pZmVzdFRlbXBsYXRlRGlyZWN0aXZlTWlncmF0b3IgPSBuZXcgTWFuaWZlc3RUZW1wbGF0ZURpcmVjdGl2ZU1pZ3JhdG9yKCk7CisgICAgICAgIFN0YW5kYXJkUGFydGlhbE1hbmlmZXN0UmVzb2x2ZXIgcGFydGlhbE1hbmlmZXN0UmVzb2x2ZXIgPSBuZXcgU3RhbmRhcmRQYXJ0aWFsTWFuaWZlc3RSZXNvbHZlcigpOwogCi0JCUxpc3Q8QXJ0aWZhY3RBbmFseXplcj4gYW5hbHl6ZXJzID0gbmV3IEFycmF5TGlzdDxBcnRpZmFjdEFuYWx5emVyPigpOwotCQlCdW5kbGVDbGFzc1BhdGhBcnRpZmFjdEFuYWx5emVyIGJ1bmRsZUNsYXNzUGF0aEFydGlmYWN0QW5hbHl6ZXIgPSBuZXcgQnVuZGxlQ2xhc3NQYXRoQXJ0aWZhY3RBbmFseXplcihhbmFseXplcnMpOworICAgICAgICBMaXN0PEFydGlmYWN0QW5hbHl6ZXI+IGFuYWx5emVycyA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3RBbmFseXplcj4oKTsKKyAgICAgICAgQnVuZGxlQ2xhc3NQYXRoQXJ0aWZhY3RBbmFseXplciBidW5kbGVDbGFzc1BhdGhBcnRpZmFjdEFuYWx5emVyID0gbmV3IEJ1bmRsZUNsYXNzUGF0aEFydGlmYWN0QW5hbHl6ZXIoYW5hbHl6ZXJzKTsKIAotCQljb250cmlidXRvcnMgLy8KLQkJCQkuYWRkQXJ0aWZhY3RBbmFseXplcihhcnRpZmFjdEFuYWx5emVyKQotCQkJCS8vIC5hZGRBcnRpZmFjdEFuYWx5emVyKG5ldyBBc21UeXBlQXJ0ZWZhY3RBbmFseXNlcigpKSAvLwotCQkJCS5hZGRBcnRpZmFjdEFuYWx5emVyKG5ldyBTdGF0aWNSZXNvdXJjZUFydGlmYWN0QW5hbHl6ZXIoKSkgLy8KLQkJCQkuYWRkQXJ0aWZhY3RBbmFseXplcihuZXcgSGliZXJuYXRlTWFwcGluZ0FydGlmYWN0QW5hbHl6ZXIoKSkgLy8KLQkJCQkuYWRkQXJ0aWZhY3RBbmFseXplcihuZXcgSnBhUGVyc2lzdGVuY2VBcnRpZmFjdEFuYWx5emVyKCkpIC8vCi0JCQkJLmFkZEFydGlmYWN0QW5hbHl6ZXIobmV3IExvZzRKWG1sQXJ0aWZhY3RBbmFseXplcigpKSAvLwotCQkJCS5hZGRBcnRpZmFjdEFuYWx5emVyKG5ldyBTcHJpbmdBcHBsaWNhdGlvbkNvbnRleHRBcnRpZmFjdEFuYWx5emVyKCkpIC8vCi0JCQkJLmFkZEFydGlmYWN0QW5hbHl6ZXIoYmx1ZXByaW50QXJ0aWZhY3RBbmFseXplcikgLy8KLQkJCQkuYWRkQXJ0aWZhY3RBbmFseXplcihuZXcgV2ViQXBwbGljYXRpb25BcnRpZmFjdEFuYWx5emVyKCkpIC8vCi0JCQkJLmFkZEFydGlmYWN0QW5hbHl6ZXIoYnVuZGxlQ2xhc3NQYXRoQXJ0aWZhY3RBbmFseXplcikgLy8KLQkJCQkuYWRkQXJ0aWZhY3RBbmFseXplcihuZXcgSnNwQXJ0aWZhY3RBbmFseXplcigpKTsKKyAgICAgICAgY29udHJpYnV0b3JzIC8vCisgICAgICAgIC5hZGRBcnRpZmFjdEFuYWx5emVyKGFydGlmYWN0QW5hbHl6ZXIpCisgICAgICAgIC8vIC5hZGRBcnRpZmFjdEFuYWx5emVyKG5ldyBBc21UeXBlQXJ0ZWZhY3RBbmFseXNlcigpKSAvLworICAgICAgICAuYWRkQXJ0aWZhY3RBbmFseXplcihuZXcgU3RhdGljUmVzb3VyY2VBcnRpZmFjdEFuYWx5emVyKCkpIC8vCisgICAgICAgIC5hZGRBcnRpZmFjdEFuYWx5emVyKG5ldyBIaWJlcm5hdGVNYXBwaW5nQXJ0aWZhY3RBbmFseXplcigpKSAvLworICAgICAgICAuYWRkQXJ0aWZhY3RBbmFseXplcihuZXcgSnBhUGVyc2lzdGVuY2VBcnRpZmFjdEFuYWx5emVyKCkpIC8vCisgICAgICAgIC5hZGRBcnRpZmFjdEFuYWx5emVyKG5ldyBMb2c0SlhtbEFydGlmYWN0QW5hbHl6ZXIoKSkgLy8KKyAgICAgICAgLmFkZEFydGlmYWN0QW5hbHl6ZXIobmV3IFNwcmluZ0FwcGxpY2F0aW9uQ29udGV4dEFydGlmYWN0QW5hbHl6ZXIoKSkgLy8KKyAgICAgICAgLmFkZEFydGlmYWN0QW5hbHl6ZXIoYmx1ZXByaW50QXJ0aWZhY3RBbmFseXplcikgLy8KKyAgICAgICAgLmFkZEFydGlmYWN0QW5hbHl6ZXIobmV3IFdlYkFwcGxpY2F0aW9uQXJ0aWZhY3RBbmFseXplcigpKSAvLworICAgICAgICAuYWRkQXJ0aWZhY3RBbmFseXplcihidW5kbGVDbGFzc1BhdGhBcnRpZmFjdEFuYWx5emVyKSAvLworICAgICAgICAuYWRkQXJ0aWZhY3RBbmFseXplcihuZXcgSnNwQXJ0aWZhY3RBbmFseXplcigpKTsKIAotCQlhbmFseXplcnMuYWRkKGFydGlmYWN0QW5hbHl6ZXIpOwotCQlhbmFseXplcnMuYWRkKG5ldyBTdGF0aWNSZXNvdXJjZUFydGlmYWN0QW5hbHl6ZXIoKSk7Ci0JCWFuYWx5emVycy5hZGQobmV3IEhpYmVybmF0ZU1hcHBpbmdBcnRpZmFjdEFuYWx5emVyKCkpOwotCQlhbmFseXplcnMuYWRkKG5ldyBKcGFQZXJzaXN0ZW5jZUFydGlmYWN0QW5hbHl6ZXIoKSk7Ci0JCWFuYWx5emVycy5hZGQobmV3IExvZzRKWG1sQXJ0aWZhY3RBbmFseXplcigpKTsKLQkJYW5hbHl6ZXJzLmFkZChuZXcgU3ByaW5nQXBwbGljYXRpb25Db250ZXh0QXJ0aWZhY3RBbmFseXplcigpKTsKLQkJYW5hbHl6ZXJzLmFkZChibHVlcHJpbnRBcnRpZmFjdEFuYWx5emVyKTsKLQkJYW5hbHl6ZXJzLmFkZChuZXcgV2ViQXBwbGljYXRpb25BcnRpZmFjdEFuYWx5emVyKCkpOwotCQlhbmFseXplcnMuYWRkKGJ1bmRsZUNsYXNzUGF0aEFydGlmYWN0QW5hbHl6ZXIpOwotCQlhbmFseXplcnMuYWRkKG5ldyBKc3BBcnRpZmFjdEFuYWx5emVyKCkpOworICAgICAgICBhbmFseXplcnMuYWRkKGFydGlmYWN0QW5hbHl6ZXIpOworICAgICAgICBhbmFseXplcnMuYWRkKG5ldyBTdGF0aWNSZXNvdXJjZUFydGlmYWN0QW5hbHl6ZXIoKSk7CisgICAgICAgIGFuYWx5emVycy5hZGQobmV3IEhpYmVybmF0ZU1hcHBpbmdBcnRpZmFjdEFuYWx5emVyKCkpOworICAgICAgICBhbmFseXplcnMuYWRkKG5ldyBKcGFQZXJzaXN0ZW5jZUFydGlmYWN0QW5hbHl6ZXIoKSk7CisgICAgICAgIGFuYWx5emVycy5hZGQobmV3IExvZzRKWG1sQXJ0aWZhY3RBbmFseXplcigpKTsKKyAgICAgICAgYW5hbHl6ZXJzLmFkZChuZXcgU3ByaW5nQXBwbGljYXRpb25Db250ZXh0QXJ0aWZhY3RBbmFseXplcigpKTsKKyAgICAgICAgYW5hbHl6ZXJzLmFkZChibHVlcHJpbnRBcnRpZmFjdEFuYWx5emVyKTsKKyAgICAgICAgYW5hbHl6ZXJzLmFkZChuZXcgV2ViQXBwbGljYXRpb25BcnRpZmFjdEFuYWx5emVyKCkpOworICAgICAgICBhbmFseXplcnMuYWRkKGJ1bmRsZUNsYXNzUGF0aEFydGlmYWN0QW5hbHl6ZXIpOworICAgICAgICBhbmFseXplcnMuYWRkKG5ldyBKc3BBcnRpZmFjdEFuYWx5emVyKCkpOwogCi0JCWNvbnRyaWJ1dG9ycyAvLwotCQkJCS5hZGRNYW5pZmVzdFJlYWRlcihleGNsdWRlZEltcG9ydEFuZEV4cG9ydFBhcnRpYWxNYW5pZmVzdE1vZGlmaWVyKSAvLwotCQkJCS5hZGRNYW5pZmVzdFJlYWRlcihpZ25vcmVkRXhpc3RpbmdIZWFkZXJzTWFuaWZlc3RNb2RpZmllcikgLy8KLQkJCQkuYWRkTWFuaWZlc3RSZWFkZXIoYmx1ZXByaW50QXJ0aWZhY3RBbmFseXplcik7CisgICAgICAgIGNvbnRyaWJ1dG9ycyAvLworICAgICAgICAuYWRkTWFuaWZlc3RSZWFkZXIoZXhjbHVkZWRJbXBvcnRBbmRFeHBvcnRQYXJ0aWFsTWFuaWZlc3RNb2RpZmllcikgLy8KKyAgICAgICAgLmFkZE1hbmlmZXN0UmVhZGVyKGlnbm9yZWRFeGlzdGluZ0hlYWRlcnNNYW5pZmVzdE1vZGlmaWVyKSAvLworICAgICAgICAuYWRkTWFuaWZlc3RSZWFkZXIoYmx1ZXByaW50QXJ0aWZhY3RBbmFseXplcik7CiAKLQkJY29udHJpYnV0b3JzIC8vCi0JCQkJLmFkZE1hbmlmZXN0TW9kaWZpZXIocGxhY2Vob2xkZXJNYW5pZmVzdEFuZFRlbXBsYXRlTW9kaWZpZXIpIC8vCi0JCQkJLmFkZE1hbmlmZXN0TW9kaWZpZXIoaWdub3JlZEV4aXN0aW5nSGVhZGVyc01hbmlmZXN0TW9kaWZpZXIpIC8vCi0JCQkJLmFkZE1hbmlmZXN0TW9kaWZpZXIobmV3IFRvb2xTdGFtcE1hbmlmZXN0TW9kaWZpZXIoKSk7CisgICAgICAgIGNvbnRyaWJ1dG9ycyAvLworICAgICAgICAuYWRkTWFuaWZlc3RNb2RpZmllcihwbGFjZWhvbGRlck1hbmlmZXN0QW5kVGVtcGxhdGVNb2RpZmllcikgLy8KKyAgICAgICAgLmFkZE1hbmlmZXN0TW9kaWZpZXIoaWdub3JlZEV4aXN0aW5nSGVhZGVyc01hbmlmZXN0TW9kaWZpZXIpIC8vCisgICAgICAgIC5hZGRNYW5pZmVzdE1vZGlmaWVyKG5ldyBUb29sU3RhbXBNYW5pZmVzdE1vZGlmaWVyKCkpOwogCi0JCWNvbnRyaWJ1dG9ycyAvLwotCQkJCS5hZGRNYW5pZmVzdFRlbXBsYXRlTW9kaWZpZXIobWFuaWZlc3RUZW1wbGF0ZURpcmVjdGl2ZU1pZ3JhdG9yKSAvLwotCQkJCS5hZGRNYW5pZmVzdFRlbXBsYXRlTW9kaWZpZXIocGxhY2Vob2xkZXJNYW5pZmVzdEFuZFRlbXBsYXRlTW9kaWZpZXIpIC8vCi0JCQkJLmFkZE1hbmlmZXN0VGVtcGxhdGVNb2RpZmllcihuZXcgT3NnaVByb2ZpbGVNYW5pZmVzdFRlbXBsYXRlTW9kaWZpZXIocHJvcGVydGllcykpOworICAgICAgICBjb250cmlidXRvcnMgLy8KKyAgICAgICAgLmFkZE1hbmlmZXN0VGVtcGxhdGVNb2RpZmllcihtYW5pZmVzdFRlbXBsYXRlRGlyZWN0aXZlTWlncmF0b3IpIC8vCisgICAgICAgIC5hZGRNYW5pZmVzdFRlbXBsYXRlTW9kaWZpZXIocGxhY2Vob2xkZXJNYW5pZmVzdEFuZFRlbXBsYXRlTW9kaWZpZXIpIC8vCisgICAgICAgIC5hZGRNYW5pZmVzdFRlbXBsYXRlTW9kaWZpZXIobmV3IE9zZ2lQcm9maWxlTWFuaWZlc3RUZW1wbGF0ZU1vZGlmaWVyKHByb3BlcnRpZXMpKTsKIAotCQljb250cmlidXRvcnMgLy8KLQkJCQkuYWRkTWFuaWZlc3RDb250cmlidXRvcihidW5kbGVDbGFzc1BhdGhBcnRpZmFjdEFuYWx5emVyKTsKKyAgICAgICAgY29udHJpYnV0b3JzIC8vCisgICAgICAgIC5hZGRNYW5pZmVzdENvbnRyaWJ1dG9yKGJ1bmRsZUNsYXNzUGF0aEFydGlmYWN0QW5hbHl6ZXIpOwogCi0JCWNvbnRyaWJ1dG9ycyAvLwotCQkJCS5hZGRQYXJ0aWFsTWFuaWZlc3RNb2RpZmllcihtYW5pZmVzdFRlbXBsYXRlRGlyZWN0aXZlTWlncmF0b3IpIC8vCi0JCQkJLmFkZFBhcnRpYWxNYW5pZmVzdE1vZGlmaWVyKGV4Y2x1ZGVkSW1wb3J0QW5kRXhwb3J0UGFydGlhbE1hbmlmZXN0TW9kaWZpZXIpOworICAgICAgICBjb250cmlidXRvcnMgLy8KKyAgICAgICAgLmFkZFBhcnRpYWxNYW5pZmVzdE1vZGlmaWVyKG1hbmlmZXN0VGVtcGxhdGVEaXJlY3RpdmVNaWdyYXRvcikgLy8KKyAgICAgICAgLmFkZFBhcnRpYWxNYW5pZmVzdE1vZGlmaWVyKGV4Y2x1ZGVkSW1wb3J0QW5kRXhwb3J0UGFydGlhbE1hbmlmZXN0TW9kaWZpZXIpOwogCi0JCWNvbnRyaWJ1dG9ycyAvLwotCQkJCS5hZGRUZW1wbGF0ZUhlYWRlclJlYWRlcihleGNsdWRlZEltcG9ydEFuZEV4cG9ydFBhcnRpYWxNYW5pZmVzdE1vZGlmaWVyKSAvLwotCQkJCS5hZGRUZW1wbGF0ZUhlYWRlclJlYWRlcihpZ25vcmVkRXhpc3RpbmdIZWFkZXJzTWFuaWZlc3RNb2RpZmllcikgLy8KLQkJCQkuYWRkVGVtcGxhdGVIZWFkZXJSZWFkZXIocGxhY2Vob2xkZXJNYW5pZmVzdEFuZFRlbXBsYXRlTW9kaWZpZXIpIC8vCi0JCQkJLmFkZFRlbXBsYXRlSGVhZGVyUmVhZGVyKHBhcnRpYWxNYW5pZmVzdFJlc29sdmVyKTsKKyAgICAgICAgY29udHJpYnV0b3JzIC8vCisgICAgICAgIC5hZGRUZW1wbGF0ZUhlYWRlclJlYWRlcihleGNsdWRlZEltcG9ydEFuZEV4cG9ydFBhcnRpYWxNYW5pZmVzdE1vZGlmaWVyKSAvLworICAgICAgICAuYWRkVGVtcGxhdGVIZWFkZXJSZWFkZXIoaWdub3JlZEV4aXN0aW5nSGVhZGVyc01hbmlmZXN0TW9kaWZpZXIpIC8vCisgICAgICAgIC5hZGRUZW1wbGF0ZUhlYWRlclJlYWRlcihwbGFjZWhvbGRlck1hbmlmZXN0QW5kVGVtcGxhdGVNb2RpZmllcikgLy8KKyAgICAgICAgLmFkZFRlbXBsYXRlSGVhZGVyUmVhZGVyKHBhcnRpYWxNYW5pZmVzdFJlc29sdmVyKTsKIAotCQljb250cmlidXRvcnMgLy8KLQkJCQkuc2V0UmVhZGFibGVQYXJ0aWFsTWFuaWZlc3QobmV3IFN0YW5kYXJkUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3QoKSk7CisgICAgICAgIGNvbnRyaWJ1dG9ycyAvLworICAgICAgICAuc2V0UmVhZGFibGVQYXJ0aWFsTWFuaWZlc3QobmV3IFN0YW5kYXJkUmVhZGFibGVQYXJ0aWFsTWFuaWZlc3QoKSk7CiAKLQkJY29udHJpYnV0b3JzIC8vCi0JCQkJLnNldFBhcnRpYWxNYW5pZmVzdFJlc29sdmVyKHBhcnRpYWxNYW5pZmVzdFJlc29sdmVyKTsKKyAgICAgICAgY29udHJpYnV0b3JzIC8vCisgICAgICAgIC5zZXRQYXJ0aWFsTWFuaWZlc3RSZXNvbHZlcihwYXJ0aWFsTWFuaWZlc3RSZXNvbHZlcik7CiAKLQkJcmV0dXJuIGNvbnRyaWJ1dG9yczsKLQl9CisgICAgICAgIHJldHVybiBjb250cmlidXRvcnM7CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBjb21iaW5lUHJvcGVydGllcyhQcm9wZXJ0aWVzU291cmNlLi4uIHByb3BlcnRpZXNTb3VyY2VzKSB7Ci0JCVByb3BlcnRpZXNTb3VyY2VbXSBzb3J0ZWRQcm9wZXJ0aWVzU291cmNlcyA9IG5ldyBQcm9wZXJ0aWVzU291cmNlW3Byb3BlcnRpZXNTb3VyY2VzLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJvcGVydGllc1NvdXJjZXMsIDAsIHNvcnRlZFByb3BlcnRpZXNTb3VyY2VzLCAwLCBwcm9wZXJ0aWVzU291cmNlcy5sZW5ndGgpOwotCQkvLyBTb3J0IGJ5IHByaW9yaXR5IHNvIHRoYXQgc291cmNlcyB3aXRoIGxvd2VyIHByaW9yaXR5IGFyZSBhZGRlZCBmaXJzdAotCQkvLyBpbnRvIHRoZSBmaW5hbAotCQkvLyBQcm9wZXJ0aWVzIGluc3RhbmNlIHRvIGFsbG93IGZvciBvdmVycmlkaW5nIGJ5IGxhdGVyIGluc3RhbmNlcwotCQlBcnJheXMuc29ydChzb3J0ZWRQcm9wZXJ0aWVzU291cmNlcywgbmV3IENvbXBhcmF0b3I8UHJvcGVydGllc1NvdXJjZT4oKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBjb21iaW5lUHJvcGVydGllcyhQcm9wZXJ0aWVzU291cmNlLi4uIHByb3BlcnRpZXNTb3VyY2VzKSB7CisgICAgICAgIFByb3BlcnRpZXNTb3VyY2VbXSBzb3J0ZWRQcm9wZXJ0aWVzU291cmNlcyA9IG5ldyBQcm9wZXJ0aWVzU291cmNlW3Byb3BlcnRpZXNTb3VyY2VzLmxlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocHJvcGVydGllc1NvdXJjZXMsIDAsIHNvcnRlZFByb3BlcnRpZXNTb3VyY2VzLCAwLCBwcm9wZXJ0aWVzU291cmNlcy5sZW5ndGgpOworICAgICAgICAvLyBTb3J0IGJ5IHByaW9yaXR5IHNvIHRoYXQgc291cmNlcyB3aXRoIGxvd2VyIHByaW9yaXR5IGFyZSBhZGRlZCBmaXJzdAorICAgICAgICAvLyBpbnRvIHRoZSBmaW5hbAorICAgICAgICAvLyBQcm9wZXJ0aWVzIGluc3RhbmNlIHRvIGFsbG93IGZvciBvdmVycmlkaW5nIGJ5IGxhdGVyIGluc3RhbmNlcworICAgICAgICBBcnJheXMuc29ydChzb3J0ZWRQcm9wZXJ0aWVzU291cmNlcywgbmV3IENvbXBhcmF0b3I8UHJvcGVydGllc1NvdXJjZT4oKSB7CiAKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShQcm9wZXJ0aWVzU291cmNlIG8xLCBQcm9wZXJ0aWVzU291cmNlIG8yKSB7Ci0JCQkJaWYgKG8xLmdldFByaW9yaXR5KCkgPT0gbzIuZ2V0UHJpb3JpdHkoKSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9IGVsc2UgaWYgKG8xLmdldFByaW9yaXR5KCkgPiBvMi5nZXRQcmlvcml0eSgpKSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0pOworICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFByb3BlcnRpZXNTb3VyY2UgbzEsIFByb3BlcnRpZXNTb3VyY2UgbzIpIHsKKyAgICAgICAgICAgICAgICBpZiAobzEuZ2V0UHJpb3JpdHkoKSA9PSBvMi5nZXRQcmlvcml0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobzEuZ2V0UHJpb3JpdHkoKSA+IG8yLmdldFByaW9yaXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJZm9yIChQcm9wZXJ0aWVzU291cmNlIHNvdXJjZSA6IHByb3BlcnRpZXNTb3VyY2VzKSB7Ci0JCQlwcm9wZXJ0aWVzLnB1dEFsbChzb3VyY2UuZ2V0UHJvcGVydGllcygpKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9CisgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGZvciAoUHJvcGVydGllc1NvdXJjZSBzb3VyY2UgOiBwcm9wZXJ0aWVzU291cmNlcykgeworICAgICAgICAgICAgcHJvcGVydGllcy5wdXRBbGwoc291cmNlLmdldFByb3BlcnRpZXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgICAgfQogCi0Jc3RhdGljIGNsYXNzIEhlYWRlclJlbW92aW5nTWFuaWZlc3RNb2RpZmllciBpbXBsZW1lbnRzIE1hbmlmZXN0TW9kaWZpZXIgeworICAgIHN0YXRpYyBjbGFzcyBIZWFkZXJSZW1vdmluZ01hbmlmZXN0TW9kaWZpZXIgaW1wbGVtZW50cyBNYW5pZmVzdE1vZGlmaWVyIHsKIAotCQlwdWJsaWMgdm9pZCBtb2RpZnkoTWFuaWZlc3RDb250ZW50cyBtYW5pZmVzdCkgewotCQkJbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5yZW1vdmUoIkltcG9ydC1MaWJyYXJ5Iik7Ci0JCQltYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLnJlbW92ZSgiSW1wb3J0LUJ1bmRsZSIpOwotCQkJbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5yZW1vdmUoIkV4cG9ydC1UZW1wbGF0ZSIpOwotCQkJbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5yZW1vdmUoIkltcG9ydC1UZW1wbGF0ZSIpOwotCQkJbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5yZW1vdmUoIkV4Y2x1ZGVkLUV4cG9ydHMiKTsKLQkJCW1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKCJFeGNsdWRlZC1JbXBvcnRzIik7Ci0JCQltYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLnJlbW92ZSgiSWdub3JlZC1FeGlzdGluZy1IZWFkZXJzIik7Ci0JCQltYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLnJlbW92ZSgiVGVzdC1JbXBvcnQtUGFja2FnZSIpOwotCQkJbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5yZW1vdmUoIlRlc3QtSW1wb3J0LUxpYnJhcnkiKTsKLQkJCW1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKCJUZXN0LUltcG9ydC1CdW5kbGUiKTsKLQkJCW1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKCJJbXBvcnQtUGFja2FnZSIpOwotCQkJbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5yZW1vdmUoIkV4cG9ydC1QYWNrYWdlIik7Ci0JCX0KKyAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5KE1hbmlmZXN0Q29udGVudHMgbWFuaWZlc3QpIHsKKyAgICAgICAgICAgIG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKCJJbXBvcnQtTGlicmFyeSIpOworICAgICAgICAgICAgbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5yZW1vdmUoIkltcG9ydC1CdW5kbGUiKTsKKyAgICAgICAgICAgIG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKCJFeHBvcnQtVGVtcGxhdGUiKTsKKyAgICAgICAgICAgIG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKCJJbXBvcnQtVGVtcGxhdGUiKTsKKyAgICAgICAgICAgIG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKCJFeGNsdWRlZC1FeHBvcnRzIik7CisgICAgICAgICAgICBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLnJlbW92ZSgiRXhjbHVkZWQtSW1wb3J0cyIpOworICAgICAgICAgICAgbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5yZW1vdmUoIklnbm9yZWQtRXhpc3RpbmctSGVhZGVycyIpOworICAgICAgICAgICAgbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5yZW1vdmUoIlRlc3QtSW1wb3J0LVBhY2thZ2UiKTsKKyAgICAgICAgICAgIG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKCJUZXN0LUltcG9ydC1MaWJyYXJ5Iik7CisgICAgICAgICAgICBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLnJlbW92ZSgiVGVzdC1JbXBvcnQtQnVuZGxlIik7CisgICAgICAgICAgICBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLnJlbW92ZSgiSW1wb3J0LVBhY2thZ2UiKTsKKyAgICAgICAgICAgIG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKCJFeHBvcnQtUGFja2FnZSIpOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0Jc3RhdGljIGNsYXNzIEhlYWRlclJlbW92aW5nVGVtcGxhdGVNYW5pZmVzdE1vZGlmaWVyIGltcGxlbWVudHMgTWFuaWZlc3RUZW1wbGF0ZU1vZGlmaWVyIHsKKyAgICBzdGF0aWMgY2xhc3MgSGVhZGVyUmVtb3ZpbmdUZW1wbGF0ZU1hbmlmZXN0TW9kaWZpZXIgaW1wbGVtZW50cyBNYW5pZmVzdFRlbXBsYXRlTW9kaWZpZXIgewogCi0JCXB1YmxpYyB2b2lkIG1vZGlmeShNYW5pZmVzdENvbnRlbnRzIG1hbmlmZXN0KSB7Ci0JCQltYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLnJlbW92ZSgiVGVzdC1JbXBvcnQtUGFja2FnZSIpOwotCQkJbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5yZW1vdmUoIlRlc3QtSW1wb3J0LUxpYnJhcnkiKTsKLQkJCW1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKCJUZXN0LUltcG9ydC1CdW5kbGUiKTsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5KE1hbmlmZXN0Q29udGVudHMgbWFuaWZlc3QpIHsKKyAgICAgICAgICAgIG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkucmVtb3ZlKCJUZXN0LUltcG9ydC1QYWNrYWdlIik7CisgICAgICAgICAgICBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpLnJlbW92ZSgiVGVzdC1JbXBvcnQtTGlicmFyeSIpOworICAgICAgICAgICAgbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5yZW1vdmUoIlRlc3QtSW1wb3J0LUJ1bmRsZSIpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9hc20vQXJ0ZWZhY3RBbmFseXNlckNsYXNzVmlzaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9hc20vQXJ0ZWZhY3RBbmFseXNlckNsYXNzVmlzaXRvci5qYXZhCmluZGV4IGRkMmFiMjUuLmI1MDJmZTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvYXNtL0FydGVmYWN0QW5hbHlzZXJDbGFzc1Zpc2l0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci9pbnRlcm5hbC9jb3JlL2FzbS9BcnRlZmFjdEFuYWx5c2VyQ2xhc3NWaXNpdG9yLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuaW50ZXJuYWwuY29yZS5hc207CiAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5idW5kbG9yLnN1cHBvcnQucGFydGlhbG1hbmlmZXN0LlBhcnRpYWxNYW5pZmVzdDsKQEAgLTIxLDExOSArMjIsMTE4IEBACiAKIC8qKgogICogQVNNIHtAbGluayBDbGFzc1Zpc2l0b3J9IGZvciBzY2FubmluZyBjbGFzcyBmaWxlcy4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBSb2IgSGFycm9wCiAgKi8KIGNsYXNzIEFydGVmYWN0QW5hbHlzZXJDbGFzc1Zpc2l0b3IgZXh0ZW5kcyBFbXB0eVZpc2l0b3IgaW1wbGVtZW50cyBDbGFzc1Zpc2l0b3IgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUVfUFJFRklYID0gImNsYXNzJCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUVfUFJFRklYID0gImNsYXNzJCI7CiAKLQkvKioKLQkgKiBUaGF0IDxjb2RlPlBhcnRpYWxNYW5pZmVzdDwvY29kZT4gYmVpbmcgdXBkYXRlZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFBhcnRpYWxNYW5pZmVzdCBwYXJ0aWFsTWFuaWZlc3Q7CisgICAgLyoqCisgICAgICogVGhhdCA8Y29kZT5QYXJ0aWFsTWFuaWZlc3Q8L2NvZGU+IGJlaW5nIHVwZGF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBQYXJ0aWFsTWFuaWZlc3QgcGFydGlhbE1hbmlmZXN0OwogCi0JLyoqCi0JICogVGhlIHR5cGUgdGhhdCBpcyBiZWluZyBzY2FubmVkLgotCSAqLwotCXByaXZhdGUgVHlwZSB0eXBlOworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIHRoYXQgaXMgYmVpbmcgc2Nhbm5lZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFR5cGUgdHlwZTsKIAotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QXJ0ZWZhY3RBbmFseXNlckNsYXNzVmlzaXRvcjwvY29kZT4gdG8gc2NhbiB0aGUKLQkgKiBzdXBwbGllZCB7QGxpbmsgUGFydGlhbE1hbmlmZXN0fS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydGlhbE1hbmlmZXN0IHRoZSA8Y29kZT5QYXJ0aWFsTWFuaWZlc3Q8L2NvZGU+IHRvIHNjYW4uCi0JICovCi0JcHVibGljIEFydGVmYWN0QW5hbHlzZXJDbGFzc1Zpc2l0b3IoUGFydGlhbE1hbmlmZXN0IHBhcnRpYWxNYW5pZmVzdCkgewotCQl0aGlzLnBhcnRpYWxNYW5pZmVzdCA9IHBhcnRpYWxNYW5pZmVzdDsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BcnRlZmFjdEFuYWx5c2VyQ2xhc3NWaXNpdG9yPC9jb2RlPiB0byBzY2FuIHRoZSBzdXBwbGllZCB7QGxpbmsgUGFydGlhbE1hbmlmZXN0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJ0aWFsTWFuaWZlc3QgdGhlIDxjb2RlPlBhcnRpYWxNYW5pZmVzdDwvY29kZT4gdG8gc2Nhbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJ0ZWZhY3RBbmFseXNlckNsYXNzVmlzaXRvcihQYXJ0aWFsTWFuaWZlc3QgcGFydGlhbE1hbmlmZXN0KSB7CisgICAgICAgIHRoaXMucGFydGlhbE1hbmlmZXN0ID0gcGFydGlhbE1hbmlmZXN0OworICAgIH0KIAotCS8qKgotCSAqIEBpbmhlcml0RG9jCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmlzaXQoaW50IHZlcnNpb24sIGludCBhY2Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc2lnbmF0dXJlLCBTdHJpbmcgc3VwZXJOYW1lLCBTdHJpbmdbXSBpbnRlcmZhY2VzKSB7Ci0JCVR5cGUgdHlwZSA9IFR5cGUuZ2V0T2JqZWN0VHlwZShuYW1lKTsKLQkJdGhpcy50eXBlID0gdHlwZTsKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdERvYworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0KGludCB2ZXJzaW9uLCBpbnQgYWNjZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHNpZ25hdHVyZSwgU3RyaW5nIHN1cGVyTmFtZSwgU3RyaW5nW10gaW50ZXJmYWNlcykgeworICAgICAgICBUeXBlIHR5cGUgPSBUeXBlLmdldE9iamVjdFR5cGUobmFtZSk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAKLQkJdGhpcy5wYXJ0aWFsTWFuaWZlc3QucmVjb3JkVHlwZShWaXNpdG9yVXRpbHMuZ2V0RnVsbHlRdWFsaWZpZWRUeXBlTmFtZSh0eXBlKSk7CisgICAgICAgIHRoaXMucGFydGlhbE1hbmlmZXN0LnJlY29yZFR5cGUoVmlzaXRvclV0aWxzLmdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUodHlwZSkpOwogCi0JCVZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIFR5cGUuZ2V0T2JqZWN0VHlwZShzdXBlck5hbWUpKTsKLQkJVmlzaXRvclV0aWxzLnJlY29yZFVzZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIHR5cGUsIFR5cGUuZ2V0T2JqZWN0VHlwZShzdXBlck5hbWUpKTsKLQkJZm9yIChTdHJpbmcgaW50ZXJmYWNlTmFtZSA6IGludGVyZmFjZXMpIHsKLQkJCVZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIFR5cGUuZ2V0T2JqZWN0VHlwZShpbnRlcmZhY2VOYW1lKSk7Ci0JCQlWaXNpdG9yVXRpbHMucmVjb3JkVXNlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgdHlwZSwgVHlwZS5nZXRPYmplY3RUeXBlKGludGVyZmFjZU5hbWUpKTsKLQkJfQotCX0KKyAgICAgICAgVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgVHlwZS5nZXRPYmplY3RUeXBlKHN1cGVyTmFtZSkpOworICAgICAgICBWaXNpdG9yVXRpbHMucmVjb3JkVXNlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgdHlwZSwgVHlwZS5nZXRPYmplY3RUeXBlKHN1cGVyTmFtZSkpOworICAgICAgICBmb3IgKFN0cmluZyBpbnRlcmZhY2VOYW1lIDogaW50ZXJmYWNlcykgeworICAgICAgICAgICAgVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgVHlwZS5nZXRPYmplY3RUeXBlKGludGVyZmFjZU5hbWUpKTsKKyAgICAgICAgICAgIFZpc2l0b3JVdGlscy5yZWNvcmRVc2VzKHRoaXMucGFydGlhbE1hbmlmZXN0LCB0eXBlLCBUeXBlLmdldE9iamVjdFR5cGUoaW50ZXJmYWNlTmFtZSkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQGluaGVyaXREb2MKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uKFN0cmluZyBkZXNjLCBib29sZWFuIHZpc2libGUpIHsKLQkJVHlwZSB0ID0gVHlwZS5nZXRUeXBlKGRlc2MpOwotCQlWaXNpdG9yVXRpbHMucmVjb3JkUmVmZXJlbmNlZFR5cGVzKHRoaXMucGFydGlhbE1hbmlmZXN0LCB0KTsKLQkJVmlzaXRvclV0aWxzLnJlY29yZFVzZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIHRoaXMudHlwZSwgdCk7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdERvYworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oU3RyaW5nIGRlc2MsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBUeXBlIHQgPSBUeXBlLmdldFR5cGUoZGVzYyk7CisgICAgICAgIFZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIHQpOworICAgICAgICBWaXNpdG9yVXRpbHMucmVjb3JkVXNlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgdGhpcy50eXBlLCB0KTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQGluaGVyaXREb2MKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRmllbGRWaXNpdG9yIHZpc2l0RmllbGQoaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLCBTdHJpbmcgc2lnbmF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJVHlwZSB0ID0gVHlwZS5nZXRUeXBlKGRlc2MpOwotCQlpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1NZTlRIRVRJQykgPT0gT3Bjb2Rlcy5BQ0NfU1lOVEhFVElDKSB7Ci0JCQlpZiAoQ2xhc3MuY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyh0LmdldENsYXNzTmFtZSgpKSkgewotCQkJCWlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5zdGFydHNXaXRoKENMQVNTX05BTUVfUFJFRklYKSkgewotCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoQ0xBU1NfTkFNRV9QUkVGSVgubGVuZ3RoKCkpOwotCQkJCQluYW1lID0gbmFtZS5yZXBsYWNlKCckJywgJy4nKTsKLQkJCQkJaW50IGxhc3REb3RJbmRleCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdERvYworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWVsZFZpc2l0b3IgdmlzaXRGaWVsZChpbnQgYWNjZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIFN0cmluZyBzaWduYXR1cmUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBUeXBlIHQgPSBUeXBlLmdldFR5cGUoZGVzYyk7CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1lOVEhFVElDKSA9PSBPcGNvZGVzLkFDQ19TWU5USEVUSUMpIHsKKyAgICAgICAgICAgIGlmIChDbGFzcy5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHQuZ2V0Q2xhc3NOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLnN0YXJ0c1dpdGgoQ0xBU1NfTkFNRV9QUkVGSVgpKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhDTEFTU19OQU1FX1BSRUZJWC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJyQnLCAnLicpOworICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdERvdEluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwogCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGFzdERvdEluZGV4OyBpKyspIHsKLQkJCQkJCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2UobmFtZS5jaGFyQXQoaSkpKSB7Ci0JCQkJCQkJaWYgKGkgPT0gMCkgewotCQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKG5hbWUuY2hhckF0KGkgLSAxKSA9PSAnLicpIHsKLQkJCQkJCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGkpICsgbmFtZS5zdWJzdHJpbmcoaSkucmVwbGFjZSgnLicsICckJyk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChuYW1lLmNoYXJBdCgwKSkpIHsKLQkJCQkJCXRoaXMucGFydGlhbE1hbmlmZXN0LnJlY29yZFJlZmVyZW5jZWRUeXBlKG5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIHQpOwotCQlyZXR1cm4gbmV3IEFydGVmYWN0QW5hbHlzZXJGaWVsZFZpc2l0b3IodGhpcy5wYXJ0aWFsTWFuaWZlc3QsIHRoaXMudHlwZSk7Ci0JfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhc3REb3RJbmRleDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKG5hbWUuY2hhckF0KGkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmNoYXJBdChpIC0gMSkgPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBpKSArIG5hbWUuc3Vic3RyaW5nKGkpLnJlcGxhY2UoJy4nLCAnJCcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQobmFtZS5jaGFyQXQoMCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRSZWZlcmVuY2VkVHlwZShuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBWaXNpdG9yVXRpbHMucmVjb3JkUmVmZXJlbmNlZFR5cGVzKHRoaXMucGFydGlhbE1hbmlmZXN0LCB0KTsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnRlZmFjdEFuYWx5c2VyRmllbGRWaXNpdG9yKHRoaXMucGFydGlhbE1hbmlmZXN0LCB0aGlzLnR5cGUpOworICAgIH0KIAotCS8qKgotCSAqIEBpbmhlcml0RG9jCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE1ldGhvZFZpc2l0b3IgdmlzaXRNZXRob2QoaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLCBTdHJpbmcgc2lnbmF0dXJlLCBTdHJpbmdbXSBleGNlcHRpb25zKSB7Ci0JCVZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIFR5cGUuZ2V0QXJndW1lbnRUeXBlcyhkZXNjKSk7Ci0JCVZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIFR5cGUuZ2V0UmV0dXJuVHlwZShkZXNjKSk7Ci0JCWlmIChleGNlcHRpb25zICE9IG51bGwpIHsKLQkJCWZvciAoU3RyaW5nIGV4Y2VwdGlvbiA6IGV4Y2VwdGlvbnMpIHsKLQkJCQlWaXNpdG9yVXRpbHMucmVjb3JkUmVmZXJlbmNlZFR5cGVzKHRoaXMucGFydGlhbE1hbmlmZXN0LCBUeXBlLmdldE9iamVjdFR5cGUoZXhjZXB0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFjY2VzcyAhPSBPcGNvZGVzLkFDQ19QUklWQVRFKSB7Ci0JCQlWaXNpdG9yVXRpbHMucmVjb3JkVXNlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgdGhpcy50eXBlLCBUeXBlLmdldEFyZ3VtZW50VHlwZXMoZGVzYykpOwotCQkJVmlzaXRvclV0aWxzLnJlY29yZFVzZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIHRoaXMudHlwZSwgVHlwZS5nZXRSZXR1cm5UeXBlKGRlc2MpKTsKLQkJCWlmIChleGNlcHRpb25zICE9IG51bGwpIHsKLQkJCQlmb3IgKFN0cmluZyBleGNlcHRpb24gOiBleGNlcHRpb25zKSB7Ci0JCQkJCVZpc2l0b3JVdGlscy5yZWNvcmRVc2VzKHRoaXMucGFydGlhbE1hbmlmZXN0LCB0aGlzLnR5cGUsIFR5cGUuZ2V0T2JqZWN0VHlwZShleGNlcHRpb24pKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBBcnRlZmFjdEFuYWx5c2VyTWV0aG9kVmlzaXRvcih0aGlzLnBhcnRpYWxNYW5pZmVzdCwgdGhpcy50eXBlKTsKLQl9CisgICAgLyoqCisgICAgICogQGluaGVyaXREb2MKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWV0aG9kVmlzaXRvciB2aXNpdE1ldGhvZChpbnQgYWNjZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIFN0cmluZyBzaWduYXR1cmUsIFN0cmluZ1tdIGV4Y2VwdGlvbnMpIHsKKyAgICAgICAgVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgVHlwZS5nZXRBcmd1bWVudFR5cGVzKGRlc2MpKTsKKyAgICAgICAgVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgVHlwZS5nZXRSZXR1cm5UeXBlKGRlc2MpKTsKKyAgICAgICAgaWYgKGV4Y2VwdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgZXhjZXB0aW9uIDogZXhjZXB0aW9ucykgeworICAgICAgICAgICAgICAgIFZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIFR5cGUuZ2V0T2JqZWN0VHlwZShleGNlcHRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYWNjZXNzICE9IE9wY29kZXMuQUNDX1BSSVZBVEUpIHsKKyAgICAgICAgICAgIFZpc2l0b3JVdGlscy5yZWNvcmRVc2VzKHRoaXMucGFydGlhbE1hbmlmZXN0LCB0aGlzLnR5cGUsIFR5cGUuZ2V0QXJndW1lbnRUeXBlcyhkZXNjKSk7CisgICAgICAgICAgICBWaXNpdG9yVXRpbHMucmVjb3JkVXNlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgdGhpcy50eXBlLCBUeXBlLmdldFJldHVyblR5cGUoZGVzYykpOworICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4Y2VwdGlvbiA6IGV4Y2VwdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgVmlzaXRvclV0aWxzLnJlY29yZFVzZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIHRoaXMudHlwZSwgVHlwZS5nZXRPYmplY3RUeXBlKGV4Y2VwdGlvbikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEFydGVmYWN0QW5hbHlzZXJNZXRob2RWaXNpdG9yKHRoaXMucGFydGlhbE1hbmlmZXN0LCB0aGlzLnR5cGUpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9hc20vQXJ0ZWZhY3RBbmFseXNlckZpZWxkVmlzaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9hc20vQXJ0ZWZhY3RBbmFseXNlckZpZWxkVmlzaXRvci5qYXZhCmluZGV4IDQwMjlmNDMuLjU1OWZkZWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvYXNtL0FydGVmYWN0QW5hbHlzZXJGaWVsZFZpc2l0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci9pbnRlcm5hbC9jb3JlL2FzbS9BcnRlZmFjdEFuYWx5c2VyRmllbGRWaXNpdG9yLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuaW50ZXJuYWwuY29yZS5hc207CiAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5idW5kbG9yLnN1cHBvcnQucGFydGlhbG1hbmlmZXN0LlBhcnRpYWxNYW5pZmVzdDsKQEAgLTE4LDQxICsxOSw0MSBAQAogCiAvKioKICAqIEFTTSB7QGxpbmsgRmllbGRWaXNpdG9yfSBmb3Igc2Nhbm5pbmcgY2xhc3MgZmlsZXMuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBhdXRob3IgR2x5biBOb3JtaW5ndG9uCiAgKi8KIGZpbmFsIGNsYXNzIEFydGVmYWN0QW5hbHlzZXJGaWVsZFZpc2l0b3IgZXh0ZW5kcyBFbXB0eVZpc2l0b3IgaW1wbGVtZW50cyBGaWVsZFZpc2l0b3IgewogCi0JLyoqCi0JICogVGhhdCA8Y29kZT5QYXJ0aWFsTWFuaWZlc3Q8L2NvZGU+IGJlaW5nIHVwZGF0ZWQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQYXJ0aWFsTWFuaWZlc3QgcGFydGlhbE1hbmlmZXN0OworICAgIC8qKgorICAgICAqIFRoYXQgPGNvZGU+UGFydGlhbE1hbmlmZXN0PC9jb2RlPiBiZWluZyB1cGRhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgUGFydGlhbE1hbmlmZXN0IHBhcnRpYWxNYW5pZmVzdDsKIAotCS8qKgotCSAqIFRoZSB0eXBlIHRoYXQgaXMgYmVpbmcgc2Nhbm5lZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSB0aGF0IGlzIGJlaW5nIHNjYW5uZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFydGVmYWN0QW5hbHlzZXJDbGFzc1Zpc2l0b3I8L2NvZGU+IHRvIHNjYW4gdGhlCi0JICogc3VwcGxpZWQge0BsaW5rIFBhcnRpYWxNYW5pZmVzdH0uCi0JICogCi0JICogQHBhcmFtIHBhcnRpYWxNYW5pZmVzdCB0aGUgPGNvZGU+UGFydGlhbE1hbmlmZXN0PC9jb2RlPiB0byBzY2FuLgotCSAqLwotCUFydGVmYWN0QW5hbHlzZXJGaWVsZFZpc2l0b3IoUGFydGlhbE1hbmlmZXN0IHBhcnRpYWxNYW5pZmVzdCwgVHlwZSB0eXBlKSB7Ci0JCXRoaXMucGFydGlhbE1hbmlmZXN0ID0gcGFydGlhbE1hbmlmZXN0OwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFydGVmYWN0QW5hbHlzZXJDbGFzc1Zpc2l0b3I8L2NvZGU+IHRvIHNjYW4gdGhlIHN1cHBsaWVkIHtAbGluayBQYXJ0aWFsTWFuaWZlc3R9LgorICAgICAqCisgICAgICogQHBhcmFtIHBhcnRpYWxNYW5pZmVzdCB0aGUgPGNvZGU+UGFydGlhbE1hbmlmZXN0PC9jb2RlPiB0byBzY2FuLgorICAgICAqLworICAgIEFydGVmYWN0QW5hbHlzZXJGaWVsZFZpc2l0b3IoUGFydGlhbE1hbmlmZXN0IHBhcnRpYWxNYW5pZmVzdCwgVHlwZSB0eXBlKSB7CisgICAgICAgIHRoaXMucGFydGlhbE1hbmlmZXN0ID0gcGFydGlhbE1hbmlmZXN0OworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uKFN0cmluZyBkZXNjLCBib29sZWFuIHZpc2libGUpIHsKLQkJVHlwZSB0ID0gVHlwZS5nZXRUeXBlKGRlc2MpOwotCQlWaXNpdG9yVXRpbHMucmVjb3JkUmVmZXJlbmNlZFR5cGVzKHBhcnRpYWxNYW5pZmVzdCwgdCk7Ci0JCVZpc2l0b3JVdGlscy5yZWNvcmRVc2VzKHBhcnRpYWxNYW5pZmVzdCwgdGhpcy50eXBlLCB0KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uKFN0cmluZyBkZXNjLCBib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgVHlwZSB0ID0gVHlwZS5nZXRUeXBlKGRlc2MpOworICAgICAgICBWaXNpdG9yVXRpbHMucmVjb3JkUmVmZXJlbmNlZFR5cGVzKHRoaXMucGFydGlhbE1hbmlmZXN0LCB0KTsKKyAgICAgICAgVmlzaXRvclV0aWxzLnJlY29yZFVzZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIHRoaXMudHlwZSwgdCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9hc20vQXJ0ZWZhY3RBbmFseXNlck1ldGhvZFZpc2l0b3IuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvYXNtL0FydGVmYWN0QW5hbHlzZXJNZXRob2RWaXNpdG9yLmphdmEKaW5kZXggY2FiMzM2MS4uOWMwODQ1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9hc20vQXJ0ZWZhY3RBbmFseXNlck1ldGhvZFZpc2l0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci9pbnRlcm5hbC9jb3JlL2FzbS9BcnRlZmFjdEFuYWx5c2VyTWV0aG9kVmlzaXRvci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmludGVybmFsLmNvcmUuYXNtOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uYnVuZGxvci5zdXBwb3J0LnBhcnRpYWxtYW5pZmVzdC5QYXJ0aWFsTWFuaWZlc3Q7CkBAIC0xOSwxMTIgKzIwLDEyMCBAQAogCiAvKioKICAqIEFTTSB7QGxpbmsgTWV0aG9kVmlzaXRvcn0gdG8gc2NhbiBtZXRob2QgYm9kaWVzIGZvciBpbXBvcnRzLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAYXV0aG9yIFJvYiBIYXJyb3AKICAqLwogZmluYWwgY2xhc3MgQXJ0ZWZhY3RBbmFseXNlck1ldGhvZFZpc2l0b3IgZXh0ZW5kcyBFbXB0eVZpc2l0b3IgaW1wbGVtZW50cyBNZXRob2RWaXNpdG9yIHsKIAotCS8qKgotCSAqIFRoZSA8Y29kZT5QYXJ0aWFsTWFuaWZlc3Q8L2NvZGU+IGJlaW5nIHVwZGF0ZWQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQYXJ0aWFsTWFuaWZlc3QgcGFydGlhbE1hbmlmZXN0OworICAgIC8qKgorICAgICAqIFRoZSA8Y29kZT5QYXJ0aWFsTWFuaWZlc3Q8L2NvZGU+IGJlaW5nIHVwZGF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBQYXJ0aWFsTWFuaWZlc3QgcGFydGlhbE1hbmlmZXN0OwogCi0JLyoqCi0JICogVGhlIHR5cGUgdGhhdCBpcyBiZWluZyBzY2FubmVkLgotCSAqLwotCXByaXZhdGUgZmluYWwgVHlwZSB0eXBlOworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIHRoYXQgaXMgYmVpbmcgc2Nhbm5lZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKIAotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QXJ0ZWZhY3RBbmFseXNlck1ldGhvZFZpc2l0b3I8L2NvZGU+IGZvciB0aGUgc3VwcGxpZWQKLQkgKiB7QGxpbmsgUGFydGlhbE1hbmlmZXN0fS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydGlhbE1hbmlmZXN0IHRoZSA8Y29kZT5QYXJ0aWFsTWFuaWZlc3Q8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBBcnRlZmFjdEFuYWx5c2VyTWV0aG9kVmlzaXRvcihQYXJ0aWFsTWFuaWZlc3QgcGFydGlhbE1hbmlmZXN0LCBUeXBlIHR5cGUpIHsKLQkJdGhpcy5wYXJ0aWFsTWFuaWZlc3QgPSBwYXJ0aWFsTWFuaWZlc3Q7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QXJ0ZWZhY3RBbmFseXNlck1ldGhvZFZpc2l0b3I8L2NvZGU+IGZvciB0aGUgc3VwcGxpZWQge0BsaW5rIFBhcnRpYWxNYW5pZmVzdH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFydGlhbE1hbmlmZXN0IHRoZSA8Y29kZT5QYXJ0aWFsTWFuaWZlc3Q8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBBcnRlZmFjdEFuYWx5c2VyTWV0aG9kVmlzaXRvcihQYXJ0aWFsTWFuaWZlc3QgcGFydGlhbE1hbmlmZXN0LCBUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhpcy5wYXJ0aWFsTWFuaWZlc3QgPSBwYXJ0aWFsTWFuaWZlc3Q7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQogCi0JLyoqCi0JICogQGluaGVyaXREb2MKLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uKFN0cmluZyBkZXNjLCBib29sZWFuIHZpc2libGUpIHsKLQkJVHlwZSB0ID0gVHlwZS5nZXRUeXBlKGRlc2MpOwotCQlWaXNpdG9yVXRpbHMucmVjb3JkUmVmZXJlbmNlZFR5cGVzKHBhcnRpYWxNYW5pZmVzdCwgdCk7Ci0JCVZpc2l0b3JVdGlscy5yZWNvcmRVc2VzKHBhcnRpYWxNYW5pZmVzdCwgdGhpcy50eXBlLCB0KTsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIEBpbmhlcml0RG9jCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbihTdHJpbmcgZGVzYywgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIFR5cGUgdCA9IFR5cGUuZ2V0VHlwZShkZXNjKTsKKyAgICAgICAgVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgdCk7CisgICAgICAgIFZpc2l0b3JVdGlscy5yZWNvcmRVc2VzKHRoaXMucGFydGlhbE1hbmlmZXN0LCB0aGlzLnR5cGUsIHQpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAaW5oZXJpdERvYwotCSAqLwotCXB1YmxpYyB2b2lkIHZpc2l0RmllbGRJbnNuKGludCBvcGNvZGUsIFN0cmluZyBvd25lciwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjKSB7Ci0JCVZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXMocGFydGlhbE1hbmlmZXN0LCBUeXBlLmdldFR5cGUoZGVzYykpOwotCQlWaXNpdG9yVXRpbHMucmVjb3JkUmVmZXJlbmNlZFR5cGVzKHBhcnRpYWxNYW5pZmVzdCwgVHlwZS5nZXRPYmplY3RUeXBlKG93bmVyKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEBpbmhlcml0RG9jCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRGaWVsZEluc24oaW50IG9wY29kZSwgU3RyaW5nIG93bmVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgVHlwZS5nZXRUeXBlKGRlc2MpKTsKKyAgICAgICAgVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgVHlwZS5nZXRPYmplY3RUeXBlKG93bmVyKSk7CisgICAgfQogCi0JLyoqCi0JICogQGluaGVyaXREb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCB2aXNpdExvY2FsVmFyaWFibGUoU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLCBTdHJpbmcgc2lnbmF0dXJlLCBMYWJlbCBzdGFydCwgTGFiZWwgZW5kLCBpbnQgaW5kZXgpIHsKLQkJVHlwZSB0ID0gVHlwZS5nZXRUeXBlKGRlc2MpOwotCQlWaXNpdG9yVXRpbHMucmVjb3JkUmVmZXJlbmNlZFR5cGVzKHBhcnRpYWxNYW5pZmVzdCwgdCk7Ci0JfQorICAgIC8qKgorICAgICAqIEBpbmhlcml0RG9jCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRMb2NhbFZhcmlhYmxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzYywgU3RyaW5nIHNpZ25hdHVyZSwgTGFiZWwgc3RhcnQsIExhYmVsIGVuZCwgaW50IGluZGV4KSB7CisgICAgICAgIFR5cGUgdCA9IFR5cGUuZ2V0VHlwZShkZXNjKTsKKyAgICAgICAgVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgdCk7CisgICAgfQogCi0JLyoqCi0JICogQGluaGVyaXREb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZEluc24oaW50IG9wY29kZSwgU3RyaW5nIG93bmVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MpIHsKLQkJVHlwZSB0ID0gVHlwZS5nZXRPYmplY3RUeXBlKG93bmVyKTsKLQkJVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyhwYXJ0aWFsTWFuaWZlc3QsIHQpOwotCQlWaXNpdG9yVXRpbHMucmVjb3JkUmVmZXJlbmNlZFR5cGVzKHBhcnRpYWxNYW5pZmVzdCwgVHlwZS5nZXRSZXR1cm5UeXBlKGRlc2MpKTsKLQkJVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyhwYXJ0aWFsTWFuaWZlc3QsIFR5cGUuZ2V0QXJndW1lbnRUeXBlcyhkZXNjKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEBpbmhlcml0RG9jCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRNZXRob2RJbnNuKGludCBvcGNvZGUsIFN0cmluZyBvd25lciwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIFR5cGUgdCA9IFR5cGUuZ2V0T2JqZWN0VHlwZShvd25lcik7CisgICAgICAgIFZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIHQpOworICAgICAgICBWaXNpdG9yVXRpbHMucmVjb3JkUmVmZXJlbmNlZFR5cGVzKHRoaXMucGFydGlhbE1hbmlmZXN0LCBUeXBlLmdldFJldHVyblR5cGUoZGVzYykpOworICAgICAgICBWaXNpdG9yVXRpbHMucmVjb3JkUmVmZXJlbmNlZFR5cGVzKHRoaXMucGFydGlhbE1hbmlmZXN0LCBUeXBlLmdldEFyZ3VtZW50VHlwZXMoZGVzYykpOworICAgIH0KIAotCS8qKgotCSAqIEBpbmhlcml0RG9jCi0JICovCi0JcHVibGljIHZvaWQgdmlzaXRNdWx0aUFOZXdBcnJheUluc24oU3RyaW5nIGRlc2MsIGludCBkaW1zKSB7Ci0JCVR5cGUgdCA9IFR5cGUuZ2V0VHlwZShkZXNjKTsKLQkJVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyhwYXJ0aWFsTWFuaWZlc3QsIHQpOwotCX0KKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdERvYworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TXVsdGlBTmV3QXJyYXlJbnNuKFN0cmluZyBkZXNjLCBpbnQgZGltcykgeworICAgICAgICBUeXBlIHQgPSBUeXBlLmdldFR5cGUoZGVzYyk7CisgICAgICAgIFZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIHQpOworICAgIH0KIAotCS8qKgotCSAqIEBpbmhlcml0RG9jCi0JICovCi0JcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbihpbnQgcGFyYW1ldGVyLCBTdHJpbmcgZGVzYywgYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCVR5cGUgdCA9IFR5cGUuZ2V0VHlwZShkZXNjKTsKLQkJVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyhwYXJ0aWFsTWFuaWZlc3QsIHQpOwotCQlWaXNpdG9yVXRpbHMucmVjb3JkVXNlcyhwYXJ0aWFsTWFuaWZlc3QsIHRoaXMudHlwZSwgdCk7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdERvYworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdFBhcmFtZXRlckFubm90YXRpb24oaW50IHBhcmFtZXRlciwgU3RyaW5nIGRlc2MsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBUeXBlIHQgPSBUeXBlLmdldFR5cGUoZGVzYyk7CisgICAgICAgIFZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIHQpOworICAgICAgICBWaXNpdG9yVXRpbHMucmVjb3JkVXNlcyh0aGlzLnBhcnRpYWxNYW5pZmVzdCwgdGhpcy50eXBlLCB0KTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQGluaGVyaXREb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCB2aXNpdFRyeUNhdGNoQmxvY2soTGFiZWwgc3RhcnQsIExhYmVsIGVuZCwgTGFiZWwgaGFuZGxlciwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJVHlwZSB0ID0gVHlwZS5nZXRPYmplY3RUeXBlKHR5cGUpOwotCQkJVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyhwYXJ0aWFsTWFuaWZlc3QsIHQpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEBpbmhlcml0RG9jCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUcnlDYXRjaEJsb2NrKExhYmVsIHN0YXJ0LCBMYWJlbCBlbmQsIExhYmVsIGhhbmRsZXIsIFN0cmluZyB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFR5cGUgdCA9IFR5cGUuZ2V0T2JqZWN0VHlwZSh0eXBlKTsKKyAgICAgICAgICAgIFZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIHQpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQGluaGVyaXREb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCB2aXNpdFR5cGVJbnNuKGludCBvcGNvZGUsIFN0cmluZyB0eXBlKSB7Ci0JCVR5cGUgdCA9IFR5cGUuZ2V0T2JqZWN0VHlwZSh0eXBlKTsKLQkJVmlzaXRvclV0aWxzLnJlY29yZFJlZmVyZW5jZWRUeXBlcyhwYXJ0aWFsTWFuaWZlc3QsIHQpOwotCX0KKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdERvYworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZUluc24oaW50IG9wY29kZSwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgVHlwZSB0ID0gVHlwZS5nZXRPYmplY3RUeXBlKHR5cGUpOworICAgICAgICBWaXNpdG9yVXRpbHMucmVjb3JkUmVmZXJlbmNlZFR5cGVzKHRoaXMucGFydGlhbE1hbmlmZXN0LCB0KTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIHZvaWQgdmlzaXRMZGNJbnNuKE9iamVjdCBjc3QpIHsKLQkJaWYgKGNzdCBpbnN0YW5jZW9mIFR5cGUpIHsKLQkJCVZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXMocGFydGlhbE1hbmlmZXN0LCAoVHlwZSkgY3N0KTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRMZGNJbnNuKE9iamVjdCBjc3QpIHsKKyAgICAgICAgaWYgKGNzdCBpbnN0YW5jZW9mIFR5cGUpIHsKKyAgICAgICAgICAgIFZpc2l0b3JVdGlscy5yZWNvcmRSZWZlcmVuY2VkVHlwZXModGhpcy5wYXJ0aWFsTWFuaWZlc3QsIChUeXBlKSBjc3QpOworICAgICAgICB9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci9pbnRlcm5hbC9jb3JlL2FzbS9FeHRlbnNpYmxlQXNtVHlwZUFydGVmYWN0QW5hbHlzZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvYXNtL0V4dGVuc2libGVBc21UeXBlQXJ0ZWZhY3RBbmFseXNlci5qYXZhCmluZGV4IDkyY2Q2NGEuLjYyZTI1MWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvYXNtL0V4dGVuc2libGVBc21UeXBlQXJ0ZWZhY3RBbmFseXNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvYXNtL0V4dGVuc2libGVBc21UeXBlQXJ0ZWZhY3RBbmFseXNlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmludGVybmFsLmNvcmUuYXNtOwogCiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTE3LDM1ICsxOCwzNCBAQAogaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzUmVhZGVyOwogCiAvKioKLSAqIHtAbGluayBBcnRpZmFjdEFuYWx5emVyfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgQVNNIHRvIHNjYW4KLSAqIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgZm9yIGRlcGVuZGVuY2llcyBhbmQgZXhwb3J0cy4KKyAqIHtAbGluayBBcnRpZmFjdEFuYWx5emVyfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgQVNNIHRvIHNjYW4gPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBmb3IgZGVwZW5kZW5jaWVzIGFuZCBleHBvcnRzLgogICogPHAvPgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKi8KIHB1YmxpYyBjbGFzcyBFeHRlbnNpYmxlQXNtVHlwZUFydGVmYWN0QW5hbHlzZXIgaW1wbGVtZW50cyBBcnRpZmFjdEFuYWx5emVyIHsKIAotCS8qKgotCSAqIEBpbmhlcml0RG9jCi0JICovCi0JcHVibGljIHZvaWQgYW5hbHlzZShJbnB1dFN0cmVhbSBhcnRlZmFjdCwgU3RyaW5nIGFydGVmYWN0TmFtZSwgUGFydGlhbE1hbmlmZXN0IG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ2xhc3NSZWFkZXIgcmVhZGVyID0gbmV3IENsYXNzUmVhZGVyKGFydGVmYWN0KTsKLQkJcmVhZGVyLmFjY2VwdChuZXcgQXJ0ZWZhY3RBbmFseXNlckNsYXNzVmlzaXRvcihtb2RlbCksIDApOwotCX0KKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdERvYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFuYWx5c2UoSW5wdXRTdHJlYW0gYXJ0ZWZhY3QsIFN0cmluZyBhcnRlZmFjdE5hbWUsIFBhcnRpYWxNYW5pZmVzdCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzUmVhZGVyIHJlYWRlciA9IG5ldyBDbGFzc1JlYWRlcihhcnRlZmFjdCk7CisgICAgICAgIHJlYWRlci5hY2NlcHQobmV3IEFydGVmYWN0QW5hbHlzZXJDbGFzc1Zpc2l0b3IobW9kZWwpLCAwKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAaW5oZXJpdERvYwotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkFuYWx5c2UoU3RyaW5nIGFydGVmYWN0TmFtZSkgewotCQlyZXR1cm4gYXJ0ZWZhY3ROYW1lLmVuZHNXaXRoKCIuY2xhc3MiKTsKLQl9CisgICAgLyoqCisgICAgICogQGluaGVyaXREb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5BbmFseXNlKFN0cmluZyBhcnRlZmFjdE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFydGVmYWN0TmFtZS5lbmRzV2l0aCgiLmNsYXNzIik7CisgICAgfQogCi0JLyoqCi0JICogQGluaGVyaXREb2MKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFTTSBUeXBlIFNjYW5uZXIiOwotCX0KKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdERvYworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiQVNNIFR5cGUgU2Nhbm5lciI7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci9pbnRlcm5hbC9jb3JlL2FzbS9WaXNpdG9yVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvYXNtL1Zpc2l0b3JVdGlscy5qYXZhCmluZGV4IGQ2YTQ5NjQuLjYxYjg4NzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvYXNtL1Zpc2l0b3JVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvYXNtL1Zpc2l0b3JVdGlscy5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmludGVybmFsLmNvcmUuYXNtOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uYnVuZGxvci5zdXBwb3J0LnBhcnRpYWxtYW5pZmVzdC5QYXJ0aWFsTWFuaWZlc3Q7CkBAIC0xOSw2NCArMjAsNjMgQEAKICAqLwogZmluYWwgY2xhc3MgVmlzaXRvclV0aWxzIHsKIAotCS8qKgotCSAqIEdldHMgdGhlIHBhY2thZ2UgbmFtZSBmcm9tIHRoZSBzdXBwbGllZCB7QGxpbmsgVHlwZX0uCi0JICogCi0JICogQHBhcmFtIHR5cGUgdGhlIDxjb2RlPlR5cGU8L2NvZGU+LgotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShUeXBlIHR5cGUpIHsKLQkJU3RyaW5nIG5hbWU7Ci0JCWlmICh0eXBlLmdldFNvcnQoKSA9PSBUeXBlLk9CSkVDVCkgewotCQkJbmFtZSA9IHR5cGUuZ2V0Q2xhc3NOYW1lKCk7Ci0JCX0gZWxzZSBpZiAodHlwZS5nZXRTb3J0KCkgPT0gVHlwZS5BUlJBWSkgewotCQkJcmV0dXJuIGdldFBhY2thZ2VOYW1lKHR5cGUuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgZG90SW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChkb3RJbmRleCA+IC0xKSB7Ci0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgZG90SW5kZXgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcGFja2FnZSBuYW1lIGZyb20gdGhlIHN1cHBsaWVkIHtAbGluayBUeXBlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSA8Y29kZT5UeXBlPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoVHlwZSB0eXBlKSB7CisgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICBpZiAodHlwZS5nZXRTb3J0KCkgPT0gVHlwZS5PQkpFQ1QpIHsKKyAgICAgICAgICAgIG5hbWUgPSB0eXBlLmdldENsYXNzTmFtZSgpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUuZ2V0U29ydCgpID09IFR5cGUuQVJSQVkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRQYWNrYWdlTmFtZSh0eXBlLmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaW50IGRvdEluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAoZG90SW5kZXggPiAtMSkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIGRvdEluZGV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlTmFtZShUeXBlIHR5cGUpIHsKLQkJaWYgKHR5cGUuZ2V0U29ydCgpID09IFR5cGUuT0JKRUNUKSB7Ci0JCQlyZXR1cm4gdHlwZS5nZXRDbGFzc05hbWUoKTsKLQkJfSBlbHNlIGlmICh0eXBlLmdldFNvcnQoKSA9PSBUeXBlLkFSUkFZKSB7Ci0JCQlyZXR1cm4gZ2V0RnVsbHlRdWFsaWZpZWRUeXBlTmFtZSh0eXBlLmdldEVsZW1lbnRUeXBlKCkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlTmFtZShUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUuZ2V0U29ydCgpID09IFR5cGUuT0JKRUNUKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5nZXRDbGFzc05hbWUoKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlLmdldFNvcnQoKSA9PSBUeXBlLkFSUkFZKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RnVsbHlRdWFsaWZpZWRUeXBlTmFtZSh0eXBlLmdldEVsZW1lbnRUeXBlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBSZWNvcmRzIHRoZSBzdXBwbGllZCB7QGxpbmsgVHlwZSBUeXBlc30gaW4gdGhlIHN1cHBsaWVkCi0JICoge0BsaW5rIFBhcnRpYWxNYW5pZmVzdH0uCi0JICogCi0JICogQHBhcmFtIHBhcnRpYWxNYW5pZmVzdCB0aGUgPGNvZGU+UGFydGlhbE1hbmlmZXN0PC9jb2RlPi4KLQkgKiBAcGFyYW0gdHlwZXMgdGhlIDxjb2RlPlR5cGVzPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVjb3JkUmVmZXJlbmNlZFR5cGVzKFBhcnRpYWxNYW5pZmVzdCBwYXJ0aWFsTWFuaWZlc3QsIFR5cGUuLi4gdHlwZXMpIHsKLQkJZm9yIChUeXBlIHQgOiB0eXBlcykgewotCQkJcGFydGlhbE1hbmlmZXN0LnJlY29yZFJlZmVyZW5jZWRUeXBlKGdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUodCkpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIFJlY29yZHMgdGhlIHN1cHBsaWVkIHtAbGluayBUeXBlIFR5cGVzfSBpbiB0aGUgc3VwcGxpZWQge0BsaW5rIFBhcnRpYWxNYW5pZmVzdH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFydGlhbE1hbmlmZXN0IHRoZSA8Y29kZT5QYXJ0aWFsTWFuaWZlc3Q8L2NvZGU+LgorICAgICAqIEBwYXJhbSB0eXBlcyB0aGUgPGNvZGU+VHlwZXM8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWNvcmRSZWZlcmVuY2VkVHlwZXMoUGFydGlhbE1hbmlmZXN0IHBhcnRpYWxNYW5pZmVzdCwgVHlwZS4uLiB0eXBlcykgeworICAgICAgICBmb3IgKFR5cGUgdCA6IHR5cGVzKSB7CisgICAgICAgICAgICBwYXJ0aWFsTWFuaWZlc3QucmVjb3JkUmVmZXJlbmNlZFR5cGUoZ2V0RnVsbHlRdWFsaWZpZWRUeXBlTmFtZSh0KSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBSZWNvcmRzIGEgdXNlcyBvZiB0aGUgcGFja2FnZXMgZm9yIHRoZSBzdXBwbGllZCB7QGxpbmsgVHlwZSBUeXBlc30KLQkgKiBhZ2FpbnN0IHRoZSBzdXBwbGllZCA8Y29kZT5leHBvcnRpbmdQYWNrYWdlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydGlhbE1hbmlmZXN0IHRoZSA8Y29kZT5QYXJ0aWFsTWFuaWZlc3Q8L2NvZGU+LgotCSAqIEBwYXJhbSBleHBvcnRpbmdUeXBlIHRoZSBleHBvcnRpbmcgdHlwZS4KLQkgKiBAcGFyYW0gdHlwZXMgdGhlIDxjb2RlPlR5cGVzPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVjb3JkVXNlcyhQYXJ0aWFsTWFuaWZlc3QgcGFydGlhbE1hbmlmZXN0LCBUeXBlIGV4cG9ydGluZ1R5cGUsIFR5cGUuLi4gdHlwZXMpIHsKLQkJZm9yIChUeXBlIHQgOiB0eXBlcykgewotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUodCk7Ci0JCQlwYXJ0aWFsTWFuaWZlc3QucmVjb3JkVXNlc1BhY2thZ2UoZ2V0UGFja2FnZU5hbWUoZXhwb3J0aW5nVHlwZSksIHBhY2thZ2VOYW1lKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBSZWNvcmRzIGEgdXNlcyBvZiB0aGUgcGFja2FnZXMgZm9yIHRoZSBzdXBwbGllZCB7QGxpbmsgVHlwZSBUeXBlc30gYWdhaW5zdCB0aGUgc3VwcGxpZWQKKyAgICAgKiA8Y29kZT5leHBvcnRpbmdQYWNrYWdlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJ0aWFsTWFuaWZlc3QgdGhlIDxjb2RlPlBhcnRpYWxNYW5pZmVzdDwvY29kZT4uCisgICAgICogQHBhcmFtIGV4cG9ydGluZ1R5cGUgdGhlIGV4cG9ydGluZyB0eXBlLgorICAgICAqIEBwYXJhbSB0eXBlcyB0aGUgPGNvZGU+VHlwZXM8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWNvcmRVc2VzKFBhcnRpYWxNYW5pZmVzdCBwYXJ0aWFsTWFuaWZlc3QsIFR5cGUgZXhwb3J0aW5nVHlwZSwgVHlwZS4uLiB0eXBlcykgeworICAgICAgICBmb3IgKFR5cGUgdCA6IHR5cGVzKSB7CisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZSh0KTsKKyAgICAgICAgICAgIHBhcnRpYWxNYW5pZmVzdC5yZWNvcmRVc2VzUGFja2FnZShnZXRQYWNrYWdlTmFtZShleHBvcnRpbmdUeXBlKSwgcGFja2FnZU5hbWUpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9tYXZlbi9NYXZlblByb3BlcnRpZXNTb3VyY2UuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvbWF2ZW4vTWF2ZW5Qcm9wZXJ0aWVzU291cmNlLmphdmEKaW5kZXggZDAzMWUwOS4uOTg5MDc5OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvaW50ZXJuYWwvY29yZS9tYXZlbi9NYXZlblByb3BlcnRpZXNTb3VyY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci9pbnRlcm5hbC9jb3JlL21hdmVuL01hdmVuUHJvcGVydGllc1NvdXJjZS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmludGVybmFsLmNvcmUubWF2ZW47CiAKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKQEAgLTIzLDU2ICsyNCw1NiBAQAogCiAvKioKICAqIHtAbGluayBQcm9wZXJ0aWVzU291cmNlfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHJlYWRzIHByb3BlcnRpZXMgZnJvbSBhIE1hdmVuIHByb2plY3QgcG9tLnhtbCBoaWVyYXJjaHkuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBhdXRob3IgTGVvIERvcyBTYW50b3MKICAqLwogcHVibGljIGNsYXNzIE1hdmVuUHJvcGVydGllc1NvdXJjZSBpbXBsZW1lbnRzIFByb3BlcnRpZXNTb3VyY2UgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydGllcyBFTVBUWV9TVEFOREFSRCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydGllcyBFTVBUWV9TVEFOREFSRCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAKLQlwcml2YXRlIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwogCi0JcHVibGljIE1hdmVuUHJvcGVydGllc1NvdXJjZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQorICAgIHB1YmxpYyBNYXZlblByb3BlcnRpZXNTb3VyY2UoSVByb2plY3QgcHJvamVjdCkgeworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgIH0KIAotCXB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7Ci0JCXJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRSAtIDE7Ci0JfQorICAgIHB1YmxpYyBpbnQgZ2V0UHJpb3JpdHkoKSB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRSAtIDE7CisgICAgfQogCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKLQkJdHJ5IHsKLQkJCUlNYXZlblByb2plY3RSZWdpc3RyeSByZWdpc3RyeSA9IE1hdmVuUGx1Z2luLmdldE1hdmVuUHJvamVjdFJlZ2lzdHJ5KCk7Ci0JCQlJTWF2ZW5Qcm9qZWN0RmFjYWRlIGZhY2FkZSA9IHJlZ2lzdHJ5LmNyZWF0ZShwcm9qZWN0LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWlmIChmYWNhZGUgIT0gbnVsbCkgewotCQkJCU1hdmVuUHJvamVjdCBtYXZlblByb2ogPSBmYWNhZGUuZ2V0TWF2ZW5Qcm9qZWN0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCVByb3BlcnRpZXMgcHJvcHMgPSBtYXZlblByb2ouZ2V0UHJvcGVydGllcygpOworICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJTWF2ZW5Qcm9qZWN0UmVnaXN0cnkgcmVnaXN0cnkgPSBNYXZlblBsdWdpbi5nZXRNYXZlblByb2plY3RSZWdpc3RyeSgpOworICAgICAgICAgICAgSU1hdmVuUHJvamVjdEZhY2FkZSBmYWNhZGUgPSByZWdpc3RyeS5jcmVhdGUodGhpcy5wcm9qZWN0LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKyAgICAgICAgICAgIGlmIChmYWNhZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE1hdmVuUHJvamVjdCBtYXZlblByb2ogPSBmYWNhZGUuZ2V0TWF2ZW5Qcm9qZWN0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBtYXZlblByb2ouZ2V0UHJvcGVydGllcygpOwogCi0JCQkJLy8gYWRkIGluIHNvbWUgc3BlY2lhbCBtYXZlbiBwcm9wZXJ0aWVzCi0JCQkJYWRkUHJvcGVydHlJZk5vdE51bGwocHJvcHMsICJwcm9qZWN0LmFydGlmYWN0SWQiLCBtYXZlblByb2ouZ2V0QXJ0aWZhY3RJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFkZFByb3BlcnR5SWZOb3ROdWxsKHByb3BzLCAicHJvamVjdC5ncm91cElkIiwgbWF2ZW5Qcm9qLmdldEdyb3VwSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGRQcm9wZXJ0eUlmTm90TnVsbChwcm9wcywgInByb2plY3QuZGVzY3JpcHRpb24iLCBtYXZlblByb2ouZ2V0RGVzY3JpcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlhZGRQcm9wZXJ0eUlmTm90TnVsbChwcm9wcywgInByb2plY3QubmFtZSIsIG1hdmVuUHJvai5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRkUHJvcGVydHlJZk5vdE51bGwocHJvcHMsICJwcm9qZWN0LnZlcnNpb24iLCBtYXZlblByb2ouZ2V0VmVyc2lvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFkZFByb3BlcnR5SWZOb3ROdWxsKHByb3BzLCAicG9tLmFydGlmYWN0SWQiLCBtYXZlblByb2ouZ2V0QXJ0aWZhY3RJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFkZFByb3BlcnR5SWZOb3ROdWxsKHByb3BzLCAicG9tLmdyb3VwSWQiLCBtYXZlblByb2ouZ2V0R3JvdXBJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFkZFByb3BlcnR5SWZOb3ROdWxsKHByb3BzLCAicG9tLmRlc2NyaXB0aW9uIiwgbWF2ZW5Qcm9qLmdldERlc2NyaXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRkUHJvcGVydHlJZk5vdE51bGwocHJvcHMsICJwb20ubmFtZSIsIG1hdmVuUHJvai5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRkUHJvcGVydHlJZk5vdE51bGwocHJvcHMsICJwb20udmVyc2lvbiIsIG1hdmVuUHJvai5nZXRWZXJzaW9uKCkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgLy8gYWRkIGluIHNvbWUgc3BlY2lhbCBtYXZlbiBwcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlJZk5vdE51bGwocHJvcHMsICJwcm9qZWN0LmFydGlmYWN0SWQiLCBtYXZlblByb2ouZ2V0QXJ0aWZhY3RJZCgpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5SWZOb3ROdWxsKHByb3BzLCAicHJvamVjdC5ncm91cElkIiwgbWF2ZW5Qcm9qLmdldEdyb3VwSWQoKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUlmTm90TnVsbChwcm9wcywgInByb2plY3QuZGVzY3JpcHRpb24iLCBtYXZlblByb2ouZ2V0RGVzY3JpcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eUlmTm90TnVsbChwcm9wcywgInByb2plY3QubmFtZSIsIG1hdmVuUHJvai5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlJZk5vdE51bGwocHJvcHMsICJwcm9qZWN0LnZlcnNpb24iLCBtYXZlblByb2ouZ2V0VmVyc2lvbigpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5SWZOb3ROdWxsKHByb3BzLCAicG9tLmFydGlmYWN0SWQiLCBtYXZlblByb2ouZ2V0QXJ0aWZhY3RJZCgpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5SWZOb3ROdWxsKHByb3BzLCAicG9tLmdyb3VwSWQiLCBtYXZlblByb2ouZ2V0R3JvdXBJZCgpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5SWZOb3ROdWxsKHByb3BzLCAicG9tLmRlc2NyaXB0aW9uIiwgbWF2ZW5Qcm9qLmdldERlc2NyaXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlJZk5vdE51bGwocHJvcHMsICJwb20ubmFtZSIsIG1hdmVuUHJvai5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgYWRkUHJvcGVydHlJZk5vdE51bGwocHJvcHMsICJwb20udmVyc2lvbiIsIG1hdmVuUHJvai5nZXRWZXJzaW9uKCkpOyAvLyROT04tTkxTLTEkCiAKLQkJCQlyZXR1cm4gcHJvcHM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gdGhpcyBleGNlcHRpb24gd2lsbCBiZSByZXBvcnRlZCBsYXRlciBvbiBhcyB0aGUgcHJvcGVydGllcyBjYW4ndCBiZSByZXBvcnRlZC4KLQkJfQotCQlyZXR1cm4gRU1QVFlfU1RBTkRBUkQ7Ci0JfQorICAgICAgICAgICAgICAgIHJldHVybiBwcm9wczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB0aGlzIGV4Y2VwdGlvbiB3aWxsIGJlIHJlcG9ydGVkIGxhdGVyIG9uIGFzIHRoZSBwcm9wZXJ0aWVzIGNhbid0IGJlIHJlcG9ydGVkLgorICAgICAgICB9CisgICAgICAgIHJldHVybiBFTVBUWV9TVEFOREFSRDsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgYWRkUHJvcGVydHlJZk5vdE51bGwoUHJvcGVydGllcyBwcm9wcywgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIGtleSAhPSBudWxsKSB7Ci0JCQlwcm9wcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JCX0KLQl9CisgICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5SWZOb3ROdWxsKFByb3BlcnRpZXMgcHJvcHMsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBrZXkgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvcHMucHV0KGtleSwgdmFsdWUpOworICAgICAgICB9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci9pbnRlcm5hbC9jb3JlL21hdmVuL01hdmVuUHJvcGVydGllc1NvdXJjZUZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvbWF2ZW4vTWF2ZW5Qcm9wZXJ0aWVzU291cmNlRmFjdG9yeS5qYXZhCmluZGV4IDBhMTFmOWMuLjllZTIyMjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvbWF2ZW4vTWF2ZW5Qcm9wZXJ0aWVzU291cmNlRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2ludGVybmFsL2NvcmUvbWF2ZW4vTWF2ZW5Qcm9wZXJ0aWVzU291cmNlRmFjdG9yeS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmludGVybmFsLmNvcmUubWF2ZW47CiAKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKQEAgLTIwLDUwICsyMSw1MCBAQAogICogRmFjdG9yeSBpbXBsZW1lbnRhdGlvbiB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHtAbGluayBNYXZlblByb3BlcnRpZXNTb3VyY2V9LgogICogPHA+CiAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHdpbGwgbWFrZSBzdXJlIG5vdCB0byBkZXBlbmQgb24gTTJFIHVudGlsIGl0IGlzIGFjdHVhbGx5IGluc3RhbGxlZC4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBMZW8gRG9zIFNhbnRvcwogICovCiBwdWJsaWMgY2xhc3MgTWF2ZW5Qcm9wZXJ0aWVzU291cmNlRmFjdG9yeSB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTTJFX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UubTJlLmNvcmUucHJvamVjdC5JTWF2ZW5Qcm9qZWN0UmVnaXN0cnkiOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE0yRV9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLm0yZS5jb3JlLnByb2plY3QuSU1hdmVuUHJvamVjdFJlZ2lzdHJ5IjsgLy8kTk9OLU5MUy0xJAogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE0yRV9QUk9KRUNUX05BVFVSRSA9ICJvcmcuZWNsaXBzZS5tMmUuY29yZS5tYXZlbjJOYXR1cmUiOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE0yRV9QUk9KRUNUX05BVFVSRSA9ICJvcmcuZWNsaXBzZS5tMmUuY29yZS5tYXZlbjJOYXR1cmUiOyAvLyROT04tTkxTLTEkCiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX00yRV9QUkVTRU5UID0gaXNNMmVQcmVzZW50KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19NMkVfUFJFU0VOVCA9IGlzTTJlUHJlc2VudCgpOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydGllc1NvdXJjZSBFTVBUWV9QUk9QRVJUSUVTX1NPVVJDRSA9IG5ldyBOb09wUHJvcGVydGllc1NvdXJjZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnRpZXNTb3VyY2UgRU1QVFlfUFJPUEVSVElFU19TT1VSQ0UgPSBuZXcgTm9PcFByb3BlcnRpZXNTb3VyY2UoKTsKIAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG91bGRDcmVhdGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSVNfTTJFX1BSRVNFTlQgJiYgRmFjZXRVdGlscy5oYXNOYXR1cmUocHJvamVjdCwgTTJFX1BST0pFQ1RfTkFUVVJFKTsKLQl9CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZENyZWF0ZShJUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHJldHVybiBJU19NMkVfUFJFU0VOVCAmJiBGYWNldFV0aWxzLmhhc05hdHVyZShwcm9qZWN0LCBNMkVfUFJPSkVDVF9OQVRVUkUpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllc1NvdXJjZSBjcmVhdGVQcm9wZXJ0aWVzU291cmNlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHNob3VsZENyZWF0ZShwcm9qZWN0KSkgewotCQkJcmV0dXJuIG5ldyBNYXZlblByb3BlcnRpZXNTb3VyY2UocHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX1BST1BFUlRJRVNfU09VUkNFOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIFByb3BlcnRpZXNTb3VyY2UgY3JlYXRlUHJvcGVydGllc1NvdXJjZShJUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIGlmIChzaG91bGRDcmVhdGUocHJvamVjdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWF2ZW5Qcm9wZXJ0aWVzU291cmNlKHByb2plY3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBFTVBUWV9QUk9QRVJUSUVTX1NPVVJDRTsKKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTTJlUHJlc2VudCgpIHsKLQkJdHJ5IHsKLQkJCU1hdmVuUHJvcGVydGllc1NvdXJjZUZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoTTJFX0NMQVNTX05BTUUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNMmVQcmVzZW50KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWF2ZW5Qcm9wZXJ0aWVzU291cmNlRmFjdG9yeS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhNMkVfQ0xBU1NfTkFNRSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb09wUHJvcGVydGllc1NvdXJjZSBpbXBsZW1lbnRzIFByb3BlcnRpZXNTb3VyY2UgeworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vT3BQcm9wZXJ0aWVzU291cmNlIGltcGxlbWVudHMgUHJvcGVydGllc1NvdXJjZSB7CiAKLQkJcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKLQkJCXJldHVybiBJbnRlZ2VyLk1JTl9WQUxVRTsKLQkJfQorICAgICAgICBwdWJsaWMgaW50IGdldFByaW9yaXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUlOX1ZBTFVFOworICAgICAgICB9CiAKLQkJcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydGllcygpOwotCQl9CisgICAgICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuamR0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuamR0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmluZGV4IGJiYWNhNmQuLjQzMjFiZDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmpkdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5qZHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTEsNCArMSwzIEBACi0jV2VkIE1hciAwMiAxNjowMDowNiBQU1QgMjAxMQogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9CkBAIC04LDYgKzcsOCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCkBAIC04MiwzNSArODMsMzcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTgwCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj00OAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbj0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeT04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2g9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKQEAgLTEyMSwzMCArMTI0LDMxIEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9sYW1iZGFfYm9keT1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTEyMAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2phdmFkb2NfYm91bmRhcmllcz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5wcmVzZXJ2ZV93aGl0ZV9zcGFjZV9iZXR3ZWVuX2NvZGVfYW5kX2xpbmVfY29tbWVudHM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5kaXNhYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9mZgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmVuYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvbgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKQEAgLTE1OCw3ICsxNjIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQ9aW5zZXJ0CkBAIC0xNjYsMTAgKzE3MCwxMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21lbWJlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZXRob2Q9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFja2FnZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl90eXBlPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9sYWJlbD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl90eXBlX2Fubm90YXRpb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0yMTcsNiArMjIyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTIzNSwxMiArMjQxLDE0IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKQEAgLTI2NCw2ICsyNzIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKQEAgLTI5MSw2ICszMDAsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTMxOSw2ICszMjksNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fdHJ5PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0CkBAIC0zMjgsNiArMzM5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKQEAgLTM0MywxNSArMzU1LDE3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xMjAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXNwYWNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2Vfb25fb2ZmX3RhZ3M9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfb3Jfb3BlcmF0b3JfbXVsdGljYXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9vdXRlcl9leHByZXNzaW9uc193aGVuX25lc3RlZD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhRm9ybWF0dGVyPW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRlZmF1bHRKYXZhRm9ybWF0dGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5qZHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuamR0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwppbmRleCA3ZTdmZTczLi42Yzk4MDE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5qZHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmpkdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTEsNyArMSw2NSBAQAorY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbWV0aG9kcz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zX2ludGVyZmFjZV9tZXRob2RzPXRydWUKK2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X2Z1bmN0aW9uYWxfaW50ZXJmYWNlcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCitjbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlX2NoYW5nZXNfb25seT1mYWxzZQorY2xlYW51cC5pbnNlcnRfaW5mZXJyZWRfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV9yZWR1bmRhbnRfdHlwZV9hcmd1bWVudHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Fub255bW91c19jbGFzc19jcmVhdGlvbj1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPXRydWUKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9sYW1iZGE9dHJ1ZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3R5cGVfYXJndW1lbnRzPWZhbHNlCitjbGVhbnVwX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIENsZWFuIFVwCiBjbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIGVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X015bHluIGJhc2VkIG9uIEVjbGlwc2UKK2Zvcm1hdHRlcl9wcm9maWxlPV9WaXJnbyBXZWIgU2VydmVyIC0gQ29kZSBGb3JtYXR0ZXIKIGZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEyCiBpbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAogb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci9qZHQvY29yZS9BcnRpZmFjdEFuYWx5c2VyVHlwZVZpc2l0b3IuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci9qZHQvY29yZS9BcnRpZmFjdEFuYWx5c2VyVHlwZVZpc2l0b3IuamF2YQppbmRleCBiZWRkYjI2Li45ZGUyZWNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvamR0L2NvcmUvQXJ0aWZhY3RBbmFseXNlclR5cGVWaXNpdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2pkdC9jb3JlL0FydGlmYWN0QW5hbHlzZXJUeXBlVmlzaXRvci5qYXZhCkBAIC00Nyw0MjMgKzQ3LDQyMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmJ1bmRsb3Iuc3VwcG9ydC5wYXJ0aWFsbWFuaWZlc3QuUGFydGlhbE1hbmlmZXN0OwogCiAvKioKLSAqIHtAbGluayBNZXRob2RWaXNpdG9yfSB0aGF0IGlzIGJhc2VkIG9uIEpEVCdzIEFTVCA8L3A+IDxzdHJvbmc+Q29uY3VycmVudCBTZW1hbnRpY3M8L3N0cm9uZz48YnIgLz4KKyAqIHtAbGluayBNZXRob2RWaXNpdG9yfSB0aGF0IGlzIGJhc2VkIG9uIEpEVCdzIEFTVAorICogPC9wPgorICogPHN0cm9uZz5Db25jdXJyZW50IFNlbWFudGljczwvc3Ryb25nPjxiciAvPgogICogTm90IHRocmVhZCBzYWZlLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAYXV0aG9yIEdseW4gTm9ybWluZ3RvbgogICovCiBwdWJsaWMgY2xhc3MgQXJ0aWZhY3RBbmFseXNlclR5cGVWaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7CiAKLQlwcml2YXRlIGZpbmFsIFBhcnRpYWxNYW5pZmVzdCBwYXJ0aWFsTWFuaWZlc3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBQYXJ0aWFsTWFuaWZlc3QgcGFydGlhbE1hbmlmZXN0OwogCi0JcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiByZWZlcmVuY2VkVHlwZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiByZWZlcmVuY2VkVHlwZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAKLQlwcml2YXRlIFN0cmluZyB0eXBlUGFja2FnZTsKKyAgICBwcml2YXRlIFN0cmluZyB0eXBlUGFja2FnZTsKIAotCXB1YmxpYyBBcnRpZmFjdEFuYWx5c2VyVHlwZVZpc2l0b3IoUGFydGlhbE1hbmlmZXN0IG1vZGVsKSB7Ci0JCXRoaXMucGFydGlhbE1hbmlmZXN0ID0gbW9kZWw7Ci0JfQorICAgIHB1YmxpYyBBcnRpZmFjdEFuYWx5c2VyVHlwZVZpc2l0b3IoUGFydGlhbE1hbmlmZXN0IG1vZGVsKSB7CisgICAgICAgIHRoaXMucGFydGlhbE1hbmlmZXN0ID0gbW9kZWw7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmVjb3JkVHlwZUJpbmRpbmcobm9kZS5yZXNvbHZlVHlwZUJpbmRpbmcoKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoQ2FzdEV4cHJlc3Npb24gbm9kZSkgeworICAgICAgICByZWNvcmRUeXBlQmluZGluZyhub2RlLnJlc29sdmVUeXBlQmluZGluZygpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENhdGNoQ2xhdXNlIG5vZGUpIHsKLQkJcmVjb3JkVHlwZUJpbmRpbmcobm9kZS5nZXRFeGNlcHRpb24oKS5nZXRUeXBlKCkucmVzb2x2ZUJpbmRpbmcoKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoQ2F0Y2hDbGF1c2Ugbm9kZSkgeworICAgICAgICByZWNvcmRUeXBlQmluZGluZyhub2RlLmdldEV4Y2VwdGlvbigpLmdldFR5cGUoKS5yZXNvbHZlQmluZGluZygpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCXJlY29yZFR5cGVCaW5kaW5nKG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7CisgICAgICAgIHJlY29yZFR5cGVCaW5kaW5nKG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRmllbGREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJlY29yZFR5cGVCaW5kaW5nKG5vZGUuZ2V0VHlwZSgpLnJlc29sdmVCaW5kaW5nKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbm9kZSkgeworICAgICAgICByZWNvcmRUeXBlQmluZGluZyhub2RlLmdldFR5cGUoKS5yZXNvbHZlQmluZGluZygpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUucmVzb2x2ZUJpbmRpbmcoKSAhPSBudWxsICYmICFub2RlLnJlc29sdmVCaW5kaW5nKCkuaXNSZWNvdmVyZWQoKSkgewotCQkJSUJpbmRpbmcgYmluZGluZyA9IG5vZGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJCWlmIChiaW5kaW5nIGluc3RhbmNlb2YgSVBhY2thZ2VCaW5kaW5nKSB7Ci0JCQkJcGFydGlhbE1hbmlmZXN0LnJlY29yZFJlZmVyZW5jZWRQYWNrYWdlKCgoSVBhY2thZ2VCaW5kaW5nKSBiaW5kaW5nKS5nZXROYW1lKCkpOwotCQkJfSBlbHNlIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgSVR5cGVCaW5kaW5nKSB7Ci0JCQkJcmVjb3JkVHlwZUJpbmRpbmcoKElUeXBlQmluZGluZykgYmluZGluZyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIW5vZGUuaXNPbkRlbWFuZCgpICYmICFub2RlLmlzU3RhdGljKCkpIHsKLQkJCQlOYW1lIGltcG9ydEVsZW1lbnROYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQkJcmVjb3JkRnVsbHlRdWFsaWZpZWROYW1lKGltcG9ydEVsZW1lbnROYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJCX0gZWxzZSBpZiAobm9kZS5pc09uRGVtYW5kKCkgJiYgIW5vZGUuaXNTdGF0aWMoKSkgewotCQkJCU5hbWUgaW1wb3J0RWxlbWVudE5hbWUgPSBub2RlLmdldE5hbWUoKTsKLQkJCQlwYXJ0aWFsTWFuaWZlc3QucmVjb3JkUmVmZXJlbmNlZFBhY2thZ2UoaW1wb3J0RWxlbWVudE5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQkJfSBlbHNlIGlmICghbm9kZS5pc09uRGVtYW5kKCkgJiYgbm9kZS5pc1N0YXRpYygpKSB7Ci0JCQkJTmFtZSBpbXBvcnRFbGVtZW50TmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBmcW4gPSBpbXBvcnRFbGVtZW50TmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5zdWJzdHJpbmcoMCwKLQkJCQkJCWltcG9ydEVsZW1lbnROYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmxhc3RJbmRleE9mKCcuJykpOwotCQkJCXJlY29yZEZ1bGx5UXVhbGlmaWVkTmFtZShmcW4pOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG5vZGUpIHsKKyAgICAgICAgaWYgKG5vZGUucmVzb2x2ZUJpbmRpbmcoKSAhPSBudWxsICYmICFub2RlLnJlc29sdmVCaW5kaW5nKCkuaXNSZWNvdmVyZWQoKSkgeworICAgICAgICAgICAgSUJpbmRpbmcgYmluZGluZyA9IG5vZGUucmVzb2x2ZUJpbmRpbmcoKTsKKyAgICAgICAgICAgIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgSVBhY2thZ2VCaW5kaW5nKSB7CisgICAgICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWFuaWZlc3QucmVjb3JkUmVmZXJlbmNlZFBhY2thZ2UoKChJUGFja2FnZUJpbmRpbmcpIGJpbmRpbmcpLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJpbmRpbmcgaW5zdGFuY2VvZiBJVHlwZUJpbmRpbmcpIHsKKyAgICAgICAgICAgICAgICByZWNvcmRUeXBlQmluZGluZygoSVR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbm9kZS5pc09uRGVtYW5kKCkgJiYgIW5vZGUuaXNTdGF0aWMoKSkgeworICAgICAgICAgICAgICAgIE5hbWUgaW1wb3J0RWxlbWVudE5hbWUgPSBub2RlLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICByZWNvcmRGdWxseVF1YWxpZmllZE5hbWUoaW1wb3J0RWxlbWVudE5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmlzT25EZW1hbmQoKSAmJiAhbm9kZS5pc1N0YXRpYygpKSB7CisgICAgICAgICAgICAgICAgTmFtZSBpbXBvcnRFbGVtZW50TmFtZSA9IG5vZGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIHRoaXMucGFydGlhbE1hbmlmZXN0LnJlY29yZFJlZmVyZW5jZWRQYWNrYWdlKGltcG9ydEVsZW1lbnROYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5vZGUuaXNPbkRlbWFuZCgpICYmIG5vZGUuaXNTdGF0aWMoKSkgeworICAgICAgICAgICAgICAgIE5hbWUgaW1wb3J0RWxlbWVudE5hbWUgPSBub2RlLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZnFuID0gaW1wb3J0RWxlbWVudE5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuc3Vic3RyaW5nKDAsIGltcG9ydEVsZW1lbnROYW1lLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmxhc3RJbmRleE9mKCcuJykpOworICAgICAgICAgICAgICAgIHJlY29yZEZ1bGx5UXVhbGlmaWVkTmFtZShmcW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSW5zdGFuY2VvZkV4cHJlc3Npb24gbm9kZSkgewotCQlyZWNvcmRUeXBlQmluZGluZyhub2RlLmdldFJpZ2h0T3BlcmFuZCgpLnJlc29sdmVCaW5kaW5nKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KEluc3RhbmNlb2ZFeHByZXNzaW9uIG5vZGUpIHsKKyAgICAgICAgcmVjb3JkVHlwZUJpbmRpbmcobm9kZS5nZXRSaWdodE9wZXJhbmQoKS5yZXNvbHZlQmluZGluZygpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE1hcmtlckFubm90YXRpb24gbm9kZSkgewotCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCXJlY29yZFR5cGVCaW5kaW5nKGJpbmRpbmcpOwotCQl0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRVc2VzUGFja2FnZSh0aGlzLnR5cGVQYWNrYWdlLCBnZXRQYWNrYWdlQmluZGluZyhiaW5kaW5nKS5nZXROYW1lKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KE1hcmtlckFubm90YXRpb24gbm9kZSkgeworICAgICAgICBJVHlwZUJpbmRpbmcgYmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7CisgICAgICAgIHJlY29yZFR5cGVCaW5kaW5nKGJpbmRpbmcpOworICAgICAgICB0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRVc2VzUGFja2FnZSh0aGlzLnR5cGVQYWNrYWdlLCBnZXRQYWNrYWdlQmluZGluZyhiaW5kaW5nKS5nZXROYW1lKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgewotCQlJTWV0aG9kQmluZGluZyBiaW5kaW5nID0gbm9kZS5yZXNvbHZlQmluZGluZygpOwotCQlpZiAoYmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyByZXR1cm4gdmFsdWUKLQkJaWYgKGJpbmRpbmcuZ2V0UmV0dXJuVHlwZSgpICE9IG51bGwpIHsKLQkJCVN0cmluZyBmcW4gPSBiaW5kaW5nLmdldFJldHVyblR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQlpZiAoISJ2b2lkIi5lcXVhbHMoZnFuKSkgewotCQkJCXJlY29yZFR5cGVCaW5kaW5nKGJpbmRpbmcuZ2V0UmV0dXJuVHlwZSgpKTsKLQkJCQlpZiAoIU1vZGlmaWVyLmlzUHJpdmF0ZShub2RlLmdldE1vZGlmaWVycygpKSkgewotCQkJCQlJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSBnZXRQYWNrYWdlQmluZGluZyhiaW5kaW5nLmdldFJldHVyblR5cGUoKSk7Ci0JCQkJCWlmIChwYWNrYWdlQmluZGluZyAhPSBudWxsKSB7Ci0JCQkJCQl0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRVc2VzUGFja2FnZSh0aGlzLnR5cGVQYWNrYWdlLCBwYWNrYWdlQmluZGluZy5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHRocm93cyBjbGF1c2UKLQkJaWYgKGJpbmRpbmcuZ2V0RXhjZXB0aW9uVHlwZXMoKSAhPSBudWxsKSB7Ci0JCQlmb3IgKElUeXBlQmluZGluZyBleGNlcHRpb25CaW5kaW5nIDogYmluZGluZy5nZXRFeGNlcHRpb25UeXBlcygpKSB7Ci0JCQkJcmVjb3JkVHlwZUJpbmRpbmcoZXhjZXB0aW9uQmluZGluZyk7Ci0JCQkJaWYgKCFNb2RpZmllci5pc1ByaXZhdGUobm9kZS5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCQkJSVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gZ2V0UGFja2FnZUJpbmRpbmcoZXhjZXB0aW9uQmluZGluZyk7Ci0JCQkJCWlmIChwYWNrYWdlQmluZGluZyAhPSBudWxsKSB7Ci0JCQkJCQl0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRVc2VzUGFja2FnZSh0aGlzLnR5cGVQYWNrYWdlLCBwYWNrYWdlQmluZGluZy5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHBhcmFtZXRlcgotCQlpZiAoYmluZGluZy5nZXRQYXJhbWV0ZXJUeXBlcygpICE9IG51bGwpIHsKLQkJCWZvciAoSVR5cGVCaW5kaW5nIHBhcmFtZXRlckJpbmRpbmcgOiBiaW5kaW5nLmdldFBhcmFtZXRlclR5cGVzKCkpIHsKLQkJCQlyZWNvcmRUeXBlQmluZGluZyhwYXJhbWV0ZXJCaW5kaW5nKTsKLQkJCQlpZiAoIU1vZGlmaWVyLmlzUHJpdmF0ZShub2RlLmdldE1vZGlmaWVycygpKSkgewotCQkJCQlJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSBnZXRQYWNrYWdlQmluZGluZyhwYXJhbWV0ZXJCaW5kaW5nKTsKLQkJCQkJaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwpIHsKLQkJCQkJCXRoaXMucGFydGlhbE1hbmlmZXN0LnJlY29yZFVzZXNQYWNrYWdlKHRoaXMudHlwZVBhY2thZ2UsIHBhY2thZ2VCaW5kaW5nLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgeworICAgICAgICBJTWV0aG9kQmluZGluZyBiaW5kaW5nID0gbm9kZS5yZXNvbHZlQmluZGluZygpOworICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyByZXR1cm4gdmFsdWUKKyAgICAgICAgaWYgKGJpbmRpbmcuZ2V0UmV0dXJuVHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBmcW4gPSBiaW5kaW5nLmdldFJldHVyblR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCk7CisgICAgICAgICAgICBpZiAoISJ2b2lkIi5lcXVhbHMoZnFuKSkgeworICAgICAgICAgICAgICAgIHJlY29yZFR5cGVCaW5kaW5nKGJpbmRpbmcuZ2V0UmV0dXJuVHlwZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzUHJpdmF0ZShub2RlLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgICAgICAgICBJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSBnZXRQYWNrYWdlQmluZGluZyhiaW5kaW5nLmdldFJldHVyblR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlQmluZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRVc2VzUGFja2FnZSh0aGlzLnR5cGVQYWNrYWdlLCBwYWNrYWdlQmluZGluZy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHRocm93cyBjbGF1c2UKKyAgICAgICAgaWYgKGJpbmRpbmcuZ2V0RXhjZXB0aW9uVHlwZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKElUeXBlQmluZGluZyBleGNlcHRpb25CaW5kaW5nIDogYmluZGluZy5nZXRFeGNlcHRpb25UeXBlcygpKSB7CisgICAgICAgICAgICAgICAgcmVjb3JkVHlwZUJpbmRpbmcoZXhjZXB0aW9uQmluZGluZyk7CisgICAgICAgICAgICAgICAgaWYgKCFNb2RpZmllci5pc1ByaXZhdGUobm9kZS5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgSVBhY2thZ2VCaW5kaW5nIHBhY2thZ2VCaW5kaW5nID0gZ2V0UGFja2FnZUJpbmRpbmcoZXhjZXB0aW9uQmluZGluZyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlQmluZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRVc2VzUGFja2FnZSh0aGlzLnR5cGVQYWNrYWdlLCBwYWNrYWdlQmluZGluZy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHBhcmFtZXRlcgorICAgICAgICBpZiAoYmluZGluZy5nZXRQYXJhbWV0ZXJUeXBlcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSVR5cGVCaW5kaW5nIHBhcmFtZXRlckJpbmRpbmcgOiBiaW5kaW5nLmdldFBhcmFtZXRlclR5cGVzKCkpIHsKKyAgICAgICAgICAgICAgICByZWNvcmRUeXBlQmluZGluZyhwYXJhbWV0ZXJCaW5kaW5nKTsKKyAgICAgICAgICAgICAgICBpZiAoIU1vZGlmaWVyLmlzUHJpdmF0ZShub2RlLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgICAgICAgICBJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmcgPSBnZXRQYWNrYWdlQmluZGluZyhwYXJhbWV0ZXJCaW5kaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VCaW5kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFydGlhbE1hbmlmZXN0LnJlY29yZFVzZXNQYWNrYWdlKHRoaXMudHlwZVBhY2thZ2UsIHBhY2thZ2VCaW5kaW5nLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJSU1ldGhvZEJpbmRpbmcgYmluZGluZyA9IG5vZGUucmVzb2x2ZU1ldGhvZEJpbmRpbmcoKTsKLQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotCQkJcmVjb3JkVHlwZUJpbmRpbmcoYmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpKTsKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7CisgICAgICAgIElNZXRob2RCaW5kaW5nIGJpbmRpbmcgPSBub2RlLnJlc29sdmVNZXRob2RCaW5kaW5nKCk7CisgICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlY29yZFR5cGVCaW5kaW5nKGJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKSk7CiAKLQkJCS8vIHJldHVybiB2YWx1ZQotCQkJaWYgKGJpbmRpbmcuZ2V0UmV0dXJuVHlwZSgpICE9IG51bGwpIHsKLQkJCQlyZWNvcmRUeXBlQmluZGluZyhiaW5kaW5nLmdldFJldHVyblR5cGUoKSk7Ci0JCQl9Ci0JCQkvLyBwYXJhbWV0ZXIKLQkJCWlmIChiaW5kaW5nLmdldFBhcmFtZXRlclR5cGVzKCkgIT0gbnVsbCkgewotCQkJCWZvciAoSVR5cGVCaW5kaW5nIHBhcmFtZXRlckJpbmRpbmcgOiBiaW5kaW5nLmdldFBhcmFtZXRlclR5cGVzKCkpIHsKLQkJCQkJcmVjb3JkVHlwZUJpbmRpbmcocGFyYW1ldGVyQmluZGluZyk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgeworICAgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlCisgICAgICAgICAgICBpZiAoYmluZGluZy5nZXRSZXR1cm5UeXBlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlY29yZFR5cGVCaW5kaW5nKGJpbmRpbmcuZ2V0UmV0dXJuVHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHBhcmFtZXRlcgorICAgICAgICAgICAgaWYgKGJpbmRpbmcuZ2V0UGFyYW1ldGVyVHlwZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChJVHlwZUJpbmRpbmcgcGFyYW1ldGVyQmluZGluZyA6IGJpbmRpbmcuZ2V0UGFyYW1ldGVyVHlwZXMoKSkgeworICAgICAgICAgICAgICAgICAgICByZWNvcmRUeXBlQmluZGluZyhwYXJhbWV0ZXJCaW5kaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CiAKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE5vcm1hbEFubm90YXRpb24gbm9kZSkgewotCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCXJlY29yZFR5cGVCaW5kaW5nKGJpbmRpbmcpOwotCQl0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRVc2VzUGFja2FnZSh0aGlzLnR5cGVQYWNrYWdlLCBnZXRQYWNrYWdlQmluZGluZyhiaW5kaW5nKS5nZXROYW1lKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KE5vcm1hbEFubm90YXRpb24gbm9kZSkgeworICAgICAgICBJVHlwZUJpbmRpbmcgYmluZGluZyA9IG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7CisgICAgICAgIHJlY29yZFR5cGVCaW5kaW5nKGJpbmRpbmcpOworICAgICAgICB0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRVc2VzUGFja2FnZSh0aGlzLnR5cGVQYWNrYWdlLCBnZXRQYWNrYWdlQmluZGluZyhiaW5kaW5nKS5nZXROYW1lKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkTmFtZSBub2RlKSB7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KFF1YWxpZmllZE5hbWUgbm9kZSkgeworICAgICAgICBJQmluZGluZyBiaW5kaW5nID0gbm9kZS5yZXNvbHZlQmluZGluZygpOwogCi0JCWlmIChpc1ZhbGlkKGJpbmRpbmcpKSB7Ci0JCQkvLyBSZWNvcmQgdGhlIGRlY2xhcmVkIHR5cGUuCi0JCQlyZWNvcmRUeXBlQmluZGluZyhub2RlLnJlc29sdmVUeXBlQmluZGluZygpKTsKKyAgICAgICAgaWYgKGlzVmFsaWQoYmluZGluZykpIHsKKyAgICAgICAgICAgIC8vIFJlY29yZCB0aGUgZGVjbGFyZWQgdHlwZS4KKyAgICAgICAgICAgIHJlY29yZFR5cGVCaW5kaW5nKG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCkpOwogCi0JCQkvLyBSZWNvcmQgdGhlIGRlY2xhcmluZyB0eXBlLgotCQkJaWYgKGJpbmRpbmcuZ2V0S2luZCgpID09IElCaW5kaW5nLlZBUklBQkxFKSB7Ci0JCQkJcmVjb3JkVHlwZUJpbmRpbmcoKChJVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nKS5nZXREZWNsYXJpbmdDbGFzcygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgICAgICAgICAvLyBSZWNvcmQgdGhlIGRlY2xhcmluZyB0eXBlLgorICAgICAgICAgICAgaWYgKGJpbmRpbmcuZ2V0S2luZCgpID09IElCaW5kaW5nLlZBUklBQkxFKSB7CisgICAgICAgICAgICAgICAgcmVjb3JkVHlwZUJpbmRpbmcoKChJVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nKS5nZXREZWNsYXJpbmdDbGFzcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU2ltcGxlTmFtZSBub2RlKSB7Ci0JCVN0cmluZyBmcW4gPSBub2RlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQlyZWNvcmRGdWxseVF1YWxpZmllZE5hbWUoZnFuKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW1wbGVOYW1lIG5vZGUpIHsKKyAgICAgICAgU3RyaW5nIGZxbiA9IG5vZGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7CisgICAgICAgIHJlY29yZEZ1bGx5UXVhbGlmaWVkTmFtZShmcW4pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAKLQkvKioKLQkgKiBJdCBpcyBpbXBvcnRhbnQgdG8gcmVjb3JkIHRoZSB0eXBlIGJpbmRpbmcgb25seSBpZiBpdCBpcyBub3QgcmVjb3ZlcmVkLiBSZWNvdmVyZWQgYmluZGluZ3Mgb2NjdXIgZm9yIGludmFsaWQKLQkgKiBzb3VyY2UgY29kZSBhbmQgaW5jb21wbGV0ZSBjbGFzcyBwYXRocy4KLQkgKiAKLQkgKiBAcGFyYW0gYmluZGluZwotCSAqICAgICAgICAgICAgdGhlIGJpbmRpbmcgd2hpY2ggbWF5IGJlIHJlY29yZGVkCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgYmluZGluZyBzaG91bGQgYmUgcmVjb3JkZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChJQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiBiaW5kaW5nICE9IG51bGwgJiYgIWJpbmRpbmcuaXNSZWNvdmVyZWQoKTsKLQl9CisgICAgLyoqCisgICAgICogSXQgaXMgaW1wb3J0YW50IHRvIHJlY29yZCB0aGUgdHlwZSBiaW5kaW5nIG9ubHkgaWYgaXQgaXMgbm90IHJlY292ZXJlZC4gUmVjb3ZlcmVkIGJpbmRpbmdzIG9jY3VyIGZvciBpbnZhbGlkCisgICAgICogc291cmNlIGNvZGUgYW5kIGluY29tcGxldGUgY2xhc3MgcGF0aHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZGluZyB0aGUgYmluZGluZyB3aGljaCBtYXkgYmUgcmVjb3JkZWQKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoZSBiaW5kaW5nIHNob3VsZCBiZSByZWNvcmRlZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKElCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmcgIT0gbnVsbCAmJiAhYmluZGluZy5pc1JlY292ZXJlZCgpOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW1wbGVUeXBlIG5vZGUpIHsKLQkJaWYgKGlzVmFsaWQobm9kZS5yZXNvbHZlQmluZGluZygpKSkgewotCQkJcmVjb3JkVHlwZUJpbmRpbmcobm9kZS5yZXNvbHZlQmluZGluZygpKTsKLQkJfSBlbHNlIHsKLQkJCU5hbWUgc2ltcGxlTmFtZSA9IG5vZGUuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGZxbiA9IHNpbXBsZU5hbWUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQlyZWNvcmRGdWxseVF1YWxpZmllZE5hbWUoZnFuKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KFNpbXBsZVR5cGUgbm9kZSkgeworICAgICAgICBpZiAoaXNWYWxpZChub2RlLnJlc29sdmVCaW5kaW5nKCkpKSB7CisgICAgICAgICAgICByZWNvcmRUeXBlQmluZGluZyhub2RlLnJlc29sdmVCaW5kaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTmFtZSBzaW1wbGVOYW1lID0gbm9kZS5nZXROYW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgZnFuID0gc2ltcGxlTmFtZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKKyAgICAgICAgICAgIHJlY29yZEZ1bGx5UXVhbGlmaWVkTmFtZShmcW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5vZGUpIHsKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBub2RlLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlyZWNvcmRUeXBlQmluZGluZyhiaW5kaW5nKTsKLQkJdGhpcy5wYXJ0aWFsTWFuaWZlc3QucmVjb3JkVXNlc1BhY2thZ2UodGhpcy50eXBlUGFja2FnZSwgZ2V0UGFja2FnZUJpbmRpbmcoYmluZGluZykuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5vZGUpIHsKKyAgICAgICAgSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBub2RlLnJlc29sdmVUeXBlQmluZGluZygpOworICAgICAgICByZWNvcmRUeXBlQmluZGluZyhiaW5kaW5nKTsKKyAgICAgICAgdGhpcy5wYXJ0aWFsTWFuaWZlc3QucmVjb3JkVXNlc1BhY2thZ2UodGhpcy50eXBlUGFja2FnZSwgZ2V0UGFja2FnZUJpbmRpbmcoYmluZGluZykuZ2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCUlUeXBlQmluZGluZyBiaW5kaW5nID0gbm9kZS5yZXNvbHZlQmluZGluZygpOwotCQlpZiAoYmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBiaW5kaW5nLmdldEJpbmFyeU5hbWUoKTsKLQkJdGhpcy50eXBlUGFja2FnZSA9IGdldFBhY2thZ2VCaW5kaW5nKGJpbmRpbmcpLmdldE5hbWUoKTsKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKKyAgICAgICAgSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7CisgICAgICAgIGlmIChiaW5kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbmFtZSA9IGJpbmRpbmcuZ2V0QmluYXJ5TmFtZSgpOworICAgICAgICB0aGlzLnR5cGVQYWNrYWdlID0gZ2V0UGFja2FnZUJpbmRpbmcoYmluZGluZykuZ2V0TmFtZSgpOwogCi0JCWlmICghbm9kZS5pc0xvY2FsVHlwZURlY2xhcmF0aW9uKCkpIHsKLQkJCXRoaXMucGFydGlhbE1hbmlmZXN0LnJlY29yZFR5cGUobmFtZSk7Ci0JCX0KKyAgICAgICAgaWYgKCFub2RlLmlzTG9jYWxUeXBlRGVjbGFyYXRpb24oKSkgeworICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWFuaWZlc3QucmVjb3JkVHlwZShuYW1lKTsKKyAgICAgICAgfQogCi0JCWZvciAoU3RyaW5nIHJlZmVyZW5jZWRUeXBlIDogdGhpcy5yZWZlcmVuY2VkVHlwZXMpIHsKLQkJCXJlY29yZEZ1bGx5UXVhbGlmaWVkTmFtZShyZWZlcmVuY2VkVHlwZSk7Ci0JCX0KKyAgICAgICAgZm9yIChTdHJpbmcgcmVmZXJlbmNlZFR5cGUgOiB0aGlzLnJlZmVyZW5jZWRUeXBlcykgeworICAgICAgICAgICAgcmVjb3JkRnVsbHlRdWFsaWZpZWROYW1lKHJlZmVyZW5jZWRUeXBlKTsKKyAgICAgICAgfQogCi0JCWlmIChub2RlLmdldFN1cGVyY2xhc3NUeXBlKCkgIT0gbnVsbCkgewotCQkJSVR5cGVCaW5kaW5nIHN1cGVyQ2xhc3NCaW5kaW5nID0gbm9kZS5nZXRTdXBlcmNsYXNzVHlwZSgpLnJlc29sdmVCaW5kaW5nKCk7Ci0JCQlyZWNvcmRUeXBlQmluZGluZyhzdXBlckNsYXNzQmluZGluZyk7Ci0JCQl0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRVc2VzUGFja2FnZSh0aGlzLnR5cGVQYWNrYWdlLCBnZXRQYWNrYWdlQmluZGluZyhzdXBlckNsYXNzQmluZGluZykuZ2V0TmFtZSgpKTsKLQkJfQorICAgICAgICBpZiAobm9kZS5nZXRTdXBlcmNsYXNzVHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIElUeXBlQmluZGluZyBzdXBlckNsYXNzQmluZGluZyA9IG5vZGUuZ2V0U3VwZXJjbGFzc1R5cGUoKS5yZXNvbHZlQmluZGluZygpOworICAgICAgICAgICAgcmVjb3JkVHlwZUJpbmRpbmcoc3VwZXJDbGFzc0JpbmRpbmcpOworICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWFuaWZlc3QucmVjb3JkVXNlc1BhY2thZ2UodGhpcy50eXBlUGFja2FnZSwgZ2V0UGFja2FnZUJpbmRpbmcoc3VwZXJDbGFzc0JpbmRpbmcpLmdldE5hbWUoKSk7CisgICAgICAgIH0KIAotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGUuc3VwZXJJbnRlcmZhY2VUeXBlcygpLnNpemUoKTsgaSsrKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZSBpbnRlcmZhY2VUeXBlID0gKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlKSBub2RlLnN1cGVySW50ZXJmYWNlVHlwZXMoKQotCQkJCQkuZ2V0KGkpOwotCQkJSVR5cGVCaW5kaW5nIGludGVyZmFjZUJpbmRpbmcgPSBpbnRlcmZhY2VUeXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCQlyZWNvcmRUeXBlQmluZGluZyhpbnRlcmZhY2VCaW5kaW5nKTsKLQkJCXRoaXMucGFydGlhbE1hbmlmZXN0LnJlY29yZFVzZXNQYWNrYWdlKHRoaXMudHlwZVBhY2thZ2UsIGdldFBhY2thZ2VCaW5kaW5nKGludGVyZmFjZUJpbmRpbmcpLmdldE5hbWUoKSk7Ci0JCX0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLnN1cGVySW50ZXJmYWNlVHlwZXMoKS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUgaW50ZXJmYWNlVHlwZSA9IChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZSkgbm9kZS5zdXBlckludGVyZmFjZVR5cGVzKCkuZ2V0KGkpOworICAgICAgICAgICAgSVR5cGVCaW5kaW5nIGludGVyZmFjZUJpbmRpbmcgPSBpbnRlcmZhY2VUeXBlLnJlc29sdmVCaW5kaW5nKCk7CisgICAgICAgICAgICByZWNvcmRUeXBlQmluZGluZyhpbnRlcmZhY2VCaW5kaW5nKTsKKyAgICAgICAgICAgIHRoaXMucGFydGlhbE1hbmlmZXN0LnJlY29yZFVzZXNQYWNrYWdlKHRoaXMudHlwZVBhY2thZ2UsIGdldFBhY2thZ2VCaW5kaW5nKGludGVyZmFjZUJpbmRpbmcpLmdldE5hbWUoKSk7CisgICAgICAgIH0KIAotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWlmIChiaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRUeXBlKGJpbmRpbmcuZ2V0QmluYXJ5TmFtZSgpKTsKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7CisgICAgICAgIElUeXBlQmluZGluZyBiaW5kaW5nID0gbm9kZS5yZXNvbHZlQmluZGluZygpOworICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5wYXJ0aWFsTWFuaWZlc3QucmVjb3JkVHlwZShiaW5kaW5nLmdldEJpbmFyeU5hbWUoKSk7CiAKLQkJSVR5cGVCaW5kaW5nIHN1cGVyQ2xhc3NCaW5kaW5nID0gYmluZGluZy5nZXRTdXBlcmNsYXNzKCk7Ci0JCWlmIChzdXBlckNsYXNzQmluZGluZyAhPSBudWxsKSB7Ci0JCQlyZWNvcmRUeXBlQmluZGluZyhzdXBlckNsYXNzQmluZGluZyk7Ci0JCQl0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRVc2VzUGFja2FnZSh0aGlzLnR5cGVQYWNrYWdlLCBnZXRQYWNrYWdlQmluZGluZyhzdXBlckNsYXNzQmluZGluZykuZ2V0TmFtZSgpKTsKLQkJfQorICAgICAgICBJVHlwZUJpbmRpbmcgc3VwZXJDbGFzc0JpbmRpbmcgPSBiaW5kaW5nLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgaWYgKHN1cGVyQ2xhc3NCaW5kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlY29yZFR5cGVCaW5kaW5nKHN1cGVyQ2xhc3NCaW5kaW5nKTsKKyAgICAgICAgICAgIHRoaXMucGFydGlhbE1hbmlmZXN0LnJlY29yZFVzZXNQYWNrYWdlKHRoaXMudHlwZVBhY2thZ2UsIGdldFBhY2thZ2VCaW5kaW5nKHN1cGVyQ2xhc3NCaW5kaW5nKS5nZXROYW1lKCkpOworICAgICAgICB9CiAKLQkJSVR5cGVCaW5kaW5nW10gaW50ZXJmYWNlQmluZGluZ3MgPSBiaW5kaW5nLmdldEludGVyZmFjZXMoKTsKLQkJaWYgKGludGVyZmFjZUJpbmRpbmdzICE9IG51bGwpIHsKLQkJCWZvciAoSVR5cGVCaW5kaW5nIGludGVyZmFjZUJpbmRpbmcgOiBpbnRlcmZhY2VCaW5kaW5ncykgewotCQkJCXJlY29yZFR5cGVCaW5kaW5nKGludGVyZmFjZUJpbmRpbmcpOwotCQkJCXRoaXMucGFydGlhbE1hbmlmZXN0LnJlY29yZFVzZXNQYWNrYWdlKHRoaXMudHlwZVBhY2thZ2UsIGdldFBhY2thZ2VCaW5kaW5nKGludGVyZmFjZUJpbmRpbmcpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgSVR5cGVCaW5kaW5nW10gaW50ZXJmYWNlQmluZGluZ3MgPSBiaW5kaW5nLmdldEludGVyZmFjZXMoKTsKKyAgICAgICAgaWYgKGludGVyZmFjZUJpbmRpbmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoSVR5cGVCaW5kaW5nIGludGVyZmFjZUJpbmRpbmcgOiBpbnRlcmZhY2VCaW5kaW5ncykgeworICAgICAgICAgICAgICAgIHJlY29yZFR5cGVCaW5kaW5nKGludGVyZmFjZUJpbmRpbmcpOworICAgICAgICAgICAgICAgIHRoaXMucGFydGlhbE1hbmlmZXN0LnJlY29yZFVzZXNQYWNrYWdlKHRoaXMudHlwZVBhY2thZ2UsIGdldFBhY2thZ2VCaW5kaW5nKGludGVyZmFjZUJpbmRpbmcpLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWlmIChiaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKKyAgICAgICAgSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7CisgICAgICAgIGlmIChiaW5kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogCi0JCVN0cmluZyBuYW1lID0gYmluZGluZy5nZXRCaW5hcnlOYW1lKCk7Ci0JCXRoaXMudHlwZVBhY2thZ2UgPSBnZXRQYWNrYWdlQmluZGluZyhiaW5kaW5nKS5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBuYW1lID0gYmluZGluZy5nZXRCaW5hcnlOYW1lKCk7CisgICAgICAgIHRoaXMudHlwZVBhY2thZ2UgPSBnZXRQYWNrYWdlQmluZGluZyhiaW5kaW5nKS5nZXROYW1lKCk7CiAKLQkJdGhpcy5wYXJ0aWFsTWFuaWZlc3QucmVjb3JkVHlwZShuYW1lKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQorICAgICAgICB0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRUeXBlKG5hbWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRW51bURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBub2RlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWlmIChiaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChFbnVtRGVjbGFyYXRpb24gbm9kZSkgeworICAgICAgICBJVHlwZUJpbmRpbmcgYmluZGluZyA9IG5vZGUucmVzb2x2ZUJpbmRpbmcoKTsKKyAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAKLQkJU3RyaW5nIG5hbWUgPSBiaW5kaW5nLmdldEJpbmFyeU5hbWUoKTsKLQkJdGhpcy50eXBlUGFja2FnZSA9IGdldFBhY2thZ2VCaW5kaW5nKGJpbmRpbmcpLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBiaW5kaW5nLmdldEJpbmFyeU5hbWUoKTsKKyAgICAgICAgdGhpcy50eXBlUGFja2FnZSA9IGdldFBhY2thZ2VCaW5kaW5nKGJpbmRpbmcpLmdldE5hbWUoKTsKIAotCQl0aGlzLnBhcnRpYWxNYW5pZmVzdC5yZWNvcmRUeXBlKG5hbWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgICAgIHRoaXMucGFydGlhbE1hbmlmZXN0LnJlY29yZFR5cGUobmFtZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCXByaXZhdGUgSVBhY2thZ2VCaW5kaW5nIGdldFBhY2thZ2VCaW5kaW5nKElUeXBlQmluZGluZyBiaW5kaW5nKSB7Ci0JCWlmIChiaW5kaW5nICE9IG51bGwpIHsKLQkJCWlmIChiaW5kaW5nLmlzQXJyYXkoKSkgewotCQkJCXJldHVybiBnZXRQYWNrYWdlQmluZGluZyhiaW5kaW5nLmdldENvbXBvbmVudFR5cGUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBiaW5kaW5nLmdldFBhY2thZ2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgcHJpdmF0ZSBJUGFja2FnZUJpbmRpbmcgZ2V0UGFja2FnZUJpbmRpbmcoSVR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGJpbmRpbmcuaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFBhY2thZ2VCaW5kaW5nKGJpbmRpbmcuZ2V0Q29tcG9uZW50VHlwZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRpbmcuZ2V0UGFja2FnZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXByaXZhdGUgU3RyaW5nIHJlY29yZEZ1bGx5UXVhbGlmaWVkTmFtZShTdHJpbmcgZnFuKSB7Ci0JCWlmICghInZvaWQiLmVxdWFscyhmcW4pKSB7Ci0JCQlpZiAodGhpcy50eXBlUGFja2FnZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5yZWZlcmVuY2VkVHlwZXMuYWRkKGZxbik7Ci0JCQkJcmV0dXJuIGZxbjsKLQkJCX0gZWxzZSBpZiAoZnFuICE9IG51bGwgJiYgIXRoaXMudHlwZVBhY2thZ2UuZXF1YWxzKGdldFBhY2thZ2VOYW1lKGZxbikpKSB7Ci0JCQkJLy8gVGhpcyBpcyByZXF1aXJlZCB0byBnZXQgRlFDTnMgb2YgdGhlIGZvcm0KLQkJCQkvLyBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuUmVmbGVjdGlvblV0aWxzLk1ldGhvZENhbGxiYWNrIGNvcnJlY3RseSBkZXRlY3RlZAotCQkJCVN0cmluZ1Rva2VuaXplciBzZWdtZW50cyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZnFuLCAiLiIpOwotCQkJCWlmIChzZWdtZW50cy5jb3VudFRva2VucygpID4gMSkgewotCQkJCQlMaXN0PFN0cmluZz4gbmV3U2VnbWVudHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCQkJd2hpbGUgKHNlZ21lbnRzLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJU3RyaW5nIHNlZ21lbnQgPSBzZWdtZW50cy5uZXh0VG9rZW4oKTsKLQkJCQkJCW5ld1NlZ21lbnRzLmFkZChzZWdtZW50KTsKLQkJCQkJCWlmICghQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHNlZ21lbnQuY2hhckF0KDApKSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZxbiA9IFN0cmluZ1V0aWxzLmpvaW4obmV3U2VnbWVudHMsICIuIik7Ci0JCQkJfQorICAgIHByaXZhdGUgU3RyaW5nIHJlY29yZEZ1bGx5UXVhbGlmaWVkTmFtZShTdHJpbmcgZnFuKSB7CisgICAgICAgIGlmICghInZvaWQiLmVxdWFscyhmcW4pKSB7CisgICAgICAgICAgICBpZiAodGhpcy50eXBlUGFja2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2VkVHlwZXMuYWRkKGZxbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZxbjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZnFuICE9IG51bGwgJiYgIXRoaXMudHlwZVBhY2thZ2UuZXF1YWxzKGdldFBhY2thZ2VOYW1lKGZxbikpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyByZXF1aXJlZCB0byBnZXQgRlFDTnMgb2YgdGhlIGZvcm0KKyAgICAgICAgICAgICAgICAvLyBvcmcuc3ByaW5nZnJhbWV3b3JrLnV0aWwuUmVmbGVjdGlvblV0aWxzLk1ldGhvZENhbGxiYWNrIGNvcnJlY3RseSBkZXRlY3RlZAorICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzZWdtZW50cyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZnFuLCAiLiIpOworICAgICAgICAgICAgICAgIGlmIChzZWdtZW50cy5jb3VudFRva2VucygpID4gMSkgeworICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gbmV3U2VnbWVudHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHNlZ21lbnRzLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlZ21lbnQgPSBzZWdtZW50cy5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NlZ21lbnRzLmFkZChzZWdtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHNlZ21lbnQuY2hhckF0KDApKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZxbiA9IFN0cmluZ1V0aWxzLmpvaW4obmV3U2VnbWVudHMsICIuIik7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJdGhpcy5wYXJ0aWFsTWFuaWZlc3QucmVjb3JkUmVmZXJlbmNlZFR5cGUoZnFuKTsKLQkJCQlyZXR1cm4gZnFuOwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsKLQl9CisgICAgICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWFuaWZlc3QucmVjb3JkUmVmZXJlbmNlZFR5cGUoZnFuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnFuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CiAKLQlwcml2YXRlIFN0cmluZyBnZXRQYWNrYWdlTmFtZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQlpZiAoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJaW50IGluZGV4ID0gZnVsbHlRdWFsaWZpZWRUeXBlTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgIHByaXZhdGUgU3RyaW5nIGdldFBhY2thZ2VOYW1lKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lKSB7CisgICAgICAgIGlmIChmdWxseVF1YWxpZmllZFR5cGVOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICBpbnQgaW5kZXggPSBmdWxseVF1YWxpZmllZFR5cGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7CiAKLQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCXJldHVybiBmdWxseVF1YWxpZmllZFR5cGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0KKyAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBmdWxseVF1YWxpZmllZFR5cGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgIH0KIAotCQlyZXR1cm4gIiI7Ci0JfQorICAgICAgICByZXR1cm4gIiI7CisgICAgfQogCi0JcHJpdmF0ZSBTdHJpbmcgcmVjb3JkVHlwZUJpbmRpbmcoSVR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKLQkJaWYgKGJpbmRpbmcgIT0gbnVsbCkgewotCQkJaWYgKGJpbmRpbmcuaXNBcnJheSgpKSB7Ci0JCQkJcmV0dXJuIHJlY29yZFR5cGVCaW5kaW5nKGJpbmRpbmcuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RyaW5nIGZxbiA9IGJpbmRpbmcuZ2V0QmluYXJ5TmFtZSgpOwotCQkJCXJldHVybiByZWNvcmRGdWxseVF1YWxpZmllZE5hbWUoZnFuKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIiI7Ci0JfQorICAgIHByaXZhdGUgU3RyaW5nIHJlY29yZFR5cGVCaW5kaW5nKElUeXBlQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgIGlmIChiaW5kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChiaW5kaW5nLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZWNvcmRUeXBlQmluZGluZyhiaW5kaW5nLmdldENvbXBvbmVudFR5cGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyBmcW4gPSBiaW5kaW5nLmdldEJpbmFyeU5hbWUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkRnVsbHlRdWFsaWZpZWROYW1lKGZxbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL2pkdC9jb3JlL0FzdFR5cGVBcnRpZmFjdEFuYWx5c2VyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvamR0L2NvcmUvQXN0VHlwZUFydGlmYWN0QW5hbHlzZXIuamF2YQppbmRleCBhYTcyNjM1Li5jMjQ4NTNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvamR0L2NvcmUvQXN0VHlwZUFydGlmYWN0QW5hbHlzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvamR0L2NvcmUvQXN0VHlwZUFydGlmYWN0QW5hbHlzZXIuamF2YQpAQCAtMjUsNjYgKzI1LDY4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uYnVuZGxvci5zdXBwb3J0LnBhcnRpYWxtYW5pZmVzdC5QYXJ0aWFsTWFuaWZlc3Q7CiAKIC8qKgotICoge0BsaW5rIEFydGVmYWN0QW5hbHlzZXJ9IHRoYXQgaXMgZGVsZWdhdGVzIHRvIEpEVCBBU1Qgc2Nhbm5pbmcgPC9wPiA8c3Ryb25nPkNvbmN1cnJlbnQgU2VtYW50aWNzPC9zdHJvbmc+PGJyIC8+CisgKiB7QGxpbmsgQXJ0ZWZhY3RBbmFseXNlcn0gdGhhdCBpcyBkZWxlZ2F0ZXMgdG8gSkRUIEFTVCBzY2FubmluZworICogPC9wPgorICogPHN0cm9uZz5Db25jdXJyZW50IFNlbWFudGljczwvc3Ryb25nPjxiciAvPgogICogTm90IHRocmVhZHNhZmUuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqLwogcHVibGljIGNsYXNzIEFzdFR5cGVBcnRpZmFjdEFuYWx5c2VyIGltcGxlbWVudHMgQXJ0aWZhY3RBbmFseXplciB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9FWFQgPSAiLmphdmEiOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRVhUID0gIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAogCi0JcHJpdmF0ZSBmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7CiAKLQlwdWJsaWMgQXN0VHlwZUFydGlmYWN0QW5hbHlzZXIoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQl9CisgICAgcHVibGljIEFzdFR5cGVBcnRpZmFjdEFuYWx5c2VyKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgeworICAgICAgICB0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIGFuYWx5c2UoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBuYW1lLCBQYXJ0aWFsTWFuaWZlc3QgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7Ci0JCXBhcnNlci5zZXRQcm9qZWN0KGphdmFQcm9qZWN0KTsKLQkJcGFyc2VyLnNldFNvdXJjZShjb252ZXJ0U3RyZWFtVG9TdHJpbmcoaXMpLnRvQ2hhckFycmF5KCkpOwotCQlwYXJzZXIuc2V0VW5pdE5hbWUobmFtZSk7Ci0JCXBhcnNlci5zZXRSZXNvbHZlQmluZGluZ3ModHJ1ZSk7Ci0JCXBhcnNlci5zZXRCaW5kaW5nc1JlY292ZXJ5KHRydWUpOwotCQlwYXJzZXIuc2V0U3RhdGVtZW50c1JlY292ZXJ5KHRydWUpOwotCQlBU1ROb2RlIG5vZGUgPSBwYXJzZXIuY3JlYXRlQVNUKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlub2RlLmFjY2VwdChuZXcgQXJ0aWZhY3RBbmFseXNlclR5cGVWaXNpdG9yKG1vZGVsKSk7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhbmFseXNlKElucHV0U3RyZWFtIGlzLCBTdHJpbmcgbmFtZSwgUGFydGlhbE1hbmlmZXN0IG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOworICAgICAgICBwYXJzZXIuc2V0UHJvamVjdCh0aGlzLmphdmFQcm9qZWN0KTsKKyAgICAgICAgcGFyc2VyLnNldFNvdXJjZShjb252ZXJ0U3RyZWFtVG9TdHJpbmcoaXMpLnRvQ2hhckFycmF5KCkpOworICAgICAgICBwYXJzZXIuc2V0VW5pdE5hbWUobmFtZSk7CisgICAgICAgIHBhcnNlci5zZXRSZXNvbHZlQmluZGluZ3ModHJ1ZSk7CisgICAgICAgIHBhcnNlci5zZXRCaW5kaW5nc1JlY292ZXJ5KHRydWUpOworICAgICAgICBwYXJzZXIuc2V0U3RhdGVtZW50c1JlY292ZXJ5KHRydWUpOworICAgICAgICBBU1ROb2RlIG5vZGUgPSBwYXJzZXIuY3JlYXRlQVNUKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICBub2RlLmFjY2VwdChuZXcgQXJ0aWZhY3RBbmFseXNlclR5cGVWaXNpdG9yKG1vZGVsKSk7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkFuYWx5c2UoU3RyaW5nIG5hbWUpIHsKLQkJLy8gRm9yIG5vdyBvbmx5IGFjY2VwdCBzb3VyY2UgZmlsZXMKLQkJLy8gVE9ETyBkb2VzIGl0IHdvcmsgd2l0aCAuY2xhc3MgZmlsZXMgYXMgd2VsbD8KLQkJcmV0dXJuIG5hbWUuZW5kc1dpdGgoSkFWQV9FWFQpOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY2FuQW5hbHlzZShTdHJpbmcgbmFtZSkgeworICAgICAgICAvLyBGb3Igbm93IG9ubHkgYWNjZXB0IHNvdXJjZSBmaWxlcworICAgICAgICAvLyBUT0RPIGRvZXMgaXQgd29yayB3aXRoIC5jbGFzcyBmaWxlcyBhcyB3ZWxsPworICAgICAgICByZXR1cm4gbmFtZS5lbmRzV2l0aChKQVZBX0VYVCk7CisgICAgfQogCi0JLyoqCi0JICogQ29udmVydHMgYW4ge0BsaW5rIElucHV0U3RyZWFtfSBpbnRvIGEge0BsaW5rIFN0cmluZ30gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U3RyZWFtVG9TdHJpbmcoSW5wdXRTdHJlYW0gaXMpIHsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOwotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBhbiB7QGxpbmsgSW5wdXRTdHJlYW19IGludG8gYSB7QGxpbmsgU3RyaW5nfSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdHJlYW1Ub1N0cmluZyhJbnB1dFN0cmVhbSBpcykgeworICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCi0JCVN0cmluZyBsaW5lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKGxpbmUpLmFwcGVuZCgiXG4iKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9CisgICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGxpbmUpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCBiYmFjYTZkLi40MzIxYmQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0xLDQgKzEsMyBAQAotI1dlZCBNYXIgMDIgMTY6MDA6MDYgUFNUIDIwMTEKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQpAQCAtOCw2ICs3LDggQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQpAQCAtODIsMzUgKzgzLDM3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249NDgKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnk9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCkBAIC0xMjEsMzAgKzEyNCwzMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbGFtYmRhX2JvZHk9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lcz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xMjAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZGlzYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvZmYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5lbmFibGluZ190YWc9QGZvcm1hdHRlclw6b24KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCkBAIC0xNTgsNyArMTYyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkPWluc2VydApAQCAtMTY2LDEwICsxNzAsMTEgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZW1iZXI9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWw9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfdHlwZV9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydApAQCAtMjE3LDYgKzIyMiw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0yMzUsMTIgKzI0MSwxNCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CkBAIC0yNjQsNiArMjcyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0CkBAIC0yOTEsNiArMzAwLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0zMTksNiArMzI5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3RyeT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydApAQCAtMzI4LDYgKzMzOSw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0zNDMsMTUgKzM1NSwxNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTIwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj1zcGFjZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX29uX29mZl90YWdzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YUZvcm1hdHRlcj1vcmcuZWNsaXBzZS5qZHQuY29yZS5kZWZhdWx0SmF2YUZvcm1hdHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKaW5kZXggN2U3ZmU3My4uNmM5ODAxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0xLDcgKzEsNjUgQEAKK2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9uc19pbnRlcmZhY2VfbWV0aG9kcz10cnVlCitjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAuY29udmVydF9mdW5jdGlvbmFsX2ludGVyZmFjZXM9ZmFsc2UKK2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQorY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9ZmFsc2UKK2NsZWFudXAuaW5zZXJ0X2luZmVycmVkX3R5cGVfYXJndW1lbnRzPWZhbHNlCitjbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3R5cGVfYWJzdHJhY3RfaWZfbWlzc2luZ19tZXRob2Q9ZmFsc2UKK2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQorY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitjbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfcmVkdW5kYW50X3R5cGVfYXJndW1lbnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCitjbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQorY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCitjbGVhbnVwLnVzZV9hbm9ueW1vdXNfY2xhc3NfY3JlYXRpb249ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQorY2xlYW51cC51c2VfbGFtYmRhPXRydWUKK2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwLnVzZV90eXBlX2FyZ3VtZW50cz1mYWxzZQorY2xlYW51cF9wcm9maWxlPV9WaXJnbyBXZWIgU2VydmVyIC0gQ29kZSBDbGVhbiBVcAogY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCiBlZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9NeWx5biBiYXNlZCBvbiBFY2xpcHNlCitmb3JtYXR0ZXJfcHJvZmlsZT1fVmlyZ28gV2ViIFNlcnZlciAtIENvZGUgRm9ybWF0dGVyCiBmb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMgogaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKIG9yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvdWkvQnVuZGxvclVpUGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvdWkvQnVuZGxvclVpUGx1Z2luLmphdmEKaW5kZXggZDMyYzI1My4uZjkyZDQ5NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL3VpL0J1bmRsb3JVaVBsdWdpbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci91aS9CdW5kbG9yVWlQbHVnaW4uamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aTsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKQEAgLTMxLDEwNCArMzIsMTA1IEBACiAKIC8qKgogICogVUkgUGx1Z2luIGZvciBCdW5kbG9yIFVJLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4xLjIKICAqLwogcHVibGljIGNsYXNzIEJ1bmRsb3JVaVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLnVpIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkiOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9CX0ZBTUlMWSA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS5qb2IuZmFtaWx5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0JfRkFNSUxZID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLnVpLmpvYi5mYW1pbHkiOwogCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxvclVpUGx1Z2luIHBsdWdpbjsKKyAgICBwcml2YXRlIHN0YXRpYyBCdW5kbG9yVWlQbHVnaW4gcGx1Z2luOwogCi0JcHVibGljIHN0YXRpYyBCdW5kbG9yVWlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9CisgICAgcHVibGljIHN0YXRpYyBCdW5kbG9yVWlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKKyAgICAgICAgcmV0dXJuIHBsdWdpbjsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7CisgICAgICAgIHBsdWdpbiA9IHRoaXM7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBsdWdpbiA9IG51bGw7CisgICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcGF0aCkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXREZWZhdWx0KCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQlJbWFnZSBpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KHBhdGgpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihwYXRoKTsKLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQl9Ci0JCQlpbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSh0cnVlKTsKLQkJCWltYWdlUmVnaXN0cnkucHV0KHBhdGgsIGltYWdlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKTsKKyAgICAgICAgSW1hZ2UgaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChwYXRoKTsKKyAgICAgICAgaWYgKGltYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZURlc2NyaXB0b3IocGF0aCk7CisgICAgICAgICAgICBpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UodHJ1ZSk7CisgICAgICAgICAgICBpbWFnZVJlZ2lzdHJ5LnB1dChwYXRoLCBpbWFnZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGltYWdlOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsICJpY29ucy8iICsgcGF0aCk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgeworICAgICAgICByZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsICJpY29ucy8iICsgcGF0aCk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bkJ1bmRsb3JPblByb2plY3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCVJ1bkJ1bmRsb3JKb2Igam9iID0gbmV3IFJ1bkJ1bmRsb3JKb2IoamF2YVByb2plY3QpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJ1bkJ1bmRsb3JPblByb2plY3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7CisgICAgICAgIFJ1bkJ1bmRsb3JKb2Igam9iID0gbmV3IFJ1bkJ1bmRsb3JKb2IoamF2YVByb2plY3QpOworICAgICAgICBqb2Iuc2NoZWR1bGUoKTsKKyAgICB9CiAKLQlzdGF0aWMgY2xhc3MgUnVuQnVuZGxvckpvYiBleHRlbmRzIEpvYiB7CisgICAgc3RhdGljIGNsYXNzIFJ1bkJ1bmRsb3JKb2IgZXh0ZW5kcyBKb2IgewogCi0JCXByaXZhdGUgZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OworICAgICAgICBwcml2YXRlIGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKIAotCQlwdWJsaWMgUnVuQnVuZGxvckpvYihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJCXN1cGVyKCJHZW5lcmF0aW5nIE1BTklGRVNULk1GIGZpbGUgZm9yIHByb2plY3QgJyIgKyBqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpICsgIiciKTsKLQkJCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQkJCXNldFByaW9yaXR5KEpvYi5CVUlMRCk7Ci0JCQlzZXRQcm9wZXJ0eShJUHJvZ3Jlc3NDb25zdGFudHMuSUNPTl9QUk9QRVJUWSwgQnVuZGxvclVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9vc2dpX29iai5naWYiKSk7Ci0JCQlzZXRQcm9wZXJ0eShJUHJvZ3Jlc3NDb25zdGFudHMuS0VFUE9ORV9QUk9QRVJUWSwgdHJ1ZSk7Ci0JCX0KKyAgICAgICAgcHVibGljIFJ1bkJ1bmRsb3JKb2IoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7CisgICAgICAgICAgICBzdXBlcigiR2VuZXJhdGluZyBNQU5JRkVTVC5NRiBmaWxlIGZvciBwcm9qZWN0ICciICsgamF2YVByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSArICInIik7CisgICAgICAgICAgICB0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7CisgICAgICAgICAgICBzZXRQcmlvcml0eShKb2IuQlVJTEQpOworICAgICAgICAgICAgc2V0UHJvcGVydHkoSVByb2dyZXNzQ29uc3RhbnRzLklDT05fUFJPUEVSVFksIEJ1bmRsb3JVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvb3NnaV9vYmouZ2lmIikpOworICAgICAgICAgICAgc2V0UHJvcGVydHkoSVByb2dyZXNzQ29uc3RhbnRzLktFRVBPTkVfUFJPUEVSVFksIHRydWUpOworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdHJ5IHsKLQkJCQlqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBCdW5kbG9yQ29yZVBsdWdpbi5CVUlMREVSX0lELAotCQkJCQkJQ29sbGVjdGlvbnMuPFN0cmluZywgU3RyaW5nPiBlbXB0eU1hcCgpLCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5qYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBCdW5kbG9yQ29yZVBsdWdpbi5CVUlMREVSX0lELAorICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy48U3RyaW5nLCBTdHJpbmc+IGVtcHR5TWFwKCksIG1vbml0b3IpOworICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICAgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQkJcmV0dXJuIGZhbWlseSBpbnN0YW5jZW9mIFJ1bkJ1bmRsb3JKb2I7Ci0JCX0KLQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbWlseSBpbnN0YW5jZW9mIFJ1bkJ1bmRsb3JKb2I7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIElDb21tYW5kIGdldEJ1bmRsb3JCdWlsZGVyQ29tbWFuZChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSUNvbW1hbmRbXSBjb21tYW5kcyA9IHJlc291cmNlLmdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpLmdldEJ1aWxkU3BlYygpOwotCQkJCWZvciAoSUNvbW1hbmQgY29tbWFuZCA6IGNvbW1hbmRzKSB7Ci0JCQkJCWlmIChjb21tYW5kLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKEJ1bmRsb3JDb3JlUGx1Z2luLkJVSUxERVJfSUQpKSB7Ci0JCQkJCQlyZXR1cm4gY29tbWFuZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIElDb21tYW5kIGdldEJ1bmRsb3JCdWlsZGVyQ29tbWFuZChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSUNvbW1hbmRbXSBjb21tYW5kcyA9IHJlc291cmNlLmdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpLmdldEJ1aWxkU3BlYygpOworICAgICAgICAgICAgICAgIGZvciAoSUNvbW1hbmQgY29tbWFuZCA6IGNvbW1hbmRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKEJ1bmRsb3JDb3JlUGx1Z2luLkJVSUxERVJfSUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0J1bmRsb3JCdWlsZGluZyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUlDb21tYW5kIGNvbW1hbmQgPSBnZXRCdW5kbG9yQnVpbGRlckNvbW1hbmQocmVzb3VyY2UpOwotCQkJcmV0dXJuIGNvbW1hbmQgIT0gbnVsbCAmJiBjb21tYW5kLmlzQnVpbGRpbmcoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxEKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0J1bmRsb3JCdWlsZGluZyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIElDb21tYW5kIGNvbW1hbmQgPSBnZXRCdW5kbG9yQnVpbGRlckNvbW1hbmQocmVzb3VyY2UpOworICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQgIT0gbnVsbCAmJiBjb21tYW5kLmlzQnVpbGRpbmcoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxEKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL3VpL2ludGVybmFsL2FjdGlvbnMvQXV0b21hdGljUnVuQnVuZGxvckFjdGlvbkRlbGVnYXRlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvdWkvaW50ZXJuYWwvYWN0aW9ucy9BdXRvbWF0aWNSdW5CdW5kbG9yQWN0aW9uRGVsZWdhdGUuamF2YQppbmRleCBiNDEzNzhlLi4yYWM0MjNmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvdWkvaW50ZXJuYWwvYWN0aW9ucy9BdXRvbWF0aWNSdW5CdW5kbG9yQWN0aW9uRGVsZWdhdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvdWkvaW50ZXJuYWwvYWN0aW9ucy9BdXRvbWF0aWNSdW5CdW5kbG9yQWN0aW9uRGVsZWdhdGUuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS5pbnRlcm5hbC5hY3Rpb25zOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKQEAgLTQxLDcxICs0Miw2OCBAQAogCiAvKioKICAqIHtAbGluayBJT2JqZWN0QWN0aW9uRGVsZWdhdGV9IHRvIGVuYWJsZXMvZGlzYWJsZXMgdGhlIGluY3JlbWVudGFsIEJ1bmRsb3IgcHJvamVjdCBidWlsZGVyLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4xLjMKICAqLwogcHVibGljIGNsYXNzIEF1dG9tYXRpY1J1bkJ1bmRsb3JBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIFJ1bkJ1bmRsb3JBY3Rpb25EZWxlZ2F0ZSB7CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJZmluYWwgU2V0PElKYXZhUHJvamVjdD4gcHJvamVjdHMgPSBuZXcgTGlua2VkSGFzaFNldDxJSmF2YVByb2plY3Q+KCk7Ci0JCUl0ZXJhdG9yPElQcm9qZWN0PiBpdGVyID0gZ2V0U2VsZWN0ZWQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChwcm9qZWN0KSkgewotCQkJCXByb2plY3RzLmFkZChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOwotCQkJfQotCQl9Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWZvciAoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0IDogcHJvamVjdHMpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUxpc3Q8SUNvbW1hbmQ+IGNtZHMgPSBBcnJheXMuYXNMaXN0KGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpKTsKLQkJCQkJCUxpc3Q8SUNvbW1hbmQ+IG5ld0NtZHMgPSBuZXcgQXJyYXlMaXN0PElDb21tYW5kPihjbWRzKTsKLQkJCQkJCWlmIChCdW5kbG9yVWlQbHVnaW4uaXNCdW5kbG9yQnVpbGRpbmcocHJvamVjdCkpIHsKLQkJCQkJCQlmb3IgKElDb21tYW5kIGNvbmZpZyA6IGNtZHMpIHsKLQkJCQkJCQkJaWYgKGNvbmZpZy5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhCdW5kbG9yQ29yZVBsdWdpbi5CVUlMREVSX0lEKSkgewotCQkJCQkJCQkJbmV3Q21kcy5yZW1vdmUoY29uZmlnKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJSUNvbW1hbmQgY29tbWFuZCA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5uZXdDb21tYW5kKCk7Ci0JCQkJCQkJY29tbWFuZC5zZXRCdWlsZGVyTmFtZShCdW5kbG9yQ29yZVBsdWdpbi5CVUlMREVSX0lEKTsKLQkJCQkJCQluZXdDbWRzLmFkZChjb21tYW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmICghY21kcy5lcXVhbHMobmV3Q21kcykpIHsKLQkJCQkJCQlkZXNjcmlwdGlvbi5zZXRCdWlsZFNwZWMobmV3Q21kcy50b0FycmF5KG5ldyBJQ29tbWFuZFtdIHt9KSk7Ci0JCQkJCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbW9uaXRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEJ1bmRsb3JVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJCQkJIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBydW5uaW5nIGJ1bmRsb3IuIiwgZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgeworICAgICAgICBmaW5hbCBTZXQ8SUphdmFQcm9qZWN0PiBwcm9qZWN0cyA9IG5ldyBMaW5rZWRIYXNoU2V0PElKYXZhUHJvamVjdD4oKTsKKyAgICAgICAgSXRlcmF0b3I8SVByb2plY3Q+IGl0ZXIgPSBnZXRTZWxlY3RlZCgpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KHByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgcHJvamVjdHMuYWRkKEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKIAotCQl0cnkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkKLQkJCQkJLnJ1bkluVUkoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwgb3AsCi0JCQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEJ1bmRsb3JVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBydW5uaW5nIGJ1bmRsb3IuIiwgZSkpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QgOiBwcm9qZWN0cykgeworICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxJQ29tbWFuZD4gY21kcyA9IEFycmF5cy5hc0xpc3QoZGVzY3JpcHRpb24uZ2V0QnVpbGRTcGVjKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxJQ29tbWFuZD4gbmV3Q21kcyA9IG5ldyBBcnJheUxpc3Q8SUNvbW1hbmQ+KGNtZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJ1bmRsb3JVaVBsdWdpbi5pc0J1bmRsb3JCdWlsZGluZyhwcm9qZWN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSUNvbW1hbmQgY29uZmlnIDogY21kcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKEJ1bmRsb3JDb3JlUGx1Z2luLkJVSUxERVJfSUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDbWRzLnJlbW92ZShjb25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29tbWFuZCBjb21tYW5kID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLm5ld0NvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLnNldEJ1aWxkZXJOYW1lKEJ1bmRsb3JDb3JlUGx1Z2luLkJVSUxERVJfSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NtZHMuYWRkKGNvbW1hbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbWRzLmVxdWFscyhuZXdDbWRzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDbWRzLnRvQXJyYXkobmV3IElDb21tYW5kW10ge30pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBtb25pdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBCdW5kbG9yVWlQbHVnaW4uUExVR0lOX0lELCAiQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHJ1bm5pbmcgYnVuZGxvci4iLCBlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAKLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwgb3AsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAorICAgICAgICAgICAgICAgIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQnVuZGxvclVpUGx1Z2luLlBMVUdJTl9JRCwgIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBydW5uaW5nIGJ1bmRsb3IuIiwgZSkpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQl9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgeworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL3VpL2ludGVybmFsL2FjdGlvbnMvQnVuZGxvclN0YXRlUHJvcGVydHlUZXN0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci91aS9pbnRlcm5hbC9hY3Rpb25zL0J1bmRsb3JTdGF0ZVByb3BlcnR5VGVzdGVyLmphdmEKaW5kZXggYWNiYzhiOS4uZDMwYzg3ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL3VpL2ludGVybmFsL2FjdGlvbnMvQnVuZGxvclN0YXRlUHJvcGVydHlUZXN0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvdWkvaW50ZXJuYWwvYWN0aW9ucy9CdW5kbG9yU3RhdGVQcm9wZXJ0eVRlc3Rlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLnVpLmludGVybmFsLmFjdGlvbnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLlByb3BlcnR5VGVzdGVyOwpAQCAtMTYsMTYgKzE3LDE2IEBACiAKIC8qKgogICoge0BsaW5rIFByb3BlcnR5VGVzdGVyfSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGlmIHRoZSBpbmNyZW1lbnRhbCBCdW5kbG9yIHByb2plY3QgYnVpbGRlciBpcyBlbmFibGUgb24gYSBwcm9qZWN0LgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4xLjMKICAqLwogcHVibGljIGNsYXNzIEJ1bmRsb3JTdGF0ZVByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgewogCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSVJlc291cmNlICYmICJpc0J1bmRsb3JFbmFibGVkIi5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gQnVuZGxvclVpUGx1Z2luLmlzQnVuZGxvckJ1aWxkaW5nKChJUmVzb3VyY2UpIHJlY2VpdmVyKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIHB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7CisgICAgICAgIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIElSZXNvdXJjZSAmJiAiaXNCdW5kbG9yRW5hYmxlZCIuZXF1YWxzKHByb3BlcnR5KSkgeworICAgICAgICAgICAgcmV0dXJuIEJ1bmRsb3JVaVBsdWdpbi5pc0J1bmRsb3JCdWlsZGluZygoSVJlc291cmNlKSByZWNlaXZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxvci91aS9pbnRlcm5hbC9hY3Rpb25zL1J1bkJ1bmRsb3JBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuQnVuZGxvckFjdGlvbkRlbGVnYXRlLmphdmEKaW5kZXggYTNiNDNlNy4uNDcwN2VkNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuQnVuZGxvckFjdGlvbkRlbGVnYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL3VpL2ludGVybmFsL2FjdGlvbnMvUnVuQnVuZGxvckFjdGlvbkRlbGVnYXRlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkuaW50ZXJuYWwuYWN0aW9uczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0zNSw3MyArMzYsNzMgQEAKIAogLyoqCiAgKiBBY3Rpb24gZGVsZWdhdGUgdGhhdCBydW5zIEJ1bmRsb3Igb24gdGhlIHNlbGVjdGVkIHByb2plY3RzLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4xLjMKICAqLwogcHVibGljIGNsYXNzIFJ1bkJ1bmRsb3JBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7CiAKLQlwcml2YXRlIGZpbmFsIExpc3Q8SVByb2plY3Q+IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SVByb2plY3Q+IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oKTsKIAotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlTZXQ8SUphdmFQcm9qZWN0PiBwcm9qZWN0cyA9IG5ldyBMaW5rZWRIYXNoU2V0PElKYXZhUHJvamVjdD4oKTsKLQkJSXRlcmF0b3I8SVByb2plY3Q+IGl0ZXIgPSBzZWxlY3RlZC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChwcm9qZWN0KSkgewotCQkJCXByb2plY3RzLmFkZChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOwotCQkJfQotCQl9CisgICAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CisgICAgICAgIFNldDxJSmF2YVByb2plY3Q+IHByb2plY3RzID0gbmV3IExpbmtlZEhhc2hTZXQ8SUphdmFQcm9qZWN0PigpOworICAgICAgICBJdGVyYXRvcjxJUHJvamVjdD4gaXRlciA9IHRoaXMuc2VsZWN0ZWQuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICBwcm9qZWN0cy5hZGQoSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWZvciAoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0IDogcHJvamVjdHMpIHsKLQkJCUJ1bmRsb3JVaVBsdWdpbi5ydW5CdW5kbG9yT25Qcm9qZWN0KGphdmFQcm9qZWN0KTsKLQkJfQorICAgICAgICBmb3IgKGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA6IHByb2plY3RzKSB7CisgICAgICAgICAgICBCdW5kbG9yVWlQbHVnaW4ucnVuQnVuZGxvck9uUHJvamVjdChqYXZhUHJvamVjdCk7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3RlZC5jbGVhcigpOwotCQlib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUl0ZXJhdG9yPD8+IGl0ZXIgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCQlvYmogPSAoKElKYXZhUHJvamVjdCkgb2JqKS5nZXRQcm9qZWN0KCk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQkJSVJlc291cmNlIHByb2plY3QgPSAoSVJlc291cmNlKSBvYmo7Ci0JCQkJCWlmICghcHJvamVjdC5nZXRQcm9qZWN0KCkuaXNPcGVuKCkpIHsKLQkJCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2VsZWN0ZWQuYWRkKHByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkJCQlzZWxlY3RlZC5hZGQoKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0RmlsZSgpLmdldFByb2plY3QoKSk7Ci0JCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9CisgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKyAgICAgICAgdGhpcy5zZWxlY3RlZC5jbGVhcigpOworICAgICAgICBib29sZWFuIGVuYWJsZWQgPSB0cnVlOworICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yPD8+IGl0ZXIgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgeworICAgICAgICAgICAgICAgICAgICBvYmogPSAoKElKYXZhUHJvamVjdCkgb2JqKS5nZXRQcm9qZWN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIHByb2plY3QgPSAoSVJlc291cmNlKSBvYmo7CisgICAgICAgICAgICAgICAgICAgIGlmICghcHJvamVjdC5nZXRQcm9qZWN0KCkuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5hZGQocHJvamVjdC5nZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7CisgICAgICAgICAgICBpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZWRpdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuYWRkKCgoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpLmdldEZpbGUoKS5nZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCX0KKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7CisgICAgfQogCi0JcHVibGljIExpc3Q8SVByb2plY3Q+IGdldFNlbGVjdGVkKCkgewotCQlyZXR1cm4gc2VsZWN0ZWQ7Ci0JfQorICAgIHB1YmxpYyBMaXN0PElQcm9qZWN0PiBnZXRTZWxlY3RlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQnVuZGxvclByZWZlcmVuY2VQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9CdW5kbG9yUHJlZmVyZW5jZVBhZ2UuamF2YQppbmRleCAzNjA3OTIzLi5hMDc1YzVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9CdW5kbG9yUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9CdW5kbG9yUHJlZmVyZW5jZVBhZ2UuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTYzLDcgKzY0LDcgQEAKIAogLyoqCiAgKiB7QGxpbmsgUHJvcGVydHlQYWdlfSB0byBjb25maWd1cmUgcHJvcGVydGllcyBmaWxlcyBmb3IgQnVuZGxvciB2YXJpYWJsZSBzdWJzdGl0dXRpb24KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBMZW8gRG9zIFNhbnRvcwogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKQEAgLTcyLDMxNiArNzMsMzIwIEBACiBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogcHVibGljIGNsYXNzIEJ1bmRsb3JQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7CiAKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7CisgICAgcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwogCi0JcHJpdmF0ZSBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7CiAKLQlwcml2YXRlIFRhYmxlIGZpbGVuYW1lVGFibGU7CisgICAgcHJpdmF0ZSBUYWJsZSBmaWxlbmFtZVRhYmxlOwogCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmaWxlbmFtZXNUYWJsZVZpZXdlcjsKKyAgICBwcml2YXRlIFRhYmxlVmlld2VyIGZpbGVuYW1lc1RhYmxlVmlld2VyOwogCi0JcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOworICAgIHByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKIAotCXByaXZhdGUgQnV0dG9uIHBhdGhCdXR0b247CisgICAgcHJpdmF0ZSBCdXR0b24gcGF0aEJ1dHRvbjsKIAotCXByaXZhdGUgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKKyAgICBwcml2YXRlIEJ1dHRvbiBkZWxldGVCdXR0b247CiAKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBmaWxlbmFtZXM7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZmlsZW5hbWVzOwogCi0JcHJpdmF0ZSBCdXR0b24gc2NhbkJ5dGVDb2RlOworICAgIHByaXZhdGUgQnV0dG9uIHNjYW5CeXRlQ29kZTsKIAotCXByaXZhdGUgQnV0dG9uIGZvcm1hdE1hbmlmZXN0czsKKyAgICBwcml2YXRlIEJ1dHRvbiBmb3JtYXRNYW5pZmVzdHM7CiAKLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tTY2FuQnl0ZUNvZGVCdXR0b247CisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrU2NhbkJ5dGVDb2RlQnV0dG9uOwogCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRm9ybWF0TWFuaWZlc3RzQnV0dG9uOworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0Zvcm1hdE1hbmlmZXN0c0J1dHRvbjsKIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7CiAKLQkJRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKKyAgICAgICAgRm9udCBmb250ID0gcGFyZW50LmdldEZvbnQoKTsKIAotCQlDb21wb3NpdGUgcGFyZW50Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlwYXJlbnRDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXBhcmVudENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcGFyZW50Q29tcG9zaXRlLnNldEZvbnQoZm9udCk7CisgICAgICAgIENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisgICAgICAgIHBhcmVudENvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKyAgICAgICAgcGFyZW50Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworICAgICAgICBwYXJlbnRDb21wb3NpdGUuc2V0Rm9udChmb250KTsKIAotCQlpbml0aWFsaXplKCk7CisgICAgICAgIGluaXRpYWxpemUoKTsKIAotCQlzY2FuQnl0ZUNvZGUgPSBuZXcgQnV0dG9uKHBhcmVudENvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJc2NhbkJ5dGVDb2RlLnNldFRleHQoIlNjYW4gb3V0cHV0IGZvbGRlcnMgaW5zdGVhZCBvZiBzb3VyY2UgZm9sZGVycyB0byBnZW5lcmF0ZSBNQU5JRkVTVC5NRiIpOwotCQlzY2FuQnl0ZUNvZGUuc2V0U2VsZWN0aW9uKGNoZWNrU2NhbkJ5dGVDb2RlQnV0dG9uKTsKLQkJc2NhbkJ5dGVDb2RlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKKyAgICAgICAgdGhpcy5zY2FuQnl0ZUNvZGUgPSBuZXcgQnV0dG9uKHBhcmVudENvbXBvc2l0ZSwgU1dULkNIRUNLKTsKKyAgICAgICAgdGhpcy5zY2FuQnl0ZUNvZGUuc2V0VGV4dCgiU2NhbiBvdXRwdXQgZm9sZGVycyBpbnN0ZWFkIG9mIHNvdXJjZSBmb2xkZXJzIHRvIGdlbmVyYXRlIE1BTklGRVNULk1GIik7CisgICAgICAgIHRoaXMuc2NhbkJ5dGVDb2RlLnNldFNlbGVjdGlvbih0aGlzLmNoZWNrU2NhbkJ5dGVDb2RlQnV0dG9uKTsKKyAgICAgICAgdGhpcy5zY2FuQnl0ZUNvZGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CiAKLQkJZm9ybWF0TWFuaWZlc3RzID0gbmV3IEJ1dHRvbihwYXJlbnRDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZvcm1hdE1hbmlmZXN0cy5zZXRUZXh0KCJBdXRvLWZvcm1hdCBnZW5lcmF0ZWQgTUFOSUZFU1QuTUYgYW5kIFRFU1QuTUYgZmlsZXMiKTsKLQkJZm9ybWF0TWFuaWZlc3RzLnNldFNlbGVjdGlvbihjaGVja0Zvcm1hdE1hbmlmZXN0c0J1dHRvbik7Ci0JCWZvcm1hdE1hbmlmZXN0cy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBCdW5kbG9yUHJlZmVyZW5jZVBhZ2UudGhpcy5tb2RpZmllZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCUxhYmVsIGRlc2NyaXB0aW9uID0gY3JlYXRlRGVzY3JpcHRpb25MYWJlbChwYXJlbnRDb21wb3NpdGUpOwotCQlkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UpKTsKKyAgICAgICAgdGhpcy5mb3JtYXRNYW5pZmVzdHMgPSBuZXcgQnV0dG9uKHBhcmVudENvbXBvc2l0ZSwgU1dULkNIRUNLKTsKKyAgICAgICAgdGhpcy5mb3JtYXRNYW5pZmVzdHMuc2V0VGV4dCgiQXV0by1mb3JtYXQgZ2VuZXJhdGVkIE1BTklGRVNULk1GIGFuZCBURVNULk1GIGZpbGVzIik7CisgICAgICAgIHRoaXMuZm9ybWF0TWFuaWZlc3RzLnNldFNlbGVjdGlvbih0aGlzLmNoZWNrRm9ybWF0TWFuaWZlc3RzQnV0dG9uKTsKKyAgICAgICAgdGhpcy5mb3JtYXRNYW5pZmVzdHMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CiAKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBCdW5kbG9yUHJlZmVyZW5jZVBhZ2UudGhpcy5tb2RpZmllZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCWZpbGVuYW1lVGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZmlsZW5hbWVUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmaWxlbmFtZXNUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihmaWxlbmFtZVRhYmxlKTsKKyAgICAgICAgTGFiZWwgZGVzY3JpcHRpb24gPSBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKHBhcmVudENvbXBvc2l0ZSk7CisgICAgICAgIGRlc2NyaXB0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSkpOwogCi0JCWZpbGVuYW1lc1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUHJvcGVydGllc0ZpbGVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWZpbGVuYW1lc1RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEZpbGVuYW1lTGFiZWxQcm92aWRlcigpKTsKKyAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50Q29tcG9zaXRlLCBTV1QuTk9ORSk7CisgICAgICAgIGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisgICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKKyAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7CisgICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisgICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OworICAgICAgICBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOworICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7CiAKLQkJZmlsZW5hbWVzVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3Qgb2JqID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChvYmogIT0gbnVsbCkgewotCQkJCQlkZWxldGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQorICAgICAgICB0aGlzLmZpbGVuYW1lVGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7CisgICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKyAgICAgICAgdGhpcy5maWxlbmFtZVRhYmxlLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIHRoaXMuZmlsZW5hbWVzVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGhpcy5maWxlbmFtZVRhYmxlKTsKIAotCQl9KTsKKyAgICAgICAgdGhpcy5maWxlbmFtZXNUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFByb3BlcnRpZXNGaWxlQ29udGVudFByb3ZpZGVyKCkpOworICAgICAgICB0aGlzLmZpbGVuYW1lc1RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEZpbGVuYW1lTGFiZWxQcm92aWRlcigpKTsKIAotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCB0cnVlKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIHRoaXMuZmlsZW5hbWVzVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewogCi0JCWFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KCJBZGQuLi4iKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLndpZHRoSGludCA9IDEwMDsKLQkJYWRkQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxvclByZWZlcmVuY2VQYWdlLnRoaXMuZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxvclByZWZlcmVuY2VQYWdlLnRoaXMuZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRmlsdGVyZWRFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBzZWxEaWFsb2cgPSBuZXcgRmlsdGVyZWRFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIG5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoKSwKLQkJCQkJCW5ldyBXb3Jrc3BhY2VSZXNvdXJjZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJCQlzZWxEaWFsb2cuc2V0VGl0bGUoIlNlbGVjdCBwcm9wZXJ0aWVzIGZpbGVzIik7Ci0JCQkJc2VsRGlhbG9nLnNldE1lc3NhZ2UoIlNlbGVjdCBwcm9wZXJ0aWVzIGZpbGVzIGluIHRoZSB3b3Jrc3BhY2UgdGhhdCBzaG91bGQgYmVcbnVzZWQgZm9yIHZhcmlhYmxlIHN1YnN0aXR1dGlvbjoiKTsKLQkJCQlzZWxEaWFsb2cuc2V0VmFsaWRhdG9yKG5ldyBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yKCkgewotCQkJCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLQkJCQkJCWZvciAoT2JqZWN0IG9iamVjdCA6IHNlbGVjdGlvbikgewotCQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJU3RvcmFnZSkgewotCQkJCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBCdW5kbG9yVWlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQ7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQnVuZGxvclVpUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJc2VsRGlhbG9nLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQkJCXNlbERpYWxvZy5zZXRTb3J0ZXIobmV3IEphdmFFbGVtZW50U29ydGVyKCkpOwotCQkJCWlmIChzZWxEaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBzZWxEaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCWlmIChyZXNvdXJjZS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKSB7Ci0JCQkJCQkJSVBhdGggcHJvamVjdFJlbGF0aXZlUGF0aCA9IHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCQkJCQlTdHJpbmcgc3RyaW5nID0gcHJvamVjdFJlbGF0aXZlUGF0aC50b1N0cmluZygpOwotCQkJCQkJCWZpbGVuYW1lcy5hZGQoc3RyaW5nKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZmlsZW5hbWVzLmFkZChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQkJZmlsZW5hbWVzVGFibGVWaWV3ZXIuc2V0SW5wdXQocHJvamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKKyAgICAgICAgfSk7CiAKLQkJcGF0aEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCXBhdGhCdXR0b24uc2V0VGV4dCgiRW50ZXIgUGF0aC4uLiIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMTAwOwotCQlwYXRoQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXBhdGhCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlCdW5kbG9yUHJvcGVydGllc1BhdGhEaWFsb2cgcGF0aERpYWxvZyA9IG5ldyBCdW5kbG9yUHJvcGVydGllc1BhdGhEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQkJaWYgKHBhdGhEaWFsb2cub3BlbigpID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCQkJU3RyaW5nIHBhdGggPSBwYXRoRGlhbG9nLmdldFByb3BlcnRpZXNQYXRoKCk7Ci0JCQkJCWZpbGVuYW1lcy5hZGQocGF0aCk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQkJZmlsZW5hbWVzVGFibGVWaWV3ZXIuc2V0SW5wdXQocHJvamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKKyAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisgICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSkpOworICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CisgICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwogCi0JCWRlbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRUZXh0KCJEZWxldGUiKTsKLQkJZGVsZXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU9iamVjdCBzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZpbGVuYW1lc1RhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlmaWxlbmFtZXMucmVtb3ZlKHNlbGVjdGVkKTsKLQkJCQlmaWxlbmFtZXNUYWJsZVZpZXdlci5zZXRJbnB1dChwcm9qZWN0KTsKLQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOworICAgICAgICB0aGlzLmFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7CisgICAgICAgIHRoaXMuYWRkQnV0dG9uLnNldFRleHQoIkFkZC4uLiIpOworICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7CisgICAgICAgIGRhdGEud2lkdGhIaW50ID0gMTAwOworICAgICAgICB0aGlzLmFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICB0aGlzLmFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKIAotCQlmaWxlbmFtZXNUYWJsZVZpZXdlci5zZXRJbnB1dChwcm9qZWN0KTsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIEZpbHRlcmVkRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgc2VsRGlhbG9nID0gbmV3IEZpbHRlcmVkRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcigpLCBuZXcgV29ya3NwYWNlUmVzb3VyY2VDb250ZW50UHJvdmlkZXIoKSk7CisgICAgICAgICAgICAgICAgc2VsRGlhbG9nLnNldFRpdGxlKCJTZWxlY3QgcHJvcGVydGllcyBmaWxlcyIpOworICAgICAgICAgICAgICAgIHNlbERpYWxvZy5zZXRNZXNzYWdlKCJTZWxlY3QgcHJvcGVydGllcyBmaWxlcyBpbiB0aGUgd29ya3NwYWNlIHRoYXQgc2hvdWxkIGJlXG51c2VkIGZvciB2YXJpYWJsZSBzdWJzdGl0dXRpb246Iik7CisgICAgICAgICAgICAgICAgc2VsRGlhbG9nLnNldFZhbGlkYXRvcihuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKIAotCQlyZXR1cm4gcGFyZW50Q29tcG9zaXRlOwotCX0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiBzZWxlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSVN0b3JhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgQnVuZGxvclVpUGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBCdW5kbG9yVWlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgc2VsRGlhbG9nLnNldElucHV0KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOworICAgICAgICAgICAgICAgIHNlbERpYWxvZy5zZXRTb3J0ZXIobmV3IEphdmFFbGVtZW50U29ydGVyKCkpOworICAgICAgICAgICAgICAgIGlmIChzZWxEaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgeworICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBzZWxEaWFsb2cuZ2V0Rmlyc3RSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5nZXRQcm9qZWN0KCkuZXF1YWxzKEJ1bmRsb3JQcmVmZXJlbmNlUGFnZS50aGlzLnByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggcHJvamVjdFJlbGF0aXZlUGF0aCA9IHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3RyaW5nID0gcHJvamVjdFJlbGF0aXZlUGF0aC50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsb3JQcmVmZXJlbmNlUGFnZS50aGlzLmZpbGVuYW1lcy5hZGQoc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxvclByZWZlcmVuY2VQYWdlLnRoaXMuZmlsZW5hbWVzLmFkZChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsb3JQcmVmZXJlbmNlUGFnZS50aGlzLm1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxvclByZWZlcmVuY2VQYWdlLnRoaXMuZmlsZW5hbWVzVGFibGVWaWV3ZXIuc2V0SW5wdXQoQnVuZGxvclByZWZlcmVuY2VQYWdlLnRoaXMucHJvamVjdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKIAotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBnZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCQlzZXREZXNjcmlwdGlvbigiRGVmaW5lIHByb3BlcnRpZXMgZmlsZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGR1cmluZ1xuZ2VuZXJhdGlvbiBvZiBNQU5JRkVTVC5NRiBmaWxlOiIpOworICAgICAgICB0aGlzLnBhdGhCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOworICAgICAgICB0aGlzLnBhdGhCdXR0b24uc2V0VGV4dCgiRW50ZXIgUGF0aC4uLiIpOworICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKCk7CisgICAgICAgIGRhdGEud2lkdGhIaW50ID0gMTAwOworICAgICAgICB0aGlzLnBhdGhCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgdGhpcy5wYXRoQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewogCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKLQkJCVN0cmluZyBwcm9wZXJ0aWVzID0gbm9kZS5nZXQoQnVuZGxvckNvcmVQbHVnaW4uVEVNUExBVEVfUFJPUEVSVElFU19GSUxFX0tFWSwKLQkJCQkJQnVuZGxvckNvcmVQbHVnaW4uVEVNUExBVEVfUFJPUEVSVElFU19GSUxFX0RFRkFVTFQpOwotCQkJZmlsZW5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoU3RyaW5nVXRpbHMuc3BsaXQocHJvcGVydGllcywgIjsiKSkpOwotCQkJY2hlY2tTY2FuQnl0ZUNvZGVCdXR0b24gPSBub2RlLmdldEJvb2xlYW4oQnVuZGxvckNvcmVQbHVnaW4uVEVNUExBVEVfQllURV9DT0RFX1NDQU5OSU5HX0tFWSwKLQkJCQkJQnVuZGxvckNvcmVQbHVnaW4uVEVNUExBVEVfQllURV9DT0RFX1NDQU5OSU5HX0RFRkFVTFQpOwotCQkJY2hlY2tGb3JtYXRNYW5pZmVzdHNCdXR0b24gPSBub2RlLmdldEJvb2xlYW4oQnVuZGxvckNvcmVQbHVnaW4uRk9STUFUX0dFTkVSQVRFRF9NQU5JRkVTVFNfS0VZLAotCQkJCQlCdW5kbG9yQ29yZVBsdWdpbi5GT1JNQVRfR0VORVJBVEVEX01BTklGRVNUU19ERUZBVUxUKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJY2hlY2tTY2FuQnl0ZUNvZGVCdXR0b24gPSBCdW5kbG9yQ29yZVBsdWdpbi5URU1QTEFURV9CWVRFX0NPREVfU0NBTk5JTkdfREVGQVVMVDsKLQkJCWNoZWNrRm9ybWF0TWFuaWZlc3RzQnV0dG9uID0gQnVuZGxvckNvcmVQbHVnaW4uRk9STUFUX0dFTkVSQVRFRF9NQU5JRkVTVFNfREVGQVVMVDsKLQkJfQotCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIEJ1bmRsb3JQcm9wZXJ0aWVzUGF0aERpYWxvZyBwYXRoRGlhbG9nID0gbmV3IEJ1bmRsb3JQcm9wZXJ0aWVzUGF0aERpYWxvZyhnZXRTaGVsbCgpKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0aERpYWxvZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHBhdGhEaWFsb2cuZ2V0UHJvcGVydGllc1BhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxvclByZWZlcmVuY2VQYWdlLnRoaXMuZmlsZW5hbWVzLmFkZChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxvclByZWZlcmVuY2VQYWdlLnRoaXMubW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBCdW5kbG9yUHJlZmVyZW5jZVBhZ2UudGhpcy5maWxlbmFtZXNUYWJsZVZpZXdlci5zZXRJbnB1dChCdW5kbG9yUHJlZmVyZW5jZVBhZ2UudGhpcy5wcm9qZWN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JcHVibGljIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0UHJvamVjdFByZWZlcmVuY2VzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVNjb3BlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KTsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gY29udGV4dC5nZXROb2RlKEJ1bmRsb3JDb3JlUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCXJldHVybiBub2RlOwotCX0KKyAgICAgICAgdGhpcy5kZWxldGVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOworICAgICAgICB0aGlzLmRlbGV0ZUJ1dHRvbi5zZXRUZXh0KCJEZWxldGUiKTsKKyAgICAgICAgdGhpcy5kZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgdGhpcy5kZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWlmICghbW9kaWZpZWQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIE9iamVjdCBzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIEJ1bmRsb3JQcmVmZXJlbmNlUGFnZS50aGlzLmZpbGVuYW1lc1RhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBCdW5kbG9yUHJlZmVyZW5jZVBhZ2UudGhpcy5maWxlbmFtZXMucmVtb3ZlKHNlbGVjdGVkKTsKKyAgICAgICAgICAgICAgICBCdW5kbG9yUHJlZmVyZW5jZVBhZ2UudGhpcy5maWxlbmFtZXNUYWJsZVZpZXdlci5zZXRJbnB1dChCdW5kbG9yUHJlZmVyZW5jZVBhZ2UudGhpcy5wcm9qZWN0KTsKKyAgICAgICAgICAgICAgICBCdW5kbG9yUHJlZmVyZW5jZVBhZ2UudGhpcy5tb2RpZmllZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCW5vZGUucHV0KEJ1bmRsb3JDb3JlUGx1Z2luLlRFTVBMQVRFX1BST1BFUlRJRVNfRklMRV9LRVksIFN0cmluZ1V0aWxzLmpvaW4oZmlsZW5hbWVzLCAiOyIpKTsKLQkJYm9vbGVhbiBvbGRTY2FuQnl0ZUNvZGUgPSBub2RlLmdldEJvb2xlYW4oQnVuZGxvckNvcmVQbHVnaW4uVEVNUExBVEVfQllURV9DT0RFX1NDQU5OSU5HX0tFWSwKLQkJCQlCdW5kbG9yQ29yZVBsdWdpbi5URU1QTEFURV9CWVRFX0NPREVfU0NBTk5JTkdfREVGQVVMVCk7Ci0JCW5vZGUucHV0Qm9vbGVhbihCdW5kbG9yQ29yZVBsdWdpbi5URU1QTEFURV9CWVRFX0NPREVfU0NBTk5JTkdfS0VZLCBzY2FuQnl0ZUNvZGUuZ2V0U2VsZWN0aW9uKCkpOwotCQlub2RlLnB1dEJvb2xlYW4oQnVuZGxvckNvcmVQbHVnaW4uRk9STUFUX0dFTkVSQVRFRF9NQU5JRkVTVFNfS0VZLCBmb3JtYXRNYW5pZmVzdHMuZ2V0U2VsZWN0aW9uKCkpOwotCQl0cnkgewotCQkJbm9kZS5mbHVzaCgpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKG9sZFNjYW5CeXRlQ29kZSAhPSBzY2FuQnl0ZUNvZGUuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCUJ1bmRsb3JDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNYW5pZmVzdE1hbmFnZXIoKS5jbGVhclBhcnRpYWxNYW5pZmVzdChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOwotCQl9CisgICAgICAgIHRoaXMuZmlsZW5hbWVzVGFibGVWaWV3ZXIuc2V0SW5wdXQodGhpcy5wcm9qZWN0KTsKIAotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgICAgIHJldHVybiBwYXJlbnRDb21wb3NpdGU7CisgICAgfQogCi0JY2xhc3MgUHJvcGVydGllc0ZpbGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7CisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIHRoaXMucHJvamVjdCA9IChJUHJvamVjdCkgZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKKyAgICAgICAgc2V0RGVzY3JpcHRpb24oIkRlZmluZSBwcm9wZXJ0aWVzIGZpbGVzIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBkdXJpbmdcbmdlbmVyYXRpb24gb2YgTUFOSUZFU1QuTUYgZmlsZToiKTsKIAotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9CisgICAgICAgIGlmICh0aGlzLnByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gZ2V0UHJvamVjdFByZWZlcmVuY2VzKHRoaXMucHJvamVjdCk7CisgICAgICAgICAgICBTdHJpbmcgcHJvcGVydGllcyA9IG5vZGUuZ2V0KEJ1bmRsb3JDb3JlUGx1Z2luLlRFTVBMQVRFX1BST1BFUlRJRVNfRklMRV9LRVksIEJ1bmRsb3JDb3JlUGx1Z2luLlRFTVBMQVRFX1BST1BFUlRJRVNfRklMRV9ERUZBVUxUKTsKKyAgICAgICAgICAgIHRoaXMuZmlsZW5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoU3RyaW5nVXRpbHMuc3BsaXQocHJvcGVydGllcywgIjsiKSkpOworICAgICAgICAgICAgdGhpcy5jaGVja1NjYW5CeXRlQ29kZUJ1dHRvbiA9IG5vZGUuZ2V0Qm9vbGVhbihCdW5kbG9yQ29yZVBsdWdpbi5URU1QTEFURV9CWVRFX0NPREVfU0NBTk5JTkdfS0VZLAorICAgICAgICAgICAgICAgIEJ1bmRsb3JDb3JlUGx1Z2luLlRFTVBMQVRFX0JZVEVfQ09ERV9TQ0FOTklOR19ERUZBVUxUKTsKKyAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JtYXRNYW5pZmVzdHNCdXR0b24gPSBub2RlLmdldEJvb2xlYW4oQnVuZGxvckNvcmVQbHVnaW4uRk9STUFUX0dFTkVSQVRFRF9NQU5JRkVTVFNfS0VZLAorICAgICAgICAgICAgICAgIEJ1bmRsb3JDb3JlUGx1Z2luLkZPUk1BVF9HRU5FUkFURURfTUFOSUZFU1RTX0RFRkFVTFQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5maWxlbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIHRoaXMuY2hlY2tTY2FuQnl0ZUNvZGVCdXR0b24gPSBCdW5kbG9yQ29yZVBsdWdpbi5URU1QTEFURV9CWVRFX0NPREVfU0NBTk5JTkdfREVGQVVMVDsKKyAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JtYXRNYW5pZmVzdHNCdXR0b24gPSBCdW5kbG9yQ29yZVBsdWdpbi5GT1JNQVRfR0VORVJBVEVEX01BTklGRVNUU19ERUZBVUxUOworICAgICAgICB9CisgICAgfQogCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworICAgIHB1YmxpYyBJRWNsaXBzZVByZWZlcmVuY2VzIGdldFByb2plY3RQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIElTY29wZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCk7CisgICAgICAgIElFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IGNvbnRleHQuZ2V0Tm9kZShCdW5kbG9yQ29yZVBsdWdpbi5QTFVHSU5fSUQpOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CiAKLQkJfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKKyAgICAgICAgaWYgKCF0aGlzLm1vZGlmaWVkKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBnZXRQcm9qZWN0UHJlZmVyZW5jZXModGhpcy5wcm9qZWN0KTsKIAotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIGZpbGVuYW1lcy50b0FycmF5KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQorICAgICAgICBub2RlLnB1dChCdW5kbG9yQ29yZVBsdWdpbi5URU1QTEFURV9QUk9QRVJUSUVTX0ZJTEVfS0VZLCBTdHJpbmdVdGlscy5qb2luKHRoaXMuZmlsZW5hbWVzLCAiOyIpKTsKKyAgICAgICAgYm9vbGVhbiBvbGRTY2FuQnl0ZUNvZGUgPSBub2RlLmdldEJvb2xlYW4oQnVuZGxvckNvcmVQbHVnaW4uVEVNUExBVEVfQllURV9DT0RFX1NDQU5OSU5HX0tFWSwKKyAgICAgICAgICAgIEJ1bmRsb3JDb3JlUGx1Z2luLlRFTVBMQVRFX0JZVEVfQ09ERV9TQ0FOTklOR19ERUZBVUxUKTsKKyAgICAgICAgbm9kZS5wdXRCb29sZWFuKEJ1bmRsb3JDb3JlUGx1Z2luLlRFTVBMQVRFX0JZVEVfQ09ERV9TQ0FOTklOR19LRVksIHRoaXMuc2NhbkJ5dGVDb2RlLmdldFNlbGVjdGlvbigpKTsKKyAgICAgICAgbm9kZS5wdXRCb29sZWFuKEJ1bmRsb3JDb3JlUGx1Z2luLkZPUk1BVF9HRU5FUkFURURfTUFOSUZFU1RTX0tFWSwgdGhpcy5mb3JtYXRNYW5pZmVzdHMuZ2V0U2VsZWN0aW9uKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbm9kZS5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9sZFNjYW5CeXRlQ29kZSAhPSB0aGlzLnNjYW5CeXRlQ29kZS5nZXRTZWxlY3Rpb24oKSkgeworICAgICAgICAgICAgQnVuZGxvckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1hbmlmZXN0TWFuYWdlcigpLmNsZWFyUGFydGlhbE1hbmlmZXN0KEphdmFDb3JlLmNyZWF0ZSh0aGlzLnByb2plY3QpKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEVsZW1lbnRzKHBhcmVudEVsZW1lbnQpOwotCQl9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICBjbGFzcyBQcm9wZXJ0aWVzRmlsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKIAotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JCX0KKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgfQogCi0JfQorICAgICAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKIAotCWNsYXNzIEZpbGVuYW1lTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgeworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIEJ1bmRsb3JVaVBsdWdpbi5nZXRJbWFnZSgiZnVsbC9vYmoxNi9maWxlX29iai5naWYiKTsKLQkJfQorICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJ1bmRsb3JQcmVmZXJlbmNlUGFnZS50aGlzLmZpbGVuYW1lcy50b0FycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKKyAgICAgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudHMocGFyZW50RWxlbWVudCk7CisgICAgICAgIH0KIAotCX0KKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQljbGFzcyBXb3Jrc3BhY2VSZXNvdXJjZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOworICAgICAgICB9CiAKLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gKChJQ29udGFpbmVyKSBwYXJlbnRFbGVtZW50KS5tZW1iZXJzKCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KKyAgICB9CiAKLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcmV0dXJuICgoSVJlc291cmNlKSBlbGVtZW50KS5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9CisgICAgY2xhc3MgRmlsZW5hbWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7CiAKLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotCQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBCdW5kbG9yVWlQbHVnaW4uZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvZmlsZV9vYmouZ2lmIik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSB7Ci0JCQkJTGlzdDxJUHJvamVjdD4gcHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0PigpOwotCQkJCWZvciAoSVByb2plY3QgcHJvamVjdCA6ICgoSVdvcmtzcGFjZVJvb3QpIGlucHV0RWxlbWVudCkuZ2V0UHJvamVjdHMoKSkgewotCQkJCQlpZiAocHJvamVjdC5pc09wZW4oKSAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCQlwcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHByb2plY3RzLnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9CisgICAgfQogCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQl9Ci0JfQorICAgIGNsYXNzIFdvcmtzcGFjZVJlc291cmNlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgeworCisgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgeworICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoSUNvbnRhaW5lcikgcGFyZW50RWxlbWVudCkubWVtYmVycygpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoSVJlc291cmNlKSBlbGVtZW50KS5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKyAgICAgICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkgeworICAgICAgICAgICAgICAgIExpc3Q8SVByb2plY3Q+IHByb2plY3RzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKElQcm9qZWN0IHByb2plY3QgOiAoKElXb3Jrc3BhY2VSb290KSBpbnB1dEVsZW1lbnQpLmdldFByb2plY3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2plY3QuaXNPcGVuKCkgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdHMuYWRkKHByb2plY3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBwcm9qZWN0cy50b0FycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKKyAgICAgICAgfQorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsb3IudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbG9yL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQnVuZGxvclByb3BlcnRpZXNQYXRoRGlhbG9nLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9CdW5kbG9yUHJvcGVydGllc1BhdGhEaWFsb2cuamF2YQppbmRleCA3MWI4ZGUwLi43ZTA0NTZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9CdW5kbG9yUHJvcGVydGllc1BhdGhEaWFsb2cuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxvci51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsb3IvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9CdW5kbG9yUHJvcGVydGllc1BhdGhEaWFsb2cuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBUYXNrdG9wIFRlY2hub2xvZ2llcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbG9yLnVpLmludGVybmFsLnByb3BlcnRpZXM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKQEAgLTI3LDYyICsyOCw1OSBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxvclByb3BlcnRpZXNQYXRoRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKIAotCXByaXZhdGUgU3RyaW5nIHByb3BlcnRpZXNQYXRoOworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnRpZXNQYXRoOwogCi0JcHVibGljIEJ1bmRsb3JQcm9wZXJ0aWVzUGF0aERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JfQorICAgIHB1YmxpYyBCdW5kbG9yUHJvcGVydGllc1BhdGhEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKKyAgICAgICAgc3VwZXIocGFyZW50U2hlbGwpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgYnV0dG9uQmFyID0gc3VwZXIuY3JlYXRlQnV0dG9uQmFyKHBhcmVudCk7Ci0JCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJldHVybiBidXR0b25CYXI7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIENvbnRyb2wgYnV0dG9uQmFyID0gc3VwZXIuY3JlYXRlQnV0dG9uQmFyKHBhcmVudCk7CisgICAgICAgIGdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIHJldHVybiBidXR0b25CYXI7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWdldFNoZWxsKCkuc2V0VGV4dCgiQWRkIHByb3BlcnRpZXMgZmlsZSIpOwotCQlDb21wb3NpdGUgY29udHJvbCA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICAgICAgZ2V0U2hlbGwoKS5zZXRUZXh0KCJBZGQgcHJvcGVydGllcyBmaWxlIik7CisgICAgICAgIENvbXBvc2l0ZSBjb250cm9sID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwogCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbnRyb2wsIFNXVC5OT05FKTsKLQkJR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmFwcGx5VG8oY29tcG9zaXRlKTsKLQkJR3JpZExheW91dEZhY3RvcnkuZmlsbERlZmF1bHRzKCkubnVtQ29sdW1ucygyKS5hcHBseVRvKGNvbXBvc2l0ZSk7CisgICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbnRyb2wsIFNXVC5OT05FKTsKKyAgICAgICAgR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmFwcGx5VG8oY29tcG9zaXRlKTsKKyAgICAgICAgR3JpZExheW91dEZhY3RvcnkuZmlsbERlZmF1bHRzKCkubnVtQ29sdW1ucygyKS5hcHBseVRvKGNvbXBvc2l0ZSk7CiAKLQkJTGFiZWwgZGVzY3JpcHRpb24gPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRlc2NyaXB0aW9uLnNldFRleHQoIkVudGVyIHRoZSBwYXRoIHRvIGEgcHJvcGVydGllcyBmaWxlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4iKTsKLQkJR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLnNwYW4oMiwgMSkuYXBwbHlUbyhkZXNjcmlwdGlvbik7CisgICAgICAgIExhYmVsIGRlc2NyaXB0aW9uID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworICAgICAgICBkZXNjcmlwdGlvbi5zZXRUZXh0KCJFbnRlciB0aGUgcGF0aCB0byBhIHByb3BlcnRpZXMgZmlsZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB2YXJpYWJsZSBzdWJzdGl0dXRpb24uIik7CisgICAgICAgIEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5zcGFuKDIsIDEpLmFwcGx5VG8oZGVzY3JpcHRpb24pOwogCi0JCUxhYmVsIHBhdGhMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcGF0aExhYmVsLnNldFRleHQoIlBhdGg6Iik7Ci0JCUdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5hbGlnbihTV1QuRklMTCwgU1dULkNFTlRFUikuYXBwbHlUbyhwYXRoTGFiZWwpOworICAgICAgICBMYWJlbCBwYXRoTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisgICAgICAgIHBhdGhMYWJlbC5zZXRUZXh0KCJQYXRoOiIpOworICAgICAgICBHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuYWxpZ24oU1dULkZJTEwsIFNXVC5DRU5URVIpLmFwcGx5VG8ocGF0aExhYmVsKTsKIAotCQlmaW5hbCBUZXh0IHBhdGhUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpCi0JCQkJLmFsaWduKFNXVC5GSUxMLCBTV1QuQ0VOVEVSKQotCQkJCS5ncmFiKHRydWUsIGZhbHNlKQotCQkJCS5oaW50KDM1MCwgU1dULkRFRkFVTFQpCi0JCQkJLmFwcGx5VG8ocGF0aFRleHQpOwotCQlwYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlwcm9wZXJ0aWVzUGF0aCA9IHBhdGhUZXh0LmdldFRleHQoKTsKLQkJCQl1cGRhdGUoKTsKLQkJCX0KLQkJfSk7CisgICAgICAgIGZpbmFsIFRleHQgcGF0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOworICAgICAgICBHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuYWxpZ24oU1dULkZJTEwsIFNXVC5DRU5URVIpLmdyYWIodHJ1ZSwgZmFsc2UpLmhpbnQoMzUwLCBTV1QuREVGQVVMVCkuYXBwbHlUbyhwYXRoVGV4dCk7CisgICAgICAgIHBhdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKIAotCQlyZXR1cm4gY29udHJvbDsKLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBCdW5kbG9yUHJvcGVydGllc1BhdGhEaWFsb2cudGhpcy5wcm9wZXJ0aWVzUGF0aCA9IHBhdGhUZXh0LmdldFRleHQoKTsKKyAgICAgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnRpZXNQYXRoKCkgewotCQlyZXR1cm4gcHJvcGVydGllc1BhdGg7Ci0JfQorICAgICAgICByZXR1cm4gY29udHJvbDsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgdXBkYXRlKCkgewotCQlpZiAocHJvcGVydGllc1BhdGggPT0gbnVsbCB8fCBwcm9wZXJ0aWVzUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydGllc1BhdGgoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXNQYXRoOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGUoKSB7CisgICAgICAgIGlmICh0aGlzLnByb3BlcnRpZXNQYXRoID09IG51bGwgfHwgdGhpcy5wcm9wZXJ0aWVzUGF0aC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICB9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggYmJhY2E2ZC4uNDMyMWJkOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMSw0ICsxLDMgQEAKLSNXZWQgTWFyIDAyIDE2OjAwOjA2IFBTVCAyMDExCiBlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KQEAgLTgsNiArNyw4IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRTdWZmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKQEAgLTgyLDM1ICs4MywzNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYW5ub3RhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9ODAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTQ4CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTgwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9yZXNvdXJjZXNfaW5fdHJ5PTgwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3VuaW9uX3R5cGVfaW5fbXVsdGljYXRjaD0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQpAQCAtMTIxLDMwICsxMjQsMzEgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2xhbWJkYV9ib2R5PWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9MTIwCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5uZXdfbGluZXNfYXRfYmxvY2tfYm91bmRhcmllcz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5uZXdfbGluZXNfYXRfamF2YWRvY19ib3VuZGFyaWVzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LnByZXNlcnZlX3doaXRlX3NwYWNlX2JldHdlZW5fY29kZV9hbmRfbGluZV9jb21tZW50cz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmRpc2FibGluZ190YWc9QGZvcm1hdHRlclw6b2ZmCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZW5hYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9uCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQpAQCAtMTU4LDcgKzE2Miw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9maWVsZD1pbnNlcnQKQEAgLTE2NiwxMCArMTcwLDExIEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWVtYmVyPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21ldGhvZD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYWNrYWdlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3R5cGU9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2xhYmVsPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX3R5cGVfYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKQEAgLTIxNyw2ICsyMjIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfbGFtYmRhX2Fycm93PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydApAQCAtMjM1LDEyICsyNDEsMTQgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydApAQCAtMjY0LDYgKzI3Miw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydApAQCAtMjkxLDYgKzMwMCw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfbGFtYmRhX2Fycm93PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydApAQCAtMzE5LDYgKzMyOSw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl90cnk9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKQEAgLTMyOCw2ICszMzksNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydApAQCAtMzQzLDE1ICszNTUsMTcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTEyMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTE1MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9c3BhY2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV9vbl9vZmZfdGFncz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9vcl9vcGVyYXRvcl9tdWx0aWNhdGNoPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX291dGVyX2V4cHJlc3Npb25zX3doZW5fbmVzdGVkPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFGb3JtYXR0ZXI9b3JnLmVjbGlwc2UuamR0LmNvcmUuZGVmYXVsdEphdmFGb3JtYXR0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmluZGV4IDdlN2ZlNzMuLjZjOTgwMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMSw3ICsxLDY1IEBACitjbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19tZXRob2RzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnNfaW50ZXJmYWNlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfZnVuY3Rpb25hbF9pbnRlcmZhY2VzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKK2NsZWFudXAuY29ycmVjdF9pbmRlbnRhdGlvbj1mYWxzZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGVfY2hhbmdlc19vbmx5PWZhbHNlCitjbGVhbnVwLmluc2VydF9pbmZlcnJlZF90eXBlX2FyZ3VtZW50cz1mYWxzZQorY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV90eXBlX2Fic3RyYWN0X2lmX21pc3NpbmdfbWV0aG9kPWZhbHNlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKK2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK2NsZWFudXAucmVtb3ZlX3JlZHVuZGFudF90eXBlX2FyZ3VtZW50cz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorY2xlYW51cC51c2VfYW5vbnltb3VzX2NsYXNzX2NyZWF0aW9uPWZhbHNlCitjbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK2NsZWFudXAudXNlX2xhbWJkYT10cnVlCitjbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cC51c2VfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXBfcHJvZmlsZT1fVmlyZ28gV2ViIFNlcnZlciAtIENvZGUgQ2xlYW4gVXAKIGNsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCiBlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQogZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fTXlseW4gYmFzZWQgb24gRWNsaXBzZQorZm9ybWF0dGVyX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIEZvcm1hdHRlcgogZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTIKIGludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CiBvcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL0VjbGlwc2VVaVBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL0VjbGlwc2VVaVBsdWdpbi5qYXZhCmluZGV4IGFmNmM5ZjIuLjYzMzkyYmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS9FY2xpcHNlVWlQbHVnaW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2UvRWNsaXBzZVVpUGx1Z2luLmphdmEKQEAgLTEsMyArMSw0IEBACisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2U7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKQEAgLTEwLDU1ICsxMSw1MSBAQAogICovCiBwdWJsaWMgY2xhc3MgRWNsaXBzZVVpUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CiAKLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZSI7CisgICAgLy8gVGhlIHBsdWctaW4gSUQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2UiOwogCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEVjbGlwc2VVaVBsdWdpbiBwbHVnaW47CisgICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQorICAgIHByaXZhdGUgc3RhdGljIEVjbGlwc2VVaVBsdWdpbiBwbHVnaW47CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VVaVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRWNsaXBzZVVpUGx1Z2luIGdldERlZmF1bHQoKSB7CisgICAgICAgIHJldHVybiBwbHVnaW47CisgICAgfQogCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEVjbGlwc2VVaVBsdWdpbigpIHsKLQl9CisgICAgLyoqCisgICAgICogVGhlIGNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIEVjbGlwc2VVaVBsdWdpbigpIHsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBsb2coRXhjZXB0aW9uIGUpIHsKLQkJZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRWNsaXBzZVVpUGx1Z2luLlBMVUdJTl9JRCwgIlVuZXhwZWN0ZWQgZXJyb3IiLCBlKSk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGxvZyhFeGNlcHRpb24gZSkgeworICAgICAgICBnZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFY2xpcHNlVWlQbHVnaW4uUExVR0lOX0lELCAiVW5leHBlY3RlZCBlcnJvciIsIGUpKTsKKyAgICB9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlCi0JICogb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQKLQkgKiApCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQorICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCApCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7CisgICAgICAgIHBsdWdpbiA9IHRoaXM7CisgICAgfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZQotCSAqIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQKLQkgKiApCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCApCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwbHVnaW4gPSBudWxsOworICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL2VkaXRvcnMvQWJzdHJhY3RQYXJYbWxFZGl0b3JQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2UvZWRpdG9ycy9BYnN0cmFjdFBhclhtbEVkaXRvclBhZ2UuamF2YQppbmRleCA1NDlkZGQ3Li40NDMwNzkwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2UvZWRpdG9ycy9BYnN0cmFjdFBhclhtbEVkaXRvclBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2UvZWRpdG9ycy9BYnN0cmFjdFBhclhtbEVkaXRvclBhZ2UuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlLmVkaXRvcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMzYsNTQgKzM3LDU0IEBACiBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGFyWG1sRWRpdG9yUGFnZSBleHRlbmRzIEFic3RyYWN0UGRlRm9ybVBhZ2UgewogCi0JcHVibGljIEFic3RyYWN0UGFyWG1sRWRpdG9yUGFnZShGb3JtRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIoZWRpdG9yLCBpZCwgdGl0bGUpOwotCX0KKyAgICBwdWJsaWMgQWJzdHJhY3RQYXJYbWxFZGl0b3JQYWdlKEZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgeworICAgICAgICBzdXBlcihlZGl0b3IsIGlkLCB0aXRsZSk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBEZXBlbmRlbmNpZXNQYWdlCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCVNjcm9sbGVkRm9ybSBmb3JtID0gbWFuYWdlZEZvcm0uZ2V0Rm9ybSgpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotCQl0b29sa2l0LmRlY29yYXRlRm9ybUhlYWRpbmcoZm9ybS5nZXRGb3JtKCkpOworICAgIC8qKgorICAgICAqIEBzZWUgRGVwZW5kZW5jaWVzUGFnZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgeworICAgICAgICBTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKKyAgICAgICAgRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKKyAgICAgICAgdG9vbGtpdC5kZWNvcmF0ZUZvcm1IZWFkaW5nKGZvcm0uZ2V0Rm9ybSgpKTsKIAotCQkvLyBGcm9tIFBERSdzIERlcGVuZGVuY2llc1BhZ2UKLQkJZm9ybS5zZXRJbWFnZShQREVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfUkVRX1BMVUdJTlNfT0JKKSk7Ci0JCWZvcm0uc2V0VGV4dChQREVVSU1lc3NhZ2VzLkRlcGVuZGVuY2llc1BhZ2VfdGl0bGUpOwotCQlDb21wb3NpdGUgYm9keSA9IGZvcm0uZ2V0Qm9keSgpOwotCQlib2R5LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVGb3JtR3JpZExheW91dCh0cnVlLCAzKSk7Ci0JCUNvbXBvc2l0ZSBsZWZ0LCByaWdodDsKKyAgICAgICAgLy8gRnJvbSBQREUncyBEZXBlbmRlbmNpZXNQYWdlCisgICAgICAgIGZvcm0uc2V0SW1hZ2UoUERFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KFBERVBsdWdpbkltYWdlcy5ERVNDX1JFUV9QTFVHSU5TX09CSikpOworICAgICAgICBmb3JtLnNldFRleHQoUERFVUlNZXNzYWdlcy5EZXBlbmRlbmNpZXNQYWdlX3RpdGxlKTsKKyAgICAgICAgQ29tcG9zaXRlIGJvZHkgPSBmb3JtLmdldEJvZHkoKTsKKyAgICAgICAgYm9keS5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlRm9ybUdyaWRMYXlvdXQodHJ1ZSwgMykpOworICAgICAgICBDb21wb3NpdGUgbGVmdCwgcmlnaHQ7CiAKLQkJbGVmdCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGJvZHksIFNXVC5OT05FKTsKLQkJbGVmdC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlRm9ybVBhbmVHcmlkTGF5b3V0KGZhbHNlLCAxKSk7Ci0JCUdyaWREYXRhRmFjdG9yeS5jcmVhdGVGcm9tKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKS5zcGFuKDIsIDEpLmFwcGx5VG8obGVmdCk7Ci0JCXJpZ2h0ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoYm9keSwgU1dULk5PTkUpOwotCQlyaWdodC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlRm9ybVBhbmVHcmlkTGF5b3V0KGZhbHNlLCAxKSk7Ci0JCXJpZ2h0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworICAgICAgICBsZWZ0ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoYm9keSwgU1dULk5PTkUpOworICAgICAgICBsZWZ0LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVGb3JtUGFuZUdyaWRMYXlvdXQoZmFsc2UsIDEpKTsKKyAgICAgICAgR3JpZERhdGFGYWN0b3J5LmNyZWF0ZUZyb20obmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpLnNwYW4oMiwgMSkuYXBwbHlUbyhsZWZ0KTsKKyAgICAgICAgcmlnaHQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShib2R5LCBTV1QuTk9ORSk7CisgICAgICAgIHJpZ2h0LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVGb3JtUGFuZUdyaWRMYXlvdXQoZmFsc2UsIDEpKTsKKyAgICAgICAgcmlnaHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CiAKLQkJbWFuYWdlZEZvcm0uYWRkUGFydChnZXRGb3JtUGFydChsZWZ0LCBnZXRSZXF1aXJlZFNlY3Rpb25MYWJlbHMoKSkpOworICAgICAgICBtYW5hZ2VkRm9ybS5hZGRQYXJ0KGdldEZvcm1QYXJ0KGxlZnQsIGdldFJlcXVpcmVkU2VjdGlvbkxhYmVscygpKSk7CiAKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmb3JtLmdldEJvZHkoKSwgSUhlbHBDb250ZXh0SWRzLk1BTklGRVNUX1BMVUdJTl9ERVBFTkRFTkNJRVMpOwotCX0KKyAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmb3JtLmdldEJvZHkoKSwgSUhlbHBDb250ZXh0SWRzLk1BTklGRVNUX1BMVUdJTl9ERVBFTkRFTkNJRVMpOworICAgIH0KIAotCXByb3RlY3RlZCBhYnN0cmFjdCBJRm9ybVBhcnQgZ2V0Rm9ybVBhcnQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gbGFiZWxzKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgSUZvcm1QYXJ0IGdldEZvcm1QYXJ0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZ1tdIGxhYmVscyk7CiAKLQkvKioKLQkgKiBAc2VlIERlcGVuZGVuY2llc1BhZ2UKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIFN0cmluZ1tdIGdldFJlcXVpcmVkU2VjdGlvbkxhYmVscygpIHsKLQkJQXJyYXlMaXN0IGxhYmVscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGFiZWxzLmFkZChQREVVSU1lc3NhZ2VzLlJlcXVpcmVzU2VjdGlvbl9hZGQpOwotCQlsYWJlbHMuYWRkKFBERVVJTWVzc2FnZXMuUmVxdWlyZXNTZWN0aW9uX2RlbGV0ZSk7Ci0JCS8vIGxhYmVscy5hZGQoUERFVUlNZXNzYWdlcy5SZXF1aXJlc1NlY3Rpb25fdXApOwotCQkvLyBsYWJlbHMuYWRkKFBERVVJTWVzc2FnZXMuUmVxdWlyZXNTZWN0aW9uX2Rvd24pOwotCQkvLyBpZiAoaXNCdW5kbGUoKSkgewotCQkvLyBsYWJlbHMuYWRkKFBERVVJTWVzc2FnZXMuRGVwZW5kZW5jaWVzUGFnZV9wcm9wZXJ0aWVzKTsKLQkJLy8gfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBsYWJlbHMudG9BcnJheShuZXcgU3RyaW5nW2xhYmVscy5zaXplKCldKTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBEZXBlbmRlbmNpZXNQYWdlCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRSZXF1aXJlZFNlY3Rpb25MYWJlbHMoKSB7CisgICAgICAgIEFycmF5TGlzdCBsYWJlbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGxhYmVscy5hZGQoUERFVUlNZXNzYWdlcy5SZXF1aXJlc1NlY3Rpb25fYWRkKTsKKyAgICAgICAgbGFiZWxzLmFkZChQREVVSU1lc3NhZ2VzLlJlcXVpcmVzU2VjdGlvbl9kZWxldGUpOworICAgICAgICAvLyBsYWJlbHMuYWRkKFBERVVJTWVzc2FnZXMuUmVxdWlyZXNTZWN0aW9uX3VwKTsKKyAgICAgICAgLy8gbGFiZWxzLmFkZChQREVVSU1lc3NhZ2VzLlJlcXVpcmVzU2VjdGlvbl9kb3duKTsKKyAgICAgICAgLy8gaWYgKGlzQnVuZGxlKCkpIHsKKyAgICAgICAgLy8gbGFiZWxzLmFkZChQREVVSU1lc3NhZ2VzLkRlcGVuZGVuY2llc1BhZ2VfcHJvcGVydGllcyk7CisgICAgICAgIC8vIH0KKyAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgbGFiZWxzLnRvQXJyYXkobmV3IFN0cmluZ1tsYWJlbHMuc2l6ZSgpXSk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2UvZWRpdG9ycy9BYnN0cmFjdFBkZUZvcm1QYWdlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2UvZWRpdG9ycy9BYnN0cmFjdFBkZUZvcm1QYWdlLmphdmEKaW5kZXggY2Q0NjgzZi4uMThmOWQ2MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL2VkaXRvcnMvQWJzdHJhY3RQZGVGb3JtUGFnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS9lZGl0b3JzL0Fic3RyYWN0UGRlRm9ybVBhZ2UuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlLmVkaXRvcnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwudWkuZWRpdG9yLlBERURldGFpbHM7CkBAIC0zMCwxMDggKzMxLDEwOCBAQAogQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBkZUZvcm1QYWdlIGV4dGVuZHMgRm9ybVBhZ2UgewogCi0JcHVibGljIEFic3RyYWN0UGRlRm9ybVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IsIFN0cmluZyBpZCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKGVkaXRvciwgaWQsIHRpdGxlKTsKLQl9CisgICAgcHVibGljIEFic3RyYWN0UGRlRm9ybVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IsIFN0cmluZyBpZCwgU3RyaW5nIHRpdGxlKSB7CisgICAgICAgIHN1cGVyKGVkaXRvciwgaWQsIHRpdGxlKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5QZXJmb3JtRGlyZWN0bHkoU3RyaW5nIGlkLCBDb250cm9sIGNvbnRyb2wpIHsKLQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgY29udHJvbDsKLQkJCWlmIChpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSkpIHsKLQkJCQl0ZXh0LmN1dCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSkpIHsKLQkJCQl0ZXh0LmNvcHkoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpKSkgewotCQkJCXRleHQucGFzdGUoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmdldElkKCkpKSB7Ci0JCQkJdGV4dC5zZWxlY3RBbGwoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpIHsKLQkJCQlpbnQgY291bnQgPSB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk7Ci0JCQkJaWYgKGNvdW50ID09IDApIHsKLQkJCQkJaW50IGNhcmV0UG9zID0gdGV4dC5nZXRDYXJldFBvc2l0aW9uKCk7Ci0JCQkJCXRleHQuc2V0U2VsZWN0aW9uKGNhcmV0UG9zLCBjYXJldFBvcyArIDEpOwotCQkJCX0KLQkJCQl0ZXh0Lmluc2VydCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGFibGUpIHsKLQkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKSBjb250cm9sOwotCQkJaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSkpIHsKLQkJCQl0YWJsZS5zZWxlY3RBbGwoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgVHJlZSkgewotCQkJVHJlZSB0cmVlID0gKFRyZWUpIGNvbnRyb2w7Ci0JCQlpZiAoaWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpKSkgewotCQkJCXRyZWUuc2VsZWN0QWxsKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5QZXJmb3JtRGlyZWN0bHkoU3RyaW5nIGlkLCBDb250cm9sIGNvbnRyb2wpIHsKKyAgICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7CisgICAgICAgICAgICBUZXh0IHRleHQgPSAoVGV4dCkgY29udHJvbDsKKyAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICB0ZXh0LmN1dCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICB0ZXh0LmNvcHkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpKSkgeworICAgICAgICAgICAgICAgIHRleHQucGFzdGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5TRUxFQ1RfQUxMLmdldElkKCkpKSB7CisgICAgICAgICAgICAgICAgdGV4dC5zZWxlY3RBbGwoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSB0ZXh0LmdldFNlbGVjdGlvbkNvdW50KCk7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNhcmV0UG9zID0gdGV4dC5nZXRDYXJldFBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHRleHQuc2V0U2VsZWN0aW9uKGNhcmV0UG9zLCBjYXJldFBvcyArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZXh0Lmluc2VydCgiIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgVGFibGUpIHsKKyAgICAgICAgICAgIFRhYmxlIHRhYmxlID0gKFRhYmxlKSBjb250cm9sOworICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICB0YWJsZS5zZWxlY3RBbGwoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgVHJlZSkgeworICAgICAgICAgICAgVHJlZSB0cmVlID0gKFRyZWUpIGNvbnRyb2w7CisgICAgICAgICAgICBpZiAoaWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuU0VMRUNUX0FMTC5nZXRJZCgpKSkgeworICAgICAgICAgICAgICAgIHRyZWUuc2VsZWN0QWxsKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCXByb3RlY3RlZCBDb250cm9sIGdldEZvY3VzQ29udHJvbCgpIHsKLQkJSU1hbmFnZWRGb3JtIGZvcm0gPSBnZXRNYW5hZ2VkRm9ybSgpOwotCQlpZiAoZm9ybSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDb250cm9sIGNvbnRyb2wgPSBmb3JtLmdldEZvcm0oKTsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCB8fCBjb250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRGlzcGxheSBkaXNwbGF5ID0gY29udHJvbC5nZXREaXNwbGF5KCk7Ci0JCUNvbnRyb2wgZm9jdXNDb250cm9sID0gZGlzcGxheS5nZXRGb2N1c0NvbnRyb2woKTsKLQkJaWYgKGZvY3VzQ29udHJvbCA9PSBudWxsIHx8IGZvY3VzQ29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBmb2N1c0NvbnRyb2w7Ci0JfQorICAgIHByb3RlY3RlZCBDb250cm9sIGdldEZvY3VzQ29udHJvbCgpIHsKKyAgICAgICAgSU1hbmFnZWRGb3JtIGZvcm0gPSBnZXRNYW5hZ2VkRm9ybSgpOworICAgICAgICBpZiAoZm9ybSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBDb250cm9sIGNvbnRyb2wgPSBmb3JtLmdldEZvcm0oKTsKKyAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCB8fCBjb250cm9sLmlzRGlzcG9zZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgRGlzcGxheSBkaXNwbGF5ID0gY29udHJvbC5nZXREaXNwbGF5KCk7CisgICAgICAgIENvbnRyb2wgZm9jdXNDb250cm9sID0gZGlzcGxheS5nZXRGb2N1c0NvbnRyb2woKTsKKyAgICAgICAgaWYgKGZvY3VzQ29udHJvbCA9PSBudWxsIHx8IGZvY3VzQ29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmb2N1c0NvbnRyb2w7CisgICAgfQogCi0JcHJpdmF0ZSBBYnN0cmFjdEZvcm1QYXJ0IGdldEZvY3VzU2VjdGlvbigpIHsKLQkJQ29udHJvbCBmb2N1c0NvbnRyb2wgPSBnZXRGb2N1c0NvbnRyb2woKTsKLQkJaWYgKGZvY3VzQ29udHJvbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlDb21wb3NpdGUgcGFyZW50ID0gZm9jdXNDb250cm9sLmdldFBhcmVudCgpOwotCQlBYnN0cmFjdEZvcm1QYXJ0IHRhcmdldFBhcnQgPSBudWxsOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCU9iamVjdCBkYXRhID0gcGFyZW50LmdldERhdGEoInBhcnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhIGluc3RhbmNlb2YgQWJzdHJhY3RGb3JtUGFydCkgewotCQkJCXRhcmdldFBhcnQgPSAoQWJzdHJhY3RGb3JtUGFydCkgZGF0YTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gdGFyZ2V0UGFydDsKLQl9CisgICAgcHJpdmF0ZSBBYnN0cmFjdEZvcm1QYXJ0IGdldEZvY3VzU2VjdGlvbigpIHsKKyAgICAgICAgQ29udHJvbCBmb2N1c0NvbnRyb2wgPSBnZXRGb2N1c0NvbnRyb2woKTsKKyAgICAgICAgaWYgKGZvY3VzQ29udHJvbCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBDb21wb3NpdGUgcGFyZW50ID0gZm9jdXNDb250cm9sLmdldFBhcmVudCgpOworICAgICAgICBBYnN0cmFjdEZvcm1QYXJ0IHRhcmdldFBhcnQgPSBudWxsOworICAgICAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIE9iamVjdCBkYXRhID0gcGFyZW50LmdldERhdGEoInBhcnQiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhIGluc3RhbmNlb2YgQWJzdHJhY3RGb3JtUGFydCkgeworICAgICAgICAgICAgICAgIHRhcmdldFBhcnQgPSAoQWJzdHJhY3RGb3JtUGFydCkgZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGFyZ2V0UGFydDsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtR2xvYmFsQWN0aW9uKFN0cmluZyBhY3Rpb25JZCkgewotCQlDb250cm9sIGZvY3VzQ29udHJvbCA9IGdldEZvY3VzQ29udHJvbCgpOwotCQlpZiAoZm9jdXNDb250cm9sID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQorICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1HbG9iYWxBY3Rpb24oU3RyaW5nIGFjdGlvbklkKSB7CisgICAgICAgIENvbnRyb2wgZm9jdXNDb250cm9sID0gZ2V0Rm9jdXNDb250cm9sKCk7CisgICAgICAgIGlmIChmb2N1c0NvbnRyb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAKLQkJaWYgKGNhblBlcmZvcm1EaXJlY3RseShhY3Rpb25JZCwgZm9jdXNDb250cm9sKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQWJzdHJhY3RGb3JtUGFydCBmb2N1c1BhcnQgPSBnZXRGb2N1c1NlY3Rpb24oKTsKLQkJaWYgKGZvY3VzUGFydCAhPSBudWxsKSB7Ci0JCQlpZiAoZm9jdXNQYXJ0IGluc3RhbmNlb2YgUERFU2VjdGlvbikgewotCQkJCXJldHVybiAoKFBERVNlY3Rpb24pIGZvY3VzUGFydCkuZG9HbG9iYWxBY3Rpb24oYWN0aW9uSWQpOwotCQkJfQotCQkJaWYgKGZvY3VzUGFydCBpbnN0YW5jZW9mIFBERURldGFpbHMpIHsKLQkJCQlyZXR1cm4gKChQREVEZXRhaWxzKSBmb2N1c1BhcnQpLmRvR2xvYmFsQWN0aW9uKGFjdGlvbklkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgICAgICBpZiAoY2FuUGVyZm9ybURpcmVjdGx5KGFjdGlvbklkLCBmb2N1c0NvbnRyb2wpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBBYnN0cmFjdEZvcm1QYXJ0IGZvY3VzUGFydCA9IGdldEZvY3VzU2VjdGlvbigpOworICAgICAgICBpZiAoZm9jdXNQYXJ0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChmb2N1c1BhcnQgaW5zdGFuY2VvZiBQREVTZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoUERFU2VjdGlvbikgZm9jdXNQYXJ0KS5kb0dsb2JhbEFjdGlvbihhY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm9jdXNQYXJ0IGluc3RhbmNlb2YgUERFRGV0YWlscykgeworICAgICAgICAgICAgICAgIHJldHVybiAoKFBERURldGFpbHMpIGZvY3VzUGFydCkuZG9HbG9iYWxBY3Rpb24oYWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS9lZGl0b3JzL0RlcGVuZGVuY2llc1NlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS9lZGl0b3JzL0RlcGVuZGVuY2llc1NlY3Rpb24uamF2YQppbmRleCAyZjQwNTQ3Li5mNDk0Y2E1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2UvZWRpdG9ycy9EZXBlbmRlbmNpZXNTZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL2VkaXRvcnMvRGVwZW5kZW5jaWVzU2VjdGlvbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2UuZWRpdG9yczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyOwpAQCAtNTQsMjk1ICs1NSwyOTggQEAKIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVwZW5kZW5jaWVzU2VjdGlvbiBleHRlbmRzIFNlY3Rpb25QYXJ0IHsKIAotCS8qKgotCSAqIEBzZWUgVGFibGVTZWN0aW9uCi0JICovCi0JY2xhc3MgUGFydEFkYXB0ZXIgZXh0ZW5kcyBFZGl0YWJsZVRhYmxlUGFydCB7Ci0JCXByaXZhdGUgTGFiZWwgZkNvdW50OworICAgIC8qKgorICAgICAqIEBzZWUgVGFibGVTZWN0aW9uCisgICAgICovCisgICAgY2xhc3MgUGFydEFkYXB0ZXIgZXh0ZW5kcyBFZGl0YWJsZVRhYmxlUGFydCB7CiAKLQkJcHVibGljIFBhcnRBZGFwdGVyKFN0cmluZ1tdIGJ1dHRvbkxhYmVscykgewotCQkJc3VwZXIoYnV0dG9uTGFiZWxzKTsKLQkJfQorICAgICAgICBwcml2YXRlIExhYmVsIGZDb3VudDsKIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgYnV0dG9uU2VsZWN0ZWQoQnV0dG9uIGJ1dHRvbiwgaW50IGluZGV4KSB7Ci0JCQlEZXBlbmRlbmNpZXNTZWN0aW9uLnRoaXMuYnV0dG9uU2VsZWN0ZWQoaW5kZXgpOwotCQkJaWYgKGZIYW5kbGVEZWZhdWx0QnV0dG9uKSB7Ci0JCQkJYnV0dG9uLmdldFNoZWxsKCkuc2V0RGVmYXVsdEJ1dHRvbihudWxsKTsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgUGFydEFkYXB0ZXIoU3RyaW5nW10gYnV0dG9uTGFiZWxzKSB7CisgICAgICAgICAgICBzdXBlcihidXR0b25MYWJlbHMpOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQkJc3VwZXIuY3JlYXRlQnV0dG9ucyhwYXJlbnQsIHRvb2xraXQpOwotCQkJZW5hYmxlQnV0dG9ucygpOwotCQkJaWYgKGNyZWF0ZUNvdW50KCkpIHsKLQkJCQlDb21wb3NpdGUgY29tcCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZCdXR0b25Db250YWluZXIpOwotCQkJCWNvbXAuc2V0TGF5b3V0KGNyZWF0ZUJ1dHRvbnNMYXlvdXQoKSk7Ci0JCQkJY29tcC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCQlmQ291bnQgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGNvbXAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZDb3VudC5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoSUZvcm1Db2xvcnMuVElUTEUpKTsKLQkJCQlmQ291bnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkJZ2V0VGFibGVQYXJ0KCkuZ2V0VGFibGVWaWV3ZXIoKS5nZXRUYWJsZSgpLmFkZFBhaW50TGlzdGVuZXIobmV3IFBhaW50TGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkJCXVwZGF0ZUxhYmVsKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYnV0dG9uU2VsZWN0ZWQoQnV0dG9uIGJ1dHRvbiwgaW50IGluZGV4KSB7CisgICAgICAgICAgICBEZXBlbmRlbmNpZXNTZWN0aW9uLnRoaXMuYnV0dG9uU2VsZWN0ZWQoaW5kZXgpOworICAgICAgICAgICAgaWYgKERlcGVuZGVuY2llc1NlY3Rpb24udGhpcy5mSGFuZGxlRGVmYXVsdEJ1dHRvbikgeworICAgICAgICAgICAgICAgIGJ1dHRvbi5nZXRTaGVsbCgpLnNldERlZmF1bHRCdXR0b24obnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZW50cnlNb2RpZmllZChPYmplY3QgZW50cnksIFN0cmluZyB2YWx1ZSkgewotCQkJRGVwZW5kZW5jaWVzU2VjdGlvbi50aGlzLmVudHJ5TW9kaWZpZWQoZW50cnksIHZhbHVlKTsKLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9ucyhDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7CisgICAgICAgICAgICBzdXBlci5jcmVhdGVCdXR0b25zKHBhcmVudCwgdG9vbGtpdCk7CisgICAgICAgICAgICBlbmFibGVCdXR0b25zKCk7CisgICAgICAgICAgICBpZiAoY3JlYXRlQ291bnQoKSkgeworICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb21wID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUodGhpcy5mQnV0dG9uQ29udGFpbmVyKTsKKyAgICAgICAgICAgICAgICBjb21wLnNldExheW91dChjcmVhdGVCdXR0b25zTGF5b3V0KCkpOworICAgICAgICAgICAgICAgIGNvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuRklMTF9CT1RIKSk7CisgICAgICAgICAgICAgICAgdGhpcy5mQ291bnQgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGNvbXAsICIiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIHRoaXMuZkNvdW50LnNldEZvcmVncm91bmQodG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRDb2xvcihJRm9ybUNvbG9ycy5USVRMRSkpOworICAgICAgICAgICAgICAgIHRoaXMuZkNvdW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworICAgICAgICAgICAgICAgIGdldFRhYmxlUGFydCgpLmdldFRhYmxlVmlld2VyKCkuZ2V0VGFibGUoKS5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBoYW5kbGVEb3VibGVDbGljayhJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCURlcGVuZGVuY2llc1NlY3Rpb24udGhpcy5oYW5kbGVEb3VibGVDbGljayhzZWxlY3Rpb24pOwotCQl9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxhYmVsKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJZ2V0TWFuYWdlZEZvcm0oKS5maXJlU2VsZWN0aW9uQ2hhbmdlZChEZXBlbmRlbmNpZXNTZWN0aW9uLnRoaXMsIHNlbGVjdGlvbik7Ci0JCQlEZXBlbmRlbmNpZXNTZWN0aW9uLnRoaXMuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBlbnRyeU1vZGlmaWVkKE9iamVjdCBlbnRyeSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBEZXBlbmRlbmNpZXNTZWN0aW9uLnRoaXMuZW50cnlNb2RpZmllZChlbnRyeSwgdmFsdWUpOworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGFiZWwoKSB7Ci0JCQlpZiAoZkNvdW50ICE9IG51bGwgJiYgIWZDb3VudC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlmQ291bnQuc2V0VGV4dChOTFMuYmluZChQREVVSU1lc3NhZ2VzLlRhYmxlU2VjdGlvbl9pdGVtQ291bnQsCi0JCQkJCQlJbnRlZ2VyLnRvU3RyaW5nKGdldFRhYmxlVmlld2VyKCkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSkpKTsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworICAgICAgICAgICAgRGVwZW5kZW5jaWVzU2VjdGlvbi50aGlzLmhhbmRsZURvdWJsZUNsaWNrKHNlbGVjdGlvbik7CisgICAgICAgIH0KIAotCS8vIFJlcXVpcmVzU2VjdGlvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfSU5ERVggPSAwOworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKyAgICAgICAgICAgIGdldE1hbmFnZWRGb3JtKCkuZmlyZVNlbGVjdGlvbkNoYW5nZWQoRGVwZW5kZW5jaWVzU2VjdGlvbi50aGlzLCBzZWxlY3Rpb24pOworICAgICAgICAgICAgRGVwZW5kZW5jaWVzU2VjdGlvbi50aGlzLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKKyAgICAgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9JTkRFWCA9IDE7CisgICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUxhYmVsKCkgeworICAgICAgICAgICAgaWYgKHRoaXMuZkNvdW50ICE9IG51bGwgJiYgIXRoaXMuZkNvdW50LmlzRGlzcG9zZWQoKSkgeworICAgICAgICAgICAgICAgIHRoaXMuZkNvdW50LnNldFRleHQoTkxTLmJpbmQoUERFVUlNZXNzYWdlcy5UYWJsZVNlY3Rpb25faXRlbUNvdW50LCBJbnRlZ2VyLnRvU3RyaW5nKGdldFRhYmxlVmlld2VyKCkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUF9JTkRFWCA9IDI7CisgICAgLy8gUmVxdWlyZXNTZWN0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9JTkRFWCA9IDA7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9XTl9JTkRFWCA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9JTkRFWCA9IDE7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVElFU19JTkRFWCA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVQX0lOREVYID0gMjsKIAotCXByaXZhdGUgVGFibGVWaWV3ZXIgZkltcG9ydFZpZXdlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9XTl9JTkRFWCA9IDM7CiAKLQkvLyBUYWJsZVNlY3Rpb24KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGFuZGxlRGVmYXVsdEJ1dHRvbiA9IHRydWU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRJRVNfSU5ERVggPSA0OwogCi0JLy8gU3RydWN0dXJlZFZpZXdlclNlY3Rpb24KLQlwcml2YXRlIGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXJQYXJ0IGZWaWV3ZXJQYXJ0OworICAgIHByaXZhdGUgVGFibGVWaWV3ZXIgZkltcG9ydFZpZXdlcjsKIAotCXB1YmxpYyBEZXBlbmRlbmNpZXNTZWN0aW9uKEZvcm1QYWdlIHBhZ2UsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZ1tdIGJ1dHRvbkxhYmVscykgewotCQlzdXBlcihwYXJlbnQsIHBhZ2UuZ2V0TWFuYWdlZEZvcm0oKS5nZXRUb29sa2l0KCksIFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUik7CisgICAgLy8gVGFibGVTZWN0aW9uCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZkhhbmRsZURlZmF1bHRCdXR0b24gPSB0cnVlOwogCi0JCS8vIFBERVNlY3Rpb24KLQkJaW5pdGlhbGl6ZShwYWdlLmdldE1hbmFnZWRGb3JtKCkpOwotCQlnZXRTZWN0aW9uKCkuY2xpZW50VmVydGljYWxTcGFjaW5nID0gRm9ybUxheW91dEZhY3RvcnkuU0VDVElPTl9IRUFERVJfVkVSVElDQUxfU1BBQ0lORzsKLQkJZ2V0U2VjdGlvbigpLnNldERhdGEoInBhcnQiLCB0aGlzKTsgLy8kTk9OLU5MUy0xJAorICAgIC8vIFN0cnVjdHVyZWRWaWV3ZXJTZWN0aW9uCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyUGFydCBmVmlld2VyUGFydDsKIAotCQkvLyBTdHJ1Y3R1cmVkVmlld2VyU2VjdGlvbgotCQlmVmlld2VyUGFydCA9IGNyZWF0ZVZpZXdlclBhcnQoYnV0dG9uTGFiZWxzKTsKLQkJZlZpZXdlclBhcnQuc2V0TWluaW11bVNpemUoNTAsIDUwKTsKLQkJY3JlYXRlQ2xpZW50KGdldFNlY3Rpb24oKSwgcGFnZS5nZXRNYW5hZ2VkRm9ybSgpLmdldFRvb2xraXQoKSk7CisgICAgcHVibGljIERlcGVuZGVuY2llc1NlY3Rpb24oRm9ybVBhZ2UgcGFnZSwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gYnV0dG9uTGFiZWxzKSB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgcGFnZS5nZXRNYW5hZ2VkRm9ybSgpLmdldFRvb2xraXQoKSwgU2VjdGlvbi5ERVNDUklQVElPTiB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSKTsKIAotCQkvLyBSZXF1aXJlc1NlY3Rpb24KLQkJZ2V0U2VjdGlvbigpLnNldFRleHQoUERFVUlNZXNzYWdlcy5SZXF1aXJlc1NlY3Rpb25fdGl0bGUpOwotCQlnZXRUYWJsZVBhcnQoKS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JfQorICAgICAgICAvLyBQREVTZWN0aW9uCisgICAgICAgIGluaXRpYWxpemUocGFnZS5nZXRNYW5hZ2VkRm9ybSgpKTsKKyAgICAgICAgZ2V0U2VjdGlvbigpLmNsaWVudFZlcnRpY2FsU3BhY2luZyA9IEZvcm1MYXlvdXRGYWN0b3J5LlNFQ1RJT05fSEVBREVSX1ZFUlRJQ0FMX1NQQUNJTkc7CisgICAgICAgIGdldFNlY3Rpb24oKS5zZXREYXRhKCJwYXJ0IiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKIAotCS8qKgotCSAqIEBzZWUgUmVxdWlyZXNTZWN0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1dHRvblNlbGVjdGVkKGludCBpbmRleCkgewotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCWNhc2UgQUREX0lOREVYOgotCQkJaGFuZGxlQWRkKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRU1PVkVfSU5ERVg6Ci0JCQloYW5kbGVSZW1vdmUoKTsKLQkJCWJyZWFrOwotCQljYXNlIFVQX0lOREVYOgotCQkJaGFuZGxlVXAoKTsKLQkJCWJyZWFrOwotCQljYXNlIERPV05fSU5ERVg6Ci0JCQloYW5kbGVEb3duKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQUk9QRVJUSUVTX0lOREVYOgotCQkJaGFuZGxlT3BlblByb3BlcnRpZXMoKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgICAgICAvLyBTdHJ1Y3R1cmVkVmlld2VyU2VjdGlvbgorICAgICAgICB0aGlzLmZWaWV3ZXJQYXJ0ID0gY3JlYXRlVmlld2VyUGFydChidXR0b25MYWJlbHMpOworICAgICAgICB0aGlzLmZWaWV3ZXJQYXJ0LnNldE1pbmltdW1TaXplKDUwLCA1MCk7CisgICAgICAgIGNyZWF0ZUNsaWVudChnZXRTZWN0aW9uKCksIHBhZ2UuZ2V0TWFuYWdlZEZvcm0oKS5nZXRUb29sa2l0KCkpOwogCi0JLyoqCi0JICogQHNlZSBSZXF1aXJlc1NlY3Rpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ2xpZW50KFNlY3Rpb24gc2VjdGlvbiwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gY3JlYXRlQ2xpZW50Q29udGFpbmVyKHNlY3Rpb24sIDIsIHRvb2xraXQpOwotCQljcmVhdGVWaWV3ZXJQYXJ0Q29udHJvbChjb250YWluZXIsIFNXVC5NVUxUSSwgMiwgdG9vbGtpdCk7Ci0JCVRhYmxlUGFydCB0YWJsZVBhcnQgPSBnZXRUYWJsZVBhcnQoKTsKLQkJZkltcG9ydFZpZXdlciA9IHRhYmxlUGFydC5nZXRUYWJsZVZpZXdlcigpOworICAgICAgICAvLyBSZXF1aXJlc1NlY3Rpb24KKyAgICAgICAgZ2V0U2VjdGlvbigpLnNldFRleHQoUERFVUlNZXNzYWdlcy5SZXF1aXJlc1NlY3Rpb25fdGl0bGUpOworICAgICAgICBnZXRUYWJsZVBhcnQoKS5zZXRFZGl0YWJsZShmYWxzZSk7CisgICAgfQogCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbnRhaW5lcik7Ci0JCS8vIG1ha2VBY3Rpb25zKCk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbnRhaW5lcik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLm1pbmltdW1XaWR0aCA9IDI1MDsKLQkJZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlzZWN0aW9uLnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVDbGVhckdyaWRMYXlvdXQoZmFsc2UsIDEpKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VjdGlvbi5zZXRUZXh0KFBERVVJTWVzc2FnZXMuUmVxdWlyZXNTZWN0aW9uX3RpdGxlKTsKLQkJY3JlYXRlU2VjdGlvblRvb2xiYXIoc2VjdGlvbiwgdG9vbGtpdCk7Ci0JCWVuYWJsZUJ1dHRvbnMoKTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBSZXF1aXJlc1NlY3Rpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYnV0dG9uU2VsZWN0ZWQoaW50IGluZGV4KSB7CisgICAgICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgICAgIGNhc2UgQUREX0lOREVYOgorICAgICAgICAgICAgICAgIGhhbmRsZUFkZCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSRU1PVkVfSU5ERVg6CisgICAgICAgICAgICAgICAgaGFuZGxlUmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFVQX0lOREVYOgorICAgICAgICAgICAgICAgIGhhbmRsZVVwKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERPV05fSU5ERVg6CisgICAgICAgICAgICAgICAgaGFuZGxlRG93bigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQUk9QRVJUSUVTX0lOREVYOgorICAgICAgICAgICAgICAgIGhhbmRsZU9wZW5Qcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIFN0cnVjdHVyZWRWaWV3ZXJTZWN0aW9uCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ2xpZW50Q29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzcGFuLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCQljb250YWluZXIuc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZVNlY3Rpb25DbGllbnRHcmlkTGF5b3V0KGZhbHNlLCBzcGFuKSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgUmVxdWlyZXNTZWN0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNsaWVudChTZWN0aW9uIHNlY3Rpb24sIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKKyAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciA9IGNyZWF0ZUNsaWVudENvbnRhaW5lcihzZWN0aW9uLCAyLCB0b29sa2l0KTsKKyAgICAgICAgY3JlYXRlVmlld2VyUGFydENvbnRyb2woY29udGFpbmVyLCBTV1QuTVVMVEksIDIsIHRvb2xraXQpOworICAgICAgICBUYWJsZVBhcnQgdGFibGVQYXJ0ID0gZ2V0VGFibGVQYXJ0KCk7CisgICAgICAgIHRoaXMuZkltcG9ydFZpZXdlciA9IHRhYmxlUGFydC5nZXRUYWJsZVZpZXdlcigpOwogCi0JLyoqCi0JICogQHNlZSBSZXF1aXJlc1NlY3Rpb24KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY3JlYXRlQ291bnQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICAgICAgdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29udGFpbmVyKTsKKyAgICAgICAgLy8gbWFrZUFjdGlvbnMoKTsKKyAgICAgICAgc2VjdGlvbi5zZXRDbGllbnQoY29udGFpbmVyKTsKKyAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKyAgICAgICAgZ2QubWluaW11bVdpZHRoID0gMjUwOworICAgICAgICBnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7CisgICAgICAgIHNlY3Rpb24uc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZUNsZWFyR3JpZExheW91dChmYWxzZSwgMSkpOworICAgICAgICBzZWN0aW9uLnNldExheW91dERhdGEoZ2QpOworICAgICAgICBzZWN0aW9uLnNldFRleHQoUERFVUlNZXNzYWdlcy5SZXF1aXJlc1NlY3Rpb25fdGl0bGUpOworICAgICAgICBjcmVhdGVTZWN0aW9uVG9vbGJhcihzZWN0aW9uLCB0b29sa2l0KTsKKyAgICAgICAgZW5hYmxlQnV0dG9ucygpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgUmVxdWlyZXNTZWN0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlY3Rpb25Ub29sYmFyKFNlY3Rpb24gc2VjdGlvbiwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciA9IG5ldyBUb29sQmFyTWFuYWdlcihTV1QuRkxBVCk7Ci0JCVRvb2xCYXIgdG9vbGJhciA9IHRvb2xCYXJNYW5hZ2VyLmNyZWF0ZUNvbnRyb2woc2VjdGlvbik7Ci0JCWZpbmFsIEN1cnNvciBoYW5kQ3Vyc29yID0gbmV3IEN1cnNvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgU1dULkNVUlNPUl9IQU5EKTsKLQkJdG9vbGJhci5zZXRDdXJzb3IoaGFuZEN1cnNvcik7Ci0JCS8vIEN1cnNvciBuZWVkcyB0byBiZSBleHBsaWNpdGx5IGRpc3Bvc2VkCi0JCXRvb2xiYXIuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWlmICgoaGFuZEN1cnNvciAhPSBudWxsKSAmJiAoaGFuZEN1cnNvci5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpKSB7Ci0JCQkJCWhhbmRDdXJzb3IuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7CisgICAgLyoqCisgICAgICogQHNlZSBTdHJ1Y3R1cmVkVmlld2VyU2VjdGlvbgorICAgICAqLworICAgIHByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNsaWVudENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3BhbiwgRm9ybVRvb2xraXQgdG9vbGtpdCkgeworICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKKyAgICAgICAgY29udGFpbmVyLnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVTZWN0aW9uQ2xpZW50R3JpZExheW91dChmYWxzZSwgc3BhbikpOworICAgICAgICByZXR1cm4gY29udGFpbmVyOworICAgIH0KIAotCQkvLyBBZGQgc29ydCBhY3Rpb24gdG8gdGhlIHRvb2wgYmFyCi0JCS8vIGZTb3J0QWN0aW9uID0gbmV3IFNvcnRBY3Rpb24oZkltcG9ydFZpZXdlciwKLQkJLy8gUERFVUlNZXNzYWdlcy5SZXF1aXJlc1NlY3Rpb25fc29ydEFscGhhLCBudWxsLCBudWxsLCB0aGlzKTsKLQkJLy8gdG9vbEJhck1hbmFnZXIuYWRkKGZTb3J0QWN0aW9uKTsKKyAgICAvKioKKyAgICAgKiBAc2VlIFJlcXVpcmVzU2VjdGlvbgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjcmVhdGVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JCXRvb2xCYXJNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLQkJc2VjdGlvbi5zZXRUZXh0Q2xpZW50KHRvb2xiYXIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIFJlcXVpcmVzU2VjdGlvbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTZWN0aW9uVG9vbGJhcihTZWN0aW9uIHNlY3Rpb24sIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKKyAgICAgICAgVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIgPSBuZXcgVG9vbEJhck1hbmFnZXIoU1dULkZMQVQpOworICAgICAgICBUb29sQmFyIHRvb2xiYXIgPSB0b29sQmFyTWFuYWdlci5jcmVhdGVDb250cm9sKHNlY3Rpb24pOworICAgICAgICBmaW5hbCBDdXJzb3IgaGFuZEN1cnNvciA9IG5ldyBDdXJzb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIFNXVC5DVVJTT1JfSEFORCk7CisgICAgICAgIHRvb2xiYXIuc2V0Q3Vyc29yKGhhbmRDdXJzb3IpOworICAgICAgICAvLyBDdXJzb3IgbmVlZHMgdG8gYmUgZXhwbGljaXRseSBkaXNwb3NlZAorICAgICAgICB0b29sYmFyLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewogCi0JLyoqCi0JICogQHNlZSBUYWJsZVNlY3Rpb24KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXJQYXJ0IGNyZWF0ZVZpZXdlclBhcnQoU3RyaW5nW10gYnV0dG9uTGFiZWxzKSB7Ci0JCXJldHVybiBuZXcgUGFydEFkYXB0ZXIoYnV0dG9uTGFiZWxzKTsKLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIGlmIChoYW5kQ3Vyc29yICE9IG51bGwgJiYgaGFuZEN1cnNvci5pc0Rpc3Bvc2VkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZEN1cnNvci5kaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKIAotCS8qKgotCSAqIEBzZWUgU3RydWN0dXJlZFZpZXdlclNlY3Rpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgc3BhbiwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlmVmlld2VyUGFydC5jcmVhdGVDb250cm9sKHBhcmVudCwgc3R5bGUsIHNwYW4sIHRvb2xraXQpOwotCQlNZW51TWFuYWdlciBwb3B1cE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0JCUlNZW51TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbW5nKSB7Ci0JCQkJLy8gZmlsbENvbnRleHRNZW51KG1uZyk7Ci0JCQl9Ci0JCX07Ci0JCXBvcHVwTWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJcG9wdXBNZW51TWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCUNvbnRyb2wgY29udHJvbCA9IGZWaWV3ZXJQYXJ0LmdldENvbnRyb2woKTsKLQkJTWVudSBtZW51ID0gcG9wdXBNZW51TWFuYWdlci5jcmVhdGVDb250ZXh0TWVudShjb250cm9sKTsKLQkJY29udHJvbC5zZXRNZW51KG1lbnUpOwotCX0KKyAgICAgICAgLy8gQWRkIHNvcnQgYWN0aW9uIHRvIHRoZSB0b29sIGJhcgorICAgICAgICAvLyBmU29ydEFjdGlvbiA9IG5ldyBTb3J0QWN0aW9uKGZJbXBvcnRWaWV3ZXIsCisgICAgICAgIC8vIFBERVVJTWVzc2FnZXMuUmVxdWlyZXNTZWN0aW9uX3NvcnRBbHBoYSwgbnVsbCwgbnVsbCwgdGhpcyk7CisgICAgICAgIC8vIHRvb2xCYXJNYW5hZ2VyLmFkZChmU29ydEFjdGlvbik7CiAKLQkvKioKLQkgKiBAc2VlIFRhYmxlU2VjdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuYWJsZUJ1dHRvbnMoKTsKKyAgICAgICAgdG9vbEJhck1hbmFnZXIudXBkYXRlKHRydWUpOworICAgICAgICBzZWN0aW9uLnNldFRleHRDbGllbnQodG9vbGJhcik7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBUYWJsZVNlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbnRyeU1vZGlmaWVkKE9iamVjdCBlbnRyeSwgU3RyaW5nIHZhbHVlKTsKKyAgICAvKioKKyAgICAgKiBAc2VlIFRhYmxlU2VjdGlvbgorICAgICAqLworICAgIHByaXZhdGUgU3RydWN0dXJlZFZpZXdlclBhcnQgY3JlYXRlVmlld2VyUGFydChTdHJpbmdbXSBidXR0b25MYWJlbHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQYXJ0QWRhcHRlcihidXR0b25MYWJlbHMpOworICAgIH0KIAotCXByb3RlY3RlZCBpbnQgZ2V0QWRkSW5kZXgoKSB7Ci0JCXJldHVybiBBRERfSU5ERVg7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgU3RydWN0dXJlZFZpZXdlclNlY3Rpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgc3BhbiwgRm9ybVRvb2xraXQgdG9vbGtpdCkgeworICAgICAgICB0aGlzLmZWaWV3ZXJQYXJ0LmNyZWF0ZUNvbnRyb2wocGFyZW50LCBzdHlsZSwgc3BhbiwgdG9vbGtpdCk7CisgICAgICAgIE1lbnVNYW5hZ2VyIHBvcHVwTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoKTsKKyAgICAgICAgSU1lbnVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJTWVudUxpc3RlbmVyKCkgewogCi0JcHJvdGVjdGVkIGludCBnZXREb3duSW5kZXgoKSB7Ci0JCXJldHVybiBET1dOX0lOREVYOwotCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbW5nKSB7CisgICAgICAgICAgICAgICAgLy8gZmlsbENvbnRleHRNZW51KG1uZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHBvcHVwTWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgcG9wdXBNZW51TWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7CisgICAgICAgIENvbnRyb2wgY29udHJvbCA9IHRoaXMuZlZpZXdlclBhcnQuZ2V0Q29udHJvbCgpOworICAgICAgICBNZW51IG1lbnUgPSBwb3B1cE1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KGNvbnRyb2wpOworICAgICAgICBjb250cm9sLnNldE1lbnUobWVudSk7CisgICAgfQogCi0JcHJvdGVjdGVkIGludCBnZXRQcm9wZXJ0aWVzSW5kZXgoKSB7Ci0JCXJldHVybiBQUk9QRVJUSUVTX0lOREVYOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIFRhYmxlU2VjdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuYWJsZUJ1dHRvbnMoKTsKIAotCXByb3RlY3RlZCBpbnQgZ2V0UmVtb3ZlSW5kZXgoKSB7Ci0JCXJldHVybiBSRU1PVkVfSU5ERVg7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgVGFibGVTZWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW50cnlNb2RpZmllZChPYmplY3QgZW50cnksIFN0cmluZyB2YWx1ZSk7CiAKLQkvKioKLQkgKiBAc2VlIFRhYmxlU2VjdGlvbgotCSAqLwotCXByb3RlY3RlZCBFZGl0YWJsZVRhYmxlUGFydCBnZXRUYWJsZVBhcnQoKSB7Ci0JCXJldHVybiAoRWRpdGFibGVUYWJsZVBhcnQpIGZWaWV3ZXJQYXJ0OwotCX0KKyAgICBwcm90ZWN0ZWQgaW50IGdldEFkZEluZGV4KCkgeworICAgICAgICByZXR1cm4gQUREX0lOREVYOworICAgIH0KIAotCXByb3RlY3RlZCBUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKLQkJcmV0dXJuIGZJbXBvcnRWaWV3ZXI7Ci0JfQorICAgIHByb3RlY3RlZCBpbnQgZ2V0RG93bkluZGV4KCkgeworICAgICAgICByZXR1cm4gRE9XTl9JTkRFWDsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgaW50IGdldFVwSW5kZXgoKSB7Ci0JCXJldHVybiBVUF9JTkRFWDsKLQl9CisgICAgcHJvdGVjdGVkIGludCBnZXRQcm9wZXJ0aWVzSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBQUk9QRVJUSUVTX0lOREVYOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgUmVxdWlyZXNTZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlQWRkKCk7CisgICAgcHJvdGVjdGVkIGludCBnZXRSZW1vdmVJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIFJFTU9WRV9JTkRFWDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIFRhYmxlU2VjdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbik7CisgICAgLyoqCisgICAgICogQHNlZSBUYWJsZVNlY3Rpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRWRpdGFibGVUYWJsZVBhcnQgZ2V0VGFibGVQYXJ0KCkgeworICAgICAgICByZXR1cm4gKEVkaXRhYmxlVGFibGVQYXJ0KSB0aGlzLmZWaWV3ZXJQYXJ0OworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgUmVxdWlyZXNTZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlRG93bigpOworICAgIHByb3RlY3RlZCBUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZkltcG9ydFZpZXdlcjsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIFJlcXVpcmVzU2VjdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZU9wZW5Qcm9wZXJ0aWVzKCk7CisgICAgcHJvdGVjdGVkIGludCBnZXRVcEluZGV4KCkgeworICAgICAgICByZXR1cm4gVVBfSU5ERVg7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBSZXF1aXJlc1NlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVSZW1vdmUoKTsKKyAgICAvKioKKyAgICAgKiBAc2VlIFJlcXVpcmVzU2VjdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZUFkZCgpOwogCi0JLyoqCi0JICogQHNlZSBSZXF1aXJlc1NlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVVcCgpOworICAgIC8qKgorICAgICAqIEBzZWUgVGFibGVTZWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlRG91YmxlQ2xpY2soSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKTsKIAotCS8qKgotCSAqIEBzZWUgUmVxdWlyZXNTZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZSgpOworICAgIC8qKgorICAgICAqIEBzZWUgUmVxdWlyZXNTZWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlRG93bigpOwogCi0JLyoqCi0JICogQHNlZSBUYWJsZVNlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbik7CisgICAgLyoqCisgICAgICogQHNlZSBSZXF1aXJlc1NlY3Rpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVPcGVuUHJvcGVydGllcygpOworCisgICAgLyoqCisgICAgICogQHNlZSBSZXF1aXJlc1NlY3Rpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVSZW1vdmUoKTsKKworICAgIC8qKgorICAgICAqIEBzZWUgUmVxdWlyZXNTZWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlVXAoKTsKKworICAgIC8qKgorICAgICAqIEBzZWUgUmVxdWlyZXNTZWN0aW9uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZSgpOworCisgICAgLyoqCisgICAgICogQHNlZSBUYWJsZVNlY3Rpb24KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbik7CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS93aXphcmRzL0Fic3RyYWN0TmV3UGFyUHJvamVjdFdpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL3dpemFyZHMvQWJzdHJhY3ROZXdQYXJQcm9qZWN0V2l6YXJkLmphdmEKaW5kZXggZmI4Yzg1MS4uNmFiYjkyYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL3dpemFyZHMvQWJzdHJhY3ROZXdQYXJQcm9qZWN0V2l6YXJkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL3dpemFyZHMvQWJzdHJhY3ROZXdQYXJQcm9qZWN0V2l6YXJkLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS53aXphcmRzOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKQEAgLTQ0LDEwMyArNDUsMTAyIEBACiBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmV3UGFyUHJvamVjdFdpemFyZCBleHRlbmRzIEJhc2ljTmV3UmVzb3VyY2VXaXphcmQgewogCi0JcHJpdmF0ZSBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlIG1haW5QYWdlOworICAgIHByaXZhdGUgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSBtYWluUGFnZTsKIAotCXByaXZhdGUgSVByb2plY3QgbmV3UHJvamVjdDsKKyAgICBwcml2YXRlIElQcm9qZWN0IG5ld1Byb2plY3Q7CiAKLQkvKioKLQkgKiBAc2VlIEJhc2ljTmV3UHJvamVjdFJlc291cmNlV2l6YXJkCi0JICovCi0JcHJvdGVjdGVkIElQcm9qZWN0IGNyZWF0ZU5ld1Byb2plY3QoKSB7Ci0JCWlmIChuZXdQcm9qZWN0ICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXdQcm9qZWN0OwotCQl9CisgICAgLyoqCisgICAgICogQHNlZSBCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZAorICAgICAqLworICAgIHByb3RlY3RlZCBJUHJvamVjdCBjcmVhdGVOZXdQcm9qZWN0KCkgeworICAgICAgICBpZiAodGhpcy5uZXdQcm9qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm5ld1Byb2plY3Q7CisgICAgICAgIH0KIAotCQkvLyBnZXQgYSBwcm9qZWN0IGhhbmRsZQotCQlmaW5hbCBJUHJvamVjdCBuZXdQcm9qZWN0SGFuZGxlID0gbWFpblBhZ2UuZ2V0UHJvamVjdEhhbmRsZSgpOworICAgICAgICAvLyBnZXQgYSBwcm9qZWN0IGhhbmRsZQorICAgICAgICBmaW5hbCBJUHJvamVjdCBuZXdQcm9qZWN0SGFuZGxlID0gdGhpcy5tYWluUGFnZS5nZXRQcm9qZWN0SGFuZGxlKCk7CiAKLQkJLy8gZ2V0IGEgcHJvamVjdCBkZXNjcmlwdG9yCi0JCVVSSSBsb2NhdGlvbiA9IG51bGw7Ci0JCWlmICghbWFpblBhZ2UudXNlRGVmYXVsdHMoKSkgewotCQkJbG9jYXRpb24gPSBtYWluUGFnZS5nZXRMb2NhdGlvblVSSSgpOwotCQl9CisgICAgICAgIC8vIGdldCBhIHByb2plY3QgZGVzY3JpcHRvcgorICAgICAgICBVUkkgbG9jYXRpb24gPSBudWxsOworICAgICAgICBpZiAoIXRoaXMubWFpblBhZ2UudXNlRGVmYXVsdHMoKSkgeworICAgICAgICAgICAgbG9jYXRpb24gPSB0aGlzLm1haW5QYWdlLmdldExvY2F0aW9uVVJJKCk7CisgICAgICAgIH0KIAotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHdvcmtzcGFjZS5uZXdQcm9qZWN0RGVzY3JpcHRpb24obmV3UHJvamVjdEhhbmRsZS5nZXROYW1lKCkpOwotCQlkZXNjcmlwdGlvbi5zZXRMb2NhdGlvblVSSShsb2NhdGlvbik7CisgICAgICAgIElXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOworICAgICAgICBmaW5hbCBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gd29ya3NwYWNlLm5ld1Byb2plY3REZXNjcmlwdGlvbihuZXdQcm9qZWN0SGFuZGxlLmdldE5hbWUoKSk7CisgICAgICAgIGRlc2NyaXB0aW9uLnNldExvY2F0aW9uVVJJKGxvY2F0aW9uKTsKIAotCQkvLyBTVFMgLSByZXBsYWNlZCB3aXRoIGFzc29jaWF0ZVByb2plY3RzVG9QYXIoKQorICAgICAgICAvLyBTVFMgLSByZXBsYWNlZCB3aXRoIGFzc29jaWF0ZVByb2plY3RzVG9QYXIoKQogCi0JCS8vIHVwZGF0ZSB0aGUgcmVmZXJlbmNlZCBwcm9qZWN0IGlmIHByb3ZpZGVkCi0JCS8vIGlmIChyZWZlcmVuY2VQYWdlICE9IG51bGwpIHsKLQkJLy8gSVByb2plY3RbXSByZWZQcm9qZWN0cyA9IHJlZmVyZW5jZVBhZ2UuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCS8vIGlmIChyZWZQcm9qZWN0cy5sZW5ndGggPiAwKSB7Ci0JCS8vIGRlc2NyaXB0aW9uLnNldFJlZmVyZW5jZWRQcm9qZWN0cyhyZWZQcm9qZWN0cyk7Ci0JCS8vIH0KLQkJLy8gfQorICAgICAgICAvLyB1cGRhdGUgdGhlIHJlZmVyZW5jZWQgcHJvamVjdCBpZiBwcm92aWRlZAorICAgICAgICAvLyBpZiAocmVmZXJlbmNlUGFnZSAhPSBudWxsKSB7CisgICAgICAgIC8vIElQcm9qZWN0W10gcmVmUHJvamVjdHMgPSByZWZlcmVuY2VQYWdlLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOworICAgICAgICAvLyBpZiAocmVmUHJvamVjdHMubGVuZ3RoID4gMCkgeworICAgICAgICAvLyBkZXNjcmlwdGlvbi5zZXRSZWZlcmVuY2VkUHJvamVjdHMocmVmUHJvamVjdHMpOworICAgICAgICAvLyB9CisgICAgICAgIC8vIH0KIAotCQkvLyBjcmVhdGUgdGhlIG5ldyBwcm9qZWN0IG9wZXJhdGlvbgotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCUNyZWF0ZVByb2plY3RPcGVyYXRpb24gb3AgPSBuZXcgQ3JlYXRlUHJvamVjdE9wZXJhdGlvbihkZXNjcmlwdGlvbiwKLQkJCQkJCVJlc291cmNlTWVzc2FnZXMuTmV3UHJvamVjdF93aW5kb3dUaXRsZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gc2VlIGJ1ZwotCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE5OTAxCi0JCQkJCS8vIGRpcmVjdGx5IGV4ZWN1dGUgdGhlIG9wZXJhdGlvbiBzbyB0aGF0IHRoZSB1bmRvIHN0YXRlIGlzCi0JCQkJCS8vIG5vdCBwcmVzZXJ2ZWQuIE1ha2luZyB0aGlzIHVuZG9hYmxlIHJlc3VsdGVkIGluIHRvbyBtYW55Ci0JCQkJCS8vIGFjY2lkZW50YWwgZmlsZSBkZWxldGlvbnMuCi0JCQkJCW9wLmV4ZWN1dGUobW9uaXRvciwgV29ya3NwYWNlVW5kb1V0aWwuZ2V0VUlJbmZvQWRhcHRlcihnZXRTaGVsbCgpKSk7Ci0JCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9OworICAgICAgICAvLyBjcmVhdGUgdGhlIG5ldyBwcm9qZWN0IG9wZXJhdGlvbgorICAgICAgICBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewogCi0JCS8vIHJ1biB0aGUgbmV3IHByb2plY3QgY3JlYXRpb24gb3BlcmF0aW9uCi0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgdCA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlpZiAodCBpbnN0YW5jZW9mIEV4ZWN1dGlvbkV4Y2VwdGlvbiAmJiB0LmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJQ29yZUV4Y2VwdGlvbiBjYXVzZSA9IChDb3JlRXhjZXB0aW9uKSB0LmdldENhdXNlKCk7Ci0JCQkJU3RhdHVzQWRhcHRlciBzdGF0dXM7Ci0JCQkJaWYgKGNhdXNlLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuQ0FTRV9WQVJJQU5UX0VYSVNUUykgewotCQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzQWRhcHRlcihTdGF0dXNVdGlsLm5ld1N0YXR1cyhJU3RhdHVzLldBUk5JTkcsCi0JCQkJCQkJTkxTLmJpbmQoUmVzb3VyY2VNZXNzYWdlcy5OZXdQcm9qZWN0X2Nhc2VWYXJpYW50RXhpc3RzRXJyb3IsIG5ld1Byb2plY3RIYW5kbGUuZ2V0TmFtZSgpKSwKLQkJCQkJCQljYXVzZSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXNBZGFwdGVyKFN0YXR1c1V0aWwubmV3U3RhdHVzKGNhdXNlLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCksCi0JCQkJCQkJUmVzb3VyY2VNZXNzYWdlcy5OZXdQcm9qZWN0X2Vycm9yTWVzc2FnZSwgY2F1c2UpKTsKLQkJCQl9Ci0JCQkJc3RhdHVzLnNldFByb3BlcnR5KFN0YXR1c0FkYXB0ZXIuVElUTEVfUFJPUEVSVFksIFJlc291cmNlTWVzc2FnZXMuTmV3UHJvamVjdF9lcnJvck1lc3NhZ2UpOwotCQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZShzdGF0dXMsIFN0YXR1c01hbmFnZXIuQkxPQ0spOwotCQkJfSBlbHNlIHsKLQkJCQlTdGF0dXNBZGFwdGVyIHN0YXR1cyA9IG5ldyBTdGF0dXNBZGFwdGVyKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBJREVXb3JrYmVuY2hQbHVnaW4uSURFX1dPUktCRU5DSCwKLQkJCQkJCTAsIE5MUy5iaW5kKFJlc291cmNlTWVzc2FnZXMuTmV3UHJvamVjdF9pbnRlcm5hbEVycm9yLCB0LmdldE1lc3NhZ2UoKSksIHQpKTsKLQkJCQlzdGF0dXMuc2V0UHJvcGVydHkoU3RhdHVzQWRhcHRlci5USVRMRV9QUk9QRVJUWSwgUmVzb3VyY2VNZXNzYWdlcy5OZXdQcm9qZWN0X2Vycm9yTWVzc2FnZSk7Ci0JCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKHN0YXR1cywgU3RhdHVzTWFuYWdlci5MT0cgfCBTdGF0dXNNYW5hZ2VyLkJMT0NLKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgQ3JlYXRlUHJvamVjdE9wZXJhdGlvbiBvcCA9IG5ldyBDcmVhdGVQcm9qZWN0T3BlcmF0aW9uKGRlc2NyaXB0aW9uLCBSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3Rfd2luZG93VGl0bGUpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBidWcKKyAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxOTkwMQorICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3RseSBleGVjdXRlIHRoZSBvcGVyYXRpb24gc28gdGhhdCB0aGUgdW5kbyBzdGF0ZSBpcworICAgICAgICAgICAgICAgICAgICAvLyBub3QgcHJlc2VydmVkLiBNYWtpbmcgdGhpcyB1bmRvYWJsZSByZXN1bHRlZCBpbiB0b28gbWFueQorICAgICAgICAgICAgICAgICAgICAvLyBhY2NpZGVudGFsIGZpbGUgZGVsZXRpb25zLgorICAgICAgICAgICAgICAgICAgICBvcC5leGVjdXRlKG1vbml0b3IsIFdvcmtzcGFjZVVuZG9VdGlsLmdldFVJSW5mb0FkYXB0ZXIoZ2V0U2hlbGwoKSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKIAotCQluZXdQcm9qZWN0ID0gbmV3UHJvamVjdEhhbmRsZTsKKyAgICAgICAgLy8gcnVuIHRoZSBuZXcgcHJvamVjdCBjcmVhdGlvbiBvcGVyYXRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBvcCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgRXhlY3V0aW9uRXhjZXB0aW9uICYmIHQuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBDb3JlRXhjZXB0aW9uIGNhdXNlID0gKENvcmVFeGNlcHRpb24pIHQuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICBTdGF0dXNBZGFwdGVyIHN0YXR1czsKKyAgICAgICAgICAgICAgICBpZiAoY2F1c2UuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5DQVNFX1ZBUklBTlRfRVhJU1RTKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5ldyBTdGF0dXNBZGFwdGVyKFN0YXR1c1V0aWwubmV3U3RhdHVzKElTdGF0dXMuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5MUy5iaW5kKFJlc291cmNlTWVzc2FnZXMuTmV3UHJvamVjdF9jYXNlVmFyaWFudEV4aXN0c0Vycm9yLCBuZXdQcm9qZWN0SGFuZGxlLmdldE5hbWUoKSksIGNhdXNlKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbmV3IFN0YXR1c0FkYXB0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNVdGlsLm5ld1N0YXR1cyhjYXVzZS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpLCBSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3RfZXJyb3JNZXNzYWdlLCBjYXVzZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0dXMuc2V0UHJvcGVydHkoU3RhdHVzQWRhcHRlci5USVRMRV9QUk9QRVJUWSwgUmVzb3VyY2VNZXNzYWdlcy5OZXdQcm9qZWN0X2Vycm9yTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKHN0YXR1cywgU3RhdHVzTWFuYWdlci5CTE9DSyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0YXR1c0FkYXB0ZXIgc3RhdHVzID0gbmV3IFN0YXR1c0FkYXB0ZXIobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIElERVdvcmtiZW5jaFBsdWdpbi5JREVfV09SS0JFTkNILCAwLAorICAgICAgICAgICAgICAgICAgICBOTFMuYmluZChSZXNvdXJjZU1lc3NhZ2VzLk5ld1Byb2plY3RfaW50ZXJuYWxFcnJvciwgdC5nZXRNZXNzYWdlKCkpLCB0KSk7CisgICAgICAgICAgICAgICAgc3RhdHVzLnNldFByb3BlcnR5KFN0YXR1c0FkYXB0ZXIuVElUTEVfUFJPUEVSVFksIFJlc291cmNlTWVzc2FnZXMuTmV3UHJvamVjdF9lcnJvck1lc3NhZ2UpOworICAgICAgICAgICAgICAgIFN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZShzdGF0dXMsIFN0YXR1c01hbmFnZXIuTE9HIHwgU3RhdHVzTWFuYWdlci5CTE9DSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JCXJldHVybiBuZXdQcm9qZWN0OwotCX0KKyAgICAgICAgdGhpcy5uZXdQcm9qZWN0ID0gbmV3UHJvamVjdEhhbmRsZTsKIAotCXByb3RlY3RlZCBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlIGdldE1haW5QYWdlKCkgewotCQlyZXR1cm4gbWFpblBhZ2U7Ci0JfQorICAgICAgICByZXR1cm4gdGhpcy5uZXdQcm9qZWN0OworICAgIH0KIAotCXByb3RlY3RlZCBJUHJvamVjdCBnZXROZXdQcm9qZWN0KCkgewotCQlyZXR1cm4gbmV3UHJvamVjdDsKLQl9CisgICAgcHJvdGVjdGVkIFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2UgZ2V0TWFpblBhZ2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1haW5QYWdlOworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIHNldE1haW5QYWdlKFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2UgcGFnZSkgewotCQltYWluUGFnZSA9IHBhZ2U7Ci0JfQorICAgIHByb3RlY3RlZCBJUHJvamVjdCBnZXROZXdQcm9qZWN0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5uZXdQcm9qZWN0OworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldE1haW5QYWdlKFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2UgcGFnZSkgeworICAgICAgICB0aGlzLm1haW5QYWdlID0gcGFnZTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS93aXphcmRzL05ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2Uvd2l6YXJkcy9OZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5qYXZhCmluZGV4IDJhMmExYzkuLjg0NzUzYWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS93aXphcmRzL05ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL3dpemFyZHMvTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlLndpemFyZHM7CiAKIC8qKgpAQCAtMTYsMTAyICsxNywxMDIgQEAKICAqLwogcHVibGljIGNsYXNzIE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzIHsKIAotCS8vIE9yaWdpbmFsbHkgZnJvbSBOZXdXaXphcmRNZXNzYWdlcyBpbiAzLjQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VfdGl0bGUgPSAiSmF2YSBTZXR0aW5ncyI7CisgICAgLy8gT3JpZ2luYWxseSBmcm9tIE5ld1dpemFyZE1lc3NhZ2VzIGluIDMuNAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZV90aXRsZSA9ICJKYXZhIFNldHRpbmdzIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZV9kZXNjcmlwdGlvbiA9ICJEZWZpbmUgdGhlIEphdmEgYnVpbGQgc2V0dGluZ3MuIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VfZGVzY3JpcHRpb24gPSAiRGVmaW5lIHRoZSBKYXZhIGJ1aWxkIHNldHRpbmdzLiI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fZXJyb3JfbWVzc2FnZSA9ICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyBwcm9qZWN0LiBDaGVjayBsb2cgZm9yIGRldGFpbHMuIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fZXJyb3JfbWVzc2FnZSA9ICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyBwcm9qZWN0LiBDaGVjayBsb2cgZm9yIGRldGFpbHMuIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9kaXJlY3RvcnlfbWVzc2FnZSA9ICJDaG9vc2UgYSBkaXJlY3RvcnkgZm9yIHRoZSBwcm9qZWN0IGNvbnRlbnRzOiI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX2RpcmVjdG9yeV9tZXNzYWdlID0gIkNob29zZSBhIGRpcmVjdG9yeSBmb3IgdGhlIHByb2plY3QgY29udGVudHM6IjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9KUkVHcm91cF9saW5rX2Rlc2NyaXB0aW9uID0gIjxhPkMmb25maWd1cmUgSlJFcy4uLjwvYT4iOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9KUkVHcm91cF9saW5rX2Rlc2NyaXB0aW9uID0gIjxhPkMmb25maWd1cmUgSlJFcy4uLjwvYT4iOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0pSRUdyb3VwX2RlZmF1bHRfY29tcGxpYW5jZSA9ICJVc2UgZGVmJmF1bHQgSlJFIChDdXJyZW50bHkgJyd7MH0nJykiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9KUkVHcm91cF9kZWZhdWx0X2NvbXBsaWFuY2UgPSAiVXNlIGRlZiZhdWx0IEpSRSAoQ3VycmVudGx5ICcnezB9JycpIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9KUkVHcm91cF9zcGVjaWZpY19jb21wbGlhbmNlID0gIlUmc2UgYSBwcm9qZWN0IHNwZWNpZmljIEpSRToiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9KUkVHcm91cF9zcGVjaWZpY19jb21wbGlhbmNlID0gIlUmc2UgYSBwcm9qZWN0IHNwZWNpZmljIEpSRToiOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0pSRUdyb3VwX3NwZWNpZmljX0VFID0gIlVzZSBhbiBleGVjdXRpb24gZW4mdmlyb25tZW50IEpSRToiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9KUkVHcm91cF9zcGVjaWZpY19FRSA9ICJVc2UgYW4gZXhlY3V0aW9uIGVuJnZpcm9ubWVudCBKUkU6IjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9KUkVHcm91cF90aXRsZSA9ICJKUkUiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9KUkVHcm91cF90aXRsZSA9ICJKUkUiOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX3BhZ2VfZGVzY3JpcHRpb24gPSAiQ3JlYXRlIGEgSmF2YSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2Ugb3IgaW4gYW4gZXh0ZXJuYWwgbG9jYXRpb24uIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfcGFnZV9kZXNjcmlwdGlvbiA9ICJDcmVhdGUgYSBKYXZhIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSBvciBpbiBhbiBleHRlcm5hbCBsb2NhdGlvbi4iOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX3BhZ2VfdGl0bGUgPSAiQ3JlYXRlIGEgSmF2YSBwcm9qZWN0IjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfcGFnZV90aXRsZSA9ICJDcmVhdGUgYSBKYXZhIHByb2plY3QiOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX05vSlJFRm91bmRfbGluayA9ICJUaGUgZGVmYXVsdCBKUkUgY291bGQgYmUgZGV0ZWN0ZWQuIFRvIGFkZCBhIEpSRSBtYW51YWxseSBnbyB0byB0aGUgPGEgaHJlZj1cIkpSRVwiPkpSRXMgcHJlZmVyZW5jZSBwYWdlPC9hPi4iOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9Ob0pSRUZvdW5kX2xpbmsgPSAiVGhlIGRlZmF1bHQgSlJFIGNvdWxkIGJlIGRldGVjdGVkLiBUbyBhZGQgYSBKUkUgbWFudWFsbHkgZ28gdG8gdGhlIDxhIGhyZWY9XCJKUkVcIj5KUkVzIHByZWZlcmVuY2UgcGFnZTwvYT4uIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9MYXlvdXRHcm91cF9saW5rX2Rlc2NyaXB0aW9uID0gIjxhPkNvbmZpZ3VyZSBkJmVmYXVsdC4uLjwvYT4iOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9MYXlvdXRHcm91cF9saW5rX2Rlc2NyaXB0aW9uID0gIjxhPkNvbmZpZ3VyZSBkJmVmYXVsdC4uLjwvYT4iOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0xheW91dEdyb3VwX29wdGlvbl9vbmVGb2xkZXIgPSAiJlVzZSBwcm9qZWN0IGZvbGRlciBhcyByb290IGZvciBzb3VyY2VzIGFuZCBjbGFzcyBmaWxlcyI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0xheW91dEdyb3VwX29wdGlvbl9vbmVGb2xkZXIgPSAiJlVzZSBwcm9qZWN0IGZvbGRlciBhcyByb290IGZvciBzb3VyY2VzIGFuZCBjbGFzcyBmaWxlcyI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfRGV0ZWN0R3JvdXBfZGlmZmVyZW5kV29ya3NwYWNlQ0NfbWVzc2FnZSA9ICJUaGUgZGVmYXVsdCBjb21waWxlciBjb21wbGlhbmNlIGxldmVsIGZvciB0aGUgY3VycmVudCB3b3Jrc3BhY2UgaXMgezB9LiBUaGUgbmV3IHByb2plY3Qgd2lsbCB1c2UgYSBwcm9qZWN0IHNwZWNpZmljIGNvbXBpbGVyIGNvbXBsaWFuY2UgbGV2ZWwgb2YgezF9LjxhPjwvYT4iOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9EZXRlY3RHcm91cF9kaWZmZXJlbmRXb3Jrc3BhY2VDQ19tZXNzYWdlID0gIlRoZSBkZWZhdWx0IGNvbXBpbGVyIGNvbXBsaWFuY2UgbGV2ZWwgZm9yIHRoZSBjdXJyZW50IHdvcmtzcGFjZSBpcyB7MH0uIFRoZSBuZXcgcHJvamVjdCB3aWxsIHVzZSBhIHByb2plY3Qgc3BlY2lmaWMgY29tcGlsZXIgY29tcGxpYW5jZSBsZXZlbCBvZiB7MX0uPGE+PC9hPiI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTWVzc2FnZV9pbnZhbGlkUHJvamVjdE5hbWVGb3JXb3Jrc3BhY2VSb290ID0gIlRoZSBuYW1lIG9mIHRoZSBuZXcgcHJvamVjdCBtdXN0IGJlICcnezB9JyciOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9NZXNzYWdlX2ludmFsaWRQcm9qZWN0TmFtZUZvcldvcmtzcGFjZVJvb3QgPSAiVGhlIG5hbWUgb2YgdGhlIG5ldyBwcm9qZWN0IG11c3QgYmUgJyd7MH0nJyI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTWVzc2FnZV9jYW5ub3RDcmVhdGVBdEV4dGVybmFsTG9jYXRpb24gPSAiQ2Fubm90IGNyZWF0ZSBwcm9qZWN0IGNvbnRlbnQgYXQgdGhlIGdpdmVuIGV4dGVybmFsIGxvY2F0aW9uIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTWVzc2FnZV9jYW5ub3RDcmVhdGVBdEV4dGVybmFsTG9jYXRpb24gPSAiQ2Fubm90IGNyZWF0ZSBwcm9qZWN0IGNvbnRlbnQgYXQgdGhlIGdpdmVuIGV4dGVybmFsIGxvY2F0aW9uIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9NZXNzYWdlX25vdEV4aXNpbmdQcm9qZWN0T25Xb3Jrc3BhY2VSb290ID0gIlRoZSBzZWxlY3RlZCBleGlzdGluZyBzb3VyY2UgbG9jYXRpb24gaW4gdGhlIHdvcmtzcGFjZSByb290IGRvZXMgbm90IGV4aXN0IjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTWVzc2FnZV9ub3RFeGlzaW5nUHJvamVjdE9uV29ya3NwYWNlUm9vdCA9ICJUaGUgc2VsZWN0ZWQgZXhpc3Rpbmcgc291cmNlIGxvY2F0aW9uIGluIHRoZSB3b3Jrc3BhY2Ugcm9vdCBkb2VzIG5vdCBleGlzdCI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTGF5b3V0R3JvdXBfb3B0aW9uX3NlcGFyYXRlRm9sZGVycyA9ICImQ3JlYXRlIHNlcGFyYXRlIGZvbGRlcnMgZm9yIHNvdXJjZXMgYW5kIGNsYXNzIGZpbGVzIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTGF5b3V0R3JvdXBfb3B0aW9uX3NlcGFyYXRlRm9sZGVycyA9ICImQ3JlYXRlIHNlcGFyYXRlIGZvbGRlcnMgZm9yIHNvdXJjZXMgYW5kIGNsYXNzIGZpbGVzIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9MYXlvdXRHcm91cF90aXRsZSA9ICJQcm9qZWN0IGxheW91dCI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0xheW91dEdyb3VwX3RpdGxlID0gIlByb2plY3QgbGF5b3V0IjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9Xb3JraW5nU2V0c19ncm91cCA9ICJXb3JraW5nIHNldHMiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9Xb3JraW5nU2V0c19ncm91cCA9ICJXb3JraW5nIHNldHMiOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0xvY2F0aW9uR3JvdXBfdGl0bGUgPSAiQ29udGVudHMiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9Mb2NhdGlvbkdyb3VwX3RpdGxlID0gIkNvbnRlbnRzIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9Mb2NhdGlvbkdyb3VwX2V4dGVybmFsX2Rlc2MgPSAiQ3JlYXRlIHByb2plY3QgZnJvbSBlJnhpc3Rpbmcgc291cmNlIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTG9jYXRpb25Hcm91cF9leHRlcm5hbF9kZXNjID0gIkNyZWF0ZSBwcm9qZWN0IGZyb20gZSZ4aXN0aW5nIHNvdXJjZSI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTG9jYXRpb25Hcm91cF9icm93c2VCdXR0b25fZGVzYyA9ICJCJnJvd3NlLi4uIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTG9jYXRpb25Hcm91cF9icm93c2VCdXR0b25fZGVzYyA9ICJCJnJvd3NlLi4uIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9Mb2NhdGlvbkdyb3VwX2xvY2F0aW9uTGFiZWxfZGVzYyA9ICImRGlyZWN0b3J5OiI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0xvY2F0aW9uR3JvdXBfbG9jYXRpb25MYWJlbF9kZXNjID0gIiZEaXJlY3Rvcnk6IjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9Mb2NhdGlvbkdyb3VwX3dvcmtzcGFjZV9kZXNjID0gIkNyZWF0ZSBuZXcgcHJvamVjdCBpbiAmd29ya3NwYWNlIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTG9jYXRpb25Hcm91cF93b3Jrc3BhY2VfZGVzYyA9ICJDcmVhdGUgbmV3IHByb2plY3QgaW4gJndvcmtzcGFjZSI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTmFtZUdyb3VwX2xhYmVsX3RleHQgPSAiJlByb2plY3QgbmFtZToiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9OYW1lR3JvdXBfbGFiZWxfdGV4dCA9ICImUHJvamVjdCBuYW1lOiI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfRGV0ZWN0R3JvdXBfanJlX21lc3NhZ2UgPSAiVGhlIGN1cnJlbnQgd29ya3NwYWNlIHVzZXMgYSB7MX0gSlJFIHdpdGggY29tcGlsZXIgY29tcGxpYW5jZSBsZXZlbCB7MH0uIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkIGFuZCBlaXRoZXIgdGhlIEpSRSBvciB0aGUgY29tcGlsZXIgY29tcGxpYW5jZSBsZXZlbCBzaG91bGQgYmUgY2hhbmdlZC4gPGE+Q29uZmlndXJlLi4uPC9hPiI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0RldGVjdEdyb3VwX2pyZV9tZXNzYWdlID0gIlRoZSBjdXJyZW50IHdvcmtzcGFjZSB1c2VzIGEgezF9IEpSRSB3aXRoIGNvbXBpbGVyIGNvbXBsaWFuY2UgbGV2ZWwgezB9LiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCBhbmQgZWl0aGVyIHRoZSBKUkUgb3IgdGhlIGNvbXBpbGVyIGNvbXBsaWFuY2UgbGV2ZWwgc2hvdWxkIGJlIGNoYW5nZWQuIDxhPkNvbmZpZ3VyZS4uLjwvYT4iOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0RldGVjdEdyb3VwX21lc3NhZ2UgPSAiVGhlIHdpemFyZCB3aWxsIGF1dG9tYXRpY2FsbHkgY29uZmlndXJlIHRoZSBKUkUgYW5kIHRoZSBwcm9qZWN0IGxheW91dCBiYXNlZCBvbiB0aGUgZXhpc3Rpbmcgc291cmNlLjxhPjwvYT4iOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9EZXRlY3RHcm91cF9tZXNzYWdlID0gIlRoZSB3aXphcmQgd2lsbCBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSB0aGUgSlJFIGFuZCB0aGUgcHJvamVjdCBsYXlvdXQgYmFzZWQgb24gdGhlIGV4aXN0aW5nIHNvdXJjZS48YT48L2E+IjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9NZXNzYWdlX2VudGVyTG9jYXRpb24gPSAiRW50ZXIgYSBsb2NhdGlvbiBmb3IgdGhlIHByb2plY3QuIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTWVzc2FnZV9lbnRlckxvY2F0aW9uID0gIkVudGVyIGEgbG9jYXRpb24gZm9yIHRoZSBwcm9qZWN0LiI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTWVzc2FnZV9lbnRlclByb2plY3ROYW1lID0gIkVudGVyIGEgcHJvamVjdCBuYW1lLiI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX01lc3NhZ2VfZW50ZXJQcm9qZWN0TmFtZSA9ICJFbnRlciBhIHByb2plY3QgbmFtZS4iOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX01lc3NhZ2VfaW52YWxpZERpcmVjdG9yeSA9ICJJbnZhbGlkIHByb2plY3QgY29udGVudHMgZGlyZWN0b3J5IjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTWVzc2FnZV9pbnZhbGlkRGlyZWN0b3J5ID0gIkludmFsaWQgcHJvamVjdCBjb250ZW50cyBkaXJlY3RvcnkiOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX01lc3NhZ2Vfbm90T25Xb3Jrc3BhY2VSb290ID0gIlByb2plY3RzIGxvY2F0ZWQgaW4gdGhlIHdvcmtzcGFjZSBmb2xkZXIgbXVzdCBiZSBkaXJlY3Qgc3ViIGZvbGRlcnMgb2YgdGhlIHdvcmtzcGFjZSBmb2xkZXIiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9NZXNzYWdlX25vdE9uV29ya3NwYWNlUm9vdCA9ICJQcm9qZWN0cyBsb2NhdGVkIGluIHRoZSB3b3Jrc3BhY2UgZm9sZGVyIG11c3QgYmUgZGlyZWN0IHN1YiBmb2xkZXJzIG9mIHRoZSB3b3Jrc3BhY2UgZm9sZGVyIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9NZXNzYWdlX3Byb2plY3RBbHJlYWR5RXhpc3RzID0gIkEgcHJvamVjdCB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cy4iOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9NZXNzYWdlX3Byb2plY3RBbHJlYWR5RXhpc3RzID0gIkEgcHJvamVjdCB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cy4iOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX1Vua25vd25EZWZhdWx0SlJFX25hbWUgPSAiVW5rbm93biI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX1Vua25vd25EZWZhdWx0SlJFX25hbWUgPSAiVW5rbm93biI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fZXJyb3JfcmVtb3ZlX21lc3NhZ2UgPSAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVtb3ZpbmcgYSB0ZW1wb3JhcnkgcHJvamVjdC4iOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19lcnJvcl9yZW1vdmVfbWVzc2FnZSA9ICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZW1vdmluZyBhIHRlbXBvcmFyeSBwcm9qZWN0LiI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fZXJyb3JfcmVtb3ZlX3RpdGxlID0gIkVycm9yIENyZWF0aW5nIEphdmEgUHJvamVjdCI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX2Vycm9yX3JlbW92ZV90aXRsZSA9ICJFcnJvciBDcmVhdGluZyBKYXZhIFByb2plY3QiOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX3Byb2JsZW1fYmFja3VwID0gIlByb2JsZW0gd2hpbGUgY3JlYXRpbmcgYmFja3VwIGZvciAnJ3swfScnIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fcHJvYmxlbV9iYWNrdXAgPSAiUHJvYmxlbSB3aGlsZSBjcmVhdGluZyBiYWNrdXAgZm9yICcnezB9JyciOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX0RlbGV0ZUNvcnJ1cHRQcm9qZWN0RmlsZV9tZXNzYWdlID0gIkEgcHJvYmxlbSBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyB0aGUgcHJvamVjdCBmcm9tIGV4aXN0aW5nIHNvdXJjZTpcblxuJyd7MH0nJ1xuXG5UaGUgY29ycnVwdCBwcm9qZWN0IGZpbGUgd2lsbCBiZSByZXBsYWNlZCBieSBhIHZhbGlkIG9uZS4iOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19EZWxldGVDb3JydXB0UHJvamVjdEZpbGVfbWVzc2FnZSA9ICJBIHByb2JsZW0gb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgdGhlIHByb2plY3QgZnJvbSBleGlzdGluZyBzb3VyY2U6XG5cbicnezB9JydcblxuVGhlIGNvcnJ1cHQgcHJvamVjdCBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgYnkgYSB2YWxpZCBvbmUuIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19tb25pdG9yX2luaXRfYnVpbGRfcGF0aCA9ICJJbml0aWFsaXppbmcgYnVpbGQgcGF0aCI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX21vbml0b3JfaW5pdF9idWlsZF9wYXRoID0gIkluaXRpYWxpemluZyBidWlsZCBwYXRoIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19wcm9ibGVtX3Jlc3RvcmVfY2xhc3NwYXRoID0gIlByb2JsZW0gd2hpbGUgcmVzdG9yaW5nIGJhY2t1cCBmb3IgLmNsYXNzcGF0aCI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX3Byb2JsZW1fcmVzdG9yZV9jbGFzc3BhdGggPSAiUHJvYmxlbSB3aGlsZSByZXN0b3JpbmcgYmFja3VwIGZvciAuY2xhc3NwYXRoIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19wcm9ibGVtX3Jlc3RvcmVfcHJvamVjdCA9ICJQcm9ibGVtIHdoaWxlIHJlc3RvcmluZyBiYWNrdXAgZm9yIC5wcm9qZWN0IjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fcHJvYmxlbV9yZXN0b3JlX3Byb2plY3QgPSAiUHJvYmxlbSB3aGlsZSByZXN0b3JpbmcgYmFja3VwIGZvciAucHJvamVjdCI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fb3BlcmF0aW9uX2NyZWF0ZSA9ICJDcmVhdGluZyBwcm9qZWN0Li4uIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fb3BlcmF0aW9uX2NyZWF0ZSA9ICJDcmVhdGluZyBwcm9qZWN0Li4uIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19vcGVyYXRpb25fcmVtb3ZlID0gIlJlbW92aW5nIHByb2plY3QuLi4iOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19vcGVyYXRpb25fcmVtb3ZlID0gIlJlbW92aW5nIHByb2plY3QuLi4iOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX29wZXJhdGlvbl9pbml0aWFsaXplID0gIkluaXRpYWxpemluZyBwcm9qZWN0Li4uIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fb3BlcmF0aW9uX2luaXRpYWxpemUgPSAiSW5pdGlhbGl6aW5nIHByb2plY3QuLi4iOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX2Vycm9yX3RpdGxlID0gIk5ldyBKYXZhIFByb2plY3QiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19lcnJvcl90aXRsZSA9ICJOZXcgSmF2YSBQcm9qZWN0IjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZV9vcF9kZXNjID0gIkNyZWF0aW5nIEphdmEgcHJvamVjdC4uLiI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlX29wX2Rlc2MgPSAiQ3JlYXRpbmcgSmF2YSBwcm9qZWN0Li4uIjsKIAotCS8vIE9yaWdpbmFsbHkgZnJvbSBQYWNrYWdlRXhwbG9yZXJQYXJ0IGluIDMuNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST0pFQ1RTX0FTX1JPT1RTID0gMTsKKyAgICAvLyBPcmlnaW5hbGx5IGZyb20gUGFja2FnZUV4cGxvcmVyUGFydCBpbiAzLjQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9KRUNUU19BU19ST09UUyA9IDE7CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS93aXphcmRzL05ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZUNPUFkuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS93aXphcmRzL05ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZUNPUFkuamF2YQppbmRleCA1MzhlOGI1Li5lNzU2YzYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2Uvd2l6YXJkcy9OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVDT1BZLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL3dpemFyZHMvTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lQ09QWS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uud2l6YXJkczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTg1LDcgKzg2LDcgQEAKICAqIGNoYW5nZXMgaW5jbHVkZWQgcG9ydGluZyBhbGwgdGhlIE5ld0phdmFQcm9qZWN0V2l6YXJkIG1lc3NhZ2VzIGZyb20gdGhlIE5ld1dpemFyZE1lc3NhZ2VzIHV0aWxpdHkgY2xhc3MgdG8KICAqIE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLiBBbGwgd29ya2luZyBzZXQgZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBjb21tZW50ZWQgb3V0IGluIG9yZGVyIHRvIHJldGFpbiBjb21wYXRpYmlsaXR5CiAgKiBiZXR3ZWVuIDMuMyBhbmQgMy40Ci0gKiAKKyAqCiAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDIuMC4wLCBTVFMgb25seSBzdXBwb3J0cyBFY2xpcHNlIDMuNCBhbmQgYWJvdmUuIFVzZSB7QGxpbmsgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lfQogICogICAgICAgICAgICAgaW5zdGVhZC4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhlIGZpcnN0IHBhZ2Ugb2YKICAqICAgICAgICAgICAgIHRoZSBOZXcgSmF2YSBQcm9qZWN0IHdpemFyZC4gVGhpcyBwYWdlIGlzIHR5cGljYWxseSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgKQEAgLTEwNCwxNTQ2ICsxMDUsMTQ5OSBAQAogQERlcHJlY2F0ZWQKIHB1YmxpYyBjbGFzcyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVDT1BZIGV4dGVuZHMgV2l6YXJkUGFnZSB7CiAKLQkvKioKLQkgKiBTaG93IGEgd2FybmluZyB3aGVuIHRoZSBwcm9qZWN0IGxvY2F0aW9uIGNvbnRhaW5zIGZpbGVzLgotCSAqLwotCXByaXZhdGUgZmluYWwgY2xhc3MgRGV0ZWN0R3JvdXAgZXh0ZW5kcyBPYnNlcnZhYmxlIGltcGxlbWVudHMgT2JzZXJ2ZXIsIFNlbGVjdGlvbkxpc3RlbmVyIHsKKyAgICAvKioKKyAgICAgKiBTaG93IGEgd2FybmluZyB3aGVuIHRoZSBwcm9qZWN0IGxvY2F0aW9uIGNvbnRhaW5zIGZpbGVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgRGV0ZWN0R3JvdXAgZXh0ZW5kcyBPYnNlcnZhYmxlIGltcGxlbWVudHMgT2JzZXJ2ZXIsIFNlbGVjdGlvbkxpc3RlbmVyIHsKIAotCQlwcml2YXRlIExpbmsgZkhpbnRUZXh0OworICAgICAgICBwcml2YXRlIExpbmsgZkhpbnRUZXh0OwogCi0JCXByaXZhdGUgTGFiZWwgZkljb247CisgICAgICAgIHByaXZhdGUgTGFiZWwgZkljb247CiAKLQkJcHJpdmF0ZSBib29sZWFuIGZEZXRlY3Q7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBmRGV0ZWN0OwogCi0JCXB1YmxpYyBEZXRlY3RHcm91cCgpIHsKLQkJCWZEZXRlY3QgPSBmYWxzZTsKLQkJfQorICAgICAgICBwdWJsaWMgRGV0ZWN0R3JvdXAoKSB7CisgICAgICAgICAgICB0aGlzLmZEZXRlY3QgPSBmYWxzZTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgYm9vbGVhbiBjb21wdXRlRGV0ZWN0U3RhdGUoKSB7Ci0JCQlpZiAoZkxvY2F0aW9uR3JvdXAuaXNXb3Jrc3BhY2VSYWRpb1NlbGVjdGVkKCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZOYW1lR3JvdXAuZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLmxlbmd0aCgpID09IDAgfHwgSmF2YVBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihuYW1lKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlmaW5hbCBGaWxlIGRpcmVjdG9yeSA9IGZMb2NhdGlvbkdyb3VwLmdldExvY2F0aW9uKCkuYXBwZW5kKG5hbWUpLnRvRmlsZSgpOwotCQkJCQlyZXR1cm4gZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmaW5hbCBGaWxlIGRpcmVjdG9yeSA9IGZMb2NhdGlvbkdyb3VwLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0JCQkJcmV0dXJuIGRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpOwotCQkJfQotCQl9CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjb21wdXRlRGV0ZWN0U3RhdGUoKSB7CisgICAgICAgICAgICBpZiAoTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lQ09QWS50aGlzLmZMb2NhdGlvbkdyb3VwLmlzV29ya3NwYWNlUmFkaW9TZWxlY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVDT1BZLnRoaXMuZk5hbWVHcm91cC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCB8fCBKYXZhUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKG5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZGlyZWN0b3J5ID0gTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lQ09QWS50aGlzLmZMb2NhdGlvbkdyb3VwLmdldExvY2F0aW9uKCkuYXBwZW5kKG5hbWUpLnRvRmlsZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGRpcmVjdG9yeSA9IE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZUNPUFkudGhpcy5mTG9jYXRpb25Hcm91cC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworICAgICAgICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlKSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDEwOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworICAgICAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisgICAgICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlKSk7CisgICAgICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKKyAgICAgICAgICAgIGxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDEwOworICAgICAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwogCi0JCQlmSWNvbiA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJCWZJY29uLnNldEltYWdlKERpYWxvZy5nZXRJbWFnZShEaWFsb2cuRExHX0lNR19NRVNTQUdFX1dBUk5JTkcpKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQkJZkljb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisgICAgICAgICAgICB0aGlzLmZJY29uID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOworICAgICAgICAgICAgdGhpcy5mSWNvbi5zZXRJbWFnZShEaWFsb2cuZ2V0SW1hZ2UoRGlhbG9nLkRMR19JTUdfTUVTU0FHRV9XQVJOSU5HKSk7CisgICAgICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuTEVGVCwgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIHRoaXMuZkljb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CiAKLQkJCWZIaW50VGV4dCA9IG5ldyBMaW5rKGNvbXBvc2l0ZSwgU1dULldSQVApOwotCQkJZkhpbnRUZXh0LnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JCQlmSGludFRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNTApOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMyk7Ci0JCQlmSGludFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CisgICAgICAgICAgICB0aGlzLmZIaW50VGV4dCA9IG5ldyBMaW5rKGNvbXBvc2l0ZSwgU1dULldSQVApOworICAgICAgICAgICAgdGhpcy5mSGludFRleHQuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKKyAgICAgICAgICAgIHRoaXMuZkhpbnRUZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOworICAgICAgICAgICAgZ3JpZERhdGEud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDUwKTsKKyAgICAgICAgICAgIGdyaWREYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDMpOworICAgICAgICAgICAgdGhpcy5mSGludFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7CiAKLQkJCWhhbmRsZVBvc3NpYmxlSlZNQ2hhbmdlKCk7Ci0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9CisgICAgICAgICAgICBoYW5kbGVQb3NzaWJsZUpWTUNoYW5nZSgpOworICAgICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIGhhbmRsZVBvc3NpYmxlSlZNQ2hhbmdlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVQb3NzaWJsZUpWTUNoYW5nZSgpIHsKIAotCQkJaWYgKEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKSA9PSBudWxsKSB7Ci0JCQkJZkhpbnRUZXh0LnNldFRleHQoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX05vSlJFRm91bmRfbGluayk7Ci0JCQkJZkhpbnRUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJZkljb24uc2V0SW1hZ2UoRGlhbG9nLmdldEltYWdlKERpYWxvZy5ETEdfSU1HX01FU1NBR0VfV0FSTklORykpOwotCQkJCWZJY29uLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQorICAgICAgICAgICAgaWYgKEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5mSGludFRleHQuc2V0VGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTm9KUkVGb3VuZF9saW5rKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZIaW50VGV4dC5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICAgICAgICAgIHRoaXMuZkljb24uc2V0SW1hZ2UoRGlhbG9nLmdldEltYWdlKERpYWxvZy5ETEdfSU1HX01FU1NBR0VfV0FSTklORykpOworICAgICAgICAgICAgICAgIHRoaXMuZkljb24uc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAKLQkJCVN0cmluZyBzZWxlY3RlZENvbXBsaWFuY2UgPSBmSlJFR3JvdXAuZ2V0U2VsZWN0ZWRDb21waWxlckNvbXBsaWFuY2UoKTsKLQkJCWlmIChzZWxlY3RlZENvbXBsaWFuY2UgIT0gbnVsbCkgewotCQkJCVN0cmluZyBkZWZhdWx0Q29tcGxpYW5jZSA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFKTsKLQkJCQlpZiAoc2VsZWN0ZWRDb21wbGlhbmNlLmVxdWFscyhkZWZhdWx0Q29tcGxpYW5jZSkpIHsKLQkJCQkJZkhpbnRUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJCQlmSWNvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmSGludFRleHQuc2V0VGV4dChNZXNzYWdlcy5mb3JtYXQoCi0JCQkJCQkJTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0RldGVjdEdyb3VwX2RpZmZlcmVuZFdvcmtzcGFjZUNDX21lc3NhZ2UsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgZGVmYXVsdENvbXBsaWFuY2UsIHNlbGVjdGVkQ29tcGxpYW5jZSB9KSk7Ci0JCQkJCWZIaW50VGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlmSWNvbi5zZXRJbWFnZShEaWFsb2cuZ2V0SW1hZ2UoRGlhbG9nLkRMR19JTUdfTUVTU0FHRV9JTkZPKSk7Ci0JCQkJCWZJY29uLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KKyAgICAgICAgICAgIFN0cmluZyBzZWxlY3RlZENvbXBsaWFuY2UgPSBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVDT1BZLnRoaXMuZkpSRUdyb3VwLmdldFNlbGVjdGVkQ29tcGlsZXJDb21wbGlhbmNlKCk7CisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRDb21wbGlhbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdENvbXBsaWFuY2UgPSBKYXZhQ29yZS5nZXRPcHRpb24oSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSk7CisgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ29tcGxpYW5jZS5lcXVhbHMoZGVmYXVsdENvbXBsaWFuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZkhpbnRUZXh0LnNldFZpc2libGUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmZJY29uLnNldFZpc2libGUoZmFsc2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZkhpbnRUZXh0LnNldFRleHQoCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5mb3JtYXQoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0RldGVjdEdyb3VwX2RpZmZlcmVuZFdvcmtzcGFjZUNDX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgZGVmYXVsdENvbXBsaWFuY2UsIHNlbGVjdGVkQ29tcGxpYW5jZSB9KSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZkhpbnRUZXh0LnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZkljb24uc2V0SW1hZ2UoRGlhbG9nLmdldEltYWdlKERpYWxvZy5ETEdfSU1HX01FU1NBR0VfSU5GTykpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmZJY29uLnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAotCQkJc2VsZWN0ZWRDb21wbGlhbmNlID0gSmF2YUNvcmUuZ2V0T3B0aW9uKEphdmFDb3JlLkNPTVBJTEVSX0NPTVBMSUFOQ0UpOwotCQkJSVZNSW5zdGFsbCBzZWxlY3RlZEpWTSA9IGZKUkVHcm91cC5nZXRTZWxlY3RlZEpWTSgpOwotCQkJaWYgKHNlbGVjdGVkSlZNID09IG51bGwpIHsKLQkJCQlzZWxlY3RlZEpWTSA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLQkJCX0KLQkJCVN0cmluZyBqdm1Db21wbGlhbmNlID0gSmF2YUNvcmUuVkVSU0lPTl8xXzQ7Ci0JCQlpZiAoc2VsZWN0ZWRKVk0gaW5zdGFuY2VvZiBJVk1JbnN0YWxsMikgewotCQkJCWp2bUNvbXBsaWFuY2UgPSBKYXZhTW9kZWxVdGlsLmdldENvbXBpbGVyQ29tcGxpYW5jZSgoSVZNSW5zdGFsbDIpIHNlbGVjdGVkSlZNLCBKYXZhQ29yZS5WRVJTSU9OXzFfNCk7Ci0JCQl9Ci0JCQlpZiAoIXNlbGVjdGVkQ29tcGxpYW5jZS5lcXVhbHMoanZtQ29tcGxpYW5jZSkKLQkJCQkJJiYgKEphdmFNb2RlbFV0aWwuaXM1ME9ySGlnaGVyKHNlbGVjdGVkQ29tcGxpYW5jZSkgfHwgSmF2YU1vZGVsVXRpbC5pczUwT3JIaWdoZXIoanZtQ29tcGxpYW5jZSkpKSB7Ci0JCQkJaWYgKHNlbGVjdGVkQ29tcGxpYW5jZS5lcXVhbHMoSmF2YUNvcmUuVkVSU0lPTl8xXzUpKSB7Ci0JCQkJCXNlbGVjdGVkQ29tcGxpYW5jZSA9ICI1LjAiOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIGlmIChzZWxlY3RlZENvbXBsaWFuY2UuZXF1YWxzKEphdmFDb3JlLlZFUlNJT05fMV82KSkgewotCQkJCQlzZWxlY3RlZENvbXBsaWFuY2UgPSAiNi4wIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KKyAgICAgICAgICAgIHNlbGVjdGVkQ29tcGxpYW5jZSA9IEphdmFDb3JlLmdldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFKTsKKyAgICAgICAgICAgIElWTUluc3RhbGwgc2VsZWN0ZWRKVk0gPSBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVDT1BZLnRoaXMuZkpSRUdyb3VwLmdldFNlbGVjdGVkSlZNKCk7CisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRKVk0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlbGVjdGVkSlZNID0gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGp2bUNvbXBsaWFuY2UgPSBKYXZhQ29yZS5WRVJTSU9OXzFfNDsKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZEpWTSBpbnN0YW5jZW9mIElWTUluc3RhbGwyKSB7CisgICAgICAgICAgICAgICAganZtQ29tcGxpYW5jZSA9IEphdmFNb2RlbFV0aWwuZ2V0Q29tcGlsZXJDb21wbGlhbmNlKChJVk1JbnN0YWxsMikgc2VsZWN0ZWRKVk0sIEphdmFDb3JlLlZFUlNJT05fMV80KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2VsZWN0ZWRDb21wbGlhbmNlLmVxdWFscyhqdm1Db21wbGlhbmNlKQorICAgICAgICAgICAgICAgICYmIChKYXZhTW9kZWxVdGlsLmlzNTBPckhpZ2hlcihzZWxlY3RlZENvbXBsaWFuY2UpIHx8IEphdmFNb2RlbFV0aWwuaXM1ME9ySGlnaGVyKGp2bUNvbXBsaWFuY2UpKSkgeworICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZENvbXBsaWFuY2UuZXF1YWxzKEphdmFDb3JlLlZFUlNJT05fMV81KSkgeworICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbXBsaWFuY2UgPSAiNS4wIjsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRDb21wbGlhbmNlLmVxdWFscyhKYXZhQ29yZS5WRVJTSU9OXzFfNikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb21wbGlhbmNlID0gIjYuMCI7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlmSGludFRleHQuc2V0VGV4dChNZXNzYWdlcy5mb3JtYXQoCi0JCQkJCQlOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfRGV0ZWN0R3JvdXBfanJlX21lc3NhZ2UsCi0JCQkJCQluZXcgU3RyaW5nW10geyBzZWxlY3RlZENvbXBsaWFuY2UsIGp2bUNvbXBsaWFuY2UgfSkpOwotCQkJCWZIaW50VGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCWZJY29uLnNldEltYWdlKERpYWxvZy5nZXRJbWFnZShEaWFsb2cuRExHX0lNR19NRVNTQUdFX1dBUk5JTkcpKTsKLQkJCQlmSWNvbi5zZXRWaXNpYmxlKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlmSGludFRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJZkljb24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgICAgICB0aGlzLmZIaW50VGV4dC5zZXRUZXh0KE1lc3NhZ2VzLmZvcm1hdChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfRGV0ZWN0R3JvdXBfanJlX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IHNlbGVjdGVkQ29tcGxpYW5jZSwganZtQ29tcGxpYW5jZSB9KSk7CisgICAgICAgICAgICAgICAgdGhpcy5mSGludFRleHQuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZJY29uLnNldEltYWdlKERpYWxvZy5nZXRJbWFnZShEaWFsb2cuRExHX0lNR19NRVNTQUdFX1dBUk5JTkcpKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZJY29uLnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuZkhpbnRUZXh0LnNldFZpc2libGUoZmFsc2UpOworICAgICAgICAgICAgICAgIHRoaXMuZkljb24uc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgYm9vbGVhbiBtdXN0RGV0ZWN0KCkgewotCQkJcmV0dXJuIGZEZXRlY3Q7Ci0JCX0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gbXVzdERldGVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmZEZXRlY3Q7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCB1cGRhdGUoT2JzZXJ2YWJsZSBvLCBPYmplY3QgYXJnKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIExvY2F0aW9uR3JvdXApIHsKLQkJCQlib29sZWFuIG9sZERldGVjdFN0YXRlID0gZkRldGVjdDsKLQkJCQlmRGV0ZWN0ID0gY29tcHV0ZURldGVjdFN0YXRlKCk7CisgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShPYnNlcnZhYmxlIG8sIE9iamVjdCBhcmcpIHsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTG9jYXRpb25Hcm91cCkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gb2xkRGV0ZWN0U3RhdGUgPSB0aGlzLmZEZXRlY3Q7CisgICAgICAgICAgICAgICAgdGhpcy5mRGV0ZWN0ID0gY29tcHV0ZURldGVjdFN0YXRlKCk7CiAKLQkJCQlpZiAob2xkRGV0ZWN0U3RhdGUgIT0gZkRldGVjdCkgewotCQkJCQlzZXRDaGFuZ2VkKCk7Ci0JCQkJCW5vdGlmeU9ic2VydmVycygpOworICAgICAgICAgICAgICAgIGlmIChvbGREZXRlY3RTdGF0ZSAhPSB0aGlzLmZEZXRlY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Q2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlPYnNlcnZlcnMoKTsKIAotCQkJCQlpZiAoZkRldGVjdCkgewotCQkJCQkJZkhpbnRUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCQlmSGludFRleHQuc2V0VGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfRGV0ZWN0R3JvdXBfbWVzc2FnZSk7Ci0JCQkJCQlmSWNvbi5zZXRJbWFnZShEaWFsb2cuZ2V0SW1hZ2UoRGlhbG9nLkRMR19JTUdfTUVTU0FHRV9JTkZPKSk7Ci0JCQkJCQlmSWNvbi5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaGFuZGxlUG9zc2libGVKVk1DaGFuZ2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mRGV0ZWN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZIaW50VGV4dC5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mSGludFRleHQuc2V0VGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfRGV0ZWN0R3JvdXBfbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZJY29uLnNldEltYWdlKERpYWxvZy5nZXRJbWFnZShEaWFsb2cuRExHX0lNR19NRVNTQUdFX0lORk8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZkljb24uc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBvc3NpYmxlSlZNQ2hhbmdlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlCi0JCSAqIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZwotCQkgKiAuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCQkgKi8KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcganJlSUQgPSBCdWlsZFBhdGhTdXBwb3J0LkpSRV9QUkVGX1BBR0VfSUQ7Ci0JCQlTdHJpbmcgY29tcGxpYW5jZUlkID0gQ29tcGxpYW5jZVByZWZlcmVuY2VQYWdlLlBSRUZfSUQ7Ci0JCQlNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlkYXRhLnB1dChQcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlLkRBVEFfTk9fTElOSywgQm9vbGVhbi5UUlVFKTsKLQkJCVN0cmluZyBpZCA9ICJKUkUiLmVxdWFscyhlLnRleHQpID8ganJlSUQgOiBjb21wbGlhbmNlSWQ7IC8vJE5PTi1OTFMtMSQKLQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgaWQsIG5ldyBTdHJpbmdbXSB7IGpyZUlELCBjb21wbGlhbmNlSWQgfSwgZGF0YSkub3BlbigpOworICAgICAgICAvKgorICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnIC5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCisgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBqcmVJRCA9IEJ1aWxkUGF0aFN1cHBvcnQuSlJFX1BSRUZfUEFHRV9JRDsKKyAgICAgICAgICAgIFN0cmluZyBjb21wbGlhbmNlSWQgPSBDb21wbGlhbmNlUHJlZmVyZW5jZVBhZ2UuUFJFRl9JRDsKKyAgICAgICAgICAgIE1hcCBkYXRhID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgICAgIGRhdGEucHV0KFByb3BlcnR5QW5kUHJlZmVyZW5jZVBhZ2UuREFUQV9OT19MSU5LLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgU3RyaW5nIGlkID0gIkpSRSIuZXF1YWxzKGUudGV4dCkgPyBqcmVJRCA6IGNvbXBsaWFuY2VJZDsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBpZCwgbmV3IFN0cmluZ1tdIHsganJlSUQsIGNvbXBsaWFuY2VJZCB9LCBkYXRhKS5vcGVuKCk7CiAKLQkJCWZKUkVHcm91cC5oYW5kbGVQb3NzaWJsZUpWTUNoYW5nZSgpOwotCQkJaGFuZGxlUG9zc2libGVKVk1DaGFuZ2UoKTsKLQkJfQorICAgICAgICAgICAgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lQ09QWS50aGlzLmZKUkVHcm91cC5oYW5kbGVQb3NzaWJsZUpWTUNoYW5nZSgpOworICAgICAgICAgICAgaGFuZGxlUG9zc2libGVKVk1DaGFuZ2UoKTsKKyAgICAgICAgfQogCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUKLQkJICogb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZQotCQkgKiAuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXdpZGdldERlZmF1bHRTZWxlY3RlZChlKTsKLQkJfQotCX0KKyAgICAgICAgLyoKKyAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2UgLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIGZpbmFsIGNsYXNzIEpSRUdyb3VwIGltcGxlbWVudHMgT2JzZXJ2ZXIsIFNlbGVjdGlvbkxpc3RlbmVyLCBJRGlhbG9nRmllbGRMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBKUkVHcm91cCBpbXBsZW1lbnRzIE9ic2VydmVyLCBTZWxlY3Rpb25MaXN0ZW5lciwgSURpYWxvZ0ZpZWxkTGlzdGVuZXIgewogCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX1NFTEVDVEVEX0VFX1NFVFRJTkdTX0tFWSA9IEphdmFVSS5JRF9QTFVHSU4KLQkJCQkrICIubGFzdC5zZWxlY3RlZC5leGVjdXRpb24uZW52aXJvbWVudCI7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfU0VMRUNURURfRUVfU0VUVElOR1NfS0VZID0gSmF2YVVJLklEX1BMVUdJTiArICIubGFzdC5zZWxlY3RlZC5leGVjdXRpb24uZW52aXJvbWVudCI7IC8vJE5PTi1OTFMtMSQKIAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9TRUxFQ1RFRF9KUkVfU0VUVElOR1NfS0VZID0gSmF2YVVJLklEX1BMVUdJTiArICIubGFzdC5zZWxlY3RlZC5wcm9qZWN0LmpyZSI7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfU0VMRUNURURfSlJFX1NFVFRJTkdTX0tFWSA9IEphdmFVSS5JRF9QTFVHSU4gKyAiLmxhc3Quc2VsZWN0ZWQucHJvamVjdC5qcmUiOyAvLyROT04tTkxTLTEkCiAKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfU0VMRUNURURfSlJFX0tJTkQgPSBKYXZhVUkuSURfUExVR0lOICsgIi5sYXN0LnNlbGVjdGVkLmpyZS5raW5kIjsgLy8kTk9OLU5MUy0xJAorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9TRUxFQ1RFRF9KUkVfS0lORCA9IEphdmFVSS5JRF9QTFVHSU4gKyAiLmxhc3Quc2VsZWN0ZWQuanJlLmtpbmQiOyAvLyROT04tTkxTLTEkCiAKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSlJFID0gMDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSlJFID0gMDsKIAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPSkVDVF9KUkUgPSAxOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPSkVDVF9KUkUgPSAxOwogCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFRV9KUkUgPSAyOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRUVfSlJFID0gMjsKIAotCQlwcml2YXRlIGZpbmFsIFNlbGVjdGlvbkJ1dHRvbkRpYWxvZ0ZpZWxkIGZVc2VEZWZhdWx0SlJFLCBmVXNlUHJvamVjdEpSRSwgZlVzZUVFSlJFOworICAgICAgICBwcml2YXRlIGZpbmFsIFNlbGVjdGlvbkJ1dHRvbkRpYWxvZ0ZpZWxkIGZVc2VEZWZhdWx0SlJFLCBmVXNlUHJvamVjdEpSRSwgZlVzZUVFSlJFOwogCi0JCXByaXZhdGUgZmluYWwgQ29tYm9EaWFsb2dGaWVsZCBmSlJFQ29tYm87CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29tYm9EaWFsb2dGaWVsZCBmSlJFQ29tYm87CiAKLQkJcHJpdmF0ZSBmaW5hbCBDb21ib0RpYWxvZ0ZpZWxkIGZFRUNvbWJvOworICAgICAgICBwcml2YXRlIGZpbmFsIENvbWJvRGlhbG9nRmllbGQgZkVFQ29tYm87CiAKLQkJcHJpdmF0ZSBHcm91cCBmR3JvdXA7CisgICAgICAgIHByaXZhdGUgR3JvdXAgZkdyb3VwOwogCi0JCXByaXZhdGUgTGluayBmUHJlZmVyZW5jZUxpbms7CisgICAgICAgIHByaXZhdGUgTGluayBmUHJlZmVyZW5jZUxpbms7CiAKLQkJcHJpdmF0ZSBJVk1JbnN0YWxsW10gZkluc3RhbGxlZEpWTXM7CisgICAgICAgIHByaXZhdGUgSVZNSW5zdGFsbFtdIGZJbnN0YWxsZWRKVk1zOwogCi0JCXByaXZhdGUgU3RyaW5nW10gZkpSRUNvbXBsaWFuY2U7CisgICAgICAgIHByaXZhdGUgU3RyaW5nW10gZkpSRUNvbXBsaWFuY2U7CiAKLQkJcHJpdmF0ZSBJRXhlY3V0aW9uRW52aXJvbm1lbnRbXSBmSW5zdGFsbGVkRUVzOworICAgICAgICBwcml2YXRlIElFeGVjdXRpb25FbnZpcm9ubWVudFtdIGZJbnN0YWxsZWRFRXM7CiAKLQkJcHJpdmF0ZSBTdHJpbmdbXSBmRUVDb21wbGlhbmNlOworICAgICAgICBwcml2YXRlIFN0cmluZ1tdIGZFRUNvbXBsaWFuY2U7CiAKLQkJcHVibGljIEpSRUdyb3VwKCkgewotCQkJZlVzZURlZmF1bHRKUkUgPSBuZXcgU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQoU1dULlJBRElPKTsKLQkJCWZVc2VEZWZhdWx0SlJFLnNldExhYmVsVGV4dChnZXREZWZhdWx0SlZNTGFiZWwoKSk7CisgICAgICAgIHB1YmxpYyBKUkVHcm91cCgpIHsKKyAgICAgICAgICAgIHRoaXMuZlVzZURlZmF1bHRKUkUgPSBuZXcgU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQoU1dULlJBRElPKTsKKyAgICAgICAgICAgIHRoaXMuZlVzZURlZmF1bHRKUkUuc2V0TGFiZWxUZXh0KGdldERlZmF1bHRKVk1MYWJlbCgpKTsKIAotCQkJZlVzZVByb2plY3RKUkUgPSBuZXcgU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQoU1dULlJBRElPKTsKLQkJCWZVc2VQcm9qZWN0SlJFLnNldExhYmVsVGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfSlJFR3JvdXBfc3BlY2lmaWNfY29tcGxpYW5jZSk7CisgICAgICAgICAgICB0aGlzLmZVc2VQcm9qZWN0SlJFID0gbmV3IFNlbGVjdGlvbkJ1dHRvbkRpYWxvZ0ZpZWxkKFNXVC5SQURJTyk7CisgICAgICAgICAgICB0aGlzLmZVc2VQcm9qZWN0SlJFLnNldExhYmVsVGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfSlJFR3JvdXBfc3BlY2lmaWNfY29tcGxpYW5jZSk7CiAKLQkJCWZKUkVDb21ibyA9IG5ldyBDb21ib0RpYWxvZ0ZpZWxkKFNXVC5SRUFEX09OTFkpOwotCQkJZmlsbEluc3RhbGxlZEpSRXMoZkpSRUNvbWJvKTsKLQkJCWZKUkVDb21iby5zZXREaWFsb2dGaWVsZExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgdGhpcy5mSlJFQ29tYm8gPSBuZXcgQ29tYm9EaWFsb2dGaWVsZChTV1QuUkVBRF9PTkxZKTsKKyAgICAgICAgICAgIGZpbGxJbnN0YWxsZWRKUkVzKHRoaXMuZkpSRUNvbWJvKTsKKyAgICAgICAgICAgIHRoaXMuZkpSRUNvbWJvLnNldERpYWxvZ0ZpZWxkTGlzdGVuZXIodGhpcyk7CiAKLQkJCWZVc2VFRUpSRSA9IG5ldyBTZWxlY3Rpb25CdXR0b25EaWFsb2dGaWVsZChTV1QuUkFESU8pOwotCQkJZlVzZUVFSlJFLnNldExhYmVsVGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfSlJFR3JvdXBfc3BlY2lmaWNfRUUpOworICAgICAgICAgICAgdGhpcy5mVXNlRUVKUkUgPSBuZXcgU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQoU1dULlJBRElPKTsKKyAgICAgICAgICAgIHRoaXMuZlVzZUVFSlJFLnNldExhYmVsVGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfSlJFR3JvdXBfc3BlY2lmaWNfRUUpOwogCi0JCQlmRUVDb21ibyA9IG5ldyBDb21ib0RpYWxvZ0ZpZWxkKFNXVC5SRUFEX09OTFkpOwotCQkJZmlsbEV4ZWN1dGlvbkVudmlyb25tZW50cyhmRUVDb21ibyk7Ci0JCQlmRUVDb21iby5zZXREaWFsb2dGaWVsZExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgdGhpcy5mRUVDb21ibyA9IG5ldyBDb21ib0RpYWxvZ0ZpZWxkKFNXVC5SRUFEX09OTFkpOworICAgICAgICAgICAgZmlsbEV4ZWN1dGlvbkVudmlyb25tZW50cyh0aGlzLmZFRUNvbWJvKTsKKyAgICAgICAgICAgIHRoaXMuZkVFQ29tYm8uc2V0RGlhbG9nRmllbGRMaXN0ZW5lcih0aGlzKTsKIAotCQkJc3dpdGNoIChnZXRMYXN0U2VsZWN0ZWRKUkVLaW5kKCkpIHsKLQkJCWNhc2UgREVGQVVMVF9KUkU6Ci0JCQkJZlVzZURlZmF1bHRKUkUuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQUk9KRUNUX0pSRToKLQkJCQlmVXNlUHJvamVjdEpSRS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVFX0pSRToKLQkJCQlmVXNlRUVKUkUuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCWJyZWFrOwotCQkJfQorICAgICAgICAgICAgc3dpdGNoIChnZXRMYXN0U2VsZWN0ZWRKUkVLaW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERFRkFVTFRfSlJFOgorICAgICAgICAgICAgICAgICAgICB0aGlzLmZVc2VEZWZhdWx0SlJFLnNldFNlbGVjdGlvbih0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQUk9KRUNUX0pSRToKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mVXNlUHJvamVjdEpSRS5zZXRTZWxlY3Rpb24odHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRUVfSlJFOgorICAgICAgICAgICAgICAgICAgICB0aGlzLmZVc2VFRUpSRS5zZXRTZWxlY3Rpb24odHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCi0JCQlmSlJFQ29tYm8uc2V0RW5hYmxlZChmVXNlUHJvamVjdEpSRS5pc1NlbGVjdGVkKCkpOwotCQkJZkVFQ29tYm8uc2V0RW5hYmxlZChmVXNlRUVKUkUuaXNTZWxlY3RlZCgpKTsKKyAgICAgICAgICAgIHRoaXMuZkpSRUNvbWJvLnNldEVuYWJsZWQodGhpcy5mVXNlUHJvamVjdEpSRS5pc1NlbGVjdGVkKCkpOworICAgICAgICAgICAgdGhpcy5mRUVDb21iby5zZXRFbmFibGVkKHRoaXMuZlVzZUVFSlJFLmlzU2VsZWN0ZWQoKSk7CiAKLQkJCWZVc2VEZWZhdWx0SlJFLnNldERpYWxvZ0ZpZWxkTGlzdGVuZXIodGhpcyk7Ci0JCQlmVXNlUHJvamVjdEpSRS5zZXREaWFsb2dGaWVsZExpc3RlbmVyKHRoaXMpOwotCQkJZlVzZUVFSlJFLnNldERpYWxvZ0ZpZWxkTGlzdGVuZXIodGhpcyk7Ci0JCX0KKyAgICAgICAgICAgIHRoaXMuZlVzZURlZmF1bHRKUkUuc2V0RGlhbG9nRmllbGRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIHRoaXMuZlVzZVByb2plY3RKUkUuc2V0RGlhbG9nRmllbGRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIHRoaXMuZlVzZUVFSlJFLnNldERpYWxvZ0ZpZWxkTGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCWZHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWZHcm91cC5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQkJZkdyb3VwLnNldExheW91dChpbml0R3JpZExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSksIHRydWUpKTsKLQkJCWZHcm91cC5zZXRUZXh0KE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9KUkVHcm91cF90aXRsZSk7CisgICAgICAgIHB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworICAgICAgICAgICAgdGhpcy5mR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisgICAgICAgICAgICB0aGlzLmZHcm91cC5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOworICAgICAgICAgICAgdGhpcy5mR3JvdXAuc2V0TGF5b3V0KGluaXRHcmlkTGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSwgdHJ1ZSkpOworICAgICAgICAgICAgdGhpcy5mR3JvdXAuc2V0VGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfSlJFR3JvdXBfdGl0bGUpOwogCi0JCQlmVXNlRGVmYXVsdEpSRS5kb0ZpbGxJbnRvR3JpZChmR3JvdXAsIDEpOworICAgICAgICAgICAgdGhpcy5mVXNlRGVmYXVsdEpSRS5kb0ZpbGxJbnRvR3JpZCh0aGlzLmZHcm91cCwgMSk7CiAKLQkJCWZQcmVmZXJlbmNlTGluayA9IG5ldyBMaW5rKGZHcm91cCwgU1dULk5PTkUpOwotCQkJZlByZWZlcmVuY2VMaW5rLnNldEZvbnQoZkdyb3VwLmdldEZvbnQoKSk7Ci0JCQlmUHJlZmVyZW5jZUxpbmsuc2V0VGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfSlJFR3JvdXBfbGlua19kZXNjcmlwdGlvbik7Ci0JCQlmUHJlZmVyZW5jZUxpbmsuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJZlByZWZlcmVuY2VMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgdGhpcy5mUHJlZmVyZW5jZUxpbmsgPSBuZXcgTGluayh0aGlzLmZHcm91cCwgU1dULk5PTkUpOworICAgICAgICAgICAgdGhpcy5mUHJlZmVyZW5jZUxpbmsuc2V0Rm9udCh0aGlzLmZHcm91cC5nZXRGb250KCkpOworICAgICAgICAgICAgdGhpcy5mUHJlZmVyZW5jZUxpbmsuc2V0VGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfSlJFR3JvdXBfbGlua19kZXNjcmlwdGlvbik7CisgICAgICAgICAgICB0aGlzLmZQcmVmZXJlbmNlTGluay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7CisgICAgICAgICAgICB0aGlzLmZQcmVmZXJlbmNlTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKIAotCQkJQ29tcG9zaXRlIG5vbkRlZmF1bHRKUkVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGZHcm91cCwgU1dULk5PTkUpOwotCQkJbm9uRGVmYXVsdEpSRUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbm9uRGVmYXVsdEpSRUNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKyAgICAgICAgICAgIENvbXBvc2l0ZSBub25EZWZhdWx0SlJFQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLmZHcm91cCwgU1dULk5PTkUpOworICAgICAgICAgICAgbm9uRGVmYXVsdEpSRUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOworICAgICAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisgICAgICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOworICAgICAgICAgICAgbm9uRGVmYXVsdEpSRUNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKIAotCQkJZlVzZVByb2plY3RKUkUuZG9GaWxsSW50b0dyaWQobm9uRGVmYXVsdEpSRUNvbXBvc2l0ZSwgMSk7CisgICAgICAgICAgICB0aGlzLmZVc2VQcm9qZWN0SlJFLmRvRmlsbEludG9HcmlkKG5vbkRlZmF1bHRKUkVDb21wb3NpdGUsIDEpOwogCi0JCQlDb21ibyBjb21ib0NvbnRyb2wgPSBmSlJFQ29tYm8uZ2V0Q29tYm9Db250cm9sKG5vbkRlZmF1bHRKUkVDb21wb3NpdGUpOwotCQkJY29tYm9Db250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJCWNvbWJvQ29udHJvbC5zZXRWaXNpYmxlSXRlbUNvdW50KDMwKTsKKyAgICAgICAgICAgIENvbWJvIGNvbWJvQ29udHJvbCA9IHRoaXMuZkpSRUNvbWJvLmdldENvbWJvQ29udHJvbChub25EZWZhdWx0SlJFQ29tcG9zaXRlKTsKKyAgICAgICAgICAgIGNvbWJvQ29udHJvbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7CisgICAgICAgICAgICBjb21ib0NvbnRyb2wuc2V0VmlzaWJsZUl0ZW1Db3VudCgzMCk7CiAKLQkJCWZVc2VFRUpSRS5kb0ZpbGxJbnRvR3JpZChub25EZWZhdWx0SlJFQ29tcG9zaXRlLCAxKTsKKyAgICAgICAgICAgIHRoaXMuZlVzZUVFSlJFLmRvRmlsbEludG9HcmlkKG5vbkRlZmF1bHRKUkVDb21wb3NpdGUsIDEpOwogCi0JCQlDb21ibyBlZUNvbWJvQ29udHJvbCA9IGZFRUNvbWJvLmdldENvbWJvQ29udHJvbChub25EZWZhdWx0SlJFQ29tcG9zaXRlKTsKLQkJCWVlQ29tYm9Db250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJCWVlQ29tYm9Db250cm9sLnNldFZpc2libGVJdGVtQ291bnQoMzApOworICAgICAgICAgICAgQ29tYm8gZWVDb21ib0NvbnRyb2wgPSB0aGlzLmZFRUNvbWJvLmdldENvbWJvQ29udHJvbChub25EZWZhdWx0SlJFQ29tcG9zaXRlKTsKKyAgICAgICAgICAgIGVlQ29tYm9Db250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGVlQ29tYm9Db250cm9sLnNldFZpc2libGVJdGVtQ291bnQoMzApOwogCi0JCQl1cGRhdGVFbmFibGVTdGF0ZSgpOwotCQkJcmV0dXJuIGZHcm91cDsKLQkJfQorICAgICAgICAgICAgdXBkYXRlRW5hYmxlU3RhdGUoKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmZHcm91cDsKKyAgICAgICAgfQogCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUKLQkJICogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLklEaWFsb2dGaWVsZExpc3RlbmVyCi0JCSAqICNkaWFsb2dGaWVsZENoYW5nZWQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLgotCQkgKiBEaWFsb2dGaWVsZCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpYWxvZ0ZpZWxkQ2hhbmdlZChEaWFsb2dGaWVsZCBmaWVsZCkgewotCQkJdXBkYXRlRW5hYmxlU3RhdGUoKTsKLQkJCWZEZXRlY3RHcm91cC5oYW5kbGVQb3NzaWJsZUpWTUNoYW5nZSgpOwotCQkJaWYgKGZpZWxkID09IGZKUkVDb21ibykgewotCQkJCWlmIChmVXNlUHJvamVjdEpSRS5pc1NlbGVjdGVkKCkpIHsKLQkJCQkJc3RvcmVTZWxlY3Rpb25WYWx1ZShmSlJFQ29tYm8sIExBU1RfU0VMRUNURURfSlJFX1NFVFRJTkdTX0tFWSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChmaWVsZCA9PSBmRUVDb21ibykgewotCQkJCWlmIChmVXNlRUVKUkUuaXNTZWxlY3RlZCgpKSB7Ci0JCQkJCXN0b3JlU2VsZWN0aW9uVmFsdWUoZkVFQ29tYm8sIExBU1RfU0VMRUNURURfRUVfU0VUVElOR1NfS0VZKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGZpZWxkID09IGZVc2VEZWZhdWx0SlJFKSB7Ci0JCQkJaWYgKGZVc2VEZWZhdWx0SlJFLmlzU2VsZWN0ZWQoKSkgewotCQkJCQlKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLnB1dChMQVNUX1NFTEVDVEVEX0pSRV9LSU5ELCBERUZBVUxUX0pSRSk7Ci0JCQkJCWZVc2VQcm9qZWN0SlJFLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCWZVc2VFRUpSRS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZmllbGQgPT0gZlVzZVByb2plY3RKUkUpIHsKLQkJCQlpZiAoZlVzZVByb2plY3RKUkUuaXNTZWxlY3RlZCgpKSB7Ci0JCQkJCUphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkucHV0KExBU1RfU0VMRUNURURfSlJFX0tJTkQsIFBST0pFQ1RfSlJFKTsKLQkJCQkJZlVzZURlZmF1bHRKUkUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJZlVzZUVFSlJFLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChmaWVsZCA9PSBmVXNlRUVKUkUpIHsKLQkJCQlpZiAoZlVzZUVFSlJFLmlzU2VsZWN0ZWQoKSkgewotCQkJCQlKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLnB1dChMQVNUX1NFTEVDVEVEX0pSRV9LSU5ELCBFRV9KUkUpOwotCQkJCQlmVXNlRGVmYXVsdEpSRS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQlmVXNlUHJvamVjdEpSRS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICAvKgorICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLklEaWFsb2dGaWVsZExpc3RlbmVyCisgICAgICAgICAqICNkaWFsb2dGaWVsZENoYW5nZWQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLiBEaWFsb2dGaWVsZCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGRpYWxvZ0ZpZWxkQ2hhbmdlZChEaWFsb2dGaWVsZCBmaWVsZCkgeworICAgICAgICAgICAgdXBkYXRlRW5hYmxlU3RhdGUoKTsKKyAgICAgICAgICAgIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZUNPUFkudGhpcy5mRGV0ZWN0R3JvdXAuaGFuZGxlUG9zc2libGVKVk1DaGFuZ2UoKTsKKyAgICAgICAgICAgIGlmIChmaWVsZCA9PSB0aGlzLmZKUkVDb21ibykgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLmZVc2VQcm9qZWN0SlJFLmlzU2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBzdG9yZVNlbGVjdGlvblZhbHVlKHRoaXMuZkpSRUNvbWJvLCBMQVNUX1NFTEVDVEVEX0pSRV9TRVRUSU5HU19LRVkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT0gdGhpcy5mRUVDb21ibykgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLmZVc2VFRUpSRS5pc1NlbGVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVTZWxlY3Rpb25WYWx1ZSh0aGlzLmZFRUNvbWJvLCBMQVNUX1NFTEVDVEVEX0VFX1NFVFRJTkdTX0tFWSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZCA9PSB0aGlzLmZVc2VEZWZhdWx0SlJFKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuZlVzZURlZmF1bHRKUkUuaXNTZWxlY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkucHV0KExBU1RfU0VMRUNURURfSlJFX0tJTkQsIERFRkFVTFRfSlJFKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mVXNlUHJvamVjdEpSRS5zZXRTZWxlY3Rpb24oZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmZVc2VFRUpSRS5zZXRTZWxlY3Rpb24oZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGQgPT0gdGhpcy5mVXNlUHJvamVjdEpSRSkgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLmZVc2VQcm9qZWN0SlJFLmlzU2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLnB1dChMQVNUX1NFTEVDVEVEX0pSRV9LSU5ELCBQUk9KRUNUX0pSRSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZlVzZURlZmF1bHRKUkUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mVXNlRUVKUkUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkID09IHRoaXMuZlVzZUVFSlJFKSB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuZlVzZUVFSlJFLmlzU2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLnB1dChMQVNUX1NFTEVDVEVEX0pSRV9LSU5ELCBFRV9KUkUpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmZVc2VEZWZhdWx0SlJFLnNldFNlbGVjdGlvbihmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZlVzZVByb2plY3RKUkUuc2V0U2VsZWN0aW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHJpdmF0ZSB2b2lkIGZpbGxFeGVjdXRpb25FbnZpcm9ubWVudHMoQ29tYm9EaWFsb2dGaWVsZCBjb21ib0ZpZWxkKSB7Ci0JCQlTdHJpbmcgc2VsZWN0ZWRJdGVtID0gZ2V0TGFzdFNlbGVjdGVkRUUoKTsKLQkJCWludCBzZWxlY3Rpb25JbmRleCA9IC0xOwotCQkJaWYgKGZVc2VFRUpSRS5pc1NlbGVjdGVkKCkpIHsKLQkJCQlzZWxlY3Rpb25JbmRleCA9IGNvbWJvRmllbGQuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEpIHsvLyBwYXJhbm9pYQotCQkJCQlzZWxlY3RlZEl0ZW0gPSBjb21ib0ZpZWxkLmdldEl0ZW1zKClbc2VsZWN0aW9uSW5kZXhdOwotCQkJCX0KLQkJCX0KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHByaXZhdGUgdm9pZCBmaWxsRXhlY3V0aW9uRW52aXJvbm1lbnRzKENvbWJvRGlhbG9nRmllbGQgY29tYm9GaWVsZCkgeworICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGVkSXRlbSA9IGdldExhc3RTZWxlY3RlZEVFKCk7CisgICAgICAgICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSAtMTsKKyAgICAgICAgICAgIGlmICh0aGlzLmZVc2VFRUpSRS5pc1NlbGVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3Rpb25JbmRleCA9IGNvbWJvRmllbGQuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uSW5kZXggIT0gLTEpIHsvLyBwYXJhbm9pYQorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW0gPSBjb21ib0ZpZWxkLmdldEl0ZW1zKClbc2VsZWN0aW9uSW5kZXhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJZkluc3RhbGxlZEVFcyA9IEphdmFSdW50aW1lLmdldEV4ZWN1dGlvbkVudmlyb25tZW50c01hbmFnZXIoKS5nZXRFeGVjdXRpb25FbnZpcm9ubWVudHMoKTsKLQkJCUFycmF5cy5zb3J0KGZJbnN0YWxsZWRFRXMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJCQkJcmV0dXJuIFBvbGljeS5nZXRDb21wYXJhdG9yKCkuY29tcGFyZSgoKElFeGVjdXRpb25FbnZpcm9ubWVudCkgYXJnMCkuZ2V0SWQoKSwKLQkJCQkJCQkoKElFeGVjdXRpb25FbnZpcm9ubWVudCkgYXJnMSkuZ2V0SWQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlzZWxlY3Rpb25JbmRleCA9IC0xOy8vIGZpbmQgbmV3IGluZGV4Ci0JCQlTdHJpbmdbXSBlZUxhYmVscyA9IG5ldyBTdHJpbmdbZkluc3RhbGxlZEVFcy5sZW5ndGhdOwotCQkJZkVFQ29tcGxpYW5jZSA9IG5ldyBTdHJpbmdbZkluc3RhbGxlZEVFcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmSW5zdGFsbGVkRUVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZWVMYWJlbHNbaV0gPSBmSW5zdGFsbGVkRUVzW2ldLmdldElkKCk7Ci0JCQkJaWYgKHNlbGVjdGVkSXRlbSAhPSBudWxsICYmIGVlTGFiZWxzW2ldLmVxdWFscyhzZWxlY3RlZEl0ZW0pKSB7Ci0JCQkJCXNlbGVjdGlvbkluZGV4ID0gaTsKLQkJCQl9Ci0JCQkJZkVFQ29tcGxpYW5jZVtpXSA9IEphdmFNb2RlbFV0aWwuZ2V0RXhlY3V0aW9uRW52aXJvbm1lbnRDb21wbGlhbmNlKGZJbnN0YWxsZWRFRXNbaV0pOwotCQkJfQotCQkJY29tYm9GaWVsZC5zZXRJdGVtcyhlZUxhYmVscyk7Ci0JCQlpZiAoc2VsZWN0aW9uSW5kZXggPT0gLTEpIHsKLQkJCQljb21ib0ZpZWxkLnNlbGVjdEl0ZW0oZ2V0RGVmYXVsdEVFTmFtZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29tYm9GaWVsZC5zZWxlY3RJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHRoaXMuZkluc3RhbGxlZEVFcyA9IEphdmFSdW50aW1lLmdldEV4ZWN1dGlvbkVudmlyb25tZW50c01hbmFnZXIoKS5nZXRFeGVjdXRpb25FbnZpcm9ubWVudHMoKTsKKyAgICAgICAgICAgIEFycmF5cy5zb3J0KHRoaXMuZkluc3RhbGxlZEVFcywgbmV3IENvbXBhcmF0b3IoKSB7CiAKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXByaXZhdGUgdm9pZCBmaWxsSW5zdGFsbGVkSlJFcyhDb21ib0RpYWxvZ0ZpZWxkIGNvbWJvRmllbGQpIHsKLQkJCVN0cmluZyBzZWxlY3RlZEl0ZW0gPSBnZXRMYXN0U2VsZWN0ZWRKUkUoKTsKLQkJCWludCBzZWxlY3Rpb25JbmRleCA9IC0xOwotCQkJaWYgKGZVc2VQcm9qZWN0SlJFLmlzU2VsZWN0ZWQoKSkgewotCQkJCXNlbGVjdGlvbkluZGV4ID0gY29tYm9GaWVsZC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCWlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgey8vIHBhcmFub2lhCi0JCQkJCXNlbGVjdGVkSXRlbSA9IGNvbWJvRmllbGQuZ2V0SXRlbXMoKVtzZWxlY3Rpb25JbmRleF07Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBvbGljeS5nZXRDb21wYXJhdG9yKCkuY29tcGFyZSgoKElFeGVjdXRpb25FbnZpcm9ubWVudCkgYXJnMCkuZ2V0SWQoKSwgKChJRXhlY3V0aW9uRW52aXJvbm1lbnQpIGFyZzEpLmdldElkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgc2VsZWN0aW9uSW5kZXggPSAtMTsvLyBmaW5kIG5ldyBpbmRleAorICAgICAgICAgICAgU3RyaW5nW10gZWVMYWJlbHMgPSBuZXcgU3RyaW5nW3RoaXMuZkluc3RhbGxlZEVFcy5sZW5ndGhdOworICAgICAgICAgICAgdGhpcy5mRUVDb21wbGlhbmNlID0gbmV3IFN0cmluZ1t0aGlzLmZJbnN0YWxsZWRFRXMubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5mSW5zdGFsbGVkRUVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZWVMYWJlbHNbaV0gPSB0aGlzLmZJbnN0YWxsZWRFRXNbaV0uZ2V0SWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtICE9IG51bGwgJiYgZWVMYWJlbHNbaV0uZXF1YWxzKHNlbGVjdGVkSXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uSW5kZXggPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLmZFRUNvbXBsaWFuY2VbaV0gPSBKYXZhTW9kZWxVdGlsLmdldEV4ZWN1dGlvbkVudmlyb25tZW50Q29tcGxpYW5jZSh0aGlzLmZJbnN0YWxsZWRFRXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tYm9GaWVsZC5zZXRJdGVtcyhlZUxhYmVscyk7CisgICAgICAgICAgICBpZiAoc2VsZWN0aW9uSW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBjb21ib0ZpZWxkLnNlbGVjdEl0ZW0oZ2V0RGVmYXVsdEVFTmFtZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tYm9GaWVsZC5zZWxlY3RJdGVtKHNlbGVjdGVkSXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJZkluc3RhbGxlZEpWTXMgPSBnZXRXb3Jrc3BhY2VKUkVzKCk7Ci0JCQlBcnJheXMuc29ydChmSW5zdGFsbGVkSlZNcywgbmV3IENvbXBhcmF0b3IoKSB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwcml2YXRlIHZvaWQgZmlsbEluc3RhbGxlZEpSRXMoQ29tYm9EaWFsb2dGaWVsZCBjb21ib0ZpZWxkKSB7CisgICAgICAgICAgICBTdHJpbmcgc2VsZWN0ZWRJdGVtID0gZ2V0TGFzdFNlbGVjdGVkSlJFKCk7CisgICAgICAgICAgICBpbnQgc2VsZWN0aW9uSW5kZXggPSAtMTsKKyAgICAgICAgICAgIGlmICh0aGlzLmZVc2VQcm9qZWN0SlJFLmlzU2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHNlbGVjdGlvbkluZGV4ID0gY29tYm9GaWVsZC5nZXRTZWxlY3Rpb25JbmRleCgpOworICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSkgey8vIHBhcmFub2lhCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbSA9IGNvbWJvRmllbGQuZ2V0SXRlbXMoKVtzZWxlY3Rpb25JbmRleF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotCQkJCQlJVk1JbnN0YWxsIGkwID0gKElWTUluc3RhbGwpIGFyZzA7Ci0JCQkJCUlWTUluc3RhbGwgaTEgPSAoSVZNSW5zdGFsbCkgYXJnMTsKLQkJCQkJaWYgKGkxIGluc3RhbmNlb2YgSVZNSW5zdGFsbDIgJiYgaTAgaW5zdGFuY2VvZiBJVk1JbnN0YWxsMikgewotCQkJCQkJU3RyaW5nIGNjMCA9IEphdmFNb2RlbFV0aWwuZ2V0Q29tcGlsZXJDb21wbGlhbmNlKChJVk1JbnN0YWxsMikgaTAsIEphdmFDb3JlLlZFUlNJT05fMV80KTsKLQkJCQkJCVN0cmluZyBjYzEgPSBKYXZhTW9kZWxVdGlsLmdldENvbXBpbGVyQ29tcGxpYW5jZSgoSVZNSW5zdGFsbDIpIGkxLCBKYXZhQ29yZS5WRVJTSU9OXzFfNCk7Ci0JCQkJCQlpbnQgcmVzdWx0ID0gY2MxLmNvbXBhcmVUbyhjYzApOwotCQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gUG9saWN5LmdldENvbXBhcmF0b3IoKS5jb21wYXJlKGkwLmdldE5hbWUoKSwgaTEuZ2V0TmFtZSgpKTsKLQkJCQl9CisgICAgICAgICAgICB0aGlzLmZJbnN0YWxsZWRKVk1zID0gZ2V0V29ya3NwYWNlSlJFcygpOworICAgICAgICAgICAgQXJyYXlzLnNvcnQodGhpcy5mSW5zdGFsbGVkSlZNcywgbmV3IENvbXBhcmF0b3IoKSB7CiAKLQkJCX0pOwotCQkJc2VsZWN0aW9uSW5kZXggPSAtMTsvLyBmaW5kIG5ldyBpbmRleAotCQkJU3RyaW5nW10ganJlTGFiZWxzID0gbmV3IFN0cmluZ1tmSW5zdGFsbGVkSlZNcy5sZW5ndGhdOwotCQkJZkpSRUNvbXBsaWFuY2UgPSBuZXcgU3RyaW5nW2ZJbnN0YWxsZWRKVk1zLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZJbnN0YWxsZWRKVk1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJanJlTGFiZWxzW2ldID0gZkluc3RhbGxlZEpWTXNbaV0uZ2V0TmFtZSgpOwotCQkJCWlmIChzZWxlY3RlZEl0ZW0gIT0gbnVsbCAmJiBqcmVMYWJlbHNbaV0uZXF1YWxzKHNlbGVjdGVkSXRlbSkpIHsKLQkJCQkJc2VsZWN0aW9uSW5kZXggPSBpOwotCQkJCX0KLQkJCQlpZiAoZkluc3RhbGxlZEpWTXNbaV0gaW5zdGFuY2VvZiBJVk1JbnN0YWxsMikgewotCQkJCQlmSlJFQ29tcGxpYW5jZVtpXSA9IEphdmFNb2RlbFV0aWwuZ2V0Q29tcGlsZXJDb21wbGlhbmNlKChJVk1JbnN0YWxsMikgZkluc3RhbGxlZEpWTXNbaV0sCi0JCQkJCQkJSmF2YUNvcmUuVkVSU0lPTl8xXzQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZKUkVDb21wbGlhbmNlW2ldID0gSmF2YUNvcmUuVkVSU0lPTl8xXzQ7Ci0JCQkJfQotCQkJfQotCQkJY29tYm9GaWVsZC5zZXRJdGVtcyhqcmVMYWJlbHMpOwotCQkJaWYgKHNlbGVjdGlvbkluZGV4ID09IC0xKSB7Ci0JCQkJY29tYm9GaWVsZC5zZWxlY3RJdGVtKGdldERlZmF1bHRKVk1OYW1lKCkpOwotCQkJfSBlbHNlIHsKLQkJCQljb21ib0ZpZWxkLnNlbGVjdEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKKyAgICAgICAgICAgICAgICAgICAgSVZNSW5zdGFsbCBpMCA9IChJVk1JbnN0YWxsKSBhcmcwOworICAgICAgICAgICAgICAgICAgICBJVk1JbnN0YWxsIGkxID0gKElWTUluc3RhbGwpIGFyZzE7CisgICAgICAgICAgICAgICAgICAgIGlmIChpMSBpbnN0YW5jZW9mIElWTUluc3RhbGwyICYmIGkwIGluc3RhbmNlb2YgSVZNSW5zdGFsbDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYzAgPSBKYXZhTW9kZWxVdGlsLmdldENvbXBpbGVyQ29tcGxpYW5jZSgoSVZNSW5zdGFsbDIpIGkwLCBKYXZhQ29yZS5WRVJTSU9OXzFfNCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2MxID0gSmF2YU1vZGVsVXRpbC5nZXRDb21waWxlckNvbXBsaWFuY2UoKElWTUluc3RhbGwyKSBpMSwgSmF2YUNvcmUuVkVSU0lPTl8xXzQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IGNjMS5jb21wYXJlVG8oY2MwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBvbGljeS5nZXRDb21wYXJhdG9yKCkuY29tcGFyZShpMC5nZXROYW1lKCksIGkxLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQogCi0JCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRFRU5hbWUoKSB7Ci0JCQlJVk1JbnN0YWxsIGRlZmF1bHRWTSA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgc2VsZWN0aW9uSW5kZXggPSAtMTsvLyBmaW5kIG5ldyBpbmRleAorICAgICAgICAgICAgU3RyaW5nW10ganJlTGFiZWxzID0gbmV3IFN0cmluZ1t0aGlzLmZJbnN0YWxsZWRKVk1zLmxlbmd0aF07CisgICAgICAgICAgICB0aGlzLmZKUkVDb21wbGlhbmNlID0gbmV3IFN0cmluZ1t0aGlzLmZJbnN0YWxsZWRKVk1zLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZkluc3RhbGxlZEpWTXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBqcmVMYWJlbHNbaV0gPSB0aGlzLmZJbnN0YWxsZWRKVk1zW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtICE9IG51bGwgJiYganJlTGFiZWxzW2ldLmVxdWFscyhzZWxlY3RlZEl0ZW0pKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuZkluc3RhbGxlZEpWTXNbaV0gaW5zdGFuY2VvZiBJVk1JbnN0YWxsMikgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmZKUkVDb21wbGlhbmNlW2ldID0gSmF2YU1vZGVsVXRpbC5nZXRDb21waWxlckNvbXBsaWFuY2UoKElWTUluc3RhbGwyKSB0aGlzLmZJbnN0YWxsZWRKVk1zW2ldLCBKYXZhQ29yZS5WRVJTSU9OXzFfNCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mSlJFQ29tcGxpYW5jZVtpXSA9IEphdmFDb3JlLlZFUlNJT05fMV80OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbWJvRmllbGQuc2V0SXRlbXMoanJlTGFiZWxzKTsKKyAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgIGNvbWJvRmllbGQuc2VsZWN0SXRlbShnZXREZWZhdWx0SlZNTmFtZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tYm9GaWVsZC5zZWxlY3RJdGVtKHNlbGVjdGVkSXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkJSUV4ZWN1dGlvbkVudmlyb25tZW50W10gZW52aXJvbm1lbnRzID0gSmF2YVJ1bnRpbWUuZ2V0RXhlY3V0aW9uRW52aXJvbm1lbnRzTWFuYWdlcigpCi0JCQkJCS5nZXRFeGVjdXRpb25FbnZpcm9ubWVudHMoKTsKLQkJCWlmIChkZWZhdWx0Vk0gIT0gbnVsbCkgewotCQkJCWZvciAoSUV4ZWN1dGlvbkVudmlyb25tZW50IGVudmlyb25tZW50IDogZW52aXJvbm1lbnRzKSB7Ci0JCQkJCUlWTUluc3RhbGwgZWVEZWZhdWx0Vk0gPSBlbnZpcm9ubWVudC5nZXREZWZhdWx0Vk0oKTsKLQkJCQkJaWYgKGVlRGVmYXVsdFZNICE9IG51bGwgJiYgZGVmYXVsdFZNLmdldElkKCkuZXF1YWxzKGVlRGVmYXVsdFZNLmdldElkKCkpKSB7Ci0JCQkJCQlyZXR1cm4gZW52aXJvbm1lbnQuZ2V0SWQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdEVFTmFtZSgpIHsKKyAgICAgICAgICAgIElWTUluc3RhbGwgZGVmYXVsdFZNID0gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOwogCi0JCQlTdHJpbmcgZGVmYXVsdENDOwotCQkJaWYgKGRlZmF1bHRWTSBpbnN0YW5jZW9mIElWTUluc3RhbGwyKSB7Ci0JCQkJZGVmYXVsdENDID0gSmF2YU1vZGVsVXRpbC5nZXRDb21waWxlckNvbXBsaWFuY2UoKElWTUluc3RhbGwyKSBkZWZhdWx0Vk0sIEphdmFDb3JlLlZFUlNJT05fMV80KTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmYXVsdENDID0gSmF2YUNvcmUuVkVSU0lPTl8xXzQ7Ci0JCQl9CisgICAgICAgICAgICBJRXhlY3V0aW9uRW52aXJvbm1lbnRbXSBlbnZpcm9ubWVudHMgPSBKYXZhUnVudGltZS5nZXRFeGVjdXRpb25FbnZpcm9ubWVudHNNYW5hZ2VyKCkuZ2V0RXhlY3V0aW9uRW52aXJvbm1lbnRzKCk7CisgICAgICAgICAgICBpZiAoZGVmYXVsdFZNICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKElFeGVjdXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCA6IGVudmlyb25tZW50cykgeworICAgICAgICAgICAgICAgICAgICBJVk1JbnN0YWxsIGVlRGVmYXVsdFZNID0gZW52aXJvbm1lbnQuZ2V0RGVmYXVsdFZNKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlZURlZmF1bHRWTSAhPSBudWxsICYmIGRlZmF1bHRWTS5nZXRJZCgpLmVxdWFscyhlZURlZmF1bHRWTS5nZXRJZCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudmlyb25tZW50LmdldElkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCWZvciAoSUV4ZWN1dGlvbkVudmlyb25tZW50IGVudmlyb25tZW50IDogZW52aXJvbm1lbnRzKSB7Ci0JCQkJU3RyaW5nIGVlQ29tcGxpYW5jZSA9IEphdmFNb2RlbFV0aWwuZ2V0RXhlY3V0aW9uRW52aXJvbm1lbnRDb21wbGlhbmNlKGVudmlyb25tZW50KTsKLQkJCQlpZiAoZGVmYXVsdENDLmVuZHNXaXRoKGVlQ29tcGxpYW5jZSkpIHsKLQkJCQkJcmV0dXJuIGVudmlyb25tZW50LmdldElkKCk7Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRDQzsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0Vk0gaW5zdGFuY2VvZiBJVk1JbnN0YWxsMikgeworICAgICAgICAgICAgICAgIGRlZmF1bHRDQyA9IEphdmFNb2RlbFV0aWwuZ2V0Q29tcGlsZXJDb21wbGlhbmNlKChJVk1JbnN0YWxsMikgZGVmYXVsdFZNLCBKYXZhQ29yZS5WRVJTSU9OXzFfNCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlZmF1bHRDQyA9IEphdmFDb3JlLlZFUlNJT05fMV80OworICAgICAgICAgICAgfQogCi0JCQlyZXR1cm4gIkoyU0UtMS41IjsgLy8kTk9OLU5MUy0xJAotCQl9CisgICAgICAgICAgICBmb3IgKElFeGVjdXRpb25FbnZpcm9ubWVudCBlbnZpcm9ubWVudCA6IGVudmlyb25tZW50cykgeworICAgICAgICAgICAgICAgIFN0cmluZyBlZUNvbXBsaWFuY2UgPSBKYXZhTW9kZWxVdGlsLmdldEV4ZWN1dGlvbkVudmlyb25tZW50Q29tcGxpYW5jZShlbnZpcm9ubWVudCk7CisgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRDQy5lbmRzV2l0aChlZUNvbXBsaWFuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnZpcm9ubWVudC5nZXRJZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0SlZNTGFiZWwoKSB7Ci0JCQlyZXR1cm4gTWVzc2FnZXMuZm9ybWF0KAotCQkJCQlOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfSlJFR3JvdXBfZGVmYXVsdF9jb21wbGlhbmNlLAotCQkJCQlnZXREZWZhdWx0SlZNTmFtZSgpKTsKLQkJfQorICAgICAgICAgICAgcmV0dXJuICJKMlNFLTEuNSI7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQogCi0JCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRKVk1OYW1lKCkgewotCQkJSVZNSW5zdGFsbCBpbnN0YWxsID0gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOwotCQkJaWYgKGluc3RhbGwgIT0gbnVsbCkgewotCQkJCXJldHVybiBpbnN0YWxsLmdldE5hbWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9Vbmtub3duRGVmYXVsdEpSRV9uYW1lOwotCQkJfQotCQl9CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRKVk1MYWJlbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBNZXNzYWdlcy5mb3JtYXQoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0pSRUdyb3VwX2RlZmF1bHRfY29tcGxpYW5jZSwgZ2V0RGVmYXVsdEpWTU5hbWUoKSk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgSVBhdGggZ2V0SlJFQ29udGFpbmVyUGF0aCgpIHsKLQkJCWlmIChmVXNlUHJvamVjdEpSRS5pc1NlbGVjdGVkKCkpIHsKLQkJCQlpbnQgaW5kZXggPSBmSlJFQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGZJbnN0YWxsZWRKVk1zLmxlbmd0aCkgeyAvLyBwYXJhbm9pYQotCQkJCQlyZXR1cm4gSmF2YVJ1bnRpbWUubmV3SlJFQ29udGFpbmVyUGF0aChmSW5zdGFsbGVkSlZNc1tpbmRleF0pOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZlVzZUVFSlJFLmlzU2VsZWN0ZWQoKSkgewotCQkJCWludCBpbmRleCA9IGZFRUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBmSW5zdGFsbGVkRUVzLmxlbmd0aCkgeyAvLyBwYXJhbm9pYQotCQkJCQlyZXR1cm4gSmF2YVJ1bnRpbWUubmV3SlJFQ29udGFpbmVyUGF0aChmSW5zdGFsbGVkRUVzW2luZGV4XSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdEpWTU5hbWUoKSB7CisgICAgICAgICAgICBJVk1JbnN0YWxsIGluc3RhbGwgPSBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7CisgICAgICAgICAgICBpZiAoaW5zdGFsbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbGwuZ2V0TmFtZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX1Vua25vd25EZWZhdWx0SlJFX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwcml2YXRlIFN0cmluZyBnZXRMYXN0U2VsZWN0ZWRFRSgpIHsKLQkJCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQlyZXR1cm4gc2V0dGluZ3MuZ2V0KExBU1RfU0VMRUNURURfRUVfU0VUVElOR1NfS0VZKTsKLQkJfQorICAgICAgICBwdWJsaWMgSVBhdGggZ2V0SlJFQ29udGFpbmVyUGF0aCgpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmZVc2VQcm9qZWN0SlJFLmlzU2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHRoaXMuZkpSRUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLmZJbnN0YWxsZWRKVk1zLmxlbmd0aCkgeyAvLyBwYXJhbm9pYQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSmF2YVJ1bnRpbWUubmV3SlJFQ29udGFpbmVyUGF0aCh0aGlzLmZJbnN0YWxsZWRKVk1zW2luZGV4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmZVc2VFRUpSRS5pc1NlbGVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSB0aGlzLmZFRUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLmZJbnN0YWxsZWRFRXMubGVuZ3RoKSB7IC8vIHBhcmFub2lhCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBKYXZhUnVudGltZS5uZXdKUkVDb250YWluZXJQYXRoKHRoaXMuZkluc3RhbGxlZEVFc1tpbmRleF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0TGFzdFNlbGVjdGVkSlJFKCkgewotCQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJCXJldHVybiBzZXR0aW5ncy5nZXQoTEFTVF9TRUxFQ1RFRF9KUkVfU0VUVElOR1NfS0VZKTsKLQkJfQorICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRMYXN0U2VsZWN0ZWRFRSgpIHsKKyAgICAgICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7CisgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3MuZ2V0KExBU1RfU0VMRUNURURfRUVfU0VUVElOR1NfS0VZKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgaW50IGdldExhc3RTZWxlY3RlZEpSRUtpbmQoKSB7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQkJaWYgKHNldHRpbmdzLmdldChMQVNUX1NFTEVDVEVEX0pSRV9LSU5EKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIERFRkFVTFRfSlJFOwotCQkJfQorICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRMYXN0U2VsZWN0ZWRKUkUoKSB7CisgICAgICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOworICAgICAgICAgICAgcmV0dXJuIHNldHRpbmdzLmdldChMQVNUX1NFTEVDVEVEX0pSRV9TRVRUSU5HU19LRVkpOworICAgICAgICB9CiAKLQkJCXJldHVybiBzZXR0aW5ncy5nZXRJbnQoTEFTVF9TRUxFQ1RFRF9KUkVfS0lORCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0TGFzdFNlbGVjdGVkSlJFS2luZCgpIHsKKyAgICAgICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7CisgICAgICAgICAgICBpZiAoc2V0dGluZ3MuZ2V0KExBU1RfU0VMRUNURURfSlJFX0tJTkQpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gREVGQVVMVF9KUkU7CisgICAgICAgICAgICB9CiAKLQkJcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZENvbXBpbGVyQ29tcGxpYW5jZSgpIHsKLQkJCWlmIChmVXNlUHJvamVjdEpSRS5pc1NlbGVjdGVkKCkpIHsKLQkJCQlpbnQgaW5kZXggPSBmSlJFQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGZKUkVDb21wbGlhbmNlLmxlbmd0aCkgeyAvLyBwYXJhbm9pYQotCQkJCQlyZXR1cm4gZkpSRUNvbXBsaWFuY2VbaW5kZXhdOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZlVzZUVFSlJFLmlzU2VsZWN0ZWQoKSkgewotCQkJCWludCBpbmRleCA9IGZFRUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBmRUVDb21wbGlhbmNlLmxlbmd0aCkgeyAvLyBwYXJhbm9pYQotCQkJCQlyZXR1cm4gZkVFQ29tcGxpYW5jZVtpbmRleF07Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBzZXR0aW5ncy5nZXRJbnQoTEFTVF9TRUxFQ1RFRF9KUkVfS0lORCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgSVZNSW5zdGFsbCBnZXRTZWxlY3RlZEpWTSgpIHsKLQkJCWlmIChmVXNlUHJvamVjdEpSRS5pc1NlbGVjdGVkKCkpIHsKLQkJCQlpbnQgaW5kZXggPSBmSlJFQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IGZJbnN0YWxsZWRKVk1zLmxlbmd0aCkgeyAvLyBwYXJhbm9pYQotCQkJCQlyZXR1cm4gZkluc3RhbGxlZEpWTXNbaW5kZXhdOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZlVzZUVFSlJFLmlzU2VsZWN0ZWQoKSkgeworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkQ29tcGlsZXJDb21wbGlhbmNlKCkgeworICAgICAgICAgICAgaWYgKHRoaXMuZlVzZVByb2plY3RKUkUuaXNTZWxlY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gdGhpcy5mSlJFQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuZkpSRUNvbXBsaWFuY2UubGVuZ3RoKSB7IC8vIHBhcmFub2lhCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZKUkVDb21wbGlhbmNlW2luZGV4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZlVzZUVFSlJFLmlzU2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHRoaXMuZkVFQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuZkVFQ29tcGxpYW5jZS5sZW5ndGgpIHsgLy8gcGFyYW5vaWEKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZkVFQ29tcGxpYW5jZVtpbmRleF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgcHVibGljIElWTUluc3RhbGwgZ2V0U2VsZWN0ZWRKVk0oKSB7CisgICAgICAgICAgICBpZiAodGhpcy5mVXNlUHJvamVjdEpSRS5pc1NlbGVjdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSB0aGlzLmZKUkVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5mSW5zdGFsbGVkSlZNcy5sZW5ndGgpIHsgLy8gcGFyYW5vaWEKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZkluc3RhbGxlZEpWTXNbaW5kZXhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5mVXNlRUVKUkUuaXNTZWxlY3RlZCgpKSB7CiAKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXByaXZhdGUgSVZNSW5zdGFsbFtdIGdldFdvcmtzcGFjZUpSRXMoKSB7Ci0JCQlMaXN0IHN0YW5kaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSVZNSW5zdGFsbFR5cGVbXSB0eXBlcyA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGVzKCk7Ci0JCQlmb3IgKElWTUluc3RhbGxUeXBlIHR5cGUgOiB0eXBlcykgewotCQkJCUlWTUluc3RhbGxbXSBpbnN0YWxscyA9IHR5cGUuZ2V0Vk1JbnN0YWxscygpOwotCQkJCWZvciAoSVZNSW5zdGFsbCBpbnN0YWxsIDogaW5zdGFsbHMpIHsKLQkJCQkJc3RhbmRpbnMuYWRkKG5ldyBWTVN0YW5kaW4oaW5zdGFsbCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAoKElWTUluc3RhbGxbXSkgc3RhbmRpbnMudG9BcnJheShuZXcgSVZNSW5zdGFsbFtzdGFuZGlucy5zaXplKCldKSk7Ci0JCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgaGFuZGxlUG9zc2libGVKVk1DaGFuZ2UoKSB7Ci0JCQlmVXNlRGVmYXVsdEpSRS5zZXRMYWJlbFRleHQoZ2V0RGVmYXVsdEpWTUxhYmVsKCkpOwotCQkJZmlsbEluc3RhbGxlZEpSRXMoZkpSRUNvbWJvKTsKLQkJCWZpbGxFeGVjdXRpb25FbnZpcm9ubWVudHMoZkVFQ29tYm8pOwotCQl9CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwcml2YXRlIElWTUluc3RhbGxbXSBnZXRXb3Jrc3BhY2VKUkVzKCkgeworICAgICAgICAgICAgTGlzdCBzdGFuZGlucyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIElWTUluc3RhbGxUeXBlW10gdHlwZXMgPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGxUeXBlcygpOworICAgICAgICAgICAgZm9yIChJVk1JbnN0YWxsVHlwZSB0eXBlIDogdHlwZXMpIHsKKyAgICAgICAgICAgICAgICBJVk1JbnN0YWxsW10gaW5zdGFsbHMgPSB0eXBlLmdldFZNSW5zdGFsbHMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKElWTUluc3RhbGwgaW5zdGFsbCA6IGluc3RhbGxzKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YW5kaW5zLmFkZChuZXcgVk1TdGFuZGluKGluc3RhbGwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKElWTUluc3RhbGxbXSkgc3RhbmRpbnMudG9BcnJheShuZXcgSVZNSW5zdGFsbFtzdGFuZGlucy5zaXplKCldKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBzdG9yZVNlbGVjdGlvblZhbHVlKENvbWJvRGlhbG9nRmllbGQgY29tYm8sIFN0cmluZyBwcmVmZXJlbmNlS2V5KSB7Ci0JCQlpbnQgaW5kZXggPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVQb3NzaWJsZUpWTUNoYW5nZSgpIHsKKyAgICAgICAgICAgIHRoaXMuZlVzZURlZmF1bHRKUkUuc2V0TGFiZWxUZXh0KGdldERlZmF1bHRKVk1MYWJlbCgpKTsKKyAgICAgICAgICAgIGZpbGxJbnN0YWxsZWRKUkVzKHRoaXMuZkpSRUNvbWJvKTsKKyAgICAgICAgICAgIGZpbGxFeGVjdXRpb25FbnZpcm9ubWVudHModGhpcy5mRUVDb21ibyk7CisgICAgICAgIH0KIAotCQkJU3RyaW5nIGl0ZW0gPSBjb21iby5nZXRJdGVtcygpW2luZGV4XTsKLQkJCUphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkucHV0KHByZWZlcmVuY2VLZXksIGl0ZW0pOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBzdG9yZVNlbGVjdGlvblZhbHVlKENvbWJvRGlhbG9nRmllbGQgY29tYm8sIFN0cmluZyBwcmVmZXJlbmNlS2V5KSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOworICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZShPYnNlcnZhYmxlIG8sIE9iamVjdCBhcmcpIHsKLQkJCXVwZGF0ZUVuYWJsZVN0YXRlKCk7Ci0JCX0KKyAgICAgICAgICAgIFN0cmluZyBpdGVtID0gY29tYm8uZ2V0SXRlbXMoKVtpbmRleF07CisgICAgICAgICAgICBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLnB1dChwcmVmZXJlbmNlS2V5LCBpdGVtKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVFbmFibGVTdGF0ZSgpIHsKLQkJCWZpbmFsIGJvb2xlYW4gZGV0ZWN0ID0gZkRldGVjdEdyb3VwLm11c3REZXRlY3QoKTsKLQkJCWZVc2VEZWZhdWx0SlJFLnNldEVuYWJsZWQoIWRldGVjdCk7Ci0JCQlmVXNlUHJvamVjdEpSRS5zZXRFbmFibGVkKCFkZXRlY3QpOwotCQkJZlVzZUVFSlJFLnNldEVuYWJsZWQoIWRldGVjdCk7Ci0JCQlmSlJFQ29tYm8uc2V0RW5hYmxlZCghZGV0ZWN0ICYmIGZVc2VQcm9qZWN0SlJFLmlzU2VsZWN0ZWQoKSk7Ci0JCQlmRUVDb21iby5zZXRFbmFibGVkKCFkZXRlY3QgJiYgZlVzZUVFSlJFLmlzU2VsZWN0ZWQoKSk7Ci0JCQlpZiAoZlByZWZlcmVuY2VMaW5rICE9IG51bGwpIHsKLQkJCQlmUHJlZmVyZW5jZUxpbmsuc2V0RW5hYmxlZCghZGV0ZWN0KTsKLQkJCX0KLQkJCWlmIChmR3JvdXAgIT0gbnVsbCkgewotCQkJCWZHcm91cC5zZXRFbmFibGVkKCFkZXRlY3QpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShPYnNlcnZhYmxlIG8sIE9iamVjdCBhcmcpIHsKKyAgICAgICAgICAgIHVwZGF0ZUVuYWJsZVN0YXRlKCk7CisgICAgICAgIH0KIAotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlCi0JCSAqIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZwotCQkgKiAuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQotCQkgKi8KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcganJlSUQgPSBCdWlsZFBhdGhTdXBwb3J0LkpSRV9QUkVGX1BBR0VfSUQ7Ci0JCQlTdHJpbmcgY29tcGxpYW5jZUlkID0gQ29tcGxpYW5jZVByZWZlcmVuY2VQYWdlLlBSRUZfSUQ7Ci0JCQlNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlkYXRhLnB1dChQcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlLkRBVEFfTk9fTElOSywgQm9vbGVhbi5UUlVFKTsKLQkJCVByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwganJlSUQsIG5ldyBTdHJpbmdbXSB7IGpyZUlELCBjb21wbGlhbmNlSWQgfSwgZGF0YSkKLQkJCQkJLm9wZW4oKTsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUVuYWJsZVN0YXRlKCkgeworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBkZXRlY3QgPSBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVDT1BZLnRoaXMuZkRldGVjdEdyb3VwLm11c3REZXRlY3QoKTsKKyAgICAgICAgICAgIHRoaXMuZlVzZURlZmF1bHRKUkUuc2V0RW5hYmxlZCghZGV0ZWN0KTsKKyAgICAgICAgICAgIHRoaXMuZlVzZVByb2plY3RKUkUuc2V0RW5hYmxlZCghZGV0ZWN0KTsKKyAgICAgICAgICAgIHRoaXMuZlVzZUVFSlJFLnNldEVuYWJsZWQoIWRldGVjdCk7CisgICAgICAgICAgICB0aGlzLmZKUkVDb21iby5zZXRFbmFibGVkKCFkZXRlY3QgJiYgdGhpcy5mVXNlUHJvamVjdEpSRS5pc1NlbGVjdGVkKCkpOworICAgICAgICAgICAgdGhpcy5mRUVDb21iby5zZXRFbmFibGVkKCFkZXRlY3QgJiYgdGhpcy5mVXNlRUVKUkUuaXNTZWxlY3RlZCgpKTsKKyAgICAgICAgICAgIGlmICh0aGlzLmZQcmVmZXJlbmNlTGluayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5mUHJlZmVyZW5jZUxpbmsuc2V0RW5hYmxlZCghZGV0ZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLmZHcm91cCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5mR3JvdXAuc2V0RW5hYmxlZCghZGV0ZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCQloYW5kbGVQb3NzaWJsZUpWTUNoYW5nZSgpOwotCQkJZkRldGVjdEdyb3VwLmhhbmRsZVBvc3NpYmxlSlZNQ2hhbmdlKCk7Ci0JCX0KKyAgICAgICAgLyoKKyAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZyAuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQorICAgICAgICAgKi8KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICBTdHJpbmcganJlSUQgPSBCdWlsZFBhdGhTdXBwb3J0LkpSRV9QUkVGX1BBR0VfSUQ7CisgICAgICAgICAgICBTdHJpbmcgY29tcGxpYW5jZUlkID0gQ29tcGxpYW5jZVByZWZlcmVuY2VQYWdlLlBSRUZfSUQ7CisgICAgICAgICAgICBNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICBkYXRhLnB1dChQcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlLkRBVEFfTk9fTElOSywgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwganJlSUQsIG5ldyBTdHJpbmdbXSB7IGpyZUlELCBjb21wbGlhbmNlSWQgfSwgZGF0YSkub3BlbigpOwogCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUKLQkJICogb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZQotCQkgKiAuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXdpZGdldERlZmF1bHRTZWxlY3RlZChlKTsKLQkJfQotCX0KKyAgICAgICAgICAgIGhhbmRsZVBvc3NpYmxlSlZNQ2hhbmdlKCk7CisgICAgICAgICAgICBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVDT1BZLnRoaXMuZkRldGVjdEdyb3VwLmhhbmRsZVBvc3NpYmxlSlZNQ2hhbmdlKCk7CisgICAgICAgIH0KIAotCS8qKgotCSAqIFJlcXVlc3QgYSBwcm9qZWN0IGxheW91dC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIExheW91dEdyb3VwIGltcGxlbWVudHMgT2JzZXJ2ZXIsIFNlbGVjdGlvbkxpc3RlbmVyIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2UgLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkJcHJpdmF0ZSBmaW5hbCBTZWxlY3Rpb25CdXR0b25EaWFsb2dGaWVsZCBmU3RkUmFkaW8sIGZTcmNCaW5SYWRpbzsKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGEgcHJvamVjdCBsYXlvdXQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMYXlvdXRHcm91cCBpbXBsZW1lbnRzIE9ic2VydmVyLCBTZWxlY3Rpb25MaXN0ZW5lciB7CiAKLQkJcHJpdmF0ZSBHcm91cCBmR3JvdXA7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQgZlN0ZFJhZGlvLCBmU3JjQmluUmFkaW87CiAKLQkJcHJpdmF0ZSBMaW5rIGZQcmVmZXJlbmNlTGluazsKKyAgICAgICAgcHJpdmF0ZSBHcm91cCBmR3JvdXA7CiAKLQkJcHVibGljIExheW91dEdyb3VwKCkgewotCQkJZlN0ZFJhZGlvID0gbmV3IFNlbGVjdGlvbkJ1dHRvbkRpYWxvZ0ZpZWxkKFNXVC5SQURJTyk7Ci0JCQlmU3RkUmFkaW8uc2V0TGFiZWxUZXh0KE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9MYXlvdXRHcm91cF9vcHRpb25fb25lRm9sZGVyKTsKKyAgICAgICAgcHJpdmF0ZSBMaW5rIGZQcmVmZXJlbmNlTGluazsKIAotCQkJZlNyY0JpblJhZGlvID0gbmV3IFNlbGVjdGlvbkJ1dHRvbkRpYWxvZ0ZpZWxkKFNXVC5SQURJTyk7Ci0JCQlmU3JjQmluUmFkaW8uc2V0TGFiZWxUZXh0KE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9MYXlvdXRHcm91cF9vcHRpb25fc2VwYXJhdGVGb2xkZXJzKTsKKyAgICAgICAgcHVibGljIExheW91dEdyb3VwKCkgeworICAgICAgICAgICAgdGhpcy5mU3RkUmFkaW8gPSBuZXcgU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQoU1dULlJBRElPKTsKKyAgICAgICAgICAgIHRoaXMuZlN0ZFJhZGlvLnNldExhYmVsVGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTGF5b3V0R3JvdXBfb3B0aW9uX29uZUZvbGRlcik7CiAKLQkJCWJvb2xlYW4gdXNlU3JjQmluID0gUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlNSQ0JJTl9GT0xERVJTX0lOX05FV1BST0opOwotCQkJZlNyY0JpblJhZGlvLnNldFNlbGVjdGlvbih1c2VTcmNCaW4pOwotCQkJZlN0ZFJhZGlvLnNldFNlbGVjdGlvbighdXNlU3JjQmluKTsKLQkJfQorICAgICAgICAgICAgdGhpcy5mU3JjQmluUmFkaW8gPSBuZXcgU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQoU1dULlJBRElPKTsKKyAgICAgICAgICAgIHRoaXMuZlNyY0JpblJhZGlvLnNldExhYmVsVGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTGF5b3V0R3JvdXBfb3B0aW9uX3NlcGFyYXRlRm9sZGVycyk7CiAKLQkJcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlmR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlmR3JvdXAuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKLQkJCWZHcm91cC5zZXRMYXlvdXQoaW5pdEdyaWRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpLCB0cnVlKSk7Ci0JCQlmR3JvdXAuc2V0VGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTGF5b3V0R3JvdXBfdGl0bGUpOworICAgICAgICAgICAgYm9vbGVhbiB1c2VTcmNCaW4gPSBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5TUkNCSU5fRk9MREVSU19JTl9ORVdQUk9KKTsKKyAgICAgICAgICAgIHRoaXMuZlNyY0JpblJhZGlvLnNldFNlbGVjdGlvbih1c2VTcmNCaW4pOworICAgICAgICAgICAgdGhpcy5mU3RkUmFkaW8uc2V0U2VsZWN0aW9uKCF1c2VTcmNCaW4pOworICAgICAgICB9CiAKLQkJCWZTdGRSYWRpby5kb0ZpbGxJbnRvR3JpZChmR3JvdXAsIDMpOwotCQkJTGF5b3V0VXRpbC5zZXRIb3Jpem9udGFsR3JhYmJpbmcoZlN0ZFJhZGlvLmdldFNlbGVjdGlvbkJ1dHRvbihudWxsKSk7CisgICAgICAgIHB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworICAgICAgICAgICAgdGhpcy5mR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisgICAgICAgICAgICB0aGlzLmZHcm91cC5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOworICAgICAgICAgICAgdGhpcy5mR3JvdXAuc2V0TGF5b3V0KGluaXRHcmlkTGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSwgdHJ1ZSkpOworICAgICAgICAgICAgdGhpcy5mR3JvdXAuc2V0VGV4dChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTGF5b3V0R3JvdXBfdGl0bGUpOwogCi0JCQlmU3JjQmluUmFkaW8uZG9GaWxsSW50b0dyaWQoZkdyb3VwLCAyKTsKKyAgICAgICAgICAgIHRoaXMuZlN0ZFJhZGlvLmRvRmlsbEludG9HcmlkKHRoaXMuZkdyb3VwLCAzKTsKKyAgICAgICAgICAgIExheW91dFV0aWwuc2V0SG9yaXpvbnRhbEdyYWJiaW5nKHRoaXMuZlN0ZFJhZGlvLmdldFNlbGVjdGlvbkJ1dHRvbihudWxsKSk7CiAKLQkJCWZQcmVmZXJlbmNlTGluayA9IG5ldyBMaW5rKGZHcm91cCwgU1dULk5PTkUpOwotCQkJZlByZWZlcmVuY2VMaW5rLnNldFRleHQoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0xheW91dEdyb3VwX2xpbmtfZGVzY3JpcHRpb24pOwotCQkJZlByZWZlcmVuY2VMaW5rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuRU5ELCBmYWxzZSwgZmFsc2UpKTsKLQkJCWZQcmVmZXJlbmNlTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIHRoaXMuZlNyY0JpblJhZGlvLmRvRmlsbEludG9HcmlkKHRoaXMuZkdyb3VwLCAyKTsKIAotCQkJdXBkYXRlRW5hYmxlU3RhdGUoKTsKLQkJCXJldHVybiBmR3JvdXA7Ci0JCX0KKyAgICAgICAgICAgIHRoaXMuZlByZWZlcmVuY2VMaW5rID0gbmV3IExpbmsodGhpcy5mR3JvdXAsIFNXVC5OT05FKTsKKyAgICAgICAgICAgIHRoaXMuZlByZWZlcmVuY2VMaW5rLnNldFRleHQoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0xheW91dEdyb3VwX2xpbmtfZGVzY3JpcHRpb24pOworICAgICAgICAgICAgdGhpcy5mUHJlZmVyZW5jZUxpbmsuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5FTkQsIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgdGhpcy5mUHJlZmVyZW5jZUxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7CiAKLQkJLyoqCi0JCSAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgdG8gY3JlYXRlICdzb3VyY2UnIGFuZCAnYmluJyBmb2xkZXJzLgotCQkgKiAKLQkJICogQHJldHVybiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHNwZWNpZmllZCB0byBjcmVhdGUgJ3NvdXJjZScgYW5kICdiaW4nIGZvbGRlcnMuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1NyY0JpbigpIHsKLQkJCXJldHVybiBmU3JjQmluUmFkaW8uaXNTZWxlY3RlZCgpOwotCQl9CisgICAgICAgICAgICB1cGRhdGVFbmFibGVTdGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZkdyb3VwOworICAgICAgICB9CiAKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBqYXZhLnV0aWwuT2JzZXJ2ZXIjdXBkYXRlKGphdmEudXRpbC5PYnNlcnZhYmxlLAotCQkgKiBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgdXBkYXRlKE9ic2VydmFibGUgbywgT2JqZWN0IGFyZykgewotCQkJdXBkYXRlRW5hYmxlU3RhdGUoKTsKLQkJfQorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHNwZWNpZmllZCB0byBjcmVhdGUgJ3NvdXJjZScgYW5kICdiaW4nIGZvbGRlcnMuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgdG8gY3JlYXRlICdzb3VyY2UnIGFuZCAnYmluJyBmb2xkZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTcmNCaW4oKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5mU3JjQmluUmFkaW8uaXNTZWxlY3RlZCgpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZUVuYWJsZVN0YXRlKCkgewotCQkJZmluYWwgYm9vbGVhbiBkZXRlY3QgPSBmRGV0ZWN0R3JvdXAubXVzdERldGVjdCgpOwotCQkJZlN0ZFJhZGlvLnNldEVuYWJsZWQoIWRldGVjdCk7Ci0JCQlmU3JjQmluUmFkaW8uc2V0RW5hYmxlZCghZGV0ZWN0KTsKLQkJCWlmIChmUHJlZmVyZW5jZUxpbmsgIT0gbnVsbCkgewotCQkJCWZQcmVmZXJlbmNlTGluay5zZXRFbmFibGVkKCFkZXRlY3QpOwotCQkJfQotCQkJaWYgKGZHcm91cCAhPSBudWxsKSB7Ci0JCQkJZkdyb3VwLnNldEVuYWJsZWQoIWRldGVjdCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLyoKKyAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIGphdmEudXRpbC5PYnNlcnZlciN1cGRhdGUoamF2YS51dGlsLk9ic2VydmFibGUsIGphdmEubGFuZy5PYmplY3QpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGUoT2JzZXJ2YWJsZSBvLCBPYmplY3QgYXJnKSB7CisgICAgICAgICAgICB1cGRhdGVFbmFibGVTdGF0ZSgpOworICAgICAgICB9CiAKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZQotCQkgKiBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChvcmcKLQkJICogLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlTdHJpbmcgaWQgPSBOZXdKYXZhUHJvamVjdFByZWZlcmVuY2VQYWdlLklEOwotCQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBpZCwgbmV3IFN0cmluZ1tdIHsgaWQgfSwgbnVsbCkub3BlbigpOwotCQkJZkRldGVjdEdyb3VwLmhhbmRsZVBvc3NpYmxlSlZNQ2hhbmdlKCk7Ci0JCQlmSlJFR3JvdXAuaGFuZGxlUG9zc2libGVKVk1DaGFuZ2UoKTsKLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlRW5hYmxlU3RhdGUoKSB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGRldGVjdCA9IE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZUNPUFkudGhpcy5mRGV0ZWN0R3JvdXAubXVzdERldGVjdCgpOworICAgICAgICAgICAgdGhpcy5mU3RkUmFkaW8uc2V0RW5hYmxlZCghZGV0ZWN0KTsKKyAgICAgICAgICAgIHRoaXMuZlNyY0JpblJhZGlvLnNldEVuYWJsZWQoIWRldGVjdCk7CisgICAgICAgICAgICBpZiAodGhpcy5mUHJlZmVyZW5jZUxpbmsgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuZlByZWZlcmVuY2VMaW5rLnNldEVuYWJsZWQoIWRldGVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5mR3JvdXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuZkdyb3VwLnNldEVuYWJsZWQoIWRldGVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlCi0JCSAqIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2UKLQkJICogLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl3aWRnZXREZWZhdWx0U2VsZWN0ZWQoZSk7Ci0JCX0KLQl9CisgICAgICAgIC8qCisgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChvcmcgLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICBTdHJpbmcgaWQgPSBOZXdKYXZhUHJvamVjdFByZWZlcmVuY2VQYWdlLklEOworICAgICAgICAgICAgUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBpZCwgbmV3IFN0cmluZ1tdIHsgaWQgfSwgbnVsbCkub3BlbigpOworICAgICAgICAgICAgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lQ09QWS50aGlzLmZEZXRlY3RHcm91cC5oYW5kbGVQb3NzaWJsZUpWTUNoYW5nZSgpOworICAgICAgICAgICAgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lQ09QWS50aGlzLmZKUkVHcm91cC5oYW5kbGVQb3NzaWJsZUpWTUNoYW5nZSgpOworICAgICAgICB9CiAKLQkvKioKLQkgKiBSZXF1ZXN0IGEgbG9jYXRpb24uIEZpcmVzIGFuIGV2ZW50IHdoZW5ldmVyIHRoZSBjaGVja2JveCBvciB0aGUgbG9jYXRpb24gZmllbGQgaXMgY2hhbmdlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCi0JICogdGhlIGNoYW5nZSBvcmlnaW5hdGVzIGZyb20gdGhlIHVzZXIgb3IgaGFzIGJlZW4gaW52b2tlZCBwcm9ncmFtbWF0aWNhbGx5LgotCSAqLwotCXByaXZhdGUgZmluYWwgY2xhc3MgTG9jYXRpb25Hcm91cCBleHRlbmRzIE9ic2VydmFibGUgaW1wbGVtZW50cyBPYnNlcnZlciwgSVN0cmluZ0J1dHRvbkFkYXB0ZXIsCi0JCQlJRGlhbG9nRmllbGRMaXN0ZW5lciB7CisgICAgICAgIC8qCisgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlIC5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKGUpOworICAgICAgICB9CisgICAgfQogCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dTVE9SRV9MQVNUX0VYVEVSTkFMX0xPQyA9IEphdmFVSS5JRF9QTFVHSU4gKyAiLmxhc3QuZXh0ZXJuYWwucHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGEgbG9jYXRpb24uIEZpcmVzIGFuIGV2ZW50IHdoZW5ldmVyIHRoZSBjaGVja2JveCBvciB0aGUgbG9jYXRpb24gZmllbGQgaXMgY2hhbmdlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCisgICAgICogdGhlIGNoYW5nZSBvcmlnaW5hdGVzIGZyb20gdGhlIHVzZXIgb3IgaGFzIGJlZW4gaW52b2tlZCBwcm9ncmFtbWF0aWNhbGx5LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTG9jYXRpb25Hcm91cCBleHRlbmRzIE9ic2VydmFibGUgaW1wbGVtZW50cyBPYnNlcnZlciwgSVN0cmluZ0J1dHRvbkFkYXB0ZXIsIElEaWFsb2dGaWVsZExpc3RlbmVyIHsKIAotCQlwcm90ZWN0ZWQgZmluYWwgU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQgZldvcmtzcGFjZVJhZGlvOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HU1RPUkVfTEFTVF9FWFRFUk5BTF9MT0MgPSBKYXZhVUkuSURfUExVR0lOICsgIi5sYXN0LmV4dGVybmFsLnByb2plY3QiOyAvLyROT04tTkxTLTEkCiAKLQkJcHJvdGVjdGVkIGZpbmFsIFNlbGVjdGlvbkJ1dHRvbkRpYWxvZ0ZpZWxkIGZFeHRlcm5hbFJhZGlvOworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgU2VsZWN0aW9uQnV0dG9uRGlhbG9nRmllbGQgZldvcmtzcGFjZVJhZGlvOwogCi0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdCdXR0b25EaWFsb2dGaWVsZCBmTG9jYXRpb247CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBTZWxlY3Rpb25CdXR0b25EaWFsb2dGaWVsZCBmRXh0ZXJuYWxSYWRpbzsKIAotCQlwcml2YXRlIFN0cmluZyBmUHJldmlvdXNFeHRlcm5hbExvY2F0aW9uOworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nQnV0dG9uRGlhbG9nRmllbGQgZkxvY2F0aW9uOwogCi0JCXB1YmxpYyBMb2NhdGlvbkdyb3VwKCkgewotCQkJZldvcmtzcGFjZVJhZGlvID0gbmV3IFNlbGVjdGlvbkJ1dHRvbkRpYWxvZ0ZpZWxkKFNXVC5SQURJTyk7Ci0JCQlmV29ya3NwYWNlUmFkaW8uc2V0RGlhbG9nRmllbGRMaXN0ZW5lcih0aGlzKTsKLQkJCWZXb3Jrc3BhY2VSYWRpby5zZXRMYWJlbFRleHQoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0xvY2F0aW9uR3JvdXBfd29ya3NwYWNlX2Rlc2MpOworICAgICAgICBwcml2YXRlIFN0cmluZyBmUHJldmlvdXNFeHRlcm5hbExvY2F0aW9uOwogCi0JCQlmRXh0ZXJuYWxSYWRpbyA9IG5ldyBTZWxlY3Rpb25CdXR0b25EaWFsb2dGaWVsZChTV1QuUkFESU8pOwotCQkJZkV4dGVybmFsUmFkaW8uc2V0TGFiZWxUZXh0KE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9Mb2NhdGlvbkdyb3VwX2V4dGVybmFsX2Rlc2MpOworICAgICAgICBwdWJsaWMgTG9jYXRpb25Hcm91cCgpIHsKKyAgICAgICAgICAgIHRoaXMuZldvcmtzcGFjZVJhZGlvID0gbmV3IFNlbGVjdGlvbkJ1dHRvbkRpYWxvZ0ZpZWxkKFNXVC5SQURJTyk7CisgICAgICAgICAgICB0aGlzLmZXb3Jrc3BhY2VSYWRpby5zZXREaWFsb2dGaWVsZExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgdGhpcy5mV29ya3NwYWNlUmFkaW8uc2V0TGFiZWxUZXh0KE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9Mb2NhdGlvbkdyb3VwX3dvcmtzcGFjZV9kZXNjKTsKIAotCQkJZkxvY2F0aW9uID0gbmV3IFN0cmluZ0J1dHRvbkRpYWxvZ0ZpZWxkKHRoaXMpOwotCQkJZkxvY2F0aW9uLnNldERpYWxvZ0ZpZWxkTGlzdGVuZXIodGhpcyk7Ci0JCQlmTG9jYXRpb24uc2V0TGFiZWxUZXh0KE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9Mb2NhdGlvbkdyb3VwX2xvY2F0aW9uTGFiZWxfZGVzYyk7Ci0JCQlmTG9jYXRpb24uc2V0QnV0dG9uTGFiZWwoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0xvY2F0aW9uR3JvdXBfYnJvd3NlQnV0dG9uX2Rlc2MpOworICAgICAgICAgICAgdGhpcy5mRXh0ZXJuYWxSYWRpbyA9IG5ldyBTZWxlY3Rpb25CdXR0b25EaWFsb2dGaWVsZChTV1QuUkFESU8pOworICAgICAgICAgICAgdGhpcy5mRXh0ZXJuYWxSYWRpby5zZXRMYWJlbFRleHQoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0xvY2F0aW9uR3JvdXBfZXh0ZXJuYWxfZGVzYyk7CiAKLQkJCWZFeHRlcm5hbFJhZGlvLmF0dGFjaERpYWxvZ0ZpZWxkKGZMb2NhdGlvbik7CisgICAgICAgICAgICB0aGlzLmZMb2NhdGlvbiA9IG5ldyBTdHJpbmdCdXR0b25EaWFsb2dGaWVsZCh0aGlzKTsKKyAgICAgICAgICAgIHRoaXMuZkxvY2F0aW9uLnNldERpYWxvZ0ZpZWxkTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB0aGlzLmZMb2NhdGlvbi5zZXRMYWJlbFRleHQoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0xvY2F0aW9uR3JvdXBfbG9jYXRpb25MYWJlbF9kZXNjKTsKKyAgICAgICAgICAgIHRoaXMuZkxvY2F0aW9uLnNldEJ1dHRvbkxhYmVsKE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9Mb2NhdGlvbkdyb3VwX2Jyb3dzZUJ1dHRvbl9kZXNjKTsKIAotCQkJZldvcmtzcGFjZVJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZFeHRlcm5hbFJhZGlvLnNldFNlbGVjdGlvbihmYWxzZSk7CisgICAgICAgICAgICB0aGlzLmZFeHRlcm5hbFJhZGlvLmF0dGFjaERpYWxvZ0ZpZWxkKHRoaXMuZkxvY2F0aW9uKTsKIAotCQkJZlByZXZpb3VzRXh0ZXJuYWxMb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KKyAgICAgICAgICAgIHRoaXMuZldvcmtzcGFjZVJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKKyAgICAgICAgICAgIHRoaXMuZkV4dGVybmFsUmFkaW8uc2V0U2VsZWN0aW9uKGZhbHNlKTsKIAotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlCi0JCSAqIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcy5JU3RyaW5nQnV0dG9uQWRhcHRlcgotCQkgKiAjCi0JCSAqIGNoYW5nZUNvbnRyb2xQcmVzc2VkKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcwotCQkgKiAuRGlhbG9nRmllbGQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjaGFuZ2VDb250cm9sUHJlc3NlZChEaWFsb2dGaWVsZCBmaWVsZCkgewotCQkJZmluYWwgRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZShOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfZGlyZWN0b3J5X21lc3NhZ2UpOwotCQkJU3RyaW5nIGRpcmVjdG9yeU5hbWUgPSBmTG9jYXRpb24uZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCWlmIChkaXJlY3RvcnlOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCQlTdHJpbmcgcHJldkxvY2F0aW9uID0gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKS5nZXQoRElBTE9HU1RPUkVfTEFTVF9FWFRFUk5BTF9MT0MpOwotCQkJCWlmIChwcmV2TG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQlkaXJlY3RvcnlOYW1lID0gcHJldkxvY2F0aW9uOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIHRoaXMuZlByZXZpb3VzRXh0ZXJuYWxMb2NhdGlvbiA9ICIiOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KIAotCQkJaWYgKGRpcmVjdG9yeU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZmluYWwgRmlsZSBwYXRoID0gbmV3IEZpbGUoZGlyZWN0b3J5TmFtZSk7Ci0JCQkJaWYgKHBhdGguZXhpc3RzKCkpIHsKLQkJCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyZWN0b3J5TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWwgU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZkxvY2F0aW9uLnNldFRleHQoc2VsZWN0ZWREaXJlY3RvcnkpOwotCQkJCUphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkucHV0KERJQUxPR1NUT1JFX0xBU1RfRVhURVJOQUxfTE9DLCBzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLyoKKyAgICAgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcy5JU3RyaW5nQnV0dG9uQWRhcHRlciAjCisgICAgICAgICAqIGNoYW5nZUNvbnRyb2xQcmVzc2VkKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcyAuRGlhbG9nRmllbGQpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBjaGFuZ2VDb250cm9sUHJlc3NlZChEaWFsb2dGaWVsZCBmaWVsZCkgeworICAgICAgICAgICAgZmluYWwgRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7CisgICAgICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZShOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfZGlyZWN0b3J5X21lc3NhZ2UpOworICAgICAgICAgICAgU3RyaW5nIGRpcmVjdG9yeU5hbWUgPSB0aGlzLmZMb2NhdGlvbi5nZXRUZXh0KCkudHJpbSgpOworICAgICAgICAgICAgaWYgKGRpcmVjdG9yeU5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwcmV2TG9jYXRpb24gPSBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpLmdldChESUFMT0dTVE9SRV9MQVNUX0VYVEVSTkFMX0xPQyk7CisgICAgICAgICAgICAgICAgaWYgKHByZXZMb2NhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeU5hbWUgPSBwcmV2TG9jYXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJZmluYWwgaW50IG51bUNvbHVtbnMgPSAzOworICAgICAgICAgICAgaWYgKGRpcmVjdG9yeU5hbWUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBwYXRoID0gbmV3IEZpbGUoZGlyZWN0b3J5TmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHBhdGguZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyZWN0b3J5TmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5mTG9jYXRpb24uc2V0VGV4dChzZWxlY3RlZERpcmVjdG9yeSk7CisgICAgICAgICAgICAgICAgSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKS5wdXQoRElBTE9HU1RPUkVfTEFTVF9FWFRFUk5BTF9MT0MsIHNlbGVjdGVkRGlyZWN0b3J5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCQlmaW5hbCBHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldExheW91dChpbml0R3JpZExheW91dChuZXcgR3JpZExheW91dChudW1Db2x1bW5zLCBmYWxzZSksIHRydWUpKTsKLQkJCWdyb3VwLnNldFRleHQoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX0xvY2F0aW9uR3JvdXBfdGl0bGUpOworICAgICAgICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBudW1Db2x1bW5zID0gMzsKIAotCQkJZldvcmtzcGFjZVJhZGlvLmRvRmlsbEludG9HcmlkKGdyb3VwLCBudW1Db2x1bW5zKTsKLQkJCWZFeHRlcm5hbFJhZGlvLmRvRmlsbEludG9HcmlkKGdyb3VwLCBudW1Db2x1bW5zKTsKLQkJCWZMb2NhdGlvbi5kb0ZpbGxJbnRvR3JpZChncm91cCwgbnVtQ29sdW1ucyk7Ci0JCQlMYXlvdXRVdGlsLnNldEhvcml6b250YWxHcmFiYmluZyhmTG9jYXRpb24uZ2V0VGV4dENvbnRyb2wobnVsbCkpOworICAgICAgICAgICAgZmluYWwgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisgICAgICAgICAgICBncm91cC5zZXRMYXlvdXQoaW5pdEdyaWRMYXlvdXQobmV3IEdyaWRMYXlvdXQobnVtQ29sdW1ucywgZmFsc2UpLCB0cnVlKSk7CisgICAgICAgICAgICBncm91cC5zZXRUZXh0KE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9Mb2NhdGlvbkdyb3VwX3RpdGxlKTsKIAotCQkJcmV0dXJuIGdyb3VwOwotCQl9CisgICAgICAgICAgICB0aGlzLmZXb3Jrc3BhY2VSYWRpby5kb0ZpbGxJbnRvR3JpZChncm91cCwgbnVtQ29sdW1ucyk7CisgICAgICAgICAgICB0aGlzLmZFeHRlcm5hbFJhZGlvLmRvRmlsbEludG9HcmlkKGdyb3VwLCBudW1Db2x1bW5zKTsKKyAgICAgICAgICAgIHRoaXMuZkxvY2F0aW9uLmRvRmlsbEludG9HcmlkKGdyb3VwLCBudW1Db2x1bW5zKTsKKyAgICAgICAgICAgIExheW91dFV0aWwuc2V0SG9yaXpvbnRhbEdyYWJiaW5nKHRoaXMuZkxvY2F0aW9uLmdldFRleHRDb250cm9sKG51bGwpKTsKIAotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlCi0JCSAqIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcy5JRGlhbG9nRmllbGRMaXN0ZW5lcgotCQkgKiAjZGlhbG9nRmllbGRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcy4KLQkJICogRGlhbG9nRmllbGQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaWFsb2dGaWVsZENoYW5nZWQoRGlhbG9nRmllbGQgZmllbGQpIHsKLQkJCWlmIChmaWVsZCA9PSBmV29ya3NwYWNlUmFkaW8pIHsKLQkJCQlmaW5hbCBib29sZWFuIGNoZWNrZWQgPSBmV29ya3NwYWNlUmFkaW8uaXNTZWxlY3RlZCgpOwotCQkJCWlmIChjaGVja2VkKSB7Ci0JCQkJCWZQcmV2aW91c0V4dGVybmFsTG9jYXRpb24gPSBmTG9jYXRpb24uZ2V0VGV4dCgpOwotCQkJCQlmTG9jYXRpb24uc2V0VGV4dChnZXREZWZhdWx0UGF0aChmTmFtZUdyb3VwLmdldE5hbWUoKSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZMb2NhdGlvbi5zZXRUZXh0KGZQcmV2aW91c0V4dGVybmFsTG9jYXRpb24pOwotCQkJCX0KLQkJCX0KLQkJCWZpcmVFdmVudCgpOwotCQl9CisgICAgICAgICAgICByZXR1cm4gZ3JvdXA7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLklEaWFsb2dGaWVsZExpc3RlbmVyCisgICAgICAgICAqICNkaWFsb2dGaWVsZENoYW5nZWQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLiBEaWFsb2dGaWVsZCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGRpYWxvZ0ZpZWxkQ2hhbmdlZChEaWFsb2dGaWVsZCBmaWVsZCkgeworICAgICAgICAgICAgaWYgKGZpZWxkID09IHRoaXMuZldvcmtzcGFjZVJhZGlvKSB7CisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjaGVja2VkID0gdGhpcy5mV29ya3NwYWNlUmFkaW8uaXNTZWxlY3RlZCgpOworICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZlByZXZpb3VzRXh0ZXJuYWxMb2NhdGlvbiA9IHRoaXMuZkxvY2F0aW9uLmdldFRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mTG9jYXRpb24uc2V0VGV4dChnZXREZWZhdWx0UGF0aChOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVDT1BZLnRoaXMuZk5hbWVHcm91cC5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmZMb2NhdGlvbi5zZXRUZXh0KHRoaXMuZlByZXZpb3VzRXh0ZXJuYWxMb2NhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlyZUV2ZW50KCk7CisgICAgICAgIH0KIAotCQlwcm90ZWN0ZWQgdm9pZCBmaXJlRXZlbnQoKSB7Ci0JCQlzZXRDaGFuZ2VkKCk7Ci0JCQlub3RpZnlPYnNlcnZlcnMoKTsKLQkJfQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlRXZlbnQoKSB7CisgICAgICAgICAgICBzZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICBub3RpZnlPYnNlcnZlcnMoKTsKKyAgICAgICAgfQogCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFBhdGgoU3RyaW5nIG5hbWUpIHsKLQkJCWZpbmFsIElQYXRoIHBhdGggPSBQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmFwcGVuZChuYW1lKTsKLQkJCXJldHVybiBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJfQorICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRQYXRoKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5hcHBlbmQobmFtZSk7CisgICAgICAgICAgICByZXR1cm4gcGF0aC50b09TU3RyaW5nKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgSVBhdGggZ2V0TG9jYXRpb24oKSB7Ci0JCQlpZiAoaXNXb3Jrc3BhY2VSYWRpb1NlbGVjdGVkKCkpIHsKLQkJCQlyZXR1cm4gUGxhdGZvcm0uZ2V0TG9jYXRpb24oKTsKLQkJCX0KLQkJCXJldHVybiBQYXRoLmZyb21PU1N0cmluZyhmTG9jYXRpb24uZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCX0KKyAgICAgICAgcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgeworICAgICAgICAgICAgaWYgKGlzV29ya3NwYWNlUmFkaW9TZWxlY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBsYXRmb3JtLmdldExvY2F0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcodGhpcy5mTG9jYXRpb24uZ2V0VGV4dCgpLnRyaW0oKSk7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbG9jYXRpb24gaXMgaW4gdGhlIHdvcmtzcGFjZQotCQkgKiAKLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbG9jYXRpb24gaXMgaW4gdGhlIHdvcmtzcGFjZQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNMb2NhdGlvbkluV29ya3NwYWNlKCkgewotCQkJZmluYWwgU3RyaW5nIGxvY2F0aW9uID0gZkxvY2F0aW9uR3JvdXAuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQlJUGF0aCBwcm9qZWN0UGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKGxvY2F0aW9uKTsKLQkJCXJldHVybiBQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2YocHJvamVjdFBhdGgpOwotCQl9CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsb2NhdGlvbiBpcyBpbiB0aGUgd29ya3NwYWNlCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxvY2F0aW9uIGlzIGluIHRoZSB3b3Jrc3BhY2UKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTG9jYXRpb25JbldvcmtzcGFjZSgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhdGlvbiA9IE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZUNPUFkudGhpcy5mTG9jYXRpb25Hcm91cC5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKKyAgICAgICAgICAgIElQYXRoIHByb2plY3RQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcobG9jYXRpb24pOworICAgICAgICAgICAgcmV0dXJuIFBsYXRmb3JtLmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihwcm9qZWN0UGF0aCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgYm9vbGVhbiBpc1dvcmtzcGFjZVJhZGlvU2VsZWN0ZWQoKSB7Ci0JCQlyZXR1cm4gZldvcmtzcGFjZVJhZGlvLmlzU2VsZWN0ZWQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dvcmtzcGFjZVJhZGlvU2VsZWN0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5mV29ya3NwYWNlUmFkaW8uaXNTZWxlY3RlZCgpOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgc2V0TG9jYXRpb24oSVBhdGggcGF0aCkgewotCQkJZldvcmtzcGFjZVJhZGlvLnNldFNlbGVjdGlvbihwYXRoID09IG51bGwpOwotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCWZMb2NhdGlvbi5zZXRUZXh0KHBhdGgudG9PU1N0cmluZygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZkxvY2F0aW9uLnNldFRleHQoZ2V0RGVmYXVsdFBhdGgoZk5hbWVHcm91cC5nZXROYW1lKCkpKTsKLQkJCX0KLQkJCWZpcmVFdmVudCgpOwotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKElQYXRoIHBhdGgpIHsKKyAgICAgICAgICAgIHRoaXMuZldvcmtzcGFjZVJhZGlvLnNldFNlbGVjdGlvbihwYXRoID09IG51bGwpOworICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuZkxvY2F0aW9uLnNldFRleHQocGF0aC50b09TU3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZMb2NhdGlvbi5zZXRUZXh0KGdldERlZmF1bHRQYXRoKE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZUNPUFkudGhpcy5mTmFtZUdyb3VwLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlyZUV2ZW50KCk7CisgICAgICAgIH0KIAotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGphdmEudXRpbC5PYnNlcnZlciN1cGRhdGUoamF2YS51dGlsLk9ic2VydmFibGUsCi0JCSAqIGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1cGRhdGUoT2JzZXJ2YWJsZSBvLCBPYmplY3QgYXJnKSB7Ci0JCQlpZiAoaXNXb3Jrc3BhY2VSYWRpb1NlbGVjdGVkKCkpIHsKLQkJCQlmTG9jYXRpb24uc2V0VGV4dChnZXREZWZhdWx0UGF0aChmTmFtZUdyb3VwLmdldE5hbWUoKSkpOwotCQkJfQotCQkJZmlyZUV2ZW50KCk7Ci0JCX0KLQl9CisgICAgICAgIC8qCisgICAgICAgICAqIChub24tSmF2YWRvYykKKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBqYXZhLnV0aWwuT2JzZXJ2ZXIjdXBkYXRlKGphdmEudXRpbC5PYnNlcnZhYmxlLCBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlKE9ic2VydmFibGUgbywgT2JqZWN0IGFyZykgeworICAgICAgICAgICAgaWYgKGlzV29ya3NwYWNlUmFkaW9TZWxlY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5mTG9jYXRpb24uc2V0VGV4dChnZXREZWZhdWx0UGF0aChOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVDT1BZLnRoaXMuZk5hbWVHcm91cC5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcmVFdmVudCgpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogUmVxdWVzdCBhIHByb2plY3QgbmFtZS4gRmlyZXMgYW4gZXZlbnQgd2hlbmV2ZXIgdGhlIHRleHQgZmllbGQgaXMgY2hhbmdlZCwgcmVnYXJkbGVzcyBvZiBpdHMgY29udGVudC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIE5hbWVHcm91cCBleHRlbmRzIE9ic2VydmFibGUgaW1wbGVtZW50cyBJRGlhbG9nRmllbGRMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogUmVxdWVzdCBhIHByb2plY3QgbmFtZS4gRmlyZXMgYW4gZXZlbnQgd2hlbmV2ZXIgdGhlIHRleHQgZmllbGQgaXMgY2hhbmdlZCwgcmVnYXJkbGVzcyBvZiBpdHMgY29udGVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE5hbWVHcm91cCBleHRlbmRzIE9ic2VydmFibGUgaW1wbGVtZW50cyBJRGlhbG9nRmllbGRMaXN0ZW5lciB7CiAKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0RpYWxvZ0ZpZWxkIGZOYW1lRmllbGQ7CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmdEaWFsb2dGaWVsZCBmTmFtZUZpZWxkOwogCi0JCXB1YmxpYyBOYW1lR3JvdXAoKSB7Ci0JCQkvLyB0ZXh0IGZpZWxkIGZvciBwcm9qZWN0IG5hbWUKLQkJCWZOYW1lRmllbGQgPSBuZXcgU3RyaW5nRGlhbG9nRmllbGQoKTsKLQkJCWZOYW1lRmllbGQuc2V0TGFiZWxUZXh0KE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9OYW1lR3JvdXBfbGFiZWxfdGV4dCk7Ci0JCQlmTmFtZUZpZWxkLnNldERpYWxvZ0ZpZWxkTGlzdGVuZXIodGhpcyk7Ci0JCX0KKyAgICAgICAgcHVibGljIE5hbWVHcm91cCgpIHsKKyAgICAgICAgICAgIC8vIHRleHQgZmllbGQgZm9yIHByb2plY3QgbmFtZQorICAgICAgICAgICAgdGhpcy5mTmFtZUZpZWxkID0gbmV3IFN0cmluZ0RpYWxvZ0ZpZWxkKCk7CisgICAgICAgICAgICB0aGlzLmZOYW1lRmllbGQuc2V0TGFiZWxUZXh0KE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9OYW1lR3JvdXBfbGFiZWxfdGV4dCk7CisgICAgICAgICAgICB0aGlzLmZOYW1lRmllbGQuc2V0RGlhbG9nRmllbGRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJQ29tcG9zaXRlIG5hbWVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJbmFtZUNvbXBvc2l0ZS5zZXRGb250KGNvbXBvc2l0ZS5nZXRGb250KCkpOwotCQkJbmFtZUNvbXBvc2l0ZS5zZXRMYXlvdXQoaW5pdEdyaWRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpLCBmYWxzZSkpOworICAgICAgICBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKyAgICAgICAgICAgIENvbXBvc2l0ZSBuYW1lQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKKyAgICAgICAgICAgIG5hbWVDb21wb3NpdGUuc2V0Rm9udChjb21wb3NpdGUuZ2V0Rm9udCgpKTsKKyAgICAgICAgICAgIG5hbWVDb21wb3NpdGUuc2V0TGF5b3V0KGluaXRHcmlkTGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSwgZmFsc2UpKTsKIAotCQkJZk5hbWVGaWVsZC5kb0ZpbGxJbnRvR3JpZChuYW1lQ29tcG9zaXRlLCAyKTsKLQkJCUxheW91dFV0aWwuc2V0SG9yaXpvbnRhbEdyYWJiaW5nKGZOYW1lRmllbGQuZ2V0VGV4dENvbnRyb2wobnVsbCkpOworICAgICAgICAgICAgdGhpcy5mTmFtZUZpZWxkLmRvRmlsbEludG9HcmlkKG5hbWVDb21wb3NpdGUsIDIpOworICAgICAgICAgICAgTGF5b3V0VXRpbC5zZXRIb3Jpem9udGFsR3JhYmJpbmcodGhpcy5mTmFtZUZpZWxkLmdldFRleHRDb250cm9sKG51bGwpKTsKIAotCQkJcmV0dXJuIG5hbWVDb21wb3NpdGU7Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBuYW1lQ29tcG9zaXRlOworICAgICAgICB9CiAKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZQotCQkgKiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5kaWFsb2dmaWVsZHMuSURpYWxvZ0ZpZWxkTGlzdGVuZXIKLQkJICogI2RpYWxvZ0ZpZWxkQ2hhbmdlZChvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5kaWFsb2dmaWVsZHMuCi0JCSAqIERpYWxvZ0ZpZWxkKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlhbG9nRmllbGRDaGFuZ2VkKERpYWxvZ0ZpZWxkIGZpZWxkKSB7Ci0JCQlmaXJlRXZlbnQoKTsKLQkJfQorICAgICAgICAvKgorICAgICAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLklEaWFsb2dGaWVsZExpc3RlbmVyCisgICAgICAgICAqICNkaWFsb2dGaWVsZENoYW5nZWQob3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLiBEaWFsb2dGaWVsZCkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGRpYWxvZ0ZpZWxkQ2hhbmdlZChEaWFsb2dGaWVsZCBmaWVsZCkgeworICAgICAgICAgICAgZmlyZUV2ZW50KCk7CisgICAgICAgIH0KIAotCQlwcm90ZWN0ZWQgdm9pZCBmaXJlRXZlbnQoKSB7Ci0JCQlzZXRDaGFuZ2VkKCk7Ci0JCQlub3RpZnlPYnNlcnZlcnMoKTsKLQkJfQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaXJlRXZlbnQoKSB7CisgICAgICAgICAgICBzZXRDaGFuZ2VkKCk7CisgICAgICAgICAgICBub3RpZnlPYnNlcnZlcnMoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBmTmFtZUZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZk5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgcG9zdFNldEZvY3VzKCkgewotCQkJZk5hbWVGaWVsZC5wb3N0U2V0Rm9jdXNPbkRpYWxvZ0ZpZWxkKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpKTsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0U2V0Rm9jdXMoKSB7CisgICAgICAgICAgICB0aGlzLmZOYW1lRmllbGQucG9zdFNldEZvY3VzT25EaWFsb2dGaWVsZChnZXRTaGVsbCgpLmdldERpc3BsYXkoKSk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlmTmFtZUZpZWxkLnNldFRleHQobmFtZSk7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMuZk5hbWVGaWVsZC5zZXRUZXh0KG5hbWUpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogVmFsaWRhdGUgdGhpcyBwYWdlIGFuZCBzaG93IGFwcHJvcHJpYXRlIHdhcm5pbmdzIGFuZCBlcnJvciBOZXdXaXphcmRNZXNzYWdlcy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFZhbGlkYXRvciBpbXBsZW1lbnRzIE9ic2VydmVyIHsKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSB0aGlzIHBhZ2UgYW5kIHNob3cgYXBwcm9wcmlhdGUgd2FybmluZ3MgYW5kIGVycm9yIE5ld1dpemFyZE1lc3NhZ2VzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgVmFsaWRhdG9yIGltcGxlbWVudHMgT2JzZXJ2ZXIgewogCi0JCXByaXZhdGUgYm9vbGVhbiBjYW5DcmVhdGUoRmlsZSBmaWxlKSB7Ci0JCQl3aGlsZSAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQlmaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQorICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2FuQ3JlYXRlKEZpbGUgZmlsZSkgeworICAgICAgICAgICAgd2hpbGUgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJcmV0dXJuIGZpbGUuY2FuV3JpdGUoKTsKLQkJfQorICAgICAgICAgICAgcmV0dXJuIGZpbGUuY2FuV3JpdGUoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZShPYnNlcnZhYmxlIG8sIE9iamVjdCBhcmcpIHsKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlKE9ic2VydmFibGUgbywgT2JqZWN0IGFyZykgewogCi0JCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IEphdmFQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisgICAgICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IEphdmFQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CiAKLQkJCWZpbmFsIFN0cmluZyBuYW1lID0gZk5hbWVHcm91cC5nZXROYW1lKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZUNPUFkudGhpcy5mTmFtZUdyb3VwLmdldE5hbWUoKTsKIAotCQkJLy8gY2hlY2sgd2hldGhlciB0aGUgcHJvamVjdCBuYW1lIGZpZWxkIGlzIGVtcHR5Ci0JCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCXNldE1lc3NhZ2UoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX01lc3NhZ2VfZW50ZXJQcm9qZWN0TmFtZSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9CisgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBwcm9qZWN0IG5hbWUgZmllbGQgaXMgZW1wdHkKKyAgICAgICAgICAgIGlmIChuYW1lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7CisgICAgICAgICAgICAgICAgc2V0TWVzc2FnZShOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTWVzc2FnZV9lbnRlclByb2plY3ROYW1lKTsKKyAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAotCQkJLy8gY2hlY2sgd2hldGhlciB0aGUgcHJvamVjdCBuYW1lIGlzIHZhbGlkCi0JCQlmaW5hbCBJU3RhdHVzIG5hbWVTdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKG5hbWUsIElSZXNvdXJjZS5QUk9KRUNUKTsKLQkJCWlmICghbmFtZVN0YXR1cy5pc09LKCkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UobmFtZVN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQorICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgcHJvamVjdCBuYW1lIGlzIHZhbGlkCisgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIG5hbWVTdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKG5hbWUsIElSZXNvdXJjZS5QUk9KRUNUKTsKKyAgICAgICAgICAgIGlmICghbmFtZVN0YXR1cy5pc09LKCkpIHsKKyAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobmFtZVN0YXR1cy5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCQkvLyBjaGVjayB3aGV0aGVyIHByb2plY3QgYWxyZWFkeSBleGlzdHMKLQkJCWZpbmFsIElQcm9qZWN0IGhhbmRsZSA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChuYW1lKTsKLQkJCWlmIChoYW5kbGUuZXhpc3RzKCkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX01lc3NhZ2VfcHJvamVjdEFscmVhZHlFeGlzdHMpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQorICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBwcm9qZWN0IGFscmVhZHkgZXhpc3RzCisgICAgICAgICAgICBmaW5hbCBJUHJvamVjdCBoYW5kbGUgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7CisgICAgICAgICAgICBpZiAoaGFuZGxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9NZXNzYWdlX3Byb2plY3RBbHJlYWR5RXhpc3RzKTsKKyAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAotCQkJSVBhdGggcHJvamVjdExvY2F0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLmFwcGVuZChuYW1lKTsKLQkJCWlmIChwcm9qZWN0TG9jYXRpb24udG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBjb3JyZWN0IGNhc2luZwotCQkJCQlTdHJpbmcgY2Fub25pY2FsUGF0aCA9IHByb2plY3RMb2NhdGlvbi50b0ZpbGUoKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQkJCXByb2plY3RMb2NhdGlvbiA9IG5ldyBQYXRoKGNhbm9uaWNhbFBhdGgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJSmF2YVBsdWdpbi5sb2coZSk7Ci0JCQkJfQorICAgICAgICAgICAgSVBhdGggcHJvamVjdExvY2F0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLmFwcGVuZChuYW1lKTsKKyAgICAgICAgICAgIGlmIChwcm9qZWN0TG9jYXRpb24udG9GaWxlKCkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0IGNhc2luZworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2Fub25pY2FsUGF0aCA9IHByb2plY3RMb2NhdGlvbi50b0ZpbGUoKS5nZXRDYW5vbmljYWxQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3RMb2NhdGlvbiA9IG5ldyBQYXRoKGNhbm9uaWNhbFBhdGgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgSmF2YVBsdWdpbi5sb2coZSk7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJU3RyaW5nIGV4aXN0aW5nTmFtZSA9IHByb2plY3RMb2NhdGlvbi5sYXN0U2VnbWVudCgpOwotCQkJCWlmICghZXhpc3RpbmdOYW1lLmVxdWFscyhmTmFtZUdyb3VwLmdldE5hbWUoKSkpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKE1lc3NhZ2VzLmZvcm1hdCgKLQkJCQkJCQlOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTWVzc2FnZV9pbnZhbGlkUHJvamVjdE5hbWVGb3JXb3Jrc3BhY2VSb290LAotCQkJCQkJCWV4aXN0aW5nTmFtZSkpOwotCQkJCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQorICAgICAgICAgICAgICAgIFN0cmluZyBleGlzdGluZ05hbWUgPSBwcm9qZWN0TG9jYXRpb24ubGFzdFNlZ21lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nTmFtZS5lcXVhbHMoTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lQ09QWS50aGlzLmZOYW1lR3JvdXAuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTWVzc2FnZXMuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX01lc3NhZ2VfaW52YWxpZFByb2plY3ROYW1lRm9yV29ya3NwYWNlUm9vdCwgZXhpc3RpbmdOYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCX0KKyAgICAgICAgICAgIH0KIAotCQkJZmluYWwgU3RyaW5nIGxvY2F0aW9uID0gZkxvY2F0aW9uR3JvdXAuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVDT1BZLnRoaXMuZkxvY2F0aW9uR3JvdXAuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7CiAKLQkJCS8vIGNoZWNrIHdoZXRoZXIgbG9jYXRpb24gaXMgZW1wdHkKLQkJCWlmIChsb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCXNldE1lc3NhZ2UoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX01lc3NhZ2VfZW50ZXJMb2NhdGlvbik7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9CisgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGxvY2F0aW9uIGlzIGVtcHR5CisgICAgICAgICAgICBpZiAobG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKKyAgICAgICAgICAgICAgICBzZXRNZXNzYWdlKE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9NZXNzYWdlX2VudGVyTG9jYXRpb24pOworICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCQkvLyBjaGVjayB3aGV0aGVyIHRoZSBsb2NhdGlvbiBpcyBhIHN5bnRhY3RpY2FsbHkgY29ycmVjdCBwYXRoCi0JCQlpZiAoIVBhdGguRU1QVFkuaXNWYWxpZFBhdGgobG9jYXRpb24pKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9NZXNzYWdlX2ludmFsaWREaXJlY3RvcnkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQorICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgbG9jYXRpb24gaXMgYSBzeW50YWN0aWNhbGx5IGNvcnJlY3QgcGF0aAorICAgICAgICAgICAgaWYgKCFQYXRoLkVNUFRZLmlzVmFsaWRQYXRoKGxvY2F0aW9uKSkgeworICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTWVzc2FnZV9pbnZhbGlkRGlyZWN0b3J5KTsKKyAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAotCQkJSVBhdGggcHJvamVjdFBhdGggPSBQYXRoLmZyb21PU1N0cmluZyhsb2NhdGlvbik7CisgICAgICAgICAgICBJUGF0aCBwcm9qZWN0UGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKGxvY2F0aW9uKTsKIAotCQkJaWYgKGZMb2NhdGlvbkdyb3VwLmlzV29ya3NwYWNlUmFkaW9TZWxlY3RlZCgpKSB7Ci0JCQkJcHJvamVjdFBhdGggPSBwcm9qZWN0UGF0aC5hcHBlbmQoZk5hbWVHcm91cC5nZXROYW1lKCkpOwotCQkJfQorICAgICAgICAgICAgaWYgKE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZUNPUFkudGhpcy5mTG9jYXRpb25Hcm91cC5pc1dvcmtzcGFjZVJhZGlvU2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHByb2plY3RQYXRoID0gcHJvamVjdFBhdGguYXBwZW5kKE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZUNPUFkudGhpcy5mTmFtZUdyb3VwLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChwcm9qZWN0UGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgey8vIGNyZWF0ZSBmcm9tIGV4aXN0aW5nIHNvdXJjZQotCQkJCWlmIChQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2YocHJvamVjdFBhdGgpKSB7IC8vIGNyZWF0ZQotCQkJCQkvLyBmcm9tCi0JCQkJCS8vIGV4aXN0aW5nCi0JCQkJCS8vIHNvdXJjZQotCQkJCQkvLyBpbgotCQkJCQkvLyB3b3Jrc3BhY2UKLQkJCQkJaWYgKCFQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmVxdWFscyhwcm9qZWN0UGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkpKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX01lc3NhZ2Vfbm90T25Xb3Jrc3BhY2VSb290KTsKLQkJCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KKyAgICAgICAgICAgIGlmIChwcm9qZWN0UGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgey8vIGNyZWF0ZSBmcm9tIGV4aXN0aW5nIHNvdXJjZQorICAgICAgICAgICAgICAgIGlmIChQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2YocHJvamVjdFBhdGgpKSB7IC8vIGNyZWF0ZQorICAgICAgICAgICAgICAgICAgICAvLyBmcm9tCisgICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nCisgICAgICAgICAgICAgICAgICAgIC8vIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAvLyBpbgorICAgICAgICAgICAgICAgICAgICAvLyB3b3Jrc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmVxdWFscyhwcm9qZWN0UGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX01lc3NhZ2Vfbm90T25Xb3Jrc3BhY2VSb290KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhZ2VDb21wbGV0ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJCQlpZiAoIXByb2plY3RQYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX01lc3NhZ2Vfbm90RXhpc2luZ1Byb2plY3RPbldvcmtzcGFjZVJvb3QpOwotCQkJCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIWZMb2NhdGlvbkdyb3VwLmlzV29ya3NwYWNlUmFkaW9TZWxlY3RlZCgpKSB7Ly8gY3JlYXRlIGF0Ci0JCQkJLy8gbm9uCi0JCQkJLy8gZXhpc3RpbmcKLQkJCQkvLyBleHRlcm5hbAotCQkJCS8vIGxvY2F0aW9uCi0JCQkJaWYgKCFjYW5DcmVhdGUocHJvamVjdFBhdGgudG9GaWxlKCkpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfTWVzc2FnZV9jYW5ub3RDcmVhdGVBdEV4dGVybmFsTG9jYXRpb24pOwotCQkJCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQorICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2plY3RQYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX01lc3NhZ2Vfbm90RXhpc2luZ1Byb2plY3RPbldvcmtzcGFjZVJvb3QpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIU5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZUNPUFkudGhpcy5mTG9jYXRpb25Hcm91cC5pc1dvcmtzcGFjZVJhZGlvU2VsZWN0ZWQoKSkgey8vIGNyZWF0ZSBhdAorICAgICAgICAgICAgICAgIC8vIG5vbgorICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nCisgICAgICAgICAgICAgICAgLy8gZXh0ZXJuYWwKKyAgICAgICAgICAgICAgICAvLyBsb2NhdGlvbgorICAgICAgICAgICAgICAgIGlmICghY2FuQ3JlYXRlKHByb2plY3RQYXRoLnRvRmlsZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX01lc3NhZ2VfY2Fubm90Q3JlYXRlQXRFeHRlcm5hbExvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KIAotCQkJCS8vIElmIHdlIGRvIG5vdCBwbGFjZSB0aGUgY29udGVudHMgaW4gdGhlIHdvcmtzcGFjZSB2YWxpZGF0ZSB0aGUKLQkJCQkvLyBsb2NhdGlvbi4KLQkJCQlmaW5hbCBJU3RhdHVzIGxvY2F0aW9uU3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlUHJvamVjdExvY2F0aW9uKGhhbmRsZSwgcHJvamVjdFBhdGgpOwotCQkJCWlmICghbG9jYXRpb25TdGF0dXMuaXNPSygpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShsb2NhdGlvblN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvIG5vdCBwbGFjZSB0aGUgY29udGVudHMgaW4gdGhlIHdvcmtzcGFjZSB2YWxpZGF0ZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICBmaW5hbCBJU3RhdHVzIGxvY2F0aW9uU3RhdHVzID0gd29ya3NwYWNlLnZhbGlkYXRlUHJvamVjdExvY2F0aW9uKGhhbmRsZSwgcHJvamVjdFBhdGgpOworICAgICAgICAgICAgICAgIGlmICghbG9jYXRpb25TdGF0dXMuaXNPSygpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShsb2NhdGlvblN0YXR1cy5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7CisgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUodHJ1ZSk7CiAKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXNldE1lc3NhZ2UobnVsbCk7Ci0JCX0KLQl9CisgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7CisgICAgICAgICAgICBzZXRNZXNzYWdlKG51bGwpOworICAgICAgICB9CisgICAgfQogCi0JLy8gcHJpdmF0ZSBmaW5hbCBjbGFzcyBXb3JraW5nU2V0R3JvdXAgewotCS8vCi0JLy8gcHJpdmF0ZSBmaW5hbCBXb3JraW5nU2V0Q29uZmlndXJhdGlvbkJsb2NrIGZXb3JraW5nU2V0QmxvY2s7Ci0JLy8KLQkvLyBwdWJsaWMgV29ya2luZ1NldEdyb3VwKCkgewotCS8vIFN0cmluZ1tdIHdvcmtpbmdTZXRJZHMgPSBuZXcgU3RyaW5nW10geyBKYXZhV29ya2luZ1NldFVwZGF0ZXIuSUQsCi0JLy8gIm9yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UiIH07IC8vJE5PTi1OTFMtMSQKLQkvLyAvLyBTdHJpbmcgbGFiZWwgPSAiQWRkIHByb2plY3QgdG8gd29ya2luZyBzZXRzIjsKLQkvLyBmV29ya2luZ1NldEJsb2NrID0gbmV3IFdvcmtpbmdTZXRDb25maWd1cmF0aW9uQmxvY2sod29ya2luZ1NldElkcywKLQkvLyBKYXZhUGx1Z2luLmdldERlZmF1bHQoKQotCS8vIC5nZXREaWFsb2dTZXR0aW5ncygpKTsKLQkvLyAvLwotCS8vIGZXb3JraW5nU2V0QmxvY2suc2V0RGlhbG9nTWVzc2FnZShOZXdXaXphcmRNZXNzYWdlcy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfV29ya2luZ1NldFNlbGVjdGlvbl9tZXNzYWdlKTsKLQkvLyB9Ci0JLy8KLQkvLyBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkvLyBHcm91cCB3b3JraW5nU2V0R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JLy8gd29ya2luZ1NldEdyb3VwLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JLy8gd29ya2luZ1NldEdyb3VwLnNldFRleHQoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX1dvcmtpbmdTZXRzX2dyb3VwKTsKLQkvLyB3b3JraW5nU2V0R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JLy8KLQkvLyBmV29ya2luZ1NldEJsb2NrLmNyZWF0ZUNvbnRlbnQod29ya2luZ1NldEdyb3VwKTsKLQkvLwotCS8vIHJldHVybiB3b3JraW5nU2V0R3JvdXA7Ci0JLy8gfQotCS8vCi0JLy8gcHVibGljIElXb3JraW5nU2V0W10gZ2V0U2VsZWN0ZWRXb3JraW5nU2V0cygpIHsKLQkvLyByZXR1cm4gZldvcmtpbmdTZXRCbG9jay5nZXRTZWxlY3RlZFdvcmtpbmdTZXRzKCk7Ci0JLy8gfQotCS8vCi0JLy8gcHVibGljIHZvaWQgc2V0V29ya2luZ1NldHMoSVdvcmtpbmdTZXRbXSB3b3JraW5nU2V0cykgewotCS8vIGZXb3JraW5nU2V0QmxvY2suc2V0V29ya2luZ1NldHMod29ya2luZ1NldHMpOwotCS8vIH0KLQkvLyB9CisgICAgLy8gcHJpdmF0ZSBmaW5hbCBjbGFzcyBXb3JraW5nU2V0R3JvdXAgeworICAgIC8vCisgICAgLy8gcHJpdmF0ZSBmaW5hbCBXb3JraW5nU2V0Q29uZmlndXJhdGlvbkJsb2NrIGZXb3JraW5nU2V0QmxvY2s7CisgICAgLy8KKyAgICAvLyBwdWJsaWMgV29ya2luZ1NldEdyb3VwKCkgeworICAgIC8vIFN0cmluZ1tdIHdvcmtpbmdTZXRJZHMgPSBuZXcgU3RyaW5nW10geyBKYXZhV29ya2luZ1NldFVwZGF0ZXIuSUQsCisgICAgLy8gIm9yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UiIH07IC8vJE5PTi1OTFMtMSQKKyAgICAvLyAvLyBTdHJpbmcgbGFiZWwgPSAiQWRkIHByb2plY3QgdG8gd29ya2luZyBzZXRzIjsKKyAgICAvLyBmV29ya2luZ1NldEJsb2NrID0gbmV3IFdvcmtpbmdTZXRDb25maWd1cmF0aW9uQmxvY2sod29ya2luZ1NldElkcywKKyAgICAvLyBKYXZhUGx1Z2luLmdldERlZmF1bHQoKQorICAgIC8vIC5nZXREaWFsb2dTZXR0aW5ncygpKTsKKyAgICAvLyAvLworICAgIC8vIGZXb3JraW5nU2V0QmxvY2suc2V0RGlhbG9nTWVzc2FnZShOZXdXaXphcmRNZXNzYWdlcy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfV29ya2luZ1NldFNlbGVjdGlvbl9tZXNzYWdlKTsKKyAgICAvLyB9CisgICAgLy8KKyAgICAvLyBwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKyAgICAvLyBHcm91cCB3b3JraW5nU2V0R3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisgICAgLy8gd29ya2luZ1NldEdyb3VwLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7CisgICAgLy8gd29ya2luZ1NldEdyb3VwLnNldFRleHQoTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX1dvcmtpbmdTZXRzX2dyb3VwKTsKKyAgICAvLyB3b3JraW5nU2V0R3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7CisgICAgLy8KKyAgICAvLyBmV29ya2luZ1NldEJsb2NrLmNyZWF0ZUNvbnRlbnQod29ya2luZ1NldEdyb3VwKTsKKyAgICAvLworICAgIC8vIHJldHVybiB3b3JraW5nU2V0R3JvdXA7CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gcHVibGljIElXb3JraW5nU2V0W10gZ2V0U2VsZWN0ZWRXb3JraW5nU2V0cygpIHsKKyAgICAvLyByZXR1cm4gZldvcmtpbmdTZXRCbG9jay5nZXRTZWxlY3RlZFdvcmtpbmdTZXRzKCk7CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gcHVibGljIHZvaWQgc2V0V29ya2luZ1NldHMoSVdvcmtpbmdTZXRbXSB3b3JraW5nU2V0cykgeworICAgIC8vIGZXb3JraW5nU2V0QmxvY2suc2V0V29ya2luZ1NldHMod29ya2luZ1NldHMpOworICAgIC8vIH0KKyAgICAvLyB9CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gIk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZSI7IC8vJE5PTi1OTFMtMSQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gIk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZSI7IC8vJE5PTi1OTFMtMSQKIAotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIElXb3JraW5nU2V0W10gRU1QVFlfV09SS0lOR19TRVRfQVJSQVkgPSBuZXcKLQkvLyBJV29ya2luZ1NldFswXTsKLQkvLwotCS8vIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdvcmtpbmdTZXQoSVdvcmtpbmdTZXQgd29ya2luZ1NldCkgewotCS8vIFN0cmluZyBpZCA9IHdvcmtpbmdTZXQuZ2V0SWQoKTsKLQkvLyBpZiAoIUphdmFXb3JraW5nU2V0VXBkYXRlci5JRC5lcXVhbHMoaWQpICYmCi0JLy8gISJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVdvcmtpbmdTZXRQYWdlIi5lcXVhbHMoaWQpKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLwotCS8vIGlmICh3b3JraW5nU2V0LmlzQWdncmVnYXRlV29ya2luZ1NldCgpKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLwotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KKyAgICAvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBJV29ya2luZ1NldFtdIEVNUFRZX1dPUktJTkdfU0VUX0FSUkFZID0gbmV3CisgICAgLy8gSVdvcmtpbmdTZXRbMF07CisgICAgLy8KKyAgICAvLyBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXb3JraW5nU2V0KElXb3JraW5nU2V0IHdvcmtpbmdTZXQpIHsKKyAgICAvLyBTdHJpbmcgaWQgPSB3b3JraW5nU2V0LmdldElkKCk7CisgICAgLy8gaWYgKCFKYXZhV29ya2luZ1NldFVwZGF0ZXIuSUQuZXF1YWxzKGlkKSAmJgorICAgIC8vICEib3JnLmVjbGlwc2UudWkucmVzb3VyY2VXb3JraW5nU2V0UGFnZSIuZXF1YWxzKGlkKSkgeworICAgIC8vIHJldHVybiBmYWxzZTsKKyAgICAvLyB9CisgICAgLy8KKyAgICAvLyBpZiAod29ya2luZ1NldC5pc0FnZ3JlZ2F0ZVdvcmtpbmdTZXQoKSkgeworICAgIC8vIHJldHVybiBmYWxzZTsKKyAgICAvLyB9CisgICAgLy8KKyAgICAvLyByZXR1cm4gdHJ1ZTsKKyAgICAvLyB9CiAKLQlwcml2YXRlIGZpbmFsIE5hbWVHcm91cCBmTmFtZUdyb3VwOworICAgIHByaXZhdGUgZmluYWwgTmFtZUdyb3VwIGZOYW1lR3JvdXA7CiAKLQlwcml2YXRlIGZpbmFsIExvY2F0aW9uR3JvdXAgZkxvY2F0aW9uR3JvdXA7CisgICAgcHJpdmF0ZSBmaW5hbCBMb2NhdGlvbkdyb3VwIGZMb2NhdGlvbkdyb3VwOwogCi0JcHJpdmF0ZSBmaW5hbCBMYXlvdXRHcm91cCBmTGF5b3V0R3JvdXA7CisgICAgcHJpdmF0ZSBmaW5hbCBMYXlvdXRHcm91cCBmTGF5b3V0R3JvdXA7CiAKLQlwcml2YXRlIGZpbmFsIEpSRUdyb3VwIGZKUkVHcm91cDsKKyAgICBwcml2YXRlIGZpbmFsIEpSRUdyb3VwIGZKUkVHcm91cDsKIAotCXByaXZhdGUgZmluYWwgRGV0ZWN0R3JvdXAgZkRldGVjdEdyb3VwOworICAgIHByaXZhdGUgZmluYWwgRGV0ZWN0R3JvdXAgZkRldGVjdEdyb3VwOwogCi0JcHJpdmF0ZSBmaW5hbCBWYWxpZGF0b3IgZlZhbGlkYXRvcjsKKyAgICBwcml2YXRlIGZpbmFsIFZhbGlkYXRvciBmVmFsaWRhdG9yOwogCi0JLy8gcHJpdmF0ZSBmaW5hbCBXb3JraW5nU2V0R3JvdXAgZldvcmtpbmdTZXRHcm91cDsKKyAgICAvLyBwcml2YXRlIGZpbmFsIFdvcmtpbmdTZXRHcm91cCBmV29ya2luZ1NldEdyb3VwOwogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lQ09QWX0uCi0JICovCi0JcHVibGljIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZUNPUFkoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCXNldFRpdGxlKE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9wYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lX3BhZ2VfZGVzY3JpcHRpb24pOworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZUNPUFl9LgorICAgICAqLworICAgIHB1YmxpYyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVDT1BZKCkgeworICAgICAgICBzdXBlcihQQUdFX05BTUUpOworICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOworICAgICAgICBzZXRUaXRsZShOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVfcGFnZV90aXRsZSk7CisgICAgICAgIHNldERlc2NyaXB0aW9uKE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZV9wYWdlX2Rlc2NyaXB0aW9uKTsKIAotCQlmTmFtZUdyb3VwID0gbmV3IE5hbWVHcm91cCgpOwotCQlmTG9jYXRpb25Hcm91cCA9IG5ldyBMb2NhdGlvbkdyb3VwKCk7Ci0JCWZKUkVHcm91cCA9IG5ldyBKUkVHcm91cCgpOwotCQlmTGF5b3V0R3JvdXAgPSBuZXcgTGF5b3V0R3JvdXAoKTsKLQkJLy8gZldvcmtpbmdTZXRHcm91cCA9IG5ldyBXb3JraW5nU2V0R3JvdXAoKTsKLQkJZkRldGVjdEdyb3VwID0gbmV3IERldGVjdEdyb3VwKCk7CisgICAgICAgIHRoaXMuZk5hbWVHcm91cCA9IG5ldyBOYW1lR3JvdXAoKTsKKyAgICAgICAgdGhpcy5mTG9jYXRpb25Hcm91cCA9IG5ldyBMb2NhdGlvbkdyb3VwKCk7CisgICAgICAgIHRoaXMuZkpSRUdyb3VwID0gbmV3IEpSRUdyb3VwKCk7CisgICAgICAgIHRoaXMuZkxheW91dEdyb3VwID0gbmV3IExheW91dEdyb3VwKCk7CisgICAgICAgIC8vIGZXb3JraW5nU2V0R3JvdXAgPSBuZXcgV29ya2luZ1NldEdyb3VwKCk7CisgICAgICAgIHRoaXMuZkRldGVjdEdyb3VwID0gbmV3IERldGVjdEdyb3VwKCk7CiAKLQkJLy8gZXN0YWJsaXNoIGNvbm5lY3Rpb25zCi0JCWZOYW1lR3JvdXAuYWRkT2JzZXJ2ZXIoZkxvY2F0aW9uR3JvdXApOwotCQlmRGV0ZWN0R3JvdXAuYWRkT2JzZXJ2ZXIoZkxheW91dEdyb3VwKTsKLQkJZkRldGVjdEdyb3VwLmFkZE9ic2VydmVyKGZKUkVHcm91cCk7Ci0JCWZMb2NhdGlvbkdyb3VwLmFkZE9ic2VydmVyKGZEZXRlY3RHcm91cCk7CisgICAgICAgIC8vIGVzdGFibGlzaCBjb25uZWN0aW9ucworICAgICAgICB0aGlzLmZOYW1lR3JvdXAuYWRkT2JzZXJ2ZXIodGhpcy5mTG9jYXRpb25Hcm91cCk7CisgICAgICAgIHRoaXMuZkRldGVjdEdyb3VwLmFkZE9ic2VydmVyKHRoaXMuZkxheW91dEdyb3VwKTsKKyAgICAgICAgdGhpcy5mRGV0ZWN0R3JvdXAuYWRkT2JzZXJ2ZXIodGhpcy5mSlJFR3JvdXApOworICAgICAgICB0aGlzLmZMb2NhdGlvbkdyb3VwLmFkZE9ic2VydmVyKHRoaXMuZkRldGVjdEdyb3VwKTsKIAotCQkvLyBpbml0aWFsaXplIGFsbCBlbGVtZW50cwotCQlmTmFtZUdyb3VwLm5vdGlmeU9ic2VydmVycygpOworICAgICAgICAvLyBpbml0aWFsaXplIGFsbCBlbGVtZW50cworICAgICAgICB0aGlzLmZOYW1lR3JvdXAubm90aWZ5T2JzZXJ2ZXJzKCk7CiAKLQkJLy8gY3JlYXRlIGFuZCBjb25uZWN0IHZhbGlkYXRvcgotCQlmVmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcigpOwotCQlmTmFtZUdyb3VwLmFkZE9ic2VydmVyKGZWYWxpZGF0b3IpOwotCQlmTG9jYXRpb25Hcm91cC5hZGRPYnNlcnZlcihmVmFsaWRhdG9yKTsKKyAgICAgICAgLy8gY3JlYXRlIGFuZCBjb25uZWN0IHZhbGlkYXRvcgorICAgICAgICB0aGlzLmZWYWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yKCk7CisgICAgICAgIHRoaXMuZk5hbWVHcm91cC5hZGRPYnNlcnZlcih0aGlzLmZWYWxpZGF0b3IpOworICAgICAgICB0aGlzLmZMb2NhdGlvbkdyb3VwLmFkZE9ic2VydmVyKHRoaXMuZlZhbGlkYXRvcik7CiAKLQkJLy8gaW5pdGlhbGl6ZSBkZWZhdWx0cwotCQlzZXRQcm9qZWN0TmFtZSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0UHJvamVjdExvY2F0aW9uVVJJKG51bGwpOwotCQkvLyBzZXRXb3JraW5nU2V0cyhuZXcgSVdvcmtpbmdTZXRbMF0pOworICAgICAgICAvLyBpbml0aWFsaXplIGRlZmF1bHRzCisgICAgICAgIHNldFByb2plY3ROYW1lKCIiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBzZXRQcm9qZWN0TG9jYXRpb25VUkkobnVsbCk7CisgICAgICAgIC8vIHNldFdvcmtpbmdTZXRzKG5ldyBJV29ya2luZ1NldFswXSk7CiAKLQkJaW5pdGlhbGl6ZURlZmF1bHRWTSgpOwotCX0KKyAgICAgICAgaW5pdGlhbGl6ZURlZmF1bHRWTSgpOworICAgIH0KIAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUKLQkgKiBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMKLQkgKiAuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzIC5Db21wb3NpdGUpCisgICAgICovCisgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIGluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwogCi0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJY29tcG9zaXRlLnNldExheW91dChpbml0R3JpZExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSksIHRydWUpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOworICAgICAgICBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKyAgICAgICAgY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CisgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoaW5pdEdyaWRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpLCB0cnVlKSk7CisgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKIAotCQkvLyBjcmVhdGUgVUkgZWxlbWVudHMKLQkJQ29udHJvbCBuYW1lQ29udHJvbCA9IGNyZWF0ZU5hbWVDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCW5hbWVDb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworICAgICAgICAvLyBjcmVhdGUgVUkgZWxlbWVudHMKKyAgICAgICAgQ29udHJvbCBuYW1lQ29udHJvbCA9IGNyZWF0ZU5hbWVDb250cm9sKGNvbXBvc2l0ZSk7CisgICAgICAgIG5hbWVDb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwogCi0JCUNvbnRyb2wgbG9jYXRpb25Db250cm9sID0gY3JlYXRlTG9jYXRpb25Db250cm9sKGNvbXBvc2l0ZSk7Ci0JCWxvY2F0aW9uQ29udHJvbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKyAgICAgICAgQ29udHJvbCBsb2NhdGlvbkNvbnRyb2wgPSBjcmVhdGVMb2NhdGlvbkNvbnRyb2woY29tcG9zaXRlKTsKKyAgICAgICAgbG9jYXRpb25Db250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwogCi0JCUNvbnRyb2wganJlQ29udHJvbCA9IGNyZWF0ZUpSRVNlbGVjdGlvbkNvbnRyb2woY29tcG9zaXRlKTsKLQkJanJlQ29udHJvbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKyAgICAgICAgQ29udHJvbCBqcmVDb250cm9sID0gY3JlYXRlSlJFU2VsZWN0aW9uQ29udHJvbChjb21wb3NpdGUpOworICAgICAgICBqcmVDb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwogCi0JCUNvbnRyb2wgbGF5b3V0Q29udHJvbCA9IGNyZWF0ZVByb2plY3RMYXlvdXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCWxheW91dENvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisgICAgICAgIENvbnRyb2wgbGF5b3V0Q29udHJvbCA9IGNyZWF0ZVByb2plY3RMYXlvdXRDb250cm9sKGNvbXBvc2l0ZSk7CisgICAgICAgIGxheW91dENvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CiAKLQkJLy8gQ29udHJvbCB3b3JraW5nU2V0Q29udHJvbCA9IGNyZWF0ZVdvcmtpbmdTZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCS8vIHdvcmtpbmdTZXRDb250cm9sLnNldExheW91dERhdGEobmV3Ci0JCS8vIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworICAgICAgICAvLyBDb250cm9sIHdvcmtpbmdTZXRDb250cm9sID0gY3JlYXRlV29ya2luZ1NldENvbnRyb2woY29tcG9zaXRlKTsKKyAgICAgICAgLy8gd29ya2luZ1NldENvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcKKyAgICAgICAgLy8gR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CiAKLQkJQ29udHJvbCBpbmZvQ29udHJvbCA9IGNyZWF0ZUluZm9Db250cm9sKGNvbXBvc2l0ZSk7Ci0JCWluZm9Db250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworICAgICAgICBDb250cm9sIGluZm9Db250cm9sID0gY3JlYXRlSW5mb0NvbnRyb2woY29tcG9zaXRlKTsKKyAgICAgICAgaW5mb0NvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CiAKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KKyAgICAgICAgc2V0Q29udHJvbChjb21wb3NpdGUpOworICAgIH0KIAotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2xzIGZvciB0aGUgaW5mbyBzZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlSW5mb0NvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlyZXR1cm4gZkRldGVjdEdyb3VwLmNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgY29udHJvbHMgZm9yIHRoZSBpbmZvIHNlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9zaXRlIHRoZSBwYXJlbnQgY29tcG9zaXRlCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBjb250cm9sCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlSW5mb0NvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworICAgICAgICByZXR1cm4gdGhpcy5mRGV0ZWN0R3JvdXAuY3JlYXRlQ29udHJvbChjb21wb3NpdGUpOworICAgIH0KIAotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2xzIGZvciB0aGUgSlJFIHNlbGVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlSlJFU2VsZWN0aW9uQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXJldHVybiBmSlJFR3JvdXAuY3JlYXRlQ29udHJvbChjb21wb3NpdGUpOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBjb250cm9scyBmb3IgdGhlIEpSRSBzZWxlY3Rpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIHBhcmVudCBjb21wb3NpdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGNvbnRyb2wKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVKUkVTZWxlY3Rpb25Db250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZkpSRUdyb3VwLmNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9scyBmb3IgdGhlIGxvY2F0aW9uIGZpZWxkLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlTG9jYXRpb25Db250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJcmV0dXJuIGZMb2NhdGlvbkdyb3VwLmNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgY29udHJvbHMgZm9yIHRoZSBsb2NhdGlvbiBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIHBhcmVudCBjb21wb3NpdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGNvbnRyb2wKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVMb2NhdGlvbkNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworICAgICAgICByZXR1cm4gdGhpcy5mTG9jYXRpb25Hcm91cC5jcmVhdGVDb250cm9sKGNvbXBvc2l0ZSk7CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJvbHMgZm9yIHRoZSBuYW1lIGZpZWxkLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlTmFtZUNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlyZXR1cm4gZk5hbWVHcm91cC5jcmVhdGVDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIGNvbnRyb2xzIGZvciB0aGUgbmFtZSBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIHBhcmVudCBjb21wb3NpdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGNvbnRyb2wKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVOYW1lQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZOYW1lR3JvdXAuY3JlYXRlQ29udHJvbChjb21wb3NpdGUpOworICAgIH0KIAotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2xzIGZvciB0aGUgcHJvamVjdCBsYXlvdXQgc2VsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlUHJvamVjdExheW91dENvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlyZXR1cm4gZkxheW91dEdyb3VwLmNyZWF0ZUNvbnRlbnQoY29tcG9zaXRlKTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgY29udHJvbHMgZm9yIHRoZSBwcm9qZWN0IGxheW91dCBzZWxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9zaXRlIHRoZSBwYXJlbnQgY29tcG9zaXRlCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBjb250cm9sCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlUHJvamVjdExheW91dENvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworICAgICAgICByZXR1cm4gdGhpcy5mTGF5b3V0R3JvdXAuY3JlYXRlQ29udGVudChjb21wb3NpdGUpOworICAgIH0KIAotCS8vIC8qKgotCS8vICogQ3JlYXRlcyB0aGUgY29udHJvbHMgZm9yIHRoZSB3b3JraW5nIHNldCBzZWxlY3Rpb24uCi0JLy8gKgotCS8vICogQHBhcmFtIGNvbXBvc2l0ZSB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCS8vICogQHJldHVybiB0aGUgY3JlYXRlZCBjb250cm9sCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVXb3JraW5nU2V0Q29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JLy8gcmV0dXJuIGZXb3JraW5nU2V0R3JvdXAuY3JlYXRlQ29udHJvbChjb21wb3NpdGUpOwotCS8vIH0KKyAgICAvLyAvKioKKyAgICAvLyAqIENyZWF0ZXMgdGhlIGNvbnRyb2xzIGZvciB0aGUgd29ya2luZyBzZXQgc2VsZWN0aW9uLgorICAgIC8vICoKKyAgICAvLyAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIHBhcmVudCBjb21wb3NpdGUKKyAgICAvLyAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgY29udHJvbAorICAgIC8vICovCisgICAgLy8gcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlV29ya2luZ1NldENvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgeworICAgIC8vIHJldHVybiBmV29ya2luZ1NldEdyb3VwLmNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKKyAgICAvLyB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb21waWxlciBjb21wbGlhbmNlIHRvIGJlIHVzZWQgZm9yIHRoZSBwcm9qZWN0LCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlIHdvcmtzcGFjZSBjb21waWxlcgotCSAqIGNvbXBsaWFuY2UuCi0JICogCi0JICogQHJldHVybiBjb21waWxlciBjb21wbGlhbmNlIHRvIGJlIHVzZWQgZm9yIHRoZSBwcm9qZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21waWxlckNvbXBsaWFuY2UoKSB7Ci0JCXJldHVybiBmSlJFR3JvdXAuZ2V0U2VsZWN0ZWRDb21waWxlckNvbXBsaWFuY2UoKTsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29tcGlsZXIgY29tcGxpYW5jZSB0byBiZSB1c2VkIGZvciB0aGUgcHJvamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gdXNlIHRoZSB3b3Jrc3BhY2UgY29tcGlsZXIKKyAgICAgKiBjb21wbGlhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBjb21waWxlciBjb21wbGlhbmNlIHRvIGJlIHVzZWQgZm9yIHRoZSBwcm9qZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb21waWxlckNvbXBsaWFuY2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZKUkVHcm91cC5nZXRTZWxlY3RlZENvbXBpbGVyQ29tcGxpYW5jZSgpOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgY2xhc3MgcGF0aCBlbnRyaWVzIHRvIGJlIGFkZGVkIG9uIG5ldyBwcm9qZWN0cy4gQnkgZGVmYXVsdCB0aGlzIGlzIHRoZSBKUkUgY29udGFpbmVyIGFzCi0JICogc2VsZWN0ZWQgYnkgdGhlIHVzZXIuCi0JICogCi0JICogQHJldHVybiByZXR1cm5zIHRoZSBkZWZhdWx0IGNsYXNzIHBhdGggZW50cmllcwotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXREZWZhdWx0Q2xhc3NwYXRoRW50cmllcygpIHsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZGVmYXVsdEpSRUxpYnJhcnkgPSBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldERlZmF1bHRKUkVMaWJyYXJ5KCk7Ci0JCVN0cmluZyBjb21wbGlhbmNlID0gZ2V0Q29tcGlsZXJDb21wbGlhbmNlKCk7Ci0JCUlQYXRoIGpyZUNvbnRhaW5lclBhdGggPSBuZXcgUGF0aChKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSKTsKLQkJaWYgKGNvbXBsaWFuY2UgPT0gbnVsbCB8fCBkZWZhdWx0SlJFTGlicmFyeS5sZW5ndGggPiAxCi0JCQkJfHwgIWpyZUNvbnRhaW5lclBhdGguaXNQcmVmaXhPZihkZWZhdWx0SlJFTGlicmFyeVswXS5nZXRQYXRoKCkpKSB7Ci0JCQkvLyB1c2UgZGVmYXVsdAotCQkJcmV0dXJuIGRlZmF1bHRKUkVMaWJyYXJ5OwotCQl9Ci0JCUlQYXRoIG5ld1BhdGggPSBmSlJFR3JvdXAuZ2V0SlJFQ29udGFpbmVyUGF0aCgpOwotCQlpZiAobmV3UGF0aCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVtdIHsgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkobmV3UGF0aCkgfTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEpSRUxpYnJhcnk7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgY2xhc3MgcGF0aCBlbnRyaWVzIHRvIGJlIGFkZGVkIG9uIG5ldyBwcm9qZWN0cy4gQnkgZGVmYXVsdCB0aGlzIGlzIHRoZSBKUkUgY29udGFpbmVyIGFzCisgICAgICogc2VsZWN0ZWQgYnkgdGhlIHVzZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGRlZmF1bHQgY2xhc3MgcGF0aCBlbnRyaWVzCisgICAgICovCisgICAgcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldERlZmF1bHRDbGFzc3BhdGhFbnRyaWVzKCkgeworICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBkZWZhdWx0SlJFTGlicmFyeSA9IFByZWZlcmVuY2VDb25zdGFudHMuZ2V0RGVmYXVsdEpSRUxpYnJhcnkoKTsKKyAgICAgICAgU3RyaW5nIGNvbXBsaWFuY2UgPSBnZXRDb21waWxlckNvbXBsaWFuY2UoKTsKKyAgICAgICAgSVBhdGgganJlQ29udGFpbmVyUGF0aCA9IG5ldyBQYXRoKEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIpOworICAgICAgICBpZiAoY29tcGxpYW5jZSA9PSBudWxsIHx8IGRlZmF1bHRKUkVMaWJyYXJ5Lmxlbmd0aCA+IDEgfHwgIWpyZUNvbnRhaW5lclBhdGguaXNQcmVmaXhPZihkZWZhdWx0SlJFTGlicmFyeVswXS5nZXRQYXRoKCkpKSB7CisgICAgICAgICAgICAvLyB1c2UgZGVmYXVsdAorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRKUkVMaWJyYXJ5OworICAgICAgICB9CisgICAgICAgIElQYXRoIG5ld1BhdGggPSB0aGlzLmZKUkVHcm91cC5nZXRKUkVDb250YWluZXJQYXRoKCk7CisgICAgICAgIGlmIChuZXdQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5W10geyBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShuZXdQYXRoKSB9OworICAgICAgICB9CisgICAgICAgIHJldHVybiBkZWZhdWx0SlJFTGlicmFyeTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzb3VyY2UgY2xhc3MgcGF0aCBlbnRyaWVzIHRvIGJlIGFkZGVkIG9uIG5ldyBwcm9qZWN0cy4gVGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgbWF5IG5vdCBleGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHJldHVybnMgdGhlIGRlZmF1bHQgY2xhc3MgcGF0aCBlbnRyaWVzCi0JICovCi0JcHVibGljIElQYXRoIGdldE91dHB1dExvY2F0aW9uKCkgewotCQlJUGF0aCBvdXRwdXRMb2NhdGlvblBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0TmFtZSgpKS5tYWtlQWJzb2x1dGUoKTsKLQkJaWYgKGZMYXlvdXRHcm91cC5pc1NyY0JpbigpKSB7Ci0JCQlJUGF0aCBiaW5QYXRoID0gbmV3IFBhdGgoUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCVByZWZlcmVuY2VDb25zdGFudHMuU1JDQklOX0JJTk5BTUUpKTsKLQkJCWlmIChiaW5QYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJCW91dHB1dExvY2F0aW9uUGF0aCA9IG91dHB1dExvY2F0aW9uUGF0aC5hcHBlbmQoYmluUGF0aCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG91dHB1dExvY2F0aW9uUGF0aDsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc291cmNlIGNsYXNzIHBhdGggZW50cmllcyB0byBiZSBhZGRlZCBvbiBuZXcgcHJvamVjdHMuIFRoZSB1bmRlcmx5aW5nIHJlc291cmNlIG1heSBub3QgZXhpc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGRlZmF1bHQgY2xhc3MgcGF0aCBlbnRyaWVzCisgICAgICovCisgICAgcHVibGljIElQYXRoIGdldE91dHB1dExvY2F0aW9uKCkgeworICAgICAgICBJUGF0aCBvdXRwdXRMb2NhdGlvblBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0TmFtZSgpKS5tYWtlQWJzb2x1dGUoKTsKKyAgICAgICAgaWYgKHRoaXMuZkxheW91dEdyb3VwLmlzU3JjQmluKCkpIHsKKyAgICAgICAgICAgIElQYXRoIGJpblBhdGggPSBuZXcgUGF0aChQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLlNSQ0JJTl9CSU5OQU1FKSk7CisgICAgICAgICAgICBpZiAoYmluUGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRMb2NhdGlvblBhdGggPSBvdXRwdXRMb2NhdGlvblBhdGguYXBwZW5kKGJpblBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBvdXRwdXRMb2NhdGlvblBhdGg7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBwcm9qZWN0IGxvY2F0aW9uIHBhdGggYXMgZW50ZXJlZCBieSB0aGUgdXNlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb2plY3Qgc2hvdWxkIGJlCi0JICogY3JlYXRlZCBpbiB0aGUgd29ya3NwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2plY3QgbG9jYXRpb24gcGF0aCBvciBpdHMgYW50aWNpcGF0ZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgVVJJIGdldFByb2plY3RMb2NhdGlvblVSSSgpIHsKLQkJaWYgKGZMb2NhdGlvbkdyb3VwLmlzTG9jYXRpb25JbldvcmtzcGFjZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gVVJJVXRpbC50b1VSSShmTG9jYXRpb25Hcm91cC5nZXRMb2NhdGlvbigpKTsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBwcm9qZWN0IGxvY2F0aW9uIHBhdGggYXMgZW50ZXJlZCBieSB0aGUgdXNlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb2plY3Qgc2hvdWxkIGJlCisgICAgICogY3JlYXRlZCBpbiB0aGUgd29ya3NwYWNlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJvamVjdCBsb2NhdGlvbiBwYXRoIG9yIGl0cyBhbnRpY2lwYXRlZCBpbml0aWFsIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBVUkkgZ2V0UHJvamVjdExvY2F0aW9uVVJJKCkgeworICAgICAgICBpZiAodGhpcy5mTG9jYXRpb25Hcm91cC5pc0xvY2F0aW9uSW5Xb3Jrc3BhY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFVSSVV0aWwudG9VUkkodGhpcy5mTG9jYXRpb25Hcm91cC5nZXRMb2NhdGlvbigpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBHZXRzIGEgcHJvamVjdCBuYW1lIGZvciB0aGUgbmV3IHByb2plY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV3IHByb2plY3QgcmVzb3VyY2UgaGFuZGxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lR3JvdXAuZ2V0TmFtZSgpOwotCX0KKyAgICAvKioKKyAgICAgKiBHZXRzIGEgcHJvamVjdCBuYW1lIGZvciB0aGUgbmV3IHByb2plY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgcHJvamVjdCByZXNvdXJjZSBoYW5kbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5mTmFtZUdyb3VwLmdldE5hbWUoKTsKKyAgICB9CiAKLQkvLyBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkvLyBwcml2YXRlIElXb3JraW5nU2V0W10gZ2V0U2VsZWN0ZWRXb3JraW5nU2V0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JLy8gc2VsZWN0aW9uKSB7Ci0JLy8gaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRyZWVTZWxlY3Rpb24pKSB7Ci0JLy8gcmV0dXJuIEVNUFRZX1dPUktJTkdfU0VUX0FSUkFZOwotCS8vIH0KLQkvLwotCS8vIElUcmVlU2VsZWN0aW9uIHRyZWVTZWxlY3Rpb24gPSAoSVRyZWVTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkvLyBpZiAodHJlZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkvLyByZXR1cm4gRU1QVFlfV09SS0lOR19TRVRfQVJSQVk7Ci0JLy8gfQotCS8vCi0JLy8gTGlzdCBlbGVtZW50cyA9IHRyZWVTZWxlY3Rpb24udG9MaXN0KCk7Ci0JLy8gaWYgKGVsZW1lbnRzLnNpemUoKSA9PSAxKSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50cy5nZXQoMCk7Ci0JLy8gVHJlZVBhdGhbXSBwYXRocyA9IHRyZWVTZWxlY3Rpb24uZ2V0UGF0aHNGb3IoZWxlbWVudCk7Ci0JLy8gaWYgKHBhdGhzLmxlbmd0aCAhPSAxKSB7Ci0JLy8gcmV0dXJuIEVNUFRZX1dPUktJTkdfU0VUX0FSUkFZOwotCS8vIH0KLQkvLwotCS8vIFRyZWVQYXRoIHBhdGggPSBwYXRoc1swXTsKLQkvLyBpZiAocGF0aC5nZXRTZWdtZW50Q291bnQoKSA9PSAwKSB7Ci0JLy8gcmV0dXJuIEVNUFRZX1dPUktJTkdfU0VUX0FSUkFZOwotCS8vIH0KLQkvLwotCS8vIE9iamVjdCBjYW5kaWRhdGUgPSBwYXRoLmdldFNlZ21lbnQoMCk7Ci0JLy8gaWYgKCEoY2FuZGlkYXRlIGluc3RhbmNlb2YgSVdvcmtpbmdTZXQpKSB7Ci0JLy8gcmV0dXJuIEVNUFRZX1dPUktJTkdfU0VUX0FSUkFZOwotCS8vIH0KLQkvLwotCS8vIElXb3JraW5nU2V0IHdvcmtpbmdTZXRDYW5kaWRhdGUgPSAoSVdvcmtpbmdTZXQpIGNhbmRpZGF0ZTsKLQkvLyBpZiAoaXNWYWxpZFdvcmtpbmdTZXQod29ya2luZ1NldENhbmRpZGF0ZSkpIHsKLQkvLyByZXR1cm4gbmV3IElXb3JraW5nU2V0W10geyB3b3JraW5nU2V0Q2FuZGlkYXRlIH07Ci0JLy8gfQotCS8vCi0JLy8gcmV0dXJuIEVNUFRZX1dPUktJTkdfU0VUX0FSUkFZOwotCS8vIH0KLQkvLwotCS8vIEFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkvLyBPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkvLyBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXb3JraW5nU2V0ICYmIGlzVmFsaWRXb3JraW5nU2V0KChJV29ya2luZ1NldCkKLQkvLyBlbGVtZW50KSkgewotCS8vIHJlc3VsdC5hZGQoZWxlbWVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gKElXb3JraW5nU2V0W10pIHJlc3VsdC50b0FycmF5KG5ldyBJV29ya2luZ1NldFtyZXN1bHQuc2l6ZSgpXSk7Ci0JLy8gfQorICAgIC8vIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIC8vIHByaXZhdGUgSVdvcmtpbmdTZXRbXSBnZXRTZWxlY3RlZFdvcmtpbmdTZXQoSVN0cnVjdHVyZWRTZWxlY3Rpb24KKyAgICAvLyBzZWxlY3Rpb24pIHsKKyAgICAvLyBpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVHJlZVNlbGVjdGlvbikpIHsKKyAgICAvLyByZXR1cm4gRU1QVFlfV09SS0lOR19TRVRfQVJSQVk7CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gSVRyZWVTZWxlY3Rpb24gdHJlZVNlbGVjdGlvbiA9IChJVHJlZVNlbGVjdGlvbikgc2VsZWN0aW9uOworICAgIC8vIGlmICh0cmVlU2VsZWN0aW9uLmlzRW1wdHkoKSkgeworICAgIC8vIHJldHVybiBFTVBUWV9XT1JLSU5HX1NFVF9BUlJBWTsKKyAgICAvLyB9CisgICAgLy8KKyAgICAvLyBMaXN0IGVsZW1lbnRzID0gdHJlZVNlbGVjdGlvbi50b0xpc3QoKTsKKyAgICAvLyBpZiAoZWxlbWVudHMuc2l6ZSgpID09IDEpIHsKKyAgICAvLyBPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzLmdldCgwKTsKKyAgICAvLyBUcmVlUGF0aFtdIHBhdGhzID0gdHJlZVNlbGVjdGlvbi5nZXRQYXRoc0ZvcihlbGVtZW50KTsKKyAgICAvLyBpZiAocGF0aHMubGVuZ3RoICE9IDEpIHsKKyAgICAvLyByZXR1cm4gRU1QVFlfV09SS0lOR19TRVRfQVJSQVk7CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gVHJlZVBhdGggcGF0aCA9IHBhdGhzWzBdOworICAgIC8vIGlmIChwYXRoLmdldFNlZ21lbnRDb3VudCgpID09IDApIHsKKyAgICAvLyByZXR1cm4gRU1QVFlfV09SS0lOR19TRVRfQVJSQVk7CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gT2JqZWN0IGNhbmRpZGF0ZSA9IHBhdGguZ2V0U2VnbWVudCgwKTsKKyAgICAvLyBpZiAoIShjYW5kaWRhdGUgaW5zdGFuY2VvZiBJV29ya2luZ1NldCkpIHsKKyAgICAvLyByZXR1cm4gRU1QVFlfV09SS0lOR19TRVRfQVJSQVk7CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gSVdvcmtpbmdTZXQgd29ya2luZ1NldENhbmRpZGF0ZSA9IChJV29ya2luZ1NldCkgY2FuZGlkYXRlOworICAgIC8vIGlmIChpc1ZhbGlkV29ya2luZ1NldCh3b3JraW5nU2V0Q2FuZGlkYXRlKSkgeworICAgIC8vIHJldHVybiBuZXcgSVdvcmtpbmdTZXRbXSB7IHdvcmtpbmdTZXRDYW5kaWRhdGUgfTsKKyAgICAvLyB9CisgICAgLy8KKyAgICAvLyByZXR1cm4gRU1QVFlfV09SS0lOR19TRVRfQVJSQVk7CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworICAgIC8vIE9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOworICAgIC8vIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdvcmtpbmdTZXQgJiYgaXNWYWxpZFdvcmtpbmdTZXQoKElXb3JraW5nU2V0KQorICAgIC8vIGVsZW1lbnQpKSB7CisgICAgLy8gcmVzdWx0LmFkZChlbGVtZW50KTsKKyAgICAvLyB9CisgICAgLy8gfQorICAgIC8vIHJldHVybiAoSVdvcmtpbmdTZXRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElXb3JraW5nU2V0W3Jlc3VsdC5zaXplKCldKTsKKyAgICAvLyB9CiAKLQkvLyBwcml2YXRlIElXb3JraW5nU2V0W10gZ2V0U2VsZWN0ZWRXb3JraW5nU2V0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JLy8gc2VsZWN0aW9uLCBJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0KSB7Ci0JLy8gSVdvcmtpbmdTZXRbXSBzZWxlY3RlZCA9IGdldFNlbGVjdGVkV29ya2luZ1NldChzZWxlY3Rpb24pOwotCS8vIGlmIChzZWxlY3RlZCAhPSBudWxsICYmIHNlbGVjdGVkLmxlbmd0aCA+IDApIHsKLQkvLyBmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JLy8gaWYgKCFpc1ZhbGlkV29ya2luZ1NldChzZWxlY3RlZFtpXSkpIHsKLQkvLyByZXR1cm4gRU1QVFlfV09SS0lOR19TRVRfQVJSQVk7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gc2VsZWN0ZWQ7Ci0JLy8gfQotCS8vCi0JLy8gaWYgKCEoYWN0aXZlUGFydCBpbnN0YW5jZW9mIFBhY2thZ2VFeHBsb3JlclBhcnQpKSB7Ci0JLy8gcmV0dXJuIEVNUFRZX1dPUktJTkdfU0VUX0FSUkFZOwotCS8vIH0KLQkvLwotCS8vIFBhY2thZ2VFeHBsb3JlclBhcnQgZXhwbG9yZXJQYXJ0ID0gKFBhY2thZ2VFeHBsb3JlclBhcnQpIGFjdGl2ZVBhcnQ7Ci0JLy8gaWYgKGV4cGxvcmVyUGFydC5nZXRSb290TW9kZSgpID09Ci0JLy8gTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuUFJPSkVDVFNfQVNfUk9PVFMpIHsKLQkvLyAvLyBHZXQgYWN0aXZlIGZpbHRlcgotCS8vIElXb3JraW5nU2V0IGZpbHRlcldvcmtpbmdTZXQgPSBleHBsb3JlclBhcnQuZ2V0RmlsdGVyV29ya2luZ1NldCgpOwotCS8vIGlmIChmaWx0ZXJXb3JraW5nU2V0ID09IG51bGwpIHsKLQkvLyByZXR1cm4gRU1QVFlfV09SS0lOR19TRVRfQVJSQVk7Ci0JLy8gfQotCS8vCi0JLy8gaWYgKCFpc1ZhbGlkV29ya2luZ1NldChmaWx0ZXJXb3JraW5nU2V0KSkgewotCS8vIHJldHVybiBFTVBUWV9XT1JLSU5HX1NFVF9BUlJBWTsKLQkvLyB9Ci0JLy8KLQkvLyByZXR1cm4gbmV3IElXb3JraW5nU2V0W10geyBmaWx0ZXJXb3JraW5nU2V0IH07Ci0JLy8gfQotCS8vIGVsc2UgewotCS8vIC8vIElmIHdlIGhhdmUgYmVlbiBnb25lIGludG8gYSB3b3JraW5nIHNldCByZXR1cm4gdGhlIHdvcmtpbmcgc2V0Ci0JLy8gT2JqZWN0IGlucHV0ID0gZXhwbG9yZXJQYXJ0LmdldFZpZXdQYXJ0SW5wdXQoKTsKLQkvLyBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIElXb3JraW5nU2V0KSkgewotCS8vIHJldHVybiBFTVBUWV9XT1JLSU5HX1NFVF9BUlJBWTsKLQkvLyB9Ci0JLy8KLQkvLyBJV29ya2luZ1NldCB3b3JraW5nU2V0ID0gKElXb3JraW5nU2V0KSBpbnB1dDsKLQkvLyBpZiAoIWlzVmFsaWRXb3JraW5nU2V0KHdvcmtpbmdTZXQpKSB7Ci0JLy8gcmV0dXJuIEVNUFRZX1dPUktJTkdfU0VUX0FSUkFZOwotCS8vIH0KLQkvLwotCS8vIHJldHVybiBuZXcgSVdvcmtpbmdTZXRbXSB7IHdvcmtpbmdTZXQgfTsKLQkvLyB9Ci0JLy8gfQorICAgIC8vIHByaXZhdGUgSVdvcmtpbmdTZXRbXSBnZXRTZWxlY3RlZFdvcmtpbmdTZXQoSVN0cnVjdHVyZWRTZWxlY3Rpb24KKyAgICAvLyBzZWxlY3Rpb24sIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQpIHsKKyAgICAvLyBJV29ya2luZ1NldFtdIHNlbGVjdGVkID0gZ2V0U2VsZWN0ZWRXb3JraW5nU2V0KHNlbGVjdGlvbik7CisgICAgLy8gaWYgKHNlbGVjdGVkICE9IG51bGwgJiYgc2VsZWN0ZWQubGVuZ3RoID4gMCkgeworICAgIC8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKKyAgICAvLyBpZiAoIWlzVmFsaWRXb3JraW5nU2V0KHNlbGVjdGVkW2ldKSkgeworICAgIC8vIHJldHVybiBFTVBUWV9XT1JLSU5HX1NFVF9BUlJBWTsKKyAgICAvLyB9CisgICAgLy8gfQorICAgIC8vIHJldHVybiBzZWxlY3RlZDsKKyAgICAvLyB9CisgICAgLy8KKyAgICAvLyBpZiAoIShhY3RpdmVQYXJ0IGluc3RhbmNlb2YgUGFja2FnZUV4cGxvcmVyUGFydCkpIHsKKyAgICAvLyByZXR1cm4gRU1QVFlfV09SS0lOR19TRVRfQVJSQVk7CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gUGFja2FnZUV4cGxvcmVyUGFydCBleHBsb3JlclBhcnQgPSAoUGFja2FnZUV4cGxvcmVyUGFydCkgYWN0aXZlUGFydDsKKyAgICAvLyBpZiAoZXhwbG9yZXJQYXJ0LmdldFJvb3RNb2RlKCkgPT0KKyAgICAvLyBOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5QUk9KRUNUU19BU19ST09UUykgeworICAgIC8vIC8vIEdldCBhY3RpdmUgZmlsdGVyCisgICAgLy8gSVdvcmtpbmdTZXQgZmlsdGVyV29ya2luZ1NldCA9IGV4cGxvcmVyUGFydC5nZXRGaWx0ZXJXb3JraW5nU2V0KCk7CisgICAgLy8gaWYgKGZpbHRlcldvcmtpbmdTZXQgPT0gbnVsbCkgeworICAgIC8vIHJldHVybiBFTVBUWV9XT1JLSU5HX1NFVF9BUlJBWTsKKyAgICAvLyB9CisgICAgLy8KKyAgICAvLyBpZiAoIWlzVmFsaWRXb3JraW5nU2V0KGZpbHRlcldvcmtpbmdTZXQpKSB7CisgICAgLy8gcmV0dXJuIEVNUFRZX1dPUktJTkdfU0VUX0FSUkFZOworICAgIC8vIH0KKyAgICAvLworICAgIC8vIHJldHVybiBuZXcgSVdvcmtpbmdTZXRbXSB7IGZpbHRlcldvcmtpbmdTZXQgfTsKKyAgICAvLyB9CisgICAgLy8gZWxzZSB7CisgICAgLy8gLy8gSWYgd2UgaGF2ZSBiZWVuIGdvbmUgaW50byBhIHdvcmtpbmcgc2V0IHJldHVybiB0aGUgd29ya2luZyBzZXQKKyAgICAvLyBPYmplY3QgaW5wdXQgPSBleHBsb3JlclBhcnQuZ2V0Vmlld1BhcnRJbnB1dCgpOworICAgIC8vIGlmICghKGlucHV0IGluc3RhbmNlb2YgSVdvcmtpbmdTZXQpKSB7CisgICAgLy8gcmV0dXJuIEVNUFRZX1dPUktJTkdfU0VUX0FSUkFZOworICAgIC8vIH0KKyAgICAvLworICAgIC8vIElXb3JraW5nU2V0IHdvcmtpbmdTZXQgPSAoSVdvcmtpbmdTZXQpIGlucHV0OworICAgIC8vIGlmICghaXNWYWxpZFdvcmtpbmdTZXQod29ya2luZ1NldCkpIHsKKyAgICAvLyByZXR1cm4gRU1QVFlfV09SS0lOR19TRVRfQVJSQVk7CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gcmV0dXJuIG5ldyBJV29ya2luZ1NldFtdIHsgd29ya2luZ1NldCB9OworICAgIC8vIH0KKyAgICAvLyB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzb3VyY2UgY2xhc3MgcGF0aCBlbnRyaWVzIHRvIGJlIGFkZGVkIG9uIG5ldyBwcm9qZWN0cy4gVGhlIHVuZGVybHlpbmcgcmVzb3VyY2VzIG1heSBub3QgZXhpc3QuIEFsbAotCSAqIGVudHJpZXMgdGhhdCBhcmUgcmV0dXJuZWQgbXVzdCBiZSBvZiBraW5kIHtAbGluayBJQ2xhc3NwYXRoRW50cnkjQ1BFX1NPVVJDRX0uCi0JICogCi0JICogQHJldHVybiByZXR1cm5zIHRoZSBzb3VyY2UgY2xhc3MgcGF0aCBlbnRyaWVzIGZvciB0aGUgbmV3IHByb2plY3QKLQkgKi8KLQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0U291cmNlQ2xhc3NwYXRoRW50cmllcygpIHsKLQkJSVBhdGggc291cmNlRm9sZGVyUGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3ROYW1lKCkpLm1ha2VBYnNvbHV0ZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSBjbGFzcyBwYXRoIGVudHJpZXMgdG8gYmUgYWRkZWQgb24gbmV3IHByb2plY3RzLiBUaGUgdW5kZXJseWluZyByZXNvdXJjZXMgbWF5IG5vdCBleGlzdC4gQWxsCisgICAgICogZW50cmllcyB0aGF0IGFyZSByZXR1cm5lZCBtdXN0IGJlIG9mIGtpbmQge0BsaW5rIElDbGFzc3BhdGhFbnRyeSNDUEVfU09VUkNFfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcmV0dXJucyB0aGUgc291cmNlIGNsYXNzIHBhdGggZW50cmllcyBmb3IgdGhlIG5ldyBwcm9qZWN0CisgICAgICovCisgICAgcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldFNvdXJjZUNsYXNzcGF0aEVudHJpZXMoKSB7CisgICAgICAgIElQYXRoIHNvdXJjZUZvbGRlclBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0TmFtZSgpKS5tYWtlQWJzb2x1dGUoKTsKIAotCQlpZiAoZkxheW91dEdyb3VwLmlzU3JjQmluKCkpIHsKLQkJCUlQYXRoIHNyY1BhdGggPSBuZXcgUGF0aChQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5TUkNCSU5fU1JDTkFNRSkpOwotCQkJaWYgKHNyY1BhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQkJc291cmNlRm9sZGVyUGF0aCA9IHNvdXJjZUZvbGRlclBhdGguYXBwZW5kKHNyY1BhdGgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5W10geyBKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShzb3VyY2VGb2xkZXJQYXRoKSB9OwotCX0KKyAgICAgICAgaWYgKHRoaXMuZkxheW91dEdyb3VwLmlzU3JjQmluKCkpIHsKKyAgICAgICAgICAgIElQYXRoIHNyY1BhdGggPSBuZXcgUGF0aChQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLlNSQ0JJTl9TUkNOQU1FKSk7CisgICAgICAgICAgICBpZiAoc3JjUGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBzb3VyY2VGb2xkZXJQYXRoID0gc291cmNlRm9sZGVyUGF0aC5hcHBlbmQoc3JjUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbXSB7IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KHNvdXJjZUZvbGRlclBhdGgpIH07CisgICAgfQogCi0JLy8gLyoqCi0JLy8gKiBSZXR1cm5zIHRoZSB3b3JraW5nIHNldHMgdG8gd2hpY2ggdGhlIG5ldyBwcm9qZWN0IHNob3VsZCBiZSBhZGRlZC4KLQkvLyAqCi0JLy8gKiBAcmV0dXJuIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldHMgdG8gd2hpY2ggdGhlIG5ldyBwcm9qZWN0IHNob3VsZCBiZQotCS8vICogYWRkZWQKLQkvLyAqLwotCS8vIHB1YmxpYyBJV29ya2luZ1NldFtdIGdldFdvcmtpbmdTZXRzKCkgewotCS8vIHJldHVybiBmV29ya2luZ1NldEdyb3VwLmdldFNlbGVjdGVkV29ya2luZ1NldHMoKTsKLQkvLyB9CisgICAgLy8gLyoqCisgICAgLy8gKiBSZXR1cm5zIHRoZSB3b3JraW5nIHNldHMgdG8gd2hpY2ggdGhlIG5ldyBwcm9qZWN0IHNob3VsZCBiZSBhZGRlZC4KKyAgICAvLyAqCisgICAgLy8gKiBAcmV0dXJuIHRoZSBzZWxlY3RlZCB3b3JraW5nIHNldHMgdG8gd2hpY2ggdGhlIG5ldyBwcm9qZWN0IHNob3VsZCBiZQorICAgIC8vICogYWRkZWQKKyAgICAvLyAqLworICAgIC8vIHB1YmxpYyBJV29ya2luZ1NldFtdIGdldFdvcmtpbmdTZXRzKCkgeworICAgIC8vIHJldHVybiBmV29ya2luZ1NldEdyb3VwLmdldFNlbGVjdGVkV29ya2luZ1NldHMoKTsKKyAgICAvLyB9CiAKLQkvKioKLQkgKiBUaGUgd2l6YXJkIG93bmluZyB0aGlzIHBhZ2UgY2FuIGNhbGwgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzIGZyb20gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBhY3RpdmUKLQkgKiBwYXJ0LgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzCi0JICogQHBhcmFtIGFjdGl2ZVBhcnQKLQkgKiAgICAgICAgICAgIHRoZSAodHlwaWNhbGx5IGFjdGl2ZSkgcGFydCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCkgewotCQkvLyBzZXRXb3JraW5nU2V0cyhnZXRTZWxlY3RlZFdvcmtpbmdTZXQoc2VsZWN0aW9uLCBhY3RpdmVQYXJ0KSk7Ci0JfQorICAgIC8qKgorICAgICAqIFRoZSB3aXphcmQgb3duaW5nIHRoaXMgcGFnZSBjYW4gY2FsbCB0aGlzIG1ldGhvZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMgZnJvbSB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIGFjdGl2ZQorICAgICAqIHBhcnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZWN0aW9uIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzCisgICAgICogQHBhcmFtIGFjdGl2ZVBhcnQgdGhlICh0eXBpY2FsbHkgYWN0aXZlKSBwYXJ0IHRvIGluaXRpYWxpemUgdGhlIGZpZWxkcyBvciA8Y29kZT5udWxsPC9jb2RlPgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0KSB7CisgICAgICAgIC8vIHNldFdvcmtpbmdTZXRzKGdldFNlbGVjdGVkV29ya2luZ1NldChzZWxlY3Rpb24sIGFjdGl2ZVBhcnQpKTsKKyAgICB9CiAKLQlwcml2YXRlIEdyaWRMYXlvdXQgaW5pdEdyaWRMYXlvdXQoR3JpZExheW91dCBsYXlvdXQsIGJvb2xlYW4gbWFyZ2lucykgewotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJaWYgKG1hcmdpbnMpIHsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCX0gZWxzZSB7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCX0KLQkJcmV0dXJuIGxheW91dDsKLQl9CisgICAgcHJpdmF0ZSBHcmlkTGF5b3V0IGluaXRHcmlkTGF5b3V0KEdyaWRMYXlvdXQgbGF5b3V0LCBib29sZWFuIG1hcmdpbnMpIHsKKyAgICAgICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOworICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7CisgICAgICAgIGlmIChtYXJnaW5zKSB7CisgICAgICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKKyAgICAgICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKyAgICAgICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsYXlvdXQ7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0Vk0oKSB7Ci0JCUphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLQl9CisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0Vk0oKSB7CisgICAgICAgIEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb250cm9sKENvbnRyb2wgbmV3Q29udHJvbCkgewotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KG5ld0NvbnRyb2wpOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldENvbnRyb2woQ29udHJvbCBuZXdDb250cm9sKSB7CisgICAgICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQobmV3Q29udHJvbCk7CiAKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChuZXdDb250cm9sLCBJSmF2YUhlbHBDb250ZXh0SWRzLk5FV19KQVZBUFJPSkVDVF9XSVpBUkRfUEFHRSk7CisgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobmV3Q29udHJvbCwgSUphdmFIZWxwQ29udGV4dElkcy5ORVdfSkFWQVBST0pFQ1RfV0laQVJEX1BBR0UpOwogCi0JCXN1cGVyLnNldENvbnRyb2wobmV3Q29udHJvbCk7Ci0JfQorICAgICAgICBzdXBlci5zZXRDb250cm9sKG5ld0NvbnRyb2wpOworICAgIH0KIAotCS8qKgotCSAqIFNldHMgdGhlIHByb2plY3QgbG9jYXRpb24gb2YgdGhlIG5ldyBwcm9qZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IHNob3VsZCBiZSBjcmVhdGVkIGluIHRoZQotCSAqIHdvcmtzcGFjZQotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgcHJvamVjdCBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RMb2NhdGlvblVSSShVUkkgdXJpKSB7Ci0JCUlQYXRoIHBhdGggPSB1cmkgIT0gbnVsbCA/IFVSSVV0aWwudG9QYXRoKHVyaSkgOiBudWxsOwotCQlmTG9jYXRpb25Hcm91cC5zZXRMb2NhdGlvbihwYXRoKTsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcHJvamVjdCBsb2NhdGlvbiBvZiB0aGUgbmV3IHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHByb2plY3Qgc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdGhlCisgICAgICogd29ya3NwYWNlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIHRoZSBuZXcgcHJvamVjdCBsb2NhdGlvbgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3RMb2NhdGlvblVSSShVUkkgdXJpKSB7CisgICAgICAgIElQYXRoIHBhdGggPSB1cmkgIT0gbnVsbCA/IFVSSVV0aWwudG9QYXRoKHVyaSkgOiBudWxsOworICAgICAgICB0aGlzLmZMb2NhdGlvbkdyb3VwLnNldExvY2F0aW9uKHBhdGgpOworICAgIH0KIAotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIG5ldyBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQorICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIG5ldyBwcm9qZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KIAotCQlmTmFtZUdyb3VwLnNldE5hbWUobmFtZSk7Ci0JfQorICAgICAgICB0aGlzLmZOYW1lR3JvdXAuc2V0TmFtZShuYW1lKTsKKyAgICB9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNzZXRWaXNpYmxlKGJvb2xlYW4pCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUpIHsKLQkJCWZOYW1lR3JvdXAucG9zdFNldEZvY3VzKCk7Ci0JCX0KLQl9CisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZSNzZXRWaXNpYmxlKGJvb2xlYW4pCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKyAgICAgICAgaWYgKHZpc2libGUpIHsKKyAgICAgICAgICAgIHRoaXMuZk5hbWVHcm91cC5wb3N0U2V0Rm9jdXMoKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8vIC8qKgotCS8vICogU2V0cyB0aGUgd29ya2luZyBzZXRzIHRvIHdoaWNoIHRoZSBuZXcgcHJvamVjdCBzaG91bGQgYmUgYWRkZWQuCi0JLy8gKgotCS8vICogQHBhcmFtIHdvcmtpbmdTZXRzIHRoZSBpbml0aWFsIHNlbGVjdGVkIHdvcmtpbmcgc2V0cwotCS8vICovCi0JLy8gcHVibGljIHZvaWQgc2V0V29ya2luZ1NldHMoSVdvcmtpbmdTZXRbXSB3b3JraW5nU2V0cykgewotCS8vIGlmICh3b3JraW5nU2V0cyA9PSBudWxsKSB7Ci0JLy8gdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCS8vIH0KLQkvLyBmV29ya2luZ1NldEdyb3VwLnNldFdvcmtpbmdTZXRzKHdvcmtpbmdTZXRzKTsKLQkvLyB9CisgICAgLy8gLyoqCisgICAgLy8gKiBTZXRzIHRoZSB3b3JraW5nIHNldHMgdG8gd2hpY2ggdGhlIG5ldyBwcm9qZWN0IHNob3VsZCBiZSBhZGRlZC4KKyAgICAvLyAqCisgICAgLy8gKiBAcGFyYW0gd29ya2luZ1NldHMgdGhlIGluaXRpYWwgc2VsZWN0ZWQgd29ya2luZyBzZXRzCisgICAgLy8gKi8KKyAgICAvLyBwdWJsaWMgdm9pZCBzZXRXb3JraW5nU2V0cyhJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzKSB7CisgICAgLy8gaWYgKHdvcmtpbmdTZXRzID09IG51bGwpIHsKKyAgICAvLyB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgLy8gfQorICAgIC8vIGZXb3JraW5nU2V0R3JvdXAuc2V0V29ya2luZ1NldHMod29ya2luZ1NldHMpOworICAgIC8vIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL3dpemFyZHMvTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvQ09QWS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL3dpemFyZHMvTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvQ09QWS5qYXZhCmluZGV4IGJjODdhZWYuLjJjYjVlYjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS93aXphcmRzL05ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b0NPUFkuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2Uvd2l6YXJkcy9OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29DT1BZLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS53aXphcmRzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtNjgsNyArNjksNyBAQAogICogU3ByaW5nU291cmNlIFRvb2wgU3VpdGUgVGVhbSAtIFRoaXMgY2xhc3Mgd2FzIGNvcGllZCBmcm9tIEVjbGlwc2UgMy40IGZvciB1c2UgaW4gMy4zLWJhc2VkIGRpc3RyaWJ1dGlvbnMuIE5lY2Vzc2FyeQogICogY2hhbmdlcyBpbmNsdWRlZCBwb3J0aW5nIGFsbCB0aGUgTmV3SmF2YVByb2plY3RXaXphcmQgbWVzc2FnZXMgZnJvbSB0aGUgTmV3V2l6YXJkTWVzc2FnZXMgdXRpbGl0eSBjbGFzcyB0bwogICogTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuCi0gKiAKKyAqCiAgKiBAZGVwcmVjYXRlZCBBcyBvZiByZWxlYXNlIDIuMC4wLCBTVFMgb25seSBzdXBwb3J0cyBFY2xpcHNlIDMuNCBhbmQgYWJvdmUuIFVzZSB7QGxpbmsgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvfQogICogICAgICAgICAgICAgaW5zdGVhZC4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhlIHNlY29uZCBwYWdlIG9mCiAgKiAgICAgICAgICAgICB0aGUgTmV3IEphdmEgcHJvamVjdCB3aXphcmQuIEl0IGFsbG93cyB0byBjb25maWd1cmUgdGhlIGJ1aWxkIHBhdGggYW5kIG91dHB1dCBsb2NhdGlvbi4gQXMgYWRkaXRpb24gdG8KQEAgLTg4LDU1OSArODksNTQ2IEBACiBARGVwcmVjYXRlZAogcHVibGljIGNsYXNzIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b0NPUFkgZXh0ZW5kcyBKYXZhQ2FwYWJpbGl0eUNvbmZpZ3VyYXRpb25QYWdlIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFTkFNRV9QUk9KRUNUID0gIi5wcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFTkFNRV9QUk9KRUNUID0gIi5wcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVOQU1FX0NMQVNTUEFUSCA9ICIuY2xhc3NwYXRoIjsgLy8kTk9OLU5MUy0xJAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFTkFNRV9DTEFTU1BBVEggPSAiLmNsYXNzcGF0aCI7IC8vJE5PTi1OTFMtMSQKIAotCXByaXZhdGUgc3RhdGljIFVSSSBnZXRSZWFsTG9jYXRpb24oU3RyaW5nIHByb2plY3ROYW1lLCBVUkkgbG9jYXRpb24pIHsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsgLy8gaW5zaWRlIHdvcmtzcGFjZQotCQkJdHJ5IHsKLQkJCQlVUkkgcm9vdExvY2F0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvblVSSSgpOworICAgIHByaXZhdGUgc3RhdGljIFVSSSBnZXRSZWFsTG9jYXRpb24oU3RyaW5nIHByb2plY3ROYW1lLCBVUkkgbG9jYXRpb24pIHsKKyAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHsgLy8gaW5zaWRlIHdvcmtzcGFjZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBVUkkgcm9vdExvY2F0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvblVSSSgpOwogCi0JCQkJbG9jYXRpb24gPSBuZXcgVVJJKHJvb3RMb2NhdGlvbi5nZXRTY2hlbWUoKSwgbnVsbCwgUGF0aC5mcm9tUG9ydGFibGVTdHJpbmcocm9vdExvY2F0aW9uLmdldFBhdGgoKSkKLQkJCQkJCS5hcHBlbmQocHJvamVjdE5hbWUpCi0JCQkJCQkudG9TdHJpbmcoKSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJDYW4ndCBoYXBwZW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9CisgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBuZXcgVVJJKHJvb3RMb2NhdGlvbi5nZXRTY2hlbWUoKSwgbnVsbCwgUGF0aC5mcm9tUG9ydGFibGVTdHJpbmcocm9vdExvY2F0aW9uLmdldFBhdGgoKSkuYXBwZW5kKHByb2plY3ROYW1lKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIkNhbid0IGhhcHBlbiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvY2F0aW9uOworICAgIH0KIAotCS8qKgotCSAqIFNldHMgd2hldGhlciBidWlsZGluZyBhdXRvbWF0aWNhbGx5IGlzIGVuYWJsZWQgaW4gdGhlIHdvcmtzcGFjZSBvciBub3QgYW5kIHJldHVybnMgdGhlIG9sZCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhdGUKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIGF1dG9tYXRpY2FsbHkgYnVpbGRpbmcgaXMgZW5hYmxlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEByZXR1cm4gdGhlIG9sZCBzdGF0ZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHRocm93biBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXRBdXRvQnVpbGRpbmcoYm9vbGVhbiBzdGF0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2MgPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKLQkJYm9vbGVhbiBpc0F1dG9CdWlsZGluZyA9IGRlc2MuaXNBdXRvQnVpbGRpbmcoKTsKLQkJaWYgKGlzQXV0b0J1aWxkaW5nICE9IHN0YXRlKSB7Ci0JCQlkZXNjLnNldEF1dG9CdWlsZGluZyhzdGF0ZSk7Ci0JCQl3b3Jrc3BhY2Uuc2V0RGVzY3JpcHRpb24oZGVzYyk7Ci0JCX0KLQkJcmV0dXJuIGlzQXV0b0J1aWxkaW5nOwotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgYnVpbGRpbmcgYXV0b21hdGljYWxseSBpcyBlbmFibGVkIGluIHRoZSB3b3Jrc3BhY2Ugb3Igbm90IGFuZCByZXR1cm5zIHRoZSBvbGQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXV0b21hdGljYWxseSBidWlsZGluZyBpcyBlbmFibGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisgICAgICogQHJldHVybiB0aGUgb2xkIHN0YXRlCisgICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgb3BlcmF0aW9uIGZhaWxlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZXRBdXRvQnVpbGRpbmcoYm9vbGVhbiBzdGF0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKKyAgICAgICAgSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2MgPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgYm9vbGVhbiBpc0F1dG9CdWlsZGluZyA9IGRlc2MuaXNBdXRvQnVpbGRpbmcoKTsKKyAgICAgICAgaWYgKGlzQXV0b0J1aWxkaW5nICE9IHN0YXRlKSB7CisgICAgICAgICAgICBkZXNjLnNldEF1dG9CdWlsZGluZyhzdGF0ZSk7CisgICAgICAgICAgICB3b3Jrc3BhY2Uuc2V0RGVzY3JpcHRpb24oZGVzYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlzQXV0b0J1aWxkaW5nOworICAgIH0KIAotCXByaXZhdGUgZmluYWwgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lQ09QWSBmRmlyc3RQYWdlOworICAgIHByaXZhdGUgZmluYWwgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lQ09QWSBmRmlyc3RQYWdlOwogCi0JcHJpdmF0ZSBVUkkgZkN1cnJQcm9qZWN0TG9jYXRpb247IC8vIG51bGwgaWYgbG9jYXRpb24gaXMgcGxhdGZvcm0gbG9jYXRpb24KKyAgICBwcml2YXRlIFVSSSBmQ3VyclByb2plY3RMb2NhdGlvbjsgLy8gbnVsbCBpZiBsb2NhdGlvbiBpcyBwbGF0Zm9ybSBsb2NhdGlvbgogCi0JcHJpdmF0ZSBJUHJvamVjdCBmQ3VyclByb2plY3Q7CisgICAgcHJpdmF0ZSBJUHJvamVjdCBmQ3VyclByb2plY3Q7CiAKLQlwcml2YXRlIGJvb2xlYW4gZktlZXBDb250ZW50OworICAgIHByaXZhdGUgYm9vbGVhbiBmS2VlcENvbnRlbnQ7CiAKLQlwcml2YXRlIEZpbGUgZkRvdFByb2plY3RCYWNrdXA7CisgICAgcHJpdmF0ZSBGaWxlIGZEb3RQcm9qZWN0QmFja3VwOwogCi0JcHJpdmF0ZSBGaWxlIGZEb3RDbGFzc3BhdGhCYWNrdXA7CisgICAgcHJpdmF0ZSBGaWxlIGZEb3RDbGFzc3BhdGhCYWNrdXA7CiAKLQlwcml2YXRlIEJvb2xlYW4gZklzQXV0b2J1aWxkOworICAgIHByaXZhdGUgQm9vbGVhbiBmSXNBdXRvYnVpbGQ7CiAKLQlwcml2YXRlIEhhc2hTZXQgZk9yZ2luYWxGb2xkZXJzOworICAgIHByaXZhdGUgSGFzaFNldCBmT3JnaW5hbEZvbGRlcnM7CiAKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIHtAbGluayBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29DT1BZfS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFpblBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB3aXphcmQKLQkgKi8KLQlwdWJsaWMgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvQ09QWShOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmVDT1BZIG1haW5QYWdlKSB7Ci0JCWZGaXJzdFBhZ2UgPSBtYWluUGFnZTsKLQkJZkN1cnJQcm9qZWN0TG9jYXRpb24gPSBudWxsOwotCQlmQ3VyclByb2plY3QgPSBudWxsOwotCQlmS2VlcENvbnRlbnQgPSBmYWxzZTsKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIHtAbGluayBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29DT1BZfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYWluUGFnZSB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgd2l6YXJkCisgICAgICovCisgICAgcHVibGljIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b0NPUFkoTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lQ09QWSBtYWluUGFnZSkgeworICAgICAgICB0aGlzLmZGaXJzdFBhZ2UgPSBtYWluUGFnZTsKKyAgICAgICAgdGhpcy5mQ3VyclByb2plY3RMb2NhdGlvbiA9IG51bGw7CisgICAgICAgIHRoaXMuZkN1cnJQcm9qZWN0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5mS2VlcENvbnRlbnQgPSBmYWxzZTsKIAotCQlmRG90UHJvamVjdEJhY2t1cCA9IG51bGw7Ci0JCWZEb3RDbGFzc3BhdGhCYWNrdXAgPSBudWxsOwotCQlmSXNBdXRvYnVpbGQgPSBudWxsOwotCX0KKyAgICAgICAgdGhpcy5mRG90UHJvamVjdEJhY2t1cCA9IG51bGw7CisgICAgICAgIHRoaXMuZkRvdENsYXNzcGF0aEJhY2t1cCA9IG51bGw7CisgICAgICAgIHRoaXMuZklzQXV0b2J1aWxkID0gbnVsbDsKKyAgICB9CiAKLQlwcml2YXRlIElTdGF0dXMgY2hhbmdlVG9OZXdQcm9qZWN0KCkgewotCQljbGFzcyBVcGRhdGVSdW5uYWJsZSBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBpbmZvU3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICBwcml2YXRlIElTdGF0dXMgY2hhbmdlVG9OZXdQcm9qZWN0KCkgeworICAgICAgICBjbGFzcyBVcGRhdGVSdW5uYWJsZSBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7CiAKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGZJc0F1dG9idWlsZCA9PSBudWxsKSB7Ci0JCQkJCQlmSXNBdXRvYnVpbGQgPSBCb29sZWFuLnZhbHVlT2Yoc2V0QXV0b0J1aWxkaW5nKGZhbHNlKSk7Ci0JCQkJCX0KLQkJCQkJaW5mb1N0YXR1cyA9IHVwZGF0ZVByb2plY3QobW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVVwZGF0ZVJ1bm5hYmxlIG9wID0gbmV3IFVwZGF0ZVJ1bm5hYmxlKCk7Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIG5ldyBXb3Jrc3BhY2VNb2RpZnlEZWxlZ2F0aW5nT3BlcmF0aW9uKG9wKSk7Ci0JCQlyZXR1cm4gb3AuaW5mb1N0YXR1czsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlmaW5hbCBTdHJpbmcgdGl0bGUgPSBOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fZXJyb3JfdGl0bGU7Ci0JCQlmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19lcnJvcl9tZXNzYWdlOwotCQkJRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZSwgZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjYW5jZWwgcHJlc3NlZAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAgICAgICAgIHB1YmxpYyBJU3RhdHVzIGluZm9TdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwogCi0JcHJpdmF0ZSB2b2lkIGNvcHlGaWxlKEZpbGUgc291cmNlLCBJRmlsZVN0b3JlIHRhcmdldCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlGaWxlSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZSk7Ci0JCU91dHB1dFN0cmVhbSBvcyA9IHRhcmdldC5vcGVuT3V0cHV0U3RyZWFtKEVGUy5OT05FLCBtb25pdG9yKTsKLQkJY29weUZpbGUoaXMsIG9zKTsKLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29DT1BZLnRoaXMuZklzQXV0b2J1aWxkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b0NPUFkudGhpcy5mSXNBdXRvYnVpbGQgPSBCb29sZWFuLnZhbHVlT2Yoc2V0QXV0b0J1aWxkaW5nKGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmZvU3RhdHVzID0gdXBkYXRlUHJvamVjdChtb25pdG9yKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgVXBkYXRlUnVubmFibGUgb3AgPSBuZXcgVXBkYXRlUnVubmFibGUoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgbmV3IFdvcmtzcGFjZU1vZGlmeURlbGVnYXRpbmdPcGVyYXRpb24ob3ApKTsKKyAgICAgICAgICAgIHJldHVybiBvcC5pbmZvU3RhdHVzOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0aXRsZSA9IE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19lcnJvcl90aXRsZTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX2Vycm9yX21lc3NhZ2U7CisgICAgICAgICAgICBFeGNlcHRpb25IYW5kbGVyLmhhbmRsZShlLCBnZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGNhbmNlbCBwcmVzc2VkCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGNvcHlGaWxlKElGaWxlU3RvcmUgc291cmNlLCBGaWxlIHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaXMgPSBzb3VyY2Uub3BlbklucHV0U3RyZWFtKEVGUy5OT05FLCBudWxsKTsKLQkJRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldCk7Ci0JCWNvcHlGaWxlKGlzLCBvcyk7Ci0JfQorICAgIHByaXZhdGUgdm9pZCBjb3B5RmlsZShGaWxlIHNvdXJjZSwgSUZpbGVTdG9yZSB0YXJnZXQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpOworICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSB0YXJnZXQub3Blbk91dHB1dFN0cmVhbShFRlMuTk9ORSwgbW9uaXRvcik7CisgICAgICAgIGNvcHlGaWxlKGlzLCBvcyk7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGNvcHlGaWxlKElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWludCBieXRlc1JlYWQgPSBpcy5yZWFkKGJ1ZmZlcik7Ci0JCQkJaWYgKGJ5dGVzUmVhZCA9PSAtMSkgewotCQkJCQlicmVhazsKLQkJCQl9CisgICAgcHJpdmF0ZSB2b2lkIGNvcHlGaWxlKElGaWxlU3RvcmUgc291cmNlLCBGaWxlIHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBzb3VyY2Uub3BlbklucHV0U3RyZWFtKEVGUy5OT05FLCBudWxsKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldCk7CisgICAgICAgIGNvcHlGaWxlKGlzLCBvcyk7CisgICAgfQogCi0JCQkJb3Mud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpcy5jbG9zZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlvcy5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQorICAgIHByaXZhdGUgdm9pZCBjb3B5RmlsZShJbnB1dFN0cmVhbSBpcywgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gaXMucmVhZChidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogCi0JcHJpdmF0ZSBGaWxlIGNyZWF0ZUJhY2t1cChJRmlsZVN0b3JlIHNvdXJjZSwgU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUZpbGUgYmFrID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZWNsaXBzZS0iICsgbmFtZSwgIi5iYWsiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCWNvcHlGaWxlKHNvdXJjZSwgYmFrKTsKLQkJCXJldHVybiBiYWs7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhVUkuSURfUExVR0lOLCBJU3RhdHVzLkVSUk9SLCBNZXNzYWdlcy5mb3JtYXQoCi0JCQkJCU5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19wcm9ibGVtX2JhY2t1cCwgbmFtZSksIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCX0KKyAgICAgICAgICAgICAgICBvcy53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBwcm92aXNpb25hbCBwcm9qZWN0IG9uIHdoaWNoIHRoZSB3aXphcmQgaXMgd29ya2luZyBvbi4gVGhlIHByb3Zpc2lvbmFsIHByb2plY3QgaXMgdHlwaWNhbGx5IGNyZWF0ZWQKLQkgKiB3aGVuIHRoZSBwYWdlIGlzIGVudGVyZWQgdGhlIGZpcnN0IHRpbWUuIFRoZSBlYXJseSBwcm9qZWN0IGNyZWF0aW9uIGlzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSBsaW5rZWQgZm9sZGVycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcm92aXNpb25hbCBwcm9qZWN0Ci0JICovCi0JcHJvdGVjdGVkIElQcm9qZWN0IGNyZWF0ZVByb3Zpc29uYWxQcm9qZWN0KCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IGNoYW5nZVRvTmV3UHJvamVjdCgpOwotCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCBOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fZXJyb3JfdGl0bGUsCi0JCQkJCW51bGwsIHN0YXR1cyk7Ci0JCX0KLQkJcmV0dXJuIGZDdXJyUHJvamVjdDsKLQl9CisgICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZUJhY2t1cChJRmlsZVN0b3JlIHNvdXJjZSwgU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgYmFrID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZWNsaXBzZS0iICsgbmFtZSwgIi5iYWsiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKyAgICAgICAgICAgIGNvcHlGaWxlKHNvdXJjZSwgYmFrKTsKKyAgICAgICAgICAgIHJldHVybiBiYWs7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIElTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhVUkuSURfUExVR0lOLCBJU3RhdHVzLkVSUk9SLAorICAgICAgICAgICAgICAgIE1lc3NhZ2VzLmZvcm1hdChOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fcHJvYmxlbV9iYWNrdXAsIG5hbWUpLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgZGVsZXRlUHJvamVjdEZpbGUoVVJJIHByb2plY3RMb2NhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmlsZVN0b3JlIGZpbGUgPSBFRlMuZ2V0U3RvcmUocHJvamVjdExvY2F0aW9uKTsKLQkJaWYgKGZpbGUuZmV0Y2hJbmZvKCkuZXhpc3RzKCkpIHsKLQkJCUlGaWxlU3RvcmUgcHJvamVjdEZpbGUgPSBmaWxlLmdldENoaWxkKEZJTEVOQU1FX1BST0pFQ1QpOwotCQkJaWYgKHByb2plY3RGaWxlLmZldGNoSW5mbygpLmV4aXN0cygpKSB7Ci0JCQkJcHJvamVjdEZpbGUuZGVsZXRlKEVGUy5OT05FLCBudWxsKTsKLQkJCX0KLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBwcm92aXNpb25hbCBwcm9qZWN0IG9uIHdoaWNoIHRoZSB3aXphcmQgaXMgd29ya2luZyBvbi4gVGhlIHByb3Zpc2lvbmFsIHByb2plY3QgaXMgdHlwaWNhbGx5IGNyZWF0ZWQKKyAgICAgKiB3aGVuIHRoZSBwYWdlIGlzIGVudGVyZWQgdGhlIGZpcnN0IHRpbWUuIFRoZSBlYXJseSBwcm9qZWN0IGNyZWF0aW9uIGlzIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSBsaW5rZWQgZm9sZGVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByb3Zpc2lvbmFsIHByb2plY3QKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSVByb2plY3QgY3JlYXRlUHJvdmlzb25hbFByb2plY3QoKSB7CisgICAgICAgIElTdGF0dXMgc3RhdHVzID0gY2hhbmdlVG9OZXdQcm9qZWN0KCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgeworICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19lcnJvcl90aXRsZSwgbnVsbCwgc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5mQ3VyclByb2plY3Q7CisgICAgfQogCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGRvUmVtb3ZlUHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJZmluYWwgYm9vbGVhbiBub1Byb2dyZXNzTW9uaXRvciA9IChmQ3VyclByb2plY3RMb2NhdGlvbiA9PSBudWxsKTsgLy8gaW5zaWRlCi0JCS8vIHdvcmtzcGFjZQotCQlpZiAobW9uaXRvciA9PSBudWxsIHx8IG5vUHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQltb25pdG9yLmJlZ2luVGFzayhOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fb3BlcmF0aW9uX3JlbW92ZSwgMyk7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCVVSSSBwcm9qTG9jID0gZkN1cnJQcm9qZWN0LmdldExvY2F0aW9uVVJJKCk7CisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZVByb2plY3RGaWxlKFVSSSBwcm9qZWN0TG9jYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgSUZpbGVTdG9yZSBmaWxlID0gRUZTLmdldFN0b3JlKHByb2plY3RMb2NhdGlvbik7CisgICAgICAgIGlmIChmaWxlLmZldGNoSW5mbygpLmV4aXN0cygpKSB7CisgICAgICAgICAgICBJRmlsZVN0b3JlIHByb2plY3RGaWxlID0gZmlsZS5nZXRDaGlsZChGSUxFTkFNRV9QUk9KRUNUKTsKKyAgICAgICAgICAgIGlmIChwcm9qZWN0RmlsZS5mZXRjaEluZm8oKS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHByb2plY3RGaWxlLmRlbGV0ZShFRlMuTk9ORSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkJCQlib29sZWFuIHJlbW92ZUNvbnRlbnQgPSAhZktlZXBDb250ZW50ICYmIGZDdXJyUHJvamVjdC5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJCWlmICghcmVtb3ZlQ29udGVudCkgewotCQkJCQlyZXN0b3JlRXhpc3RpbmdGb2xkZXJzKHByb2pMb2MpOwotCQkJCX0KLQkJCQlmQ3VyclByb2plY3QuZGVsZXRlKHJlbW92ZUNvbnRlbnQsIGZhbHNlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDIpKTsKKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgZG9SZW1vdmVQcm9qZWN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBib29sZWFuIG5vUHJvZ3Jlc3NNb25pdG9yID0gdGhpcy5mQ3VyclByb2plY3RMb2NhdGlvbiA9PSBudWxsOyAvLyBpbnNpZGUKKyAgICAgICAgLy8gd29ya3NwYWNlCisgICAgICAgIGlmIChtb25pdG9yID09IG51bGwgfHwgbm9Qcm9ncmVzc01vbml0b3IpIHsKKyAgICAgICAgICAgIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworICAgICAgICB9CisgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19vcGVyYXRpb25fcmVtb3ZlLCAzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVVJJIHByb2pMb2MgPSB0aGlzLmZDdXJyUHJvamVjdC5nZXRMb2NhdGlvblVSSSgpOwogCi0JCQkJcmVzdG9yZUV4aXN0aW5nRmlsZXMocHJvakxvYywgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXNldEF1dG9CdWlsZGluZyhmSXNBdXRvYnVpbGQuYm9vbGVhblZhbHVlKCkpOyAvLyBmSXNBdXRvYnVpbGQKLQkJCQkvLyBtdXN0Ci0JCQkJLy8gYmUKLQkJCQkvLyBzZXQKLQkJCQlmSXNBdXRvYnVpbGQgPSBudWxsOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCQlmQ3VyclByb2plY3QgPSBudWxsOwotCQkJZktlZXBDb250ZW50ID0gZmFsc2U7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgYm9vbGVhbiByZW1vdmVDb250ZW50ID0gIXRoaXMuZktlZXBDb250ZW50ICYmIHRoaXMuZkN1cnJQcm9qZWN0LmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7CisgICAgICAgICAgICAgICAgaWYgKCFyZW1vdmVDb250ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVFeGlzdGluZ0ZvbGRlcnMocHJvakxvYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuZkN1cnJQcm9qZWN0LmRlbGV0ZShyZW1vdmVDb250ZW50LCBmYWxzZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAyKSk7CiAKLQlwcml2YXRlIGJvb2xlYW4gaGFzRXhpc3RpbmdDb250ZW50KFVSSSByZWFsTG9jYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZpbGVTdG9yZSBmaWxlID0gRUZTLmdldFN0b3JlKHJlYWxMb2NhdGlvbik7Ci0JCXJldHVybiBmaWxlLmZldGNoSW5mbygpLmV4aXN0cygpOwotCX0KKyAgICAgICAgICAgICAgICByZXN0b3JlRXhpc3RpbmdGaWxlcyhwcm9qTG9jLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgc2V0QXV0b0J1aWxkaW5nKHRoaXMuZklzQXV0b2J1aWxkLmJvb2xlYW5WYWx1ZSgpKTsgLy8gZklzQXV0b2J1aWxkCisgICAgICAgICAgICAgICAgLy8gbXVzdAorICAgICAgICAgICAgICAgIC8vIGJlCisgICAgICAgICAgICAgICAgLy8gc2V0CisgICAgICAgICAgICAgICAgdGhpcy5mSXNBdXRvYnVpbGQgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7CisgICAgICAgICAgICB0aGlzLmZDdXJyUHJvamVjdCA9IG51bGw7CisgICAgICAgICAgICB0aGlzLmZLZWVwQ29udGVudCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogRXZhbHVhdGVzIHRoZSBuZXcgYnVpbGQgcGF0aCBhbmQgb3V0cHV0IGZvbGRlciBhY2NvcmRpbmcgdG8gdGhlIHNldHRpbmdzIG9uIHRoZSBmaXJzdCBwYWdlLiBUaGUgcmVzdWx0aW5nIGJ1aWxkCi0JICogcGF0aCBpcyBzZXQgYnkgY2FsbGluZyB7QGxpbmsgI2luaXQoSUphdmFQcm9qZWN0LCBJUGF0aCwgSUNsYXNzcGF0aEVudHJ5W10sIGJvb2xlYW4pfS4gQ2xpZW50cyBjYW4gb3ZlcnJpZGUgdGhpcwotCSAqIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YVByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgcHJvamVjdCB3aGljaCBpcyBhbHJlYWR5IGNyZWF0ZWQgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgdGhyb3duIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBidWlsZCBwYXRoIGZhaWxlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCdWlsZFBhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJbW9uaXRvci5iZWdpblRhc2soTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX21vbml0b3JfaW5pdF9idWlsZF9wYXRoLCAyKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzRXhpc3RpbmdDb250ZW50KFVSSSByZWFsTG9jYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgSUZpbGVTdG9yZSBmaWxlID0gRUZTLmdldFN0b3JlKHJlYWxMb2NhdGlvbik7CisgICAgICAgIHJldHVybiBmaWxlLmZldGNoSW5mbygpLmV4aXN0cygpOworICAgIH0KIAotCQl0cnkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IG51bGw7Ci0JCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IG51bGw7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyB0aGUgbmV3IGJ1aWxkIHBhdGggYW5kIG91dHB1dCBmb2xkZXIgYWNjb3JkaW5nIHRvIHRoZSBzZXR0aW5ncyBvbiB0aGUgZmlyc3QgcGFnZS4gVGhlIHJlc3VsdGluZyBidWlsZAorICAgICAqIHBhdGggaXMgc2V0IGJ5IGNhbGxpbmcge0BsaW5rICNpbml0KElKYXZhUHJvamVjdCwgSVBhdGgsIElDbGFzc3BhdGhFbnRyeVtdLCBib29sZWFuKX0uIENsaWVudHMgY2FuIG92ZXJyaWRlIHRoaXMKKyAgICAgKiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIG5ldyBwcm9qZWN0IHdoaWNoIGlzIGFscmVhZHkgY3JlYXRlZCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcgorICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB0aHJvd24gd2hlbiBpbml0aWFsaXppbmcgdGhlIGJ1aWxkIHBhdGggZmFpbGVkCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJ1aWxkUGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBpZiAobW9uaXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKyAgICAgICAgfQorICAgICAgICBtb25pdG9yLmJlZ2luVGFzayhOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fbW9uaXRvcl9pbml0X2J1aWxkX3BhdGgsIDIpOwogCi0JCQlpZiAoZktlZXBDb250ZW50KSB7Ci0JCQkJaWYgKCFwcm9qZWN0LmdldEZpbGUoRklMRU5BTUVfQ0xBU1NQQVRIKS5leGlzdHMoKSkgewotCQkJCQlmaW5hbCBDbGFzc1BhdGhEZXRlY3RvciBkZXRlY3RvciA9IG5ldyBDbGFzc1BhdGhEZXRlY3RvcihmQ3VyclByb2plY3QsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IoCi0JCQkJCQkJbW9uaXRvciwgMikpOwotCQkJCQllbnRyaWVzID0gZGV0ZWN0b3IuZ2V0Q2xhc3NwYXRoKCk7Ci0JCQkJCW91dHB1dExvY2F0aW9uID0gZGV0ZWN0b3IuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJCQkJaWYgKGVudHJpZXMubGVuZ3RoID09IDApIHsKLQkJCQkJCWVudHJpZXMgPSBudWxsOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbW9uaXRvci53b3JrZWQoMik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlMaXN0IGNwRW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gbnVsbDsKKyAgICAgICAgICAgIElQYXRoIG91dHB1dExvY2F0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7CiAKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBzb3VyY2VDbGFzc3BhdGhFbnRyaWVzID0gZkZpcnN0UGFnZS5nZXRTb3VyY2VDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgc291cmNlQ2xhc3NwYXRoRW50cmllIDogc291cmNlQ2xhc3NwYXRoRW50cmllcykgewotCQkJCQlJUGF0aCBwYXRoID0gc291cmNlQ2xhc3NwYXRoRW50cmllLmdldFBhdGgoKTsKLQkJCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCQlJRm9sZGVyIGZvbGRlciA9IHJvb3QuZ2V0Rm9sZGVyKHBhdGgpOwotCQkJCQkJQ29yZVV0aWxpdHkuY3JlYXRlRm9sZGVyKGZvbGRlciwgdHJ1ZSwgdHJ1ZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQkJCX0KLQkJCQkJY3BFbnRyaWVzLmFkZChzb3VyY2VDbGFzc3BhdGhFbnRyaWUpOwotCQkJCX0KKyAgICAgICAgICAgIGlmICh0aGlzLmZLZWVwQ29udGVudCkgeworICAgICAgICAgICAgICAgIGlmICghcHJvamVjdC5nZXRGaWxlKEZJTEVOQU1FX0NMQVNTUEFUSCkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NQYXRoRGV0ZWN0b3IgZGV0ZWN0b3IgPSBuZXcgQ2xhc3NQYXRoRGV0ZWN0b3IodGhpcy5mQ3VyclByb2plY3QsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMikpOworICAgICAgICAgICAgICAgICAgICBlbnRyaWVzID0gZGV0ZWN0b3IuZ2V0Q2xhc3NwYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dExvY2F0aW9uID0gZGV0ZWN0b3IuZ2V0T3V0cHV0TG9jYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMaXN0IGNwRW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CiAKLQkJCQljcEVudHJpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZkZpcnN0UGFnZS5nZXREZWZhdWx0Q2xhc3NwYXRoRW50cmllcygpKSk7CisgICAgICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gc291cmNlQ2xhc3NwYXRoRW50cmllcyA9IHRoaXMuZkZpcnN0UGFnZS5nZXRTb3VyY2VDbGFzc3BhdGhFbnRyaWVzKCk7CisgICAgICAgICAgICAgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgc291cmNlQ2xhc3NwYXRoRW50cmllIDogc291cmNlQ2xhc3NwYXRoRW50cmllcykgeworICAgICAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gc291cmNlQ2xhc3NwYXRoRW50cmllLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIGZvbGRlciA9IHJvb3QuZ2V0Rm9sZGVyKHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29yZVV0aWxpdHkuY3JlYXRlRm9sZGVyKGZvbGRlciwgdHJ1ZSwgdHJ1ZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY3BFbnRyaWVzLmFkZChzb3VyY2VDbGFzc3BhdGhFbnRyaWUpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCWVudHJpZXMgPSAoSUNsYXNzcGF0aEVudHJ5W10pIGNwRW50cmllcy50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbY3BFbnRyaWVzLnNpemUoKV0pOworICAgICAgICAgICAgICAgIGNwRW50cmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0aGlzLmZGaXJzdFBhZ2UuZ2V0RGVmYXVsdENsYXNzcGF0aEVudHJpZXMoKSkpOwogCi0JCQkJb3V0cHV0TG9jYXRpb24gPSBmRmlyc3RQYWdlLmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJaWYgKG91dHB1dExvY2F0aW9uLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCQlJRm9sZGVyIGZvbGRlciA9IHJvb3QuZ2V0Rm9sZGVyKG91dHB1dExvY2F0aW9uKTsKLQkJCQkJQ29yZVV0aWxpdHkuY3JlYXRlRGVyaXZlZEZvbGRlcihmb2xkZXIsIHRydWUsIHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQorICAgICAgICAgICAgICAgIGVudHJpZXMgPSAoSUNsYXNzcGF0aEVudHJ5W10pIGNwRW50cmllcy50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbY3BFbnRyaWVzLnNpemUoKV0pOwogCi0JCQlpbml0KGphdmFQcm9qZWN0LCBvdXRwdXRMb2NhdGlvbiwgZW50cmllcywgZmFsc2UpOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgb3V0cHV0TG9jYXRpb24gPSB0aGlzLmZGaXJzdFBhZ2UuZ2V0T3V0cHV0TG9jYXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0TG9jYXRpb24uc2VnbWVudENvdW50KCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIElGb2xkZXIgZm9sZGVyID0gcm9vdC5nZXRGb2xkZXIob3V0cHV0TG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICBDb3JlVXRpbGl0eS5jcmVhdGVEZXJpdmVkRm9sZGVyKGZvbGRlciwgdHJ1ZSwgdHJ1ZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CiAKLQkvKioKLQkgKiBDYWxsZWQgZnJvbSB0aGUgd2l6YXJkIG9uIGNhbmNlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQ2FuY2VsKCkgewotCQlpZiAoZkN1cnJQcm9qZWN0ICE9IG51bGwpIHsKLQkJCXJlbW92ZVByb3Zpc29uYWxQcm9qZWN0KCk7Ci0JCX0KLQl9CisgICAgICAgICAgICBpbml0KGphdmFQcm9qZWN0LCBvdXRwdXRMb2NhdGlvbiwgZW50cmllcywgZmFsc2UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBDYWxsZWQgZnJvbSB0aGUgd2l6YXJkIG9uIGZpbmlzaC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB0aHJvd24gd2hlbiB0aGUgcHJvamVjdCBjcmVhdGlvbiBvciBjb25maWd1cmF0aW9uIGZhaWxlZAotCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB0aHJvd24gd2hlbiB0aGUgdXNlciBjYW5jZWxsZWQgdGhlIHByb2plY3QgY3JlYXRpb24KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBwZXJmb3JtRmluaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19vcGVyYXRpb25fY3JlYXRlLCAzKTsKLQkJCWlmIChmQ3VyclByb2plY3QgPT0gbnVsbCkgewotCQkJCXVwZGF0ZVByb2plY3QobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQl9Ci0JCQljb25maWd1cmVKYXZhUHJvamVjdChuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDIpKTsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgZnJvbSB0aGUgd2l6YXJkIG9uIGNhbmNlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwZXJmb3JtQ2FuY2VsKCkgeworICAgICAgICBpZiAodGhpcy5mQ3VyclByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVtb3ZlUHJvdmlzb25hbFByb2plY3QoKTsKKyAgICAgICAgfQorICAgIH0KIAotCQkJaWYgKCFmS2VlcENvbnRlbnQpIHsKLQkJCQlTdHJpbmcgY29tcGxpYW5jZSA9IGZGaXJzdFBhZ2UuZ2V0Q29tcGlsZXJDb21wbGlhbmNlKCk7Ci0JCQkJaWYgKGNvbXBsaWFuY2UgIT0gbnVsbCkgewotCQkJCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShmQ3VyclByb2plY3QpOwotCQkJCQlNYXAgb3B0aW9ucyA9IHByb2plY3QuZ2V0T3B0aW9ucyhmYWxzZSk7Ci0JCQkJCS8vIEphdmFNb2RlbFV0aWwuc2V0Q29tcGlsYW5jZU9wdGlvbnMob3B0aW9ucywgY29tcGxpYW5jZSk7Ci0JCQkJCUphdmFDb3JlLnNldENvbXBsaWFuY2VPcHRpb25zKGNvbXBsaWFuY2UsIG9wdGlvbnMpOwotCQkJCQlKYXZhTW9kZWxVdGlsLnNldERlZmF1bHRDbGFzc2ZpbGVPcHRpb25zKG9wdGlvbnMsIGNvbXBsaWFuY2UpOyAvLyBjb21wbGV0ZQotCQkJCQkvLyBjb21wbGlhbmNlCi0JCQkJCS8vIG9wdGlvbnMKLQkJCQkJcHJvamVjdC5zZXRPcHRpb25zKG9wdGlvbnMpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQkJZkN1cnJQcm9qZWN0ID0gbnVsbDsKLQkJCWlmIChmSXNBdXRvYnVpbGQgIT0gbnVsbCkgewotCQkJCXNldEF1dG9CdWlsZGluZyhmSXNBdXRvYnVpbGQuYm9vbGVhblZhbHVlKCkpOwotCQkJCWZJc0F1dG9idWlsZCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQ2FsbGVkIGZyb20gdGhlIHdpemFyZCBvbiBmaW5pc2guCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcgorICAgICAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB0aHJvd24gd2hlbiB0aGUgcHJvamVjdCBjcmVhdGlvbiBvciBjb25maWd1cmF0aW9uIGZhaWxlZAorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gdGhyb3duIHdoZW4gdGhlIHVzZXIgY2FuY2VsbGVkIHRoZSBwcm9qZWN0IGNyZWF0aW9uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHZvaWQgcGVyZm9ybUZpbmlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayhOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fb3BlcmF0aW9uX2NyZWF0ZSwgMyk7CisgICAgICAgICAgICBpZiAodGhpcy5mQ3VyclByb2plY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVByb2plY3QobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25maWd1cmVKYXZhUHJvamVjdChuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDIpKTsKIAotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgdm9pZCByZW1lbWJlckV4aXNpdGluZ0ZvbGRlcnMoVVJJIHByb2plY3RMb2NhdGlvbikgewotCQlmT3JnaW5hbEZvbGRlcnMgPSBuZXcgSGFzaFNldCgpOworICAgICAgICAgICAgaWYgKCF0aGlzLmZLZWVwQ29udGVudCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjb21wbGlhbmNlID0gdGhpcy5mRmlyc3RQYWdlLmdldENvbXBpbGVyQ29tcGxpYW5jZSgpOworICAgICAgICAgICAgICAgIGlmIChjb21wbGlhbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSUphdmFQcm9qZWN0IHByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUodGhpcy5mQ3VyclByb2plY3QpOworICAgICAgICAgICAgICAgICAgICBNYXAgb3B0aW9ucyA9IHByb2plY3QuZ2V0T3B0aW9ucyhmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIEphdmFNb2RlbFV0aWwuc2V0Q29tcGlsYW5jZU9wdGlvbnMob3B0aW9ucywgY29tcGxpYW5jZSk7CisgICAgICAgICAgICAgICAgICAgIEphdmFDb3JlLnNldENvbXBsaWFuY2VPcHRpb25zKGNvbXBsaWFuY2UsIG9wdGlvbnMpOworICAgICAgICAgICAgICAgICAgICBKYXZhTW9kZWxVdGlsLnNldERlZmF1bHRDbGFzc2ZpbGVPcHRpb25zKG9wdGlvbnMsIGNvbXBsaWFuY2UpOyAvLyBjb21wbGV0ZQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wbGlhbmNlCisgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXRPcHRpb25zKG9wdGlvbnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOworICAgICAgICAgICAgdGhpcy5mQ3VyclByb2plY3QgPSBudWxsOworICAgICAgICAgICAgaWYgKHRoaXMuZklzQXV0b2J1aWxkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXRBdXRvQnVpbGRpbmcodGhpcy5mSXNBdXRvYnVpbGQuYm9vbGVhblZhbHVlKCkpOworICAgICAgICAgICAgICAgIHRoaXMuZklzQXV0b2J1aWxkID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCQl0cnkgewotCQkJSUZpbGVTdG9yZVtdIGNoaWxkcmVuID0gRUZTLmdldFN0b3JlKHByb2plY3RMb2NhdGlvbikuY2hpbGRTdG9yZXMoRUZTLk5PTkUsIG51bGwpOwotCQkJZm9yIChJRmlsZVN0b3JlIGNoaWxkIDogY2hpbGRyZW4pIHsKLQkJCQlJRmlsZUluZm8gaW5mbyA9IGNoaWxkLmZldGNoSW5mbygpOwotCQkJCWlmIChpbmZvLmlzRGlyZWN0b3J5KCkgJiYgaW5mby5leGlzdHMoKSAmJiAhZk9yZ2luYWxGb2xkZXJzLmNvbnRhaW5zKGNoaWxkLmdldE5hbWUoKSkpIHsKLQkJCQkJZk9yZ2luYWxGb2xkZXJzLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUphdmFQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByaXZhdGUgdm9pZCByZW1lbWJlckV4aXNpdGluZ0ZvbGRlcnMoVVJJIHByb2plY3RMb2NhdGlvbikgeworICAgICAgICB0aGlzLmZPcmdpbmFsRm9sZGVycyA9IG5ldyBIYXNoU2V0KCk7CiAKLQlwcml2YXRlIHZvaWQgcmVtZW1iZXJFeGlzdGluZ0ZpbGVzKFVSSSBwcm9qZWN0TG9jYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZkRvdFByb2plY3RCYWNrdXAgPSBudWxsOwotCQlmRG90Q2xhc3NwYXRoQmFja3VwID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElGaWxlU3RvcmVbXSBjaGlsZHJlbiA9IEVGUy5nZXRTdG9yZShwcm9qZWN0TG9jYXRpb24pLmNoaWxkU3RvcmVzKEVGUy5OT05FLCBudWxsKTsKKyAgICAgICAgICAgIGZvciAoSUZpbGVTdG9yZSBjaGlsZCA6IGNoaWxkcmVuKSB7CisgICAgICAgICAgICAgICAgSUZpbGVJbmZvIGluZm8gPSBjaGlsZC5mZXRjaEluZm8oKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mby5pc0RpcmVjdG9yeSgpICYmIGluZm8uZXhpc3RzKCkgJiYgIXRoaXMuZk9yZ2luYWxGb2xkZXJzLmNvbnRhaW5zKGNoaWxkLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mT3JnaW5hbEZvbGRlcnMuYWRkKGNoaWxkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSmF2YVBsdWdpbi5sb2coZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkJSUZpbGVTdG9yZSBmaWxlID0gRUZTLmdldFN0b3JlKHByb2plY3RMb2NhdGlvbik7Ci0JCWlmIChmaWxlLmZldGNoSW5mbygpLmV4aXN0cygpKSB7Ci0JCQlJRmlsZVN0b3JlIHByb2plY3RGaWxlID0gZmlsZS5nZXRDaGlsZChGSUxFTkFNRV9QUk9KRUNUKTsKLQkJCWlmIChwcm9qZWN0RmlsZS5mZXRjaEluZm8oKS5leGlzdHMoKSkgewotCQkJCWZEb3RQcm9qZWN0QmFja3VwID0gY3JlYXRlQmFja3VwKHByb2plY3RGaWxlLCAicHJvamVjdC1kZXNjIik7IC8vJE5PTi1OTFMtMSQgCi0JCQl9Ci0JCQlJRmlsZVN0b3JlIGNsYXNzcGF0aEZpbGUgPSBmaWxlLmdldENoaWxkKEZJTEVOQU1FX0NMQVNTUEFUSCk7Ci0JCQlpZiAoY2xhc3NwYXRoRmlsZS5mZXRjaEluZm8oKS5leGlzdHMoKSkgewotCQkJCWZEb3RDbGFzc3BhdGhCYWNrdXAgPSBjcmVhdGVCYWNrdXAoY2xhc3NwYXRoRmlsZSwgImNsYXNzcGF0aC1kZXNjIik7IC8vJE5PTi1OTFMtMSQgCi0JCQl9Ci0JCX0KLQl9CisgICAgcHJpdmF0ZSB2b2lkIHJlbWVtYmVyRXhpc3RpbmdGaWxlcyhVUkkgcHJvamVjdExvY2F0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuZkRvdFByb2plY3RCYWNrdXAgPSBudWxsOworICAgICAgICB0aGlzLmZEb3RDbGFzc3BhdGhCYWNrdXAgPSBudWxsOwogCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgcHJvdmlzaW9uYWwgcHJvamVjdC4gVGhlIHByb3Zpc2lvbmFsIHByb2plY3QgaXMgdHlwaWNhbGx5IHJlbW92ZWQgd2hlbiB0aGUgdXNlciBjYW5jZWxzIHRoZSB3aXphcmQgb3IKLQkgKiBnb2VzIGJhY2sgdG8gdGhlIGZpcnN0IHBhZ2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJvdmlzb25hbFByb2plY3QoKSB7Ci0JCWlmICghZkN1cnJQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQlmQ3VyclByb2plY3QgPSBudWxsOwotCQkJcmV0dXJuOwotCQl9CisgICAgICAgIElGaWxlU3RvcmUgZmlsZSA9IEVGUy5nZXRTdG9yZShwcm9qZWN0TG9jYXRpb24pOworICAgICAgICBpZiAoZmlsZS5mZXRjaEluZm8oKS5leGlzdHMoKSkgeworICAgICAgICAgICAgSUZpbGVTdG9yZSBwcm9qZWN0RmlsZSA9IGZpbGUuZ2V0Q2hpbGQoRklMRU5BTUVfUFJPSkVDVCk7CisgICAgICAgICAgICBpZiAocHJvamVjdEZpbGUuZmV0Y2hJbmZvKCkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZEb3RQcm9qZWN0QmFja3VwID0gY3JlYXRlQmFja3VwKHByb2plY3RGaWxlLCAicHJvamVjdC1kZXNjIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElGaWxlU3RvcmUgY2xhc3NwYXRoRmlsZSA9IGZpbGUuZ2V0Q2hpbGQoRklMRU5BTUVfQ0xBU1NQQVRIKTsKKyAgICAgICAgICAgIGlmIChjbGFzc3BhdGhGaWxlLmZldGNoSW5mbygpLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5mRG90Q2xhc3NwYXRoQmFja3VwID0gY3JlYXRlQmFja3VwKGNsYXNzcGF0aEZpbGUsICJjbGFzc3BhdGgtZGVzYyIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJZG9SZW1vdmVQcm9qZWN0KG1vbml0b3IpOwotCQkJfQotCQl9OworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIHByb3Zpc2lvbmFsIHByb2plY3QuIFRoZSBwcm92aXNpb25hbCBwcm9qZWN0IGlzIHR5cGljYWxseSByZW1vdmVkIHdoZW4gdGhlIHVzZXIgY2FuY2VscyB0aGUgd2l6YXJkIG9yCisgICAgICogZ29lcyBiYWNrIHRvIHRoZSBmaXJzdCBwYWdlLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZVByb3Zpc29uYWxQcm9qZWN0KCkgeworICAgICAgICBpZiAoIXRoaXMuZkN1cnJQcm9qZWN0LmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aGlzLmZDdXJyUHJvamVjdCA9IG51bGw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG5ldyBXb3Jrc3BhY2VNb2RpZnlEZWxlZ2F0aW5nT3BlcmF0aW9uKG9wKSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZmluYWwgU3RyaW5nIHRpdGxlID0gTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX2Vycm9yX3JlbW92ZV90aXRsZTsKLQkJCWZpbmFsIFN0cmluZyBtZXNzYWdlID0gTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX2Vycm9yX3JlbW92ZV9tZXNzYWdlOwotCQkJRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZSwgZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjYW5jZWwgcHJlc3NlZAotCQl9Ci0JfQorICAgICAgICBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewogCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVFeGlzdGluZ0ZpbGVzKFVSSSBwcm9qZWN0TG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpbnQgdGlja3MgPSAoKGZEb3RQcm9qZWN0QmFja3VwICE9IG51bGwgPyAxIDogMCkgKyAoZkRvdENsYXNzcGF0aEJhY2t1cCAhPSBudWxsID8gMSA6IDApKSAqIDI7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCB0aWNrcyk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCUlGaWxlU3RvcmUgcHJvamVjdEZpbGUgPSBFRlMuZ2V0U3RvcmUocHJvamVjdExvY2F0aW9uKS5nZXRDaGlsZChGSUxFTkFNRV9QUk9KRUNUKTsKLQkJCXByb2plY3RGaWxlLmRlbGV0ZShFRlMuTk9ORSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQlpZiAoZkRvdFByb2plY3RCYWNrdXAgIT0gbnVsbCkgewotCQkJCWNvcHlGaWxlKGZEb3RQcm9qZWN0QmFja3VwLCBwcm9qZWN0RmlsZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhVUkuSURfUExVR0lOLCBJU3RhdHVzLkVSUk9SLAotCQkJCQlOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fcHJvYmxlbV9yZXN0b3JlX3Byb2plY3QsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCQl0cnkgewotCQkJSUZpbGVTdG9yZSBjbGFzc3BhdGhGaWxlID0gRUZTLmdldFN0b3JlKHByb2plY3RMb2NhdGlvbikuZ2V0Q2hpbGQoRklMRU5BTUVfQ0xBU1NQQVRIKTsKLQkJCWNsYXNzcGF0aEZpbGUuZGVsZXRlKEVGUy5OT05FLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCWlmIChmRG90Q2xhc3NwYXRoQmFja3VwICE9IG51bGwpIHsKLQkJCQljb3B5RmlsZShmRG90Q2xhc3NwYXRoQmFja3VwLCBjbGFzc3BhdGhGaWxlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFVSS5JRF9QTFVHSU4sIElTdGF0dXMuRVJST1IsCi0JCQkJCU5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19wcm9ibGVtX3Jlc3RvcmVfY2xhc3NwYXRoLCBlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGRvUmVtb3ZlUHJvamVjdChtb25pdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKIAotCXByaXZhdGUgdm9pZCByZXN0b3JlRXhpc3RpbmdGb2xkZXJzKFVSSSBwcm9qZWN0TG9jYXRpb24pIHsKLQkJdHJ5IHsKLQkJCUlGaWxlU3RvcmVbXSBjaGlsZHJlbiA9IEVGUy5nZXRTdG9yZShwcm9qZWN0TG9jYXRpb24pLmNoaWxkU3RvcmVzKEVGUy5OT05FLCBudWxsKTsKLQkJCWZvciAoSUZpbGVTdG9yZSBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQkJSUZpbGVJbmZvIGluZm8gPSBjaGlsZC5mZXRjaEluZm8oKTsKLQkJCQlpZiAoaW5mby5pc0RpcmVjdG9yeSgpICYmIGluZm8uZXhpc3RzKCkgJiYgIWZPcmdpbmFsRm9sZGVycy5jb250YWlucyhjaGlsZCkpIHsKLQkJCQkJY2hpbGQuZGVsZXRlKEVGUy5OT05FLCBudWxsKTsKLQkJCQkJZk9yZ2luYWxGb2xkZXJzLnJlbW92ZShjaGlsZCk7Ci0JCQkJfQotCQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG5ldyBXb3Jrc3BhY2VNb2RpZnlEZWxlZ2F0aW5nT3BlcmF0aW9uKG9wKSk7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRpdGxlID0gTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX2Vycm9yX3JlbW92ZV90aXRsZTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX2Vycm9yX3JlbW92ZV9tZXNzYWdlOworICAgICAgICAgICAgRXhjZXB0aW9uSGFuZGxlci5oYW5kbGUoZSwgZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBjYW5jZWwgcHJlc3NlZAorICAgICAgICB9CisgICAgfQogCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZk9yZ2luYWxGb2xkZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlJRmlsZVN0b3JlIGRlbGV0ZWQgPSAoSUZpbGVTdG9yZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWRlbGV0ZWQubWtkaXIoRUZTLk5PTkUsIG51bGwpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUphdmFQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQorICAgIHByaXZhdGUgdm9pZCByZXN0b3JlRXhpc3RpbmdGaWxlcyhVUkkgcHJvamVjdExvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHRpY2tzID0gKCh0aGlzLmZEb3RQcm9qZWN0QmFja3VwICE9IG51bGwgPyAxIDogMCkgKyAodGhpcy5mRG90Q2xhc3NwYXRoQmFja3VwICE9IG51bGwgPyAxIDogMCkpICogMjsKKyAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIiIsIHRpY2tzKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB0cnkgeworICAgICAgICAgICAgSUZpbGVTdG9yZSBwcm9qZWN0RmlsZSA9IEVGUy5nZXRTdG9yZShwcm9qZWN0TG9jYXRpb24pLmdldENoaWxkKEZJTEVOQU1FX1BST0pFQ1QpOworICAgICAgICAgICAgcHJvamVjdEZpbGUuZGVsZXRlKEVGUy5OT05FLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKKyAgICAgICAgICAgIGlmICh0aGlzLmZEb3RQcm9qZWN0QmFja3VwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb3B5RmlsZSh0aGlzLmZEb3RQcm9qZWN0QmFja3VwLCBwcm9qZWN0RmlsZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIElTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKYXZhVUkuSURfUExVR0lOLCBJU3RhdHVzLkVSUk9SLAorICAgICAgICAgICAgICAgIE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19wcm9ibGVtX3Jlc3RvcmVfcHJvamVjdCwgZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJRmlsZVN0b3JlIGNsYXNzcGF0aEZpbGUgPSBFRlMuZ2V0U3RvcmUocHJvamVjdExvY2F0aW9uKS5nZXRDaGlsZChGSUxFTkFNRV9DTEFTU1BBVEgpOworICAgICAgICAgICAgY2xhc3NwYXRoRmlsZS5kZWxldGUoRUZTLk5PTkUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOworICAgICAgICAgICAgaWYgKHRoaXMuZkRvdENsYXNzcGF0aEJhY2t1cCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29weUZpbGUodGhpcy5mRG90Q2xhc3NwYXRoQmFja3VwLCBjbGFzc3BhdGhGaWxlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEphdmFVSS5JRF9QTFVHSU4sIElTdGF0dXMuRVJST1IsCisgICAgICAgICAgICAgICAgTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX3Byb2JsZW1fcmVzdG9yZV9jbGFzc3BhdGgsIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNzZXRWaXNpYmxlKGJvb2xlYW4pCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJYm9vbGVhbiBpc1Nob3duRmlyc3RUaW1lID0gdmlzaWJsZSAmJiBmQ3VyclByb2plY3QgPT0gbnVsbDsKLQkJaWYgKHZpc2libGUpIHsKLQkJCWlmIChpc1Nob3duRmlyc3RUaW1lKSB7IC8vIGVudGVyaW5nIGZyb20gdGhlIGZpcnN0IHBhZ2UKLQkJCQljcmVhdGVQcm92aXNvbmFsUHJvamVjdCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgPT0gZkZpcnN0UGFnZSkgeyAvLyBsZWF2aW5nCi0JCQkJLy8gYmFjayB0bwotCQkJCS8vIHRoZSBmaXJzdAotCQkJCS8vIHBhZ2UKLQkJCQlyZW1vdmVQcm92aXNvbmFsUHJvamVjdCgpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmIChpc1Nob3duRmlyc3RUaW1lKSB7Ci0JCQlzZXRGb2N1cygpOwotCQl9Ci0JfQorICAgIHByaXZhdGUgdm9pZCByZXN0b3JlRXhpc3RpbmdGb2xkZXJzKFVSSSBwcm9qZWN0TG9jYXRpb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElGaWxlU3RvcmVbXSBjaGlsZHJlbiA9IEVGUy5nZXRTdG9yZShwcm9qZWN0TG9jYXRpb24pLmNoaWxkU3RvcmVzKEVGUy5OT05FLCBudWxsKTsKKyAgICAgICAgICAgIGZvciAoSUZpbGVTdG9yZSBjaGlsZCA6IGNoaWxkcmVuKSB7CisgICAgICAgICAgICAgICAgSUZpbGVJbmZvIGluZm8gPSBjaGlsZC5mZXRjaEluZm8oKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mby5pc0RpcmVjdG9yeSgpICYmIGluZm8uZXhpc3RzKCkgJiYgIXRoaXMuZk9yZ2luYWxGb2xkZXJzLmNvbnRhaW5zKGNoaWxkKSkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZC5kZWxldGUoRUZTLk5PTkUsIG51bGwpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmZPcmdpbmFsRm9sZGVycy5yZW1vdmUoY2hpbGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCXByaXZhdGUgZmluYWwgSVN0YXR1cyB1cGRhdGVQcm9qZWN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyByZXN1bHQgPSBTdGF0dXNJbmZvLk9LX1NUQVRVUzsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19vcGVyYXRpb25faW5pdGlhbGl6ZSwgNyk7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLmZPcmdpbmFsRm9sZGVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgSUZpbGVTdG9yZSBkZWxldGVkID0gKElGaWxlU3RvcmUpIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBkZWxldGVkLm1rZGlyKEVGUy5OT05FLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBKYXZhUGx1Z2luLmxvZyhlKTsKKyAgICAgICAgfQorICAgIH0KIAotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gZkZpcnN0UGFnZS5nZXRQcm9qZWN0TmFtZSgpOworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI3NldFZpc2libGUoYm9vbGVhbikKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBib29sZWFuIGlzU2hvd25GaXJzdFRpbWUgPSB2aXNpYmxlICYmIHRoaXMuZkN1cnJQcm9qZWN0ID09IG51bGw7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICBpZiAoaXNTaG93bkZpcnN0VGltZSkgeyAvLyBlbnRlcmluZyBmcm9tIHRoZSBmaXJzdCBwYWdlCisgICAgICAgICAgICAgICAgY3JlYXRlUHJvdmlzb25hbFByb2plY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpID09IHRoaXMuZkZpcnN0UGFnZSkgeyAvLyBsZWF2aW5nCisgICAgICAgICAgICAgICAgLy8gYmFjayB0bworICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdAorICAgICAgICAgICAgICAgIC8vIHBhZ2UKKyAgICAgICAgICAgICAgICByZW1vdmVQcm92aXNvbmFsUHJvamVjdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7CisgICAgICAgIGlmIChpc1Nob3duRmlyc3RUaW1lKSB7CisgICAgICAgICAgICBzZXRGb2N1cygpOworICAgICAgICB9CisgICAgfQogCi0JCQlmQ3VyclByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJZkN1cnJQcm9qZWN0TG9jYXRpb24gPSBmRmlyc3RQYWdlLmdldFByb2plY3RMb2NhdGlvblVSSSgpOworICAgIHByaXZhdGUgZmluYWwgSVN0YXR1cyB1cGRhdGVQcm9qZWN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgSVN0YXR1cyByZXN1bHQgPSBTdGF0dXNJbmZvLk9LX1NUQVRVUzsKKyAgICAgICAgaWYgKG1vbml0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKE5ld0phdmFQcm9qZWN0V2l6YXJkQ29uc3RhbnRzLk5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3b19vcGVyYXRpb25faW5pdGlhbGl6ZSwgNyk7CisgICAgICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KIAotCQkJVVJJIHJlYWxMb2NhdGlvbiA9IGdldFJlYWxMb2NhdGlvbihwcm9qZWN0TmFtZSwgZkN1cnJQcm9qZWN0TG9jYXRpb24pOwotCQkJZktlZXBDb250ZW50ID0gaGFzRXhpc3RpbmdDb250ZW50KHJlYWxMb2NhdGlvbik7CisgICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSB0aGlzLmZGaXJzdFBhZ2UuZ2V0UHJvamVjdE5hbWUoKTsKIAotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9CisgICAgICAgICAgICB0aGlzLmZDdXJyUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7CisgICAgICAgICAgICB0aGlzLmZDdXJyUHJvamVjdExvY2F0aW9uID0gdGhpcy5mRmlyc3RQYWdlLmdldFByb2plY3RMb2NhdGlvblVSSSgpOwogCi0JCQlpZiAoZktlZXBDb250ZW50KSB7Ci0JCQkJcmVtZW1iZXJFeGlzdGluZ0ZpbGVzKHJlYWxMb2NhdGlvbik7Ci0JCQkJcmVtZW1iZXJFeGlzaXRpbmdGb2xkZXJzKHJlYWxMb2NhdGlvbik7Ci0JCQl9CisgICAgICAgICAgICBVUkkgcmVhbExvY2F0aW9uID0gZ2V0UmVhbExvY2F0aW9uKHByb2plY3ROYW1lLCB0aGlzLmZDdXJyUHJvamVjdExvY2F0aW9uKTsKKyAgICAgICAgICAgIHRoaXMuZktlZXBDb250ZW50ID0gaGFzRXhpc3RpbmdDb250ZW50KHJlYWxMb2NhdGlvbik7CiAKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQorICAgICAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CiAKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlUHJvamVjdChmQ3VyclByb2plY3QsIGZDdXJyUHJvamVjdExvY2F0aW9uLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDIpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWlmIChlLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1JFQURfTUVUQURBVEEpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IFN0YXR1c0luZm8oSVN0YXR1cy5JTkZPLCBNZXNzYWdlcy5mb3JtYXQoCi0JCQkJCQkJTmV3SmF2YVByb2plY3RXaXphcmRDb25zdGFudHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvX0RlbGV0ZUNvcnJ1cHRQcm9qZWN0RmlsZV9tZXNzYWdlLAotCQkJCQkJCWUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSk7CisgICAgICAgICAgICBpZiAodGhpcy5mS2VlcENvbnRlbnQpIHsKKyAgICAgICAgICAgICAgICByZW1lbWJlckV4aXN0aW5nRmlsZXMocmVhbExvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICByZW1lbWJlckV4aXNpdGluZ0ZvbGRlcnMocmVhbExvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KIAotCQkJCQlkZWxldGVQcm9qZWN0RmlsZShyZWFsTG9jYXRpb24pOwotCQkJCQlpZiAoZkN1cnJQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJCQlmQ3VyclByb2plY3QuZGVsZXRlKHRydWUsIG51bGwpOwotCQkJCQl9CisgICAgICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KIAotCQkJCQljcmVhdGVQcm9qZWN0KGZDdXJyUHJvamVjdCwgZkN1cnJQcm9qZWN0TG9jYXRpb24sIG51bGwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjcmVhdGVQcm9qZWN0KHRoaXMuZkN1cnJQcm9qZWN0LCB0aGlzLmZDdXJyUHJvamVjdExvY2F0aW9uLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChlLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1JFQURfTUVUQURBVEEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN0YXR1c0luZm8oSVN0YXR1cy5JTkZPLCBNZXNzYWdlcy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBOZXdKYXZhUHJvamVjdFdpemFyZENvbnN0YW50cy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd29fRGVsZXRlQ29ycnVwdFByb2plY3RGaWxlX21lc3NhZ2UsIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSk7CiAKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQorICAgICAgICAgICAgICAgICAgICBkZWxldGVQcm9qZWN0RmlsZShyZWFsTG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mQ3VyclByb2plY3QuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZkN1cnJQcm9qZWN0LmRlbGV0ZSh0cnVlLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQlpbml0aWFsaXplQnVpbGRQYXRoKEphdmFDb3JlLmNyZWF0ZShmQ3VyclByb2plY3QpLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDIpKTsKLQkJCWNvbmZpZ3VyZUphdmFQcm9qZWN0KG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMykpOyAvLyBjcmVhdGUKLQkJCS8vIHRoZQotCQkJLy8gSmF2YQotCQkJLy8gcHJvamVjdAotCQkJLy8gdG8KLQkJCS8vIGFsbG93Ci0JCQkvLyB0aGUKLQkJCS8vIHVzZQotCQkJLy8gb2YKLQkJCS8vIHRoZQotCQkJLy8gbmV3Ci0JCQkvLyBzb3VyY2UKLQkJCS8vIGZvbGRlcgotCQkJLy8gcGFnZQotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVByb2plY3QodGhpcy5mQ3VyclByb2plY3QsIHRoaXMuZkN1cnJQcm9qZWN0TG9jYXRpb24sIG51bGwpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZQotCSAqIG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkphdmFDYXBhYmlsaXR5Q29uZmlndXJhdGlvblBhZ2UjdXNlTmV3U291cmNlUGFnZQotCSAqICgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gdXNlTmV3U291cmNlUGFnZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQorICAgICAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluaXRpYWxpemVCdWlsZFBhdGgoSmF2YUNvcmUuY3JlYXRlKHRoaXMuZkN1cnJQcm9qZWN0KSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAyKSk7CisgICAgICAgICAgICBjb25maWd1cmVKYXZhUHJvamVjdChuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDMpKTsgLy8gY3JlYXRlCisgICAgICAgICAgICAvLyB0aGUKKyAgICAgICAgICAgIC8vIEphdmEKKyAgICAgICAgICAgIC8vIHByb2plY3QKKyAgICAgICAgICAgIC8vIHRvCisgICAgICAgICAgICAvLyBhbGxvdworICAgICAgICAgICAgLy8gdGhlCisgICAgICAgICAgICAvLyB1c2UKKyAgICAgICAgICAgIC8vIG9mCisgICAgICAgICAgICAvLyB0aGUKKyAgICAgICAgICAgIC8vIG5ldworICAgICAgICAgICAgLy8gc291cmNlCisgICAgICAgICAgICAvLyBmb2xkZXIKKyAgICAgICAgICAgIC8vIHBhZ2UKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkphdmFDYXBhYmlsaXR5Q29uZmlndXJhdGlvblBhZ2UjdXNlTmV3U291cmNlUGFnZSAoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIHVzZU5ld1NvdXJjZVBhZ2UoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS93aXphcmRzL1BkZU1lc3NhZ2VTdHJpbmdzLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2Uvd2l6YXJkcy9QZGVNZXNzYWdlU3RyaW5ncy5qYXZhCmluZGV4IGI5OTIwZDIuLjlkYzNiZGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS93aXphcmRzL1BkZU1lc3NhZ2VTdHJpbmdzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL3dpemFyZHMvUGRlTWVzc2FnZVN0cmluZ3MuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uud2l6YXJkczsKIAogLyoqCkBAIC0xNSwxOCArMTYsMTggQEAKICAqLwogcHVibGljIGNsYXNzIFBkZU1lc3NhZ2VTdHJpbmdzIHsKIAotCS8vIFBERVVJTWVzc2FnZXMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50UGFnZV9ub2lkID0gIklEIGlzIG5vdCBzZXQiOworICAgIC8vIFBERVVJTWVzc2FnZXMKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50UGFnZV9ub2lkID0gIklEIGlzIG5vdCBzZXQiOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudFBhZ2VfaW52YWxpZElkID0gIkludmFsaWQgSUQuICBMZWdhbCBjaGFyYWN0ZXJzIGFyZSBBLVogYS16IDAtOSAuIF8iOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRQYWdlX2ludmFsaWRJZCA9ICJJbnZhbGlkIElELiAgTGVnYWwgY2hhcmFjdGVycyBhcmUgQS1aIGEteiAwLTkgLiBfIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRQYWdlX25vbmFtZSA9ICJOYW1lIGlzIG5vdCBzZXQiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRQYWdlX25vbmFtZSA9ICJOYW1lIGlzIG5vdCBzZXQiOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudFBhZ2VfaWxsZWdhbENoYXJhY3RlcnNJbklEID0gIlByb2plY3QgbmFtZSBjb250YWluZWQgY2hhcmFjdGVycyB3aGljaCBhcmUgbm90IGxlZ2FsIGZvciB0aGUgaWQsIHRoZXkgaGF2ZSBiZWVuIGNvbnZlcnRlZCB0byB1bmRlcnNjb3Jlcy4iOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRQYWdlX2lsbGVnYWxDaGFyYWN0ZXJzSW5JRCA9ICJQcm9qZWN0IG5hbWUgY29udGFpbmVkIGNoYXJhY3RlcnMgd2hpY2ggYXJlIG5vdCBsZWdhbCBmb3IgdGhlIGlkLCB0aGV5IGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gdW5kZXJzY29yZXMuIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRyb2xWYWxpZGF0aW9uVXRpbGl0eV9lcnJvck1zZ1ZhbHVlTXVzdEJlU3BlY2lmaWVkID0gIkEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRyb2xWYWxpZGF0aW9uVXRpbGl0eV9lcnJvck1zZ1ZhbHVlTXVzdEJlU3BlY2lmaWVkID0gIkEgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQiOwogCi0JLy8gUERFQ29yZU1lc3NhZ2VzCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9JbnZhbGlkRm9ybWF0SW5CdW5kbGVWZXJzaW9uID0gIlRoZSBzcGVjaWZpZWQgdmVyc2lvbiBkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZWN0IGZvcm1hdCAobWFqb3IubWlub3IubWljcm8ucXVhbGlmaWVyKSBvciBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMiOworICAgIC8vIFBERUNvcmVNZXNzYWdlcworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfSW52YWxpZEZvcm1hdEluQnVuZGxlVmVyc2lvbiA9ICJUaGUgc3BlY2lmaWVkIHZlcnNpb24gZG9lcyBub3QgaGF2ZSB0aGUgY29ycmVjdCBmb3JtYXQgKG1ham9yLm1pbm9yLm1pY3JvLnF1YWxpZmllcikgb3IgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIjsKIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9lY2xpcHNlL3dpemFyZHMvUHJvamVjdENvbnRlbnRQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2Uvd2l6YXJkcy9Qcm9qZWN0Q29udGVudFBhZ2UuamF2YQppbmRleCBjYWJkYjg0Li44Y2NmNzU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2Uvd2l6YXJkcy9Qcm9qZWN0Q29udGVudFBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2Uvd2l6YXJkcy9Qcm9qZWN0Q29udGVudFBhZ2UuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlLndpemFyZHM7CiAKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwpAQCAtMzgsMjU0ICszOSwyNDggQEAKIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdENvbnRlbnRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7CiAKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUFJPUEVSVElFU19HUk9VUCA9IDE7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFBST1BFUlRJRVNfR1JPVVAgPSAxOwogCi0JLy8gQ29udGVudFBhZ2UKLQlwcml2YXRlIGJvb2xlYW4gZkluaXRpYWxpemVkID0gZmFsc2U7CisgICAgLy8gQ29udGVudFBhZ2UKKyAgICBwcml2YXRlIGJvb2xlYW4gZkluaXRpYWxpemVkID0gZmFsc2U7CiAKLQlwcml2YXRlIFRleHQgZklkVGV4dDsKKyAgICBwcml2YXRlIFRleHQgZklkVGV4dDsKIAotCXByaXZhdGUgVGV4dCBmVmVyc2lvblRleHQ7CisgICAgcHJpdmF0ZSBUZXh0IGZWZXJzaW9uVGV4dDsKIAotCXByaXZhdGUgVGV4dCBmTmFtZVRleHQ7CisgICAgcHJpdmF0ZSBUZXh0IGZOYW1lVGV4dDsKIAotCXByaXZhdGUgVGV4dCBmUHJvdmlkZXJUZXh0OworICAgIHByaXZhdGUgVGV4dCBmUHJvdmlkZXJUZXh0OwogCi0JcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdEZpZWxkRGF0YSBmRGF0YTsKKyAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0RmllbGREYXRhIGZEYXRhOwogCi0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdFByb3ZpZGVyIGZQcm9qZWN0UHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBJUHJvamVjdFByb3ZpZGVyIGZQcm9qZWN0UHJvdmlkZXI7CiAKLQlwcml2YXRlIGludCBmQ2hhbmdlZEdyb3VwcyA9IDA7CisgICAgcHJpdmF0ZSBpbnQgZkNoYW5nZWRHcm91cHMgPSAwOwogCi0JLyoqCi0JICogQHNlZSBDb250ZW50UGFnZQotCSAqLwotCXByaXZhdGUgZmluYWwgTW9kaWZ5TGlzdGVuZXIgcHJvcGVydGllc0xpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWlmIChmSW5pdGlhbGl6ZWQpIHsKLQkJCQlmQ2hhbmdlZEdyb3VwcyB8PSBQUk9QRVJUSUVTX0dST1VQOwotCQkJfQotCQkJdmFsaWRhdGVQYWdlKCk7Ci0JCX0KLQl9OworICAgIC8qKgorICAgICAqIEBzZWUgQ29udGVudFBhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1vZGlmeUxpc3RlbmVyIHByb3BlcnRpZXNMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKIAotCXByb3RlY3RlZCBQcm9qZWN0Q29udGVudFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBJUHJvamVjdFByb3ZpZGVyIHByb3ZpZGVyLCBBYnN0cmFjdEZpZWxkRGF0YSBkYXRhKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJZlByb2plY3RQcm92aWRlciA9IHByb3ZpZGVyOwotCQlmRGF0YSA9IGRhdGE7Ci0JCXNldFRpdGxlKGdldENvbnRlbnRQYWdlVGl0bGUoKSk7Ci0JCXNldERlc2NyaXB0aW9uKGdldENvbnRlbnRQYWdlRGVzY3JpcHRpb24oKSk7Ci0JfQorICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKyAgICAgICAgICAgIGlmIChQcm9qZWN0Q29udGVudFBhZ2UudGhpcy5mSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBQcm9qZWN0Q29udGVudFBhZ2UudGhpcy5mQ2hhbmdlZEdyb3VwcyB8PSBQUk9QRVJUSUVTX0dST1VQOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsaWRhdGVQYWdlKCk7CisgICAgICAgIH0KKyAgICB9OwogCi0JLyoqCi0JICogQHNlZSBDb250ZW50UGFnZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVJZCgpIHsKLQkJcmV0dXJuIElkVXRpbC5nZXRWYWxpZElkKGZQcm9qZWN0UHJvdmlkZXIuZ2V0UHJvamVjdE5hbWUoKSk7Ci0JfQorICAgIHByb3RlY3RlZCBQcm9qZWN0Q29udGVudFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBJUHJvamVjdFByb3ZpZGVyIHByb3ZpZGVyLCBBYnN0cmFjdEZpZWxkRGF0YSBkYXRhKSB7CisgICAgICAgIHN1cGVyKHBhZ2VOYW1lKTsKKyAgICAgICAgdGhpcy5mUHJvamVjdFByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgIHRoaXMuZkRhdGEgPSBkYXRhOworICAgICAgICBzZXRUaXRsZShnZXRDb250ZW50UGFnZVRpdGxlKCkpOworICAgICAgICBzZXREZXNjcmlwdGlvbihnZXRDb250ZW50UGFnZURlc2NyaXB0aW9uKCkpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgUGx1Z2luQ29udGVudFBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQbHVnaW5Qcm9wZXJ0aWVzR3JvdXAoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcm91cCBwcm9wZXJ0aWVzR3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCXByb3BlcnRpZXNHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcHJvcGVydGllc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwcm9wZXJ0aWVzR3JvdXAuc2V0VGV4dChnZXRDb250ZW50UGFnZUdyb3VwTGFiZWwoKSk7CisgICAgLyoqCisgICAgICogQHNlZSBDb250ZW50UGFnZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNvbXB1dGVJZCgpIHsKKyAgICAgICAgcmV0dXJuIElkVXRpbC5nZXRWYWxpZElkKHRoaXMuZlByb2plY3RQcm92aWRlci5nZXRQcm9qZWN0TmFtZSgpKTsKKyAgICB9CiAKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocHJvcGVydGllc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0Q29udGVudFBhZ2VJZExhYmVsKCkpOwotCQlmSWRUZXh0ID0gY3JlYXRlVGV4dChwcm9wZXJ0aWVzR3JvdXAsIHByb3BlcnRpZXNMaXN0ZW5lciwgMik7CisgICAgLyoqCisgICAgICogQHNlZSBQbHVnaW5Db250ZW50UGFnZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVBsdWdpblByb3BlcnRpZXNHcm91cChDb21wb3NpdGUgY29udGFpbmVyKSB7CisgICAgICAgIEdyb3VwIHByb3BlcnRpZXNHcm91cCA9IG5ldyBHcm91cChjb250YWluZXIsIFNXVC5OT05FKTsKKyAgICAgICAgcHJvcGVydGllc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOworICAgICAgICBwcm9wZXJ0aWVzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisgICAgICAgIHByb3BlcnRpZXNHcm91cC5zZXRUZXh0KGdldENvbnRlbnRQYWdlR3JvdXBMYWJlbCgpKTsKIAotCQlsYWJlbCA9IG5ldyBMYWJlbChwcm9wZXJ0aWVzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChnZXRDb250ZW50UGFnZU5hbWVMYWJlbCgpKTsKLQkJZk5hbWVUZXh0ID0gY3JlYXRlVGV4dChwcm9wZXJ0aWVzR3JvdXAsIHByb3BlcnRpZXNMaXN0ZW5lciwgMik7CisgICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHByb3BlcnRpZXNHcm91cCwgU1dULk5PTkUpOworICAgICAgICBsYWJlbC5zZXRUZXh0KGdldENvbnRlbnRQYWdlSWRMYWJlbCgpKTsKKyAgICAgICAgdGhpcy5mSWRUZXh0ID0gY3JlYXRlVGV4dChwcm9wZXJ0aWVzR3JvdXAsIHRoaXMucHJvcGVydGllc0xpc3RlbmVyLCAyKTsKIAotCQlsYWJlbCA9IG5ldyBMYWJlbChwcm9wZXJ0aWVzR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChnZXRDb250ZW50UGFnZVZlcnNpb25MYWJlbCgpKTsKLQkJZlZlcnNpb25UZXh0ID0gY3JlYXRlVGV4dChwcm9wZXJ0aWVzR3JvdXAsIHByb3BlcnRpZXNMaXN0ZW5lciwgMik7CisgICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHByb3BlcnRpZXNHcm91cCwgU1dULk5PTkUpOworICAgICAgICBsYWJlbC5zZXRUZXh0KGdldENvbnRlbnRQYWdlTmFtZUxhYmVsKCkpOworICAgICAgICB0aGlzLmZOYW1lVGV4dCA9IGNyZWF0ZVRleHQocHJvcGVydGllc0dyb3VwLCB0aGlzLnByb3BlcnRpZXNMaXN0ZW5lciwgMik7CiAKLQkJbGFiZWwgPSBuZXcgTGFiZWwocHJvcGVydGllc0dyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0Q29udGVudFBhZ2VQcm92aWRlckxhYmVsKCkpOwotCQlmUHJvdmlkZXJUZXh0ID0gY3JlYXRlVGV4dChwcm9wZXJ0aWVzR3JvdXAsIHByb3BlcnRpZXNMaXN0ZW5lciwgMik7Ci0JfQorICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbChwcm9wZXJ0aWVzR3JvdXAsIFNXVC5OT05FKTsKKyAgICAgICAgbGFiZWwuc2V0VGV4dChnZXRDb250ZW50UGFnZVZlcnNpb25MYWJlbCgpKTsKKyAgICAgICAgdGhpcy5mVmVyc2lvblRleHQgPSBjcmVhdGVUZXh0KHByb3BlcnRpZXNHcm91cCwgdGhpcy5wcm9wZXJ0aWVzTGlzdGVuZXIsIDIpOwogCi0JLyoqCi0JICogQHNlZSBDb250ZW50UGFnZQotCSAqLwotCXByaXZhdGUgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyLCBpbnQgaG9yaXpTcGFuKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3JpelNwYW47Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXJldHVybiB0ZXh0OwotCX0KKyAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWwocHJvcGVydGllc0dyb3VwLCBTV1QuTk9ORSk7CisgICAgICAgIGxhYmVsLnNldFRleHQoZ2V0Q29udGVudFBhZ2VQcm92aWRlckxhYmVsKCkpOworICAgICAgICB0aGlzLmZQcm92aWRlclRleHQgPSBjcmVhdGVUZXh0KHByb3BlcnRpZXNHcm91cCwgdGhpcy5wcm9wZXJ0aWVzTGlzdGVuZXIsIDIpOworICAgIH0KIAotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VEZXNjcmlwdGlvbigpOworICAgIC8qKgorICAgICAqIEBzZWUgQ29udGVudFBhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGhvcml6U3BhbikgeworICAgICAgICBUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKKyAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworICAgICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpTcGFuOworICAgICAgICB0ZXh0LnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIHRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENvbnRlbnRQYWdlR3JvdXBMYWJlbCgpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VEZXNjcmlwdGlvbigpOwogCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb250ZW50UGFnZUlkTGFiZWwoKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENvbnRlbnRQYWdlR3JvdXBMYWJlbCgpOwogCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb250ZW50UGFnZU5hbWVMYWJlbCgpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VJZExhYmVsKCk7CiAKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENvbnRlbnRQYWdlUGx1Z2luTGFiZWwoKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENvbnRlbnRQYWdlTmFtZUxhYmVsKCk7CiAKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENvbnRlbnRQYWdlUHJvdmlkZXJMYWJlbCgpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VQbHVnaW5MYWJlbCgpOwogCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb250ZW50UGFnZVRpdGxlKCk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb250ZW50UGFnZVByb3ZpZGVyTGFiZWwoKTsKIAotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VWZXJzaW9uTGFiZWwoKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENvbnRlbnRQYWdlVGl0bGUoKTsKIAotCS8qKgotCSAqIEBzZWUgUGx1Z2luQ29udGVudFBhZ2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lRmllbGRRdWFsaWZpZXIoKSB7Ci0JCXJldHVybiBnZXRDb250ZW50UGFnZVBsdWdpbkxhYmVsKCk7Ci0JfQorICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VWZXJzaW9uTGFiZWwoKTsKIAotCS8qKgotCSAqIEBzZWUgSWRVdGlsCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsaWROYW1lKFN0cmluZyBpZCkgewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihpZCwgIi4iKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rLm5leHRUb2tlbigpOwotCQkJaWYgKCF0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UodG9rZW4uY2hhckF0KDApKSArICgodG9rZW4ubGVuZ3RoKCkgPiAxKSA/IHRva2VuLnN1YnN0cmluZygxKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIElkVXRpbAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFZhbGlkTmFtZShTdHJpbmcgaWQpIHsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaWQsICIuIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHRvay5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGlmICghdG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHRva2VuLmNoYXJBdCgwKSkgKyAodG9rZW4ubGVuZ3RoKCkgPiAxID8gdG9rZW4uc3Vic3RyaW5nKDEpIDogIiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisgICAgfQogCi0JLyoqCi0JICogQHNlZSBDb250ZW50UGFnZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZlcnNpb25WYWxpZChTdHJpbmcgdmVyc2lvbikgewotCQlyZXR1cm4gVmVyc2lvblV0aWwudmFsaWRhdGVWZXJzaW9uKHZlcnNpb24pLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSzsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBDb250ZW50UGFnZQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZlcnNpb25WYWxpZChTdHJpbmcgdmVyc2lvbikgeworICAgICAgICByZXR1cm4gVmVyc2lvblV0aWwudmFsaWRhdGVWZXJzaW9uKHZlcnNpb24pLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5PSzsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIENvbnRlbnRQYWdlCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHZpc2libGUpIHsKLQkJCVN0cmluZyBpZCA9IGNvbXB1dGVJZCgpOwotCQkJLy8gcHJvcGVydGllcyBncm91cAotCQkJaWYgKChmQ2hhbmdlZEdyb3VwcyAmIFBST1BFUlRJRVNfR1JPVVApID09IDApIHsKLQkJCQlpbnQgb2xkZkNoYW5nZWQgPSBmQ2hhbmdlZEdyb3VwczsKLQkJCQlmSWRUZXh0LnNldFRleHQoaWQpOwotCQkJCWZWZXJzaW9uVGV4dC5zZXRUZXh0KCIxLjAuMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJZk5hbWVUZXh0LnNldFRleHQoZ2V0VmFsaWROYW1lKGlkKSk7Ci0JCQkJZlByb3ZpZGVyVGV4dC5zZXRUZXh0KElkVXRpbC5nZXRWYWxpZFByb3ZpZGVyKGlkKSk7Ci0JCQkJZkNoYW5nZWRHcm91cHMgPSBvbGRmQ2hhbmdlZDsKLQkJCX0KLQkJCWlmIChmSW5pdGlhbGl6ZWQpIHsKLQkJCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZkluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIENvbnRlbnRQYWdlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgaWYgKHZpc2libGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBpZCA9IGNvbXB1dGVJZCgpOworICAgICAgICAgICAgLy8gcHJvcGVydGllcyBncm91cAorICAgICAgICAgICAgaWYgKCh0aGlzLmZDaGFuZ2VkR3JvdXBzICYgUFJPUEVSVElFU19HUk9VUCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGludCBvbGRmQ2hhbmdlZCA9IHRoaXMuZkNoYW5nZWRHcm91cHM7CisgICAgICAgICAgICAgICAgdGhpcy5mSWRUZXh0LnNldFRleHQoaWQpOworICAgICAgICAgICAgICAgIHRoaXMuZlZlcnNpb25UZXh0LnNldFRleHQoIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB0aGlzLmZOYW1lVGV4dC5zZXRUZXh0KGdldFZhbGlkTmFtZShpZCkpOworICAgICAgICAgICAgICAgIHRoaXMuZlByb3ZpZGVyVGV4dC5zZXRUZXh0KElkVXRpbC5nZXRWYWxpZFByb3ZpZGVyKGlkKSk7CisgICAgICAgICAgICAgICAgdGhpcy5mQ2hhbmdlZEdyb3VwcyA9IG9sZGZDaGFuZ2VkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMuZkluaXRpYWxpemVkKSB7CisgICAgICAgICAgICAgICAgdmFsaWRhdGVQYWdlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuZkluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgQ29udGVudFBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEYXRhKCkgewotCQlmRGF0YS5zZXRJZChmSWRUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQlmRGF0YS5zZXRWZXJzaW9uKGZWZXJzaW9uVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJZkRhdGEuc2V0TmFtZShmTmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCWZEYXRhLnNldFByb3ZpZGVyKGZQcm92aWRlclRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgQ29udGVudFBhZ2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEYXRhKCkgeworICAgICAgICB0aGlzLmZEYXRhLnNldElkKHRoaXMuZklkVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKKyAgICAgICAgdGhpcy5mRGF0YS5zZXRWZXJzaW9uKHRoaXMuZlZlcnNpb25UZXh0LmdldFRleHQoKS50cmltKCkpOworICAgICAgICB0aGlzLmZEYXRhLnNldE5hbWUodGhpcy5mTmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7CisgICAgICAgIHRoaXMuZkRhdGEuc2V0UHJvdmlkZXIodGhpcy5mUHJvdmlkZXJUZXh0LmdldFRleHQoKS50cmltKCkpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgQ29udGVudFBhZ2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyB2YWxpZGF0ZUlkKCkgewotCQlTdHJpbmcgaWQgPSBmSWRUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCWlmIChpZC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gUGRlTWVzc2FnZVN0cmluZ3MuQ29udGVudFBhZ2Vfbm9pZDsKLQkJfQorICAgIC8qKgorICAgICAqIEBzZWUgQ29udGVudFBhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0ZUlkKCkgeworICAgICAgICBTdHJpbmcgaWQgPSB0aGlzLmZJZFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKKyAgICAgICAgaWYgKGlkLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBQZGVNZXNzYWdlU3RyaW5ncy5Db250ZW50UGFnZV9ub2lkOworICAgICAgICB9CiAKLQkJaWYgKCFJZFV0aWwuaXNWYWxpZENvbXBvc2l0ZUlEM18wKGlkKSkgewotCQkJcmV0dXJuIFBkZU1lc3NhZ2VTdHJpbmdzLkNvbnRlbnRQYWdlX2ludmFsaWRJZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgICAgIGlmICghSWRVdGlsLmlzVmFsaWRDb21wb3NpdGVJRDNfMChpZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBQZGVNZXNzYWdlU3RyaW5ncy5Db250ZW50UGFnZV9pbnZhbGlkSWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBDb250ZW50UGFnZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIHZhbGlkYXRlTmFtZSgpIHsKLQkJaWYgKGZOYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBQZGVNZXNzYWdlU3RyaW5ncy5Db250ZW50UGFnZV9ub25hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgQ29udGVudFBhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0ZU5hbWUoKSB7CisgICAgICAgIGlmICh0aGlzLmZOYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBQZGVNZXNzYWdlU3RyaW5ncy5Db250ZW50UGFnZV9ub25hbWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBQbHVnaW5Db250ZW50UGFnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZSgpIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IHZhbGlkYXRlUHJvcGVydGllcygpOwotCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGVycm9yTWVzc2FnZSA9PSBudWxsKTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBQbHVnaW5Db250ZW50UGFnZQorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZSgpIHsKKyAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IHZhbGlkYXRlUHJvcGVydGllcygpOworICAgICAgICBzZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKKyAgICAgICAgc2V0UGFnZUNvbXBsZXRlKGVycm9yTWVzc2FnZSA9PSBudWxsKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIENvbnRlbnRQYWdlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGVQcm9wZXJ0aWVzKCkgeworICAgIC8qKgorICAgICAqIEBzZWUgQ29udGVudFBhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0ZVByb3BlcnRpZXMoKSB7CiAKLQkJaWYgKCFmSW5pdGlhbGl6ZWQpIHsKLQkJCWlmICghZklkVGV4dC5nZXRUZXh0KCkudHJpbSgpLmVxdWFscyhmUHJvamVjdFByb3ZpZGVyLmdldFByb2plY3ROYW1lKCkpKSB7Ci0JCQkJc2V0TWVzc2FnZShQZGVNZXNzYWdlU3RyaW5ncy5Db250ZW50UGFnZV9pbGxlZ2FsQ2hhcmFjdGVyc0luSUQsIElORk9STUFUSU9OKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0TWVzc2FnZShudWxsKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9CisgICAgICAgIGlmICghdGhpcy5mSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIGlmICghdGhpcy5mSWRUZXh0LmdldFRleHQoKS50cmltKCkuZXF1YWxzKHRoaXMuZlByb2plY3RQcm92aWRlci5nZXRQcm9qZWN0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHNldE1lc3NhZ2UoUGRlTWVzc2FnZVN0cmluZ3MuQ29udGVudFBhZ2VfaWxsZWdhbENoYXJhY3RlcnNJbklELCBJTkZPUk1BVElPTik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNldE1lc3NhZ2UobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JCXNldE1lc3NhZ2UobnVsbCk7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOworICAgICAgICBzZXRNZXNzYWdlKG51bGwpOworICAgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKIAotCQkvLyBWYWxpZGF0ZSBJRAotCQllcnJvck1lc3NhZ2UgPSB2YWxpZGF0ZUlkKCk7Ci0JCWlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQkJfQorICAgICAgICAvLyBWYWxpZGF0ZSBJRAorICAgICAgICBlcnJvck1lc3NhZ2UgPSB2YWxpZGF0ZUlkKCk7CisgICAgICAgIGlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKKyAgICAgICAgfQogCi0JCS8vIFZhbGlkYXRlIFZlcnNpb24KLQkJZXJyb3JNZXNzYWdlID0gdmFsaWRhdGVWZXJzaW9uKGZWZXJzaW9uVGV4dCk7Ci0JCWlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQkJfQorICAgICAgICAvLyBWYWxpZGF0ZSBWZXJzaW9uCisgICAgICAgIGVycm9yTWVzc2FnZSA9IHZhbGlkYXRlVmVyc2lvbih0aGlzLmZWZXJzaW9uVGV4dCk7CisgICAgICAgIGlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZTsKKyAgICAgICAgfQogCi0JCS8vIFZhbGlkYXRlIE5hbWUKLQkJZXJyb3JNZXNzYWdlID0gdmFsaWRhdGVOYW1lKCk7Ci0JCWlmIChlcnJvck1lc3NhZ2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQkJfQorICAgICAgICAvLyBWYWxpZGF0ZSBOYW1lCisgICAgICAgIGVycm9yTWVzc2FnZSA9IHZhbGlkYXRlTmFtZSgpOworICAgICAgICBpZiAoZXJyb3JNZXNzYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2U7CisgICAgICAgIH0KIAotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgQ29udGVudFBhZ2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyB2YWxpZGF0ZVZlcnNpb24oVGV4dCB0ZXh0KSB7Ci0JCWlmICh0ZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIFBERUxhYmVsVXRpbGl0eS5xdWFsaWZ5TWVzc2FnZShQREVMYWJlbFV0aWxpdHkuZ2V0RmllbGRMYWJlbCh0ZXh0KSwKLQkJCQkJUGRlTWVzc2FnZVN0cmluZ3MuQ29udHJvbFZhbGlkYXRpb25VdGlsaXR5X2Vycm9yTXNnVmFsdWVNdXN0QmVTcGVjaWZpZWQpOwotCQl9IGVsc2UgaWYgKCFpc1ZlcnNpb25WYWxpZCh0ZXh0LmdldFRleHQoKS50cmltKCkpKSB7Ci0JCQlyZXR1cm4gUERFTGFiZWxVdGlsaXR5LnF1YWxpZnlNZXNzYWdlKFBERUxhYmVsVXRpbGl0eS5nZXRGaWVsZExhYmVsKHRleHQpLAotCQkJCQlQZGVNZXNzYWdlU3RyaW5ncy5CdW5kbGVFcnJvclJlcG9ydGVyX0ludmFsaWRGb3JtYXRJbkJ1bmRsZVZlcnNpb24pOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIENvbnRlbnRQYWdlCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGVWZXJzaW9uKFRleHQgdGV4dCkgeworICAgICAgICBpZiAodGV4dC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBQREVMYWJlbFV0aWxpdHkucXVhbGlmeU1lc3NhZ2UoUERFTGFiZWxVdGlsaXR5LmdldEZpZWxkTGFiZWwodGV4dCksCisgICAgICAgICAgICAgICAgUGRlTWVzc2FnZVN0cmluZ3MuQ29udHJvbFZhbGlkYXRpb25VdGlsaXR5X2Vycm9yTXNnVmFsdWVNdXN0QmVTcGVjaWZpZWQpOworICAgICAgICB9IGVsc2UgaWYgKCFpc1ZlcnNpb25WYWxpZCh0ZXh0LmdldFRleHQoKS50cmltKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gUERFTGFiZWxVdGlsaXR5LnF1YWxpZnlNZXNzYWdlKFBERUxhYmVsVXRpbGl0eS5nZXRGaWVsZExhYmVsKHRleHQpLAorICAgICAgICAgICAgICAgIFBkZU1lc3NhZ2VTdHJpbmdzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfSW52YWxpZEZvcm1hdEluQnVuZGxlVmVyc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2VjbGlwc2Uvd2l6YXJkcy9SdW50aW1lQ29uZmlndXJhdGlvblBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS93aXphcmRzL1J1bnRpbWVDb25maWd1cmF0aW9uUGFnZS5qYXZhCmluZGV4IDJhNDJkNGEuLjA3NjhkOGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS93aXphcmRzL1J1bnRpbWVDb25maWd1cmF0aW9uUGFnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZWNsaXBzZS93aXphcmRzL1J1bnRpbWVDb25maWd1cmF0aW9uUGFnZS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuZWNsaXBzZS53aXphcmRzOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtNTAsMjkyICs1MSwyOTEgQEAKICAqIFByb2plY3RDb250ZW50UGFnZS4KICAqLwogQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSdW50aW1lQ29uZmlndXJhdGlvblBhZ2UgZXh0ZW5kcyBQcm9qZWN0Q29udGVudFBhZ2UgaW1wbGVtZW50cyBJRGF0YU1vZGVsTGlzdGVuZXIsCi0JCUlGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgeworcHVibGljIGFic3RyYWN0IGNsYXNzIFJ1bnRpbWVDb25maWd1cmF0aW9uUGFnZSBleHRlbmRzIFByb2plY3RDb250ZW50UGFnZSBpbXBsZW1lbnRzIElEYXRhTW9kZWxMaXN0ZW5lciwgSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7CiAKLQkvLyBEYXRhTW9kZWxXaXphcmRQYWdlCi0JcHJpdmF0ZSBmaW5hbCBWYWxpZGF0aW9uU3RhdHVzIHN0YXR1cyA9IG5ldyBWYWxpZGF0aW9uU3RhdHVzKCk7CisgICAgLy8gRGF0YU1vZGVsV2l6YXJkUGFnZQorICAgIHByaXZhdGUgZmluYWwgVmFsaWRhdGlvblN0YXR1cyBzdGF0dXMgPSBuZXcgVmFsaWRhdGlvblN0YXR1cygpOwogCi0JcHJpdmF0ZSBmaW5hbCBJRGF0YU1vZGVsIG1vZGVsOworICAgIHByaXZhdGUgZmluYWwgSURhdGFNb2RlbCBtb2RlbDsKIAotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTWFwIHZhbGlkYXRpb25NYXA7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBNYXAgdmFsaWRhdGlvbk1hcDsKIAotCXByaXZhdGUgU3RyaW5nW10gdmFsaWRhdGlvblByb3BlcnR5TmFtZXM7CisgICAgcHJpdmF0ZSBTdHJpbmdbXSB2YWxpZGF0aW9uUHJvcGVydHlOYW1lczsKIAotCXByaXZhdGUgZmluYWwgRGF0YU1vZGVsU3luY2hIZWxwZXIgc3luY2hIZWxwZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhTW9kZWxTeW5jaEhlbHBlciBzeW5jaEhlbHBlcjsKIAotCS8vIERhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlCi0JcHJpdmF0ZSBDb21ibyBzZXJ2ZXJUYXJnZXRDb21ibzsKKyAgICAvLyBEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZQorICAgIHByaXZhdGUgQ29tYm8gc2VydmVyVGFyZ2V0Q29tYm87CiAKLQlwcm90ZWN0ZWQgUnVudGltZUNvbmZpZ3VyYXRpb25QYWdlKFN0cmluZyBwYWdlTmFtZSwgSVByb2plY3RQcm92aWRlciBwcm92aWRlciwgQWJzdHJhY3RGaWVsZERhdGEgZGF0YSwKLQkJCUlEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIocGFnZU5hbWUsIHByb3ZpZGVyLCBkYXRhKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQltb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJc3luY2hIZWxwZXIgPSBpbml0aWFsaXplU3luY2hIZWxwZXIobW9kZWwpOwotCX0KKyAgICBwcm90ZWN0ZWQgUnVudGltZUNvbmZpZ3VyYXRpb25QYWdlKFN0cmluZyBwYWdlTmFtZSwgSVByb2plY3RQcm92aWRlciBwcm92aWRlciwgQWJzdHJhY3RGaWVsZERhdGEgZGF0YSwgSURhdGFNb2RlbCBtb2RlbCkgeworICAgICAgICBzdXBlcihwYWdlTmFtZSwgcHJvdmlkZXIsIGRhdGEpOworICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7CisgICAgICAgIG1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOworICAgICAgICB0aGlzLnN5bmNoSGVscGVyID0gaW5pdGlhbGl6ZVN5bmNoSGVscGVyKG1vZGVsKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVBZGRpdGlvbmFsUHJvcGVydGllc0dyb3VwKENvbXBvc2l0ZSBjb250YWluZXIpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxQcm9wZXJ0aWVzR3JvdXAoQ29tcG9zaXRlIGNvbnRhaW5lcik7CiAKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CisgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwogCi0JCWNyZWF0ZVBsdWdpblByb3BlcnRpZXNHcm91cChjb250YWluZXIpOwotCQljcmVhdGVBZGRpdGlvbmFsUHJvcGVydGllc0dyb3VwKGNvbnRhaW5lcik7Ci0JCWNyZWF0ZVNlcnZlclRhcmdldENvbXBvc2l0ZShjb250YWluZXIpOworICAgICAgICBjcmVhdGVQbHVnaW5Qcm9wZXJ0aWVzR3JvdXAoY29udGFpbmVyKTsKKyAgICAgICAgY3JlYXRlQWRkaXRpb25hbFByb3BlcnRpZXNHcm91cChjb250YWluZXIpOworICAgICAgICBjcmVhdGVTZXJ2ZXJUYXJnZXRDb21wb3NpdGUoY29udGFpbmVyKTsKIAotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbnRhaW5lcik7Ci0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJaW5pdGlhbGl6ZVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLCBJSGVscENvbnRleHRJZHMuTkVXX1BST0pFQ1RfUkVRVUlSRURfREFUQSk7Ci0JfQorICAgICAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbnRhaW5lcik7CisgICAgICAgIHNldENvbnRyb2woY29udGFpbmVyKTsKKyAgICAgICAgc2V0RGVmYXVsdHMoKTsKKyAgICAgICAgaW5pdGlhbGl6ZVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCk7CisgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ2V0Q29udHJvbCgpLCBJSGVscENvbnRleHRJZHMuTkVXX1BST0pFQ1RfUkVRVUlSRURfREFUQSk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTZXJ2ZXJUYXJnZXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuVGFyZ2V0UnVudGltZSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJc2VydmVyVGFyZ2V0Q29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJc2VydmVyVGFyZ2V0Q29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUJ1dHRvbiBuZXdTZXJ2ZXJUYXJnZXRCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCW5ld1NlcnZlclRhcmdldEJ1dHRvbi5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5OZXdEb3REb3REb3QpOwotCQluZXdTZXJ2ZXJUYXJnZXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoIWludGVybmFsTGF1bmNoTmV3UnVudGltZVdpemFyZChnZXRTaGVsbCgpLCBtb2RlbCkpIHsKLQkJCQkJLy8gQnVnemlsbGEgMTM1Mjg4Ci0JCQkJCS8vIHNldEVycm9yTWVzc2FnZShSZXNvdXJjZUhhbmRsZXIuSW52YWxpZFNlcnZlclRhcmdldCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJQ29udHJvbFtdIGRlcHMgPSBuZXcgQ29udHJvbFtdIHsgbmV3U2VydmVyVGFyZ2V0QnV0dG9uIH07Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oc2VydmVyVGFyZ2V0Q29tYm8sIEZBQ0VUX1JVTlRJTUUsIGRlcHMpOwotCQlpZiAoc2VydmVyVGFyZ2V0Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAtMSAmJiBzZXJ2ZXJUYXJnZXRDb21iby5nZXRWaXNpYmxlSXRlbUNvdW50KCkgIT0gMCkgewotCQkJc2VydmVyVGFyZ2V0Q29tYm8uc2VsZWN0KDApOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2VydmVyVGFyZ2V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICAgICAgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7CisgICAgICAgIGdyb3VwLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLlRhcmdldFJ1bnRpbWUpOworICAgICAgICBncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKyAgICAgICAgZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7CisgICAgICAgIHRoaXMuc2VydmVyVGFyZ2V0Q29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKKyAgICAgICAgdGhpcy5zZXJ2ZXJUYXJnZXRDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKyAgICAgICAgQnV0dG9uIG5ld1NlcnZlclRhcmdldEJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5OT05FKTsKKyAgICAgICAgbmV3U2VydmVyVGFyZ2V0QnV0dG9uLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLk5ld0RvdERvdERvdCk7CisgICAgICAgIG5ld1NlcnZlclRhcmdldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKIAotCS8qKgotCSAqIEBzZWUgRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE1vZHVsZVR5cGVJRCgpOworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpbnRlcm5hbExhdW5jaE5ld1J1bnRpbWVXaXphcmQoZ2V0U2hlbGwoKSwgUnVudGltZUNvbmZpZ3VyYXRpb25QYWdlLnRoaXMubW9kZWwpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEJ1Z3ppbGxhIDEzNTI4OAorICAgICAgICAgICAgICAgICAgICAvLyBzZXRFcnJvck1lc3NhZ2UoUmVzb3VyY2VIYW5kbGVyLkludmFsaWRTZXJ2ZXJUYXJnZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIENvbnRyb2xbXSBkZXBzID0gbmV3IENvbnRyb2xbXSB7IG5ld1NlcnZlclRhcmdldEJ1dHRvbiB9OworICAgICAgICB0aGlzLnN5bmNoSGVscGVyLnN5bmNoQ29tYm8odGhpcy5zZXJ2ZXJUYXJnZXRDb21ibywgRkFDRVRfUlVOVElNRSwgZGVwcyk7CisgICAgICAgIGlmICh0aGlzLnNlcnZlclRhcmdldENvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gLTEgJiYgdGhpcy5zZXJ2ZXJUYXJnZXRDb21iby5nZXRWaXNpYmxlSXRlbUNvdW50KCkgIT0gMCkgeworICAgICAgICAgICAgdGhpcy5zZXJ2ZXJUYXJnZXRDb21iby5zZWxlY3QoMCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIERhdGFNb2RlbFdpemFyZFBhZ2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZ2V0U3RhdHVzKEludGVnZXIga2V5KSB7Ci0JCXJldHVybiBzdGF0dXMuaGFzRXJyb3Ioa2V5KTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZQorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TW9kdWxlVHlwZUlEKCk7CiAKLQkvKioKLQkgKiBAc2VlIERhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfTE9DQVRJT04sIEZBQ0VUX1JVTlRJTUUgfTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBEYXRhTW9kZWxXaXphcmRQYWdlCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGdldFN0YXR1cyhJbnRlZ2VyIGtleSkgeworICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXMuaGFzRXJyb3Ioa2V5KTsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIERhdGFNb2RlbFdpemFyZFBhZ2UKLQkgKi8KLQlwcml2YXRlIERhdGFNb2RlbFN5bmNoSGVscGVyIGluaXRpYWxpemVTeW5jaEhlbHBlcihJRGF0YU1vZGVsIGRtKSB7Ci0JCXJldHVybiBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIoZG0pOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIERhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlBST0pFQ1RfTE9DQVRJT04sIEZBQ0VUX1JVTlRJTUUgfTsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIERhdGFNb2RlbFdpemFyZFBhZ2UKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCkgewotCQl2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9IGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7Ci0JCWlmICh2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9PSBudWxsIHx8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aCA9PSAwKSB7Ci0JCQl2YWxpZGF0aW9uTWFwID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQl9IGVsc2UgewotCQkJdmFsaWRhdGlvbk1hcCA9IG5ldyBIYXNoTWFwKHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdmFsaWRhdGlvbk1hcC5wdXQodmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV0sIG5ldyBJbnRlZ2VyKGkpKTsKLQkJCX0KLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIERhdGFNb2RlbFdpemFyZFBhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIERhdGFNb2RlbFN5bmNoSGVscGVyIGluaXRpYWxpemVTeW5jaEhlbHBlcihJRGF0YU1vZGVsIGRtKSB7CisgICAgICAgIHJldHVybiBuZXcgRGF0YU1vZGVsU3luY2hIZWxwZXIoZG0pOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaW50ZXJuYWxMYXVuY2hOZXdSdW50aW1lV2l6YXJkKFNoZWxsIHNoZWxsLCBJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZS5sYXVuY2hOZXdSdW50aW1lV2l6YXJkKHNoZWxsLCBtb2RlbCwgZ2V0TW9kdWxlVHlwZUlEKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIERhdGFNb2RlbFdpemFyZFBhZ2UKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCkgeworICAgICAgICB0aGlzLnZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzID0gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKTsKKyAgICAgICAgaWYgKHRoaXMudmFsaWRhdGlvblByb3BlcnR5TmFtZXMgPT0gbnVsbCB8fCB0aGlzLnZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NYXAgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NYXAgPSBuZXcgSGFzaE1hcCh0aGlzLnZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMudmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NYXAucHV0KHRoaXMudmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV0sIG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHBlcmZvcm1QYWdlRmluaXNoKCkgewotCQlzdXBlci51cGRhdGVEYXRhKCk7Ci0JCXN0b3JlRGVmYXVsdFNldHRpbmdzKCk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW50ZXJuYWxMYXVuY2hOZXdSdW50aW1lV2l6YXJkKFNoZWxsIHNoZWxsLCBJRGF0YU1vZGVsIG1vZGVsKSB7CisgICAgICAgIHJldHVybiBEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZS5sYXVuY2hOZXdSdW50aW1lV2l6YXJkKHNoZWxsLCBtb2RlbCwgZ2V0TW9kdWxlVHlwZUlEKCkpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgRGF0YU1vZGVsV2l6YXJkUGFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkvLyBEYXRhTW9kZWxXaXphcmQgdyA9IGdldERhdGFNb2RlbFdpemFyZCgpOwotCQkvLyBpZiAodyA9PSBudWxsIHx8ICF3LmlzRXhlY3V0aW5nKCkpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQlpZiAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMgIT0gbnVsbAotCQkJCSYmIChldmVudC5nZXRGbGFnKCkgPT0gRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHIHx8ICghaXNQYWdlQ29tcGxldGUoKSAmJiBldmVudC5nZXRGbGFnKCkgPT0gRGF0YU1vZGVsRXZlbnQuVkFMSURfVkFMVUVTX0NIRykpKSB7Ci0JCQlmb3IgKFN0cmluZyBlbGVtZW50IDogdmFsaWRhdGlvblByb3BlcnR5TmFtZXMpIHsKLQkJCQlpZiAoZWxlbWVudC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCQkvLyB2YWxpZGF0ZVBhZ2Uoc2hvd1ZhbGlkYXRpb25FcnJvcnNPbkVudGVyKCkpOwotCQkJCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1QYWdlRmluaXNoKCkgeworICAgICAgICBzdXBlci51cGRhdGVEYXRhKCk7CisgICAgICAgIHN0b3JlRGVmYXVsdFNldHRpbmdzKCk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZQotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZS5yZXN0b3JlUnVudGltZVNldHRpbmdzKHNldHRpbmdzLCBtb2RlbCk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgRGF0YU1vZGVsV2l6YXJkUGFnZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgeworICAgICAgICAvLyBEYXRhTW9kZWxXaXphcmQgdyA9IGdldERhdGFNb2RlbFdpemFyZCgpOworICAgICAgICAvLyBpZiAodyA9PSBudWxsIHx8ICF3LmlzRXhlY3V0aW5nKCkpIHsKKyAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOworICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uUHJvcGVydHlOYW1lcyAhPSBudWxsCisgICAgICAgICAgICAmJiAoZXZlbnQuZ2V0RmxhZygpID09IERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyB8fCAhaXNQYWdlQ29tcGxldGUoKSAmJiBldmVudC5nZXRGbGFnKCkgPT0gRGF0YU1vZGVsRXZlbnQuVkFMSURfVkFMVUVTX0NIRykpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiB0aGlzLnZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmFsaWRhdGVQYWdlKHNob3dWYWxpZGF0aW9uRXJyb3JzT25FbnRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVQYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEBzZWUgRGF0YU1vZGVsV2l6YXJkUGFnZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0cygpIHsKLQkJcmVzdG9yZURlZmF1bHRTZXR0aW5ncygpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIERhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7CisgICAgICAgIElEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7CisgICAgICAgIERhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlLnJlc3RvcmVSdW50aW1lU2V0dGluZ3Moc2V0dGluZ3MsIHRoaXMubW9kZWwpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgRGF0YU1vZGVsV2l6YXJkUGFnZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCVN0cmluZyBlcnJvciA9IHN0YXR1cy5nZXRMYXN0RXJyTXNnKCk7Ci0JCWlmIChlcnJvciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCXNldEVycm9yTWVzc2FnZSgoU3RyaW5nKSBudWxsKTsKLQkJCX0KLQkJCVN0cmluZyB3YXJuaW5nID0gc3RhdHVzLmdldExhc3RXYXJuaW5nTXNnKCk7Ci0JCQlpZiAod2FybmluZyA9PSBudWxsKSB7Ci0JCQkJaWYgKGdldE1lc3NhZ2UoKSAhPSBudWxsICYmIGdldE1lc3NhZ2VUeXBlKCkgPT0gSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKSB7Ci0JCQkJCXNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTdHJpbmcgaW5mbyA9IHN0YXR1cy5nZXRMYXN0SW5mb01zZygpOwotCQkJCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJCQlpZiAoZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgZ2V0TWVzc2FnZVR5cGUoKSA9PSBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKSB7Ci0JCQkJCQkJc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICghaW5mby5lcXVhbHMoZ2V0TWVzc2FnZSgpKSkgewotCQkJCQkJc2V0TWVzc2FnZShpbmZvLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIXdhcm5pbmcuZXF1YWxzKGdldE1lc3NhZ2UoKSkpIHsKLQkJCQlzZXRNZXNzYWdlKHdhcm5pbmcsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIWVycm9yLmVxdWFscyhnZXRFcnJvck1lc3NhZ2UoKSkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShlcnJvcik7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHNlZSBEYXRhTW9kZWxXaXphcmRQYWdlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRzKCkgeworICAgICAgICByZXN0b3JlRGVmYXVsdFNldHRpbmdzKCk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBEYXRhTW9kZWxXaXphcmRQYWdlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEVycm9yU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCXN0YXR1cy5zZXRFcnJvclN0YXR1cyhrZXksIGVycm9yTWVzc2FnZSk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgRGF0YU1vZGVsV2l6YXJkUGFnZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRFcnJvck1lc3NhZ2UoKSB7CisgICAgICAgIFN0cmluZyBlcnJvciA9IHRoaXMuc3RhdHVzLmdldExhc3RFcnJNc2coKTsKKyAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKChTdHJpbmcpIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHdhcm5pbmcgPSB0aGlzLnN0YXR1cy5nZXRMYXN0V2FybmluZ01zZygpOworICAgICAgICAgICAgaWYgKHdhcm5pbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBnZXRNZXNzYWdlVHlwZSgpID09IElNZXNzYWdlUHJvdmlkZXIuV0FSTklORykgeworICAgICAgICAgICAgICAgICAgICBzZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGluZm8gPSB0aGlzLnN0YXR1cy5nZXRMYXN0SW5mb01zZygpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgZ2V0TWVzc2FnZVR5cGUoKSA9PSBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaW5mby5lcXVhbHMoZ2V0TWVzc2FnZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWVzc2FnZShpbmZvLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXdhcm5pbmcuZXF1YWxzKGdldE1lc3NhZ2UoKSkpIHsKKyAgICAgICAgICAgICAgICBzZXRNZXNzYWdlKHdhcm5pbmcsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIWVycm9yLmVxdWFscyhnZXRFcnJvck1lc3NhZ2UoKSkpIHsKKyAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZShlcnJvcik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIERhdGFNb2RlbFdpemFyZFBhZ2UKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0SW5mb1N0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIGluZm9NZXNzYWdlKSB7Ci0JCXN0YXR1cy5zZXRJbmZvU3RhdHVzKGtleSwgaW5mb01lc3NhZ2UpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIERhdGFNb2RlbFdpemFyZFBhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2V0RXJyb3JTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5zdGF0dXMuc2V0RXJyb3JTdGF0dXMoa2V5LCBlcnJvck1lc3NhZ2UpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgRGF0YU1vZGVsV2l6YXJkUGFnZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRPS1N0YXR1cyhJbnRlZ2VyIGtleSkgewotCQlzdGF0dXMuc2V0T0tTdGF0dXMoa2V5KTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBEYXRhTW9kZWxXaXphcmRQYWdlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldEluZm9TdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyBpbmZvTWVzc2FnZSkgeworICAgICAgICB0aGlzLnN0YXR1cy5zZXRJbmZvU3RhdHVzKGtleSwgaW5mb01lc3NhZ2UpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgRGF0YU1vZGVsV2l6YXJkUGFnZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRXYXJuaW5nU3RhdHVzKEludGVnZXIga2V5LCBTdHJpbmcgd2FybmluZ01lc3NhZ2UpIHsKLQkJc3RhdHVzLnNldFdhcm5pbmdTdGF0dXMoa2V5LCB3YXJuaW5nTWVzc2FnZSk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgRGF0YU1vZGVsV2l6YXJkUGFnZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXRPS1N0YXR1cyhJbnRlZ2VyIGtleSkgeworICAgICAgICB0aGlzLnN0YXR1cy5zZXRPS1N0YXR1cyhrZXkpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2UKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCURhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlLnNhdmVSdW50aW1lU2V0dGluZ3Moc2V0dGluZ3MsIG1vZGVsKTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBEYXRhTW9kZWxXaXphcmRQYWdlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldFdhcm5pbmdTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyB3YXJuaW5nTWVzc2FnZSkgeworICAgICAgICB0aGlzLnN0YXR1cy5zZXRXYXJuaW5nU3RhdHVzKGtleSwgd2FybmluZ01lc3NhZ2UpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgRGF0YU1vZGVsV2l6YXJkUGFnZQotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDb250cm9scygpIHsKKyAgICAvKioKKyAgICAgKiBAc2VlIERhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgeworICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOworICAgICAgICBEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZS5zYXZlUnVudGltZVNldHRpbmdzKHNldHRpbmdzLCB0aGlzLm1vZGVsKTsKKyAgICB9CiAKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBEYXRhTW9kZWxXaXphcmRQYWdlCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewogCi0JLyoqCi0JICogQHNlZSBEYXRhTW9kZWxXaXphcmRQYWdlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdmFsaWRhdGVDb250cm9sc0Jhc2UoKSB7Ci0JCWlmICghdmFsaWRhdGlvbk1hcC5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZyBwcm9wTmFtZTsKLQkJCWZvciAoU3RyaW5nIGVsZW1lbnQgOiB2YWxpZGF0aW9uUHJvcGVydHlOYW1lcykgewotCQkJCXByb3BOYW1lID0gZWxlbWVudDsKLQkJCQlJbnRlZ2VyIHZhbEtleSA9IChJbnRlZ2VyKSB2YWxpZGF0aW9uTWFwLmdldChwcm9wTmFtZSk7Ci0JCQkJaWYgKHZhbEtleSAhPSBudWxsKSB7Ci0JCQkJCXZhbGlkYXRlUHJvcGVydHkocHJvcE5hbWUsIHZhbEtleSk7Ci0JCQkJfQotCQkJCWlmICghZ2V0U3RhdHVzKHZhbEtleSkpIHsKLQkJCQkJcmV0dXJuIHByb3BOYW1lOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBEYXRhTW9kZWxXaXphcmRQYWdlCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKCkgewotCQlzdXBlci52YWxpZGF0ZVBhZ2UoKTsKLQkJaWYgKGlzUGFnZUNvbXBsZXRlKCkpIHsKLQkJCXZhbGlkYXRlQ29udHJvbHNCYXNlKCk7Ci0JCQl1cGRhdGVDb250cm9scygpOwotCQkJc2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQlzZXRQYWdlQ29tcGxldGUoc3RhdHVzLmdldExhc3RFcnJNc2coKSA9PSBudWxsKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIERhdGFNb2RlbFdpemFyZFBhZ2UKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0ZUNvbnRyb2xzQmFzZSgpIHsKKyAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRpb25NYXAuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcHJvcE5hbWU7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBlbGVtZW50IDogdGhpcy52YWxpZGF0aW9uUHJvcGVydHlOYW1lcykgeworICAgICAgICAgICAgICAgIHByb3BOYW1lID0gZWxlbWVudDsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIHZhbEtleSA9IChJbnRlZ2VyKSB0aGlzLnZhbGlkYXRpb25NYXAuZ2V0KHByb3BOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsS2V5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVQcm9wZXJ0eShwcm9wTmFtZSwgdmFsS2V5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFnZXRTdGF0dXModmFsS2V5KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcE5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgRGF0YU1vZGVsV2l6YXJkUGFnZQotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIEludGVnZXIgdmFsaWRhdGlvbktleSkgewotCQlzZXRPS1N0YXR1cyh2YWxpZGF0aW9uS2V5KTsKLQkJSVN0YXR1cyBzdGF0dXMxID0gbW9kZWwudmFsaWRhdGVQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoIXN0YXR1czEuaXNPSygpKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IHN0YXR1czEuaXNNdWx0aVN0YXR1cygpID8gc3RhdHVzMS5nZXRDaGlsZHJlbigpWzBdLmdldE1lc3NhZ2UoKSA6IHN0YXR1czEuZ2V0TWVzc2FnZSgpOwotCQkJc3dpdGNoIChzdGF0dXMxLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgSVN0YXR1cy5FUlJPUjoKLQkJCQlzZXRFcnJvclN0YXR1cyh2YWxpZGF0aW9uS2V5LCBtZXNzYWdlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HOgotCQkJCXNldFdhcm5pbmdTdGF0dXModmFsaWRhdGlvbktleSwgbWVzc2FnZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuSU5GTzoKLQkJCQlzZXRJbmZvU3RhdHVzKHZhbGlkYXRpb25LZXksIG1lc3NhZ2UpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgRGF0YU1vZGVsV2l6YXJkUGFnZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZSgpIHsKKyAgICAgICAgc3VwZXIudmFsaWRhdGVQYWdlKCk7CisgICAgICAgIGlmIChpc1BhZ2VDb21wbGV0ZSgpKSB7CisgICAgICAgICAgICB2YWxpZGF0ZUNvbnRyb2xzQmFzZSgpOworICAgICAgICAgICAgdXBkYXRlQ29udHJvbHMoKTsKKyAgICAgICAgICAgIHNldEVycm9yTWVzc2FnZSgpOworICAgICAgICAgICAgc2V0UGFnZUNvbXBsZXRlKHRoaXMuc3RhdHVzLmdldExhc3RFcnJNc2coKSA9PSBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgRGF0YU1vZGVsV2l6YXJkUGFnZQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIEludGVnZXIgdmFsaWRhdGlvbktleSkgeworICAgICAgICBzZXRPS1N0YXR1cyh2YWxpZGF0aW9uS2V5KTsKKyAgICAgICAgSVN0YXR1cyBzdGF0dXMxID0gdGhpcy5tb2RlbC52YWxpZGF0ZVByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisgICAgICAgIGlmICghc3RhdHVzMS5pc09LKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gc3RhdHVzMS5pc011bHRpU3RhdHVzKCkgPyBzdGF0dXMxLmdldENoaWxkcmVuKClbMF0uZ2V0TWVzc2FnZSgpIDogc3RhdHVzMS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHN0YXR1czEuZ2V0U2V2ZXJpdHkoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgSVN0YXR1cy5FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3JTdGF0dXModmFsaWRhdGlvbktleSwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSVN0YXR1cy5XQVJOSU5HOgorICAgICAgICAgICAgICAgICAgICBzZXRXYXJuaW5nU3RhdHVzKHZhbGlkYXRpb25LZXksIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElTdGF0dXMuSU5GTzoKKyAgICAgICAgICAgICAgICAgICAgc2V0SW5mb1N0YXR1cyh2YWxpZGF0aW9uS2V5LCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmluZGV4IGJiYWNhNmQuLjQzMjFiZDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0xLDQgKzEsMyBAQAotI1dlZCBNYXIgMDIgMTY6MDA6MDYgUFNUIDIwMTEKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQpAQCAtOCw2ICs3LDggQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQpAQCAtODIsMzUgKzgzLDM3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249NDgKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnk9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCkBAIC0xMjEsMzAgKzEyNCwzMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbGFtYmRhX2JvZHk9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lcz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xMjAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZGlzYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvZmYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5lbmFibGluZ190YWc9QGZvcm1hdHRlclw6b24KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCkBAIC0xNTgsNyArMTYyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkPWluc2VydApAQCAtMTY2LDEwICsxNzAsMTEgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZW1iZXI9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWw9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfdHlwZV9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydApAQCAtMjE3LDYgKzIyMiw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0yMzUsMTIgKzI0MSwxNCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CkBAIC0yNjQsNiArMjcyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0CkBAIC0yOTEsNiArMzAwLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0zMTksNiArMzI5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3RyeT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydApAQCAtMzI4LDYgKzMzOSw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0zNDMsMTUgKzM1NSwxNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTIwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj1zcGFjZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX29uX29mZl90YWdzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YUZvcm1hdHRlcj1vcmcuZWNsaXBzZS5qZHQuY29yZS5kZWZhdWx0SmF2YUZvcm1hdHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmluZGV4IDdlN2ZlNzMuLjZjOTgwMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTEsNyArMSw2NSBAQAorY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbWV0aG9kcz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zX2ludGVyZmFjZV9tZXRob2RzPXRydWUKK2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X2Z1bmN0aW9uYWxfaW50ZXJmYWNlcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCitjbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlX2NoYW5nZXNfb25seT1mYWxzZQorY2xlYW51cC5pbnNlcnRfaW5mZXJyZWRfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV9yZWR1bmRhbnRfdHlwZV9hcmd1bWVudHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Fub255bW91c19jbGFzc19jcmVhdGlvbj1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPXRydWUKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9sYW1iZGE9dHJ1ZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3R5cGVfYXJndW1lbnRzPWZhbHNlCitjbGVhbnVwX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIENsZWFuIFVwCiBjbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIGVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X015bHluIGJhc2VkIG9uIEVjbGlwc2UKK2Zvcm1hdHRlcl9wcm9maWxlPV9WaXJnbyBXZWIgU2VydmVyIC0gQ29kZSBGb3JtYXR0ZXIKIGZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEyCiBpbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAogb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9leHBvcnQvdGVzdHMvQnVuZGxlRXhwb3J0VGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9leHBvcnQvdGVzdHMvQnVuZGxlRXhwb3J0VGVzdENhc2UuamF2YQppbmRleCA1ZGM5ZjY4Li42MGYzZTNmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZXhwb3J0L3Rlc3RzL0J1bmRsZUV4cG9ydFRlc3RDYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC90ZXN0cy9CdW5kbGVFeHBvcnRUZXN0Q2FzZS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQudGVzdHM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC00Miw1MSArNDMsNDYgQEAKICAqLwogcHVibGljIGNsYXNzIEJ1bmRsZUV4cG9ydFRlc3RDYXNlIGV4dGVuZHMgVmlyZ29JZGVUZXN0Q2FzZSB7CiAKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RFeHBvcnRPcGVyYXRpb24oKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotCQkJQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYXRoIGphckxvY2F0aW9uID0gUGF0aC5mcm9tT1NTdHJpbmcoCi0JCQkJVmlyZ29JZGVUZXN0VXRpbC5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5nZXRDYW5vbmljYWxQYXRoKCkpLmFwcGVuZCgKLQkJCQkiYnVuZGxvci10ZXN0LTEuMC4wLmphciIpOwotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoY3JlYXRlUHJlZGVmaW5lZFByb2plY3QoImJ1bmRsb3ItdGVzdCIpKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBvcnRPcGVyYXRpb24oKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgSVBhdGggamFyTG9jYXRpb24gPSBQYXRoLmZyb21PU1N0cmluZyhWaXJnb0lkZVRlc3RVdGlsLmdldFdvcmtzcGFjZVJvb3QoKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldENhbm9uaWNhbFBhdGgoKSkuYXBwZW5kKAorICAgICAgICAgICAgImJ1bmRsb3ItdGVzdC0xLjAuMC5qYXIiKTsKKyAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGNyZWF0ZVByZWRlZmluZWRQcm9qZWN0KCJidW5kbG9yLXRlc3QiKSk7CiAKLQkJSUphckV4cG9ydFJ1bm5hYmxlIG9wID0gQnVuZGxlRXhwb3J0VXRpbHMuY3JlYXRlRXhwb3J0T3BlcmF0aW9uKGphdmFQcm9qZWN0LCBqYXJMb2NhdGlvbiwgRGlzcGxheS5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOwotCQlJU3RhdHVzIHN0YXR1cyA9IG9wLmdldFN0YXR1cygpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiRXhwZWN0cyBzdGF0dXMgaXMgT0siLCBzdGF0dXMuaXNPSygpKTsKKyAgICAgICAgSUphckV4cG9ydFJ1bm5hYmxlIG9wID0gQnVuZGxlRXhwb3J0VXRpbHMuY3JlYXRlRXhwb3J0T3BlcmF0aW9uKGphdmFQcm9qZWN0LCBqYXJMb2NhdGlvbiwgRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwKKyAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oKSk7CisgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkucnVuKHRydWUsIHRydWUsIG9wKTsKKyAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBvcC5nZXRTdGF0dXMoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkV4cGVjdHMgc3RhdHVzIGlzIE9LIiwgc3RhdHVzLmlzT0soKSk7CiAKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoamFyTG9jYXRpb24udG9PU1N0cmluZygpKTsKLQkJRmlsZUlucHV0U3RyZWFtIGZpbGVTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQlaaXBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgWmlwSW5wdXRTdHJlYW0oZmlsZVN0cmVhbSk7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGphckxvY2F0aW9uLnRvT1NTdHJpbmcoKSk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaWxlU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgWmlwSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IFppcElucHV0U3RyZWFtKGZpbGVTdHJlYW0pOwogCi0JCUxpc3Q8U3RyaW5nPiBmaWxlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJd2hpbGUgKHN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLQkJCVppcEVudHJ5IGVudHJ5ID0gc3RyZWFtLmdldE5leHRFbnRyeSgpOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlmaWxlTmFtZXMuYWRkKGVudHJ5LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgTGlzdDxTdHJpbmc+IGZpbGVOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICB3aGlsZSAoc3RyZWFtLmF2YWlsYWJsZSgpID4gMCkgeworICAgICAgICAgICAgWmlwRW50cnkgZW50cnkgPSBzdHJlYW0uZ2V0TmV4dEVudHJ5KCk7CisgICAgICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbGVOYW1lcy5hZGQoZW50cnkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCVN0cmluZ1tdIHNvcnRlZEZpbGVOYW1lcyA9IGZpbGVOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbZmlsZU5hbWVzLnNpemUoKV0pOwotCQlBcnJheXMuc29ydChzb3J0ZWRGaWxlTmFtZXMpOworICAgICAgICBTdHJpbmdbXSBzb3J0ZWRGaWxlTmFtZXMgPSBmaWxlTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2ZpbGVOYW1lcy5zaXplKCldKTsKKyAgICAgICAgQXJyYXlzLnNvcnQoc29ydGVkRmlsZU5hbWVzKTsKIAotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiRXhwZWN0cyA0IGVudHJpZXMiLCBzb3J0ZWRGaWxlTmFtZXMubGVuZ3RoID09IDQpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJFeHBlY3RzIDFzdCBlbnRyeSB0byBiZSBNRVRBLUlORi9NQU5JRkVTVC5NRiIsICJNRVRBLUlORi9NQU5JRkVTVC5NRiIsIHNvcnRlZEZpbGVOYW1lc1swXSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIkV4cGVjdHMgMm5kIGVudHJ5IHRvIGJlIE1FVEEtSU5GL3NwcmluZy9tb2R1bGUtY29udGV4dC54bWwiLAotCQkJCSJNRVRBLUlORi9zcHJpbmcvbW9kdWxlLWNvbnRleHQueG1sIiwgc29ydGVkRmlsZU5hbWVzWzFdKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiRXhwZWN0cyAzcmQgZW50cnkgdG8gYmUgY29tL3NwcmluZ3NvdXJjZS9Gb28uY2xhc3MiLCAiY29tL3NwcmluZ3NvdXJjZS9Gb28uY2xhc3MiLAotCQkJCXNvcnRlZEZpbGVOYW1lc1syXSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIkV4cGVjdHMgNHRoIGVudHJ5IHRvIGJlIGNvbS9zcHJpbmdzb3VyY2UvYmFyL0Jhci5jbGFzcyIsICJjb20vc3ByaW5nc291cmNlL2Jhci9CYXIuY2xhc3MiLAotCQkJCXNvcnRlZEZpbGVOYW1lc1szXSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJFeHBlY3RzIDQgZW50cmllcyIsIHNvcnRlZEZpbGVOYW1lcy5sZW5ndGggPT0gNCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkV4cGVjdHMgMXN0IGVudHJ5IHRvIGJlIE1FVEEtSU5GL01BTklGRVNULk1GIiwgIk1FVEEtSU5GL01BTklGRVNULk1GIiwgc29ydGVkRmlsZU5hbWVzWzBdKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRXhwZWN0cyAybmQgZW50cnkgdG8gYmUgTUVUQS1JTkYvc3ByaW5nL21vZHVsZS1jb250ZXh0LnhtbCIsICJNRVRBLUlORi9zcHJpbmcvbW9kdWxlLWNvbnRleHQueG1sIiwgc29ydGVkRmlsZU5hbWVzWzFdKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRXhwZWN0cyAzcmQgZW50cnkgdG8gYmUgY29tL3NwcmluZ3NvdXJjZS9Gb28uY2xhc3MiLCAiY29tL3NwcmluZ3NvdXJjZS9Gb28uY2xhc3MiLCBzb3J0ZWRGaWxlTmFtZXNbMl0pOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJFeHBlY3RzIDR0aCBlbnRyeSB0byBiZSBjb20vc3ByaW5nc291cmNlL2Jhci9CYXIuY2xhc3MiLCAiY29tL3NwcmluZ3NvdXJjZS9iYXIvQmFyLmNsYXNzIiwgc29ydGVkRmlsZU5hbWVzWzNdKTsKIAotCQlmaWxlU3RyZWFtLmNsb3NlKCk7Ci0JCXN0cmVhbS5jbG9zZSgpOwotCX0KKyAgICAgICAgZmlsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC50ZXN0cyI7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJvcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0LnRlc3RzIjsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9leHBvcnQvdGVzdHMvUGFyRXhwb3J0VGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9leHBvcnQvdGVzdHMvUGFyRXhwb3J0VGVzdENhc2UuamF2YQppbmRleCBjOWM0OWVkLi4zOGQ3ZGViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZXhwb3J0L3Rlc3RzL1BhckV4cG9ydFRlc3RDYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC90ZXN0cy9QYXJFeHBvcnRUZXN0Q2FzZS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQudGVzdHM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC00MCw0NyArNDEsNDQgQEAKICAqLwogcHVibGljIGNsYXNzIFBhckV4cG9ydFRlc3RDYXNlIGV4dGVuZHMgVmlyZ29JZGVUZXN0Q2FzZSB7CiAKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RFeHBvcnRPcGVyYXRpb24oKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotCQkJQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHBhckxvY2F0aW9uID0gUGF0aC5mcm9tT1NTdHJpbmcoCi0JCQkJVmlyZ29JZGVUZXN0VXRpbC5nZXRXb3Jrc3BhY2VSb290KCkuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5nZXRDYW5vbmljYWxQYXRoKCkpLmFwcGVuZCgidGVzdC0xLjAuMC5wYXIiKTsKLQkJY3JlYXRlUHJlZGVmaW5lZFByb2plY3QoImJ1bmRsb3ItdGVzdCIpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cG9ydE9wZXJhdGlvbigpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworICAgICAgICBJUGF0aCBwYXJMb2NhdGlvbiA9IFBhdGguZnJvbU9TU3RyaW5nKFZpcmdvSWRlVGVzdFV0aWwuZ2V0V29ya3NwYWNlUm9vdCgpLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0Q2Fub25pY2FsUGF0aCgpKS5hcHBlbmQoInRlc3QtMS4wLjAucGFyIik7CisgICAgICAgIGNyZWF0ZVByZWRlZmluZWRQcm9qZWN0KCJidW5kbG9yLXRlc3QiKTsKIAotCQlJUHJvamVjdCBwcm9qZWN0ID0gVmlyZ29JZGVUZXN0VXRpbC5zZXRVcFByb2plY3QoImJ1bmRsb3ItdGVzdC1wYXIiLCAiMS40IiwgZ2V0U291cmNlV29ya3NwYWNlUGF0aCgpKTsKLQkJVmlyZ29JZGVUZXN0VXRpbC5nZXRXb3Jrc3BhY2UoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIG51bGwpOworICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gVmlyZ29JZGVUZXN0VXRpbC5zZXRVcFByb2plY3QoImJ1bmRsb3ItdGVzdC1wYXIiLCAiMS40IiwgZ2V0U291cmNlV29ya3NwYWNlUGF0aCgpKTsKKyAgICAgICAgVmlyZ29JZGVUZXN0VXRpbC5nZXRXb3Jrc3BhY2UoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIG51bGwpOwogCi0JCWJvb2xlYW4gc3RhdHVzID0gUGFyRXhwb3J0V2l6YXJkLmV4cG9ydFBhcihwcm9qZWN0LCBwYXJMb2NhdGlvbiwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwgRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKCJFeHBlY3RzIHN0YXR1cyBpcyBPSyIsIHN0YXR1cyk7CisgICAgICAgIGJvb2xlYW4gc3RhdHVzID0gUGFyRXhwb3J0V2l6YXJkLmV4cG9ydFBhcihwcm9qZWN0LCBwYXJMb2NhdGlvbiwgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwKKyAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiRXhwZWN0cyBzdGF0dXMgaXMgT0siLCBzdGF0dXMpOwogCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhckxvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCUZpbGVJbnB1dFN0cmVhbSBmaWxlU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJWmlwSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IFppcElucHV0U3RyZWFtKGZpbGVTdHJlYW0pOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXJMb2NhdGlvbi50b09TU3RyaW5nKCkpOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlsZVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgIFppcElucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBaaXBJbnB1dFN0cmVhbShmaWxlU3RyZWFtKTsKIAotCQlMaXN0PFN0cmluZz4gZmlsZU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXdoaWxlIChzdHJlYW0uYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IHN0cmVhbS5nZXROZXh0RW50cnkoKTsKLQkJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJZmlsZU5hbWVzLmFkZChlbnRyeS5nZXROYW1lKCkpOwotCQkJfQotCQl9CisgICAgICAgIExpc3Q8U3RyaW5nPiBmaWxlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgd2hpbGUgKHN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKKyAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5ID0gc3RyZWFtLmdldE5leHRFbnRyeSgpOworICAgICAgICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaWxlTmFtZXMuYWRkKGVudHJ5LmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlTdHJpbmdbXSBzb3J0ZWRGaWxlTmFtZXMgPSBmaWxlTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2ZpbGVOYW1lcy5zaXplKCldKTsKLQkJQXJyYXlzLnNvcnQoc29ydGVkRmlsZU5hbWVzKTsKKyAgICAgICAgU3RyaW5nW10gc29ydGVkRmlsZU5hbWVzID0gZmlsZU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tmaWxlTmFtZXMuc2l6ZSgpXSk7CisgICAgICAgIEFycmF5cy5zb3J0KHNvcnRlZEZpbGVOYW1lcyk7CiAKLQkJQXNzZXJ0LmFzc2VydFRydWUoIkV4cGVjdHMgMiBlbnRyaWVzIiwgc29ydGVkRmlsZU5hbWVzLmxlbmd0aCA9PSAyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiRXhwZWN0cyAxc3QgZW50cnkgdG8gYmUgTUVUQS1JTkYvTUFOSUZFU1QuTUYiLCAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiLCBzb3J0ZWRGaWxlTmFtZXNbMF0pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJFeHBlY3RzIDJuZCBlbnRyeSB0byBiZSBjb20uc3ByaW5nc291cmNlLmJ1bmRsb3ItMS4wLjAuamFyIiwKLQkJCQkiY29tLnNwcmluZ3NvdXJjZS5idW5kbG9yLTEuMC4wLmphciIsIHNvcnRlZEZpbGVOYW1lc1sxXSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJFeHBlY3RzIDIgZW50cmllcyIsIHNvcnRlZEZpbGVOYW1lcy5sZW5ndGggPT0gMik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkV4cGVjdHMgMXN0IGVudHJ5IHRvIGJlIE1FVEEtSU5GL01BTklGRVNULk1GIiwgIk1FVEEtSU5GL01BTklGRVNULk1GIiwgc29ydGVkRmlsZU5hbWVzWzBdKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRXhwZWN0cyAybmQgZW50cnkgdG8gYmUgY29tLnNwcmluZ3NvdXJjZS5idW5kbG9yLTEuMC4wLmphciIsICJjb20uc3ByaW5nc291cmNlLmJ1bmRsb3ItMS4wLjAuamFyIiwgc29ydGVkRmlsZU5hbWVzWzFdKTsKIAotCQlmaWxlU3RyZWFtLmNsb3NlKCk7Ci0JCXN0cmVhbS5jbG9zZSgpOwotCX0KKyAgICAgICAgZmlsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC50ZXN0cyI7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJvcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0LnRlc3RzIjsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggYmJhY2E2ZC4uNDMyMWJkOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTEsNCArMSwzIEBACi0jV2VkIE1hciAwMiAxNjowMDowNiBQU1QgMjAxMQogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9CkBAIC04LDYgKzcsOCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCkBAIC04MiwzNSArODMsMzcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTgwCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj00OAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbj0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeT04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2g9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKQEAgLTEyMSwzMCArMTI0LDMxIEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9sYW1iZGFfYm9keT1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTEyMAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2phdmFkb2NfYm91bmRhcmllcz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5wcmVzZXJ2ZV93aGl0ZV9zcGFjZV9iZXR3ZWVuX2NvZGVfYW5kX2xpbmVfY29tbWVudHM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5kaXNhYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9mZgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmVuYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvbgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKQEAgLTE1OCw3ICsxNjIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQ9aW5zZXJ0CkBAIC0xNjYsMTAgKzE3MCwxMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21lbWJlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZXRob2Q9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFja2FnZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl90eXBlPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9sYWJlbD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl90eXBlX2Fubm90YXRpb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0yMTcsNiArMjIyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTIzNSwxMiArMjQxLDE0IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKQEAgLTI2NCw2ICsyNzIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKQEAgLTI5MSw2ICszMDAsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTMxOSw2ICszMjksNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fdHJ5PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0CkBAIC0zMjgsNiArMzM5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKQEAgLTM0MywxNSArMzU1LDE3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xMjAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXNwYWNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2Vfb25fb2ZmX3RhZ3M9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfb3Jfb3BlcmF0b3JfbXVsdGljYXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9vdXRlcl9leHByZXNzaW9uc193aGVuX25lc3RlZD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhRm9ybWF0dGVyPW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRlZmF1bHRKYXZhRm9ybWF0dGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKaW5kZXggN2U3ZmU3My4uNmM5ODAxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMSw3ICsxLDY1IEBACitjbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19tZXRob2RzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnNfaW50ZXJmYWNlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfZnVuY3Rpb25hbF9pbnRlcmZhY2VzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKK2NsZWFudXAuY29ycmVjdF9pbmRlbnRhdGlvbj1mYWxzZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGVfY2hhbmdlc19vbmx5PWZhbHNlCitjbGVhbnVwLmluc2VydF9pbmZlcnJlZF90eXBlX2FyZ3VtZW50cz1mYWxzZQorY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV90eXBlX2Fic3RyYWN0X2lmX21pc3NpbmdfbWV0aG9kPWZhbHNlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKK2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK2NsZWFudXAucmVtb3ZlX3JlZHVuZGFudF90eXBlX2FyZ3VtZW50cz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorY2xlYW51cC51c2VfYW5vbnltb3VzX2NsYXNzX2NyZWF0aW9uPWZhbHNlCitjbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK2NsZWFudXAudXNlX2xhbWJkYT10cnVlCitjbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cC51c2VfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXBfcHJvZmlsZT1fVmlyZ28gV2ViIFNlcnZlciAtIENvZGUgQ2xlYW4gVXAKIGNsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCiBlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQogZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fTXlseW4gYmFzZWQgb24gRWNsaXBzZQorZm9ybWF0dGVyX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIEZvcm1hdHRlcgogZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTIKIGludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CiBvcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC9BYnN0cmFjdFByb2plY3RFeHBvcnRXaXphcmRQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZXhwb3J0L0Fic3RyYWN0UHJvamVjdEV4cG9ydFdpemFyZFBhZ2UuamF2YQppbmRleCAxYWY4NDQ3Li5jNzZiZDgyIDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZXhwb3J0L0Fic3RyYWN0UHJvamVjdEV4cG9ydFdpemFyZFBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZXhwb3J0L0Fic3RyYWN0UHJvamVjdEV4cG9ydFdpemFyZFBhZ2UuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtNDksNyArNTAsNyBAQAogCiAvKioKICAqIEFic3RyYWN0IHdpemFyZCBwYWdlIGZvciBwcmVzZW50aW5nIGEgbGlzdCBvZiBwcm9qZWN0cyBhbmQgc3BlY2lmeWluZyBhIGxvY2F0aW9uIHRvIGV4cG9ydCB0by4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBUZXJyeSBIb24KICAqIEBhdXRob3IgTGVvIERvcyBTYW50b3MKQEAgLTU3LDI5MyArNTgsMjkzIEBACiBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvamVjdEV4cG9ydFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRFeHBvcnRSZXNvdXJjZXNQYWdlIHsKIAotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKKyAgICBwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247CiAKLQlwcml2YXRlIFRleHQgZGVzdGluYXRpb25UZXh0OworICAgIHByaXZhdGUgVGV4dCBkZXN0aW5hdGlvblRleHQ7CiAKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7CisgICAgcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwogCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb247CisgICAgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGluaXRpYWxTZWxlY3Rpb247CiAKLQlwcml2YXRlIGJvb2xlYW4gb3ZlcndyaXRlOworICAgIHByaXZhdGUgYm9vbGVhbiBvdmVyd3JpdGU7CiAKLQlwcm90ZWN0ZWQgQWJzdHJhY3RQcm9qZWN0RXhwb3J0V2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLQkJdGhpcy5pbml0aWFsU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RQcm9qZWN0RXhwb3J0V2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworICAgICAgICBzdXBlcihwYWdlTmFtZSwgc2VsZWN0aW9uKTsKKyAgICAgICAgdGhpcy5pbml0aWFsU2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKIAotCQlMYWJlbCBzZWxlY3RQcm9qZWN0ID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzZWxlY3RQcm9qZWN0LnNldFRleHQoIlNlbGVjdCB0aGUgcHJvamVjdCB0byBleHBvcnQ6Iik7Ci0JCXNlbGVjdFByb2plY3Quc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOworICAgICAgICBMYWJlbCBzZWxlY3RQcm9qZWN0ID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworICAgICAgICBzZWxlY3RQcm9qZWN0LnNldFRleHQoIlNlbGVjdCB0aGUgcHJvamVjdCB0byBleHBvcnQ6Iik7CisgICAgICAgIHNlbGVjdFByb2plY3Quc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwogCi0JCWNyZWF0ZUlucHV0R3JvdXAoY29tcG9zaXRlKTsKKyAgICAgICAgY3JlYXRlSW5wdXRHcm91cChjb21wb3NpdGUpOwogCi0JCWNyZWF0ZURlc3RpbmF0aW9uR3JvdXAoY29tcG9zaXRlKTsKKyAgICAgICAgY3JlYXRlRGVzdGluYXRpb25Hcm91cChjb21wb3NpdGUpOwogCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9CisgICAgICAgIHNldENvbnRyb2woY29tcG9zaXRlKTsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBnZXRPdmVyd3JpdGUoKSB7Ci0JCXJldHVybiBvdmVyd3JpdGU7Ci0JfQorICAgIHB1YmxpYyBib29sZWFuIGdldE92ZXJ3cml0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMub3ZlcndyaXRlOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlc3RpbmF0aW9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXN0aW5hdGlvbkdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICAgICAgaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7CiAKLQkJQ29tcG9zaXRlIGRlc3RpbmF0aW9uU2VsZWN0aW9uR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJZGVzdGluYXRpb25TZWxlY3Rpb25Hcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZGVzdGluYXRpb25TZWxlY3Rpb25Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7CisgICAgICAgIENvbXBvc2l0ZSBkZXN0aW5hdGlvblNlbGVjdGlvbkdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKyAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7CisgICAgICAgIGRlc3RpbmF0aW9uU2VsZWN0aW9uR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7CisgICAgICAgIGRlc3RpbmF0aW9uU2VsZWN0aW9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSkpOwogCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRlc3RpbmF0aW9uU2VsZWN0aW9uR3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgiU2VsZWN0IHRoZSBleHBvcnQgZGVzdGluYXRpb246Iik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOworICAgICAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkZXN0aW5hdGlvblNlbGVjdGlvbkdyb3VwLCBTV1QuTk9ORSk7CisgICAgICAgIGxhYmVsLnNldFRleHQoIlNlbGVjdCB0aGUgZXhwb3J0IGRlc3RpbmF0aW9uOiIpOworICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOworICAgICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKIAotCQlMYWJlbCBqYXJMYWJlbCA9IG5ldyBMYWJlbChkZXN0aW5hdGlvblNlbGVjdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCWphckxhYmVsLnNldFRleHQoZ2V0RGVzdGluYXRpb25MYWJlbCgpKTsKLQkJamFyTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIGZhbHNlLCB0cnVlKSk7CisgICAgICAgIExhYmVsIGphckxhYmVsID0gbmV3IExhYmVsKGRlc3RpbmF0aW9uU2VsZWN0aW9uR3JvdXAsIFNXVC5OT05FKTsKKyAgICAgICAgamFyTGFiZWwuc2V0VGV4dChnZXREZXN0aW5hdGlvbkxhYmVsKCkpOworICAgICAgICBqYXJMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgZmFsc2UsIHRydWUpKTsKIAotCQlkZXN0aW5hdGlvblRleHQgPSBuZXcgVGV4dChkZXN0aW5hdGlvblNlbGVjdGlvbkdyb3VwLCBTV1QuQk9SREVSKTsKLQkJZGVzdGluYXRpb25UZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlkZXN0aW5hdGlvblRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCWRlc3RpbmF0aW9uVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKKyAgICAgICAgdGhpcy5kZXN0aW5hdGlvblRleHQgPSBuZXcgVGV4dChkZXN0aW5hdGlvblNlbGVjdGlvbkdyb3VwLCBTV1QuQk9SREVSKTsKKyAgICAgICAgdGhpcy5kZXN0aW5hdGlvblRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7CisgICAgICAgIHRoaXMuZGVzdGluYXRpb25UZXh0LnNldEVkaXRhYmxlKHRydWUpOworICAgICAgICB0aGlzLmRlc3RpbmF0aW9uVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKIAotCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGRlc3RpbmF0aW9uU2VsZWN0aW9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoIkJyb3dzZS4uLiIpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCBmYWxzZSwgdHJ1ZSkpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVEZXN0aW5hdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7CisgICAgICAgIHRoaXMuYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihkZXN0aW5hdGlvblNlbGVjdGlvbkdyb3VwLCBTV1QuUFVTSCk7CisgICAgICAgIHRoaXMuYnJvd3NlQnV0dG9uLnNldFRleHQoIkJyb3dzZS4uLiIpOworICAgICAgICB0aGlzLmJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCB0cnVlKSk7CisgICAgICAgIHRoaXMuYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewogCi0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIGhhbmRsZURlc3RpbmF0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKIAotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVGaWxlTmFtZSgpOwotCQkJfQotCQl9KTsKKyAgICAgICAgdGhpcy50YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7CiAKLQkJdXBkYXRlRmlsZU5hbWUoKTsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgdXBkYXRlRmlsZU5hbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQkJZmluYWwgQnV0dG9uIG92ZXJ3cml0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oZGVzdGluYXRpb25TZWxlY3Rpb25Hcm91cCwgU1dULkNIRUNLKTsKLQkJb3ZlcndyaXRlQnV0dG9uLnNldFRleHQoIk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlIHdpdGhvdXQgd2FybmluZyIpOworICAgICAgICB1cGRhdGVGaWxlTmFtZSgpOwogCi0JCUdyaWREYXRhIGJ1dHRvbkRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWJ1dHRvbkRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlidXR0b25EYXRhLnZlcnRpY2FsSW5kZW50ID0gNTsKLQkJb3ZlcndyaXRlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uRGF0YSk7Ci0JCW92ZXJ3cml0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOworICAgICAgICBmaW5hbCBCdXR0b24gb3ZlcndyaXRlQnV0dG9uID0gbmV3IEJ1dHRvbihkZXN0aW5hdGlvblNlbGVjdGlvbkdyb3VwLCBTV1QuQ0hFQ0spOworICAgICAgICBvdmVyd3JpdGVCdXR0b24uc2V0VGV4dCgiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgd2l0aG91dCB3YXJuaW5nIik7CiAKLQkJb3ZlcndyaXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3ZlcndyaXRlID0gb3ZlcndyaXRlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9KTsKLQl9CisgICAgICAgIEdyaWREYXRhIGJ1dHRvbkRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIGJ1dHRvbkRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOworICAgICAgICBidXR0b25EYXRhLnZlcnRpY2FsSW5kZW50ID0gNTsKKyAgICAgICAgb3ZlcndyaXRlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uRGF0YSk7CisgICAgICAgIG92ZXJ3cml0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwogCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRmlsZU5hbWUoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRTZWxlY3RlZFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9CisgICAgICAgIG92ZXJ3cml0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKIAotCQlCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdCA9IGdldEJ1bmRsZU1hbmlmZXN0KHByb2plY3QpOwotCQlpZiAobWFuaWZlc3QgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSBnZXRTeW1ib2xpY05hbWUobWFuaWZlc3QpOwotCQkJU3RyaW5nIHZlcnNpb24gPSBnZXRWZXJzaW9uKG1hbmlmZXN0KTsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIEFic3RyYWN0UHJvamVjdEV4cG9ydFdpemFyZFBhZ2UudGhpcy5vdmVyd3JpdGUgPSBvdmVyd3JpdGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KIAotCQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCQlpZiAoZGVzdGluYXRpb25UZXh0LmdldFRleHQoKSAhPSBudWxsKSB7Ci0JCQkJcGF0aCA9IG5ldyBQYXRoKCIiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGF0aCA9IG5ldyBQYXRoKGRlc3RpbmF0aW9uVGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiB2ZXJzaW9uICE9IG51bGwpIHsKLQkJCQlwYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKG5hbWUgKyAiLSIgKyB2ZXJzaW9uICsgZ2V0RXh0ZW5zaW9uKCkpOwotCQkJCWRlc3RpbmF0aW9uVGV4dC5zZXRUZXh0KHBhdGgudG9PU1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVGaWxlTmFtZSgpIHsKKyAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFNlbGVjdGVkUHJvamVjdCgpOworICAgICAgICBpZiAocHJvamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKEJ1bmRsZU1hbmlmZXN0IGJ1bmRsZU1hbmlmZXN0KTsKKyAgICAgICAgQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBnZXRCdW5kbGVNYW5pZmVzdChwcm9qZWN0KTsKKyAgICAgICAgaWYgKG1hbmlmZXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0U3ltYm9saWNOYW1lKG1hbmlmZXN0KTsKKyAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gZ2V0VmVyc2lvbihtYW5pZmVzdCk7CiAKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZlcnNpb24oQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QpOworICAgICAgICAgICAgSVBhdGggcGF0aCA9IG51bGw7CisgICAgICAgICAgICBpZiAodGhpcy5kZXN0aW5hdGlvblRleHQuZ2V0VGV4dCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYXRoID0gbmV3IFBhdGgoIiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXRoID0gbmV3IFBhdGgodGhpcy5kZXN0aW5hdGlvblRleHQuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmVyc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChuYW1lICsgIi0iICsgdmVyc2lvbiArIGdldEV4dGVuc2lvbigpKTsKKyAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uVGV4dC5zZXRUZXh0KHBhdGgudG9PU1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXByb3RlY3RlZCBhYnN0cmFjdCBCdW5kbGVNYW5pZmVzdCBnZXRCdW5kbGVNYW5pZmVzdChJUHJvamVjdCBwcm9qZWN0KTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFN5bWJvbGljTmFtZShCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCk7CiAKLQlwcml2YXRlIHZvaWQgY3JlYXRlSW5wdXRHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZlcnNpb24oQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QpOwogCi0JCXRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCQl0YWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhYmxlVmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEJ1bmRsZU1hbmlmZXN0IGdldEJ1bmRsZU1hbmlmZXN0KElQcm9qZWN0IHByb2plY3QpOwogCi0JCWludCBsYWJlbEZsYWdzID0gSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfQkFTSUNTIHwgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfT1ZFUkxBWV9JQ09OUwotCQkJCXwgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfU01BTExfSUNPTlM7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIHRyZWVDb250ZW50UHJvdmlkZXIgPSBnZXRUcmVlQ29udGVudFByb3ZpZGVyKCk7CisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUlucHV0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgeworICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7CiAKLQkJZmluYWwgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKAotCQkJCWxhYmVsRmxhZ3MpLCBuZXcgUHJvYmxlbXNMYWJlbERlY29yYXRvcihudWxsKSk7CisgICAgICAgIHRoaXMudGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7CisgICAgICAgIHRoaXMudGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICB0aGlzLnRhYmxlVmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7CiAKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHRyZWVDb250ZW50UHJvdmlkZXIpOwotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl0YWJsZVZpZXdlci5hZGRGaWx0ZXIobmV3IEVtcHR5SW5uZXJQYWNrYWdlRmlsdGVyKCkpOwotCQl0YWJsZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBKYXZhRWxlbWVudENvbXBhcmF0b3IoKSk7Ci0JCXRhYmxlVmlld2VyLmFkZEZpbHRlcihnZXRUcmVlVmlld2VyRmlsdGVyKCkpOworICAgICAgICBpbnQgbGFiZWxGbGFncyA9IEphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX0JBU0lDUyB8IEphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX09WRVJMQVlfSUNPTlMKKyAgICAgICAgICAgIHwgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfU01BTExfSUNPTlM7CisgICAgICAgIElUcmVlQ29udGVudFByb3ZpZGVyIHRyZWVDb250ZW50UHJvdmlkZXIgPSBnZXRUcmVlQ29udGVudFByb3ZpZGVyKCk7CiAKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoZ2V0SW5wdXQoKSk7Ci0JCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpbml0aWFsU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOwotCX0KKyAgICAgICAgZmluYWwgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKGxhYmVsRmxhZ3MpLAorICAgICAgICAgICAgbmV3IFByb2JsZW1zTGFiZWxEZWNvcmF0b3IobnVsbCkpOwogCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBnZXREZXN0aW5hdGlvbkxhYmVsKCk7CisgICAgICAgIHRoaXMudGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHRyZWVDb250ZW50UHJvdmlkZXIpOworICAgICAgICB0aGlzLnRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7CisgICAgICAgIHRoaXMudGFibGVWaWV3ZXIuYWRkRmlsdGVyKG5ldyBFbXB0eUlubmVyUGFja2FnZUZpbHRlcigpKTsKKyAgICAgICAgdGhpcy50YWJsZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBKYXZhRWxlbWVudENvbXBhcmF0b3IoKSk7CisgICAgICAgIHRoaXMudGFibGVWaWV3ZXIuYWRkRmlsdGVyKGdldFRyZWVWaWV3ZXJGaWx0ZXIoKSk7CiAKLQkvLyBjb3BpZWQgZnJvbSBBYnN0cmFjdEphckRlc3RpbmF0aW9uV2l6YXJkUGFnZQotCXByaXZhdGUgU3RyaW5nIGdldERlc3RpbmF0aW9uVmFsdWUoKSB7Ci0JCVN0cmluZyBkZXN0aW5hdGlvblN0cmluZyA9IGRlc3RpbmF0aW9uVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAoZGVzdGluYXRpb25TdHJpbmcuaW5kZXhPZignLicpIDwgMCkgewotCQkJZGVzdGluYXRpb25TdHJpbmcgKz0gZ2V0T3V0cHV0U3VmZml4KCk7Ci0JCX0KLQkJcmV0dXJuIGRlc3RpbmF0aW9uU3RyaW5nOwotCX0KKyAgICAgICAgdGhpcy50YWJsZVZpZXdlci5zZXRJbnB1dChnZXRJbnB1dCgpKTsKKyAgICAgICAgdGhpcy50YWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhpcy5pbml0aWFsU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOworICAgIH0KIAotCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCk7CisgICAgYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBnZXREZXN0aW5hdGlvbkxhYmVsKCk7CiAKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldElucHV0KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQl9CisgICAgLy8gY29waWVkIGZyb20gQWJzdHJhY3RKYXJEZXN0aW5hdGlvbldpemFyZFBhZ2UKKyAgICBwcml2YXRlIFN0cmluZyBnZXREZXN0aW5hdGlvblZhbHVlKCkgeworICAgICAgICBTdHJpbmcgZGVzdGluYXRpb25TdHJpbmcgPSB0aGlzLmRlc3RpbmF0aW9uVGV4dC5nZXRUZXh0KCkudHJpbSgpOworICAgICAgICBpZiAoZGVzdGluYXRpb25TdHJpbmcuaW5kZXhPZignLicpIDwgMCkgeworICAgICAgICAgICAgZGVzdGluYXRpb25TdHJpbmcgKz0gZ2V0T3V0cHV0U3VmZml4KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uU3RyaW5nOworICAgIH0KIAotCXB1YmxpYyBJUGF0aCBnZXRKYXJMb2NhdGlvbigpIHsKLQkJcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGRlc3RpbmF0aW9uVGV4dC5nZXRUZXh0KCkpOwotCX0KKyAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbigpOwogCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0T3V0cHV0U3VmZml4KCkgewotCQlyZXR1cm4gIi5qYXIiOwotCX0KKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldElucHV0KCkgeworICAgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKyAgICB9CiAKLQlwdWJsaWMgSVByb2plY3QgZ2V0U2VsZWN0ZWRQcm9qZWN0KCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlPYmplY3RbXSBzZWxlY3RlZEl0ZW1zOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGVkSXRlbXMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGVkSXRlbXMgPSBuZXcgT2JqZWN0WzBdOwotCQl9CisgICAgcHVibGljIElQYXRoIGdldEphckxvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcodGhpcy5kZXN0aW5hdGlvblRleHQuZ2V0VGV4dCgpKTsKKyAgICB9CiAKLQkJZm9yIChPYmplY3Qgc2VsZWN0ZWRJdGVtIDogc2VsZWN0ZWRJdGVtcykgewotCQkJaWYgKHNlbGVjdGVkSXRlbSBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCXJldHVybiAoKElKYXZhUHJvamVjdCkgc2VsZWN0ZWRJdGVtKS5nZXRQcm9qZWN0KCk7Ci0JCQl9IGVsc2UgaWYgKHNlbGVjdGVkSXRlbSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJcmV0dXJuIChJUHJvamVjdCkgc2VsZWN0ZWRJdGVtOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwcml2YXRlIFN0cmluZyBnZXRPdXRwdXRTdWZmaXgoKSB7CisgICAgICAgIHJldHVybiAiLmphciI7CisgICAgfQogCi0JcHJvdGVjdGVkIElUcmVlQ29udGVudFByb3ZpZGVyIGdldFRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7CisgICAgcHVibGljIElQcm9qZWN0IGdldFNlbGVjdGVkUHJvamVjdCgpIHsKKyAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0aGlzLnRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOworICAgICAgICBPYmplY3RbXSBzZWxlY3RlZEl0ZW1zOworICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKyAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMgPSBuZXcgT2JqZWN0WzBdOworICAgICAgICB9CiAKLQkJCXByaXZhdGUgZmluYWwgT2JqZWN0W10gTk9fQ0hJTERSRU4gPSBuZXcgT2JqZWN0WzBdOworICAgICAgICBmb3IgKE9iamVjdCBzZWxlY3RlZEl0ZW0gOiBzZWxlY3RlZEl0ZW1zKSB7CisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoSUphdmFQcm9qZWN0KSBzZWxlY3RlZEl0ZW0pLmdldFByb2plY3QoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRJdGVtIGluc3RhbmNlb2YgSVByb2plY3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKElQcm9qZWN0KSBzZWxlY3RlZEl0ZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQkvLyBubyBvcAotCQkJfQorICAgIHByb3RlY3RlZCBJVHJlZUNvbnRlbnRQcm92aWRlciBnZXRUcmVlQ29udGVudFByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IElUcmVlQ29udGVudFByb3ZpZGVyKCkgewogCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCS8vIG5vIG9wCi0JCQl9CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdFtdIE5PX0NISUxEUkVOID0gbmV3IE9iamVjdFswXTsKIAotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworICAgICAgICAgICAgICAgIC8vIG5vIG9wCisgICAgICAgICAgICB9CiAKLQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICAgICAgICAgIC8vIG5vIG9wCisgICAgICAgICAgICB9CiAKLQkJCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCXJldHVybiBudWxsOwotCQkJfQorICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKKyAgICAgICAgICAgIH0KIAotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlyZXR1cm4gTk9fQ0hJTERSRU47Ci0JCQkJfQotCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBwYXJlbnRFbGVtZW50OwotCQkJCQl0cnkgewotCQkJCQkJcmV0dXJuIGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBOT19DSElMRFJFTjsKLQkJCX0KLQkJfTsKLQl9CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOworICAgICAgICAgICAgfQogCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFZpZXdlckZpbHRlciBnZXRUcmVlVmlld2VyRmlsdGVyKCk7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KIAotCS8vIGNvcGllZCBmcm9tIEFic3RyYWN0SmFyRGVzdGluYXRpb25XaXphcmRQYWdlCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlc3RpbmF0aW9uQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLCBTV1QuU0FWRSk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqIiArIGdldEV4dGVuc2lvbigpIH0pOworICAgICAgICAgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5OT19DSElMRFJFTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7CisgICAgICAgICAgICAgICAgICAgIElDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIHBhcmVudEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLm1lbWJlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuTk9fQ0hJTERSRU47CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQogCi0JCVN0cmluZyBjdXJyZW50U291cmNlU3RyaW5nID0gZ2V0RGVzdGluYXRpb25WYWx1ZSgpOwotCQlpbnQgbGFzdFNlcGFyYXRvckluZGV4ID0gY3VycmVudFNvdXJjZVN0cmluZy5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7Ci0JCWlmIChsYXN0U2VwYXJhdG9ySW5kZXggIT0gLTEpIHsKLQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGN1cnJlbnRTb3VyY2VTdHJpbmcuc3Vic3RyaW5nKDAsIGxhc3RTZXBhcmF0b3JJbmRleCkpOwotCQkJZGlhbG9nLnNldEZpbGVOYW1lKGN1cnJlbnRTb3VyY2VTdHJpbmcuc3Vic3RyaW5nKGxhc3RTZXBhcmF0b3JJbmRleCArIDEsIGN1cnJlbnRTb3VyY2VTdHJpbmcubGVuZ3RoKCkpKTsKLQkJfSBlbHNlIHsKLQkJCWRpYWxvZy5zZXRGaWxlTmFtZShjdXJyZW50U291cmNlU3RyaW5nKTsKLQkJfQotCQlTdHJpbmcgc2VsZWN0ZWRGaWxlTmFtZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZEZpbGVOYW1lICE9IG51bGwpIHsKLQkJCUlDb250YWluZXJbXSBmaW5kQ29udGFpbmVyc0ZvckxvY2F0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpCi0JCQkJCS5nZXRSb290KCkKLQkJCQkJLmZpbmRDb250YWluZXJzRm9yTG9jYXRpb24obmV3IFBhdGgoc2VsZWN0ZWRGaWxlTmFtZSkpOwotCQkJaWYgKGZpbmRDb250YWluZXJzRm9yTG9jYXRpb24ubGVuZ3RoID4gMCkgewotCQkJCXNlbGVjdGVkRmlsZU5hbWUgPSBmaW5kQ29udGFpbmVyc0ZvckxvY2F0aW9uWzBdLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWRlc3RpbmF0aW9uVGV4dC5zZXRUZXh0KHNlbGVjdGVkRmlsZU5hbWUpOwotCQl9Ci0JfQorICAgIGFic3RyYWN0IHByb3RlY3RlZCBWaWV3ZXJGaWx0ZXIgZ2V0VHJlZVZpZXdlckZpbHRlcigpOwogCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCX0KKyAgICAvLyBjb3BpZWQgZnJvbSBBYnN0cmFjdEphckRlc3RpbmF0aW9uV2l6YXJkUGFnZQorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVEZXN0aW5hdGlvbkJyb3dzZUJ1dHRvblByZXNzZWQoKSB7CisgICAgICAgIEZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwgU1dULlNBVkUpOworICAgICAgICBkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKiIgKyBnZXRFeHRlbnNpb24oKSB9KTsKIAotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlTdHJpbmcgdGV4dCA9IGRlc3RpbmF0aW9uVGV4dC5nZXRUZXh0KCk7Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQorICAgICAgICBTdHJpbmcgY3VycmVudFNvdXJjZVN0cmluZyA9IGdldERlc3RpbmF0aW9uVmFsdWUoKTsKKyAgICAgICAgaW50IGxhc3RTZXBhcmF0b3JJbmRleCA9IGN1cnJlbnRTb3VyY2VTdHJpbmcubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOworICAgICAgICBpZiAobGFzdFNlcGFyYXRvckluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICBkaWFsb2cuc2V0RmlsdGVyUGF0aChjdXJyZW50U291cmNlU3RyaW5nLnN1YnN0cmluZygwLCBsYXN0U2VwYXJhdG9ySW5kZXgpKTsKKyAgICAgICAgICAgIGRpYWxvZy5zZXRGaWxlTmFtZShjdXJyZW50U291cmNlU3RyaW5nLnN1YnN0cmluZyhsYXN0U2VwYXJhdG9ySW5kZXggKyAxLCBjdXJyZW50U291cmNlU3RyaW5nLmxlbmd0aCgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaWFsb2cuc2V0RmlsZU5hbWUoY3VycmVudFNvdXJjZVN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHNlbGVjdGVkRmlsZU5hbWUgPSBkaWFsb2cub3BlbigpOworICAgICAgICBpZiAoc2VsZWN0ZWRGaWxlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBJQ29udGFpbmVyW10gZmluZENvbnRhaW5lcnNGb3JMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZENvbnRhaW5lcnNGb3JMb2NhdGlvbihuZXcgUGF0aChzZWxlY3RlZEZpbGVOYW1lKSk7CisgICAgICAgICAgICBpZiAoZmluZENvbnRhaW5lcnNGb3JMb2NhdGlvbi5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRGaWxlTmFtZSA9IGZpbmRDb250YWluZXJzRm9yTG9jYXRpb25bMF0uZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvblRleHQuc2V0VGV4dChzZWxlY3RlZEZpbGVOYW1lKTsKKyAgICAgICAgfQorICAgIH0KIAotCQlpZiAoIXRleHQuZW5kc1dpdGgoZ2V0RXh0ZW5zaW9uKCkpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoIkV4cG9ydCBkZXN0aW5hdGlvbiBtdXN0IGhhdmUgIiArIGdldEV4dGVuc2lvbigpICsgIiBleHRlbnNpb24uIik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworICAgICAgICBzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7CisgICAgfQogCi0JCWlmICh0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZSgiQnVuZGxlIHByb2plY3Qgc2VsZWN0aW9uIG11c3Qgbm90IGJlIGVtcHR5LiIpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gdGhpcy5kZXN0aW5hdGlvblRleHQuZ2V0VGV4dCgpOworICAgICAgICBpZiAodGV4dC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UobnVsbCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICAgICAgaWYgKCF0ZXh0LmVuZHNXaXRoKGdldEV4dGVuc2lvbigpKSkgeworICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKCJFeHBvcnQgZGVzdGluYXRpb24gbXVzdCBoYXZlICIgKyBnZXRFeHRlbnNpb24oKSArICIgZXh0ZW5zaW9uLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRoaXMudGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzZXRFcnJvck1lc3NhZ2UoIkJ1bmRsZSBwcm9qZWN0IHNlbGVjdGlvbiBtdXN0IG5vdCBiZSBlbXB0eS4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZXhwb3J0L0J1bmRsZUV4cG9ydFV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZXhwb3J0L0J1bmRsZUV4cG9ydFV0aWxzLmphdmEKaW5kZXggZGYyNjBlYy4uNDY2YWYwYyAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC9CdW5kbGVFeHBvcnRVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9leHBvcnQvQnVuZGxlRXhwb3J0VXRpbHMuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0OwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKQEAgLTUxLDIwNCArNTIsMTkzIEBACiAKIC8qKgogICogVXRpbGl0eSBjbGFzcyBmb3IgZXhwb3J0aW5nIGJ1bmRsZSBwcm9qZWN0cwotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAYXV0aG9yIFRlcnJ5IEhvbgogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlRXhwb3J0VXRpbHMgewogCi0JLyoqCi0JICogRmluZCBtYW5pZmVzdCBmaWxlIGdpdmVuIGEgamF2YSBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0T3V0cHV0TWFuaWZlc3RGaWxlKElKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7CisgICAgLyoqCisgICAgICogRmluZCBtYW5pZmVzdCBmaWxlIGdpdmVuIGEgamF2YSBwcm9qZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBnZXRPdXRwdXRNYW5pZmVzdEZpbGUoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgdHJ5IHsKIAotCQkJU2V0PElQYXRoPiBvdXRwdXRQYXRocyA9IG5ldyBIYXNoU2V0PElQYXRoPigpOwotCQkJb3V0cHV0UGF0aHMuYWRkKHByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCByb290IDogcm9vdHMpIHsKLQkJCQlpZiAocm9vdCAhPSBudWxsKSB7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeSBjcEVudHJ5ID0gcm9vdC5nZXRSYXdDbGFzc3BhdGhFbnRyeSgpOwotCQkJCQlpZiAoY3BFbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCQkJSVBhdGggbG9jYXRpb24gPSBjcEVudHJ5LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJCW91dHB1dFBhdGhzLmFkZChsb2NhdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBTZXQ8SVBhdGg+IG91dHB1dFBhdGhzID0gbmV3IEhhc2hTZXQ8SVBhdGg+KCk7CisgICAgICAgICAgICBvdXRwdXRQYXRocy5hZGQocHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7CisgICAgICAgICAgICBmb3IgKElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgOiByb290cykgeworICAgICAgICAgICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5IGNwRW50cnkgPSByb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjcEVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCBsb2NhdGlvbiA9IGNwRW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGF0aHMuYWRkKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJZm9yIChJUGF0aCBvdXRwdXRQYXRoIDogb3V0cHV0UGF0aHMpIHsKLQkJCQlJUmVzb3VyY2UgbWFuaWZlc3QgPSBnZXRNYW5pZmVzdEZpbGUob3V0cHV0UGF0aCwgcHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJCWlmIChtYW5pZmVzdCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBtYW5pZmVzdDsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBObyBlcnJvciBoYW5kbGluZyBleGlzdGVkIGJlZm9yZS4gQXJlIHRoZXNlIGV4cGVjdGVkPyEKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gTm8gZXJyb3IgaGFuZGxpbmcgZXhpc3RlZCBiZWZvcmUuIEFyZSB0aGVzZSBleHBlY3RlZD8hCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgICAgICAgICBmb3IgKElQYXRoIG91dHB1dFBhdGggOiBvdXRwdXRQYXRocykgeworICAgICAgICAgICAgICAgIElSZXNvdXJjZSBtYW5pZmVzdCA9IGdldE1hbmlmZXN0RmlsZShvdXRwdXRQYXRoLCBwcm9qZWN0LmdldFByb2plY3QoKSk7CisgICAgICAgICAgICAgICAgaWYgKG1hbmlmZXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hbmlmZXN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIE5vIGVycm9yIGhhbmRsaW5nIGV4aXN0ZWQgYmVmb3JlLiBBcmUgdGhlc2UgZXhwZWN0ZWQ/IQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBObyBlcnJvciBoYW5kbGluZyBleGlzdGVkIGJlZm9yZS4gQXJlIHRoZXNlIGV4cGVjdGVkPyEKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXByaXZhdGUgc3RhdGljIElSZXNvdXJjZSBnZXRNYW5pZmVzdEZpbGUoSVBhdGggb3V0cHV0TG9jYXRpb24sIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlJUGF0aCBwYXRoID0gb3V0cHV0TG9jYXRpb24uYXBwZW5kKEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5NQU5JRkVTVF9GSUxFX0xPQ0FUSU9OKTsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0JCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMocGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMocHJvamVjdFBhdGgpKTsKLQkJSVJlc291cmNlIG1hbmlmZXN0ID0gcHJvamVjdC5maW5kTWVtYmVyKHBhdGgpOwotCQlpZiAobWFuaWZlc3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1hbmlmZXN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBJUmVzb3VyY2UgZ2V0TWFuaWZlc3RGaWxlKElQYXRoIG91dHB1dExvY2F0aW9uLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgSVBhdGggcGF0aCA9IG91dHB1dExvY2F0aW9uLmFwcGVuZChCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uTUFOSUZFU1RfRklMRV9MT0NBVElPTik7CisgICAgICAgIElQYXRoIHByb2plY3RQYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOworICAgICAgICBwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHByb2plY3RQYXRoKSk7CisgICAgICAgIElSZXNvdXJjZSBtYW5pZmVzdCA9IHByb2plY3QuZmluZE1lbWJlcihwYXRoKTsKKyAgICAgICAgaWYgKG1hbmlmZXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGUgZXhwb3J0IG9wZXJhdGlvbiBnaXZlbiBwcm9qZWN0IHRvIGJlIGV4cG9ydGVkIGFuZCBsb2NhdGlvbiBvZiB0aGUgSkFSLgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGphckxvY2F0aW9uCi0JICogQHBhcmFtIHNoZWxsCi0JICogQHBhcmFtIHdhcm5pbmdNZXNzYWdlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElKYXJFeHBvcnRSdW5uYWJsZSBjcmVhdGVFeHBvcnRPcGVyYXRpb24oSUphdmFQcm9qZWN0IHByb2plY3QsIElQYXRoIGphckxvY2F0aW9uLCBTaGVsbCBzaGVsbCwKLQkJCUxpc3Q8SVN0YXR1cz4gd2FybmluZ3MpIHsKLQkJSmFyUGFja2FnZURhdGEgamFyUGFja2FnZSA9IG5ldyBKYXJQYWNrYWdlRGF0YSgpOwotCQlqYXJQYWNrYWdlLnNldEphckxvY2F0aW9uKGphckxvY2F0aW9uKTsKLQkJamFyUGFja2FnZS5zZXRFeHBvcnRDbGFzc0ZpbGVzKHRydWUpOwotCQlqYXJQYWNrYWdlLnNldEV4cG9ydEphdmFGaWxlcyhmYWxzZSk7Ci0JCWphclBhY2thZ2Uuc2V0T3ZlcndyaXRlKHRydWUpOwotCQlqYXJQYWNrYWdlLnNldEV4cG9ydEVycm9ycyh0cnVlKTsKLQkJamFyUGFja2FnZS5zZXRFeHBvcnRXYXJuaW5ncyh0cnVlKTsKLQkJamFyUGFja2FnZS5zZXRCdWlsZElmTmVlZGVkKHRydWUpOworICAgIC8qKgorICAgICAqIENyZWF0ZSBleHBvcnQgb3BlcmF0aW9uIGdpdmVuIHByb2plY3QgdG8gYmUgZXhwb3J0ZWQgYW5kIGxvY2F0aW9uIG9mIHRoZSBKQVIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdAorICAgICAqIEBwYXJhbSBqYXJMb2NhdGlvbgorICAgICAqIEBwYXJhbSBzaGVsbAorICAgICAqIEBwYXJhbSB3YXJuaW5nTWVzc2FnZXMKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJSmFyRXhwb3J0UnVubmFibGUgY3JlYXRlRXhwb3J0T3BlcmF0aW9uKElKYXZhUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBqYXJMb2NhdGlvbiwgU2hlbGwgc2hlbGwsIExpc3Q8SVN0YXR1cz4gd2FybmluZ3MpIHsKKyAgICAgICAgSmFyUGFja2FnZURhdGEgamFyUGFja2FnZSA9IG5ldyBKYXJQYWNrYWdlRGF0YSgpOworICAgICAgICBqYXJQYWNrYWdlLnNldEphckxvY2F0aW9uKGphckxvY2F0aW9uKTsKKyAgICAgICAgamFyUGFja2FnZS5zZXRFeHBvcnRDbGFzc0ZpbGVzKHRydWUpOworICAgICAgICBqYXJQYWNrYWdlLnNldEV4cG9ydEphdmFGaWxlcyhmYWxzZSk7CisgICAgICAgIGphclBhY2thZ2Uuc2V0T3ZlcndyaXRlKHRydWUpOworICAgICAgICBqYXJQYWNrYWdlLnNldEV4cG9ydEVycm9ycyh0cnVlKTsKKyAgICAgICAgamFyUGFja2FnZS5zZXRFeHBvcnRXYXJuaW5ncyh0cnVlKTsKKyAgICAgICAgamFyUGFja2FnZS5zZXRCdWlsZElmTmVlZGVkKHRydWUpOwogCi0JCVNldDxPYmplY3Q+IG91dHB1dEZpbGVzID0gbmV3IExpbmtlZEhhc2hTZXQ8T2JqZWN0PigpOworICAgICAgICBTZXQ8T2JqZWN0PiBvdXRwdXRGaWxlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PE9iamVjdD4oKTsKIAotCQl0cnkgewotCQkJU2V0PElDbGFzc3BhdGhFbnRyeT4gZW50cmllcyA9IFNlcnZlck1vZHVsZURlbGVnYXRlLmdldFNvdXJjZUNsYXNzcGF0aEVudHJpZXMocHJvamVjdC5nZXRQcm9qZWN0KCksIGZhbHNlKTsKLQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IHByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSkgewotCQkJCWlmIChlbnRyaWVzLmNvbnRhaW5zKHJvb3QuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKSkpIHsKLQkJCQkJb3V0cHV0RmlsZXMuYWRkKHJvb3QpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gYWRkIGVycm9yIGhhbmRsaW5nCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCQlqYXJQYWNrYWdlLnNldEVsZW1lbnRzKG91dHB1dEZpbGVzLnRvQXJyYXkoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZXQ8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzID0gU2VydmVyTW9kdWxlRGVsZWdhdGUuZ2V0U291cmNlQ2xhc3NwYXRoRW50cmllcyhwcm9qZWN0LmdldFByb2plY3QoKSwgZmFsc2UpOworICAgICAgICAgICAgZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCByb290IDogcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJpZXMuY29udGFpbnMocm9vdC5nZXRSYXdDbGFzc3BhdGhFbnRyeSgpKSkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlcy5hZGQocm9vdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gVE9ETyBhZGQgZXJyb3IgaGFuZGxpbmcKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIGphclBhY2thZ2Uuc2V0RWxlbWVudHMob3V0cHV0RmlsZXMudG9BcnJheSgpKTsKIAotCQlzZXRNYW5pZmVzdEZpbGUocHJvamVjdCwgamFyUGFja2FnZSwgc2hlbGwsIHdhcm5pbmdzKTsKKyAgICAgICAgc2V0TWFuaWZlc3RGaWxlKHByb2plY3QsIGphclBhY2thZ2UsIHNoZWxsLCB3YXJuaW5ncyk7CiAKLQkJcmV0dXJuIGphclBhY2thZ2UuY3JlYXRlSmFyRXhwb3J0UnVubmFibGUoc2hlbGwpOwotCX0KKyAgICAgICAgcmV0dXJuIGphclBhY2thZ2UuY3JlYXRlSmFyRXhwb3J0UnVubmFibGUoc2hlbGwpOworICAgIH0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0TWFuaWZlc3RGaWxlKElKYXZhUHJvamVjdCBwcm9qZWN0LCBKYXJQYWNrYWdlRGF0YSBqYXJQYWNrYWdlLCBTaGVsbCBzaGVsbCwKLQkJCUxpc3Q8SVN0YXR1cz4gd2FybmluZ3MpIHsKLQkJSVJlc291cmNlIG1hbmlmZXN0ID0gZ2V0T3V0cHV0TWFuaWZlc3RGaWxlKHByb2plY3QpOwotCQlpZiAobWFuaWZlc3QgIT0gbnVsbCkgewotCQkJRmlsZSBtYW5pZmVzdEZpbGUgPSBtYW5pZmVzdC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOwotCQkJYm9vbGVhbiBleGlzdHMgPSBtYW5pZmVzdEZpbGUuZXhpc3RzKCk7Ci0JCQlpZiAoZXhpc3RzKSB7Ci0JCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyOwotCQkJCXRyeSB7Ci0JCQkJCXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihtYW5pZmVzdEZpbGUpKTsKLQkJCQkJY2hhciBjaGFyYWN0b3IgPSAnYSc7Ci0JCQkJCXdoaWxlIChyZWFkZXIucmVhZHkoKSkgewotCQkJCQkJY2hhcmFjdG9yID0gKGNoYXIpIHJlYWRlci5yZWFkKCk7Ci0JCQkJCX0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldE1hbmlmZXN0RmlsZShJSmF2YVByb2plY3QgcHJvamVjdCwgSmFyUGFja2FnZURhdGEgamFyUGFja2FnZSwgU2hlbGwgc2hlbGwsIExpc3Q8SVN0YXR1cz4gd2FybmluZ3MpIHsKKyAgICAgICAgSVJlc291cmNlIG1hbmlmZXN0ID0gZ2V0T3V0cHV0TWFuaWZlc3RGaWxlKHByb2plY3QpOworICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgRmlsZSBtYW5pZmVzdEZpbGUgPSBtYW5pZmVzdC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpOworICAgICAgICAgICAgYm9vbGVhbiBleGlzdHMgPSBtYW5pZmVzdEZpbGUuZXhpc3RzKCk7CisgICAgICAgICAgICBpZiAoZXhpc3RzKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihtYW5pZmVzdEZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjaGFyYWN0b3IgPSAnYSc7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIucmVhZHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdG9yID0gKGNoYXIpIHJlYWRlci5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJCQlpZiAoY2hhcmFjdG9yICE9ICdcbicpIHsKLQkJCQkJCXdhcm5pbmdzLmFkZChuZXcgU3RhdHVzKAotCQkJCQkJCQlTdGF0dXMuV0FSTklORywKLQkJCQkJCQkJU2VydmVyRXhwb3J0UGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkJIk1hbmlmZXN0IGZpbGUgZm9yIHByb2plY3QgIgotCQkJCQkJCQkJCSsgcHJvamVjdC5nZXRFbGVtZW50TmFtZSgpCi0JCQkJCQkJCQkJKyAiIGlzIG1pc3NpbmcgYSAnXFxuJyBhdCB0aGUgZW5kIG9mIGZpbGUuIFRoZSBleHBvcnRlZCBidW5kbGUgbWlnaHQgbm90IHdvcmsgcHJvcGVybHkuIikpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQkJamFyUGFja2FnZS5zZXRHZW5lcmF0ZU1hbmlmZXN0KGZhbHNlKTsKLQkJCQlqYXJQYWNrYWdlLnNldE1hbmlmZXN0TG9jYXRpb24obWFuaWZlc3QuZ2V0RnVsbFBhdGgoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWphclBhY2thZ2Uuc2V0R2VuZXJhdGVNYW5pZmVzdCh0cnVlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWphclBhY2thZ2Uuc2V0R2VuZXJhdGVNYW5pZmVzdCh0cnVlKTsKLQkJfQotCX0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJhY3RvciAhPSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFNlcnZlckV4cG9ydFBsdWdpbi5QTFVHSU5fSUQsICJNYW5pZmVzdCBmaWxlIGZvciBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldEVsZW1lbnROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbWlzc2luZyBhICdcXG4nIGF0IHRoZSBlbmQgb2YgZmlsZS4gVGhlIGV4cG9ydGVkIGJ1bmRsZSBtaWdodCBub3Qgd29yayBwcm9wZXJseS4iKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBqYXJQYWNrYWdlLnNldEdlbmVyYXRlTWFuaWZlc3QoZmFsc2UpOworICAgICAgICAgICAgICAgIGphclBhY2thZ2Uuc2V0TWFuaWZlc3RMb2NhdGlvbihtYW5pZmVzdC5nZXRGdWxsUGF0aCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgamFyUGFja2FnZS5zZXRHZW5lcmF0ZU1hbmlmZXN0KHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgamFyUGFja2FnZS5zZXRHZW5lcmF0ZU1hbmlmZXN0KHRydWUpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogVXRpbCBtZXRob2QgZm9yIHJ1bm5pbmcgSUphckV4cG9ydFJ1bm5hYmxlIG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb3AKLQkgKiAgICAgICAgICAgIGV4cG9ydCBKQVIgb3BlcmF0aW9uCi0JICogQHBhcmFtIHJlcG9ydFN0YXR1cwotCSAqICAgICAgICAgICAgdHJ1ZSBpZiBleHBvcnQgZXJyb3JzIGFyZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgcnVubmFibGUgY29udGV4dAotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEBwYXJhbSB3YXJuaW5nTWVzc2FnZXMKLQkgKiBAcmV0dXJuIGlmIG9wZXJhdGlvbiB3YXMgcGVyZm9ybWVkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlRXhwb3J0T3BlcmF0aW9uKElKYXJFeHBvcnRSdW5uYWJsZSBvcCwgYm9vbGVhbiByZXBvcnRTdGF0dXMsIElSdW5uYWJsZUNvbnRleHQgY29udGV4dCwKLQkJCVNoZWxsIHNoZWxsLCBMaXN0PElTdGF0dXM+IHdhcm5pbmdzKSB7Ci0JCXRyeSB7Ci0JCQljb250ZXh0LnJ1bih0cnVlLCB0cnVlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJSVN0YXR1cyBzdGF0dXMgPSBvcC5nZXRTdGF0dXMoKTsKLQkJaWYgKCh3YXJuaW5ncy5zaXplKCkgPiAwIHx8ICFzdGF0dXMuaXNPSygpKSAmJiByZXBvcnRTdGF0dXMpIHsKLQkJCUxpc3Q8SVN0YXR1cz4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KCk7Ci0JCQlmb3IgKElTdGF0dXMgY2hpbGQgOiBzdGF0dXMuZ2V0Q2hpbGRyZW4oKSkgewotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQl9Ci0JCQljaGlsZHJlbi5hZGRBbGwod2FybmluZ3MpOworICAgIC8qKgorICAgICAqIFV0aWwgbWV0aG9kIGZvciBydW5uaW5nIElKYXJFeHBvcnRSdW5uYWJsZSBvcGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3AgZXhwb3J0IEpBUiBvcGVyYXRpb24KKyAgICAgKiBAcGFyYW0gcmVwb3J0U3RhdHVzIHRydWUgaWYgZXhwb3J0IGVycm9ycyBhcmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyCisgICAgICogQHBhcmFtIGNvbnRleHQgcnVubmFibGUgY29udGV4dAorICAgICAqIEBwYXJhbSBzaGVsbAorICAgICAqIEBwYXJhbSB3YXJuaW5nTWVzc2FnZXMKKyAgICAgKiBAcmV0dXJuIGlmIG9wZXJhdGlvbiB3YXMgcGVyZm9ybWVkIHN1Y2Nlc3NmdWxseQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBleGVjdXRlRXhwb3J0T3BlcmF0aW9uKElKYXJFeHBvcnRSdW5uYWJsZSBvcCwgYm9vbGVhbiByZXBvcnRTdGF0dXMsIElSdW5uYWJsZUNvbnRleHQgY29udGV4dCwgU2hlbGwgc2hlbGwsCisgICAgICAgIExpc3Q8SVN0YXR1cz4gd2FybmluZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnRleHQucnVuKHRydWUsIHRydWUsIG9wKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBpZiAoZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IG9wLmdldFN0YXR1cygpOworICAgICAgICBpZiAoKHdhcm5pbmdzLnNpemUoKSA+IDAgfHwgIXN0YXR1cy5pc09LKCkpICYmIHJlcG9ydFN0YXR1cykgeworICAgICAgICAgICAgTGlzdDxJU3RhdHVzPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oKTsKKyAgICAgICAgICAgIGZvciAoSVN0YXR1cyBjaGlsZCA6IHN0YXR1cy5nZXRDaGlsZHJlbigpKSB7CisgICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKGNoaWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoaWxkcmVuLmFkZEFsbCh3YXJuaW5ncyk7CiAKLQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlckV4cG9ydFBsdWdpbi5QTFVHSU5fSUQsICFzdGF0dXMuaXNPSygpCi0JCQkJCT8gc3RhdHVzLmdldENvZGUoKQotCQkJCQk6IFN0YXR1cy5XQVJOSU5HLCBjaGlsZHJlbi50b0FycmF5KG5ldyBTdGF0dXNbMF0pLCAhc3RhdHVzLmlzT0soKQotCQkJCQk/IHN0YXR1cy5nZXRNZXNzYWdlKCkKLQkJCQkJOiAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBleHBvcnRpbmcgYnVuZGxlIHByb2plY3QuIENsaWNrIERldGFpbHMgdG8gc2VlIG1vcmUuLi4iLCBudWxsKTsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgIkV4cG9ydCBXYXJuaW5nIiwgbnVsbCwgbXVsdGlTdGF0dXMpOwotCQkJcmV0dXJuICEoc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICAgICAgICAgIE11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFNlcnZlckV4cG9ydFBsdWdpbi5QTFVHSU5fSUQsICFzdGF0dXMuaXNPSygpID8gc3RhdHVzLmdldENvZGUoKSA6IElTdGF0dXMuV0FSTklORywKKyAgICAgICAgICAgICAgICBjaGlsZHJlbi50b0FycmF5KG5ldyBTdGF0dXNbMF0pLAorICAgICAgICAgICAgICAgICFzdGF0dXMuaXNPSygpID8gc3RhdHVzLmdldE1lc3NhZ2UoKSA6ICJUaGVyZSB3ZXJlIHdhcm5pbmdzIHdoaWxlIGV4cG9ydGluZyBidW5kbGUgcHJvamVjdC4gQ2xpY2sgRGV0YWlscyB0byBzZWUgbW9yZS4uLiIsIG51bGwpOworICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCAiRXhwb3J0IFdhcm5pbmciLCBudWxsLCBtdWx0aVN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGV4ZWN1dGVXYXJFeHBvcnRPcGVyYXRpb24oSVByb2plY3QgYnVuZGxlUHJvamVjdCwgU3RyaW5nIGphck5hbWUsIElGb2xkZXIgc2V0dGluZ3NGb2xkZXIpIHsKLQkJV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKTsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChwcm92aWRlcik7Ci0JCXByb3ZpZGVyLnByb3BlcnR5U2V0KElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIGJ1bmRsZVByb2plY3QuZ2V0TmFtZSgpKTsKLQkJZGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1BUSU1JWkVfRk9SX1NQRUNJRklDX1JVTlRJTUUsIGZhbHNlKTsKLQkJZGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRVhQT1JUX1NPVVJDRV9GSUxFUywgZmFsc2UpOwotCQlkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfRVhJU1RJTkcsIHRydWUpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfREVTVElOQVRJT04sCi0JCQkJc2V0dGluZ3NGb2xkZXIuZ2V0UmF3TG9jYXRpb24oKS5hcHBlbmQoamFyTmFtZSkudG9TdHJpbmcoKSk7Ci0JCVdlYkNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV2ViQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uKGRhdGFNb2RlbCk7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZVdhckV4cG9ydE9wZXJhdGlvbihJUHJvamVjdCBidW5kbGVQcm9qZWN0LCBTdHJpbmcgamFyTmFtZSwgSUZvbGRlciBzZXR0aW5nc0ZvbGRlcikgeworICAgICAgICBXZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlciBwcm92aWRlciA9IG5ldyBXZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpOworICAgICAgICBJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKHByb3ZpZGVyKTsKKyAgICAgICAgcHJvdmlkZXIucHJvcGVydHlTZXQoSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgYnVuZGxlUHJvamVjdC5nZXROYW1lKCkpOworICAgICAgICBkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PUFRJTUlaRV9GT1JfU1BFQ0lGSUNfUlVOVElNRSwgZmFsc2UpOworICAgICAgICBkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5FWFBPUlRfU09VUkNFX0ZJTEVTLCBmYWxzZSk7CisgICAgICAgIGRhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJXUklURV9FWElTVElORywgdHJ1ZSk7CisgICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVJDSElWRV9ERVNUSU5BVElPTiwKKyAgICAgICAgICAgIHNldHRpbmdzRm9sZGVyLmdldFJhd0xvY2F0aW9uKCkuYXBwZW5kKGphck5hbWUpLnRvU3RyaW5nKCkpOworICAgICAgICBXZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdlYkNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbihkYXRhTW9kZWwpOwogCi0JCXRyeSB7Ci0JCQlvcGVyYXRpb24uZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCXNldHRpbmdzRm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9wZXJhdGlvbi5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOworICAgICAgICAgICAgc2V0dGluZ3NGb2xkZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogCi0JCXJldHVybiB0cnVlOwotCX0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZXhwb3J0L0J1bmRsZUV4cG9ydFdpemFyZC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC9CdW5kbGVFeHBvcnRXaXphcmQuamF2YQppbmRleCAwNjcwMjMxLi41NDM5NjU3IDEwMDc1NQotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZXhwb3J0L0J1bmRsZUV4cG9ydFdpemFyZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9leHBvcnQvQnVuZGxlRXhwb3J0V2l6YXJkLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0yNiw0OSArMjcsNDggQEAKIAogLyoqCiAgKiBFeHBvcnQgd2l6YXJkIGZvciBleHBvcnRpbmcgYnVuZGxlIHByb2plY3QKLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBUZXJyeSBIb24KICAqLwogcHVibGljIGNsYXNzIEJ1bmRsZUV4cG9ydFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElFeHBvcnRXaXphcmQgewogCi0JcHJpdmF0ZSBCdW5kbGVFeHBvcnRXaXphcmRQYWdlIHdpemFyZFBhZ2U7CisgICAgcHJpdmF0ZSBCdW5kbGVFeHBvcnRXaXphcmRQYWdlIHdpemFyZFBhZ2U7CiAKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKKyAgICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9ICJCdW5kbGUgRXhwb3J0IFdpemFyZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gIkJ1bmRsZSBFeHBvcnQgV2l6YXJkIjsKIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQl3aXphcmRQYWdlID0gbmV3IEJ1bmRsZUV4cG9ydFdpemFyZFBhZ2Uoc2VsZWN0aW9uKTsKLQkJYWRkUGFnZSh3aXphcmRQYWdlKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7CisgICAgICAgIHRoaXMud2l6YXJkUGFnZSA9IG5ldyBCdW5kbGVFeHBvcnRXaXphcmRQYWdlKHRoaXMuc2VsZWN0aW9uKTsKKyAgICAgICAgYWRkUGFnZSh0aGlzLndpemFyZFBhZ2UpOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHdpemFyZFBhZ2UuZ2V0U2VsZWN0ZWRQcm9qZWN0KCkpOwotCQlJUGF0aCBqYXJMb2NhdGlvbiA9IHdpemFyZFBhZ2UuZ2V0SmFyTG9jYXRpb24oKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgeworICAgICAgICBJSmF2YVByb2plY3QgcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZSh0aGlzLndpemFyZFBhZ2UuZ2V0U2VsZWN0ZWRQcm9qZWN0KCkpOworICAgICAgICBJUGF0aCBqYXJMb2NhdGlvbiA9IHRoaXMud2l6YXJkUGFnZS5nZXRKYXJMb2NhdGlvbigpOwogCi0JCWlmIChqYXJMb2NhdGlvbi50b0ZpbGUoKS5leGlzdHMoKSAmJiAhd2l6YXJkUGFnZS5nZXRPdmVyd3JpdGUoKSkgewotCQkJYm9vbGVhbiBvdmVyd3JpdGUgPSBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRTaGVsbCgpLCAiT3ZlcndyaXRlIEZpbGUiLAotCQkJCQkiVGhlIGZpbGUgIiArIGphckxvY2F0aW9uLnRvT1NTdHJpbmcoKQotCQkJCQkJCSsgIiBhbHJlYWR5IGV4aXN0cy4gRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBmaWxlPyIpOwotCQkJaWYgKCFvdmVyd3JpdGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKGphckxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpICYmICF0aGlzLndpemFyZFBhZ2UuZ2V0T3ZlcndyaXRlKCkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gb3ZlcndyaXRlID0gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oZ2V0U2hlbGwoKSwgIk92ZXJ3cml0ZSBGaWxlIiwKKyAgICAgICAgICAgICAgICAiVGhlIGZpbGUgIiArIGphckxvY2F0aW9uLnRvT1NTdHJpbmcoKSArICIgYWxyZWFkeSBleGlzdHMuIERvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgZmlsZT8iKTsKKyAgICAgICAgICAgIGlmICghb3ZlcndyaXRlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJTGlzdDxJU3RhdHVzPiB3YXJuaW5ncyA9IG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oKTsKLQkJSUphckV4cG9ydFJ1bm5hYmxlIG9wID0gQnVuZGxlRXhwb3J0VXRpbHMuY3JlYXRlRXhwb3J0T3BlcmF0aW9uKHByb2plY3QsIGphckxvY2F0aW9uLCBnZXRTaGVsbCgpLCB3YXJuaW5ncyk7CisgICAgICAgIExpc3Q8SVN0YXR1cz4gd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KCk7CisgICAgICAgIElKYXJFeHBvcnRSdW5uYWJsZSBvcCA9IEJ1bmRsZUV4cG9ydFV0aWxzLmNyZWF0ZUV4cG9ydE9wZXJhdGlvbihwcm9qZWN0LCBqYXJMb2NhdGlvbiwgZ2V0U2hlbGwoKSwgd2FybmluZ3MpOwogCi0JCXJldHVybiBCdW5kbGVFeHBvcnRVdGlscy5leGVjdXRlRXhwb3J0T3BlcmF0aW9uKG9wLCB0cnVlLCBnZXRDb250YWluZXIoKSwgZ2V0U2hlbGwoKSwgd2FybmluZ3MpOwotCX0KKyAgICAgICAgcmV0dXJuIEJ1bmRsZUV4cG9ydFV0aWxzLmV4ZWN1dGVFeHBvcnRPcGVyYXRpb24ob3AsIHRydWUsIGdldENvbnRhaW5lcigpLCBnZXRTaGVsbCgpLCB3YXJuaW5ncyk7CisgICAgfQogCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZShUSVRMRSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKFNlcnZlckV4cG9ydFBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvd2l6YmFuL3dpemJhbi1idW5kbGUucG5nIikpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9CisgICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOworICAgICAgICBzZXRXaW5kb3dUaXRsZShUSVRMRSk7CisgICAgICAgIHNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKFNlcnZlckV4cG9ydFBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvd2l6YmFuL3dpemJhbi1idW5kbGUucG5nIikpOworICAgICAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9leHBvcnQvQnVuZGxlRXhwb3J0V2l6YXJkUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC9CdW5kbGVFeHBvcnRXaXphcmRQYWdlLmphdmEKaW5kZXggNjZlMDFiYi4uOGI1NzJiYSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC9CdW5kbGVFeHBvcnRXaXphcmRQYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC9CdW5kbGVFeHBvcnRXaXphcmRQYWdlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwpAQCAtMjUsNzYgKzI2LDc2IEBACiAKIC8qKgogICogRXhwb3J0IHdpemFyZCBwYWdlIGZvciBleHBvcnRpbmcgYnVuZGxlIHByb2plY3QKLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBUZXJyeSBIb24KICAqIEBhdXRob3IgTGVvIERvcyBTYW50b3MKICAqLwogcHVibGljIGNsYXNzIEJ1bmRsZUV4cG9ydFdpemFyZFBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByb2plY3RFeHBvcnRXaXphcmRQYWdlIHsKIAotCXB1YmxpYyBCdW5kbGVFeHBvcnRXaXphcmRQYWdlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcigiYnVuZGxlRXhwb3J0V2l6YXJkUGFnZSIsIHNlbGVjdGlvbik7CisgICAgcHVibGljIEJ1bmRsZUV4cG9ydFdpemFyZFBhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisgICAgICAgIHN1cGVyKCJidW5kbGVFeHBvcnRXaXphcmRQYWdlIiwgc2VsZWN0aW9uKTsKIAotCQlzZXRUaXRsZSgiSkFSIEZpbGUgU3BlY2lmaWNhdGlvbiIpOwotCQlzZXREZXNjcmlwdGlvbigiRGVmaW5lIHdoaWNoIGJ1bmRsZSBwcm9qZWN0IHNob3VsZCBiZSBleHBvcnRlZCBpbnRvIHRoZSBKQVIuIik7Ci0JfQorICAgICAgICBzZXRUaXRsZSgiSkFSIEZpbGUgU3BlY2lmaWNhdGlvbiIpOworICAgICAgICBzZXREZXNjcmlwdGlvbigiRGVmaW5lIHdoaWNoIGJ1bmRsZSBwcm9qZWN0IHNob3VsZCBiZSBleHBvcnRlZCBpbnRvIHRoZSBKQVIuIik7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFZpZXdlckZpbHRlciBnZXRUcmVlVmlld2VyRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IFZpZXdlckZpbHRlcigpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVmlld2VyRmlsdGVyIGdldFRyZWVWaWV3ZXJGaWx0ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgVmlld2VyRmlsdGVyKCkgewogCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQ7Ci0JCQkJCXJldHVybiAhcm9vdC5pc0FyY2hpdmUoKSAmJiAhcm9vdC5pc0V4dGVybmFsKCk7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQkJCWlmIChmYWNldGVkUHJvamVjdCA9PSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoCi0JCQkJCQkJCUZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQpLmdldERlZmF1bHRWZXJzaW9uKCkpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgeworICAgICAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXJvb3QuaXNBcmNoaXZlKCkgJiYgIXJvb3QuaXNFeHRlcm5hbCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjZXRlZFByb2plY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQpLmdldERlZmF1bHRWZXJzaW9uKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiLmphciI7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgeworICAgICAgICByZXR1cm4gIi5qYXIiOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzdGluYXRpb25MYWJlbCgpIHsKLQkJcmV0dXJuICJKQVIgZmlsZToiOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlc3RpbmF0aW9uTGFiZWwoKSB7CisgICAgICAgIHJldHVybiAiSkFSIGZpbGU6IjsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN5bWJvbGljTmFtZShCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCkgewotCQlpZiAoYnVuZGxlTWFuaWZlc3QuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGJ1bmRsZU1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN5bWJvbGljTmFtZShCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCkgeworICAgICAgICBpZiAoYnVuZGxlTWFuaWZlc3QuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZU1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpLmdldFN5bWJvbGljTmFtZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyc2lvbihCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCkgewotCQlyZXR1cm4gKGJ1bmRsZU1hbmlmZXN0LmdldEJ1bmRsZVZlcnNpb24oKSAhPSBudWxsID8gYnVuZGxlTWFuaWZlc3QuZ2V0QnVuZGxlVmVyc2lvbigpLnRvU3RyaW5nKCkgOiAiIik7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyc2lvbihCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCkgeworICAgICAgICByZXR1cm4gYnVuZGxlTWFuaWZlc3QuZ2V0QnVuZGxlVmVyc2lvbigpICE9IG51bGwgPyBidW5kbGVNYW5pZmVzdC5nZXRCdW5kbGVWZXJzaW9uKCkudG9TdHJpbmcoKSA6ICIiOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCdW5kbGVNYW5pZmVzdCBnZXRCdW5kbGVNYW5pZmVzdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCXJldHVybiBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0QnVuZGxlTWFuaWZlc3QoSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEJ1bmRsZU1hbmlmZXN0IGdldEJ1bmRsZU1hbmlmZXN0KElQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5nZXRCdW5kbGVNYW5pZmVzdE1hbmFnZXIoKS5nZXRCdW5kbGVNYW5pZmVzdChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC9QYXJFeHBvcnRXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9leHBvcnQvUGFyRXhwb3J0V2l6YXJkLmphdmEKaW5kZXggMmUxMjQwNy4uM2QyYjIwNSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC9QYXJFeHBvcnRXaXphcmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZXhwb3J0L1BhckV4cG9ydFdpemFyZC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMjYsNyArMjcsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwpAQCAtNTUsMTc1ICs1NSwxNjggQEAKIAogLyoqCiAgKiBFeHBvcnQgd2l6YXJkIGZvciBleHBvcnRpbmcgcGFyIHByb2plY3QKLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBUZXJyeSBIb24KICAqLwogcHVibGljIGNsYXNzIFBhckV4cG9ydFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElFeHBvcnRXaXphcmQgewogCi0JcHJpdmF0ZSBQYXJFeHBvcnRXaXphcmRQYWdlIHdpemFyZFBhZ2U7CisgICAgcHJpdmF0ZSBQYXJFeHBvcnRXaXphcmRQYWdlIHdpemFyZFBhZ2U7CiAKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKKyAgICBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9ICJQYXIgRXhwb3J0IFdpemFyZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gIlBhciBFeHBvcnQgV2l6YXJkIjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJfRklMRV9OQU1FID0gIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnBhci54bWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJfRklMRV9OQU1FID0gIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnBhci54bWwiOwogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXdpemFyZFBhZ2UgPSBuZXcgUGFyRXhwb3J0V2l6YXJkUGFnZShzZWxlY3Rpb24pOwotCQlhZGRQYWdlKHdpemFyZFBhZ2UpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKKyAgICAgICAgdGhpcy53aXphcmRQYWdlID0gbmV3IFBhckV4cG9ydFdpemFyZFBhZ2UodGhpcy5zZWxlY3Rpb24pOworICAgICAgICBhZGRQYWdlKHRoaXMud2l6YXJkUGFnZSk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHdpemFyZFBhZ2UuZ2V0U2VsZWN0ZWRQcm9qZWN0KCk7Ci0JCUlQYXRoIGphckxvY2F0aW9uID0gd2l6YXJkUGFnZS5nZXRKYXJMb2NhdGlvbigpOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7CisgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSB0aGlzLndpemFyZFBhZ2UuZ2V0U2VsZWN0ZWRQcm9qZWN0KCk7CisgICAgICAgIElQYXRoIGphckxvY2F0aW9uID0gdGhpcy53aXphcmRQYWdlLmdldEphckxvY2F0aW9uKCk7CiAKLQkJaWYgKGphckxvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpICYmICF3aXphcmRQYWdlLmdldE92ZXJ3cml0ZSgpKSB7Ci0JCQlib29sZWFuIG92ZXJ3cml0ZSA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKGdldFNoZWxsKCksICJPdmVyd3JpdGUgRmlsZSIsCi0JCQkJCSJUaGUgZmlsZSAiICsgamFyTG9jYXRpb24udG9PU1N0cmluZygpCi0JCQkJCQkJKyAiIGFscmVhZHkgZXhpc3RzLiBEbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGZpbGU/Iik7Ci0JCQlpZiAoIW92ZXJ3cml0ZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoamFyTG9jYXRpb24udG9GaWxlKCkuZXhpc3RzKCkgJiYgIXRoaXMud2l6YXJkUGFnZS5nZXRPdmVyd3JpdGUoKSkgeworICAgICAgICAgICAgYm9vbGVhbiBvdmVyd3JpdGUgPSBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRTaGVsbCgpLCAiT3ZlcndyaXRlIEZpbGUiLAorICAgICAgICAgICAgICAgICJUaGUgZmlsZSAiICsgamFyTG9jYXRpb24udG9PU1N0cmluZygpICsgIiBhbHJlYWR5IGV4aXN0cy4gRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBmaWxlPyIpOworICAgICAgICAgICAgaWYgKCFvdmVyd3JpdGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlyZXR1cm4gZXhwb3J0UGFyKHByb2plY3QsIGphckxvY2F0aW9uLCBnZXRDb250YWluZXIoKSwgZ2V0U2hlbGwoKSk7Ci0JfQorICAgICAgICByZXR1cm4gZXhwb3J0UGFyKHByb2plY3QsIGphckxvY2F0aW9uLCBnZXRDb250YWluZXIoKSwgZ2V0U2hlbGwoKSk7CisgICAgfQogCi0JLy8gcHVibGljIGZvciB0ZXN0aW5nCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGV4cG9ydFBhcihJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBwYXJMb2NhdGlvbiwgSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0LCBTaGVsbCBzaGVsbCkgewotCQlJRmlsZSBwYXJGaWxlID0gcHJvamVjdC5nZXRGaWxlKFBBUl9GSUxFX05BTUUpOwotCQlJRm9sZGVyIHNldHRpbmdzRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoIi5zZXR0aW5ncyIpOwotCQlJUGF0aCBzZXR0aW5nc1BhdGggPSBzZXR0aW5nc0ZvbGRlci5nZXRMb2NhdGlvbigpOworICAgIC8vIHB1YmxpYyBmb3IgdGVzdGluZworICAgIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBleHBvcnRQYXIoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcGFyTG9jYXRpb24sIElSdW5uYWJsZUNvbnRleHQgY29udGV4dCwgU2hlbGwgc2hlbGwpIHsKKyAgICAgICAgSUZpbGUgcGFyRmlsZSA9IHByb2plY3QuZ2V0RmlsZShQQVJfRklMRV9OQU1FKTsKKyAgICAgICAgSUZvbGRlciBzZXR0aW5nc0ZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKCIuc2V0dGluZ3MiKTsKKyAgICAgICAgSVBhdGggc2V0dGluZ3NQYXRoID0gc2V0dGluZ3NGb2xkZXIuZ2V0TG9jYXRpb24oKTsKIAotCQlMaXN0PElTdGF0dXM+IHdhcm5pbmdzID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpOworICAgICAgICBMaXN0PElTdGF0dXM+IHdhcm5pbmdzID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpOwogCi0JCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocGFyRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShmaWxlVVJJLCB0cnVlKTsKLQkJRUxpc3Q8RU9iamVjdD4gY29udGVudHMgPSByZXNvdXJjZS5nZXRDb250ZW50cygpOwotCQlTZXQ8SVJlc291cmNlPiBwYXJFbGVtZW50cyA9IG5ldyBIYXNoU2V0PElSZXNvdXJjZT4oKTsKLQkJZm9yIChFT2JqZWN0IGNvbnRlbnQgOiBjb250ZW50cykgewotCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBQYXIpIHsKLQkJCQlQYXIgcGFyID0gKFBhcikgY29udGVudDsKLQkJCQlFTGlzdDxCdW5kbGU+IGJ1bmRsZXMgPSBwYXIuZ2V0QnVuZGxlKCk7Ci0JCQkJZm9yIChCdW5kbGUgYnVuZGxlIDogYnVuZGxlcykgewotCQkJCQlTdHJpbmcgYnVuZGxlTmFtZSA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCQkJSVByb2plY3QgYnVuZGxlUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChidW5kbGVOYW1lKTsKLQkJCQkJQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0QnVuZGxlTWFuaWZlc3QoCi0JCQkJCQkJSmF2YUNvcmUuY3JlYXRlKGJ1bmRsZVByb2plY3QpKTsKLQkJCQkJU3RyaW5nIGphck5hbWUgPSBudWxsOwotCQkJCQlpZiAobWFuaWZlc3QgIT0gbnVsbCAmJiBtYW5pZmVzdC5nZXRCdW5kbGVWZXJzaW9uKCkgIT0gbnVsbAotCQkJCQkJCSYmIG1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyB2ZXJzaW9uID0gbWFuaWZlc3QuZ2V0QnVuZGxlVmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IChtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSAhPSBudWxsCi0JCQkJCQkJCSYmIG1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpLmdldFN5bWJvbGljTmFtZSgpICE9IG51bGwKLQkJCQkJCQkJPyBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKS5nZXRTeW1ib2xpY05hbWUoKQotCQkJCQkJCQk6IGJ1bmRsZVByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQkJCWphck5hbWUgPSBuYW1lICsgIi0iICsgdmVyc2lvbjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWphck5hbWUgPSBidW5kbGVQcm9qZWN0LmdldFByb2plY3QoKS50b1N0cmluZygpOwotCQkJCQl9CisgICAgICAgIFVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocGFyRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpOworICAgICAgICBSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKKyAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShmaWxlVVJJLCB0cnVlKTsKKyAgICAgICAgRUxpc3Q8RU9iamVjdD4gY29udGVudHMgPSByZXNvdXJjZS5nZXRDb250ZW50cygpOworICAgICAgICBTZXQ8SVJlc291cmNlPiBwYXJFbGVtZW50cyA9IG5ldyBIYXNoU2V0PElSZXNvdXJjZT4oKTsKKyAgICAgICAgZm9yIChFT2JqZWN0IGNvbnRlbnQgOiBjb250ZW50cykgeworICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBQYXIpIHsKKyAgICAgICAgICAgICAgICBQYXIgcGFyID0gKFBhcikgY29udGVudDsKKyAgICAgICAgICAgICAgICBFTGlzdDxCdW5kbGU+IGJ1bmRsZXMgPSBwYXIuZ2V0QnVuZGxlKCk7CisgICAgICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogYnVuZGxlcykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnVuZGxlTmFtZSA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgYnVuZGxlUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChidW5kbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0QnVuZGxlTWFuaWZlc3QoSmF2YUNvcmUuY3JlYXRlKGJ1bmRsZVByb2plY3QpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGphck5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCAmJiBtYW5pZmVzdC5nZXRCdW5kbGVWZXJzaW9uKCkgIT0gbnVsbCAmJiBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IG1hbmlmZXN0LmdldEJ1bmRsZVZlcnNpb24oKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSAhPSBudWxsICYmIG1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpLmdldFN5bWJvbGljTmFtZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpLmdldFN5bWJvbGljTmFtZSgpIDogYnVuZGxlUHJvamVjdC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBqYXJOYW1lID0gbmFtZSArICItIiArIHZlcnNpb247CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBqYXJOYW1lID0gYnVuZGxlUHJvamVjdC5nZXRQcm9qZWN0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCS8vIFN1cHBvcnQgZm9yIG5lc3RlZCB3YXJzCi0JCQkJCWlmIChGYWNldFV0aWxzLmhhc1Byb2plY3RGYWNldChidW5kbGVQcm9qZWN0LCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKSkgewotCQkJCQkJamFyTmFtZSA9IGphck5hbWUgKyAiLndhciI7Ci0JCQkJCQlpZiAoQnVuZGxlRXhwb3J0VXRpbHMuZXhlY3V0ZVdhckV4cG9ydE9wZXJhdGlvbihidW5kbGVQcm9qZWN0LCBqYXJOYW1lLCBzZXR0aW5nc0ZvbGRlcikpIHsKLQkJCQkJCQlJUmVzb3VyY2UgYnVuZGxlSmFyID0gc2V0dGluZ3NGb2xkZXIuZ2V0RmlsZShqYXJOYW1lKTsKLQkJCQkJCQlpZiAoYnVuZGxlSmFyLmV4aXN0cygpKSB7Ci0JCQkJCQkJCXBhckVsZW1lbnRzLmFkZChidW5kbGVKYXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUlKYXZhUHJvamVjdCBqYXZhQnVuZGxlUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShidW5kbGVQcm9qZWN0KTsKLQkJCQkJCWphck5hbWUgPSBqYXJOYW1lICsgIi5qYXIiOwotCQkJCQkJSVBhdGggamFyUGF0aCA9IHNldHRpbmdzUGF0aC5hcHBlbmQoamFyTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIG5lc3RlZCB3YXJzCisgICAgICAgICAgICAgICAgICAgIGlmIChGYWNldFV0aWxzLmhhc1Byb2plY3RGYWNldChidW5kbGVQcm9qZWN0LCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgamFyTmFtZSA9IGphck5hbWUgKyAiLndhciI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQnVuZGxlRXhwb3J0VXRpbHMuZXhlY3V0ZVdhckV4cG9ydE9wZXJhdGlvbihidW5kbGVQcm9qZWN0LCBqYXJOYW1lLCBzZXR0aW5nc0ZvbGRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgYnVuZGxlSmFyID0gc2V0dGluZ3NGb2xkZXIuZ2V0RmlsZShqYXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlSmFyLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhckVsZW1lbnRzLmFkZChidW5kbGVKYXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElKYXZhUHJvamVjdCBqYXZhQnVuZGxlUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShidW5kbGVQcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGphck5hbWUgPSBqYXJOYW1lICsgIi5qYXIiOworICAgICAgICAgICAgICAgICAgICAgICAgSVBhdGggamFyUGF0aCA9IHNldHRpbmdzUGF0aC5hcHBlbmQoamFyTmFtZSk7CiAKLQkJCQkJCUlKYXJFeHBvcnRSdW5uYWJsZSBvcCA9IEJ1bmRsZUV4cG9ydFV0aWxzLmNyZWF0ZUV4cG9ydE9wZXJhdGlvbihqYXZhQnVuZGxlUHJvamVjdCwgamFyUGF0aCwKLQkJCQkJCQkJc2hlbGwsIHdhcm5pbmdzKTsKLQkJCQkJCWlmIChCdW5kbGVFeHBvcnRVdGlscy5leGVjdXRlRXhwb3J0T3BlcmF0aW9uKG9wLCBmYWxzZSwgY29udGV4dCwgc2hlbGwsIHdhcm5pbmdzKSkgewotCQkJCQkJCUlSZXNvdXJjZSBidW5kbGVKYXIgPSBzZXR0aW5nc0ZvbGRlci5nZXRGaWxlKGphck5hbWUpOwotCQkJCQkJCXBhckVsZW1lbnRzLmFkZChidW5kbGVKYXIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgICAgICAgICBJSmFyRXhwb3J0UnVubmFibGUgb3AgPSBCdW5kbGVFeHBvcnRVdGlscy5jcmVhdGVFeHBvcnRPcGVyYXRpb24oamF2YUJ1bmRsZVByb2plY3QsIGphclBhdGgsIHNoZWxsLCB3YXJuaW5ncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQnVuZGxlRXhwb3J0VXRpbHMuZXhlY3V0ZUV4cG9ydE9wZXJhdGlvbihvcCwgZmFsc2UsIGNvbnRleHQsIHNoZWxsLCB3YXJuaW5ncykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2UgYnVuZGxlSmFyID0gc2V0dGluZ3NGb2xkZXIuZ2V0RmlsZShqYXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJFbGVtZW50cy5hZGQoYnVuZGxlSmFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCVNldDxJUmVzb3VyY2U+IGphckVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8SVJlc291cmNlPigpOwotCQlqYXJFbGVtZW50cy5hZGRBbGwocGFyRWxlbWVudHMpOwotCQl0cnkgewotCQkJSVJlc291cmNlW10gcm9vdE1lbWJlcnMgPSBwcm9qZWN0Lm1lbWJlcnMoKTsKLQkJCWZvciAoSVJlc291cmNlIHJvb3RNZW1iZXIgOiByb290TWVtYmVycykgewotCQkJCVN0cmluZyBmaWxlRXh0ZW5zaW9uID0gcm9vdE1lbWJlci5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJaWYgKGZpbGVFeHRlbnNpb24gIT0gbnVsbCAmJiBmaWxlRXh0ZW5zaW9uLmVxdWFscygiamFyIikpIHsKLQkJCQkJamFyRWxlbWVudHMuYWRkKHJvb3RNZW1iZXIpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQl9CisgICAgICAgIFNldDxJUmVzb3VyY2U+IGphckVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8SVJlc291cmNlPigpOworICAgICAgICBqYXJFbGVtZW50cy5hZGRBbGwocGFyRWxlbWVudHMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSVJlc291cmNlW10gcm9vdE1lbWJlcnMgPSBwcm9qZWN0Lm1lbWJlcnMoKTsKKyAgICAgICAgICAgIGZvciAoSVJlc291cmNlIHJvb3RNZW1iZXIgOiByb290TWVtYmVycykgeworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlRXh0ZW5zaW9uID0gcm9vdE1lbWJlci5nZXRGaWxlRXh0ZW5zaW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVFeHRlbnNpb24gIT0gbnVsbCAmJiBmaWxlRXh0ZW5zaW9uLmVxdWFscygiamFyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgamFyRWxlbWVudHMuYWRkKHJvb3RNZW1iZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgeworICAgICAgICB9CiAKLQkJSmFyUGFja2FnZURhdGEgcGFyUGFja2FnZSA9IG5ldyBKYXJQYWNrYWdlRGF0YSgpOwotCQlwYXJQYWNrYWdlLnNldEphckxvY2F0aW9uKHBhckxvY2F0aW9uKTsKLQkJcGFyUGFja2FnZS5zZXRFeHBvcnRDbGFzc0ZpbGVzKHRydWUpOwotCQlwYXJQYWNrYWdlLnNldEV4cG9ydE91dHB1dEZvbGRlcnMoZmFsc2UpOwotCQlwYXJQYWNrYWdlLnNldEV4cG9ydEphdmFGaWxlcyhmYWxzZSk7Ci0JCXBhclBhY2thZ2Uuc2V0RWxlbWVudHMoamFyRWxlbWVudHMudG9BcnJheSgpKTsKLQkJcGFyUGFja2FnZS5zZXRPdmVyd3JpdGUodHJ1ZSk7CisgICAgICAgIEphclBhY2thZ2VEYXRhIHBhclBhY2thZ2UgPSBuZXcgSmFyUGFja2FnZURhdGEoKTsKKyAgICAgICAgcGFyUGFja2FnZS5zZXRKYXJMb2NhdGlvbihwYXJMb2NhdGlvbik7CisgICAgICAgIHBhclBhY2thZ2Uuc2V0RXhwb3J0Q2xhc3NGaWxlcyh0cnVlKTsKKyAgICAgICAgcGFyUGFja2FnZS5zZXRFeHBvcnRPdXRwdXRGb2xkZXJzKGZhbHNlKTsKKyAgICAgICAgcGFyUGFja2FnZS5zZXRFeHBvcnRKYXZhRmlsZXMoZmFsc2UpOworICAgICAgICBwYXJQYWNrYWdlLnNldEVsZW1lbnRzKGphckVsZW1lbnRzLnRvQXJyYXkoKSk7CisgICAgICAgIHBhclBhY2thZ2Uuc2V0T3ZlcndyaXRlKHRydWUpOwogCi0JCUlQYXRoIG1hbmlmZXN0UGF0aCA9IGxvY2F0ZU1hbmlmZXN0RmlsZShwcm9qZWN0KTsKLQkJaWYgKG1hbmlmZXN0UGF0aCAhPSBudWxsKSB7Ci0JCQlwYXJQYWNrYWdlLnNldEdlbmVyYXRlTWFuaWZlc3QoZmFsc2UpOwotCQkJcGFyUGFja2FnZS5zZXRNYW5pZmVzdExvY2F0aW9uKG1hbmlmZXN0UGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXJQYWNrYWdlLnNldEdlbmVyYXRlTWFuaWZlc3QodHJ1ZSk7Ci0JCX0KKyAgICAgICAgSVBhdGggbWFuaWZlc3RQYXRoID0gbG9jYXRlTWFuaWZlc3RGaWxlKHByb2plY3QpOworICAgICAgICBpZiAobWFuaWZlc3RQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhclBhY2thZ2Uuc2V0R2VuZXJhdGVNYW5pZmVzdChmYWxzZSk7CisgICAgICAgICAgICBwYXJQYWNrYWdlLnNldE1hbmlmZXN0TG9jYXRpb24obWFuaWZlc3RQYXRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhclBhY2thZ2Uuc2V0R2VuZXJhdGVNYW5pZmVzdCh0cnVlKTsKKyAgICAgICAgfQogCi0JCUlKYXJCdWlsZGVyIGJ1aWxkZXIgPSBwYXJQYWNrYWdlLmdldEphckJ1aWxkZXIoKTsKLQkJdHJ5IHsKLQkJCWJ1aWxkZXIub3BlbihwYXJQYWNrYWdlLCBzaGVsbCwgbnVsbCk7Ci0JCQlmb3IgKElSZXNvdXJjZSBlbGVtIDogamFyRWxlbWVudHMpIHsKLQkJCQlpZiAoZWxlbSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlidWlsZGVyLndyaXRlRmlsZSgoSUZpbGUpIGVsZW0sIG5ldyBQYXRoKGVsZW0uZ2V0TmFtZSgpKSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYnVpbGRlci5jbG9zZSgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCX0KKyAgICAgICAgSUphckJ1aWxkZXIgYnVpbGRlciA9IHBhclBhY2thZ2UuZ2V0SmFyQnVpbGRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVpbGRlci5vcGVuKHBhclBhY2thZ2UsIHNoZWxsLCBudWxsKTsKKyAgICAgICAgICAgIGZvciAoSVJlc291cmNlIGVsZW0gOiBqYXJFbGVtZW50cykgeworICAgICAgICAgICAgICAgIGlmIChlbGVtIGluc3RhbmNlb2YgSUZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIud3JpdGVGaWxlKChJRmlsZSkgZWxlbSwgbmV3IFBhdGgoZWxlbS5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWlsZGVyLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgfQogCi0JCWZvciAoSVJlc291cmNlIHBhckVsZW1lbnQgOiBwYXJFbGVtZW50cykgewotCQkJdHJ5IHsKLQkJCQlwYXJFbGVtZW50LmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9CisgICAgICAgIGZvciAoSVJlc291cmNlIHBhckVsZW1lbnQgOiBwYXJFbGVtZW50cykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwYXJFbGVtZW50LmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJaWYgKHdhcm5pbmdzLnNpemUoKSA+IDApIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgIlBBUiBleHBvcnQgd2FybmluZ3MiLCBudWxsLCBuZXcgTXVsdGlTdGF0dXMoU2VydmVyRXhwb3J0UGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJU3RhdHVzLldBUk5JTkcsIHdhcm5pbmdzLnRvQXJyYXkobmV3IElTdGF0dXNbMF0pLAotCQkJCQkiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBleHBvcnQgdGhlIFBBUiBwcm9qZWN0LiBDbGljayBEZXRhaWxzIHRvIHNlZSBtb3JlLi4uIiwgbnVsbCkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICAgICAgaWYgKHdhcm5pbmdzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIEVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgIlBBUiBleHBvcnQgd2FybmluZ3MiLCBudWxsLCBuZXcgTXVsdGlTdGF0dXMoU2VydmVyRXhwb3J0UGx1Z2luLlBMVUdJTl9JRCwgSVN0YXR1cy5XQVJOSU5HLAorICAgICAgICAgICAgICAgIHdhcm5pbmdzLnRvQXJyYXkobmV3IElTdGF0dXNbMF0pLCAiVGhlcmUgd2VyZSB3YXJuaW5ncyB3aGlsZSBleHBvcnQgdGhlIFBBUiBwcm9qZWN0LiBDbGljayBEZXRhaWxzIHRvIHNlZSBtb3JlLi4uIiwgbnVsbCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCXByaXZhdGUgc3RhdGljIElQYXRoIGxvY2F0ZU1hbmlmZXN0RmlsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotCQlJUmVzb3VyY2UgbWFuaWZlc3RGaWxlID0gcHJvamVjdC5maW5kTWVtYmVyKHBhdGgpOwotCQlpZiAobWFuaWZlc3RGaWxlICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUGF0aChwcm9qZWN0LmdldE5hbWUoKSkuYXBwZW5kKHBhdGgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBJUGF0aCBsb2NhdGVNYW5pZmVzdEZpbGUoSVByb2plY3QgcHJvamVjdCkgeworICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aCgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKKyAgICAgICAgSVJlc291cmNlIG1hbmlmZXN0RmlsZSA9IHByb2plY3QuZmluZE1lbWJlcihwYXRoKTsKKyAgICAgICAgaWYgKG1hbmlmZXN0RmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhdGgocHJvamVjdC5nZXROYW1lKCkpLmFwcGVuZChwYXRoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCXNldFdpbmRvd1RpdGxlKFRJVExFKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoU2VydmVyRXhwb3J0UGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC93aXpiYW4vd2l6YmFuLXBhci5wbmciKSk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKyAgICAgICAgc2V0V2luZG93VGl0bGUoVElUTEUpOworICAgICAgICBzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihTZXJ2ZXJFeHBvcnRQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL3dpemJhbi93aXpiYW4tcGFyLnBuZyIpKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9leHBvcnQvUGFyRXhwb3J0V2l6YXJkUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC9QYXJFeHBvcnRXaXphcmRQYWdlLmphdmEKaW5kZXggZTQ1OGZmNS4uZDdlNDVjYSAxMDA3NTUKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC9QYXJFeHBvcnRXaXphcmRQYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC9QYXJFeHBvcnRXaXphcmRQYWdlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yOSw3OSArMzAsNzggQEAKIAogLyoqCiAgKiBFeHBvcnQgd2l6YXJkIHBhZ2UgZm9yIGV4cG9ydGluZyBwYXIgcHJvamVjdAotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAYXV0aG9yIFRlcnJ5IEhvbgogICogQGF1dGhvciBMZW8gRG9zIFNhbnRvcwogICovCiBwdWJsaWMgY2xhc3MgUGFyRXhwb3J0V2l6YXJkUGFnZSBleHRlbmRzIEFic3RyYWN0UHJvamVjdEV4cG9ydFdpemFyZFBhZ2UgewogCi0JcHJvdGVjdGVkIFBhckV4cG9ydFdpemFyZFBhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCJwYXJFeHBvcnRXaXphcmRQYWdlIiwgc2VsZWN0aW9uKTsKKyAgICBwcm90ZWN0ZWQgUGFyRXhwb3J0V2l6YXJkUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKyAgICAgICAgc3VwZXIoInBhckV4cG9ydFdpemFyZFBhZ2UiLCBzZWxlY3Rpb24pOwogCi0JCXNldFRpdGxlKCJKQVIgRmlsZSBTcGVjaWZpY2F0aW9uIik7Ci0JCXNldERlc2NyaXB0aW9uKCJEZWZpbmUgd2hpY2ggUEFSIHByb2plY3Qgc2hvdWxkIGJlIGV4cG9ydGVkIGludG8gdGhlIEpBUi4iKTsKLQl9CisgICAgICAgIHNldFRpdGxlKCJKQVIgRmlsZSBTcGVjaWZpY2F0aW9uIik7CisgICAgICAgIHNldERlc2NyaXB0aW9uKCJEZWZpbmUgd2hpY2ggUEFSIHByb2plY3Qgc2hvdWxkIGJlIGV4cG9ydGVkIGludG8gdGhlIEpBUi4iKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVmlld2VyRmlsdGVyIGdldFRyZWVWaWV3ZXJGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlld2VyRmlsdGVyKCkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBWaWV3ZXJGaWx0ZXIgZ2V0VHJlZVZpZXdlckZpbHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBWaWV3ZXJGaWx0ZXIoKSB7CiAKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudDsKLQkJCQkJcmV0dXJuICFyb290LmlzQXJjaGl2ZSgpICYmICFyb290LmlzRXh0ZXJuYWwoKTsKLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBlbGVtZW50OwotCQkJCQl0cnkgewotCQkJCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ID09IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCgKLQkJCQkJCQkJRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRCkuZ2V0RGVmYXVsdFZlcnNpb24oKSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7CisgICAgICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAhcm9vdC5pc0FyY2hpdmUoKSAmJiAhcm9vdC5pc0V4dGVybmFsKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWNldGVkUHJvamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRCkuZ2V0RGVmYXVsdFZlcnNpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICIucGFyIjsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7CisgICAgICAgIHJldHVybiAiLnBhciI7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXN0aW5hdGlvbkxhYmVsKCkgewotCQlyZXR1cm4gIlBBUiBmaWxlOiI7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzdGluYXRpb25MYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuICJQQVIgZmlsZToiOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKEJ1bmRsZU1hbmlmZXN0IGJ1bmRsZU1hbmlmZXN0KSB7Ci0JCXJldHVybiBidW5kbGVNYW5pZmVzdC50b0RpY3Rpb25hcnkoKS5nZXQoIkFwcGxpY2F0aW9uLVN5bWJvbGljTmFtZSIpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN5bWJvbGljTmFtZShCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCkgeworICAgICAgICByZXR1cm4gYnVuZGxlTWFuaWZlc3QudG9EaWN0aW9uYXJ5KCkuZ2V0KCJBcHBsaWNhdGlvbi1TeW1ib2xpY05hbWUiKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb24oQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QpIHsKLQkJcmV0dXJuIGJ1bmRsZU1hbmlmZXN0LnRvRGljdGlvbmFyeSgpLmdldCgiQXBwbGljYXRpb24tVmVyc2lvbiIpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb24oQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QpIHsKKyAgICAgICAgcmV0dXJuIGJ1bmRsZU1hbmlmZXN0LnRvRGljdGlvbmFyeSgpLmdldCgiQXBwbGljYXRpb24tVmVyc2lvbiIpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCdW5kbGVNYW5pZmVzdCBnZXRCdW5kbGVNYW5pZmVzdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotCQlJRmlsZSBtYW5pZmVzdEZpbGUgPSAoSUZpbGUpIHByb2plY3QuZmluZE1lbWJlcihwYXRoKTsKLQkJaWYgKG1hbmlmZXN0RmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBCdW5kbGVNYW5pZmVzdEZhY3RvcnkuY3JlYXRlQnVuZGxlTWFuaWZlc3QobmV3IElucHV0U3RyZWFtUmVhZGVyKG1hbmlmZXN0RmlsZS5nZXRDb250ZW50cyh0cnVlKSkpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEJ1bmRsZU1hbmlmZXN0RmFjdG9yeS5jcmVhdGVCdW5kbGVNYW5pZmVzdCgpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQnVuZGxlTWFuaWZlc3QgZ2V0QnVuZGxlTWFuaWZlc3QoSVByb2plY3QgcHJvamVjdCkgeworICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aCgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKKyAgICAgICAgSUZpbGUgbWFuaWZlc3RGaWxlID0gKElGaWxlKSBwcm9qZWN0LmZpbmRNZW1iZXIocGF0aCk7CisgICAgICAgIGlmIChtYW5pZmVzdEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQnVuZGxlTWFuaWZlc3RGYWN0b3J5LmNyZWF0ZUJ1bmRsZU1hbmlmZXN0KG5ldyBJbnB1dFN0cmVhbVJlYWRlcihtYW5pZmVzdEZpbGUuZ2V0Q29udGVudHModHJ1ZSkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBCdW5kbGVNYW5pZmVzdEZhY3RvcnkuY3JlYXRlQnVuZGxlTWFuaWZlc3QoKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9leHBvcnQvU2VydmVyRXhwb3J0UGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZXhwb3J0L1NlcnZlckV4cG9ydFBsdWdpbi5qYXZhCmluZGV4IDhmOGE4YmEuLmNjNjYzZGMgMTAwNzU1Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5leHBvcnQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9leHBvcnQvU2VydmVyRXhwb3J0UGx1Z2luLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2V4cG9ydC9TZXJ2ZXJFeHBvcnRQbHVnaW4uamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwpAQCAtMTgsMTAgKzE5LDEwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJFeHBvcnRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUuZXhwb3J0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmV4cG9ydCI7CiAKLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCAiaWNvbnMvIiArIHBhdGgpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCAiaWNvbnMvIiArIHBhdGgpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmluZGV4IGJiYWNhNmQuLjQzMjFiZDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZmFjZXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTEsNCArMSwzIEBACi0jV2VkIE1hciAwMiAxNjowMDowNiBQU1QgMjAxMQogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9CkBAIC04LDYgKzcsOCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCkBAIC04MiwzNSArODMsMzcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTgwCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj00OAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbj0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeT04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2g9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKQEAgLTEyMSwzMCArMTI0LDMxIEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9sYW1iZGFfYm9keT1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTEyMAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2phdmFkb2NfYm91bmRhcmllcz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5wcmVzZXJ2ZV93aGl0ZV9zcGFjZV9iZXR3ZWVuX2NvZGVfYW5kX2xpbmVfY29tbWVudHM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5kaXNhYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9mZgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmVuYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvbgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKQEAgLTE1OCw3ICsxNjIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQ9aW5zZXJ0CkBAIC0xNjYsMTAgKzE3MCwxMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21lbWJlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZXRob2Q9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFja2FnZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl90eXBlPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9sYWJlbD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl90eXBlX2Fubm90YXRpb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0yMTcsNiArMjIyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTIzNSwxMiArMjQxLDE0IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKQEAgLTI2NCw2ICsyNzIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKQEAgLTI5MSw2ICszMDAsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTMxOSw2ICszMjksNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fdHJ5PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0CkBAIC0zMjgsNiArMzM5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKQEAgLTM0MywxNSArMzU1LDE3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xMjAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXNwYWNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2Vfb25fb2ZmX3RhZ3M9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfb3Jfb3BlcmF0b3JfbXVsdGljYXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9vdXRlcl9leHByZXNzaW9uc193aGVuX25lc3RlZD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhRm9ybWF0dGVyPW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRlZmF1bHRKYXZhRm9ybWF0dGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZmFjZXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwppbmRleCA3ZTdmZTczLi42Yzk4MDE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZmFjZXQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTEsNyArMSw2NSBAQAorY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbWV0aG9kcz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zX2ludGVyZmFjZV9tZXRob2RzPXRydWUKK2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X2Z1bmN0aW9uYWxfaW50ZXJmYWNlcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCitjbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlX2NoYW5nZXNfb25seT1mYWxzZQorY2xlYW51cC5pbnNlcnRfaW5mZXJyZWRfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV9yZWR1bmRhbnRfdHlwZV9hcmd1bWVudHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Fub255bW91c19jbGFzc19jcmVhdGlvbj1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPXRydWUKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9sYW1iZGE9dHJ1ZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3R5cGVfYXJndW1lbnRzPWZhbHNlCitjbGVhbnVwX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIENsZWFuIFVwCiBjbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIGVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X015bHluIGJhc2VkIG9uIEVjbGlwc2UKK2Zvcm1hdHRlcl9wcm9maWxlPV9WaXJnbyBXZWIgU2VydmVyIC0gQ29kZSBGb3JtYXR0ZXIKIGZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEyCiBpbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAogb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZmFjZXQvY29yZS9CdW5kbGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9mYWNldC9jb3JlL0J1bmRsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggNTJlYTE0ZC4uOGQxMjY3YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9mYWNldC9jb3JlL0J1bmRsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9mYWNldC9jb3JlL0J1bmRsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwpAQCAtMjEsMjcgKzIyLDI4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEphdmFQcm9qZWN0RmFjZXRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIHsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRV9TRVJWRVJfQ0xBU1NQQVRIX0NPTlRBSU5FUiA9IEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQKLQkJCSsgIi5FTkFCTEVfQlVORExFX0NMQVNTUEFUSF9DT05UQUlORVIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRV9TRVJWRVJfQ0xBU1NQQVRIX0NPTlRBSU5FUiA9IEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVOQUJMRV9CVU5ETEVfQ0xBU1NQQVRIX0NPTlRBSU5FUiI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVfV0VCX0JVTkRMRSA9IEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVOQUJMRV9XRUJfQlVORExFIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVfV0VCX0JVTkRMRSA9IEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVOQUJMRV9XRUJfQlVORExFIjsKIAotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEVOQUJMRV9TRVJWRVJfQ0xBU1NQQVRIX0NPTlRBSU5FUik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEVOQUJMRV9XRUJfQlVORExFKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKKyAgICAgICAgU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CisgICAgICAgIHByb3BlcnR5TmFtZXMuYWRkKEVOQUJMRV9TRVJWRVJfQ0xBU1NQQVRIX0NPTlRBSU5FUik7CisgICAgICAgIHByb3BlcnR5TmFtZXMuYWRkKEVOQUJMRV9XRUJfQlVORExFKTsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZXM7CisgICAgfQogCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAoRU5BQkxFX1NFUlZFUl9DTEFTU1BBVEhfQ09OVEFJTkVSLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9Ci0JCWlmIChFTkFCTEVfV0VCX0JVTkRMRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgIGlmIChFTkFCTEVfU0VSVkVSX0NMQVNTUEFUSF9DT05UQUlORVIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVOQUJMRV9XRUJfQlVORExFLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ZhY2V0L2NvcmUvQnVuZGxlRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZmFjZXQvY29yZS9CdW5kbGVGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmluZGV4IDdmMTUzMmEuLjVlNmM2OGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZmFjZXQvY29yZS9CdW5kbGVGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZmFjZXQvY29yZS9CdW5kbGVGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTIzLDE4ICsyNCwxNyBAQAogCiAvKioKICAqIEZhY2V0IGluc3RhbGwgZGVsZWdhdGUgdGhhdCBpbnN0YWxscyB0aGUgY2xhc3MgcGF0aCBjb250YWluZXIuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlRmFjZXRJbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewogCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCUxpc3Q8U3RyaW5nPiBuYXR1cmVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoZGVzYy5nZXROYXR1cmVJZHMoKSkpOwotCQluYXR1cmVzLmFkZChGYWNldENvcmVQbHVnaW4uQlVORExFX05BVFVSRV9JRCk7Ci0JCWRlc2Muc2V0TmF0dXJlSWRzKG5hdHVyZXMudG9BcnJheShuZXcgU3RyaW5nW10ge30pKTsKLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjLCBtb25pdG9yKTsKLQl9CisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IG5hdHVyZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChkZXNjLmdldE5hdHVyZUlkcygpKSk7CisgICAgICAgIG5hdHVyZXMuYWRkKEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfTkFUVVJFX0lEKTsKKyAgICAgICAgZGVzYy5zZXROYXR1cmVJZHMobmF0dXJlcy50b0FycmF5KG5ldyBTdHJpbmdbXSB7fSkpOworICAgICAgICBwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2MsIG1vbml0b3IpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZmFjZXQvY29yZS9CdW5kbGVGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ZhY2V0L2NvcmUvQnVuZGxlRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZS5qYXZhCmluZGV4IDRjZmNjN2UuLjA5MzUzMDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZmFjZXQvY29yZS9CdW5kbGVGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9mYWNldC9jb3JlL0J1bmRsZUZhY2V0VW5pbnN0YWxsRGVsZWdhdGUuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuZmFjZXQuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0yOCwzMiArMjksMzAgQEAKIAogLyoqCiAgKiBVbmluc3RhbGwgZGVsZWdhdGUgdG8gcmVtb3ZlIHRoZSBjbGFzcyBwYXRoIGNvbnRhaW5lci4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlRmFjZXRVbmluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7CiAKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJcmVtb3ZlRnJvbUNsYXNzcGF0aChqcHJvaiwgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoRmFjZXRDb3JlUGx1Z2luLkNMQVNTUEFUSF9DT05UQUlORVJfUEFUSCksIG1vbml0b3IpOwotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCUxpc3Q8U3RyaW5nPiBuYXR1cmVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoZGVzYy5nZXROYXR1cmVJZHMoKSkpOwotCQluYXR1cmVzLnJlbW92ZShGYWNldENvcmVQbHVnaW4uQlVORExFX05BVFVSRV9JRCk7Ci0JCWRlc2Muc2V0TmF0dXJlSWRzKG5hdHVyZXMudG9BcnJheShuZXcgU3RyaW5nW10ge30pKTsKLQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjLCBtb25pdG9yKTsKLQl9CisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIElKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKKyAgICAgICAgcmVtb3ZlRnJvbUNsYXNzcGF0aChqcHJvaiwgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoRmFjZXRDb3JlUGx1Z2luLkNMQVNTUEFUSF9DT05UQUlORVJfUEFUSCksIG1vbml0b3IpOworICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBuYXR1cmVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoZGVzYy5nZXROYXR1cmVJZHMoKSkpOworICAgICAgICBuYXR1cmVzLnJlbW92ZShGYWNldENvcmVQbHVnaW4uQlVORExFX05BVFVSRV9JRCk7CisgICAgICAgIGRlc2Muc2V0TmF0dXJlSWRzKG5hdHVyZXMudG9BcnJheShuZXcgU3RyaW5nW10ge30pKTsKKyAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjLCBtb25pdG9yKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVNldDxJQ2xhc3NwYXRoRW50cnk+IGVudHJpZXMgPSBuZXcgTGlua2VkSGFzaFNldDxJQ2xhc3NwYXRoRW50cnk+KCk7Ci0JCWZvciAoSUNsYXNzcGF0aEVudHJ5IGV4aXN0aW5nRW50cnkgOiBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSkgewotCQkJaWYgKCFleGlzdGluZ0VudHJ5LmVxdWFscyhlbnRyeSkpIHsKLQkJCQllbnRyaWVzLmFkZChleGlzdGluZ0VudHJ5KTsKLQkJCX0KLQkJfQotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoZW50cmllcy50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbZW50cmllcy5zaXplKCldKSwgbW9uaXRvcik7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBTZXQ8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8SUNsYXNzcGF0aEVudHJ5PigpOworICAgICAgICBmb3IgKElDbGFzc3BhdGhFbnRyeSBleGlzdGluZ0VudHJ5IDogamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkpIHsKKyAgICAgICAgICAgIGlmICghZXhpc3RpbmdFbnRyeS5lcXVhbHMoZW50cnkpKSB7CisgICAgICAgICAgICAgICAgZW50cmllcy5hZGQoZXhpc3RpbmdFbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2VudHJpZXMuc2l6ZSgpXSksIG1vbml0b3IpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZmFjZXQvY29yZS9GYWNldENvcmVQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZmFjZXQvY29yZS9GYWNldENvcmVQbHVnaW4uamF2YQppbmRleCAzNjc3MGY5Li44N2VjYjkxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ZhY2V0L2NvcmUvRmFjZXRDb3JlUGx1Z2luLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9mYWNldC9jb3JlL0ZhY2V0Q29yZVBsdWdpbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwpAQCAtMTcsNTMgKzE4LDU1IEBACiAKIC8qKgogICogQnVuZGxlIGFjdGl2YXRvciBmb3IgdGhlIGZhY2V0LmNvcmUgcGx1Z2luCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgRmFjZXRDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKIAotCS8qKiBDbGFzcyBwYXRoIGNvbnRhaW5lciBwYXRoIHN0cmluZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSF9DT05UQUlORVIgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlLk1BTklGRVNUX0NMQVNTUEFUSF9DT05UQUlORVIiOworICAgIC8qKiBDbGFzcyBwYXRoIGNvbnRhaW5lciBwYXRoIHN0cmluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSF9DT05UQUlORVIgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlLk1BTklGRVNUX0NMQVNTUEFUSF9DT05UQUlORVIiOwogCi0JLyoqIENsYXNzIHBhdGggY29udGFpbmVyIHBhdGggKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIENMQVNTUEFUSF9DT05UQUlORVJfUEFUSCA9IG5ldyBQYXRoKENMQVNTUEFUSF9DT05UQUlORVIpOworICAgIC8qKiBDbGFzcyBwYXRoIGNvbnRhaW5lciBwYXRoICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBDTEFTU1BBVEhfQ09OVEFJTkVSX1BBVEggPSBuZXcgUGF0aChDTEFTU1BBVEhfQ09OVEFJTkVSKTsKIAotCS8qKiBUaGUgYnVuZGxlIHN5bWJvbGljIG5hbWUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUiOworICAgIC8qKiBUaGUgYnVuZGxlIHN5bWJvbGljIG5hbWUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUiOwogCi0JLyoqIFRoZSBmYWNldCBpZCBmb3IgU3ByaW5nU291cmNlIGJ1bmRsZSBwcm9qZWN0cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9GQUNFVF9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5zZXJ2ZXIuYnVuZGxlIjsKKyAgICAvKiogVGhlIGZhY2V0IGlkIGZvciBTcHJpbmdTb3VyY2UgYnVuZGxlIHByb2plY3RzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX0ZBQ0VUX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLnNlcnZlci5idW5kbGUiOwogCi0JLyoqIFRoZSBmYWNldCBpZCBmb3IgU3ByaW5nU291cmNlIHBhciBwcm9qZWN0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSX0ZBQ0VUX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLnNlcnZlci5wYXIiOworICAgIC8qKiBUaGUgZmFjZXQgaWQgZm9yIFNwcmluZ1NvdXJjZSBwYXIgcHJvamVjdCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUl9GQUNFVF9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5zZXJ2ZXIucGFyIjsKIAotCS8qKiBUaGUgZmFjZXQgaWQgZm9yIFNwcmluZ1NvdXJjZSBwbGFuIHByb2plY3QgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFOX0ZBQ0VUX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLnNlcnZlci5wbGFuIjsKKyAgICAvKiogVGhlIGZhY2V0IGlkIGZvciBTcHJpbmdTb3VyY2UgcGxhbiBwcm9qZWN0ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBTl9GQUNFVF9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5zZXJ2ZXIucGxhbiI7CiAKLQkvKiogVGhlIGZhY2V0IGlkIG9mIFdUUCBkeW5hbWljIHdlYiBwcm9qZWN0cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9GQUNFVF9JRCA9ICJqc3Qud2ViIjsKKyAgICAvKiogVGhlIGZhY2V0IGlkIG9mIFdUUCBkeW5hbWljIHdlYiBwcm9qZWN0cyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9GQUNFVF9JRCA9ICJqc3Qud2ViIjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQVRVUkVfSUQgPSBQTFVHSU5fSUQgKyAiLmJ1bmRsZW5hdHVyZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BVFVSRV9JRCA9IFBMVUdJTl9JRCArICIuYnVuZGxlbmF0dXJlIjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUl9OQVRVUkVfSUQgPSBQTFVHSU5fSUQgKyAiLnBhcm5hdHVyZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSX05BVFVSRV9JRCA9IFBMVUdJTl9JRCArICIucGFybmF0dXJlIjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQU5fTkFUVVJFX0lEID0gUExVR0lOX0lEICsgIi5wbGFubmF0dXJlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFOX05BVFVSRV9JRCA9IFBMVUdJTl9JRCArICIucGxhbm5hdHVyZSI7CiAKLQlwcml2YXRlIHN0YXRpYyBGYWNldENvcmVQbHVnaW4gcGx1Z2luOworICAgIHByaXZhdGUgc3RhdGljIEZhY2V0Q29yZVBsdWdpbiBwbHVnaW47CiAKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7CisgICAgICAgIHBsdWdpbiA9IHRoaXM7CisgICAgfQogCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBsdWdpbiA9IG51bGw7CisgICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBGYWNldENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9CisgICAgcHVibGljIHN0YXRpYyBGYWNldENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKKyAgICAgICAgcmV0dXJuIHBsdWdpbjsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZmFjZXQvY29yZS9GYWNldFV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ZhY2V0L2NvcmUvRmFjZXRVdGlscy5qYXZhCmluZGV4IGFmZjBlMWUuLjRjMWQ1YjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZmFjZXQvY29yZS9GYWNldFV0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9mYWNldC9jb3JlL0ZhY2V0VXRpbHMuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuZmFjZXQuY29yZTsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CkBAIC00NSwxNjYgKzQ2LDE2MSBAQAogCiAvKioKICAqIFV0aWxpdHkgdG8gY2hlY2sgaWYgdGhlIGdpdmVuIHtAbGluayBJUmVzb3VyY2V9IGJlbG9uZ3MgdG8gYSBwcm9qZWN0IHRoYXQgaGFzIHRoZSBwYXIgb3IgYnVuZGxlIGZhY2V0LgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAYXV0aG9yIExlbyBEb3MgU2FudG9zCiAgKiBAc2luY2UgMS4wLjAKICAqLwogcHVibGljIGNsYXNzIEZhY2V0VXRpbHMgewogCi0JLyoqCi0JICogQ2hlY2tzIGlmIGEgZ2l2ZW4ge0BsaW5rIElSZXNvdXJjZX0gaGFzIHRoZSBidW5kbGUgZmFjZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQnVuZGxlUHJvamVjdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIGhhc05hdHVyZShyZXNvdXJjZSwgSmF2YUNvcmUuTkFUVVJFX0lEKSAmJiBoYXNQcm9qZWN0RmFjZXQocmVzb3VyY2UsIEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQpOwotCX0KKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgYSBnaXZlbiB7QGxpbmsgSVJlc291cmNlfSBoYXMgdGhlIGJ1bmRsZSBmYWNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCdW5kbGVQcm9qZWN0KElSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICByZXR1cm4gaGFzTmF0dXJlKHJlc291cmNlLCBKYXZhQ29yZS5OQVRVUkVfSUQpICYmIGhhc1Byb2plY3RGYWNldChyZXNvdXJjZSwgRmFjZXRDb3JlUGx1Z2luLkJVTkRMRV9GQUNFVF9JRCk7CisgICAgfQogCi0JLyoqCi0JICogQ2hlY2tzIGlmIGEgZ2l2ZW4ge0BsaW5rIElSZXNvdXJjZX0gaGFzIHRoZSBwYXIgZmFjZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFyUHJvamVjdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIGhhc1Byb2plY3RGYWNldChyZXNvdXJjZSwgRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRCk7Ci0JfQorICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBhIGdpdmVuIHtAbGluayBJUmVzb3VyY2V9IGhhcyB0aGUgcGFyIGZhY2V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhclByb2plY3QoSVJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgIHJldHVybiBoYXNQcm9qZWN0RmFjZXQocmVzb3VyY2UsIEZhY2V0Q29yZVBsdWdpbi5QQVJfRkFDRVRfSUQpOworICAgIH0KIAotCS8qKgotCSAqIENoZWNrcyBpZiBhIGdpdmVuIHtAbGluayBJUmVzb3VyY2V9IGhhcyB0aGUgcGFyIGZhY2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BsYW5Qcm9qZWN0KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gaGFzUHJvamVjdEZhY2V0KHJlc291cmNlLCBGYWNldENvcmVQbHVnaW4uUExBTl9GQUNFVF9JRCk7Ci0JfQorICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBhIGdpdmVuIHtAbGluayBJUmVzb3VyY2V9IGhhcyB0aGUgcGFyIGZhY2V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BsYW5Qcm9qZWN0KElSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICByZXR1cm4gaGFzUHJvamVjdEZhY2V0KHJlc291cmNlLCBGYWNldENvcmVQbHVnaW4uUExBTl9GQUNFVF9JRCk7CisgICAgfQogCi0JLyoqCi0JICogQ2hlY2tzIGlmIGEge0BsaW5rIElSZXNvdXJjZX0gaGFzIGEgZ2l2ZW4gcHJvamVjdCBmYWNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHJvamVjdEZhY2V0KElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGZhY2V0SWQpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldChyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGZhY2V0SWQpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQkiQW4gZXJyb3Igb2NjdXJyZWQgaW5zcGVjdGluZyBwcm9qZWN0IGZhY2V0IiwgZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGEge0BsaW5rIElSZXNvdXJjZX0gaGFzIGEgZ2l2ZW4gcHJvamVjdCBmYWNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHJvamVjdEZhY2V0KElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGZhY2V0SWQpIHsKKyAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldChyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGZhY2V0SWQpOworICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEZhY2V0Q29yZVBsdWdpbi5QTFVHSU5fSUQsICJBbiBlcnJvciBvY2N1cnJlZCBpbnNwZWN0aW5nIHByb2plY3QgZmFjZXQiLCBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCS8qKgotCSAqIENoZWNrcyBpZiBhIHtAbGluayBJUmVzb3VyY2V9IGhhcyBhIGdpdmVuIHByb2plY3QgbmF0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNOYXR1cmUoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbmF0dXJlSWQpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHByb2plY3QuaGFzTmF0dXJlKG5hdHVyZUlkKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRmFjZXRDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkJCSJBbiBlcnJvciBvY2N1cnJlZCBpbnNwZWN0aW5nIHByb2plY3QgbmF0dXJlIiwgZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBhIHtAbGluayBJUmVzb3VyY2V9IGhhcyBhIGdpdmVuIHByb2plY3QgbmF0dXJlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNOYXR1cmUoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbmF0dXJlSWQpIHsKKyAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKKyAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7CisgICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2plY3QuaGFzTmF0dXJlKG5hdHVyZUlkKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBGYWNldENvcmVQbHVnaW4uUExVR0lOX0lELCAiQW4gZXJyb3Igb2NjdXJyZWQgaW5zcGVjdGluZyBwcm9qZWN0IG5hdHVyZSIsIGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgYWxsIGJ1bmRsZSBwcm9qZWN0IGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZSByZWdhcmRsZXNzIHdlYXRoZXIgdGhleSBhcmUgb3BlbiBvciBjbG9zZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEJ1bmRsZVByb2plY3RzKCkgewotCQlMaXN0PElQcm9qZWN0PiBidW5kbGVzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChJUHJvamVjdCBjYW5kaWRhdGUgOiBwcm9qZWN0cykgewotCQkJaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KGNhbmRpZGF0ZSkpIHsKLQkJCQlidW5kbGVzLmFkZChjYW5kaWRhdGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidW5kbGVzLnRvQXJyYXkobmV3IElQcm9qZWN0W2J1bmRsZXMuc2l6ZSgpXSk7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIGJ1bmRsZSBwcm9qZWN0IGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZSByZWdhcmRsZXNzIHdlYXRoZXIgdGhleSBhcmUgb3BlbiBvciBjbG9zZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldEJ1bmRsZVByb2plY3RzKCkgeworICAgICAgICBMaXN0PElQcm9qZWN0PiBidW5kbGVzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oKTsKKyAgICAgICAgSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKKyAgICAgICAgZm9yIChJUHJvamVjdCBjYW5kaWRhdGUgOiBwcm9qZWN0cykgeworICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KGNhbmRpZGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBidW5kbGVzLmFkZChjYW5kaWRhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBidW5kbGVzLnRvQXJyYXkobmV3IElQcm9qZWN0W2J1bmRsZXMuc2l6ZSgpXSk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldFBhclByb2plY3RzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU2V0PElQcm9qZWN0PiBidW5kbGVzID0gbmV3IEhhc2hTZXQ8SVByb2plY3Q+KCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoSVByb2plY3QgY2FuZGlkYXRlIDogcHJvamVjdHMpIHsKLQkJCWlmIChGYWNldFV0aWxzLmlzUGFyUHJvamVjdChjYW5kaWRhdGUpKSB7Ci0JCQkJaWYgKEFycmF5cy5hc0xpc3QoZ2V0QnVuZGxlUHJvamVjdHMoY2FuZGlkYXRlKSkuY29udGFpbnMocHJvamVjdCkpIHsKLQkJCQkJYnVuZGxlcy5hZGQoY2FuZGlkYXRlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZXMudG9BcnJheShuZXcgSVByb2plY3RbYnVuZGxlcy5zaXplKCldKTsKLQl9CisgICAgcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldFBhclByb2plY3RzKElQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgU2V0PElQcm9qZWN0PiBidW5kbGVzID0gbmV3IEhhc2hTZXQ8SVByb2plY3Q+KCk7CisgICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7CisgICAgICAgIGZvciAoSVByb2plY3QgY2FuZGlkYXRlIDogcHJvamVjdHMpIHsKKyAgICAgICAgICAgIGlmIChGYWNldFV0aWxzLmlzUGFyUHJvamVjdChjYW5kaWRhdGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKEFycmF5cy5hc0xpc3QoZ2V0QnVuZGxlUHJvamVjdHMoY2FuZGlkYXRlKSkuY29udGFpbnMocHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlcy5hZGQoY2FuZGlkYXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1bmRsZXMudG9BcnJheShuZXcgSVByb2plY3RbYnVuZGxlcy5zaXplKCldKTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0QnVuZGxlUHJvamVjdHMoSVByb2plY3QgcGFyUHJvamVjdCkgewotCQlTZXQ8SVByb2plY3Q+IGJ1bmRsZXMgPSBuZXcgSGFzaFNldDxJUHJvamVjdD4oKTsKLQkJaWYgKGlzUGFyUHJvamVjdChwYXJQcm9qZWN0KSkgewotCQkJUGFyIHBhciA9IGdldFBhckRlZmluaXRpb24ocGFyUHJvamVjdCk7Ci0JCQlpZiAocGFyICE9IG51bGwgJiYgcGFyLmdldEJ1bmRsZSgpICE9IG51bGwpIHsKLQkJCQlmb3IgKEJ1bmRsZSBidW5kbGUgOiBwYXIuZ2V0QnVuZGxlKCkpIHsKLQkJCQkJSVByb2plY3QgYnVuZGxlUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQotCQkJCQkJCS5nZXRSb290KCkKLQkJCQkJCQkuZ2V0UHJvamVjdChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJCQlpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QoYnVuZGxlUHJvamVjdCkpIHsKLQkJCQkJCWJ1bmRsZXMuYWRkKGJ1bmRsZVByb2plY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBidW5kbGVzLnRvQXJyYXkobmV3IElQcm9qZWN0W2J1bmRsZXMuc2l6ZSgpXSk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRCdW5kbGVQcm9qZWN0cyhJUHJvamVjdCBwYXJQcm9qZWN0KSB7CisgICAgICAgIFNldDxJUHJvamVjdD4gYnVuZGxlcyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0PigpOworICAgICAgICBpZiAoaXNQYXJQcm9qZWN0KHBhclByb2plY3QpKSB7CisgICAgICAgICAgICBQYXIgcGFyID0gZ2V0UGFyRGVmaW5pdGlvbihwYXJQcm9qZWN0KTsKKyAgICAgICAgICAgIGlmIChwYXIgIT0gbnVsbCAmJiBwYXIuZ2V0QnVuZGxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IHBhci5nZXRCdW5kbGUoKSkgeworICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBidW5kbGVQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChidW5kbGVQcm9qZWN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlcy5hZGQoYnVuZGxlUHJvamVjdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1bmRsZXMudG9BcnJheShuZXcgSVByb2plY3RbYnVuZGxlcy5zaXplKCldKTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIFBhciBnZXRQYXJEZWZpbml0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2Ugc2V0IHRvIGhvbGQgdGhlIHJlc291cmNlcy4KLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCS8vIFJlZ2lzdGVyIHRoZSBwYWNrYWdlIHRvIGVuc3VyZSBpdCBpcyBhdmFpbGFibGUgZHVyaW5nIGxvYWRpbmcuCi0JCXJlc291cmNlU2V0LmdldFBhY2thZ2VSZWdpc3RyeSgpLnB1dChQYXJQYWNrYWdlLmVOU19VUkksIFBhclBhY2thZ2UuZUlOU1RBTkNFKTsKKyAgICBwdWJsaWMgc3RhdGljIFBhciBnZXRQYXJEZWZpbml0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgcmVzb3VyY2Ugc2V0IHRvIGhvbGQgdGhlIHJlc291cmNlcy4KKyAgICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7CisgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBwYWNrYWdlIHRvIGVuc3VyZSBpdCBpcyBhdmFpbGFibGUgZHVyaW5nIGxvYWRpbmcuCisgICAgICAgIHJlc291cmNlU2V0LmdldFBhY2thZ2VSZWdpc3RyeSgpLnB1dChQYXJQYWNrYWdlLmVOU19VUkksIFBhclBhY2thZ2UuZUlOU1RBTkNFKTsKIAotCQlGaWxlIHBhckZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShwcm9qZWN0LmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yQ2hhciArICIuc2V0dGluZ3MiKSwKLQkJCQkib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5wYXIueG1sIik7Ci0JCWlmIChwYXJGaWxlLmV4aXN0cygpKSB7Ci0JCQlVUkkgZmlsZVVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhckZpbGUudG9TdHJpbmcoKSk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoZmlsZVVyaSwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgUGFja2FnZU5vdEZvdW5kRXhjZXB0aW9uKSB7Ci0JCQkJCS8vSGFuZGxlIGNhc2Ugd2hlcmUgd2UgbmVlZCB0byB1cGRhdGUgb2xkIHBhciBmaWxlIGZvcm1hdC4KLQkJCQkJdHJ5IHsKLQkJCQkJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHBhckZpbGUpKTsKLQkJCQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJCQkJU3RyaW5nIG5leHQgPSBici5yZWFkTGluZSgpOwotCQkJCQkJZG8gewotCQkJCQkJCW5leHQgPSBuZXh0LnJlcGxhY2VBbGwoImh0dHA6Ly8vY29tL3NwcmluZ3NvdXJjZS9zZXJ2ZXIvaWRlL3Bhci5lY29yZSIsCi0JCQkJCQkJCQkiaHR0cDovL2VjbGlwc2Uub3JnL3ZpcmdvL3Bhci5lY29yZSIpOwotCQkJCQkJCW5leHQgPSBuZXh0LnJlcGxhY2VBbGwoImNvbVxcLnNwcmluZ3NvdXJjZVxcLnNlcnZlciIsICJvcmcuZWNsaXBzZS52aXJnbyIpOwotCQkJCQkJCXNiLmFwcGVuZChuZXh0ICsgIlxuIik7Ci0JCQkJCQkJbmV4dCA9IGJyLnJlYWRMaW5lKCk7Ci0JCQkJCQl9IHdoaWxlIChuZXh0ICE9IG51bGwpOwotCQkJCQkJYnIuY2xvc2UoKTsKLQkJCQkJCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHBhckZpbGUpKTsKLQkJCQkJCWJ3LndyaXRlKHNiLnRvU3RyaW5nKCkpOwotCQkJCQkJYncuY2xvc2UoKTsKLQkJCQkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCQkJCQlyZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKGZpbGVVcmksIHRydWUpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZTEpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlMik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKFBhcikgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJfQorICAgICAgICBGaWxlIHBhckZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShwcm9qZWN0LmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yQ2hhciArICIuc2V0dGluZ3MiKSwKKyAgICAgICAgICAgICJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnBhci54bWwiKTsKKyAgICAgICAgaWYgKHBhckZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIFVSSSBmaWxlVXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGFyRmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIFJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShmaWxlVXJpLCB0cnVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBQYWNrYWdlTm90Rm91bmRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlcmUgd2UgbmVlZCB0byB1cGRhdGUgb2xkIHBhciBmaWxlIGZvcm1hdC4KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHBhckZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5leHQgPSBici5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBuZXh0LnJlcGxhY2VBbGwoImh0dHA6Ly8vY29tL3NwcmluZ3NvdXJjZS9zZXJ2ZXIvaWRlL3Bhci5lY29yZSIsICJodHRwOi8vZWNsaXBzZS5vcmcvdmlyZ28vcGFyLmVjb3JlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG5leHQucmVwbGFjZUFsbCgiY29tXFwuc3ByaW5nc291cmNlXFwuc2VydmVyIiwgIm9yZy5lY2xpcHNlLnZpcmdvIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG5leHQgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gYnIucmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG5leHQgIT0gbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBici5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRXcml0ZXIgYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIocGFyRmlsZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYncud3JpdGUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBidy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoZmlsZVVyaSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlMSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoUGFyKSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICB9CiAKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldFBhckZpbGUoSVByb2plY3QgcHJvamVjdCkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9qZWN0LmZpbmRNZW1iZXIobmV3IFBhdGgoIi5zZXR0aW5ncyIpLmFwcGVuZCgib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5wYXIueG1sIikpOwotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJcmV0dXJuIChJRmlsZSkgcmVzb3VyY2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0UGFyRmlsZShJUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IHByb2plY3QuZmluZE1lbWJlcihuZXcgUGF0aCgiLnNldHRpbmdzIikuYXBwZW5kKCJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnBhci54bWwiKSk7CisgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7CisgICAgICAgICAgICByZXR1cm4gKElGaWxlKSByZXNvdXJjZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZmFjZXQvY29yZS9QYXJGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9mYWNldC9jb3JlL1BhckZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKaW5kZXggZTU2MDhiNS4uNzFkNzk5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9mYWNldC9jb3JlL1BhckZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9mYWNldC9jb3JlL1BhckZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMjMsMTggKzI0LDE3IEBACiAKIC8qKgogICogRW1wdHkgaW5zdGFsbCBkZWxlZ2F0ZSBmb3IgdGhlIHBhciBmYWNldC4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBjbGFzcyBQYXJGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7CiAKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJTGlzdDxTdHJpbmc+IG5hdHVyZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChkZXNjLmdldE5hdHVyZUlkcygpKSk7Ci0JCW5hdHVyZXMuYWRkKEZhY2V0Q29yZVBsdWdpbi5QQVJfTkFUVVJFX0lEKTsKLQkJZGVzYy5zZXROYXR1cmVJZHMobmF0dXJlcy50b0FycmF5KG5ldyBTdHJpbmdbXSB7fSkpOwotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2MsIG1vbml0b3IpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOworICAgICAgICBMaXN0PFN0cmluZz4gbmF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KGRlc2MuZ2V0TmF0dXJlSWRzKCkpKTsKKyAgICAgICAgbmF0dXJlcy5hZGQoRmFjZXRDb3JlUGx1Z2luLlBBUl9OQVRVUkVfSUQpOworICAgICAgICBkZXNjLnNldE5hdHVyZUlkcyhuYXR1cmVzLnRvQXJyYXkobmV3IFN0cmluZ1tdIHt9KSk7CisgICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzYywgbW9uaXRvcik7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9mYWNldC9jb3JlL1BsYW5GYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9mYWNldC9jb3JlL1BsYW5GYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmluZGV4IDU2MDc1MzcuLjk0OTY0YTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZmFjZXQvY29yZS9QbGFuRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ZhY2V0L2NvcmUvUGxhbkZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMjMsMTkgKzI0LDE4IEBACiAKIC8qKgogICogRW1wdHkgaW5zdGFsbCBkZWxlZ2F0ZSBmb3IgdGhlIHBsYW4gZmFjZXQuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAyLjMuMQogICovCiBwdWJsaWMgY2xhc3MgUGxhbkZhY2V0SW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKIAotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIE9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlMaXN0PFN0cmluZz4gbmF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KGRlc2MuZ2V0TmF0dXJlSWRzKCkpKTsKLQkJbmF0dXJlcy5hZGQoRmFjZXRDb3JlUGx1Z2luLlBMQU5fTkFUVVJFX0lEKTsKLQkJZGVzYy5zZXROYXR1cmVJZHMobmF0dXJlcy50b0FycmF5KG5ldyBTdHJpbmdbXSB7fSkpOwotCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2MsIG1vbml0b3IpOworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIE9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2MgPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBuYXR1cmVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoZGVzYy5nZXROYXR1cmVJZHMoKSkpOworICAgICAgICBuYXR1cmVzLmFkZChGYWNldENvcmVQbHVnaW4uUExBTl9OQVRVUkVfSUQpOworICAgICAgICBkZXNjLnNldE5hdHVyZUlkcyhuYXR1cmVzLnRvQXJyYXkobmV3IFN0cmluZ1tdIHt9KSk7CisgICAgICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzYywgbW9uaXRvcik7CiAKLQl9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9mYWNldC9jb3JlL1NlcnZlck5hdHVyZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9mYWNldC9jb3JlL1NlcnZlck5hdHVyZS5qYXZhCmluZGV4IGM2MDFiODAuLjZhNjRhODAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvZmFjZXQvY29yZS9TZXJ2ZXJOYXR1cmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuZmFjZXQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ZhY2V0L2NvcmUvU2VydmVyTmF0dXJlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKQEAgLTE2LDI2ICsxNywyNiBAQAogCiAvKioKICAqIEJhc2ljIHtAbGluayBJUHJvamVjdE5hdHVyZX0gaW1wbGVtZW50YXRpb24gZm9yIHNlcnZlciBuYXR1cmVzIChidW5kbGUgYW5kIHBhcikuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgU2VydmVyTmF0dXJlIGltcGxlbWVudHMgSVByb2plY3ROYXR1cmUgewogCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OworICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKIAotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9CisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgIH0KIAotCXB1YmxpYyB2b2lkIGRlY29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KKyAgICBwdWJsaWMgdm9pZCBkZWNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICB9CiAKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdDsKLQl9CisgICAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnByb2plY3Q7CisgICAgfQogCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgeworICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggYmJhY2E2ZC4uNDMyMWJkOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0xLDQgKzEsMyBAQAotI1dlZCBNYXIgMDIgMTY6MDA6MDYgUFNUIDIwMTEKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQpAQCAtOCw2ICs3LDggQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQpAQCAtODIsMzUgKzgzLDM3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249NDgKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnk9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCkBAIC0xMjEsMzAgKzEyNCwzMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbGFtYmRhX2JvZHk9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lcz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xMjAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZGlzYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvZmYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5lbmFibGluZ190YWc9QGZvcm1hdHRlclw6b24KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCkBAIC0xNTgsNyArMTYyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkPWluc2VydApAQCAtMTY2LDEwICsxNzAsMTEgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZW1iZXI9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWw9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfdHlwZV9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydApAQCAtMjE3LDYgKzIyMiw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0yMzUsMTIgKzI0MSwxNCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CkBAIC0yNjQsNiArMjcyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0CkBAIC0yOTEsNiArMzAwLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0zMTksNiArMzI5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3RyeT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydApAQCAtMzI4LDYgKzMzOSw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0zNDMsMTUgKzM1NSwxNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTIwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj1zcGFjZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX29uX29mZl90YWdzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YUZvcm1hdHRlcj1vcmcuZWNsaXBzZS5qZHQuY29yZS5kZWZhdWx0SmF2YUZvcm1hdHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwppbmRleCA3ZTdmZTczLi42Yzk4MDE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMSw3ICsxLDY1IEBACitjbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19tZXRob2RzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnNfaW50ZXJmYWNlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfZnVuY3Rpb25hbF9pbnRlcmZhY2VzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKK2NsZWFudXAuY29ycmVjdF9pbmRlbnRhdGlvbj1mYWxzZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGVfY2hhbmdlc19vbmx5PWZhbHNlCitjbGVhbnVwLmluc2VydF9pbmZlcnJlZF90eXBlX2FyZ3VtZW50cz1mYWxzZQorY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV90eXBlX2Fic3RyYWN0X2lmX21pc3NpbmdfbWV0aG9kPWZhbHNlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKK2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK2NsZWFudXAucmVtb3ZlX3JlZHVuZGFudF90eXBlX2FyZ3VtZW50cz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorY2xlYW51cC51c2VfYW5vbnltb3VzX2NsYXNzX2NyZWF0aW9uPWZhbHNlCitjbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK2NsZWFudXAudXNlX2xhbWJkYT10cnVlCitjbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cC51c2VfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXBfcHJvZmlsZT1fVmlyZ28gV2ViIFNlcnZlciAtIENvZGUgQ2xlYW4gVXAKIGNsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCiBlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQogZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fTXlseW4gYmFzZWQgb24gRWNsaXBzZQorZm9ybWF0dGVyX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIEZvcm1hdHRlcgogZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTIKIGludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CiBvcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2NvcmUvSmR0Q29yZVBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2NvcmUvSmR0Q29yZVBsdWdpbi5qYXZhCmluZGV4IDQzODM1MjcuLjIyZjBhMmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9jb3JlL0pkdENvcmVQbHVnaW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvY29yZS9KZHRDb3JlUGx1Z2luLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CkBAIC0yNCw3MCArMjUsNjkgQEAKIAogLyoqCiAgKiBCdW5kbGUge0BsaW5rIEpkdENvcmVQbHVnaW59IGZvciB0aGUgamR0LmNvcmUgcGx1Zy1pbi4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBjbGFzcyBKZHRDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKIAotCS8qKiBUaGUgYnVuZGxlLXN5bWJvbGljIG5hbWUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlIjsKKyAgICAvKiogVGhlIGJ1bmRsZS1zeW1ib2xpYyBuYW1lICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuY29yZSI7CiAKLQkvKioKLQkgKiBUaGUgbWFya2VyIGlkIHVzZWQgZm9yIGNyZWF0aW5nIG1hcmtlcnMgdGhhdCBpbmRpY2F0ZSB1bi1yZXNvbHZlZCBkZXBlbmRlbmNpZXMgb24gYnVuZGxlIG1hbmlmZXN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUEVOREVOQ1lfUFJPQkxFTV9NQVJLRVJfSUQgPSBQTFVHSU5fSUQgKyAiLmRlcGVuZGVuY3lwcm9ibGVtbWFya2VyIjsKKyAgICAvKioKKyAgICAgKiBUaGUgbWFya2VyIGlkIHVzZWQgZm9yIGNyZWF0aW5nIG1hcmtlcnMgdGhhdCBpbmRpY2F0ZSB1bi1yZXNvbHZlZCBkZXBlbmRlbmNpZXMgb24gYnVuZGxlIG1hbmlmZXN0cworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUEVOREVOQ1lfUFJPQkxFTV9NQVJLRVJfSUQgPSBQTFVHSU5fSUQgKyAiLmRlcGVuZGVuY3lwcm9ibGVtbWFya2VyIjsKIAotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKZHRDb3JlUGx1Z2luIHBsdWdpbjsKKyAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCisgICAgcHJpdmF0ZSBzdGF0aWMgSmR0Q29yZVBsdWdpbiBwbHVnaW47CiAKLQlwcml2YXRlIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lckJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIgYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcjsKKyAgICBwcml2YXRlIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lckJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIgYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcjsKIAotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCQlidW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyID0gbmV3IFNlcnZlckNsYXNzcGF0aENvbnRhaW5lckJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmdldEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpLmFkZEJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIoCi0JCQkJYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCVNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmFkZEJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lcihidW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7CisgICAgICAgIHBsdWdpbiA9IHRoaXM7CisgICAgICAgIHRoaXMuYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lciA9IG5ldyBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgIEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5nZXRCdW5kbGVNYW5pZmVzdE1hbmFnZXIoKS5hZGRCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyKHRoaXMuYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIFNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmFkZEJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmdldEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpLnJlbW92ZUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIoCi0JCQkJYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCVNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLnJlbW92ZUJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlidW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyKTsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwbHVnaW4gPSBudWxsOworICAgICAgICBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkucmVtb3ZlQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIpOworICAgICAgICBTZXJ2ZXJDb3JlUGx1Z2luLmdldEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKS5yZW1vdmVCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIodGhpcy5idW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKKyAgICB9CiAKLQlwdWJsaWMgSUVjbGlwc2VQcmVmZXJlbmNlcyBnZXRQcm9qZWN0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlJU2NvcGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpOwotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBjb250ZXh0LmdldE5vZGUoUExVR0lOX0lEKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQorICAgIHB1YmxpYyBJRWNsaXBzZVByZWZlcmVuY2VzIGdldFByb2plY3RQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIElTY29wZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCk7CisgICAgICAgIElFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IGNvbnRleHQuZ2V0Tm9kZShQTFVHSU5fSUQpOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIEpkdENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9CisgICAgcHVibGljIHN0YXRpYyBKZHRDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7CisgICAgICAgIHJldHVybiBwbHVnaW47CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCW1lc3NhZ2UgPSAiIjsKLQkJfQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIDAsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCBtZXNzYWdlLCBleGNlcHRpb24pOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7CisgICAgICAgIGdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coY3JlYXRlRXJyb3JTdGF0dXMobWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKyAgICAgICAgZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhjcmVhdGVFcnJvclN0YXR1cyhtZXNzYWdlLCBleGNlcHRpb24pKTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhjcmVhdGVFcnJvclN0YXR1cyhleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKLQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAgICAgIGdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coY3JlYXRlRXJyb3JTdGF0dXMoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvY29yZS9TZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2NvcmUvU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyUHJvcGVydHlUZXN0ZXIuamF2YQppbmRleCA5ZWJhMGI3Li41OTFhY2I5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvY29yZS9TZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJQcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9jb3JlL1NlcnZlckNsYXNzcGF0aENvbnRhaW5lclByb3BlcnR5VGVzdGVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKQEAgLTI0LDE0ICsyNSwxNCBAQAogICovCiBwdWJsaWMgY2xhc3MgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyUHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlciB7CiAKLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBJUmVzb3VyY2UgJiYgImlzRW5hYmxlZCIuZXF1YWxzKHByb3BlcnR5KSkgeyAvLyROT04tTkxTLTEkCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKChJUmVzb3VyY2UpIHJlY2VpdmVyKS5nZXRQcm9qZWN0KCk7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoRmFjZXRVdGlscy5oYXNOYXR1cmUocHJvamVjdCwgSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCQkJCXJldHVybiBDbGFzc3BhdGhVdGlscy5oYXNDbGFzc3BhdGhDb250YWluZXIoamF2YVByb2plY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKKyAgICAgICAgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSVJlc291cmNlICYmICJpc0VuYWJsZWQiLmVxdWFscyhwcm9wZXJ0eSkpIHsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9ICgoSVJlc291cmNlKSByZWNlaXZlcikuZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOworICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaGFzTmF0dXJlKHByb2plY3QsIEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3NwYXRoVXRpbHMuaGFzQ2xhc3NwYXRoQ29udGFpbmVyKGphdmFQcm9qZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL2NvcmUvY2xhc3NwYXRoL1NlcnZlckNsYXNzcGF0aENvbnRhaW5lci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL2NvcmUvY2xhc3NwYXRoL1NlcnZlckNsYXNzcGF0aENvbnRhaW5lci5qYXZhCmluZGV4IGU0ZGJkZGQuLjJlODAwMWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC9jb3JlL2NsYXNzcGF0aC9TZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS9jbGFzc3BhdGgvU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5pbnRlcm5hbC5jb3JlLmNsYXNzcGF0aDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTYzLDYxMyArNjQsNTc1IEBACiAgKiA8cD4KICAqIFRoaXMgaW1wbGVtZW50YXRpb24gY3JlYXRlcyB2ZXJ5IHJpZ29yb3VzIGFjY2Vzc2liaWxpdHkgcnVsZXMgb24gZXZlcnkge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0gdGhhdCBpdCBjcmVhdGVzLiBUaG9zZQogICogcnVsZXMgbWF0Y2ggdGhlIE9TR2kgcnVudGltZSBlbnZpcm9ubWVudCBhbmQgdGhlcmVmb3JlIG1pcnJvciB0aGUgcnVudGltZSBjbGFzcyBwYXRoIGluIHRoZSBTcHJpbmdTb3VyY2UgQVAuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyIGltcGxlbWVudHMgSUNsYXNzcGF0aENvbnRhaW5lciB7CiAKLQkvKioKLQkgKiBLZXkgb2YgdGhlIHtAbGluayBJQ2xhc3NwYXRoQXR0cmlidXRlfSB0aGF0IGluZGljYXRlcyB0aGF0IGEgY2VydGFpbiB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fSBoYXMgYmVlbiBjcmVhdGVkIGJ5Ci0JICogdGhpcyBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEhfQVRUUklCVVRFX1ZBTFVFID0gSmR0Q29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkNMQVNTUEFUSF9FTlRSWSI7CisgICAgLyoqCisgICAgICogS2V5IG9mIHRoZSB7QGxpbmsgSUNsYXNzcGF0aEF0dHJpYnV0ZX0gdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIGNlcnRhaW4ge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0gaGFzIGJlZW4gY3JlYXRlZCBieQorICAgICAqIHRoaXMgY29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX0FUVFJJQlVURV9WQUxVRSA9IEpkdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5DTEFTU1BBVEhfRU5UUlkiOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1RfVElNRVNUQU1QID0gIk1BTklGRVNUX1RJTUVTVEFNUCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1RfVElNRVNUQU1QID0gIk1BTklGRVNUX1RJTUVTVEFNUCI7CiAKLQkvKiogTmFtZSBvZiB0aGlzIGNsYXNzIHBhdGggY29udGFpbmVyIHRvIGJlIHN0b3JlZCBieSBKRFQgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX0NPTlRBSU5FUiA9IEpkdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5NQU5JRkVTVF9DTEFTU1BBVEhfQ09OVEFJTkVSIjsKKyAgICAvKiogTmFtZSBvZiB0aGlzIGNsYXNzIHBhdGggY29udGFpbmVyIHRvIGJlIHN0b3JlZCBieSBKRFQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX0NPTlRBSU5FUiA9IEpkdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5NQU5JRkVTVF9DTEFTU1BBVEhfQ09OVEFJTkVSIjsKIAotCS8qKiBDbGFzc3BhdGggY29udGFpbmVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX0NPTlRBSU5FUl9ERVNDUklQVElPTiA9ICJCdW5kbGUgRGVwZW5kZW5jaWVzIjsKKyAgICAvKiogQ2xhc3NwYXRoIGNvbnRhaW5lciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSF9DT05UQUlORVJfREVTQ1JJUFRJT04gPSAiQnVuZGxlIERlcGVuZGVuY2llcyI7CiAKLQkvKiogVW5pcXVlIHBhdGggb2YgdGhpcyBjbGFzcyBwYXRoIGNvbnRhaW5lciAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggQ0xBU1NQQVRIX0NPTlRBSU5FUl9QQVRIID0gbmV3IFBhdGgoQ0xBU1NQQVRIX0NPTlRBSU5FUik7CisgICAgLyoqIFVuaXF1ZSBwYXRoIG9mIHRoaXMgY2xhc3MgcGF0aCBjb250YWluZXIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIENMQVNTUEFUSF9DT05UQUlORVJfUEFUSCA9IG5ldyBQYXRoKENMQVNTUEFUSF9DT05UQUlORVIpOwogCi0JLyoqCi0JICogS2V5IG9mIHRoZSB7QGxpbmsgSUNsYXNzcGF0aEF0dHJpYnV0ZX0gdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIGNlcnRhaW4ge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0gaGFzIGJlZW4gY3JlYXRlZCBieQotCSAqIHRoaXMgY29udGFpbmVyIGFuZCBpcyBhIHRlc3QgZGVwZW5kZW5jeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0xBU1NQQVRIX0FUVFJJQlVURV9WQUxVRSA9IEpkdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5URVNUX0NMQVNTUEFUSF9FTlRSWSI7CisgICAgLyoqCisgICAgICogS2V5IG9mIHRoZSB7QGxpbmsgSUNsYXNzcGF0aEF0dHJpYnV0ZX0gdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIGNlcnRhaW4ge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0gaGFzIGJlZW4gY3JlYXRlZCBieQorICAgICAqIHRoaXMgY29udGFpbmVyIGFuZCBpcyBhIHRlc3QgZGVwZW5kZW5jeQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0xBU1NQQVRIX0FUVFJJQlVURV9WQUxVRSA9IEpkdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5URVNUX0NMQVNTUEFUSF9FTlRSWSI7CiAKLQkvKioKLQkgKiB7QGxpbmsgSUNsYXNzcGF0aEF0dHJpYnV0ZX0gdG8gcHJldmVudCBXVFAgd2FybmluZyBvZiBub24gZXhwb3J0YWJsZSBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBDTEFTU1BBVEhfQ09OVEFJTkVSX0FUVFJJQlVURSA9IG5ldyBJQ2xhc3NwYXRoQXR0cmlidXRlW10geyBKYXZhQ29yZS5uZXdDbGFzc3BhdGhBdHRyaWJ1dGUoCi0JCQkib3JnLmVjbGlwc2UuanN0LmNvbXBvbmVudC5ub25kZXBlbmRlbmN5IiwgIiIpIH07CisgICAgLyoqCisgICAgICoge0BsaW5rIElDbGFzc3BhdGhBdHRyaWJ1dGV9IHRvIHByZXZlbnQgV1RQIHdhcm5pbmcgb2Ygbm9uIGV4cG9ydGFibGUgY29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlW10gQ0xBU1NQQVRIX0NPTlRBSU5FUl9BVFRSSUJVVEUgPSBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIHsKKyAgICAgICAgSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKCJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50Lm5vbmRlcGVuZGVuY3kiLCAiIikgfTsKIAotCS8qKiBJbnRlcm5hbCBjYWNoZSBvZiB7QGxpbmsgSUFjY2Vzc1J1bGV9cyBrZXllZCBieSBhIHtAbGluayBJUGF0aH0gKi8KLQlwcml2YXRlIHN0YXRpYyBNYXA8SVBhdGgsIElBY2Nlc3NSdWxlPiBhY2Nlc3NpYmxlUnVsZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SVBhdGgsIElBY2Nlc3NSdWxlPigpOworICAgIC8qKiBJbnRlcm5hbCBjYWNoZSBvZiB7QGxpbmsgSUFjY2Vzc1J1bGV9cyBrZXllZCBieSBhIHtAbGluayBJUGF0aH0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8SVBhdGgsIElBY2Nlc3NSdWxlPiBhY2Nlc3NpYmxlUnVsZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SVBhdGgsIElBY2Nlc3NSdWxlPigpOwogCi0JLyoqCi0JICoge0BsaW5rIElDbGFzc3BhdGhBdHRyaWJ1dGV9IHRoYXQgaXMgaW5zdGFsbGVkIG9uIGEge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0gdG8gaW5kaWNhdGUgdGhhdCBhIGNlcnRhaW4gZW50cnkgaGFzCi0JICogYmVlbiBjcmVhdGVkIGJ5IHRoaXMgY2xhc3MgcGF0aCBjb250YWluZXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlW10gQ0xBU1NQQVRIX0FUVFJJQlVURVMgPSBuZXcgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIHsgSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKAotCQkJQ0xBU1NQQVRIX0FUVFJJQlVURV9WQUxVRSwgInRydWUiKSB9OworICAgIC8qKgorICAgICAqIHtAbGluayBJQ2xhc3NwYXRoQXR0cmlidXRlfSB0aGF0IGlzIGluc3RhbGxlZCBvbiBhIHtAbGluayBJQ2xhc3NwYXRoRW50cnl9IHRvIGluZGljYXRlIHRoYXQgYSBjZXJ0YWluIGVudHJ5IGhhcworICAgICAqIGJlZW4gY3JlYXRlZCBieSB0aGlzIGNsYXNzIHBhdGggY29udGFpbmVyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIENMQVNTUEFUSF9BVFRSSUJVVEVTID0gbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbXSB7CisgICAgICAgIEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZShDTEFTU1BBVEhfQVRUUklCVVRFX1ZBTFVFLCAidHJ1ZSIpIH07CiAKLQkvKiogV2lsZGNhcmQgc3RyaW5nIHVzZWQgdG8gYXBwZW5kIHRvIGEgcGFja2FnZSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX1dJTERDQVJEID0gIi8qIjsKKyAgICAvKiogV2lsZGNhcmQgc3RyaW5nIHVzZWQgdG8gYXBwZW5kIHRvIGEgcGFja2FnZSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX1dJTERDQVJEID0gIi8qIjsKIAotCS8qKgotCSAqIHtAbGluayBJQ2xhc3NwYXRoQXR0cmlidXRlfSB0aGF0IGlzIGluc3RhbGxlZCBvbiBhIHtAbGluayBJQ2xhc3NwYXRoRW50cnl9IHRvIGluZGljYXRlIHRoYXQgYSBjZXJ0YWluIGVudHJ5IGhhcwotCSAqIGJlZW4gY3JlYXRlZCBieSB0aGlzIGNsYXNzIHBhdGggY29udGFpbmVyIGFuZCBpcyBhIHRlc3QgZGVwZW5kZW5jeQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBURVNUX0NMQVNTUEFUSF9BVFRSSUJVVEVTID0gbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbXSB7IEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZSgKLQkJCVRFU1RfQ0xBU1NQQVRIX0FUVFJJQlVURV9WQUxVRSwgInRydWUiKSB9OworICAgIC8qKgorICAgICAqIHtAbGluayBJQ2xhc3NwYXRoQXR0cmlidXRlfSB0aGF0IGlzIGluc3RhbGxlZCBvbiBhIHtAbGluayBJQ2xhc3NwYXRoRW50cnl9IHRvIGluZGljYXRlIHRoYXQgYSBjZXJ0YWluIGVudHJ5IGhhcworICAgICAqIGJlZW4gY3JlYXRlZCBieSB0aGlzIGNsYXNzIHBhdGggY29udGFpbmVyIGFuZCBpcyBhIHRlc3QgZGVwZW5kZW5jeQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBURVNUX0NMQVNTUEFUSF9BVFRSSUJVVEVTID0gbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbXSB7CisgICAgICAgIEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZShURVNUX0NMQVNTUEFUSF9BVFRSSUJVVEVfVkFMVUUsICJ0cnVlIikgfTsKIAotCS8qKiBXaWxkY2FyZCBzdHJpbmcgaW5kaWNhdGluZyB0aGUgZW50aXJlIHBhY2thZ2VzIGluIGEgY2VydGFpbiB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSUxEQ0FSRF9QQVRIID0gIioqLyoiOworICAgIC8qKiBXaWxkY2FyZCBzdHJpbmcgaW5kaWNhdGluZyB0aGUgZW50aXJlIHBhY2thZ2VzIGluIGEgY2VydGFpbiB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fSAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSUxEQ0FSRF9QQVRIID0gIioqLyoiOwogCi0JLyoqIHtAbGluayBJQWNjZXNzUnVsZX0gdGhhdCBlbmFibGVzIGFjY2VzcyB0byBhbnkgcGFja2FnZSBpbiBhIHtAbGluayBJQ2xhc3NwYXRoRW50cnl9LiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElBY2Nlc3NSdWxlIFdJTERDQVJEX0FDQ0VTU0lCTEVfUlVMRSA9IEphdmFDb3JlLm5ld0FjY2Vzc1J1bGUobmV3IFBhdGgoV0lMRENBUkRfUEFUSCksCi0JCQlJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOworICAgIC8qKiB7QGxpbmsgSUFjY2Vzc1J1bGV9IHRoYXQgZW5hYmxlcyBhY2Nlc3MgdG8gYW55IHBhY2thZ2UgaW4gYSB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJQWNjZXNzUnVsZSBXSUxEQ0FSRF9BQ0NFU1NJQkxFX1JVTEUgPSBKYXZhQ29yZS5uZXdBY2Nlc3NSdWxlKG5ldyBQYXRoKFdJTERDQVJEX1BBVEgpLCBJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpOwogCi0JLyoqCi0JICoge0BsaW5rIElBY2Nlc3NSdWxlfSB0aGF0IGRpc2FibGVzIGFjY2VzcyB0byBhbnkgcGFja2FnZSBpbiBhIHtAbGluayBJQ2xhc3NwYXRoRW50cnl9LiBUaGlzIHJ1bGUgd2lsbCBiZSBpZ25vcmVkCi0JICogZm9yIGFueSBwYWNrYWdlIHRoYXQgc3BlY2lmaWVzIHtAbGluayBJQWNjZXNzUnVsZSNLX0FDQ0VTU0lCTEV9LCBldmVuIGZvciB0aGUgc2FtZSBwYWNrYWdlIChkdWUgdG8KLQkgKiB7QGxpbmsgSUFjY2Vzc1J1bGUjSUdOT1JFX0lGX0JFVFRFUn0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUFjY2Vzc1J1bGUgV0lMRENBUkRfTk9OX0FDQ0VTU0lCTEVfUlVMRSA9IEphdmFDb3JlLm5ld0FjY2Vzc1J1bGUobmV3IFBhdGgoV0lMRENBUkRfUEFUSCksCi0JCQlJQWNjZXNzUnVsZS5LX05PTl9BQ0NFU1NJQkxFIHwgSUFjY2Vzc1J1bGUuSUdOT1JFX0lGX0JFVFRFUik7CisgICAgLyoqCisgICAgICoge0BsaW5rIElBY2Nlc3NSdWxlfSB0aGF0IGRpc2FibGVzIGFjY2VzcyB0byBhbnkgcGFja2FnZSBpbiBhIHtAbGluayBJQ2xhc3NwYXRoRW50cnl9LiBUaGlzIHJ1bGUgd2lsbCBiZSBpZ25vcmVkCisgICAgICogZm9yIGFueSBwYWNrYWdlIHRoYXQgc3BlY2lmaWVzIHtAbGluayBJQWNjZXNzUnVsZSNLX0FDQ0VTU0lCTEV9LCBldmVuIGZvciB0aGUgc2FtZSBwYWNrYWdlIChkdWUgdG8KKyAgICAgKiB7QGxpbmsgSUFjY2Vzc1J1bGUjSUdOT1JFX0lGX0JFVFRFUn0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUFjY2Vzc1J1bGUgV0lMRENBUkRfTk9OX0FDQ0VTU0lCTEVfUlVMRSA9IEphdmFDb3JlLm5ld0FjY2Vzc1J1bGUobmV3IFBhdGgoV0lMRENBUkRfUEFUSCksCisgICAgICAgIElBY2Nlc3NSdWxlLktfTk9OX0FDQ0VTU0lCTEUgfCBJQWNjZXNzUnVsZS5JR05PUkVfSUZfQkVUVEVSKTsKIAotCS8qKgotCSAqIExvb2tzIHVwIGFuZCByZXR1cm5zIGEge0BsaW5rIElBY2Nlc3NSdWxlfSBmb3IgdGhlIGdpdmVuIDxjb2RlPnBhdGg8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB0byBsb29rIHVwIG9yIGNyZWF0ZSB0aGUgYWNjZXNzIHJ1bGUgZm9yCi0JICogQHJldHVybiBhIHtAbGluayBJQWNjZXNzUnVsZX0gdGhhdCBhbGxvd3MgdG8gYWNjZXNzIHRoZSBnaXZlbiA8Y29kZT5wYXRoPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIElBY2Nlc3NSdWxlIGdldEFjY2Vzc2libGVSdWxlKElQYXRoIHBhdGgpIHsKLQkJaWYgKCFhY2Nlc3NpYmxlUnVsZXMuY29udGFpbnNLZXkocGF0aCkpIHsKLQkJCWFjY2Vzc2libGVSdWxlcy5wdXQocGF0aCwgSmF2YUNvcmUubmV3QWNjZXNzUnVsZShwYXRoLCBJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpKTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZVJ1bGVzLmdldChwYXRoKTsKLQl9CisgICAgLyoqCisgICAgICogTG9va3MgdXAgYW5kIHJldHVybnMgYSB7QGxpbmsgSUFjY2Vzc1J1bGV9IGZvciB0aGUgZ2l2ZW4gPGNvZGU+cGF0aDwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byBsb29rIHVwIG9yIGNyZWF0ZSB0aGUgYWNjZXNzIHJ1bGUgZm9yCisgICAgICogQHJldHVybiBhIHtAbGluayBJQWNjZXNzUnVsZX0gdGhhdCBhbGxvd3MgdG8gYWNjZXNzIHRoZSBnaXZlbiA8Y29kZT5wYXRoPC9jb2RlPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIElBY2Nlc3NSdWxlIGdldEFjY2Vzc2libGVSdWxlKElQYXRoIHBhdGgpIHsKKyAgICAgICAgaWYgKCFhY2Nlc3NpYmxlUnVsZXMuY29udGFpbnNLZXkocGF0aCkpIHsKKyAgICAgICAgICAgIGFjY2Vzc2libGVSdWxlcy5wdXQocGF0aCwgSmF2YUNvcmUubmV3QWNjZXNzUnVsZShwYXRoLCBJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWNjZXNzaWJsZVJ1bGVzLmdldChwYXRoKTsKKyAgICB9CiAKLQkvKiogVGhlIGNhbGN1bGF0ZWQgYW5kIHN0b3JlZCB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fXMgKi8KLQlwcml2YXRlIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXM7CisgICAgLyoqIFRoZSBjYWxjdWxhdGVkIGFuZCBzdG9yZWQge0BsaW5rIElDbGFzc3BhdGhFbnRyeX1zICovCisgICAgcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzOwogCi0JLyoqIFRoZSBpbnRlcm5hbCBmbGFnIHRvIGluZGljYXRlIHRoZSBjb250YWluZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICAvKiogVGhlIGludGVybmFsIGZsYWcgdG8gaW5kaWNhdGUgdGhlIGNvbnRhaW5lciBoYXMgYmVlbiBpbml0aWFsaXplZCAqLworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwogCi0JLyoqIFRoZSB7QGxpbmsgSUphdmFQcm9qZWN0fSB0aGlzIGNsYXNzIHBhdGggY29udGFpbmVyIGluc3RhbmNlIGlzIHJlc3BvbnNpYmxlIGZvciAqLwotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OworICAgIC8qKiBUaGUge0BsaW5rIElKYXZhUHJvamVjdH0gdGhpcyBjbGFzcyBwYXRoIGNvbnRhaW5lciBpbnN0YW5jZSBpcyByZXNwb25zaWJsZSBmb3IgKi8KKyAgICBwcml2YXRlIGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKIAotCS8qKgotCSAqIFRlbXBvcmFsIHN0b3JhZ2UgZm9yIG1hbmlmZXN0IGxvY2F0aW9ucyB0byB7QGxpbmsgSUphdmFQcm9qZWN0fXMuIFRoaXMgaXMgdXNlZCB0byByZXNvbHZlIGludGVyLXdvcmtzcGFjZQotCSAqIGRlcGVuZGVuY2llcwotCSAqLwotCXByaXZhdGUgTWFwPFN0cmluZywgSUphdmFQcm9qZWN0PiBtYW5pZmVzdExvY2F0aW9uc0J5UHJvamVjdDsKKyAgICAvKioKKyAgICAgKiBUZW1wb3JhbCBzdG9yYWdlIGZvciBtYW5pZmVzdCBsb2NhdGlvbnMgdG8ge0BsaW5rIElKYXZhUHJvamVjdH1zLiBUaGlzIGlzIHVzZWQgdG8gcmVzb2x2ZSBpbnRlci13b3Jrc3BhY2UKKyAgICAgKiBkZXBlbmRlbmNpZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIElKYXZhUHJvamVjdD4gbWFuaWZlc3RMb2NhdGlvbnNCeVByb2plY3Q7CiAKLQkvKiogVGhlIHNldCBvZiBzZXJ2ZXIgcnVudGltZXMgdGhhdCBhcmUgdXNlZCB0byByZXNvbHZlIHRoZSBkZXBlbmRlbmNpZXMgKi8KLQlwcml2YXRlIElSdW50aW1lW10gc2VydmVyUnVudGltZXM7CisgICAgLyoqIFRoZSBzZXQgb2Ygc2VydmVyIHJ1bnRpbWVzIHRoYXQgYXJlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVwZW5kZW5jaWVzICovCisgICAgcHJpdmF0ZSBJUnVudGltZVtdIHNlcnZlclJ1bnRpbWVzOwogCi0JLyoqCi0JICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgbmV3IGNsYXNzIHBhdGggY29udGFpbmVyCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUge0BsaW5rIElKYXZhUHJvamVjdH0gdGhhdCB0aGlzIGNvbnRhaW5lciBpcyByZXNwb25zaWJsZSBmb3IKLQkgKi8KLQlwdWJsaWMgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQl0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7Ci0JCXRoaXMuZW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07Ci0JfQorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIG5ldyBjbGFzcyBwYXRoIGNvbnRhaW5lcgorICAgICAqCisgICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSB7QGxpbmsgSUphdmFQcm9qZWN0fSB0aGF0IHRoaXMgY29udGFpbmVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7CisgICAgICAgIHRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKKyAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKKyAgICB9CiAKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBuZXcgY2xhc3MgcGF0aCBjb250YWluZXIKLQkgKiAKLQkgKiBAcGFyYW0gamF2YVByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgSUphdmFQcm9qZWN0fSB0aGF0IHRoaXMgY29udGFpbmVyIGlzIHJlc3BvbnNpYmxlIGZvcgotCSAqIEBwYXJhbSBlbnRyaWVzCi0JICogICAgICAgICAgICBwb3B1bGF0ZSB0aGUgbGlzdCBvZiB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fXMgd2l0aCB0aGUgZ2l2ZW4gbGlzdAotCSAqLwotCXB1YmxpYyBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzKSB7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQkJdGhpcy5lbnRyaWVzID0gZW50cmllczsKLQkJdGhpcy5pbml0aWFsaXplZCA9IHRydWU7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIGEgbmV3IGNsYXNzIHBhdGggY29udGFpbmVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF2YVByb2plY3QgdGhlIHtAbGluayBJSmF2YVByb2plY3R9IHRoYXQgdGhpcyBjb250YWluZXIgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICogQHBhcmFtIGVudHJpZXMgcG9wdWxhdGUgdGhlIGxpc3Qgb2Yge0BsaW5rIElDbGFzc3BhdGhFbnRyeX1zIHdpdGggdGhlIGdpdmVuIGxpc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcykgeworICAgICAgICB0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7CisgICAgICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7CisgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOwogCi0JCS8vIFN0b3JlIHRhcmdldGVkIHJ1bnRpbWVzIHRvIGRpc3BsYXkgaW4gdGhlIGRlc2NyaXB0aW9uCi0JCXNlcnZlclJ1bnRpbWVzID0gU2VydmVyVXRpbHMuZ2V0VGFyZ2V0dGVkUnVudGltZXMoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQl9CisgICAgICAgIC8vIFN0b3JlIHRhcmdldGVkIHJ1bnRpbWVzIHRvIGRpc3BsYXkgaW4gdGhlIGRlc2NyaXB0aW9uCisgICAgICAgIHRoaXMuc2VydmVyUnVudGltZXMgPSBTZXJ2ZXJVdGlscy5nZXRUYXJnZXR0ZWRSdW50aW1lcyhqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHtAbGluayBJQ2xhc3NwYXRoRW50cnl9cyBjYWxjdWxhdGVkIGJ5IHRoaXMgY2xhc3MgcGF0aCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKSB7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb250YWluZXIgaXMgaW5pdGlhbGl6ZWQgb24gZmlyc3QgYWNjZXNzCi0JCWlmIChpbml0aWFsaXplZCkgewotCQkJcmV0dXJuIHRoaXMuZW50cmllczsKLQkJfQotCQkvLyByZWZyZXNoIGNvbnRhaW5lciBiZWZvcmUgZ2l2aW5nIG91dCB0aGUgZW1wdHkgZW50cmllcyBsaXN0Ci0JCXJlZnJlc2hDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCXJldHVybiB0aGlzLmVudHJpZXM7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBJQ2xhc3NwYXRoRW50cnl9cyBjYWxjdWxhdGVkIGJ5IHRoaXMgY2xhc3MgcGF0aCBjb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKSB7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb250YWluZXIgaXMgaW5pdGlhbGl6ZWQgb24gZmlyc3QgYWNjZXNzCisgICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzOworICAgICAgICB9CisgICAgICAgIC8vIHJlZnJlc2ggY29udGFpbmVyIGJlZm9yZSBnaXZpbmcgb3V0IHRoZSBlbXB0eSBlbnRyaWVzIGxpc3QKKyAgICAgICAgcmVmcmVzaENsYXNzcGF0aEVudHJpZXMoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllczsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBjbGFzcyBwYXRoIGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBDTEFTU1BBVEhfQ09OVEFJTkVSX0RFU0NSSVBUSU9OOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyBjbGFzcyBwYXRoIGNvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiBDTEFTU1BBVEhfQ09OVEFJTkVSX0RFU0NSSVBUSU9OOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHtAbGluayBJUnVudGltZX0gdGhhdCBpcyBwcm9qZWN0IGlzIHRhcmdldGVkIGFnYWluc3QKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXJSdW50aW1lcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25TdWZmaXgoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWlmIChzZXJ2ZXJSdW50aW1lcyAhPSBudWxsICYmIHNlcnZlclJ1bnRpbWVzLmxlbmd0aCA+IDApIHsKLQkJCWJ1aWxkZXIuYXBwZW5kKCIgWyIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2ZXJSdW50aW1lcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzZXJ2ZXJSdW50aW1lc1tpXSAhPSBudWxsKSB7Ci0JCQkJCWJ1aWxkZXIuYXBwZW5kKHNlcnZlclJ1bnRpbWVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJCWlmICgoaSArIDEpIDwgc2VydmVyUnVudGltZXMubGVuZ3RoKSB7Ci0JCQkJCQlidWlsZGVyLmFwcGVuZCgiLCAiKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWJ1aWxkZXIuYXBwZW5kKCJdIik7Ci0JCX0KLQkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIElSdW50aW1lfSB0aGF0IGlzIHByb2plY3QgaXMgdGFyZ2V0ZWQgYWdhaW5zdAorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2VydmVyUnVudGltZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uU3VmZml4KCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAodGhpcy5zZXJ2ZXJSdW50aW1lcyAhPSBudWxsICYmIHRoaXMuc2VydmVyUnVudGltZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBbIik7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc2VydmVyUnVudGltZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXJ2ZXJSdW50aW1lc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHRoaXMuc2VydmVyUnVudGltZXNbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgdGhpcy5zZXJ2ZXJSdW50aW1lcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIl0iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGtpbmQgb2YgdGhpcyBjbGFzcyBwYXRoIGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIEtfQVBQTElDQVRJT047Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGtpbmQgb2YgdGhpcyBjbGFzcyBwYXRoIGNvbnRhaW5lcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKKyAgICAgICAgcmV0dXJuIEtfQVBQTElDQVRJT047CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgY2xhc3MgcGF0aCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIENMQVNTUEFUSF9DT05UQUlORVJfUEFUSDsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgY2xhc3MgcGF0aCBjb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIENMQVNTUEFUSF9DT05UQUlORVJfUEFUSDsKKyAgICB9CiAKLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBjbGFzcyBwYXRoIGVudHJpZXMgb2YgdGhlIGdpdmVuIHtAbGluayBJSmF2YVByb2plY3R9LgotCSAqIDxwPgotCSAqIFRoaXMgd2lsbCBpbnN0YWxsIHRoZSBuZXcgY2xhc3MgcGF0aCBlbnRyaWVzIG9uIHRoZSBqYXZhIHByb2plY3Qgb25seSBpZiB0aGUgZW50cmllcyBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKLQkgKiByZWZyZXNoLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hDbGFzc3BhdGhFbnRyaWVzKCkgeworICAgIC8qKgorICAgICAqIFJlZnJlc2ggdGhlIGNsYXNzIHBhdGggZW50cmllcyBvZiB0aGUgZ2l2ZW4ge0BsaW5rIElKYXZhUHJvamVjdH0uCisgICAgICogPHA+CisgICAgICogVGhpcyB3aWxsIGluc3RhbGwgdGhlIG5ldyBjbGFzcyBwYXRoIGVudHJpZXMgb24gdGhlIGphdmEgcHJvamVjdCBvbmx5IGlmIHRoZSBlbnRyaWVzIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdAorICAgICAqIHJlZnJlc2guCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVmcmVzaENsYXNzcGF0aEVudHJpZXMoKSB7CiAKLQkJdGhpcy5tYW5pZmVzdExvY2F0aW9uc0J5UHJvamVjdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSUphdmFQcm9qZWN0PigpOworICAgICAgICB0aGlzLm1hbmlmZXN0TG9jYXRpb25zQnlQcm9qZWN0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJSmF2YVByb2plY3Q+KCk7CiAKLQkJTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKLQkJSURlcGVuZGVuY3lMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotCQl0cnkgewotCQkJQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkKLQkJCQkJLmdldEJ1bmRsZU1hbmlmZXN0KGphdmFQcm9qZWN0KTsKLQkJCUJ1bmRsZU1hbmlmZXN0IHRlc3RNYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5nZXRCdW5kbGVNYW5pZmVzdE1hbmFnZXIoKS5nZXRUZXN0QnVuZGxlTWFuaWZlc3QoCi0JCQkJCWphdmFQcm9qZWN0KTsKKyAgICAgICAgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKKyAgICAgICAgSURlcGVuZGVuY3lMb2NhdG9yIGxvY2F0b3IgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0QnVuZGxlTWFuaWZlc3QodGhpcy5qYXZhUHJvamVjdCk7CisgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdCB0ZXN0TWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0VGVzdEJ1bmRsZU1hbmlmZXN0KHRoaXMuamF2YVByb2plY3QpOwogCi0JCQlpZiAobWFuaWZlc3QgIT0gbnVsbCkgewotCQkJCS8vIENyZWF0ZSBEZXBlbmRlbmN5TG9jYXRvcgotCQkJCWxvY2F0b3IgPSBjcmVhdGVEZXBlbmRlbmN5TG9jYXRvcihqYXZhUHJvamVjdCk7CisgICAgICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBEZXBlbmRlbmN5TG9jYXRvcgorICAgICAgICAgICAgICAgIGxvY2F0b3IgPSBjcmVhdGVEZXBlbmRlbmN5TG9jYXRvcih0aGlzLmphdmFQcm9qZWN0KTsKIAotCQkJCS8vIFJlc29sdmUgZGVwZW5kZW5jaWVzIGZvciB0aGUgbWFpbiBtYW5pZmVzdAotCQkJCXJlc29sdmVEZXBlbmRlbmNpZXMoZW50cmllcywgbWFuaWZlc3QsIGxvY2F0b3IsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIGRlcGVuZGVuY2llcyBmb3IgdGhlIG1haW4gbWFuaWZlc3QKKyAgICAgICAgICAgICAgICByZXNvbHZlRGVwZW5kZW5jaWVzKGVudHJpZXMsIG1hbmlmZXN0LCBsb2NhdG9yLCBmYWxzZSk7CiAKLQkJCQkvLyBSZXNvbHZlIGRlcGVuZGVuY2llcyBmb3IgdGhlIHRlc3QgbWFuaWZlc3QKLQkJCQlpZiAodGVzdE1hbmlmZXN0ICE9IG51bGwpIHsKLQkJCQkJcmVzb2x2ZURlcGVuZGVuY2llcyhlbnRyaWVzLCB0ZXN0TWFuaWZlc3QsIGxvY2F0b3IsIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCUpkdENvcmVQbHVnaW4ubG9nKGUpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gU2h1dGRvd24gRGVwZW5kZW5jeUxvY2F0b3IKLQkJCWlmIChsb2NhdG9yICE9IG51bGwpIHsKLQkJCQlsb2NhdG9yLnNodXRkb3duKCk7Ci0JCQl9CisgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSB0ZXN0IG1hbmlmZXN0CisgICAgICAgICAgICAgICAgaWYgKHRlc3RNYW5pZmVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVEZXBlbmRlbmNpZXMoZW50cmllcywgdGVzdE1hbmlmZXN0LCBsb2NhdG9yLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBKZHRDb3JlUGx1Z2luLmxvZyhlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIFNodXRkb3duIERlcGVuZGVuY3lMb2NhdG9yCisgICAgICAgICAgICBpZiAobG9jYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9jYXRvci5zaHV0ZG93bigpOworICAgICAgICAgICAgfQogCi0JCQkvLyBTb3J0IGVudHJpZXMgYWxwaGFiZXRpY2FsbHkgc29ydCBiZXR0ZXIgc3VwcG9ydCB0aGUgdXNlcgotCQkJQ29sbGVjdGlvbnMuc29ydChlbnRyaWVzLCBuZXcgQ29tcGFyYXRvcjxJQ2xhc3NwYXRoRW50cnk+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShJQ2xhc3NwYXRoRW50cnkgZW50cnkxLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkyKSB7Ci0JCQkJCVN0cmluZyBwYXRoMSA9IGVudHJ5MS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKTsKLQkJCQkJU3RyaW5nIHBhdGgyID0gZW50cnkyLmdldFBhdGgoKS5sYXN0U2VnbWVudCgpOwotCQkJCQlyZXR1cm4gcGF0aDEuY29tcGFyZVRvKHBhdGgyKTsKLQkJCQl9Ci0JCQl9KTsKKyAgICAgICAgICAgIC8vIFNvcnQgZW50cmllcyBhbHBoYWJldGljYWxseSBzb3J0IGJldHRlciBzdXBwb3J0IHRoZSB1c2VyCisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGVudHJpZXMsIG5ldyBDb21wYXJhdG9yPElDbGFzc3BhdGhFbnRyeT4oKSB7CiAKLQkJCXRoaXMuZW50cmllcyA9IGVudHJpZXMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JCQl0aGlzLm1hbmlmZXN0TG9jYXRpb25zQnlQcm9qZWN0ID0gbnVsbDsKLQkJCXRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShJQ2xhc3NwYXRoRW50cnkgZW50cnkxLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkyKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoMSA9IGVudHJ5MS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGgyID0gZW50cnkyLmdldFBhdGgoKS5sYXN0U2VnbWVudCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDEuY29tcGFyZVRvKHBhdGgyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKIAotCQkJLy8gU2F2ZSBjbGFzcyBwYXRoIGVudHJpZXMgdG8gZmlsZQotCQkJU2VydmVyQ2xhc3NwYXRoVXRpbHMucGVyc2lzdENsYXNzcGF0aEVudHJpZXMoamF2YVByb2plY3QsIHRoaXMuZW50cmllcyk7CisgICAgICAgICAgICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLnNpemUoKV0pOworICAgICAgICAgICAgdGhpcy5tYW5pZmVzdExvY2F0aW9uc0J5UHJvamVjdCA9IG51bGw7CisgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKIAotCQkJc2F2ZVRpbWVzdGFtcChCdW5kbGVNYW5pZmVzdFV0aWxzLmxvY2F0ZU1hbmlmZXN0KGphdmFQcm9qZWN0LCBmYWxzZSkpOwotCQkJc2F2ZVRpbWVzdGFtcChCdW5kbGVNYW5pZmVzdFV0aWxzLmxvY2F0ZU1hbmlmZXN0KGphdmFQcm9qZWN0LCB0cnVlKSk7Ci0JCX0KKyAgICAgICAgICAgIC8vIFNhdmUgY2xhc3MgcGF0aCBlbnRyaWVzIHRvIGZpbGUKKyAgICAgICAgICAgIFNlcnZlckNsYXNzcGF0aFV0aWxzLnBlcnNpc3RDbGFzc3BhdGhFbnRyaWVzKHRoaXMuamF2YVByb2plY3QsIHRoaXMuZW50cmllcyk7CiAKLQl9CisgICAgICAgICAgICBzYXZlVGltZXN0YW1wKEJ1bmRsZU1hbmlmZXN0VXRpbHMubG9jYXRlTWFuaWZlc3QodGhpcy5qYXZhUHJvamVjdCwgZmFsc2UpKTsKKyAgICAgICAgICAgIHNhdmVUaW1lc3RhbXAoQnVuZGxlTWFuaWZlc3RVdGlscy5sb2NhdGVNYW5pZmVzdCh0aGlzLmphdmFQcm9qZWN0LCB0cnVlKSk7CisgICAgICAgIH0KIAotCS8qKgotCSAqIFNhdmVzIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWVzdGFtcCB0byB0aGUgZmlsZSByZXNvdXJjZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZVRpbWVzdGFtcChJRmlsZSBtYW5pZmVzdEZpbGUpIHsKLQkJaWYgKG1hbmlmZXN0RmlsZSAhPSBudWxsICYmIG1hbmlmZXN0RmlsZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQltYW5pZmVzdEZpbGUuc2V0UGVyc2lzdGVudFByb3BlcnR5KG5ldyBRdWFsaWZpZWROYW1lKEpkdENvcmVQbHVnaW4uUExVR0lOX0lELCBNQU5JRkVTVF9USU1FU1RBTVApLAotCQkJCQkJTG9uZy50b1N0cmluZyhtYW5pZmVzdEZpbGUuZ2V0TG9jYWxUaW1lU3RhbXAoKSkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJSmR0Q29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlIGFuZCBhZGQgdGhlIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIEJ1bmRsZU1hbmlmZXN0fS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuaWZlc3QKLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiB7QGxpbmsgQnVuZGxlTWFuaWZlc3R9IHRvIGFkZCBjbGFzc3BhdGggZW50cmllcyBmb3IKLQkgKiBAcGFyYW0gdGVzdE1hbmlmZXN0Ci0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFuaWZlc3QgaXMgdGhlIFRFU1QuTUYKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NwYXRoRW50cmllc0Zyb21CdW5kbGVDbGFzc1BhdGgoTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGVudHJpZXMsIEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0LAotCQkJYm9vbGVhbiB0ZXN0TWFuaWZlc3QpIHsKLQkJTGlzdDxTdHJpbmc+IGJ1bmRsZUNsYXNzUGF0aEVudHJpZXMgPSBtYW5pZmVzdC5nZXRCdW5kbGVDbGFzc3BhdGgoKTsKLQkJZm9yIChTdHJpbmcgYnVuZGxlQ2xhc3NQYXRoRW50cnkgOiBidW5kbGVDbGFzc1BhdGhFbnRyaWVzKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZmluZE1lbWJlcihidW5kbGVDbGFzc1BhdGhFbnRyeS50cmltKCkpOwotCQkJaWYgKCEiLiIuZXF1YWxzKGJ1bmRsZUNsYXNzUGF0aEVudHJ5LnRyaW0oKSkgJiYgcmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCUlQYXRoIGJ1bmRsZUNsYXNzUGF0aEVudHJ5UGF0aCA9IHJlc291cmNlLmdldFJhd0xvY2F0aW9uKCk7Ci0JCQkJaWYgKGJ1bmRsZUNsYXNzUGF0aEVudHJ5UGF0aCAhPSBudWxsKSB7Ci0JCQkJCUZpbGUgYnVuZGxlQ2xhc3NQYXRoRW50cnlGaWxlID0gYnVuZGxlQ2xhc3NQYXRoRW50cnlQYXRoLnRvRmlsZSgpOwotCQkJCQlpZiAoYnVuZGxlQ2xhc3NQYXRoRW50cnlGaWxlICE9IG51bGwgJiYgYnVuZGxlQ2xhc3NQYXRoRW50cnlGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQljcmVhdGVDbGFzc3BhdGhFbnRyeUZvckZpbGUoZW50cmllcywgYnVuZGxlQ2xhc3NQYXRoRW50cnlGaWxlLCB0ZXN0TWFuaWZlc3QsCi0JCQkJCQkJCVdJTERDQVJEX0FDQ0VTU0lCTEVfUlVMRSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogU2F2ZXMgdGhlIGxhc3QgbW9kaWZpZWQgdGltZXN0YW1wIHRvIHRoZSBmaWxlIHJlc291cmNlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzYXZlVGltZXN0YW1wKElGaWxlIG1hbmlmZXN0RmlsZSkgeworICAgICAgICBpZiAobWFuaWZlc3RGaWxlICE9IG51bGwgJiYgbWFuaWZlc3RGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1hbmlmZXN0RmlsZS5zZXRQZXJzaXN0ZW50UHJvcGVydHkobmV3IFF1YWxpZmllZE5hbWUoSmR0Q29yZVBsdWdpbi5QTFVHSU5fSUQsIE1BTklGRVNUX1RJTUVTVEFNUCksCisgICAgICAgICAgICAgICAgICAgIExvbmcudG9TdHJpbmcobWFuaWZlc3RGaWxlLmdldExvY2FsVGltZVN0YW1wKCkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIEpkdENvcmVQbHVnaW4ubG9nKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgYWRkcyB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fXMgdG8gdGhlIGdpdmVuIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gZW50cmllcwotCSAqICAgICAgICAgICAgc2V0IHRvIGFkZCB0aGUgbmV3bHkgY3JlYXRlIHtAbGluayBJQ2xhc3NwYXRoRW50cnl9cyB0bwotCSAqIEBwYXJhbSBkZXBlbmRlbmNpZXMKLQkgKiAgICAgICAgICAgIHRoZSByZXNvbHZlZCBkZXBlbmRlbmNpZXMga2V5ZWQgYnkge0BsaW5rIEZpbGV9Ci0JICovCi0JLy8gVE9ETyBDRCBtZXJnZSBpZiBjbGFzc3BhdGggZW50cnkgYWxyZWFkeSBleGlzdHMgd2hlbiByZXNvbHZpbmcgdGhlIHRlc3QgbWFuaWZlc3QKLQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NwYXRoRW50cmllc0Zyb21SZXNvbHV0aW9uUmVzdWx0KExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzLAotCQkJTWFwPEZpbGUsIExpc3Q8U3RyaW5nPj4gZGVwZW5kZW5jaWVzLCBib29sZWFuIHRlc3RNYW5pZmVzdCkgewotCQlTZXQ8U3RyaW5nPiByZXNvbHZlZFBhY2thZ2VJbXBvcnRzID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgYWRkIHRoZSBjbGFzc3BhdGggZW50cmllcyBmb3IgdGhlIGdpdmVuIHtAbGluayBCdW5kbGVNYW5pZmVzdH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuaWZlc3QgdGhlIGdpdmVuIHtAbGluayBCdW5kbGVNYW5pZmVzdH0gdG8gYWRkIGNsYXNzcGF0aCBlbnRyaWVzIGZvcgorICAgICAqIEBwYXJhbSB0ZXN0TWFuaWZlc3QgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1hbmlmZXN0IGlzIHRoZSBURVNULk1GCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZENsYXNzcGF0aEVudHJpZXNGcm9tQnVuZGxlQ2xhc3NQYXRoKExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzLCBCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdCwgYm9vbGVhbiB0ZXN0TWFuaWZlc3QpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGJ1bmRsZUNsYXNzUGF0aEVudHJpZXMgPSBtYW5pZmVzdC5nZXRCdW5kbGVDbGFzc3BhdGgoKTsKKyAgICAgICAgZm9yIChTdHJpbmcgYnVuZGxlQ2xhc3NQYXRoRW50cnkgOiBidW5kbGVDbGFzc1BhdGhFbnRyaWVzKSB7CisgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmphdmFQcm9qZWN0LmdldFByb2plY3QoKS5maW5kTWVtYmVyKGJ1bmRsZUNsYXNzUGF0aEVudHJ5LnRyaW0oKSk7CisgICAgICAgICAgICBpZiAoISIuIi5lcXVhbHMoYnVuZGxlQ2xhc3NQYXRoRW50cnkudHJpbSgpKSAmJiByZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSVBhdGggYnVuZGxlQ2xhc3NQYXRoRW50cnlQYXRoID0gcmVzb3VyY2UuZ2V0UmF3TG9jYXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVuZGxlQ2xhc3NQYXRoRW50cnlQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBidW5kbGVDbGFzc1BhdGhFbnRyeUZpbGUgPSBidW5kbGVDbGFzc1BhdGhFbnRyeVBhdGgudG9GaWxlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGVDbGFzc1BhdGhFbnRyeUZpbGUgIT0gbnVsbCAmJiBidW5kbGVDbGFzc1BhdGhFbnRyeUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNsYXNzcGF0aEVudHJ5Rm9yRmlsZShlbnRyaWVzLCBidW5kbGVDbGFzc1BhdGhFbnRyeUZpbGUsIHRlc3RNYW5pZmVzdCwgV0lMRENBUkRfQUNDRVNTSUJMRV9SVUxFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCQlmb3IgKE1hcC5FbnRyeTxGaWxlLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogZGVwZW5kZW5jaWVzLmVudHJ5U2V0KCkpIHsKLQkJCUZpbGUgZmlsZSA9IGVudHJ5LmdldEtleSgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCVNldDxJQWNjZXNzUnVsZT4gYWxsb3dlZFJ1bGVzID0gY3JlYXRlQWNjZXNzUnVsZXNGcm9tUGFja2FnZUltcG9ydHMoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQkvLyBBZGp1c3QgZmlsZSBuYW1lIHRvIGVsaW1pbmF0ZSBjcm9zcyBwbGF0Zm9ybSBwcm9ibGVtcwotCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLnRvU3RyaW5nKCkucmVwbGFjZSgiXFwiLCAiLyIpOwotCQkJCQlpZiAobWFuaWZlc3RMb2NhdGlvbnNCeVByb2plY3QuY29udGFpbnNLZXkoZmlsZU5hbWUpKSB7Ci0JCQkJCQljcmVhdGVDbGFzc3BhdGhGb3JQcm9qZWN0KGVudHJpZXMsIGZpbGVOYW1lLCB0ZXN0TWFuaWZlc3QsCi0JCQkJCQkJCWFsbG93ZWRSdWxlcy50b0FycmF5KG5ldyBJQWNjZXNzUnVsZVthbGxvd2VkUnVsZXMuc2l6ZSgpXSkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3JlYXRlQ2xhc3NwYXRoRW50cnlGb3JGaWxlKGVudHJpZXMsIGZpbGUsIHRlc3RNYW5pZmVzdCwKLQkJCQkJCQlhbGxvd2VkUnVsZXMudG9BcnJheShuZXcgSUFjY2Vzc1J1bGVbYWxsb3dlZFJ1bGVzLnNpemUoKV0pKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXRlc3RNYW5pZmVzdCkgewotCQkJCS8vIFN0b3JlIGFsbCByZXNvbHZlZCBwYWNrYWdlcwotCQkJCXJlc29sdmVkUGFja2FnZUltcG9ydHMuYWRkQWxsKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgYWRkcyB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fXMgdG8gdGhlIGdpdmVuIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRyaWVzIHNldCB0byBhZGQgdGhlIG5ld2x5IGNyZWF0ZSB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fXMgdG8KKyAgICAgKiBAcGFyYW0gZGVwZW5kZW5jaWVzIHRoZSByZXNvbHZlZCBkZXBlbmRlbmNpZXMga2V5ZWQgYnkge0BsaW5rIEZpbGV9CisgICAgICovCisgICAgLy8gVE9ETyBDRCBtZXJnZSBpZiBjbGFzc3BhdGggZW50cnkgYWxyZWFkeSBleGlzdHMgd2hlbiByZXNvbHZpbmcgdGhlIHRlc3QgbWFuaWZlc3QKKyAgICBwcml2YXRlIHZvaWQgYWRkQ2xhc3NwYXRoRW50cmllc0Zyb21SZXNvbHV0aW9uUmVzdWx0KExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzLCBNYXA8RmlsZSwgTGlzdDxTdHJpbmc+PiBkZXBlbmRlbmNpZXMsIGJvb2xlYW4gdGVzdE1hbmlmZXN0KSB7CisgICAgICAgIFNldDxTdHJpbmc+IHJlc29sdmVkUGFja2FnZUltcG9ydHMgPSBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCk7CisKKyAgICAgICAgZm9yIChNYXAuRW50cnk8RmlsZSwgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IGRlcGVuZGVuY2llcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTZXQ8SUFjY2Vzc1J1bGU+IGFsbG93ZWRSdWxlcyA9IGNyZWF0ZUFjY2Vzc1J1bGVzRnJvbVBhY2thZ2VJbXBvcnRzKGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRqdXN0IGZpbGUgbmFtZSB0byBlbGltaW5hdGUgY3Jvc3MgcGxhdGZvcm0gcHJvYmxlbXMKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZS50b1N0cmluZygpLnJlcGxhY2UoIlxcIiwgIi8iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFuaWZlc3RMb2NhdGlvbnNCeVByb2plY3QuY29udGFpbnNLZXkoZmlsZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVDbGFzc3BhdGhGb3JQcm9qZWN0KGVudHJpZXMsIGZpbGVOYW1lLCB0ZXN0TWFuaWZlc3QsIGFsbG93ZWRSdWxlcy50b0FycmF5KG5ldyBJQWNjZXNzUnVsZVthbGxvd2VkUnVsZXMuc2l6ZSgpXSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ2xhc3NwYXRoRW50cnlGb3JGaWxlKGVudHJpZXMsIGZpbGUsIHRlc3RNYW5pZmVzdCwgYWxsb3dlZFJ1bGVzLnRvQXJyYXkobmV3IElBY2Nlc3NSdWxlW2FsbG93ZWRSdWxlcy5zaXplKCldKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF0ZXN0TWFuaWZlc3QpIHsKKyAgICAgICAgICAgICAgICAvLyBTdG9yZSBhbGwgcmVzb2x2ZWQgcGFja2FnZXMKKyAgICAgICAgICAgICAgICByZXNvbHZlZFBhY2thZ2VJbXBvcnRzLmFkZEFsbChlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWlmICghdGVzdE1hbmlmZXN0KSB7Ci0JCQkvLyBTdG9yZSB0aGUgcmVzb2x2ZWQgcGFja2FnZSBpbXBvcnRzIGJhY2sgaW50byB0aGUgbW9kZWwKLQkJCUlCdW5kbGVNYW5pZmVzdE1hbmFnZXIgYnVuZGxlTWFuaWZlc3RNYW5hZ2VyID0gQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmdldEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpOwotCQkJaWYgKGJ1bmRsZU1hbmlmZXN0TWFuYWdlciBpbnN0YW5jZW9mIElCdW5kbGVNYW5pZmVzdE1hbmdlcldvcmtpbmdDb3B5KSB7Ci0JCQkJKChJQnVuZGxlTWFuaWZlc3RNYW5nZXJXb3JraW5nQ29weSkgYnVuZGxlTWFuaWZlc3RNYW5hZ2VyKS51cGRhdGVSZXNvbHZlZFBhY2thZ2VJbXBvcnRzKGphdmFQcm9qZWN0LAotCQkJCQkJcmVzb2x2ZWRQYWNrYWdlSW1wb3J0cyk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIGlmICghdGVzdE1hbmlmZXN0KSB7CisgICAgICAgICAgICAvLyBTdG9yZSB0aGUgcmVzb2x2ZWQgcGFja2FnZSBpbXBvcnRzIGJhY2sgaW50byB0aGUgbW9kZWwKKyAgICAgICAgICAgIElCdW5kbGVNYW5pZmVzdE1hbmFnZXIgYnVuZGxlTWFuaWZlc3RNYW5hZ2VyID0gQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmdldEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpOworICAgICAgICAgICAgaWYgKGJ1bmRsZU1hbmlmZXN0TWFuYWdlciBpbnN0YW5jZW9mIElCdW5kbGVNYW5pZmVzdE1hbmdlcldvcmtpbmdDb3B5KSB7CisgICAgICAgICAgICAgICAgKChJQnVuZGxlTWFuaWZlc3RNYW5nZXJXb3JraW5nQ29weSkgYnVuZGxlTWFuaWZlc3RNYW5hZ2VyKS51cGRhdGVSZXNvbHZlZFBhY2thZ2VJbXBvcnRzKHRoaXMuamF2YVByb2plY3QsIHJlc29sdmVkUGFja2FnZUltcG9ydHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gcHJvamVjdCBhcyBhIHdvcmtzcGFjZSBwcm9qZWN0IHRvIHRoZSBsaXN0Ci0JICogCi0JICogQHBhcmFtIHdvcmtzcGFjZUJ1bmRsZXMKLQkgKiAgICAgICAgICAgIHRoZSBhbHJlYWR5IGV4aXN0aW5nIHdvcmtzcGFjZSBidW5kbGVzCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBidW5kbGUgcHJvamVjdCB0byBhZGQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkV29ya3NwYWNlQnVuZGxlKFNldDxTdHJpbmc+IHdvcmtzcGFjZUJ1bmRsZXMsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkgJiYgRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkpIHsKLQkJCVN0cmluZyBtYW5pZmVzdEZvbGRlciA9IEJ1bmRsZU1hbmlmZXN0VXRpbHMubG9jYXRlTWFuaWZlc3RGb2xkZXIoSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKLQkJCWlmIChtYW5pZmVzdEZvbGRlciAhPSBudWxsKSB7Ci0JCQkJd29ya3NwYWNlQnVuZGxlcy5hZGQobWFuaWZlc3RGb2xkZXIpOwotCQkJCW1hbmlmZXN0TG9jYXRpb25zQnlQcm9qZWN0LnB1dChtYW5pZmVzdEZvbGRlciwgSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKLQkJCX0KLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBnaXZlbiBwcm9qZWN0IGFzIGEgd29ya3NwYWNlIHByb2plY3QgdG8gdGhlIGxpc3QKKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3Jrc3BhY2VCdW5kbGVzIHRoZSBhbHJlYWR5IGV4aXN0aW5nIHdvcmtzcGFjZSBidW5kbGVzCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGJ1bmRsZSBwcm9qZWN0IHRvIGFkZAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhZGRXb3Jrc3BhY2VCdW5kbGUoU2V0PFN0cmluZz4gd29ya3NwYWNlQnVuZGxlcywgSVByb2plY3QgcHJvamVjdCkgeworICAgICAgICBpZiAocHJvamVjdC5pc0FjY2Vzc2libGUoKSAmJiBGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChwcm9qZWN0KSkgeworICAgICAgICAgICAgU3RyaW5nIG1hbmlmZXN0Rm9sZGVyID0gQnVuZGxlTWFuaWZlc3RVdGlscy5sb2NhdGVNYW5pZmVzdEZvbGRlcihKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOworICAgICAgICAgICAgaWYgKG1hbmlmZXN0Rm9sZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3b3Jrc3BhY2VCdW5kbGVzLmFkZChtYW5pZmVzdEZvbGRlcik7CisgICAgICAgICAgICAgICAgdGhpcy5tYW5pZmVzdExvY2F0aW9uc0J5UHJvamVjdC5wdXQobWFuaWZlc3RGb2xkZXIsIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIHtAbGluayBJQWNjZXNzUnVsZX1zIGZvciB0aGUgZ2l2ZW4gbGlzdCBvZiBpbXBvcnRlZCBwYWNrYWdlcy4KLQkgKiA8cD4KLQkgKiBPbmx5IHRob3NlIHBhY2thZ2VzIGZyb20gdGhlIHtAbGluayBJQ2xhc3NwYXRoRW50cnl9IHRoYXQgYXJlIGltcG9ydGVkIHdpbGwgYmUgdmlzaWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFja2FnZUltcG9ydHMKLQkgKiAgICAgICAgICAgIHRoZSByZXNvbHZlZCBhbmQgZXhwbGljaXQgcGFja2FnZSBpbXBvcnRzCi0JICogQHJldHVybiB0aGUgc2V0IG9mIHtAbGluayBJQWNjZXNzUnVsZX1zCi0JICovCi0JcHJpdmF0ZSBTZXQ8SUFjY2Vzc1J1bGU+IGNyZWF0ZUFjY2Vzc1J1bGVzRnJvbVBhY2thZ2VJbXBvcnRzKExpc3Q8U3RyaW5nPiBwYWNrYWdlSW1wb3J0cykgewotCQlTZXQ8SUFjY2Vzc1J1bGU+IGFsbG93ZWRSdWxlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PElBY2Nlc3NSdWxlPigpOwotCQlmb3IgKFN0cmluZyBwYWNrYWdlSW1wb3J0IDogcGFja2FnZUltcG9ydHMpIHsKLQkJCWFsbG93ZWRSdWxlcy5hZGQoZ2V0QWNjZXNzaWJsZVJ1bGUobmV3IFBhdGgocGFja2FnZUltcG9ydC5yZXBsYWNlKCcuJywgJy8nKSArIFBBQ0tBR0VfV0lMRENBUkQpKSk7Ci0JCX0KLQkJYWxsb3dlZFJ1bGVzLmFkZChXSUxEQ0FSRF9OT05fQUNDRVNTSUJMRV9SVUxFKTsKLQkJcmV0dXJuIGFsbG93ZWRSdWxlczsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyB7QGxpbmsgSUFjY2Vzc1J1bGV9cyBmb3IgdGhlIGdpdmVuIGxpc3Qgb2YgaW1wb3J0ZWQgcGFja2FnZXMuCisgICAgICogPHA+CisgICAgICogT25seSB0aG9zZSBwYWNrYWdlcyBmcm9tIHRoZSB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fSB0aGF0IGFyZSBpbXBvcnRlZCB3aWxsIGJlIHZpc2libGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFja2FnZUltcG9ydHMgdGhlIHJlc29sdmVkIGFuZCBleHBsaWNpdCBwYWNrYWdlIGltcG9ydHMKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXQgb2Yge0BsaW5rIElBY2Nlc3NSdWxlfXMKKyAgICAgKi8KKyAgICBwcml2YXRlIFNldDxJQWNjZXNzUnVsZT4gY3JlYXRlQWNjZXNzUnVsZXNGcm9tUGFja2FnZUltcG9ydHMoTGlzdDxTdHJpbmc+IHBhY2thZ2VJbXBvcnRzKSB7CisgICAgICAgIFNldDxJQWNjZXNzUnVsZT4gYWxsb3dlZFJ1bGVzID0gbmV3IExpbmtlZEhhc2hTZXQ8SUFjY2Vzc1J1bGU+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIHBhY2thZ2VJbXBvcnQgOiBwYWNrYWdlSW1wb3J0cykgeworICAgICAgICAgICAgYWxsb3dlZFJ1bGVzLmFkZChnZXRBY2Nlc3NpYmxlUnVsZShuZXcgUGF0aChwYWNrYWdlSW1wb3J0LnJlcGxhY2UoJy4nLCAnLycpICsgUEFDS0FHRV9XSUxEQ0FSRCkpKTsKKyAgICAgICAgfQorICAgICAgICBhbGxvd2VkUnVsZXMuYWRkKFdJTERDQVJEX05PTl9BQ0NFU1NJQkxFX1JVTEUpOworICAgICAgICByZXR1cm4gYWxsb3dlZFJ1bGVzOworICAgIH0KIAotCS8qKgotCSAqIENyZWF0ZXMgYSBzaW5nbGUge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0gZm9yIHRoZSBnaXZlbiA8Y29kZT5maWxlPC9jb2RlPiBhbmQgPGNvZGU+YWxsb3dlZFJ1bGVzPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZW50cmllcwotCSAqICAgICAgICAgICAgdGhlIGxpc3Qgb2Yge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0KLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIHtAbGluayBGaWxlfSByZXByZXNlbnRpbmcgYSBKQVIgZmlsZQotCSAqIEBwYXJhbSBhbGxvd2VkUnVsZXMKLQkgKiAgICAgICAgICAgIHRoZSBzZXQgaWYge0BsaW5rIElBY2Nlc3NSdWxlfXMgaW5kaWNhdGluZyBwYWNrYWdlIGV4cG9ydCByZXN0cmljdGlvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ2xhc3NwYXRoRW50cnlGb3JGaWxlKExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzLCBGaWxlIGZpbGUsIGJvb2xlYW4gdGVzdE1hbmlmZXN0LAotCQkJSUFjY2Vzc1J1bGUuLi4gYWxsb3dlZFJ1bGVzKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJYWxsb3dlZFJ1bGVzID0gbWVyZ2VBY2Nlc3NSdWxlcyhlbnRyaWVzLCBwYXRoLCBhbGxvd2VkUnVsZXMpOworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzaW5nbGUge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0gZm9yIHRoZSBnaXZlbiA8Y29kZT5maWxlPC9jb2RlPiBhbmQgPGNvZGU+YWxsb3dlZFJ1bGVzPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRyaWVzIHRoZSBsaXN0IG9mIHtAbGluayBJQ2xhc3NwYXRoRW50cnl9CisgICAgICogQHBhcmFtIGZpbGUgdGhlIHtAbGluayBGaWxlfSByZXByZXNlbnRpbmcgYSBKQVIgZmlsZQorICAgICAqIEBwYXJhbSBhbGxvd2VkUnVsZXMgdGhlIHNldCBpZiB7QGxpbmsgSUFjY2Vzc1J1bGV9cyBpbmRpY2F0aW5nIHBhY2thZ2UgZXhwb3J0IHJlc3RyaWN0aW9ucworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDbGFzc3BhdGhFbnRyeUZvckZpbGUoTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGVudHJpZXMsIEZpbGUgZmlsZSwgYm9vbGVhbiB0ZXN0TWFuaWZlc3QsIElBY2Nlc3NSdWxlLi4uIGFsbG93ZWRSdWxlcykgeworICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIGFsbG93ZWRSdWxlcyA9IG1lcmdlQWNjZXNzUnVsZXMoZW50cmllcywgcGF0aCwgYWxsb3dlZFJ1bGVzKTsKIAotCQlpZiAodGVzdE1hbmlmZXN0KSB7Ci0JCQllbnRyaWVzLmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIGdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKGZpbGUpLCBudWxsLAotCQkJCQlhbGxvd2VkUnVsZXMsIFRFU1RfQ0xBU1NQQVRIX0FUVFJJQlVURVMsIGZhbHNlKSk7Ci0JCX0gZWxzZSB7Ci0JCQllbnRyaWVzLmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIGdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKGZpbGUpLCBudWxsLAotCQkJCQlhbGxvd2VkUnVsZXMsIENMQVNTUEFUSF9BVFRSSUJVVEVTLCBmYWxzZSkpOwotCQl9CisgICAgICAgIGlmICh0ZXN0TWFuaWZlc3QpIHsKKyAgICAgICAgICAgIGVudHJpZXMuYWRkKEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKSwgZ2V0U291cmNlQXR0YWNobWVudFBhdGgoZmlsZSksIG51bGwsIGFsbG93ZWRSdWxlcywKKyAgICAgICAgICAgICAgICBURVNUX0NMQVNTUEFUSF9BVFRSSUJVVEVTLCBmYWxzZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW50cmllcy5hZGQoSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLCBnZXRTb3VyY2VBdHRhY2htZW50UGF0aChmaWxlKSwgbnVsbCwgYWxsb3dlZFJ1bGVzLAorICAgICAgICAgICAgICAgIENMQVNTUEFUSF9BVFRSSUJVVEVTLCBmYWxzZSkpOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZSB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fSBmb3IgdGhlIGdpdmVuIDxjb2RlPmZpbGU8L2NvZGU+IGFuZCA8Y29kZT5hbGxvd2VkUnVsZXM8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoZSA8Y29kZT5maWxlPC9jb2RlPiBhY3R1YWxseSBwb2ludHMgdG8gdGhlIHdvcmtzcGFjZSBzb3VyY2UgZm9sZGVyIGFuZCB0aGVyZWZvcmUgdGhpcyBtZXRob2QgY3JlYXRlcyBhIHByb2plY3QKLQkgKiByZWZlcmVuY2UgaW4gY29udHJhc3QgdG8gYSBKQVIgcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBlbnRyaWVzCi0JICogICAgICAgICAgICB0aGUgbGlzdCBvZiB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fQotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgbmFtZSByZXByZXNlbnRpbmcgYSBzb3VyY2UgZm9sZGVyCi0JICogQHBhcmFtIGFsbG93ZWRSdWxlcwotCSAqICAgICAgICAgICAgdGhlIHNldCBpZiB7QGxpbmsgSUFjY2Vzc1J1bGV9cyBpbmRpY2F0aW5nIHBhY2thZ2UgZXhwb3J0IHJlc3RyaWN0aW9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDbGFzc3BhdGhGb3JQcm9qZWN0KExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzLCBTdHJpbmcgZmlsZU5hbWUsIGJvb2xlYW4gdGVzdE1hbmlmZXN0LAotCQkJSUFjY2Vzc1J1bGUuLi4gYWxsb3dlZFJ1bGVzKSB7Ci0JCUlKYXZhUHJvamVjdCByZWZlcmVuY2VkUHJvamVjdCA9IG1hbmlmZXN0TG9jYXRpb25zQnlQcm9qZWN0LmdldChmaWxlTmFtZSk7Ci0JCWlmIChyZWZlcmVuY2VkUHJvamVjdCA9PSBudWxsIHx8IGphdmFQcm9qZWN0LmVxdWFscyhyZWZlcmVuY2VkUHJvamVjdCkpIHsKLQkJCXJldHVybjsKLQkJfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzaW5nbGUge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0gZm9yIHRoZSBnaXZlbiA8Y29kZT5maWxlPC9jb2RlPiBhbmQgPGNvZGU+YWxsb3dlZFJ1bGVzPC9jb2RlPi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgPGNvZGU+ZmlsZTwvY29kZT4gYWN0dWFsbHkgcG9pbnRzIHRvIHRoZSB3b3Jrc3BhY2Ugc291cmNlIGZvbGRlciBhbmQgdGhlcmVmb3JlIHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBwcm9qZWN0CisgICAgICogcmVmZXJlbmNlIGluIGNvbnRyYXN0IHRvIGEgSkFSIHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRyaWVzIHRoZSBsaXN0IG9mIHtAbGluayBJQ2xhc3NwYXRoRW50cnl9CisgICAgICogQHBhcmFtIGZpbGVOYW1lIHRoZSBmaWxlIG5hbWUgcmVwcmVzZW50aW5nIGEgc291cmNlIGZvbGRlcgorICAgICAqIEBwYXJhbSBhbGxvd2VkUnVsZXMgdGhlIHNldCBpZiB7QGxpbmsgSUFjY2Vzc1J1bGV9cyBpbmRpY2F0aW5nIHBhY2thZ2UgZXhwb3J0IHJlc3RyaWN0aW9ucworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDbGFzc3BhdGhGb3JQcm9qZWN0KExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzLCBTdHJpbmcgZmlsZU5hbWUsIGJvb2xlYW4gdGVzdE1hbmlmZXN0LCBJQWNjZXNzUnVsZS4uLiBhbGxvd2VkUnVsZXMpIHsKKyAgICAgICAgSUphdmFQcm9qZWN0IHJlZmVyZW5jZWRQcm9qZWN0ID0gdGhpcy5tYW5pZmVzdExvY2F0aW9uc0J5UHJvamVjdC5nZXQoZmlsZU5hbWUpOworICAgICAgICBpZiAocmVmZXJlbmNlZFByb2plY3QgPT0gbnVsbCB8fCB0aGlzLmphdmFQcm9qZWN0LmVxdWFscyhyZWZlcmVuY2VkUHJvamVjdCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0JCUlQYXRoIHBhdGggPSBtYW5pZmVzdExvY2F0aW9uc0J5UHJvamVjdC5nZXQoZmlsZU5hbWUpLmdldFBhdGgoKTsKLQkJYWxsb3dlZFJ1bGVzID0gbWVyZ2VBY2Nlc3NSdWxlcyhlbnRyaWVzLCBwYXRoLCBhbGxvd2VkUnVsZXMpOworICAgICAgICBJUGF0aCBwYXRoID0gdGhpcy5tYW5pZmVzdExvY2F0aW9uc0J5UHJvamVjdC5nZXQoZmlsZU5hbWUpLmdldFBhdGgoKTsKKyAgICAgICAgYWxsb3dlZFJ1bGVzID0gbWVyZ2VBY2Nlc3NSdWxlcyhlbnRyaWVzLCBwYXRoLCBhbGxvd2VkUnVsZXMpOwogCi0JCWlmICh0ZXN0TWFuaWZlc3QpIHsKLQkJCWVudHJpZXMuYWRkKEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwYXRoLCBhbGxvd2VkUnVsZXMsIGZhbHNlLCBURVNUX0NMQVNTUEFUSF9BVFRSSUJVVEVTLCBmYWxzZSkpOwotCQl9IGVsc2UgewotCQkJZW50cmllcy5hZGQoSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBhdGgsIGFsbG93ZWRSdWxlcywgZmFsc2UsIENMQVNTUEFUSF9BVFRSSUJVVEVTLCBmYWxzZSkpOwotCQl9Ci0JfQorICAgICAgICBpZiAodGVzdE1hbmlmZXN0KSB7CisgICAgICAgICAgICBlbnRyaWVzLmFkZChKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocGF0aCwgYWxsb3dlZFJ1bGVzLCBmYWxzZSwgVEVTVF9DTEFTU1BBVEhfQVRUUklCVVRFUywgZmFsc2UpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVudHJpZXMuYWRkKEphdmFDb3JlLm5ld1Byb2plY3RFbnRyeShwYXRoLCBhbGxvd2VkUnVsZXMsIGZhbHNlLCBDTEFTU1BBVEhfQVRUUklCVVRFUywgZmFsc2UpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgSUFjY2Vzc1J1bGVbXSBtZXJnZUFjY2Vzc1J1bGVzKExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzLCBJUGF0aCBwYXRoLCBJQWNjZXNzUnVsZS4uLiBhbGxvd2VkUnVsZXMpIHsKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gbnVsbDsKLQkJLy8gQ2hlY2sgaWYgdGhlIHBhdGggaXMgYWxyZWFkeSBpbiBhbmQgbWVyZ2UgaWYgc28KLQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgZXhpc3RpbmdFbnRyeSA6IGVudHJpZXMpIHsKLQkJCWlmIChleGlzdGluZ0VudHJ5LmdldFBhdGgoKS5lcXVhbHMocGF0aCkpIHsKLQkJCQlTZXQ8SUFjY2Vzc1J1bGU+IGV4aXN0aW5nUnVsZXMgPSBuZXcgVHJlZVNldDxJQWNjZXNzUnVsZT4obmV3IENvbXBhcmF0b3I8SUFjY2Vzc1J1bGU+KCkgeworICAgIHByaXZhdGUgSUFjY2Vzc1J1bGVbXSBtZXJnZUFjY2Vzc1J1bGVzKExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzLCBJUGF0aCBwYXRoLCBJQWNjZXNzUnVsZS4uLiBhbGxvd2VkUnVsZXMpIHsKKyAgICAgICAgSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gbnVsbDsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhdGggaXMgYWxyZWFkeSBpbiBhbmQgbWVyZ2UgaWYgc28KKyAgICAgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgZXhpc3RpbmdFbnRyeSA6IGVudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChleGlzdGluZ0VudHJ5LmdldFBhdGgoKS5lcXVhbHMocGF0aCkpIHsKKyAgICAgICAgICAgICAgICBTZXQ8SUFjY2Vzc1J1bGU+IGV4aXN0aW5nUnVsZXMgPSBuZXcgVHJlZVNldDxJQWNjZXNzUnVsZT4obmV3IENvbXBhcmF0b3I8SUFjY2Vzc1J1bGU+KCkgewogCi0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShJQWNjZXNzUnVsZSBvMSwgSUFjY2Vzc1J1bGUgbzIpIHsKLQkJCQkJCWlmIChvMS5nZXRLaW5kKCkgPT0gbzIuZ2V0S2luZCgpKSB7Ci0JCQkJCQkJcmV0dXJuIG8xLmdldFBhdHRlcm4oKS50b1N0cmluZygpLmNvbXBhcmVUbyhvMi5nZXRQYXR0ZXJuKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKG8xLmdldEtpbmQoKSA9PSBJQWNjZXNzUnVsZS5LX05PTl9BQ0NFU1NJQkxFKSB7Ci0JCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCQl9IGVsc2UgaWYgKG8yLmdldEtpbmQoKSA9PSBJQWNjZXNzUnVsZS5LX05PTl9BQ0NFU1NJQkxFKSB7Ci0JCQkJCQkJcmV0dXJuIC0xOwotCQkJCQkJfSBlbHNlIGlmIChvMS5nZXRLaW5kKCkgPT0gSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKSB7Ci0JCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCQl9IGVsc2UgaWYgKG8yLmdldEtpbmQoKSA9PSBJQWNjZXNzUnVsZS5LX0FDQ0VTU0lCTEUpIHsKLQkJCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQkJCX0pOworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoSUFjY2Vzc1J1bGUgbzEsIElBY2Nlc3NSdWxlIG8yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobzEuZ2V0S2luZCgpID09IG8yLmdldEtpbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvMS5nZXRQYXR0ZXJuKCkudG9TdHJpbmcoKS5jb21wYXJlVG8obzIuZ2V0UGF0dGVybigpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvMS5nZXRLaW5kKCkgPT0gSUFjY2Vzc1J1bGUuS19OT05fQUNDRVNTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvMi5nZXRLaW5kKCkgPT0gSUFjY2Vzc1J1bGUuS19OT05fQUNDRVNTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobzEuZ2V0S2luZCgpID09IElBY2Nlc3NSdWxlLktfQUNDRVNTSUJMRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvMi5nZXRLaW5kKCkgPT0gSUFjY2Vzc1J1bGUuS19BQ0NFU1NJQkxFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKIAotCQkJCWV4aXN0aW5nUnVsZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZXhpc3RpbmdFbnRyeS5nZXRBY2Nlc3NSdWxlcygpKSk7Ci0JCQkJZXhpc3RpbmdSdWxlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChhbGxvd2VkUnVsZXMpKTsKLQkJCQlhbGxvd2VkUnVsZXMgPSBleGlzdGluZ1J1bGVzLnRvQXJyYXkobmV3IElBY2Nlc3NSdWxlW2V4aXN0aW5nUnVsZXMuc2l6ZSgpXSk7Ci0JCQkJZW50cnkgPSBleGlzdGluZ0VudHJ5OwotCQkJCWJyZWFrOwotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgZXhpc3RpbmdSdWxlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChleGlzdGluZ0VudHJ5LmdldEFjY2Vzc1J1bGVzKCkpKTsKKyAgICAgICAgICAgICAgICBleGlzdGluZ1J1bGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGFsbG93ZWRSdWxlcykpOworICAgICAgICAgICAgICAgIGFsbG93ZWRSdWxlcyA9IGV4aXN0aW5nUnVsZXMudG9BcnJheShuZXcgSUFjY2Vzc1J1bGVbZXhpc3RpbmdSdWxlcy5zaXplKCldKTsKKyAgICAgICAgICAgICAgICBlbnRyeSA9IGV4aXN0aW5nRW50cnk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJZW50cmllcy5yZW1vdmUoZW50cnkpOwotCQl9Ci0JCXJldHVybiBhbGxvd2VkUnVsZXM7Ci0JfQorICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgZW50cmllcy5yZW1vdmUoZW50cnkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGxvd2VkUnVsZXM7CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUge0BsaW5rIERlcGVuZGVuY3lMb2NhdG9yfSB0byBiZSB1c2VkIGZvciByZXNvbHV0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJSmF2YVByb2plY3R9IHRvIHJlc29sdmUgZGVwZW5kZW5jaWVzIGZvci4KLQkgKiBAcmV0dXJuIGEgY29uZmlndXJlZCBhbmQgcmVhZHkgdG8gdXNlIHtAbGluayBEZXBlbmRlbmN5TG9jYXRvcn0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBJRGVwZW5kZW5jeUxvY2F0b3IgY3JlYXRlRGVwZW5kZW5jeUxvY2F0b3IoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlmaW5hbCBTZXQ8U3RyaW5nPiB3b3Jrc3BhY2VCdW5kbGVzID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIHtAbGluayBEZXBlbmRlbmN5TG9jYXRvcn0gdG8gYmUgdXNlZCBmb3IgcmVzb2x1dGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXZhUHJvamVjdCB0aGUge0BsaW5rIElKYXZhUHJvamVjdH0gdG8gcmVzb2x2ZSBkZXBlbmRlbmNpZXMgZm9yLgorICAgICAqIEByZXR1cm4gYSBjb25maWd1cmVkIGFuZCByZWFkeSB0byB1c2Uge0BsaW5rIERlcGVuZGVuY3lMb2NhdG9yfQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIElEZXBlbmRlbmN5TG9jYXRvciBjcmVhdGVEZXBlbmRlbmN5TG9jYXRvcihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHdvcmtzcGFjZUJ1bmRsZXMgPSBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCk7CiAKLQkJLy8gRmlyc3QgYWRkIHByb2plY3RzIHRoYXQgYmVsb25nIHRvIHRoZSBzYW1lIHBhciBwcm9qZWN0Ci0JCWZvciAoSVByb2plY3QgcHJvamVjdCA6IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSkgewotCQkJU2V0PFN0cmluZz4gcGFyQnVuZGxlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCWlmIChGYWNldFV0aWxzLmlzUGFyUHJvamVjdChwcm9qZWN0KSkgewotCQkJCWJvb2xlYW4gaGFzQnVuZGxlID0gZmFsc2U7Ci0JCQkJUGFyIHBhciA9IEZhY2V0VXRpbHMuZ2V0UGFyRGVmaW5pdGlvbihwcm9qZWN0KTsKLQkJCQlpZiAocGFyICE9IG51bGwgJiYgcGFyLmdldEJ1bmRsZSgpICE9IG51bGwpIHsKLQkJCQkJZm9yIChCdW5kbGUgYnVuZGxlIDogcGFyLmdldEJ1bmRsZSgpKSB7Ci0JCQkJCQlpZiAoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLmVxdWFscyhqYXZhUHJvamVjdC5nZXRFbGVtZW50TmFtZSgpKSkgewotCQkJCQkJCWhhc0J1bmRsZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQlwYXJCdW5kbGVzLmFkZChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQorICAgICAgICAvLyBGaXJzdCBhZGQgcHJvamVjdHMgdGhhdCBiZWxvbmcgdG8gdGhlIHNhbWUgcGFyIHByb2plY3QKKyAgICAgICAgZm9yIChJUHJvamVjdCBwcm9qZWN0IDogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKSB7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBwYXJCdW5kbGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNQYXJQcm9qZWN0KHByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNCdW5kbGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBQYXIgcGFyID0gRmFjZXRVdGlscy5nZXRQYXJEZWZpbml0aW9uKHByb2plY3QpOworICAgICAgICAgICAgICAgIGlmIChwYXIgIT0gbnVsbCAmJiBwYXIuZ2V0QnVuZGxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBwYXIuZ2V0QnVuZGxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzKGphdmFQcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQnVuZGxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhckJ1bmRsZXMuYWRkKGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlpZiAoaGFzQnVuZGxlKSB7Ci0JCQkJCWZvciAoU3RyaW5nIGJ1bmRsZU5hbWUgOiBwYXJCdW5kbGVzKSB7Ci0JCQkJCQlJUHJvamVjdCBidW5kbGVQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGJ1bmRsZU5hbWUpOwotCQkJCQkJYWRkV29ya3NwYWNlQnVuZGxlKHdvcmtzcGFjZUJ1bmRsZXMsIGJ1bmRsZVByb2plY3QpOwotCQkJCQl9CisgICAgICAgICAgICAgICAgaWYgKGhhc0J1bmRsZSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBidW5kbGVOYW1lIDogcGFyQnVuZGxlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgYnVuZGxlUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChidW5kbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFdvcmtzcGFjZUJ1bmRsZSh3b3Jrc3BhY2VCdW5kbGVzLCBidW5kbGVQcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCS8vIEFkZCBhbnkgbmVzdGVkIG9yIGxpbmtlZCBqYXJzIGZyb20gdGhlIFBBUgotCQkJCQlwcm9qZWN0LmFjY2VwdChuZXcgSVJlc291cmNlVmlzaXRvcigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGFueSBuZXN0ZWQgb3IgbGlua2VkIGphcnMgZnJvbSB0aGUgUEFSCisgICAgICAgICAgICAgICAgICAgIHByb2plY3QuYWNjZXB0KG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewogCi0JCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSAmJiByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJqYXIiKSkgewotCQkJCQkJCQlJUGF0aCBqYXJMb2NhdGlvbiA9IHJlc291cmNlLmdldFJhd0xvY2F0aW9uKCk7Ci0JCQkJCQkJCUlQYXRoIHJlc29sdmVkSmFyTG9jYXRpb24gPSBKYXZhQ29yZS5nZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChqYXJMb2NhdGlvbik7Ci0JCQkJCQkJCWlmIChyZXNvbHZlZEphckxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCXdvcmtzcGFjZUJ1bmRsZXMuYWRkKHJlc29sdmVkSmFyTG9jYXRpb24ucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCkKLQkJCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArICJ7YnVuZGxlfSIpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJd29ya3NwYWNlQnVuZGxlcy5hZGQoamFyTG9jYXRpb24ucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCQkJCQkrICJ7YnVuZGxlfSIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9LCBJUmVzb3VyY2UuREVQVEhfT05FLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSAmJiByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJqYXIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCBqYXJMb2NhdGlvbiA9IHJlc291cmNlLmdldFJhd0xvY2F0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIHJlc29sdmVkSmFyTG9jYXRpb24gPSBKYXZhQ29yZS5nZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChqYXJMb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZEphckxvY2F0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzcGFjZUJ1bmRsZXMuYWRkKHJlc29sdmVkSmFyTG9jYXRpb24ucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArICJ7YnVuZGxlfSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NwYWNlQnVuZGxlcy5hZGQoamFyTG9jYXRpb24ucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArICJ7YnVuZGxlfSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LCBJUmVzb3VyY2UuREVQVEhfT05FLCBmYWxzZSk7CiAKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLyBTZWNvbmRseSBhZGQgYWxsIGV4cGxpY2l0IGRlcGVuZGVudCBwcm9qZWN0cwotCQlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RGVzY3JpcHRpb24oKS5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKSkgewotCQkJYWRkV29ya3NwYWNlQnVuZGxlKHdvcmtzcGFjZUJ1bmRsZXMsIHByb2plY3QpOwotCQl9CisgICAgICAgIC8vIFNlY29uZGx5IGFkZCBhbGwgZXhwbGljaXQgZGVwZW5kZW50IHByb2plY3RzCisgICAgICAgIGZvciAoSVByb2plY3QgcHJvamVjdCA6IGphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpKSB7CisgICAgICAgICAgICBhZGRXb3Jrc3BhY2VCdW5kbGUod29ya3NwYWNlQnVuZGxlcywgcHJvamVjdCk7CisgICAgICAgIH0KIAotCQkvLyBUaGlyZGx5IGFkZCB0aGUgY3VycmVudCBwbHVnaW4gdG8gcmVzb2x2ZSBleHBvcnRlZCBwYWNrYWdlcyBmcm9tIHRoZSBzYW1lIGJ1bmRsZQotCQlhZGRXb3Jrc3BhY2VCdW5kbGUod29ya3NwYWNlQnVuZGxlcywgamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgLy8gVGhpcmRseSBhZGQgdGhlIGN1cnJlbnQgcGx1Z2luIHRvIHJlc29sdmUgZXhwb3J0ZWQgcGFja2FnZXMgZnJvbSB0aGUgc2FtZSBidW5kbGUKKyAgICAgICAgYWRkV29ya3NwYWNlQnVuZGxlKHdvcmtzcGFjZUJ1bmRsZXMsIGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7CiAKLQkJLy8gU3RvcmUgdGFyZ2V0ZWQgcnVudGltZXMgdG8gZGlzcGxheSBpbiB0aGUgZGVzY3JpcHRpb24KLQkJc2VydmVyUnVudGltZXMgPSBTZXJ2ZXJVdGlscy5nZXRUYXJnZXR0ZWRSdW50aW1lcyhqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOworICAgICAgICAvLyBTdG9yZSB0YXJnZXRlZCBydW50aW1lcyB0byBkaXNwbGF5IGluIHRoZSBkZXNjcmlwdGlvbgorICAgICAgICB0aGlzLnNlcnZlclJ1bnRpbWVzID0gU2VydmVyVXRpbHMuZ2V0VGFyZ2V0dGVkUnVudGltZXMoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKIAotCQkvLyBBZGp1c3QgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBvbiB0aGUgTUVUQS1JTkYgYW5kIHJvb3QgZm9sZGVyCi0JCUNsYXNzcGF0aFV0aWxzLmFkanVzdExhc3RNb2RpZmllZERhdGUoamF2YVByb2plY3QsIGZhbHNlKTsKLQkJQ2xhc3NwYXRoVXRpbHMuYWRqdXN0TGFzdE1vZGlmaWVkRGF0ZShqYXZhUHJvamVjdCwgdHJ1ZSk7CisgICAgICAgIC8vIEFkanVzdCB0aGUgbGFzdCBtb2RpZmllZCBkYXRlIG9uIHRoZSBNRVRBLUlORiBhbmQgcm9vdCBmb2xkZXIKKyAgICAgICAgQ2xhc3NwYXRoVXRpbHMuYWRqdXN0TGFzdE1vZGlmaWVkRGF0ZShqYXZhUHJvamVjdCwgZmFsc2UpOworICAgICAgICBDbGFzc3BhdGhVdGlscy5hZGp1c3RMYXN0TW9kaWZpZWREYXRlKGphdmFQcm9qZWN0LCB0cnVlKTsKIAotCQkvLyBDcmVhdGUgRGVwZW5kZW5jeUxvY2F0b3Igd2l0aCBwYXRoIHRvIHNlcnZlci5jb25maWcgYW5kIHNlcnZlci5wcm9maWxlCi0JCXJldHVybiBTZXJ2ZXJVdGlscy5jcmVhdGVEZXBlbmRlbmN5TG9jYXRvcihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCksCi0JCQkJd29ya3NwYWNlQnVuZGxlcy50b0FycmF5KG5ldyBTdHJpbmdbd29ya3NwYWNlQnVuZGxlcy5zaXplKCldKSk7Ci0JfQorICAgICAgICAvLyBDcmVhdGUgRGVwZW5kZW5jeUxvY2F0b3Igd2l0aCBwYXRoIHRvIHNlcnZlci5jb25maWcgYW5kIHNlcnZlci5wcm9maWxlCisgICAgICAgIHJldHVybiBTZXJ2ZXJVdGlscy5jcmVhdGVEZXBlbmRlbmN5TG9jYXRvcihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCksIHdvcmtzcGFjZUJ1bmRsZXMudG9BcnJheShuZXcgU3RyaW5nW3dvcmtzcGFjZUJ1bmRsZXMuc2l6ZSgpXSkpOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgYSBwYXRoIHRvIHRoZSBzb3VyY2UgYXR0YWNobWVudCBmb2xsb3dpbmcgdGhlIEJSSVRTIGNvbnZlbnRpb25zIGlmIHRoZSBzb3VyY2VzIGphciBjYW4gYmUgZmluZC4KLQkgKiA8cD4KLQkgKiBGaXJzdCBjaGVja3MgaWYgdGhlIHVzZXIgaGFzIG92ZXJyaWRkZW4gdGhlIGNvbnZlbnRpb24gYW5kIGF0dGFjaGVkIGEgY3VzdG9tIGFyY2hpdmUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBKQVIgZmlsZSB0bwotCSAqIEByZXR1cm4gdGhlIHNvdXJjZSBKQVIgcGF0aAotCSAqLwotCXByaXZhdGUgSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFBhdGgoRmlsZSBmaWxlKSB7Ci0JCS8vIGZpcnN0IGNoZWNrIG1hbnVhbCBjb25maWd1cmVkIHNvdXJjZSBhdHRhY2htZW50cwotCQlJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aCA9IENsYXNzcGF0aFV0aWxzLmdldFNvdXJjZUF0dGFjaG1lbnQoamF2YVByb2plY3QsIGZpbGUpOwotCQlpZiAoc291cmNlQXR0YWNobWVudFBhdGggIT0gbnVsbCkgewotCQkJcmV0dXJuIHNvdXJjZUF0dGFjaG1lbnRQYXRoOwotCQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBhdGggdG8gdGhlIHNvdXJjZSBhdHRhY2htZW50IGZvbGxvd2luZyB0aGUgQlJJVFMgY29udmVudGlvbnMgaWYgdGhlIHNvdXJjZXMgamFyIGNhbiBiZSBmaW5kLgorICAgICAqIDxwPgorICAgICAqIEZpcnN0IGNoZWNrcyBpZiB0aGUgdXNlciBoYXMgb3ZlcnJpZGRlbiB0aGUgY29udmVudGlvbiBhbmQgYXR0YWNoZWQgYSBjdXN0b20gYXJjaGl2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBKQVIgZmlsZSB0bworICAgICAqIEByZXR1cm4gdGhlIHNvdXJjZSBKQVIgcGF0aAorICAgICAqLworICAgIHByaXZhdGUgSVBhdGggZ2V0U291cmNlQXR0YWNobWVudFBhdGgoRmlsZSBmaWxlKSB7CisgICAgICAgIC8vIGZpcnN0IGNoZWNrIG1hbnVhbCBjb25maWd1cmVkIHNvdXJjZSBhdHRhY2htZW50cworICAgICAgICBJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aCA9IENsYXNzcGF0aFV0aWxzLmdldFNvdXJjZUF0dGFjaG1lbnQodGhpcy5qYXZhUHJvamVjdCwgZmlsZSk7CisgICAgICAgIGlmIChzb3VyY2VBdHRhY2htZW50UGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc291cmNlQXR0YWNobWVudFBhdGg7CisgICAgICAgIH0KIAotCQkvLyBzZWNvbmRseSBjaGVjayBmb3Igc291cmNlIGF0dGFjaG1lbnQgZm9sbG93aW5nIHRoZSBjb252ZW50aW9ucwotCQlGaWxlIHNvdXJjZUZpbGUgPSBTZXJ2ZXJVdGlscy5nZXRTb3VyY2VGaWxlKGZpbGUudG9VUkkoKSk7Ci0JCWlmIChzb3VyY2VGaWxlICE9IG51bGwgJiYgc291cmNlRmlsZS5leGlzdHMoKSAmJiBzb3VyY2VGaWxlLmNhblJlYWQoKSkgewotCQkJc291cmNlQXR0YWNobWVudFBhdGggPSBuZXcgUGF0aChzb3VyY2VGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQorICAgICAgICAvLyBzZWNvbmRseSBjaGVjayBmb3Igc291cmNlIGF0dGFjaG1lbnQgZm9sbG93aW5nIHRoZSBjb252ZW50aW9ucworICAgICAgICBGaWxlIHNvdXJjZUZpbGUgPSBTZXJ2ZXJVdGlscy5nZXRTb3VyY2VGaWxlKGZpbGUudG9VUkkoKSk7CisgICAgICAgIGlmIChzb3VyY2VGaWxlICE9IG51bGwgJiYgc291cmNlRmlsZS5leGlzdHMoKSAmJiBzb3VyY2VGaWxlLmNhblJlYWQoKSkgeworICAgICAgICAgICAgc291cmNlQXR0YWNobWVudFBhdGggPSBuZXcgUGF0aChzb3VyY2VGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfQogCi0JCXJldHVybiBzb3VyY2VBdHRhY2htZW50UGF0aDsKLQl9CisgICAgICAgIHJldHVybiBzb3VyY2VBdHRhY2htZW50UGF0aDsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGVycm9yIG1hcmtlcnMgZm9yIHVucmVzb2x2ZWQgZGVwZW5kZW5jaWVzIHN0b3JlZCBpbiB0aGUge0BsaW5rIERlcGVuZGVuY3lMb2NhdGlvbkV4Y2VwdGlvbn0uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIERlcGVuZGVuY3lMb2NhdGlvbkV4Y2VwdGlvbn0gb2NjdXJyZWQgZHVyaW5nIHJlc29sdXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGVwZW5kZW5jeUxvY2F0aW9uRXhjZXB0aW9uKERlcGVuZGVuY3lMb2NhdGlvbkV4Y2VwdGlvbiBlLCBib29sZWFuIHRlc3RNYW5pZmVzdCkgewotCQlNYXJrZXJVdGlscy5jcmVhdGVFcnJvck1hcmtlcnMoZSwgamF2YVByb2plY3QsIHRlc3RNYW5pZmVzdCk7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgZXJyb3IgbWFya2VycyBmb3IgdW5yZXNvbHZlZCBkZXBlbmRlbmNpZXMgc3RvcmVkIGluIHRoZSB7QGxpbmsgRGVwZW5kZW5jeUxvY2F0aW9uRXhjZXB0aW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlIGEge0BsaW5rIERlcGVuZGVuY3lMb2NhdGlvbkV4Y2VwdGlvbn0gb2NjdXJyZWQgZHVyaW5nIHJlc29sdXRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlRGVwZW5kZW5jeUxvY2F0aW9uRXhjZXB0aW9uKERlcGVuZGVuY3lMb2NhdGlvbkV4Y2VwdGlvbiBlLCBib29sZWFuIHRlc3RNYW5pZmVzdCkgeworICAgICAgICBNYXJrZXJVdGlscy5jcmVhdGVFcnJvck1hcmtlcnMoZSwgdGhpcy5qYXZhUHJvamVjdCwgdGVzdE1hbmlmZXN0KTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGdpdmVuIHtAbGluayBCdW5kbGVNYW5pZmVzdH0uCi0JICogCi0JICogQHBhcmFtIGVudHJpZXMKLQkgKiAgICAgICAgICAgIHRoZSBhbHJlYWR5IGNvbGxlY3RlZCB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fQotCSAqIEBwYXJhbSBtYW5pZmVzdAotCSAqICAgICAgICAgICAgdGhlIHtAbGluayBCdW5kbGVNYW5pZmVzdH0gdG8gYWRkIGRlcGVuZGVuY2llcyBmb3IKLQkgKiBAcGFyYW0gbG9jYXRvcgotCSAqICAgICAgICAgICAgdGhlIHtAbGluayBEZXBlbmRlbmN5TG9jYXRvcn0gaW5zdGFuY2UgdG8gdXNlCi0JICogQHBhcmFtIHRlc3RNYW5pZmVzdAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzb2x2ZURlcGVuZGVuY2llcyhMaXN0PElDbGFzc3BhdGhFbnRyeT4gZW50cmllcywgQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QsCi0JCQlJRGVwZW5kZW5jeUxvY2F0b3IgbG9jYXRvciwgYm9vbGVhbiB0ZXN0TWFuaWZlc3QpIHsKLQkJRGVwZW5kZW5jeUxvY2F0aW9uRXhjZXB0aW9uIGRlcGVuZGVuY3lMb2NhdGlvbkV4Y2VwdGlvbiA9IG51bGw7Ci0JCWlmIChsb2NhdG9yICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gUmVzb2x2ZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBtYWluIG1hbmlmZXN0Ci0JCQkJYWRkQ2xhc3NwYXRoRW50cmllc0Zyb21SZXNvbHV0aW9uUmVzdWx0KGVudHJpZXMsIGxvY2F0b3IubG9jYXRlRGVwZW5kZW5jaWVzKG1hbmlmZXN0KSwgdGVzdE1hbmlmZXN0KTsKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGdpdmVuIHtAbGluayBCdW5kbGVNYW5pZmVzdH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50cmllcyB0aGUgYWxyZWFkeSBjb2xsZWN0ZWQge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0KKyAgICAgKiBAcGFyYW0gbWFuaWZlc3QgdGhlIHtAbGluayBCdW5kbGVNYW5pZmVzdH0gdG8gYWRkIGRlcGVuZGVuY2llcyBmb3IKKyAgICAgKiBAcGFyYW0gbG9jYXRvciB0aGUge0BsaW5rIERlcGVuZGVuY3lMb2NhdG9yfSBpbnN0YW5jZSB0byB1c2UKKyAgICAgKiBAcGFyYW0gdGVzdE1hbmlmZXN0IDxjb2RlPnRydWU8L2NvZGU+CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVEZXBlbmRlbmNpZXMoTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGVudHJpZXMsIEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0LCBJRGVwZW5kZW5jeUxvY2F0b3IgbG9jYXRvciwgYm9vbGVhbiB0ZXN0TWFuaWZlc3QpIHsKKyAgICAgICAgRGVwZW5kZW5jeUxvY2F0aW9uRXhjZXB0aW9uIGRlcGVuZGVuY3lMb2NhdGlvbkV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIGlmIChsb2NhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSBkZXBlbmRlbmNpZXMgZm9yIHRoZSBtYWluIG1hbmlmZXN0CisgICAgICAgICAgICAgICAgYWRkQ2xhc3NwYXRoRW50cmllc0Zyb21SZXNvbHV0aW9uUmVzdWx0KGVudHJpZXMsIGxvY2F0b3IubG9jYXRlRGVwZW5kZW5jaWVzKG1hbmlmZXN0KSwgdGVzdE1hbmlmZXN0KTsKIAotCQkJCS8vIEFkZCBjbGFzc3BhdGggZW50cmllcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIHRoZSBidW5kbGUgbWFuaWZlc3QKLQkJCQlhZGRDbGFzc3BhdGhFbnRyaWVzRnJvbUJ1bmRsZUNsYXNzUGF0aChlbnRyaWVzLCBtYW5pZmVzdCwgdGVzdE1hbmlmZXN0KTsKLQkJCX0gY2F0Y2ggKERlcGVuZGVuY3lMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gQWRkIGNsYXNzcGF0aCBlbnRyaWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gdGhlIGJ1bmRsZSBtYW5pZmVzdAorICAgICAgICAgICAgICAgIGFkZENsYXNzcGF0aEVudHJpZXNGcm9tQnVuZGxlQ2xhc3NQYXRoKGVudHJpZXMsIG1hbmlmZXN0LCB0ZXN0TWFuaWZlc3QpOworICAgICAgICAgICAgfSBjYXRjaCAoRGVwZW5kZW5jeUxvY2F0aW9uRXhjZXB0aW9uIGUpIHsKIAotCQkJCS8vIFN0b3JlIGZvciBsYXRlciByZW1vdmFsIG9mIGVycm9yIG1hcmtlcnMKLQkJCQlkZXBlbmRlbmN5TG9jYXRpb25FeGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgIC8vIFN0b3JlIGZvciBsYXRlciByZW1vdmFsIG9mIGVycm9yIG1hcmtlcnMKKyAgICAgICAgICAgICAgICBkZXBlbmRlbmN5TG9jYXRpb25FeGNlcHRpb24gPSBlOwogCi0JCQkJLy8gSW5zdGFsbCB0aGUgcmVzb2x2ZWQgZGVwZW5kZW5jaWVzIGFzIGEgc2FmZSBmYWxsYmFjawotCQkJCWFkZENsYXNzcGF0aEVudHJpZXNGcm9tUmVzb2x1dGlvblJlc3VsdChlbnRyaWVzLCBlLmdldFNhdGlzZmllZERlcGVuZGVuY2llcygpLCB0ZXN0TWFuaWZlc3QpOworICAgICAgICAgICAgICAgIC8vIEluc3RhbGwgdGhlIHJlc29sdmVkIGRlcGVuZGVuY2llcyBhcyBhIHNhZmUgZmFsbGJhY2sKKyAgICAgICAgICAgICAgICBhZGRDbGFzc3BhdGhFbnRyaWVzRnJvbVJlc29sdXRpb25SZXN1bHQoZW50cmllcywgZS5nZXRTYXRpc2ZpZWREZXBlbmRlbmNpZXMoKSwgdGVzdE1hbmlmZXN0KTsKIAotCQkJCS8vIEFkZCBjbGFzc3BhdGggZW50cmllcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIHRoZSBidW5kbGUgbWFuaWZlc3QKLQkJCQlhZGRDbGFzc3BhdGhFbnRyaWVzRnJvbUJ1bmRsZUNsYXNzUGF0aChlbnRyaWVzLCBtYW5pZmVzdCwgdGVzdE1hbmlmZXN0KTsKKyAgICAgICAgICAgICAgICAvLyBBZGQgY2xhc3NwYXRoIGVudHJpZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiB0aGUgYnVuZGxlIG1hbmlmZXN0CisgICAgICAgICAgICAgICAgYWRkQ2xhc3NwYXRoRW50cmllc0Zyb21CdW5kbGVDbGFzc1BhdGgoZW50cmllcywgbWFuaWZlc3QsIHRlc3RNYW5pZmVzdCk7CiAKLQkJCX0gZmluYWxseSB7Ci0JCQkJLy8gQ3JlYXRlIGVycm9yIG1hcmtlcnMgZm9yIHVuLXJlc29sdmVkIGRlcGVuZGVuY2llcwotCQkJCWhhbmRsZURlcGVuZGVuY3lMb2NhdGlvbkV4Y2VwdGlvbihkZXBlbmRlbmN5TG9jYXRpb25FeGNlcHRpb24sIHRlc3RNYW5pZmVzdCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBlcnJvciBtYXJrZXJzIGZvciB1bi1yZXNvbHZlZCBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICBoYW5kbGVEZXBlbmRlbmN5TG9jYXRpb25FeGNlcHRpb24oZGVwZW5kZW5jeUxvY2F0aW9uRXhjZXB0aW9uLCB0ZXN0TWFuaWZlc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS9jbGFzc3BhdGgvU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL2NvcmUvY2xhc3NwYXRoL1NlcnZlckNsYXNzcGF0aENvbnRhaW5lckJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuamF2YQppbmRleCBlYzg0MmJmLi40ZmFlMTM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS9jbGFzc3BhdGgvU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC9jb3JlL2NsYXNzcGF0aC9TZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5pbnRlcm5hbC5jb3JlLmNsYXNzcGF0aDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CkBAIC0yMiw0MyArMjMsNDEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS5CdW5kbGVNYW5pZmVzdE1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5TZXJ2ZXJVdGlsczsKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnByb3Zpc2lvbmluZy5JQnVuZGxlUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbC5yZXBvc2l0b3J5LkJ1bmRsZVJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28udXRpbC5vc2dpLm1hbmlmZXN0LkJ1bmRsZU1hbmlmZXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKIAogLyoqCiAgKiB7QGxpbmsgSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXJ9IHRoYXQgdHJpZ2dlcnMgcmVmcmVzaGluZyBvZiB0aGUgYnVuZGxlIGNsYXNzIHBhdGggY29udGFpbmVyIHRocm91Z2ggc2NoZWR1bGluZwogICogYSBuZXcgd29ya3NwYWNlIGpvYi4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KLXB1YmxpYyBjbGFzcyBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIsCi0JCUlCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIgeworcHVibGljIGNsYXNzIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lckJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lciwgSUJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lciB7CiAKLQkvKioKLQkgKiBHZXRzIG5vdGlmaWVkIGZvciBldmVyeSBjaGFuZ2UgdG8gYSBnaXZlbiA8Y29kZT5idW5kbGVNYW5pZmVzdDwvY29kZT4gYW5kIGRlbGVnYXRlcyB0aGUgcmVmcmVzaG1lbnQgb2YgdGhlIGNsYXNzCi0JICogcGF0aCBjb250YWluZXIgdG8gdGhlIHtAbGluayBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2J9LgotCSAqLwotCXB1YmxpYyB2b2lkIGJ1bmRsZU1hbmlmZXN0Q2hhbmdlZChCdW5kbGVNYW5pZmVzdCBuZXdCdW5kbGVNYW5pZmVzdCwgQnVuZGxlTWFuaWZlc3Qgb2xkQnVuZGxlTWFuaWZlc3QsCi0JCQlCdW5kbGVNYW5pZmVzdCBuZXdUZXN0QnVuZGxlTWFuaWZlc3QsIEJ1bmRsZU1hbmlmZXN0IG9sZFRlc3RCdW5kbGVNYW5pZmVzdCwgU2V0PFR5cGU+IHR5cGVzLAotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCWlmIChuZXdCdW5kbGVNYW5pZmVzdCAhPSBudWxsIHx8IG5ld1Rlc3RCdW5kbGVNYW5pZmVzdCAhPSBudWxsKSB7Ci0JCQlTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2Iuc2NoZWR1bGVDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2IoamF2YVByb2plY3QsIHR5cGVzKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBHZXRzIG5vdGlmaWVkIGZvciBldmVyeSBjaGFuZ2UgdG8gYSBnaXZlbiA8Y29kZT5idW5kbGVNYW5pZmVzdDwvY29kZT4gYW5kIGRlbGVnYXRlcyB0aGUgcmVmcmVzaG1lbnQgb2YgdGhlIGNsYXNzCisgICAgICogcGF0aCBjb250YWluZXIgdG8gdGhlIHtAbGluayBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2J9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJ1bmRsZU1hbmlmZXN0Q2hhbmdlZChCdW5kbGVNYW5pZmVzdCBuZXdCdW5kbGVNYW5pZmVzdCwgQnVuZGxlTWFuaWZlc3Qgb2xkQnVuZGxlTWFuaWZlc3QsIEJ1bmRsZU1hbmlmZXN0IG5ld1Rlc3RCdW5kbGVNYW5pZmVzdCwKKyAgICAgICAgQnVuZGxlTWFuaWZlc3Qgb2xkVGVzdEJ1bmRsZU1hbmlmZXN0LCBTZXQ8VHlwZT4gdHlwZXMsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgeworICAgICAgICBpZiAobmV3QnVuZGxlTWFuaWZlc3QgIT0gbnVsbCB8fCBuZXdUZXN0QnVuZGxlTWFuaWZlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iLnNjaGVkdWxlQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iKGphdmFQcm9qZWN0LCB0eXBlcyk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBHZXRzIG5vdGlmaWVkIGZvciBldmVyeSBjaGFuZ2Ugb2YgdGhlIGdpdmVuIDxjb2RlPnJ1bnRpbWU8L2NvZGU+J3Mge0BsaW5rIEJ1bmRsZVJlcG9zaXRvcnl9LiBPbiBldmVyeQotCSAqIG5vdGlmaWNhdGlvbiBpdCB3aWxsIHVwZGF0ZSA8aT5hbGw8L2k+IGJ1bmRsZSBwcm9qZWN0J3Mge0BsaW5rIEJ1bmRsZU1hbmlmZXN0fS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBidW5kbGVSZXBvc2l0b3J5Q2hhbmdlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCWZvciAoSVByb2plY3QgcHJvamVjdCA6IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSkgewotCQkJaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KHByb2plY3QpCi0JCQkJCSYmIEFycmF5cy5hc0xpc3QoU2VydmVyVXRpbHMuZ2V0VGFyZ2V0dGVkUnVudGltZXMocHJvamVjdCkpLmNvbnRhaW5zKHJ1bnRpbWUpKSB7Ci0JCQkJU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iLnNjaGVkdWxlQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iKEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSwKLQkJCQkJCUJ1bmRsZU1hbmlmZXN0TWFuYWdlci5JTVBPUlRTX0NIQU5HRUQpOwotCQkJfQotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEdldHMgbm90aWZpZWQgZm9yIGV2ZXJ5IGNoYW5nZSBvZiB0aGUgZ2l2ZW4gPGNvZGU+cnVudGltZTwvY29kZT4ncyB7QGxpbmsgQnVuZGxlUmVwb3NpdG9yeX0uIE9uIGV2ZXJ5CisgICAgICogbm90aWZpY2F0aW9uIGl0IHdpbGwgdXBkYXRlIDxpPmFsbDwvaT4gYnVuZGxlIHByb2plY3QncyB7QGxpbmsgQnVuZGxlTWFuaWZlc3R9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VkKElSdW50aW1lIHJ1bnRpbWUpIHsKKyAgICAgICAgZm9yIChJUHJvamVjdCBwcm9qZWN0IDogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKSB7CisgICAgICAgICAgICBpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkgJiYgQXJyYXlzLmFzTGlzdChTZXJ2ZXJVdGlscy5nZXRUYXJnZXR0ZWRSdW50aW1lcyhwcm9qZWN0KSkuY29udGFpbnMocnVudGltZSkpIHsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2Iuc2NoZWR1bGVDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2IoSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpLAorICAgICAgICAgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdE1hbmFnZXIuSU1QT1JUU19DSEFOR0VEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL2NvcmUvY2xhc3NwYXRoL1NlcnZlckNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS9jbGFzc3BhdGgvU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQppbmRleCA2ZmFhOTRlLi44NWMzZTBkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS9jbGFzc3BhdGgvU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS9jbGFzc3BhdGgvU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmludGVybmFsLmNvcmUuY2xhc3NwYXRoOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CkBAIC0yNywxMTggKzI4LDExOCBAQAogCiAvKioKICAqIHtAbGluayBDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcn0gdGhhdCBjcmVhdGVzIGFuZCByZXN0b3JlcyB7QGxpbmsgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyfS4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplciBleHRlbmRzIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIHsKIAotCS8qKgotCSAqIEluaXRpYWxpemVzIGEgbmV3IHtAbGluayBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJ9IGFuZCBpbnN0YWxsIHRoZSBjb250YWluZXIgd2l0aCB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5qYXZhUHJvamVjdDwvY29kZT4uCi0JICogPHA+Ci0JICogU2NoZWR1bGVzIGEgY29udGFpbmVyIHVwZGF0ZSBieSBjYWxsaW5nCi0JICoge0BsaW5rIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYiNzY2hlZHVsZUNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYigpfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE9ubHkgcmVzcG9uc2libGUgZm9yIG91ciBvd24gY2xhc3MgcGF0aCBjb250YWluZXIKLQkJaWYgKGNvbnRhaW5lclBhdGguZXF1YWxzKFNlcnZlckNsYXNzcGF0aENvbnRhaW5lci5DTEFTU1BBVEhfQ09OVEFJTkVSX1BBVEgpKSB7CisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgYSBuZXcge0BsaW5rIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lcn0gYW5kIGluc3RhbGwgdGhlIGNvbnRhaW5lciB3aXRoIHRoZSBnaXZlbgorICAgICAqIDxjb2RlPmphdmFQcm9qZWN0PC9jb2RlPi4KKyAgICAgKiA8cD4KKyAgICAgKiBTY2hlZHVsZXMgYSBjb250YWluZXIgdXBkYXRlIGJ5IGNhbGxpbmcKKyAgICAgKiB7QGxpbmsgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iI3NjaGVkdWxlQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iKCl9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gT25seSByZXNwb25zaWJsZSBmb3Igb3VyIG93biBjbGFzcyBwYXRoIGNvbnRhaW5lcgorICAgICAgICBpZiAoY29udGFpbmVyUGF0aC5lcXVhbHMoU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLkNMQVNTUEFUSF9DT05UQUlORVJfUEFUSCkpIHsKIAotCQkJLy8gUmV0cmlldmUgcGVyc2lzdGVkIGNsYXNzIHBhdGggY29udGFpbmVyCi0JCQlJQ2xhc3NwYXRoQ29udGFpbmVyIG9sZENvbnRhaW5lciA9IENsYXNzcGF0aFV0aWxzLmdldENsYXNzcGF0aENvbnRhaW5lcihqYXZhUHJvamVjdCk7CisgICAgICAgICAgICAvLyBSZXRyaWV2ZSBwZXJzaXN0ZWQgY2xhc3MgcGF0aCBjb250YWluZXIKKyAgICAgICAgICAgIElDbGFzc3BhdGhDb250YWluZXIgb2xkQ29udGFpbmVyID0gQ2xhc3NwYXRoVXRpbHMuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKGphdmFQcm9qZWN0KTsKIAotCQkJU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyIG5ld0NvbnRhaW5lciA9IG51bGw7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBvbGRFbnRyaWVzID0gbnVsbDsKKyAgICAgICAgICAgIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lciBuZXdDb250YWluZXIgPSBudWxsOworICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gb2xkRW50cmllcyA9IG51bGw7CiAKLQkJCWlmIChvbGRDb250YWluZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG9sZENvbnRhaW5lciA9PSBudWxsKSB7CiAKLQkJCQkvLyBUcnkgdG8gcmVhZCBwcmV2aW91c2x5IHBlcnNpc3RlZCBjbGFzc3BhdGggY29udGFpbmVyIHNldHRpbmdzCi0JCQkJb2xkRW50cmllcyA9IFNlcnZlckNsYXNzcGF0aFV0aWxzLnJlYWRQZXJzaXN0ZWRDbGFzc3BhdGhFbnRyaWVzKGphdmFQcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gcmVhZCBwcmV2aW91c2x5IHBlcnNpc3RlZCBjbGFzc3BhdGggY29udGFpbmVyIHNldHRpbmdzCisgICAgICAgICAgICAgICAgb2xkRW50cmllcyA9IFNlcnZlckNsYXNzcGF0aFV0aWxzLnJlYWRQZXJzaXN0ZWRDbGFzc3BhdGhFbnRyaWVzKGphdmFQcm9qZWN0KTsKIAotCQkJCWlmIChvbGRFbnRyaWVzICE9IG51bGwpIHsKLQkJCQkJbmV3Q29udGFpbmVyID0gbmV3IFNlcnZlckNsYXNzcGF0aENvbnRhaW5lcihqYXZhUHJvamVjdCwgb2xkRW50cmllcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbmV3Q29udGFpbmVyID0gbmV3IFNlcnZlckNsYXNzcGF0aENvbnRhaW5lcihqYXZhUHJvamVjdCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQluZXdDb250YWluZXIgPSBuZXcgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyKGphdmFQcm9qZWN0LCBvbGRDb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpKTsKLQkJCX0KKyAgICAgICAgICAgICAgICBpZiAob2xkRW50cmllcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRhaW5lciA9IG5ldyBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIoamF2YVByb2plY3QsIG9sZEVudHJpZXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRhaW5lciA9IG5ldyBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIoamF2YVByb2plY3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbmV3Q29udGFpbmVyID0gbmV3IFNlcnZlckNsYXNzcGF0aENvbnRhaW5lcihqYXZhUHJvamVjdCwgb2xkQ29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKSk7CisgICAgICAgICAgICB9CiAKLQkJCS8vIEluc3RhbGwgdGhlIGNsYXNzIHBhdGggY29udGFpbmVyIHdpdGggdGhlIHByb2plY3QKLQkJCUphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcihjb250YWluZXJQYXRoLCBuZXcgSUphdmFQcm9qZWN0W10geyBqYXZhUHJvamVjdCB9LAotCQkJCQluZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdIHsgbmV3Q29udGFpbmVyIH0sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICAgICAgLy8gSW5zdGFsbCB0aGUgY2xhc3MgcGF0aCBjb250YWluZXIgd2l0aCB0aGUgcHJvamVjdAorICAgICAgICAgICAgSmF2YUNvcmUuc2V0Q2xhc3NwYXRoQ29udGFpbmVyKGNvbnRhaW5lclBhdGgsIG5ldyBJSmF2YVByb2plY3RbXSB7IGphdmFQcm9qZWN0IH0sIG5ldyBJQ2xhc3NwYXRoQ29udGFpbmVyW10geyBuZXdDb250YWluZXIgfSwKKyAgICAgICAgICAgICAgICBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKIAotCQkJaWYgKG9sZEVudHJpZXMgPT0gbnVsbCB8fCBoYXNNYW5pZmVzdENoYW5nZWQoamF2YVByb2plY3QsIGZhbHNlKSB8fCBoYXNNYW5pZmVzdENoYW5nZWQoamF2YVByb2plY3QsIHRydWUpKSB7Ci0JCQkJLy8gU2NoZWR1bGUgcmVmcmVzaCBvZiBjbGFzcyBwYXRoIGNvbnRhaW5lcgotCQkJCVNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYi5zY2hlZHVsZUNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYihqYXZhUHJvamVjdCwKLQkJCQkJCUJ1bmRsZU1hbmlmZXN0TWFuYWdlci5JTVBPUlRTX0NIQU5HRUQpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgaWYgKG9sZEVudHJpZXMgPT0gbnVsbCB8fCBoYXNNYW5pZmVzdENoYW5nZWQoamF2YVByb2plY3QsIGZhbHNlKSB8fCBoYXNNYW5pZmVzdENoYW5nZWQoamF2YVByb2plY3QsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgLy8gU2NoZWR1bGUgcmVmcmVzaCBvZiBjbGFzcyBwYXRoIGNvbnRhaW5lcgorICAgICAgICAgICAgICAgIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYi5zY2hlZHVsZUNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYihqYXZhUHJvamVjdCwgQnVuZGxlTWFuaWZlc3RNYW5hZ2VyLklNUE9SVFNfQ0hBTkdFRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIGJvb2xlYW4gaGFzTWFuaWZlc3RDaGFuZ2VkKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiB0ZXN0TWFuaWZlc3QpIHsKLQkJSUZpbGUgZmlsZSA9IEJ1bmRsZU1hbmlmZXN0VXRpbHMubG9jYXRlTWFuaWZlc3QoamF2YVByb2plY3QsIHRlc3RNYW5pZmVzdCk7Ci0JCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbGFzdG1vZGlmaWVkID0gZmlsZS5nZXRQZXJzaXN0ZW50UHJvcGVydHkobmV3IFF1YWxpZmllZE5hbWUoSmR0Q29yZVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQlTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIuTUFOSUZFU1RfVElNRVNUQU1QKSk7Ci0JCQkJcmV0dXJuIGxhc3Rtb2RpZmllZCA9PSBudWxsIHx8IGZpbGUuZ2V0TG9jYWxUaW1lU3RhbXAoKSAhPSBMb25nLnZhbHVlT2YobGFzdG1vZGlmaWVkKS5sb25nVmFsdWUoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUpkdENvcmVQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgcHJpdmF0ZSBib29sZWFuIGhhc01hbmlmZXN0Q2hhbmdlZChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGJvb2xlYW4gdGVzdE1hbmlmZXN0KSB7CisgICAgICAgIElGaWxlIGZpbGUgPSBCdW5kbGVNYW5pZmVzdFV0aWxzLmxvY2F0ZU1hbmlmZXN0KGphdmFQcm9qZWN0LCB0ZXN0TWFuaWZlc3QpOworICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxhc3Rtb2RpZmllZCA9IGZpbGUuZ2V0UGVyc2lzdGVudFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICBuZXcgUXVhbGlmaWVkTmFtZShKZHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLk1BTklGRVNUX1RJTUVTVEFNUCkpOworICAgICAgICAgICAgICAgIHJldHVybiBsYXN0bW9kaWZpZWQgPT0gbnVsbCB8fCBmaWxlLmdldExvY2FsVGltZVN0YW1wKCkgIT0gTG9uZy52YWx1ZU9mKGxhc3Rtb2RpZmllZCkubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBKZHRDb3JlUGx1Z2luLmxvZyhlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29tcGFyaXNvbklEKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChjb250YWluZXJQYXRoID09IG51bGwgfHwgcHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldENvbXBhcmlzb25JRChJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgeworICAgICAgICBpZiAoY29udGFpbmVyUGF0aCA9PSBudWxsIHx8IHByb2plY3QgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQlyZXR1cm4gY29udGFpbmVyUGF0aC5zZWdtZW50KDApICsgIi8iICsgcHJvamVjdC5nZXRQYXRoKCkuc2VnbWVudCgwKTsgLy8kTk9OLU5MUy0xJAotCX0KKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lclBhdGguc2VnbWVudCgwKSArICIvIiArIHByb2plY3QuZ2V0UGF0aCgpLnNlZ21lbnQoMCk7IC8vJE5PTi1OTFMtMSQKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLkNMQVNTUEFUSF9DT05UQUlORVJfREVTQ1JJUFRJT047Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHJldHVybiBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIuQ0xBU1NQQVRIX0NPTlRBSU5FUl9ERVNDUklQVElPTjsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuVXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIGFsd2F5cyBvayB0byBtb2RpZnkgdGhlIGNsYXNzIHBhdGggY29udGFpbmVyCi0JCXJldHVybiB0cnVlOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2FuVXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIC8vIGFsd2F5cyBvayB0byBtb2RpZnkgdGhlIGNsYXNzIHBhdGggY29udGFpbmVyCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZXF1ZXN0Q2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwKLQkJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyU3VnZ2VzdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBTdG9yZSBzb3VyY2UgYXR0YWNobWVudHMgYW5kIGRpc21pc3MgYW55IG90aGVyIGNoYW5nZXMgdG8gdGhlIGNvbnRhaW5lcgotCQlDbGFzc3BhdGhVdGlscy5zdG9yZVNvdXJjZUF0dGFjaG1lbnRzKGphdmFQcm9qZWN0LCBjb250YWluZXJTdWdnZXN0aW9uKTsKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVxdWVzdENsYXNzcGF0aENvbnRhaW5lclVwZGF0ZShJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyU3VnZ2VzdGlvbikKKyAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICAvLyBTdG9yZSBzb3VyY2UgYXR0YWNobWVudHMgYW5kIGRpc21pc3MgYW55IG90aGVyIGNoYW5nZXMgdG8gdGhlIGNvbnRhaW5lcgorICAgICAgICBDbGFzc3BhdGhVdGlscy5zdG9yZVNvdXJjZUF0dGFjaG1lbnRzKGphdmFQcm9qZWN0LCBjb250YWluZXJTdWdnZXN0aW9uKTsKIAotCQkvLyBTY2hlZHVsZSByZWZyZXNoIG9mIGNsYXNzIHBhdGggY29udGFpbmVyCi0JCVNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYi5zY2hlZHVsZUNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYihqYXZhUHJvamVjdCwKLQkJCQlCdW5kbGVNYW5pZmVzdE1hbmFnZXIuSU1QT1JUU19DSEFOR0VEKTsKLQl9CisgICAgICAgIC8vIFNjaGVkdWxlIHJlZnJlc2ggb2YgY2xhc3MgcGF0aCBjb250YWluZXIKKyAgICAgICAgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iLnNjaGVkdWxlQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iKGphdmFQcm9qZWN0LCBCdW5kbGVNYW5pZmVzdE1hbmFnZXIuSU1QT1JUU19DSEFOR0VEKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElDbGFzc3BhdGhDb250YWluZXIgZ2V0RmFpbHVyZUNvbnRhaW5lcihJUGF0aCBjb250YWluZXJQYXRoLCBJSmF2YVByb2plY3QgcHJvamVjdCkgewotCQkvLyByZS10cnkgaW4gY2FzZSBzb21ldGhpbmcgd2VudCB3cm9uZwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQ2xhc3NwYXRoQ29udGFpbmVyIGdldEZhaWx1cmVDb250YWluZXIoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgLy8gcmUtdHJ5IGluIGNhc2Ugc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS9jbGFzc3BhdGgvU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS9jbGFzc3BhdGgvU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iLmphdmEKaW5kZXggMzFlZjBlYS4uNzNmNjM0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL2NvcmUvY2xhc3NwYXRoL1NlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC9jb3JlL2NsYXNzcGF0aC9TZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2IuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmludGVybmFsLmNvcmUuY2xhc3NwYXRoOwogCiBpbXBvcnQgamF2YS51dGlsLlF1ZXVlOwpAQCAtMzMsMTY1ICszNCwxNjAgQEAKIAogLyoqCiAgKiB7QGxpbmsgV29ya3NwYWNlSm9ifSB0aGF0IHRyaWdnZXJzIHRoZSBjbGFzcyBwYXRoIGNvbnRhaW5lciByZWZyZXNoLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjAKICAqLwogcHVibGljIGNsYXNzIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiB7CiAKLQkvKiogSW50ZXJuYWwgY2FjaGUgb2Ygc2NoZWR1bGVkIGFuZCA8Yj51bmZpbmlzaGVkPC9iPiB1cGRhdGUgam9icyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFF1ZXVlPElKYXZhUHJvamVjdD4gU0NIRURVTEVEX1BST0pFQ1RTID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZTxJSmF2YVByb2plY3Q+KCk7CisgICAgLyoqIEludGVybmFsIGNhY2hlIG9mIHNjaGVkdWxlZCBhbmQgPGI+dW5maW5pc2hlZDwvYj4gdXBkYXRlIGpvYnMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRdWV1ZTxJSmF2YVByb2plY3Q+IFNDSEVEVUxFRF9QUk9KRUNUUyA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWU8SUphdmFQcm9qZWN0PigpOwogCi0JLyoqCi0JICogTWFuYWdlcyB0aGUgam9icywgc28gdGhlcmUgd2lsbCBub3QgYmUgYSBodWdlIGFtb3VudCBvZiBjb25jdXJyZW50IHVwZGF0ZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBMaW1pdENvbmN1cnJlbnRDbGFzc3BhdGhVcGRhdGVzTGlzdGVuZXIgbGltaXRDb25jdXJyZW50Q2xhc3NwYXRoVXBkYXRlc0xpc3RlbmVyID0gbmV3IExpbWl0Q29uY3VycmVudENsYXNzcGF0aFVwZGF0ZXNMaXN0ZW5lcigpOworICAgIC8qKgorICAgICAqIE1hbmFnZXMgdGhlIGpvYnMsIHNvIHRoZXJlIHdpbGwgbm90IGJlIGEgaHVnZSBhbW91bnQgb2YgY29uY3VycmVudCB1cGRhdGVzCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTGltaXRDb25jdXJyZW50Q2xhc3NwYXRoVXBkYXRlc0xpc3RlbmVyIGxpbWl0Q29uY3VycmVudENsYXNzcGF0aFVwZGF0ZXNMaXN0ZW5lciA9IG5ldyBMaW1pdENvbmN1cnJlbnRDbGFzc3BhdGhVcGRhdGVzTGlzdGVuZXIoKTsKIAotCS8qKgotCSAqIFRoZSB7QGxpbmsgSUphdmFQcm9qZWN0fSB0aGlzIGpvYnMgc2hvdWxkIHJlZnJlc2ggdGhlIGNsYXNzIHBhdGggY29udGFpbmVyIGZvcgotCSAqLwotCXByaXZhdGUgZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgSUphdmFQcm9qZWN0fSB0aGlzIGpvYnMgc2hvdWxkIHJlZnJlc2ggdGhlIGNsYXNzIHBhdGggY29udGFpbmVyIGZvcgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwogCi0JcHJpdmF0ZSBTZXQ8VHlwZT4gdHlwZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8VHlwZT4gdHlwZXM7CiAKLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIHtAbGluayBJSmF2YVByb2plY3R9IHRoZSBjbGFzcyBwYXRoIGNvbnRhaW5lciBzaG91bGQgYmUgdXBkYXRlZCBmb3IKLQkgKiBAcGFyYW0gdHlwZXMKLQkgKiAgICAgICAgICAgIHRoZSBjaGFuZ2UgdHlwZXMgaGFwcGVuZWQgdG8gdGhlIG1hbmlmZXN0Ci0JICovCi0JcHJpdmF0ZSBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2IoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTZXQ8VHlwZT4gdHlwZXMpIHsKLQkJc3VwZXIoIlVwZGF0aW5nIGJ1bmRsZSBjbGFzc3BhdGggY29udGFpbmVyIGZvciBwcm9qZWN0ICciICsgamF2YVByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSArICInIik7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQkJdGhpcy50eXBlcyA9IHR5cGVzOwotCX0KKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZQorICAgICAqCisgICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSB7QGxpbmsgSUphdmFQcm9qZWN0fSB0aGUgY2xhc3MgcGF0aCBjb250YWluZXIgc2hvdWxkIGJlIHVwZGF0ZWQgZm9yCisgICAgICogQHBhcmFtIHR5cGVzIHRoZSBjaGFuZ2UgdHlwZXMgaGFwcGVuZWQgdG8gdGhlIG1hbmlmZXN0CisgICAgICovCisgICAgcHJpdmF0ZSBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2IoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTZXQ8VHlwZT4gdHlwZXMpIHsKKyAgICAgICAgc3VwZXIoIlVwZGF0aW5nIGJ1bmRsZSBjbGFzc3BhdGggY29udGFpbmVyIGZvciBwcm9qZWN0ICciICsgamF2YVByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSArICInIik7CisgICAgICAgIHRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKKyAgICAgICAgdGhpcy50eXBlcyA9IHR5cGVzOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGludGVybmFsIHtAbGluayBJSmF2YVByb2plY3R9Ci0JICovCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcm5hbCB7QGxpbmsgSUphdmFQcm9qZWN0fQorICAgICAqLworICAgIHB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmphdmFQcm9qZWN0OworICAgIH0KIAotCS8qKgotCSAqIFJ1bnMgdGhlIGpvYiBpbiB0aGUgY29udGV4dCBvZiB0aGUgd29ya3NwYWNlLiBTaW1wbHkgZGVsZWdhdGVzIHJlZnJlc2hpbmcgb2YgdGhlIGNsYXNzIHBhdGggY29udGFpbmVyIHRvCi0JICoge0BsaW5rIENsYXNzcGF0aFV0aWxzI3VwZGF0ZUNsYXNzcGF0aENvbnRhaW5lcihJSmF2YVByb2plY3QsIElQcm9ncmVzc01vbml0b3IpfSAuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmlzT3BlbigpIHx8IG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0KLQkJdHJ5IHsKLQkJCUNsYXNzcGF0aFV0aWxzLnVwZGF0ZUNsYXNzcGF0aENvbnRhaW5lcihqYXZhUHJvamVjdCwgdHlwZXMsIG1vbml0b3IpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQl9CisgICAgLyoqCisgICAgICogUnVucyB0aGUgam9iIGluIHRoZSBjb250ZXh0IG9mIHRoZSB3b3Jrc3BhY2UuIFNpbXBseSBkZWxlZ2F0ZXMgcmVmcmVzaGluZyBvZiB0aGUgY2xhc3MgcGF0aCBjb250YWluZXIgdG8KKyAgICAgKiB7QGxpbmsgQ2xhc3NwYXRoVXRpbHMjdXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyKElKYXZhUHJvamVjdCwgSVByb2dyZXNzTW9uaXRvcil9IC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCF0aGlzLmphdmFQcm9qZWN0LmdldFByb2plY3QoKS5pc09wZW4oKSB8fCBtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGFzc3BhdGhVdGlscy51cGRhdGVDbGFzc3BhdGhDb250YWluZXIodGhpcy5qYXZhUHJvamVjdCwgdGhpcy50eXBlcywgbW9uaXRvcik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CisgICAgICAgIH0KIAotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKZHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgIlVwZGF0ZWQgU3ByaW5nU291cmNlIGRtIFNlcnZlciBjbGFzc3BhdGggY29udGFpbmVyIik7Ci0JfQorICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKZHRDb3JlUGx1Z2luLlBMVUdJTl9JRCwgIlVwZGF0ZWQgU3ByaW5nU291cmNlIGRtIFNlcnZlciBjbGFzc3BhdGggY29udGFpbmVyIik7CisgICAgfQogCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBzY2hlZHVsZSBhIG5ldyB7QGxpbmsgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9ifSAuCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUge0BsaW5rIElKYXZhUHJvamVjdH0gdGhlIGNsYXNzIHBhdGggY29udGFpbmVyIHNob3VsZCBiZSB1cGRhdGVkIGZvcgotCSAqIEBwYXJhbSB0eXBlcwotCSAqICAgICAgICAgICAgdGhlIGNoYW5nZSB0eXBlcyBvZiB0aGUgbWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2NoZWR1bGVDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2IoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTZXQ8VHlwZT4gdHlwZXMpIHsKLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwgJiYgIVNDSEVEVUxFRF9QUk9KRUNUUy5jb250YWlucyhqYXZhUHJvamVjdCkgJiYgdHlwZXMuc2l6ZSgpID4gMAotCQkJCSYmIENsYXNzcGF0aFV0aWxzLmhhc0NsYXNzcGF0aENvbnRhaW5lcihqYXZhUHJvamVjdCkpIHsKLQkJCW5ld0NsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYihqYXZhUHJvamVjdCwgdHlwZXMpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gc2NoZWR1bGUgYSBuZXcge0BsaW5rIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYn0gLgorICAgICAqCisgICAgICogQHBhcmFtIGphdmFQcm9qZWN0IHRoZSB7QGxpbmsgSUphdmFQcm9qZWN0fSB0aGUgY2xhc3MgcGF0aCBjb250YWluZXIgc2hvdWxkIGJlIHVwZGF0ZWQgZm9yCisgICAgICogQHBhcmFtIHR5cGVzIHRoZSBjaGFuZ2UgdHlwZXMgb2YgdGhlIG1hbmlmZXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNjaGVkdWxlQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU2V0PFR5cGU+IHR5cGVzKSB7CisgICAgICAgIGlmIChqYXZhUHJvamVjdCAhPSBudWxsICYmICFTQ0hFRFVMRURfUFJPSkVDVFMuY29udGFpbnMoamF2YVByb2plY3QpICYmIHR5cGVzLnNpemUoKSA+IDAKKyAgICAgICAgICAgICYmIENsYXNzcGF0aFV0aWxzLmhhc0NsYXNzcGF0aENvbnRhaW5lcihqYXZhUHJvamVjdCkpIHsKKyAgICAgICAgICAgIG5ld0NsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYihqYXZhUHJvamVjdCwgdHlwZXMpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9ifSBhbmQgY29uZmlndXJlcyByZXF1aXJlZCBwcm9wZXJ0aWVzIGFuZAotCSAqIHNjaGVkdWxlcyBpdCB0byB0aGUgd29ya2JlbmNoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYiBuZXdDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2IoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LAotCQkJU2V0PFR5cGU+IHR5cGVzKSB7Ci0JCVNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYiBqb2IgPSBuZXcgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iKGphdmFQcm9qZWN0LCB0eXBlcyk7Ci0JCS8vIGpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLmJ1aWxkUnVsZSgpKTsKLQkJam9iLnNldFByaW9yaXR5KEpvYi5CVUlMRCk7Ci0JCWpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCWpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgRHVwbGljYXRlSm9iTGlzdGVuZXIoKSk7Ci0JCWpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihsaW1pdENvbmN1cnJlbnRDbGFzc3BhdGhVcGRhdGVzTGlzdGVuZXIpOwotCQlqb2Iuc2xlZXAoKTsKLQkJbGltaXRDb25jdXJyZW50Q2xhc3NwYXRoVXBkYXRlc0xpc3RlbmVyLnNjaGVkdWxlKGpvYik7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9ifSBhbmQgY29uZmlndXJlcyByZXF1aXJlZCBwcm9wZXJ0aWVzIGFuZAorICAgICAqIHNjaGVkdWxlcyBpdCB0byB0aGUgd29ya2JlbmNoLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYiBuZXdDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2IoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTZXQ8VHlwZT4gdHlwZXMpIHsKKyAgICAgICAgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iIGpvYiA9IG5ldyBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2IoamF2YVByb2plY3QsIHR5cGVzKTsKKyAgICAgICAgLy8gam9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkuYnVpbGRSdWxlKCkpOworICAgICAgICBqb2Iuc2V0UHJpb3JpdHkoSm9iLkJVSUxEKTsKKyAgICAgICAgam9iLnNldFN5c3RlbSh0cnVlKTsKKyAgICAgICAgam9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBEdXBsaWNhdGVKb2JMaXN0ZW5lcigpKTsKKyAgICAgICAgam9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKGxpbWl0Q29uY3VycmVudENsYXNzcGF0aFVwZGF0ZXNMaXN0ZW5lcik7CisgICAgICAgIGpvYi5zbGVlcCgpOworICAgICAgICBsaW1pdENvbmN1cnJlbnRDbGFzc3BhdGhVcGRhdGVzTGlzdGVuZXIuc2NoZWR1bGUoam9iKTsKIAotCQlyZXR1cm4gam9iOwotCX0KKyAgICAgICAgcmV0dXJuIGpvYjsKKyAgICB9CiAKLQkvKioKLQkgKiBJbnRlcm5hbCB7QGxpbmsgSUpvYkNoYW5nZUxpc3RlbmVyfSB0byBkZXRlY3QgZHVwbGljYXRlcyBpbiB0aGUgc2NoZWR1bGVkIGxpc3Qgb2YKLQkgKiB7QGxpbmsgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iIEpvYnN9LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIER1cGxpY2F0ZUpvYkxpc3RlbmVyIGV4dGVuZHMgSm9iQ2hhbmdlQWRhcHRlciBpbXBsZW1lbnRzIElKb2JDaGFuZ2VMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogSW50ZXJuYWwge0BsaW5rIElKb2JDaGFuZ2VMaXN0ZW5lcn0gdG8gZGV0ZWN0IGR1cGxpY2F0ZXMgaW4gdGhlIHNjaGVkdWxlZCBsaXN0IG9mCisgICAgICoge0BsaW5rIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYiBKb2JzfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEdXBsaWNhdGVKb2JMaXN0ZW5lciBleHRlbmRzIEpvYkNoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBJSm9iQ2hhbmdlTGlzdGVuZXIgewogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJU0NIRURVTEVEX1BST0pFQ1RTLnJlbW92ZSgoKFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYikgZXZlbnQuZ2V0Sm9iKCkpLmdldEphdmFQcm9qZWN0KCkpOwotCQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgeworICAgICAgICAgICAgU0NIRURVTEVEX1BST0pFQ1RTLnJlbW92ZSgoKFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYikgZXZlbnQuZ2V0Sm9iKCkpLmdldEphdmFQcm9qZWN0KCkpOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNjaGVkdWxlZChJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVNDSEVEVUxFRF9QUk9KRUNUUy5hZGQoKChTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2IpIGV2ZW50LmdldEpvYigpKS5nZXRKYXZhUHJvamVjdCgpKTsKLQkJfQotCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNjaGVkdWxlZChJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIFNDSEVEVUxFRF9QUk9KRUNUUy5hZGQoKChTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2IpIGV2ZW50LmdldEpvYigpKS5nZXRKYXZhUHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEludGVybmFsIHtAbGluayBJSm9iQ2hhbmdlTGlzdGVuZXJ9IHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBidWlsZHMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGltaXRDb25jdXJyZW50Q2xhc3NwYXRoVXBkYXRlc0xpc3RlbmVyIGV4dGVuZHMgSm9iQ2hhbmdlQWRhcHRlciBpbXBsZW1lbnRzIElKb2JDaGFuZ2VMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBRdWV1ZSB3aXRoIHRoZSBqb2JzIHdoaWNoIGFyZSBzY2hlZHVsZWQsIHVzZWQgdG8gbWFrZSBzdXJlIGEgbGltaXRlZCBhbW91bnQgb2YgcHJvamVjdHMgaXMgYmVpbmcgcmVidWlsdCBhdAotCQkgKiB0aGUgc2FtZSB0aW1lCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIFF1ZXVlPFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYj4gU0NIRURVTEVEX0pPQlMgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2I+KCk7CisgICAgLyoqCisgICAgICogSW50ZXJuYWwge0BsaW5rIElKb2JDaGFuZ2VMaXN0ZW5lcn0gdG8gbGltaXQgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IGJ1aWxkcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMaW1pdENvbmN1cnJlbnRDbGFzc3BhdGhVcGRhdGVzTGlzdGVuZXIgZXh0ZW5kcyBKb2JDaGFuZ2VBZGFwdGVyIGltcGxlbWVudHMgSUpvYkNoYW5nZUxpc3RlbmVyIHsKIAotCQkvKioKLQkJICogTWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBqb2JzLCBkZWZhdWx0cyB0byB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3JzCi0JCSAqLwotCQlwcml2YXRlIGludCBtYXhOck9mQ29uY3VycmVudEpvYnMgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBRdWV1ZSB3aXRoIHRoZSBqb2JzIHdoaWNoIGFyZSBzY2hlZHVsZWQsIHVzZWQgdG8gbWFrZSBzdXJlIGEgbGltaXRlZCBhbW91bnQgb2YgcHJvamVjdHMgaXMgYmVpbmcgcmVidWlsdCBhdAorICAgICAgICAgKiB0aGUgc2FtZSB0aW1lCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIFF1ZXVlPFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYj4gU0NIRURVTEVEX0pPQlMgPSBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2I+KCk7CiAKLQkJLyoqIEhvbGRzIHRoZSBudW1iZXIgb2YgYnVpbGRzIGluIHByb2dyZXNzICovCi0JCXByaXZhdGUgQXRvbWljSW50ZWdlciBuck9mQnVpbGRpbmdQcm9qZWN0cyA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICAvKioKKyAgICAgICAgICogTWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBqb2JzLCBkZWZhdWx0cyB0byB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3JzCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtYXhOck9mQ29uY3VycmVudEpvYnMgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCk7CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQluck9mQnVpbGRpbmdQcm9qZWN0cy5kZWNyZW1lbnRBbmRHZXQoKTsKLQkJCXN0YXJ0TmV4dEpvYigpOwotCQl9CisgICAgICAgIC8qKiBIb2xkcyB0aGUgbnVtYmVyIG9mIGJ1aWxkcyBpbiBwcm9ncmVzcyAqLworICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgbnJPZkJ1aWxkaW5nUHJvamVjdHMgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVubmluZyhJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYiBqb2IgPSAoU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iKSBldmVudC5nZXRKb2IoKTsKLQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKLQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEpkdENvcmVQbHVnaW4uUExVR0lOX0lELCAiVXBkYXRpbmcgY2xhc3NwYXRoIG9mOiAiCi0JCQkJCQkJKyBqb2IuamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArICIuIFF1ZXVlIHNpemU6ICIgKyBTQ0hFRFVMRURfSk9CUy5zaXplKCkpKTsKLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIHRoaXMubnJPZkJ1aWxkaW5nUHJvamVjdHMuZGVjcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICBzdGFydE5leHRKb2IoKTsKKyAgICAgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzY2hlZHVsZWQoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQluck9mQnVpbGRpbmdQcm9qZWN0cy5pbmNyZW1lbnRBbmRHZXQoKTsKLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVubmluZyhJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYiBqb2IgPSAoU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iKSBldmVudC5nZXRKb2IoKTsKKyAgICAgICAgICAgIFN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZShuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgSmR0Q29yZVBsdWdpbi5QTFVHSU5fSUQsCisgICAgICAgICAgICAgICAgIlVwZGF0aW5nIGNsYXNzcGF0aCBvZjogIiArIGpvYi5qYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIi4gUXVldWUgc2l6ZTogIiArIHRoaXMuU0NIRURVTEVEX0pPQlMuc2l6ZSgpKSk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgc2NoZWR1bGUoU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iIGpvYikgewotCQkJU0NIRURVTEVEX0pPQlMub2ZmZXIoam9iKTsKLQkJCXN0YXJ0TmV4dEpvYigpOwotCQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzY2hlZHVsZWQoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICB0aGlzLm5yT2ZCdWlsZGluZ1Byb2plY3RzLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIHN0YXJ0TmV4dEpvYigpIHsKLQkJCWlmIChuck9mQnVpbGRpbmdQcm9qZWN0cy5nZXQoKSA8IG1heE5yT2ZDb25jdXJyZW50Sm9icykgewotCQkJCUpvYiBqb2IgPSBTQ0hFRFVMRURfSk9CUy5wb2xsKCk7Ci0JCQkJaWYgKGpvYiAhPSBudWxsKSB7IC8vIG51bGwgaXMgcmV0dXJuZWQgd2hlbiBxdWV1ZSBpcyBlbXB0eQotCQkJCQlqb2Iuc2NoZWR1bGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBzY2hlZHVsZShTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2Igam9iKSB7CisgICAgICAgICAgICB0aGlzLlNDSEVEVUxFRF9KT0JTLm9mZmVyKGpvYik7CisgICAgICAgICAgICBzdGFydE5leHRKb2IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzdGFydE5leHRKb2IoKSB7CisgICAgICAgICAgICBpZiAodGhpcy5uck9mQnVpbGRpbmdQcm9qZWN0cy5nZXQoKSA8IHRoaXMubWF4TnJPZkNvbmN1cnJlbnRKb2JzKSB7CisgICAgICAgICAgICAgICAgSm9iIGpvYiA9IHRoaXMuU0NIRURVTEVEX0pPQlMucG9sbCgpOworICAgICAgICAgICAgICAgIGlmIChqb2IgIT0gbnVsbCkgeyAvLyBudWxsIGlzIHJldHVybmVkIHdoZW4gcXVldWUgaXMgZW1wdHkKKyAgICAgICAgICAgICAgICAgICAgam9iLnNjaGVkdWxlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL2NvcmUvY2xhc3NwYXRoL1NlcnZlckNsYXNzcGF0aFV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS9jbGFzc3BhdGgvU2VydmVyQ2xhc3NwYXRoVXRpbHMuamF2YQppbmRleCA2N2M2NTg5Li45YmExNDcyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS9jbGFzc3BhdGgvU2VydmVyQ2xhc3NwYXRoVXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS9jbGFzc3BhdGgvU2VydmVyQ2xhc3NwYXRoVXRpbHMuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmludGVybmFsLmNvcmUuY2xhc3NwYXRoOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMzMsNyArMzQsNyBAQAogLyoqCiAgKiBVdGlsaXR5IHRoYXQgcGVyc2lzdHMgYW5kIHJlYWRzIHBlcnNpc3RlZCB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fXMgZnJvbSBhIGZpbGUgY2FsbGVkCiAgKiA8Y29kZT4uc2V0dGluZ3Mvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlLnhtbDwvY29kZT4uCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBhdXRob3IgVGVycnkgSG9uCiAgKiBAc2luY2UgMS4wLjEKQEAgLTQxLDExNyArNDIsMTE1IEBACiBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQogY2xhc3MgU2VydmVyQ2xhc3NwYXRoVXRpbHMgewogCi0JLyoqIFRoZSBuYW1lIG9mIHRoZSBwZXJzaXN0ZWQgZmlsZSB3aXRoaW4gdGhlIC5zZXR0aW5ncyBkaXJlY3Rvcnkgb2YgYSBFY2xpcHNlIHByb2plY3QgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX0ZJTEUgPSAiLSIgKyBKZHRDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIueG1sIjsKKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlZCBmaWxlIHdpdGhpbiB0aGUgLnNldHRpbmdzIGRpcmVjdG9yeSBvZiBhIEVjbGlwc2UgcHJvamVjdCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEhfRklMRSA9ICItIiArIEpkdENvcmVQbHVnaW4uUExVR0lOX0lEICsgIi54bWwiOwogCi0JLyoqCi0JICogU2F2ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiB7QGxpbmsgU3RyaW5nQnVpbGRlcn0gaW50byB0aGUgc2V0dGluZ3MgZmlsZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2F2ZUZpbGUoZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3QsIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlcikgeworICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4ge0BsaW5rIFN0cmluZ0J1aWxkZXJ9IGludG8gdGhlIHNldHRpbmdzIGZpbGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNhdmVGaWxlKGZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIpIHsKIAotCQkvLyBHZXQgdGhlIGZpbGUgZnJvbSB0aGUgcHJvamVjdAotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShTZXJ2ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9GaWxlKCksIHByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKQotCQkJCSsgQ0xBU1NQQVRIX0ZJTEUpOwotCQlGaWxlT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJdHJ5IHsKKyAgICAgICAgLy8gR2V0IHRoZSBmaWxlIGZyb20gdGhlIHByb2plY3QKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoU2VydmVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLnRvRmlsZSgpLCBwcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkgKyBDTEFTU1BBVEhfRklMRSk7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3MgPSBudWxsOworICAgICAgICB0cnkgewogCi0JCQkvLyBDcmVhdGUgYSBuZXcgZmlsZTsgb3ZlcnJpZGUgb2xkIGZpbGUKLQkJCWZpbGUuY3JlYXRlTmV3RmlsZSgpOworICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGZpbGU7IG92ZXJyaWRlIG9sZCBmaWxlCisgICAgICAgICAgICBmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKIAotCQkJLy8gV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBTdHJpbmdCdWlsZGVyCi0JCQlvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJb3Mud3JpdGUoYnVpbGRlci50b1N0cmluZygpLmdldEJ5dGVzKCJVVEYtOCIpKTsKLQkJCW9zLmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJLy8gY2FuJ3QgaGFwcGVuIGFzIGRlZmF1bHQgVVRGLTggaXMgdXNlZAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlKZHRDb3JlUGx1Z2luLmxvZygiQ2Fubm90IHNhdmUgY2xhc3NwYXRoIGVudHJpZXMgdG8gJyIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiciLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChvcyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb3MuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgICAgICAvLyBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIFN0cmluZ0J1aWxkZXIKKyAgICAgICAgICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICBvcy53cml0ZShidWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVURi04IikpOworICAgICAgICAgICAgb3MuZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBjYW4ndCBoYXBwZW4gYXMgZGVmYXVsdCBVVEYtOCBpcyB1c2VkCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEpkdENvcmVQbHVnaW4ubG9nKCJDYW5ub3Qgc2F2ZSBjbGFzc3BhdGggZW50cmllcyB0byAnIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiJyIsIGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKG9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBQZXJzaXN0cyB0aGUgZ2l2ZW4ge0BsaW5rIElDbGFzc3BhdGhFbnRyeX1zIHRvIGEgZmlsZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBwZXJzaXN0Q2xhc3NwYXRoRW50cmllcyhJSmF2YVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcykgeworICAgIC8qKgorICAgICAqIFBlcnNpc3RzIHRoZSBnaXZlbiB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5fXMgdG8gYSBmaWxlCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHBlcnNpc3RDbGFzc3BhdGhFbnRyaWVzKElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzKSB7CiAKLQkJLy8gR2V0IHRoZSBsaW5lIHNlcGFyYXRvciBmcm9tIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uCi0JCVN0cmluZyBsaW5lU2VwYXJhdG9yID0gVXRpbC5nZXRMaW5lU2VwYXJhdG9yKChTdHJpbmcpIG51bGwsIHByb2plY3QpOworICAgICAgICAvLyBHZXQgdGhlIGxpbmUgc2VwYXJhdG9yIGZyb20gdGhlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBVdGlsLmdldExpbmVTZXBhcmF0b3IoKFN0cmluZykgbnVsbCwgcHJvamVjdCk7CiAKLQkJLy8gQ3JlYXRlIHRoZSB4bWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGFzc3BhdGggZW50cmllcwotCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiPGNsYXNzcGF0aD4iKS5hcHBlbmQobGluZVNlcGFyYXRvcik7Ci0JCWlmIChwcm9qZWN0IGluc3RhbmNlb2YgSmF2YVByb2plY3QpIHsKLQkJCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBwcm9qZWN0OwotCQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBlbnRyaWVzKSB7Ci0JCQkJYnVpbGRlci5hcHBlbmQoamF2YVByb2plY3QuZW5jb2RlQ2xhc3NwYXRoRW50cnkoZW50cnkpKTsKLQkJCX0KLQkJfQotCQlidWlsZGVyLmFwcGVuZCgiPC9jbGFzc3BhdGg+IikuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOworICAgICAgICAvLyBDcmVhdGUgdGhlIHhtbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsYXNzcGF0aCBlbnRyaWVzCisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCI8Y2xhc3NwYXRoPiIpLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKKyAgICAgICAgaWYgKHByb2plY3QgaW5zdGFuY2VvZiBKYXZhUHJvamVjdCkgeworICAgICAgICAgICAgSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSmF2YVByb2plY3QpIHByb2plY3Q7CisgICAgICAgICAgICBmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGVudHJpZXMpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChqYXZhUHJvamVjdC5lbmNvZGVDbGFzc3BhdGhFbnRyeShlbnRyeSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCI8L2NsYXNzcGF0aD4iKS5hcHBlbmQobGluZVNlcGFyYXRvcik7CiAKLQkJLy8gU2F2ZSB0aGUgY29udGVudHMgdG8gdGhlIHNldHRpbmdzIGZpbGUKLQkJc2F2ZUZpbGUocHJvamVjdCwgYnVpbGRlcik7Ci0JfQorICAgICAgICAvLyBTYXZlIHRoZSBjb250ZW50cyB0byB0aGUgc2V0dGluZ3MgZmlsZQorICAgICAgICBzYXZlRmlsZShwcm9qZWN0LCBidWlsZGVyKTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZWFkcyB0aGUgcGVyc2lzdGVkIGNsYXNzcGF0aCBlbnRyaWVzIGZvciB0aGUgZ2l2ZW4gPGNvZGU+cHJvamVjdDwvY29kZT4gYW5kIHJldHVybnMgdGhlIHtAbGluayBJQ2xhc3NwYXRoRW50cnl9Ci0JICogcy4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IHRvIGluZGljYXRlIHRoYXQgdGhlIGZpbGUgY291bGQgbm90IGJlIHJlYWQuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiIH0pCi0JcHJvdGVjdGVkIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSByZWFkUGVyc2lzdGVkQ2xhc3NwYXRoRW50cmllcyhJSmF2YVByb2plY3QgcHJvamVjdCkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShTZXJ2ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9GaWxlKCksIHByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKQotCQkJCSsgQ0xBU1NQQVRIX0ZJTEUpOworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBwZXJzaXN0ZWQgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPiBhbmQgcmV0dXJucyB0aGUge0BsaW5rIElDbGFzc3BhdGhFbnRyeX0KKyAgICAgKiBzLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gdG8gaW5kaWNhdGUgdGhhdCB0aGUgZmlsZSBjb3VsZCBub3QgYmUgcmVhZC4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIgfSkKKyAgICBwcm90ZWN0ZWQgc3RhdGljIElDbGFzc3BhdGhFbnRyeVtdIHJlYWRQZXJzaXN0ZWRDbGFzc3BhdGhFbnRyaWVzKElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKFNlcnZlckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS50b0ZpbGUoKSwgcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgQ0xBU1NQQVRIX0ZJTEUpOwogCi0JCVN0cmluZyB4bWxDbGFzc3BhdGggPSBudWxsOwotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlieXRlW10gYnl0ZXMgPSBGaWxlQ29weVV0aWxzLmNvcHlUb0J5dGVBcnJheShmaWxlKTsKLQkJCQl4bWxDbGFzc3BhdGggPSBuZXcgU3RyaW5nKGJ5dGVzLCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29tcGlsZXIudXRpbC5VdGlsLlVURl84KTsKLQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJCS8vIGNhbid0IGhhcHBlbiBhcyBkZWZhdWx0IFVURi04IGlzIHVzZWQKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQorICAgICAgICBTdHJpbmcgeG1sQ2xhc3NwYXRoID0gbnVsbDsKKyAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRmlsZUNvcHlVdGlscy5jb3B5VG9CeXRlQXJyYXkoZmlsZSk7CisgICAgICAgICAgICAgICAgeG1sQ2xhc3NwYXRoID0gbmV3IFN0cmluZyhieXRlcywgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvbXBpbGVyLnV0aWwuVXRpbC5VVEZfOCk7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBjYW4ndCBoYXBwZW4gYXMgZGVmYXVsdCBVVEYtOCBpcyB1c2VkCisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAoeG1sQ2xhc3NwYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CisgICAgICAgIGlmICh4bWxDbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQlpZiAocHJvamVjdCBpbnN0YW5jZW9mIEphdmFQcm9qZWN0KSB7Ci0JCQlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCkgcHJvamVjdDsKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IGRlY29kZWRDbGFzc1BhdGg7CisgICAgICAgIGlmIChwcm9qZWN0IGluc3RhbmNlb2YgSmF2YVByb2plY3QpIHsKKyAgICAgICAgICAgIEphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBwcm9qZWN0OworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBPYmplY3QgZGVjb2RlZENsYXNzUGF0aDsKIAotCQkJCXRyeSB7Ci0JCQkJCS8vIG5lZWRzIHJlZmxlY3Rpb24gc2luY2UgcmV0dXJuIHR5cGUgb2YgZGVjb2RlQ2xhc3NwYXRoIGhhcyBjaGFuZ2VkIGluIEVjbGlwc2UgMy42Ci0JCQkJCU1ldGhvZCBtZXRob2QgPSBqYXZhUHJvamVjdC5nZXRDbGFzcygpLmdldE1ldGhvZCgiZGVjb2RlQ2xhc3NwYXRoIiwgU3RyaW5nLmNsYXNzLCBNYXAuY2xhc3MpOwotCQkJCQlkZWNvZGVkQ2xhc3NQYXRoID0gbWV0aG9kLmludm9rZShqYXZhUHJvamVjdCwgeG1sQ2xhc3NwYXRoLCBuZXcgSGFzaE1hcCgpKTsKLQkJCQkJaWYgKGRlY29kZWRDbGFzc1BhdGggaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRW50cnlbXVtdKSB7Ci0JCQkJCQlMaXN0PElDbGFzc3BhdGhFbnRyeT4gZGVjb2RlZEVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKLQkJCQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5W10gZW50cnkgOiAoSUNsYXNzcGF0aEVudHJ5W11bXSkgZGVjb2RlZENsYXNzUGF0aCkgewotCQkJCQkJCWRlY29kZWRFbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGVudHJ5KSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZGVjb2RlZEVudHJpZXMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2RlY29kZWRFbnRyaWVzLnNpemUoKV0pOwotCQkJCQl9IGVsc2UgaWYgKGRlY29kZWRDbGFzc1BhdGggaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRW50cnlbXSkgewotCQkJCQkJcmV0dXJuIChJQ2xhc3NwYXRoRW50cnlbXSkgZGVjb2RlZENsYXNzUGF0aDsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpkdENvcmVQbHVnaW4ubG9nKGUpOwotCQkJCX0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBuZWVkcyByZWZsZWN0aW9uIHNpbmNlIHJldHVybiB0eXBlIG9mIGRlY29kZUNsYXNzcGF0aCBoYXMgY2hhbmdlZCBpbiBFY2xpcHNlIDMuNgorICAgICAgICAgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gamF2YVByb2plY3QuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImRlY29kZUNsYXNzcGF0aCIsIFN0cmluZy5jbGFzcywgTWFwLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZENsYXNzUGF0aCA9IG1ldGhvZC5pbnZva2UoamF2YVByb2plY3QsIHhtbENsYXNzcGF0aCwgbmV3IEhhc2hNYXAoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVkQ2xhc3NQYXRoIGluc3RhbmNlb2YgSUNsYXNzcGF0aEVudHJ5W11bXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGRlY29kZWRFbnRyaWVzID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElDbGFzc3BhdGhFbnRyeVtdIGVudHJ5IDogKElDbGFzc3BhdGhFbnRyeVtdW10pIGRlY29kZWRDbGFzc1BhdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkRW50cmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChlbnRyeSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZWRFbnRyaWVzLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtkZWNvZGVkRW50cmllcy5zaXplKCldKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVkQ2xhc3NQYXRoIGluc3RhbmNlb2YgSUNsYXNzcGF0aEVudHJ5W10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoSUNsYXNzcGF0aEVudHJ5W10pIGRlY29kZWRDbGFzc1BhdGg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBKZHRDb3JlUGx1Z2luLmxvZyhlKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSmR0Q29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgSmR0Q29yZVBsdWdpbi5sb2coZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2xhc3NwYXRoVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvQ2xhc3NwYXRoVXRpbHMuamF2YQppbmRleCAyZGNmNjY3Li44OGYyMWMyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL0NsYXNzcGF0aFV0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL2NvcmUvdXRpbC9DbGFzc3BhdGhVdGlscy5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtNDEsMjE0ICs0MiwyMDIgQEAKIAogLyoqCiAgKiBIZWxwZXIgbWV0aG9kcyB0byBiZSB1c2VkIHRvIHdpdGhpbiB0aGUgY2xhc3MgcGF0aCBjb250YWluZXIgaW5mcmFzdHJ1Y3R1cmUuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoVXRpbHMgewogCi0JLyoqCi0JICogQWRqdXN0cyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lc3RhbXAgb24gdGhlIHNvdXJjZSByb290IGFuZCBNRVRBLUlORiBkaXJlY3RvcnkgdG8gcmVmbGVjdCB0aGUgc2FtZSBkYXRlIGFzIHRoZQotCSAqIE1BTklGRVNULk1GLgotCSAqIDxwPgotCSAqIE5vdGU6IHRoaXMgaXMgYSByZXF1aXJlbWVudCBmb3IgdGhlIGRlcGVuZGVuY3kgcmVzb2x1dGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRqdXN0TGFzdE1vZGlmaWVkRGF0ZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGJvb2xlYW4gdGVzdEJ1bmRsZSkgewotCQlGaWxlIG1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RVdGlscy5sb2NhdGVNYW5pZmVzdEZpbGUoamF2YVByb2plY3QsIHRlc3RCdW5kbGUpOwotCQlpZiAobWFuaWZlc3QgIT0gbnVsbCAmJiBtYW5pZmVzdC5jYW5SZWFkKCkpIHsKLQkJCWxvbmcgbGFzdG1vZGlmaWVkID0gbWFuaWZlc3QubGFzdE1vZGlmaWVkKCk7Ci0JCQlGaWxlIG1ldGFJbmZGb2xkZXIgPSBtYW5pZmVzdC5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAobWV0YUluZkZvbGRlciAhPSBudWxsICYmIG1ldGFJbmZGb2xkZXIuZ2V0TmFtZSgpLmVxdWFscyhCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uTUFOSUZFU1RfRk9MREVSX05BTUUpCi0JCQkJCSYmIG1ldGFJbmZGb2xkZXIuY2FuV3JpdGUoKSkgewotCQkJCW1ldGFJbmZGb2xkZXIuc2V0TGFzdE1vZGlmaWVkKGxhc3Rtb2RpZmllZCk7Ci0JCQkJRmlsZSBzcmNGb2xkZXIgPSBtZXRhSW5mRm9sZGVyLmdldFBhcmVudEZpbGUoKTsKLQkJCQlpZiAoc3JjRm9sZGVyICE9IG51bGwgJiYgc3JjRm9sZGVyLmNhbldyaXRlKCkpIHsKLQkJCQkJc3JjRm9sZGVyLnNldExhc3RNb2RpZmllZChsYXN0bW9kaWZpZWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBBZGp1c3RzIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWVzdGFtcCBvbiB0aGUgc291cmNlIHJvb3QgYW5kIE1FVEEtSU5GIGRpcmVjdG9yeSB0byByZWZsZWN0IHRoZSBzYW1lIGRhdGUgYXMgdGhlCisgICAgICogTUFOSUZFU1QuTUYuCisgICAgICogPHA+CisgICAgICogTm90ZTogdGhpcyBpcyBhIHJlcXVpcmVtZW50IGZvciB0aGUgZGVwZW5kZW5jeSByZXNvbHV0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGp1c3RMYXN0TW9kaWZpZWREYXRlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiB0ZXN0QnVuZGxlKSB7CisgICAgICAgIEZpbGUgbWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdFV0aWxzLmxvY2F0ZU1hbmlmZXN0RmlsZShqYXZhUHJvamVjdCwgdGVzdEJ1bmRsZSk7CisgICAgICAgIGlmIChtYW5pZmVzdCAhPSBudWxsICYmIG1hbmlmZXN0LmNhblJlYWQoKSkgeworICAgICAgICAgICAgbG9uZyBsYXN0bW9kaWZpZWQgPSBtYW5pZmVzdC5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgICAgIEZpbGUgbWV0YUluZkZvbGRlciA9IG1hbmlmZXN0LmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgIGlmIChtZXRhSW5mRm9sZGVyICE9IG51bGwgJiYgbWV0YUluZkZvbGRlci5nZXROYW1lKCkuZXF1YWxzKEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5NQU5JRkVTVF9GT0xERVJfTkFNRSkgJiYgbWV0YUluZkZvbGRlci5jYW5Xcml0ZSgpKSB7CisgICAgICAgICAgICAgICAgbWV0YUluZkZvbGRlci5zZXRMYXN0TW9kaWZpZWQobGFzdG1vZGlmaWVkKTsKKyAgICAgICAgICAgICAgICBGaWxlIHNyY0ZvbGRlciA9IG1ldGFJbmZGb2xkZXIuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgICAgIGlmIChzcmNGb2xkZXIgIT0gbnVsbCAmJiBzcmNGb2xkZXIuY2FuV3JpdGUoKSkgeworICAgICAgICAgICAgICAgICAgICBzcmNGb2xkZXIuc2V0TGFzdE1vZGlmaWVkKGxhc3Rtb2RpZmllZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcHJvamVjdCBoYXMgdGhlIGJ1bmRsZSBkZXBlbmRlbmN5IGNsYXNzcGF0aCBjb250YWluZXIgaW5zdGFsbGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDbGFzc3BhdGhDb250YWluZXIoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCWJvb2xlYW4gaGFzQ29udGFpbmVyID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpKSB7Ci0JCQkJaWYgKGVudHJ5LmdldFBhdGgoKS5lcXVhbHMoU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLkNMQVNTUEFUSF9DT05UQUlORVJfUEFUSCkpIHsKLQkJCQkJaGFzQ29udGFpbmVyID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSmR0Q29yZVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIGhhc0NvbnRhaW5lcjsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcHJvamVjdCBoYXMgdGhlIGJ1bmRsZSBkZXBlbmRlbmN5IGNsYXNzcGF0aCBjb250YWluZXIgaW5zdGFsbGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDbGFzc3BhdGhDb250YWluZXIoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7CisgICAgICAgIGJvb2xlYW4gaGFzQ29udGFpbmVyID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldFBhdGgoKS5lcXVhbHMoU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLkNMQVNTUEFUSF9DT05UQUlORVJfUEFUSCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzQ29udGFpbmVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSmR0Q29yZVBsdWdpbi5sb2coZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc0NvbnRhaW5lcjsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyfSBmb3IgdGhlIGdpdmVuIDxjb2RlPmphdmFQcm9qZWN0PC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGFwcHJvcHJpYXRlIGNsYXNzIHBhdGggY29udGFpbmVyIGNvdWxkIGJlIGZvdW5kIG9uIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyIGdldENsYXNzcGF0aENvbnRhaW5lcihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWlmIChoYXNDbGFzc3BhdGhDb250YWluZXIoamF2YVByb2plY3QpKSB7Ci0JCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoCi0JCQkJCQlTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIuQ0xBU1NQQVRIX0NPTlRBSU5FUl9QQVRILCBqYXZhUHJvamVjdCk7Ci0JCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lcikgewotCQkJCQlyZXR1cm4gKFNlcnZlckNsYXNzcGF0aENvbnRhaW5lcikgY29udGFpbmVyOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpkdENvcmVQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyfSBmb3IgdGhlIGdpdmVuIDxjb2RlPmphdmFQcm9qZWN0PC9jb2RlPi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGFwcHJvcHJpYXRlIGNsYXNzIHBhdGggY29udGFpbmVyIGNvdWxkIGJlIGZvdW5kIG9uIHRoZSBnaXZlbiBwcm9qZWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyIGdldENsYXNzcGF0aENvbnRhaW5lcihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChoYXNDbGFzc3BhdGhDb250YWluZXIoamF2YVByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLkNMQVNTUEFUSF9DT05UQUlORVJfUEFUSCwgamF2YVByb2plY3QpOworICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIpIGNvbnRhaW5lcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBKZHRDb3JlUGx1Z2luLmxvZyhlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIGNvbmZpZ3VyZWQgc291cmNlIGF0dGFjaG1lbnQgcGF0aHMgZm9yIGEgZ2l2ZW4gamFyIHJlc291cmNlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBqYXZhIHByb2plY3Qgd2hpY2ggcHJlZmVyZW5jZXMgbmVlZHMgdG8gYmUgY2hlY2tlZC4KLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGphciB0aGF0IG5lZWRzIGEgc291cmNlIGF0dGFjaG1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFNvdXJjZUF0dGFjaG1lbnQoSUphdmFQcm9qZWN0IHByb2plY3QsIEZpbGUgZmlsZSkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gSmR0Q29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJU3RyaW5nIHZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KCJzb3VyY2UuYXR0YWNobWVudC0iICsgZmlsZS5nZXROYW1lKCksIG51bGwpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBQYXRoKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyBjb25maWd1cmVkIHNvdXJjZSBhdHRhY2htZW50IHBhdGhzIGZvciBhIGdpdmVuIGphciByZXNvdXJjZSBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGphdmEgcHJvamVjdCB3aGljaCBwcmVmZXJlbmNlcyBuZWVkcyB0byBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBqYXIgdGhhdCBuZWVkcyBhIHNvdXJjZSBhdHRhY2htZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJUGF0aCBnZXRTb3VyY2VBdHRhY2htZW50KElKYXZhUHJvamVjdCBwcm9qZWN0LCBGaWxlIGZpbGUpIHsKKyAgICAgICAgSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEpkdENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0LmdldFByb2plY3QoKSk7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByZWZlcmVuY2VzLmdldCgic291cmNlLmF0dGFjaG1lbnQtIiArIGZpbGUuZ2V0TmFtZSgpLCBudWxsKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGF0aCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogU3RvcmVzIHRoZSBjb25maWd1cmVkIHNvdXJjZSBhdHRhY2htZW50cyBwYXRocyBpbiB0aGUgcHJvamVjdHMgc2V0dGluZ3MgYXJlYS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIGphdmEgcHJvamVjdCB0byBzdG9yZSB0aGUgcHJlZmVyZW5jZXMgZm9yCi0JICogQHBhcmFtIGNvbnRhaW5lclN1Z2dlc3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBjb25maWd1cmVkIGNsYXNzcGF0aCBjb250YWluZXIgZW50cmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdG9yZVNvdXJjZUF0dGFjaG1lbnRzKElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lclN1Z2dlc3Rpb24pIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEpkdENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogY29udGFpbmVyU3VnZ2VzdGlvbi5nZXRDbGFzc3BhdGhFbnRyaWVzKCkpIHsKLQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQlJUGF0aCBzb3VyY2VQYXRoID0gZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKTsKLQkJCWlmIChzb3VyY2VQYXRoICE9IG51bGwpIHsKLQkJCQlwcmVmZXJlbmNlcy5wdXQoInNvdXJjZS5hdHRhY2htZW50LSIgKyBwYXRoLmxhc3RTZWdtZW50KCkudG9TdHJpbmcoKSwgc291cmNlUGF0aC50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBTdG9yZXMgdGhlIGNvbmZpZ3VyZWQgc291cmNlIGF0dGFjaG1lbnRzIHBhdGhzIGluIHRoZSBwcm9qZWN0cyBzZXR0aW5ncyBhcmVhLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGphdmEgcHJvamVjdCB0byBzdG9yZSB0aGUgcHJlZmVyZW5jZXMgZm9yCisgICAgICogQHBhcmFtIGNvbnRhaW5lclN1Z2dlc3Rpb24gdGhlIGNvbmZpZ3VyZWQgY2xhc3NwYXRoIGNvbnRhaW5lciBlbnRyaWVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHN0b3JlU291cmNlQXR0YWNobWVudHMoSUphdmFQcm9qZWN0IHByb2plY3QsIElDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyU3VnZ2VzdGlvbikgeworICAgICAgICBJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gSmR0Q29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBjb250YWluZXJTdWdnZXN0aW9uLmdldENsYXNzcGF0aEVudHJpZXMoKSkgeworICAgICAgICAgICAgSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKKyAgICAgICAgICAgIElQYXRoIHNvdXJjZVBhdGggPSBlbnRyeS5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOworICAgICAgICAgICAgaWYgKHNvdXJjZVBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByZWZlcmVuY2VzLnB1dCgic291cmNlLmF0dGFjaG1lbnQtIiArIHBhdGgubGFzdFNlZ21lbnQoKS50b1N0cmluZygpLCBzb3VyY2VQYXRoLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgY2xhc3MgcGF0aCBjb250YWluZXIgb24gdGhlIGdpdmVuIDxjb2RlPmphdmFQcm9qZWN0PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwKLQkJCVNldDxJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lci5UeXBlPiB0eXBlcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7CisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgY2xhc3MgcGF0aCBjb250YWluZXIgb24gdGhlIGdpdmVuIDxjb2RlPmphdmFQcm9qZWN0PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIElTdGF0dXMgdXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU2V0PElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyLlR5cGU+IHR5cGVzLAorICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKyAgICAgICAgdHJ5IHsKIAotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQorICAgICAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOworICAgICAgICAgICAgfQogCi0JCQkvLyBvbmx5IHVwZGF0ZSBpZiBzb21ldGhpbmcgcmVsZXZhbnQgaGFwcGVuZWQKLQkJCWlmICh0eXBlcy5jb250YWlucyhJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lci5UeXBlLklNUE9SVF9CVU5ETEUpCi0JCQkJCXx8IHR5cGVzLmNvbnRhaW5zKElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyLlR5cGUuSU1QT1JUX0xJQlJBUlkpCi0JCQkJCXx8IHR5cGVzLmNvbnRhaW5zKElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyLlR5cGUuSU1QT1JUX1BBQ0tBR0UpCi0JCQkJCXx8IHR5cGVzLmNvbnRhaW5zKElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyLlR5cGUuUkVRVUlSRV9CVU5ETEUpKSB7CisgICAgICAgICAgICAvLyBvbmx5IHVwZGF0ZSBpZiBzb21ldGhpbmcgcmVsZXZhbnQgaGFwcGVuZWQKKyAgICAgICAgICAgIGlmICh0eXBlcy5jb250YWlucyhJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lci5UeXBlLklNUE9SVF9CVU5ETEUpIHx8IHR5cGVzLmNvbnRhaW5zKElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyLlR5cGUuSU1QT1JUX0xJQlJBUlkpCisgICAgICAgICAgICAgICAgfHwgdHlwZXMuY29udGFpbnMoSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuVHlwZS5JTVBPUlRfUEFDS0FHRSkKKyAgICAgICAgICAgICAgICB8fCB0eXBlcy5jb250YWlucyhJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lci5UeXBlLlJFUVVJUkVfQlVORExFKSkgewogCi0JCQkJSUNsYXNzcGF0aENvbnRhaW5lciBvbGRDb250YWluZXIgPSBDbGFzc3BhdGhVdGlscy5nZXRDbGFzc3BhdGhDb250YWluZXIoamF2YVByb2plY3QpOwotCQkJCWlmIChvbGRDb250YWluZXIgIT0gbnVsbCkgewotCQkJCQlTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gbmV3IFNlcnZlckNsYXNzcGF0aENvbnRhaW5lcihqYXZhUHJvamVjdCk7CisgICAgICAgICAgICAgICAgSUNsYXNzcGF0aENvbnRhaW5lciBvbGRDb250YWluZXIgPSBDbGFzc3BhdGhVdGlscy5nZXRDbGFzc3BhdGhDb250YWluZXIoamF2YVByb2plY3QpOworICAgICAgICAgICAgICAgIGlmIChvbGRDb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gbmV3IFNlcnZlckNsYXNzcGF0aENvbnRhaW5lcihqYXZhUHJvamVjdCk7CiAKLQkJCQkJY29udGFpbmVyLnJlZnJlc2hDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQkJCWlmICghQXJyYXlzLmRlZXBFcXVhbHMob2xkQ29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKSwgY29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKSkpIHsKLQkJCQkJCUphdmFDb3JlLnNldENsYXNzcGF0aENvbnRhaW5lcihTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIuQ0xBU1NQQVRIX0NPTlRBSU5FUl9QQVRILAotCQkJCQkJCQluZXcgSUphdmFQcm9qZWN0W10geyBqYXZhUHJvamVjdCB9LCBuZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdIHsgY29udGFpbmVyIH0sIG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgICAgICAgICBjb250YWluZXIucmVmcmVzaENsYXNzcGF0aEVudHJpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZGVlcEVxdWFscyhvbGRDb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpLCBjb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgSmF2YUNvcmUuc2V0Q2xhc3NwYXRoQ29udGFpbmVyKFNlcnZlckNsYXNzcGF0aENvbnRhaW5lci5DTEFTU1BBVEhfQ09OVEFJTkVSX1BBVEgsIG5ldyBJSmF2YVByb2plY3RbXSB7IGphdmFQcm9qZWN0IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7IGNvbnRhaW5lciB9LCBtb25pdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJaWYgKHR5cGVzLmNvbnRhaW5zKElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyLlR5cGUuRVhQT1JUX1BBQ0tBR0UpKSB7Ci0JCQkJLy8gQWx3YXlzIHRyeSB0byB1cGRhdGUgdGhlIGRlcGVuZGluZyBwcm9qZWN0cyBiZWNhdXNlIE1BTklGRVNUIG1pZ2h0IGhhdmUgY2hhbmdlZAotCQkJCS8vIHdpdGhvdXQgY2hhbmdlcyB0byB0aGUgcHJvamVjdCdzIG93biBjbGFzcyBwYXRoCi0JCQkJdXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyRm9yRGVwZW5kaW5nQnVuZGxlcyhqYXZhUHJvamVjdCk7Ci0JCQl9CisgICAgICAgICAgICBpZiAodHlwZXMuY29udGFpbnMoSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuVHlwZS5FWFBPUlRfUEFDS0FHRSkpIHsKKyAgICAgICAgICAgICAgICAvLyBBbHdheXMgdHJ5IHRvIHVwZGF0ZSB0aGUgZGVwZW5kaW5nIHByb2plY3RzIGJlY2F1c2UgTUFOSUZFU1QgbWlnaHQgaGF2ZSBjaGFuZ2VkCisgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBjaGFuZ2VzIHRvIHRoZSBwcm9qZWN0J3Mgb3duIGNsYXNzIHBhdGgKKyAgICAgICAgICAgICAgICB1cGRhdGVDbGFzc3BhdGhDb250YWluZXJGb3JEZXBlbmRpbmdCdW5kbGVzKGphdmFQcm9qZWN0KTsKKyAgICAgICAgICAgIH0KIAotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSmR0Q29yZVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQorICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSmR0Q29yZVBsdWdpbi5sb2coZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisgICAgfQogCi0JLyoqCi0JICogVHJpZ2dlcnMgYW4gY2xhc3MgcGF0aCBjb250YWluZXIgdXBkYXRlIG9uIGRlcGVuZGluZyB7QGxpbmsgSUphdmFQcm9qZWN0fXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVDbGFzc3BhdGhDb250YWluZXJGb3JEZXBlbmRpbmdCdW5kbGVzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgeworICAgIC8qKgorICAgICAqIFRyaWdnZXJzIGFuIGNsYXNzIHBhdGggY29udGFpbmVyIHVwZGF0ZSBvbiBkZXBlbmRpbmcge0BsaW5rIElKYXZhUHJvamVjdH1zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyRm9yRGVwZW5kaW5nQnVuZGxlcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKIAotCQlCdW5kbGVNYW5pZmVzdCB1cGRhdGVkQnVuZGxlTWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0QnVuZGxlTWFuaWZlc3QoCi0JCQkJamF2YVByb2plY3QpOwotCQlTZXQ8U3RyaW5nPiB1cGRhdGVkUGFja2FnZUV4cG9ydHMgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0UGFja2FnZUV4cG9ydHMoCi0JCQkJamF2YVByb2plY3QpOworICAgICAgICBCdW5kbGVNYW5pZmVzdCB1cGRhdGVkQnVuZGxlTWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0QnVuZGxlTWFuaWZlc3QoamF2YVByb2plY3QpOworICAgICAgICBTZXQ8U3RyaW5nPiB1cGRhdGVkUGFja2FnZUV4cG9ydHMgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0UGFja2FnZUV4cG9ydHMoamF2YVByb2plY3QpOwogCi0JCWlmICh1cGRhdGVkQnVuZGxlTWFuaWZlc3QgIT0gbnVsbCAmJiB1cGRhdGVkQnVuZGxlTWFuaWZlc3QuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGJ1bmRsZVN5bWJvbGljTmFtZSA9IHVwZGF0ZWRCdW5kbGVNYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCWZvciAoSVByb2plY3QgcHJvamVjdCA6IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSkgewotCQkJCXRyeSB7CisgICAgICAgIGlmICh1cGRhdGVkQnVuZGxlTWFuaWZlc3QgIT0gbnVsbCAmJiB1cGRhdGVkQnVuZGxlTWFuaWZlc3QuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGJ1bmRsZVN5bWJvbGljTmFtZSA9IHVwZGF0ZWRCdW5kbGVNYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKS5nZXRTeW1ib2xpY05hbWUoKTsKKyAgICAgICAgICAgIGZvciAoSVByb2plY3QgcHJvamVjdCA6IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CiAKLQkJCQkJLy8gT25seSBkbSBzZXJ2ZXIgYnVuZGxlIHByb2plY3RzIGFyZSBvZiBpbnRlcmVzdAotCQkJCQlpZiAoIWphdmFQcm9qZWN0LmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkgJiYgRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gT25seSBkbSBzZXJ2ZXIgYnVuZGxlIHByb2plY3RzIGFyZSBvZiBpbnRlcmVzdAorICAgICAgICAgICAgICAgICAgICBpZiAoIWphdmFQcm9qZWN0LmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkgJiYgRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkpIHsKIAotCQkJCQkJSUphdmFQcm9qZWN0IGpwID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCQkJQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkKLQkJCQkJCQkJLmdldEJ1bmRsZU1hbmlmZXN0KGpwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIElKYXZhUHJvamVjdCBqcCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmdldEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpLmdldEJ1bmRsZU1hbmlmZXN0KGpwKTsKIAotCQkJCQkJYm9vbGVhbiByZWZyZXNoQ2xhc3NwYXRoID0gZmFsc2U7Ci0JCQkJCQlpZiAobWFuaWZlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZWZyZXNoQ2xhc3NwYXRoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCkgewogCi0JCQkJCQkJLy8gQ2hlY2sgZm9yIFJlcXVpcmUtQnVuZGxlIGRlcGVuZGVuY3kKLQkJCQkJCQlpZiAobWFuaWZlc3QuZ2V0UmVxdWlyZUJ1bmRsZSgpICE9IG51bGwpIHsKLQkJCQkJCQkJZm9yIChSZXF1aXJlZEJ1bmRsZSByZXF1aXJlZEJ1bmRsZSA6IG1hbmlmZXN0LmdldFJlcXVpcmVCdW5kbGUoKS5nZXRSZXF1aXJlZEJ1bmRsZXMoKSkgewotCQkJCQkJCQkJaWYgKGJ1bmRsZVN5bWJvbGljTmFtZSAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIGJ1bmRsZVN5bWJvbGljTmFtZS5lcXVhbHMocmVxdWlyZWRCdW5kbGUuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkpKSB7Ci0JCQkJCQkJCQkJcmVmcmVzaENsYXNzcGF0aCA9IHRydWU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIFJlcXVpcmUtQnVuZGxlIGRlcGVuZGVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3QuZ2V0UmVxdWlyZUJ1bmRsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSZXF1aXJlZEJ1bmRsZSByZXF1aXJlZEJ1bmRsZSA6IG1hbmlmZXN0LmdldFJlcXVpcmVCdW5kbGUoKS5nZXRSZXF1aXJlZEJ1bmRsZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZVN5bWJvbGljTmFtZSAhPSBudWxsICYmIGJ1bmRsZVN5bWJvbGljTmFtZS5lcXVhbHMocmVxdWlyZWRCdW5kbGUuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaENsYXNzcGF0aCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJCQkvLyBDaGVjayBmb3IgZXhwb3J0IC0+IGltcG9ydCBwYWNrYWdlIGRlcGVuZGVuY3kKLQkJCQkJCQlpZiAobWFuaWZlc3QuZ2V0SW1wb3J0UGFja2FnZSgpICE9IG51bGwpIHsKLQkJCQkJCQkJZm9yIChJbXBvcnRlZFBhY2thZ2UgcGFja2FnZUltcG9ydCA6IG1hbmlmZXN0LmdldEltcG9ydFBhY2thZ2UoKS5nZXRJbXBvcnRlZFBhY2thZ2VzKCkpIHsKLQkJCQkJCQkJCWlmICh1cGRhdGVkUGFja2FnZUV4cG9ydHMuY29udGFpbnMocGFja2FnZUltcG9ydC5nZXRQYWNrYWdlTmFtZSgpKSkgewotCQkJCQkJCQkJCXJlZnJlc2hDbGFzc3BhdGggPSB0cnVlOwotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHBvcnQgLT4gaW1wb3J0IHBhY2thZ2UgZGVwZW5kZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYW5pZmVzdC5nZXRJbXBvcnRQYWNrYWdlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEltcG9ydGVkUGFja2FnZSBwYWNrYWdlSW1wb3J0IDogbWFuaWZlc3QuZ2V0SW1wb3J0UGFja2FnZSgpLmdldEltcG9ydGVkUGFja2FnZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWRQYWNrYWdlRXhwb3J0cy5jb250YWlucyhwYWNrYWdlSW1wb3J0LmdldFBhY2thZ2VOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaENsYXNzcGF0aCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJCQkvLyBDaGVjayBmb3IgZXhwbGljaXQgcHJvamVjdCBkZXBlbmRlbmNpZXMKLQkJCQkJCQlmb3IgKFN0cmluZyByZXF1aXJlZFByb2plY3ROYW1lIDoganAuZ2V0UmVxdWlyZWRQcm9qZWN0TmFtZXMoKSkgewotCQkJCQkJCQlpZiAocmVxdWlyZWRQcm9qZWN0TmFtZS5lcXVhbHMoamF2YVByb2plY3QuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCQkJCQkJCXJlZnJlc2hDbGFzc3BhdGggPSB0cnVlOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGV4cGxpY2l0IHByb2plY3QgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcmVxdWlyZWRQcm9qZWN0TmFtZSA6IGpwLmdldFJlcXVpcmVkUHJvamVjdE5hbWVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkUHJvamVjdE5hbWUuZXF1YWxzKGphdmFQcm9qZWN0LmdldEVsZW1lbnROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoQ2xhc3NwYXRoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCQkJLy8gU2NoZWR1bGUgY2xhc3MgcGF0aCBjb250YWluZXIgdXBkYXRlCi0JCQkJCQkJaWYgKHJlZnJlc2hDbGFzc3BhdGgpIHsKLQkJCQkJCQkJU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iLnNjaGVkdWxlQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iKGpwLAotCQkJCQkJCQkJCUJ1bmRsZU1hbmlmZXN0TWFuYWdlci5JTVBPUlRTX0NIQU5HRUQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpkdENvcmVQbHVnaW4ubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZSBjbGFzcyBwYXRoIGNvbnRhaW5lciB1cGRhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmcmVzaENsYXNzcGF0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2Iuc2NoZWR1bGVDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2IoanAsIEJ1bmRsZU1hbmlmZXN0TWFuYWdlci5JTVBPUlRTX0NIQU5HRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIEpkdENvcmVQbHVnaW4ubG9nKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTWFya2VyQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL01hcmtlckNvbnN0YW50cy5qYXZhCmluZGV4IGNjMWM0YTYuLmY5YjJkMGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTWFya2VyQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL2NvcmUvdXRpbC9NYXJrZXJDb25zdGFudHMuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmludGVybmFsLmNvcmUudXRpbDsKIAogLyoqCkBAIC0xNSwxOCArMTYsMTggQEAKICAqLwogcHVibGljIGludGVyZmFjZSBNYXJrZXJDb25zdGFudHMgewogCi0JU3RyaW5nIE1JU1NJTkdfREVQRU5ERU5DWV9LRVkgPSAibWlzc2luZ19kZXBlbmRlbmN5X2tleSI7CisgICAgU3RyaW5nIE1JU1NJTkdfREVQRU5ERU5DWV9LRVkgPSAibWlzc2luZ19kZXBlbmRlbmN5X2tleSI7CiAKLQlTdHJpbmcgTUlTU0lOR19ERVBFTkRFTkNZX1ZFUlNJT05fS0VZID0gIm1pc3NpbmdfZGVwZW5kZW5jeV92ZXJzaW9uX2tleSI7CisgICAgU3RyaW5nIE1JU1NJTkdfREVQRU5ERU5DWV9WRVJTSU9OX0tFWSA9ICJtaXNzaW5nX2RlcGVuZGVuY3lfdmVyc2lvbl9rZXkiOwogCi0JU3RyaW5nIE1JU1NJTkdfREVQRU5ERU5DWV9LSU5EX0tFWSA9ICJtaXNzaW5nX2RlcGVuZGVuY3lfa2luZF9rZXkiOworICAgIFN0cmluZyBNSVNTSU5HX0RFUEVOREVOQ1lfS0lORF9LRVkgPSAibWlzc2luZ19kZXBlbmRlbmN5X2tpbmRfa2V5IjsKIAotCVN0cmluZyBNSVNTSU5HX0RFUEVOREVOQ1lfS0lORF9SRVFVSVJFX0JVTkRMRSA9ICJtaXNzaW5nX2RlcGVuZGVuY3lfcmVxdWlyZV9idW5kbGUiOworICAgIFN0cmluZyBNSVNTSU5HX0RFUEVOREVOQ1lfS0lORF9SRVFVSVJFX0JVTkRMRSA9ICJtaXNzaW5nX2RlcGVuZGVuY3lfcmVxdWlyZV9idW5kbGUiOwogCi0JU3RyaW5nIE1JU1NJTkdfREVQRU5ERU5DWV9LSU5EX0lNUE9SVF9CVU5ETEUgPSAibWlzc2luZ19kZXBlbmRlbmN5X2ltcG9ydF9idW5kbGUiOworICAgIFN0cmluZyBNSVNTSU5HX0RFUEVOREVOQ1lfS0lORF9JTVBPUlRfQlVORExFID0gIm1pc3NpbmdfZGVwZW5kZW5jeV9pbXBvcnRfYnVuZGxlIjsKIAotCVN0cmluZyBNSVNTSU5HX0RFUEVOREVOQ1lfS0lORF9JTVBPUlRfTElCUkFSWSA9ICJtaXNzaW5nX2RlcGVuZGVuY3lfaW1wb3J0X2xpYnJhcnkiOworICAgIFN0cmluZyBNSVNTSU5HX0RFUEVOREVOQ1lfS0lORF9JTVBPUlRfTElCUkFSWSA9ICJtaXNzaW5nX2RlcGVuZGVuY3lfaW1wb3J0X2xpYnJhcnkiOwogCi0JU3RyaW5nIE1JU1NJTkdfREVQRU5ERU5DWV9LSU5EX0lNUE9SVF9QQUNLQUdFID0gIm1pc3NpbmdfZGVwZW5kZW5jeV9pbXBvcnRfcGFja2FnZSI7CisgICAgU3RyaW5nIE1JU1NJTkdfREVQRU5ERU5DWV9LSU5EX0lNUE9SVF9QQUNLQUdFID0gIm1pc3NpbmdfZGVwZW5kZW5jeV9pbXBvcnRfcGFja2FnZSI7CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTWFya2VyVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC9jb3JlL3V0aWwvTWFya2VyVXRpbHMuamF2YQppbmRleCA0YTY0NzBkLi5hMmNiZDE3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvY29yZS91dGlsL01hcmtlclV0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL2NvcmUvdXRpbC9NYXJrZXJVdGlscy5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuaW50ZXJuYWwuY29yZS51dGlsOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC0zMywxNzYgKzM0LDE0NSBAQAogCiAvKioKICAqIEhlbHBlciBjbGFzcyB0aGF0IGhhbmRsZXMgY3JlYXRpb24gYW5kIGRlbGV0aW9uIG9mIHtAbGluayBJTWFya2VyfSBpbnN0YW5jZXMuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgTWFya2VyVXRpbHMgewogCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgYnVuZGxlIHJlc29sdXRpb24gZXJyb3IgbWFya2VycyBmcm9tIGEgZ2l2ZW4gPGNvZGU+amF2YVByb2plY3Q8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVFcnJvck1hcmtlcnMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBib29sZWFuIHRlc3RCdW5kbGUpIHsKLQkJSVJlc291cmNlIG1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RVdGlscy5sb2NhdGVNYW5pZmVzdChqYXZhUHJvamVjdCwgdGVzdEJ1bmRsZSk7Ci0JCXRyeSB7Ci0JCQltYW5pZmVzdC5kZWxldGVNYXJrZXJzKEpkdENvcmVQbHVnaW4uREVQRU5ERU5DWV9QUk9CTEVNX01BUktFUl9JRCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoZSwgSmR0Q29yZVBsdWdpbi5QTFVHSU5fSUQpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIGJ1bmRsZSByZXNvbHV0aW9uIGVycm9yIG1hcmtlcnMgZnJvbSBhIGdpdmVuIDxjb2RlPmphdmFQcm9qZWN0PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRXJyb3JNYXJrZXJzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiB0ZXN0QnVuZGxlKSB7CisgICAgICAgIElSZXNvdXJjZSBtYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0VXRpbHMubG9jYXRlTWFuaWZlc3QoamF2YVByb2plY3QsIHRlc3RCdW5kbGUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFuaWZlc3QuZGVsZXRlTWFya2VycyhKZHRDb3JlUGx1Z2luLkRFUEVOREVOQ1lfUFJPQkxFTV9NQVJLRVJfSUQsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7CisgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKGUsIEpkdENvcmVQbHVnaW4uUExVR0lOX0lEKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIENyZWF0ZXMgYnVuZGxlIHJlc29sdXRpb24gZGVwZW5kZW5jeSBlcnJvciBiYXNlZCBvbiB0aGUgcmVzb2x1dGlvbiByZXN1bHRzIHN0b3JlZCBpbiB0aGUKLQkgKiB7QGxpbmsgRGVwZW5kZW5jeUxvY2F0aW9uRXhjZXB0aW9ufS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlRXJyb3JNYXJrZXJzKGZpbmFsIERlcGVuZGVuY3lMb2NhdGlvbkV4Y2VwdGlvbiBlLCBmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsCi0JCQlmaW5hbCBib29sZWFuIHRlc3RCdW5kbGUpIHsKLQkJZmluYWwgSVJlc291cmNlIG1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RVdGlscy5sb2NhdGVNYW5pZmVzdChqYXZhUHJvamVjdCwgdGVzdEJ1bmRsZSk7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBidW5kbGUgcmVzb2x1dGlvbiBkZXBlbmRlbmN5IGVycm9yIGJhc2VkIG9uIHRoZSByZXNvbHV0aW9uIHJlc3VsdHMgc3RvcmVkIGluIHRoZQorICAgICAqIHtAbGluayBEZXBlbmRlbmN5TG9jYXRpb25FeGNlcHRpb259LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVFcnJvck1hcmtlcnMoZmluYWwgRGVwZW5kZW5jeUxvY2F0aW9uRXhjZXB0aW9uIGUsIGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgZmluYWwgYm9vbGVhbiB0ZXN0QnVuZGxlKSB7CisgICAgICAgIGZpbmFsIElSZXNvdXJjZSBtYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0VXRpbHMubG9jYXRlTWFuaWZlc3QoamF2YVByb2plY3QsIHRlc3RCdW5kbGUpOwogCi0JCS8vIFNvbWUgc2FuaXR5IGNoZWNrIGluIGNhc2UgdGhpcyBlcnJvciBpcyByZXBvcnRlZCB0b28gZWFybHkKLQkJaWYgKG1hbmlmZXN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQorICAgICAgICAvLyBTb21lIHNhbml0eSBjaGVjayBpbiBjYXNlIHRoaXMgZXJyb3IgaXMgcmVwb3J0ZWQgdG9vIGVhcmx5CisgICAgICAgIGlmIChtYW5pZmVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotCQlmaW5hbCBCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCA9IG5ldyBCdW5kbGVNYW5pZmVzdCgoSUZpbGUpIG1hbmlmZXN0KTsKLQkJZmluYWwgSURvY3VtZW50IGRvY3VtZW50ID0gYnVuZGxlTWFuaWZlc3QuZ2V0RG9jdW1lbnQoKTsKKyAgICAgICAgZmluYWwgQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QgPSBuZXcgQnVuZGxlTWFuaWZlc3QoKElGaWxlKSBtYW5pZmVzdCk7CisgICAgICAgIGZpbmFsIElEb2N1bWVudCBkb2N1bWVudCA9IGJ1bmRsZU1hbmlmZXN0LmdldERvY3VtZW50KCk7CiAKLQkJLy8gU2NoZWR1bGUgbWFya2VyIGNyZWF0aW9uIGluIGRpZmZlcmVudCBqb2IgYXMgaXQgcmVxdWlyZXMgd29ya3NwYWNlIGxvY2sKLQkJSm9iIG1hcmtlckNyZWF0aW9uSm9iID0gbmV3IEpvYigiTWFuYWdpbmcgbWFya2VycyBvbiByZXNvdXJjZSAnIiArIG1hbmlmZXN0LmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICInIikgeworICAgICAgICAvLyBTY2hlZHVsZSBtYXJrZXIgY3JlYXRpb24gaW4gZGlmZmVyZW50IGpvYiBhcyBpdCByZXF1aXJlcyB3b3Jrc3BhY2UgbG9jaworICAgICAgICBKb2IgbWFya2VyQ3JlYXRpb25Kb2IgPSBuZXcgSm9iKCJNYW5hZ2luZyBtYXJrZXJzIG9uIHJlc291cmNlICciICsgbWFuaWZlc3QuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpICsgIiciKSB7CiAKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAKLQkJCQkvLyBDbGVhciBvdXQgb2xkIGVycm9yIG1hcmtlcnMKLQkJCQlyZW1vdmVFcnJvck1hcmtlcnMoamF2YVByb2plY3QsIHRlc3RCdW5kbGUpOworICAgICAgICAgICAgICAgIC8vIENsZWFyIG91dCBvbGQgZXJyb3IgbWFya2VycworICAgICAgICAgICAgICAgIHJlbW92ZUVycm9yTWFya2VycyhqYXZhUHJvamVjdCwgdGVzdEJ1bmRsZSk7CiAKLQkJCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KKyAgICAgICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgICAgICAgICAgICAgIH0KIAotCQkJCWlmIChlLmdldFVuc2F0aXNmaWFibGVQYWNrYWdlSW1wb3J0cygpICE9IG51bGwpIHsKLQkJCQkJZm9yIChJbXBvcnREZXNjcmlwdG9yIGRlc2MgOiBlLmdldFVuc2F0aXNmaWFibGVQYWNrYWdlSW1wb3J0cygpKSB7Ci0JCQkJCQlpbnQgbGluZU51bWJlciA9IEJ1bmRsZU1hbmlmZXN0VXRpbHMuZ2V0TGluZU51bWJlcihkb2N1bWVudCwKLQkJCQkJCQkJYnVuZGxlTWFuaWZlc3QuZ2V0SGVhZGVyKCJJbXBvcnQtUGFja2FnZSIpLCBkZXNjLmdldE5hbWUoKSk7Ci0JCQkJCQljcmVhdGVQcm9ibGVtTWFya2VyKAotCQkJCQkJCQltYW5pZmVzdCwKLQkJCQkJCQkJTWFya2VyQ29uc3RhbnRzLk1JU1NJTkdfREVQRU5ERU5DWV9LSU5EX0lNUE9SVF9QQUNLQUdFLAotCQkJCQkJCQlkZXNjLmdldE5hbWUoKSwKLQkJCQkJCQkJZGVzYy5nZXRQYXJzZVZlcnNpb24oKSwKLQkJCQkJCQkJbmV3IFN0cmluZ0J1aWxkZXIoIkltcG9ydC1QYWNrYWdlOiAiKS5hcHBlbmQoZGVzYy5nZXROYW1lKCkpCi0JCQkJCQkJCQkJLmFwcGVuZCgiICIpCi0JCQkJCQkJCQkJLmFwcGVuZChkZXNjLmdldFZlcnNpb24oKSkKLQkJCQkJCQkJCQkuYXBwZW5kKCIgY291bGQgbm90IGJlIHJlc29sdmVkIikKLQkJCQkJCQkJCQkudG9TdHJpbmcoKSwgbGluZU51bWJlciwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGUuZ2V0VW5zYXRpc2ZpYWJsZUxpYnJhcnlJbXBvcnRzKCkgIT0gbnVsbCkgewotCQkJCQlmb3IgKEltcG9ydERlc2NyaXB0b3IgZGVzYyA6IGUuZ2V0VW5zYXRpc2ZpYWJsZUxpYnJhcnlJbXBvcnRzKCkpIHsKLQkJCQkJCWludCBsaW5lTnVtYmVyID0gQnVuZGxlTWFuaWZlc3RVdGlscy5nZXRMaW5lTnVtYmVyKGRvY3VtZW50LAotCQkJCQkJCQlidW5kbGVNYW5pZmVzdC5nZXRIZWFkZXIoIkltcG9ydC1MaWJyYXJ5IiksIGRlc2MuZ2V0TmFtZSgpKTsKLQkJCQkJCWNyZWF0ZVByb2JsZW1NYXJrZXIoCi0JCQkJCQkJCW1hbmlmZXN0LAotCQkJCQkJCQlNYXJrZXJDb25zdGFudHMuTUlTU0lOR19ERVBFTkRFTkNZX0tJTkRfSU1QT1JUX0xJQlJBUlksCi0JCQkJCQkJCWRlc2MuZ2V0TmFtZSgpLAotCQkJCQkJCQlkZXNjLmdldFBhcnNlVmVyc2lvbigpLAotCQkJCQkJCQluZXcgU3RyaW5nQnVpbGRlcigiSW1wb3J0LUxpYnJhcnk6ICIpLmFwcGVuZChkZXNjLmdldE5hbWUoKSkKLQkJCQkJCQkJCQkuYXBwZW5kKCIgIikKLQkJCQkJCQkJCQkuYXBwZW5kKGRlc2MuZ2V0VmVyc2lvbigpKQotCQkJCQkJCQkJCS5hcHBlbmQoIiBjb3VsZCBub3QgYmUgcmVzb2x2ZWQiKQotCQkJCQkJCQkJCS50b1N0cmluZygpLCBsaW5lTnVtYmVyLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZS5nZXRVbnNhdGlzZmlhYmxlUmVxdWlyZUJ1bmRsZSgpICE9IG51bGwpIHsKLQkJCQkJZm9yIChJbXBvcnREZXNjcmlwdG9yIGRlc2MgOiBlLmdldFVuc2F0aXNmaWFibGVSZXF1aXJlQnVuZGxlKCkpIHsKLQkJCQkJCWludCBsaW5lTnVtYmVyID0gQnVuZGxlTWFuaWZlc3RVdGlscy5nZXRMaW5lTnVtYmVyKGRvY3VtZW50LAotCQkJCQkJCQlidW5kbGVNYW5pZmVzdC5nZXRIZWFkZXIoIlJlcXVpcmUtQnVuZGxlIiksIGRlc2MuZ2V0TmFtZSgpKTsKLQkJCQkJCWNyZWF0ZVByb2JsZW1NYXJrZXIoCi0JCQkJCQkJCW1hbmlmZXN0LAotCQkJCQkJCQlNYXJrZXJDb25zdGFudHMuTUlTU0lOR19ERVBFTkRFTkNZX0tJTkRfUkVRVUlSRV9CVU5ETEUsCi0JCQkJCQkJCWRlc2MuZ2V0TmFtZSgpLAotCQkJCQkJCQlkZXNjLmdldFBhcnNlVmVyc2lvbigpLAotCQkJCQkJCQluZXcgU3RyaW5nQnVpbGRlcigiUmVxdWlyZS1CdW5kbGU6ICIpLmFwcGVuZChkZXNjLmdldE5hbWUoKSkKLQkJCQkJCQkJCQkuYXBwZW5kKCIgIikKLQkJCQkJCQkJCQkuYXBwZW5kKGRlc2MuZ2V0VmVyc2lvbigpKQotCQkJCQkJCQkJCS5hcHBlbmQoIiBjb3VsZCBub3QgYmUgcmVzb2x2ZWQiKQotCQkJCQkJCQkJCS50b1N0cmluZygpLCBsaW5lTnVtYmVyLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZS5nZXRVbnNhdGlzZmlhYmxlQnVuZGxlSW1wb3J0cygpICE9IG51bGwpIHsKLQkJCQkJZm9yIChJbXBvcnREZXNjcmlwdG9yIGRlc2MgOiBlLmdldFVuc2F0aXNmaWFibGVCdW5kbGVJbXBvcnRzKCkpIHsKLQkJCQkJCWludCBsaW5lTnVtYmVyID0gQnVuZGxlTWFuaWZlc3RVdGlscy5nZXRMaW5lTnVtYmVyKGRvY3VtZW50LAotCQkJCQkJCQlidW5kbGVNYW5pZmVzdC5nZXRIZWFkZXIoIkltcG9ydC1CdW5kbGUiKSwgZGVzYy5nZXROYW1lKCkpOwotCQkJCQkJY3JlYXRlUHJvYmxlbU1hcmtlcigKLQkJCQkJCQkJbWFuaWZlc3QsCi0JCQkJCQkJCU1hcmtlckNvbnN0YW50cy5NSVNTSU5HX0RFUEVOREVOQ1lfS0lORF9JTVBPUlRfQlVORExFLAotCQkJCQkJCQlkZXNjLmdldE5hbWUoKSwKLQkJCQkJCQkJZGVzYy5nZXRQYXJzZVZlcnNpb24oKSwKLQkJCQkJCQkJbmV3IFN0cmluZ0J1aWxkZXIoIkltcG9ydC1CdW5kbGU6ICIpLmFwcGVuZChkZXNjLmdldE5hbWUoKSkKLQkJCQkJCQkJCQkuYXBwZW5kKCIgIikKLQkJCQkJCQkJCQkuYXBwZW5kKGRlc2MuZ2V0VmVyc2lvbigpKQotCQkJCQkJCQkJCS5hcHBlbmQoIiBjb3VsZCBub3QgYmUgcmVzb2x2ZWQiKQotCQkJCQkJCQkJCS50b1N0cmluZygpLCBsaW5lTnVtYmVyLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KKyAgICAgICAgICAgICAgICBpZiAoZS5nZXRVbnNhdGlzZmlhYmxlUGFja2FnZUltcG9ydHMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSW1wb3J0RGVzY3JpcHRvciBkZXNjIDogZS5nZXRVbnNhdGlzZmlhYmxlUGFja2FnZUltcG9ydHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIgPSBCdW5kbGVNYW5pZmVzdFV0aWxzLmdldExpbmVOdW1iZXIoZG9jdW1lbnQsIGJ1bmRsZU1hbmlmZXN0LmdldEhlYWRlcigiSW1wb3J0LVBhY2thZ2UiKSwgZGVzYy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUHJvYmxlbU1hcmtlcihtYW5pZmVzdCwgTWFya2VyQ29uc3RhbnRzLk1JU1NJTkdfREVQRU5ERU5DWV9LSU5EX0lNUE9SVF9QQUNLQUdFLCBkZXNjLmdldE5hbWUoKSwgZGVzYy5nZXRQYXJzZVZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcigiSW1wb3J0LVBhY2thZ2U6ICIpLmFwcGVuZChkZXNjLmdldE5hbWUoKSkuYXBwZW5kKCIgIikuYXBwZW5kKGRlc2MuZ2V0VmVyc2lvbigpKS5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY291bGQgbm90IGJlIHJlc29sdmVkIikudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZS5nZXRVbnNhdGlzZmlhYmxlTGlicmFyeUltcG9ydHMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSW1wb3J0RGVzY3JpcHRvciBkZXNjIDogZS5nZXRVbnNhdGlzZmlhYmxlTGlicmFyeUltcG9ydHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVOdW1iZXIgPSBCdW5kbGVNYW5pZmVzdFV0aWxzLmdldExpbmVOdW1iZXIoZG9jdW1lbnQsIGJ1bmRsZU1hbmlmZXN0LmdldEhlYWRlcigiSW1wb3J0LUxpYnJhcnkiKSwgZGVzYy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUHJvYmxlbU1hcmtlcihtYW5pZmVzdCwgTWFya2VyQ29uc3RhbnRzLk1JU1NJTkdfREVQRU5ERU5DWV9LSU5EX0lNUE9SVF9MSUJSQVJZLCBkZXNjLmdldE5hbWUoKSwgZGVzYy5nZXRQYXJzZVZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcigiSW1wb3J0LUxpYnJhcnk6ICIpLmFwcGVuZChkZXNjLmdldE5hbWUoKSkuYXBwZW5kKCIgIikuYXBwZW5kKGRlc2MuZ2V0VmVyc2lvbigpKS5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY291bGQgbm90IGJlIHJlc29sdmVkIikudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyLCBJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZS5nZXRVbnNhdGlzZmlhYmxlUmVxdWlyZUJ1bmRsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJbXBvcnREZXNjcmlwdG9yIGRlc2MgOiBlLmdldFVuc2F0aXNmaWFibGVSZXF1aXJlQnVuZGxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lTnVtYmVyID0gQnVuZGxlTWFuaWZlc3RVdGlscy5nZXRMaW5lTnVtYmVyKGRvY3VtZW50LCBidW5kbGVNYW5pZmVzdC5nZXRIZWFkZXIoIlJlcXVpcmUtQnVuZGxlIiksIGRlc2MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVByb2JsZW1NYXJrZXIobWFuaWZlc3QsIE1hcmtlckNvbnN0YW50cy5NSVNTSU5HX0RFUEVOREVOQ1lfS0lORF9SRVFVSVJFX0JVTkRMRSwgZGVzYy5nZXROYW1lKCksIGRlc2MuZ2V0UGFyc2VWZXJzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoIlJlcXVpcmUtQnVuZGxlOiAiKS5hcHBlbmQoZGVzYy5nZXROYW1lKCkpLmFwcGVuZCgiICIpLmFwcGVuZChkZXNjLmdldFZlcnNpb24oKSkuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNvdWxkIG5vdCBiZSByZXNvbHZlZCIpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlciwgSU1hcmtlci5TRVZFUklUWV9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGUuZ2V0VW5zYXRpc2ZpYWJsZUJ1bmRsZUltcG9ydHMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSW1wb3J0RGVzY3JpcHRvciBkZXNjIDogZS5nZXRVbnNhdGlzZmlhYmxlQnVuZGxlSW1wb3J0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZU51bWJlciA9IEJ1bmRsZU1hbmlmZXN0VXRpbHMuZ2V0TGluZU51bWJlcihkb2N1bWVudCwgYnVuZGxlTWFuaWZlc3QuZ2V0SGVhZGVyKCJJbXBvcnQtQnVuZGxlIiksIGRlc2MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVByb2JsZW1NYXJrZXIobWFuaWZlc3QsIE1hcmtlckNvbnN0YW50cy5NSVNTSU5HX0RFUEVOREVOQ1lfS0lORF9JTVBPUlRfQlVORExFLCBkZXNjLmdldE5hbWUoKSwgZGVzYy5nZXRQYXJzZVZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcigiSW1wb3J0LUJ1bmRsZTogIikuYXBwZW5kKGRlc2MuZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKS5hcHBlbmQoZGVzYy5nZXRWZXJzaW9uKCkpLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjb3VsZCBub3QgYmUgcmVzb2x2ZWQiKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIsIElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgICAgICAgICAgfQogCi0JCX07CisgICAgICAgIH07CiAKLQkJbWFya2VyQ3JlYXRpb25Kb2Iuc2V0UHJpb3JpdHkoSm9iLkJVSUxEKTsKLQkJbWFya2VyQ3JlYXRpb25Kb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5idWlsZFJ1bGUoKSk7Ci0JCW1hcmtlckNyZWF0aW9uSm9iLnNjaGVkdWxlKCk7Ci0JfQorICAgICAgICBtYXJrZXJDcmVhdGlvbkpvYi5zZXRQcmlvcml0eShKb2IuQlVJTEQpOworICAgICAgICBtYXJrZXJDcmVhdGlvbkpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLmJ1aWxkUnVsZSgpKTsKKyAgICAgICAgbWFya2VyQ3JlYXRpb25Kb2Iuc2NoZWR1bGUoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgc2luZ2xlIHByb2JsZW0gbWFya2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVQcm9ibGVtTWFya2VyKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgc2V2ZXJpdHkpIHsKLQkJY3JlYXRlUHJvYmxlbU1hcmtlcihyZXNvdXJjZSwgbnVsbCwgbnVsbCwgbnVsbCwgbWVzc2FnZSwgbGluZU51bWJlciwgc2V2ZXJpdHkpOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgc2luZ2xlIHByb2JsZW0gbWFya2VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVQcm9ibGVtTWFya2VyKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgc2V2ZXJpdHkpIHsKKyAgICAgICAgY3JlYXRlUHJvYmxlbU1hcmtlcihyZXNvdXJjZSwgbnVsbCwgbnVsbCwgbnVsbCwgbWVzc2FnZSwgbGluZU51bWJlciwgc2V2ZXJpdHkpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVQcm9ibGVtTWFya2VyKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1pc3NpbmdEZXBlbmRlbmN5S2luZCwgU3RyaW5nIG1pc3NpbmdEZXBlbmRlbmN5LAotCQkJU3RyaW5nIG1pc3NpbmdEZXBlbmRlbmN5VmVyc2lvbiwgU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgc2V2ZXJpdHkpIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUHJvYmxlbU1hcmtlcihJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBtaXNzaW5nRGVwZW5kZW5jeUtpbmQsIFN0cmluZyBtaXNzaW5nRGVwZW5kZW5jeSwKKyAgICAgICAgU3RyaW5nIG1pc3NpbmdEZXBlbmRlbmN5VmVyc2lvbiwgU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgc2V2ZXJpdHkpIHsKIAotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJdHJ5IHsKKyAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CiAKLQkJCQkvLyBGaXJzdCBjaGVjayBpZiBzcGVjaWZpZWQgbWFya2VyIGFscmVhZHkgZXhpc3RzCi0JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhKZHRDb3JlUGx1Z2luLkRFUEVOREVOQ1lfUFJPQkxFTV9NQVJLRVJfSUQsIGZhbHNlLAotCQkJCQkJSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWZvciAoSU1hcmtlciBtYXJrZXIgOiBtYXJrZXJzKSB7Ci0JCQkJCWludCBsaW5lID0gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSLCAtMSk7Ci0JCQkJCWlmIChsaW5lID09IGxpbmVOdW1iZXIpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgIiIpOwotCQkJCQkJaWYgKG1zZy5lcXVhbHMobWVzc2FnZSkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CisgICAgICAgICAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgc3BlY2lmaWVkIG1hcmtlciBhbHJlYWR5IGV4aXN0cworICAgICAgICAgICAgICAgIElNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoSmR0Q29yZVBsdWdpbi5ERVBFTkRFTkNZX1BST0JMRU1fTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOworICAgICAgICAgICAgICAgIGZvciAoSU1hcmtlciBtYXJrZXIgOiBtYXJrZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBsaW5lID0gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkxJTkVfTlVNQkVSLCAtMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lID09IGxpbmVOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5lcXVhbHMobWVzc2FnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAKLQkJCQkvLyBDcmVhdGUgbmV3IG1hcmtlcgotCQkJCUlNYXJrZXIgbWFya2VyID0gcmVzb3VyY2UuY3JlYXRlTWFya2VyKEpkdENvcmVQbHVnaW4uREVQRU5ERU5DWV9QUk9CTEVNX01BUktFUl9JRCk7Ci0JCQkJTWFwPFN0cmluZywgT2JqZWN0PiBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5NRVNTQUdFLCBtZXNzYWdlKTsKLQkJCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLlNFVkVSSVRZLCBzZXZlcml0eSk7Ci0JCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5MSU5FX05VTUJFUiwgbGluZU51bWJlcik7Ci0JCQkJaWYgKG51bGwgIT0gbWlzc2luZ0RlcGVuZGVuY3kpIHsKLQkJCQkJYXR0cmlidXRlcy5wdXQoTWFya2VyQ29uc3RhbnRzLk1JU1NJTkdfREVQRU5ERU5DWV9LRVksIG1pc3NpbmdEZXBlbmRlbmN5KTsKLQkJCQl9Ci0JCQkJaWYgKG51bGwgIT0gbWlzc2luZ0RlcGVuZGVuY3lWZXJzaW9uKSB7Ci0JCQkJCWF0dHJpYnV0ZXMucHV0KE1hcmtlckNvbnN0YW50cy5NSVNTSU5HX0RFUEVOREVOQ1lfVkVSU0lPTl9LRVksIG1pc3NpbmdEZXBlbmRlbmN5VmVyc2lvbik7Ci0JCQkJfQotCQkJCWlmIChudWxsICE9IG1pc3NpbmdEZXBlbmRlbmN5S2luZCkgewotCQkJCQlhdHRyaWJ1dGVzLnB1dChNYXJrZXJDb25zdGFudHMuTUlTU0lOR19ERVBFTkRFTkNZX0tJTkRfS0VZLCBtaXNzaW5nRGVwZW5kZW5jeUtpbmQpOwotCQkJCX0KLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vVE9ETyBTaG91bGQgd2UgcmV0aHJvdyB0aGlzPwotCQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmR0Q29yZVBsdWdpbi5QTFVHSU5fSUQsICJDb3VsZG4ndCBjcmVhdGUgcHJvYmxlbSBtYXJrZXJzIiwgZSkpOwotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBtYXJrZXIKKyAgICAgICAgICAgICAgICBJTWFya2VyIG1hcmtlciA9IHJlc291cmNlLmNyZWF0ZU1hcmtlcihKZHRDb3JlUGx1Z2luLkRFUEVOREVOQ1lfUFJPQkxFTV9NQVJLRVJfSUQpOworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTUVTU0FHRSwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoSU1hcmtlci5TRVZFUklUWSwgc2V2ZXJpdHkpOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTElORV9OVU1CRVIsIGxpbmVOdW1iZXIpOworICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG1pc3NpbmdEZXBlbmRlbmN5KSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KE1hcmtlckNvbnN0YW50cy5NSVNTSU5HX0RFUEVOREVOQ1lfS0VZLCBtaXNzaW5nRGVwZW5kZW5jeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG1pc3NpbmdEZXBlbmRlbmN5VmVyc2lvbikgeworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnB1dChNYXJrZXJDb25zdGFudHMuTUlTU0lOR19ERVBFTkRFTkNZX1ZFUlNJT05fS0VZLCBtaXNzaW5nRGVwZW5kZW5jeVZlcnNpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBtaXNzaW5nRGVwZW5kZW5jeUtpbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5wdXQoTWFya2VyQ29uc3RhbnRzLk1JU1NJTkdfREVQRU5ERU5DWV9LSU5EX0tFWSwgbWlzc2luZ0RlcGVuZGVuY3lLaW5kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB3ZSByZXRocm93IHRoaXM/CisgICAgICAgICAgICAgICAgU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmR0Q29yZVBsdWdpbi5QTFVHSU5fSUQsICJDb3VsZG4ndCBjcmVhdGUgcHJvYmxlbSBtYXJrZXJzIiwgZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQl9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmluZGV4IGJiYWNhNmQuLjQzMjFiZDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0xLDQgKzEsMyBAQAotI1dlZCBNYXIgMDIgMTY6MDA6MDYgUFNUIDIwMTEKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQpAQCAtOCw2ICs3LDggQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQpAQCAtODIsMzUgKzgzLDM3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249NDgKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnk9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCkBAIC0xMjEsMzAgKzEyNCwzMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbGFtYmRhX2JvZHk9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lcz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xMjAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZGlzYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvZmYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5lbmFibGluZ190YWc9QGZvcm1hdHRlclw6b24KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCkBAIC0xNTgsNyArMTYyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkPWluc2VydApAQCAtMTY2LDEwICsxNzAsMTEgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZW1iZXI9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWw9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfdHlwZV9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydApAQCAtMjE3LDYgKzIyMiw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0yMzUsMTIgKzI0MSwxNCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CkBAIC0yNjQsNiArMjcyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0CkBAIC0yOTEsNiArMzAwLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0zMTksNiArMzI5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3RyeT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydApAQCAtMzI4LDYgKzMzOSw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0zNDMsMTUgKzM1NSwxNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTIwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj1zcGFjZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX29uX29mZl90YWdzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YUZvcm1hdHRlcj1vcmcuZWNsaXBzZS5qZHQuY29yZS5kZWZhdWx0SmF2YUZvcm1hdHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmluZGV4IDdlN2ZlNzMuLjZjOTgwMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTEsNyArMSw2NSBAQAorY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbWV0aG9kcz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zX2ludGVyZmFjZV9tZXRob2RzPXRydWUKK2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X2Z1bmN0aW9uYWxfaW50ZXJmYWNlcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCitjbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlX2NoYW5nZXNfb25seT1mYWxzZQorY2xlYW51cC5pbnNlcnRfaW5mZXJyZWRfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV9yZWR1bmRhbnRfdHlwZV9hcmd1bWVudHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Fub255bW91c19jbGFzc19jcmVhdGlvbj1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPXRydWUKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9sYW1iZGE9dHJ1ZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3R5cGVfYXJndW1lbnRzPWZhbHNlCitjbGVhbnVwX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIENsZWFuIFVwCiBjbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIGVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X015bHluIGJhc2VkIG9uIEVjbGlwc2UKK2Zvcm1hdHRlcl9wcm9maWxlPV9WaXJnbyBXZWIgU2VydmVyIC0gQ29kZSBGb3JtYXR0ZXIKIGZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEyCiBpbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAogb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvdWkvYWN0aW9ucy9FbmFibGVTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC91aS9hY3Rpb25zL0VuYWJsZVNlcnZlckNsYXNzcGF0aENvbnRhaW5lckFjdGlvbkRlbGVnYXRlLmphdmEKaW5kZXggNDZjNmQ3MS4uM2NjNTE4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC91aS9hY3Rpb25zL0VuYWJsZVNlcnZlckNsYXNzcGF0aENvbnRhaW5lckFjdGlvbkRlbGVnYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC91aS9hY3Rpb25zL0VuYWJsZVNlcnZlckNsYXNzcGF0aENvbnRhaW5lckFjdGlvbkRlbGVnYXRlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5pbnRlcm5hbC51aS5hY3Rpb25zOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTQyLDkxICs0Myw4NiBAQAogICovCiBwdWJsaWMgY2xhc3MgRW5hYmxlU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewogCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PElQcm9qZWN0PiBzZWxlY3RlZCA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3Q+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PElQcm9qZWN0PiBzZWxlY3RlZCA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3Q+KCk7CiAKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJU2V0PElKYXZhUHJvamVjdD4gcHJvamVjdHMgPSBuZXcgTGlua2VkSGFzaFNldDxJSmF2YVByb2plY3Q+KCk7Ci0JCUl0ZXJhdG9yPElQcm9qZWN0PiBpdGVyID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkpIHsKLQkJCQlwcm9qZWN0cy5hZGQoSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKLQkJCX0gZWxzZSBpZiAoRmFjZXRVdGlscy5pc1BhclByb2plY3QocHJvamVjdCkpIHsKLQkJCQlmb3IgKElQcm9qZWN0IGJ1bmRsZSA6IEZhY2V0VXRpbHMuZ2V0QnVuZGxlUHJvamVjdHMocHJvamVjdCkpIHsKLQkJCQkJcHJvamVjdHMuYWRkKEphdmFDb3JlLmNyZWF0ZShidW5kbGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICBwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKKyAgICAgICAgU2V0PElKYXZhUHJvamVjdD4gcHJvamVjdHMgPSBuZXcgTGlua2VkSGFzaFNldDxJSmF2YVByb2plY3Q+KCk7CisgICAgICAgIEl0ZXJhdG9yPElQcm9qZWN0PiBpdGVyID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICBwcm9qZWN0cy5hZGQoSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRmFjZXRVdGlscy5pc1BhclByb2plY3QocHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKElQcm9qZWN0IGJ1bmRsZSA6IEZhY2V0VXRpbHMuZ2V0QnVuZGxlUHJvamVjdHMocHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdHMuYWRkKEphdmFDb3JlLmNyZWF0ZShidW5kbGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlmb3IgKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA6IHByb2plY3RzKSB7Ci0JCQl0cnkgewotCQkJCWlmIChDbGFzc3BhdGhVdGlscy5oYXNDbGFzc3BhdGhDb250YWluZXIoamF2YVByb2plY3QpKSB7Ci0JCQkJCXJlbW92ZUZyb21DbGFzc3BhdGgoamF2YVByb2plY3QsIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KAotCQkJCQkJCVNlcnZlckNsYXNzcGF0aENvbnRhaW5lci5DTEFTU1BBVEhfQ09OVEFJTkVSX1BBVEgsIG51bGwsCi0JCQkJCQkJU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLkNMQVNTUEFUSF9DT05UQUlORVJfQVRUUklCVVRFLCBmYWxzZSksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkvLyBSZW1vdmUgYW55IGVycm9yIG1hcmtlcnMgdGhhdCBtaWdodCBoYW5nIGFyb3VuZAotCQkJCQlqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlTWFya2VycyhKZHRDb3JlUGx1Z2luLkRFUEVOREVOQ1lfUFJPQkxFTV9NQVJLRVJfSUQsIHRydWUsCi0JCQkJCQkJSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhZGRUb0NsYXNzcGF0aChqYXZhUHJvamVjdCwgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoCi0JCQkJCQkJU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLkNMQVNTUEFUSF9DT05UQUlORVJfUEFUSCwgbnVsbCwKLQkJCQkJCQlTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIuQ0xBU1NQQVRIX0NPTlRBSU5FUl9BVFRSSUJVVEUsIGZhbHNlKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJSmR0Q29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgZm9yIChJSmF2YVByb2plY3QgamF2YVByb2plY3QgOiBwcm9qZWN0cykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoQ2xhc3NwYXRoVXRpbHMuaGFzQ2xhc3NwYXRoQ29udGFpbmVyKGphdmFQcm9qZWN0KSkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVGcm9tQ2xhc3NwYXRoKGphdmFQcm9qZWN0LCBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIuQ0xBU1NQQVRIX0NPTlRBSU5FUl9QQVRILCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLkNMQVNTUEFUSF9DT05UQUlORVJfQVRUUklCVVRFLCBmYWxzZSksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYW55IGVycm9yIG1hcmtlcnMgdGhhdCBtaWdodCBoYW5nIGFyb3VuZAorICAgICAgICAgICAgICAgICAgICBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlTWFya2VycyhKZHRDb3JlUGx1Z2luLkRFUEVOREVOQ1lfUFJPQkxFTV9NQVJLRVJfSUQsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkVG9DbGFzc3BhdGgoamF2YVByb2plY3QsIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KFNlcnZlckNsYXNzcGF0aENvbnRhaW5lci5DTEFTU1BBVEhfQ09OVEFJTkVSX1BBVEgsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIuQ0xBU1NQQVRIX0NPTlRBSU5FUl9BVFRSSUJVVEUsIGZhbHNlKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgSmR0Q29yZVBsdWdpbi5sb2coZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3RlZC5jbGVhcigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCQlJdGVyYXRvcjw/PiBpdGVyID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLQkJCQkJb2JqID0gKChJSmF2YVByb2plY3QpIG9iaikuZ2V0UHJvamVjdCgpOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgb2JqOwotCQkJCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc2VsZWN0ZWQuYWRkKHByb2plY3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCX0KKyAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworICAgICAgICBzZWxlY3RlZC5jbGVhcigpOworICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBJdGVyYXRvcjw/PiBpdGVyID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgb2JqID0gKChJSmF2YVByb2plY3QpIG9iaikuZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSVByb2plY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgb2JqOworICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQuYWRkKHByb2plY3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgdm9pZCBhZGRUb0NsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ2xhc3NwYXRoRW50cnlbXSBjdXJyZW50ID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIHVwZGF0ZWQgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2N1cnJlbnQubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY3VycmVudCwgMCwgdXBkYXRlZCwgMCwgY3VycmVudC5sZW5ndGgpOwotCQl1cGRhdGVkW2N1cnJlbnQubGVuZ3RoXSA9IGVudHJ5OwotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgodXBkYXRlZCwgbW9uaXRvcik7Ci0JfQorICAgIHByaXZhdGUgdm9pZCBhZGRUb0NsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGN1cnJlbnQgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKKyAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gdXBkYXRlZCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbY3VycmVudC5sZW5ndGggKyAxXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShjdXJyZW50LCAwLCB1cGRhdGVkLCAwLCBjdXJyZW50Lmxlbmd0aCk7CisgICAgICAgIHVwZGF0ZWRbY3VycmVudC5sZW5ndGhdID0gZW50cnk7CisgICAgICAgIGphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aCh1cGRhdGVkLCBtb25pdG9yKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVNldDxJQ2xhc3NwYXRoRW50cnk+IGVudHJpZXMgPSBuZXcgTGlua2VkSGFzaFNldDxJQ2xhc3NwYXRoRW50cnk+KCk7Ci0JCWZvciAoSUNsYXNzcGF0aEVudHJ5IGV4aXN0aW5nRW50cnkgOiBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSkgewotCQkJaWYgKCFleGlzdGluZ0VudHJ5LmVxdWFscyhlbnRyeSkpIHsKLQkJCQllbnRyaWVzLmFkZChleGlzdGluZ0VudHJ5KTsKLQkJCX0KLQkJfQotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoZW50cmllcy50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbZW50cmllcy5zaXplKCldKSwgbW9uaXRvcik7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBTZXQ8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8SUNsYXNzcGF0aEVudHJ5PigpOworICAgICAgICBmb3IgKElDbGFzc3BhdGhFbnRyeSBleGlzdGluZ0VudHJ5IDogamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkpIHsKKyAgICAgICAgICAgIGlmICghZXhpc3RpbmdFbnRyeS5lcXVhbHMoZW50cnkpKSB7CisgICAgICAgICAgICAgICAgZW50cmllcy5hZGQoZXhpc3RpbmdFbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2VudHJpZXMuc2l6ZSgpXSksIG1vbml0b3IpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQl9CisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgeworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC91aS9hY3Rpb25zL1JlZnJlc2hTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC91aS9hY3Rpb25zL1JlZnJlc2hTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJBY3Rpb25EZWxlZ2F0ZS5qYXZhCmluZGV4IGM4YzgzNTEuLmQwNTM4M2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZWZyZXNoU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyQWN0aW9uRGVsZWdhdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL3VpL2FjdGlvbnMvUmVmcmVzaFNlcnZlckNsYXNzcGF0aENvbnRhaW5lckFjdGlvbkRlbGVnYXRlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5pbnRlcm5hbC51aS5hY3Rpb25zOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTM2LDU3ICszNyw1NiBAQAogICovCiBwdWJsaWMgY2xhc3MgUmVmcmVzaFNlcnZlckNsYXNzcGF0aENvbnRhaW5lckFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKIAotCXByaXZhdGUgZmluYWwgTGlzdDxJUHJvamVjdD4gc2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxJUHJvamVjdD4gc2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0PigpOwogCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVNldDxJSmF2YVByb2plY3Q+IHByb2plY3RzID0gbmV3IExpbmtlZEhhc2hTZXQ8SUphdmFQcm9qZWN0PigpOwotCQlJdGVyYXRvcjxJUHJvamVjdD4gaXRlciA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJcHJvamVjdHMuYWRkKEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7Ci0JCQl9IGVsc2UgaWYgKEZhY2V0VXRpbHMuaXNQYXJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJZm9yIChJUHJvamVjdCBidW5kbGUgOiBGYWNldFV0aWxzLmdldEJ1bmRsZVByb2plY3RzKHByb2plY3QpKSB7Ci0JCQkJCXByb2plY3RzLmFkZChKYXZhQ29yZS5jcmVhdGUoYnVuZGxlKSk7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CisgICAgICAgIFNldDxJSmF2YVByb2plY3Q+IHByb2plY3RzID0gbmV3IExpbmtlZEhhc2hTZXQ8SUphdmFQcm9qZWN0PigpOworICAgICAgICBJdGVyYXRvcjxJUHJvamVjdD4gaXRlciA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KHByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgcHJvamVjdHMuYWRkKEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEZhY2V0VXRpbHMuaXNQYXJQcm9qZWN0KHByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgZm9yIChJUHJvamVjdCBidW5kbGUgOiBGYWNldFV0aWxzLmdldEJ1bmRsZVByb2plY3RzKHByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2plY3RzLmFkZChKYXZhQ29yZS5jcmVhdGUoYnVuZGxlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJZm9yIChJSmF2YVByb2plY3QgamF2YVByb2plY3QgOiBwcm9qZWN0cykgewotCQkJU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iLnNjaGVkdWxlQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iKGphdmFQcm9qZWN0LAotCQkJCQlCdW5kbGVNYW5pZmVzdE1hbmFnZXIuSU1QT1JUU19DSEFOR0VEKTsKLQkJfQorICAgICAgICBmb3IgKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA6IHByb2plY3RzKSB7CisgICAgICAgICAgICBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2Iuc2NoZWR1bGVDbGFzc3BhdGhDb250YWluZXJVcGRhdGVKb2IoamF2YVByb2plY3QsIEJ1bmRsZU1hbmlmZXN0TWFuYWdlci5JTVBPUlRTX0NIQU5HRUQpOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWQuY2xlYXIoKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCQkJSXRlcmF0b3I8Pz4gaXRlciA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0JCQkJCW9iaiA9ICgoSUphdmFQcm9qZWN0KSBvYmopLmdldFByb2plY3QoKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG9iajsKLQkJCQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXNlbGVjdGVkLmFkZChwcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9CisgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKyAgICAgICAgc2VsZWN0ZWQuY2xlYXIoKTsKKyAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisgICAgICAgICAgICBib29sZWFuIGVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgSXRlcmF0b3I8Pz4gaXRlciA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIG9iaiA9ICgoSUphdmFQcm9qZWN0KSBvYmopLmdldFByb2plY3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG9iajsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLmFkZChwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvdWkvY2xhc3NwYXRoL1NlcnZlckNsYXNzcGF0aENvbnRhaW5lclBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvdWkvY2xhc3NwYXRoL1NlcnZlckNsYXNzcGF0aENvbnRhaW5lclBhZ2UuamF2YQppbmRleCBkNTI1YjVkLi40ZDIzMGE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL3VpL2NsYXNzcGF0aC9TZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJQYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC91aS9jbGFzc3BhdGgvU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyUGFnZS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuaW50ZXJuYWwudWkuY2xhc3NwYXRoOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwpAQCAtMjcsMzEgKzI4LDMxIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIElDbGFzc3BhdGhDb250YWluZXJQYWdlIHsKIAotCXByaXZhdGUgSUNsYXNzcGF0aEVudHJ5IGNsYXNzcGF0aEVudHJ5ID0gbnVsbDsKKyAgICBwcml2YXRlIElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSA9IG51bGw7CiAKLQlwdWJsaWMgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSgpIHsKLQkJc3VwZXIoIkJ1bmRsZSBDbGFzc3BhdGggQ29udGFpbmVyIik7Ci0JfQorICAgIHB1YmxpYyBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXJQYWdlKCkgeworICAgICAgICBzdXBlcigiQnVuZGxlIENsYXNzcGF0aCBDb250YWluZXIiKTsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBmaW5pc2goKSB7Ci0JCWNsYXNzcGF0aEVudHJ5ID0gSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLkNMQVNTUEFUSF9DT05UQUlORVJfUEFUSCk7Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICBwdWJsaWMgYm9vbGVhbiBmaW5pc2goKSB7CisgICAgICAgIGNsYXNzcGF0aEVudHJ5ID0gSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLkNMQVNTUEFUSF9DT05UQUlORVJfUEFUSCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY2xhc3NwYXRoRW50cnk7Ci0JfQorICAgIHB1YmxpYyBJQ2xhc3NwYXRoRW50cnkgZ2V0U2VsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gY2xhc3NwYXRoRW50cnk7CisgICAgfQogCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElDbGFzc3BhdGhFbnRyeSBjb250YWluZXJFbnRyeSkgewotCQl0aGlzLmNsYXNzcGF0aEVudHJ5ID0gY29udGFpbmVyRW50cnk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJQ2xhc3NwYXRoRW50cnkgY29udGFpbmVyRW50cnkpIHsKKyAgICAgICAgdGhpcy5jbGFzc3BhdGhFbnRyeSA9IGNvbnRhaW5lckVudHJ5OworICAgIH0KIAotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzZXRUaXRsZSgiQnVuZGxlIENsYXNzcGF0aCBDb250YWluZXIiKTsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIlByZXNzIEZpbmlzaCB0byBhZGQgdGhlIFNwcmluZ1NvdXJjZSBkbSBTZXJ2ZXIgQnVuZGxlIENsYXNzcGF0aCBDb250YWluZXIiKTsKLQkJbGFiZWwuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJc2V0Q29udHJvbChsYWJlbCk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworICAgICAgICBzZXRUaXRsZSgiQnVuZGxlIENsYXNzcGF0aCBDb250YWluZXIiKTsKKyAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7CisgICAgICAgIGxhYmVsLnNldFRleHQoIlByZXNzIEZpbmlzaCB0byBhZGQgdGhlIFNwcmluZ1NvdXJjZSBkbSBTZXJ2ZXIgQnVuZGxlIENsYXNzcGF0aCBDb250YWluZXIiKTsKKyAgICAgICAgbGFiZWwuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKKyAgICAgICAgc2V0Q29udHJvbChsYWJlbCk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL3VpL2RlY29yYXRpb24vSmR0Q2xhc3NwYXRoQ29udGFpbmVyRWxlbWVudERlY29yYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC91aS9kZWNvcmF0aW9uL0pkdENsYXNzcGF0aENvbnRhaW5lckVsZW1lbnREZWNvcmF0b3IuamF2YQppbmRleCA2Zjc5NjZhLi42MzAxYzIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL3VpL2RlY29yYXRpb24vSmR0Q2xhc3NwYXRoQ29udGFpbmVyRWxlbWVudERlY29yYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvdWkvZGVjb3JhdGlvbi9KZHRDbGFzc3BhdGhDb250YWluZXJFbGVtZW50RGVjb3JhdG9yLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5pbnRlcm5hbC51aS5kZWNvcmF0aW9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKQEAgLTQyLDE4NSArNDMsMTgwIEBACiBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQogcHVibGljIGNsYXNzIEpkdENsYXNzcGF0aENvbnRhaW5lckVsZW1lbnREZWNvcmF0b3IgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgewogCi0JLyoqIEEgSkRUIG1vZGVsIGxpc3RlbmVyIHRoYXQgZ2V0cyBub3RpZmllZCBpZiBhIGNsYXNzIHBhdGggY2hhbmdlZCAqLwotCXByaXZhdGUgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgPSBudWxsOworICAgIC8qKiBBIEpEVCBtb2RlbCBsaXN0ZW5lciB0aGF0IGdldHMgbm90aWZpZWQgaWYgYSBjbGFzcyBwYXRoIGNoYW5nZWQgKi8KKyAgICBwcml2YXRlIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIGNoYW5nZUxpc3RlbmVyID0gbnVsbDsKIAotCXB1YmxpYyBKZHRDbGFzc3BhdGhDb250YWluZXJFbGVtZW50RGVjb3JhdG9yKCkgeworICAgIHB1YmxpYyBKZHRDbGFzc3BhdGhDb250YWluZXJFbGVtZW50RGVjb3JhdG9yKCkgewogCi0JCS8vIHtAbGluayBJRWxlbWVudENoYW5nZWRMaXN0ZW5lcn0gSkRUIGxpc3RlbmVyIHRoYXQgZGV0ZWN0cyBjaGFuZ2VzIHRvIHRoZSBwcm9qZWN0J3MgY2xhc3MKLQkJLy8gcGF0aCBhbmQgdHJpZ2dlcnMgYSBkZWNvcmF0b3IgcmVmcmVzaC4KLQkJY2hhbmdlTGlzdGVuZXIgPSBuZXcgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoKSB7CisgICAgICAgIC8vIHtAbGluayBJRWxlbWVudENoYW5nZWRMaXN0ZW5lcn0gSkRUIGxpc3RlbmVyIHRoYXQgZGV0ZWN0cyBjaGFuZ2VzIHRvIHRoZSBwcm9qZWN0J3MgY2xhc3MKKyAgICAgICAgLy8gcGF0aCBhbmQgdHJpZ2dlcnMgYSBkZWNvcmF0b3IgcmVmcmVzaC4KKyAgICAgICAgY2hhbmdlTGlzdGVuZXIgPSBuZXcgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoKSB7CiAKLQkJCS8qKgotCQkJICogRmxhZyBpbmRpY2F0aW5nIGEgY2hhbmdlIGluIHRoZSByZXNvbHZlZCBjbGFzcyBwYXRoLiBUaGlzIGVudHJ5IGlzIGNvcGllZCBmcm9tIEVjbGlwc2UgMy40IGluIG9yZGVyIHRvCi0JCQkgKiBtYWtlIHRoaXMgY29tcGF0aWJsZSB3aXRoIDMuMy4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZfUkVTT0xWRURfQ0xBU1NQQVRIX0NIQU5HRUQgPSAweDIwMDAwMDsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogRmxhZyBpbmRpY2F0aW5nIGEgY2hhbmdlIGluIHRoZSByZXNvbHZlZCBjbGFzcyBwYXRoLiBUaGlzIGVudHJ5IGlzIGNvcGllZCBmcm9tIEVjbGlwc2UgMy40IGluIG9yZGVyIHRvCisgICAgICAgICAgICAgKiBtYWtlIHRoaXMgY29tcGF0aWJsZSB3aXRoIDMuMy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZfUkVTT0xWRURfQ0xBU1NQQVRIX0NIQU5HRUQgPSAweDIwMDAwMDsKIAotCQkJcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCQkJCWZvciAoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEgOiBldmVudC5nZXREZWx0YSgpLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkgewotCQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBGX1JFU09MVkVEX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwCi0JCQkJCQkJfHwgKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwKSB7Ci0JCQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVmcmVzaCkgewotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZChuZXcgTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCgKLQkJCQkJCQkJCUpkdENsYXNzcGF0aENvbnRhaW5lckVsZW1lbnREZWNvcmF0b3IudGhpcykpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIsIEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9DSEFOR0UpOwotCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHJlZnJlc2ggPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKElKYXZhRWxlbWVudERlbHRhIGRlbHRhIDogZXZlbnQuZ2V0RGVsdGEoKS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChkZWx0YS5nZXRGbGFncygpICYgRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRCkgIT0gMCB8fCAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0xBU1NQQVRIX0NIQU5HRUQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZWZyZXNoKSB7CisgICAgICAgICAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CiAKLQkvKioKLQkgKiBEZWNvcmF0ZXMgdGhlIGdpdmVuIDxjb2RlPmVsZW1lbnQ8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRlKE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7Ci0JCS8vIHBhY2thZ2UgZnJhZ21lbnRzIGFyZSB0aGUgZmlyc3QgZWxlbWVudHMgYmVsb3cgdGhlIEpBUiBmaWxlCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotCQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSAoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudDsKLQkJCWlmIChzaG91bGREZWNvcmF0ZUltcG9ydGVkUGFja2FnZUZyYWdtZW50KHBhY2thZ2VGcmFnbWVudCkpIHsKLQkJCQkvLyBtYWtlIGxpZ2h0IGdyYXkgYW5kIGxvY2sgaWNvbiBkZWNvcmF0aW9uCi0JCQkJZGVjb3JhdGlvbi5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JNYXAuR1JBWV9MSUdIVCk7Ci0JCQkJZGVjb3JhdGlvbi5hZGRPdmVybGF5KEpkdFVpSW1hZ2VzLkRFU0NfT1ZSX0xPQ0tFRCwgSURlY29yYXRpb24uVE9QX0xFRlQpOwotCQkJfSBlbHNlIGlmIChzaG91bGREZWNvcmF0ZUV4cG9ydGVkUGFja2FnZUZyYWdtZW50KHBhY2thZ2VGcmFnbWVudCkpIHsKLQkJCQlkZWNvcmF0aW9uLmFkZE92ZXJsYXkoSmR0VWlJbWFnZXMuREVTQ19PVlJfRVhQT1JURUQsIElEZWNvcmF0aW9uLlRPUF9SSUdIVCk7Ci0JCQl9Ci0JCX0KLQkJLy8gamFyIHBhY2thZ2UgZnJhZ21lbnRzIHJvb3RzOyBkZWNvcmF0ZSB0aG9zZSB0aGF0IGNvbWUgZnJvbSBhIHRlc3QgZGVwZW5kZW5jeQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQ7Ci0JCQl0cnkgewotCQkJCWlmIChTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIuQ0xBU1NQQVRIX0NPTlRBSU5FUl9QQVRILmVxdWFscyhyb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCkuZ2V0UGF0aCgpKQotCQkJCQkJJiYgcm9vdC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSAmJiByb290LmdldEphdmFQcm9qZWN0KCkuaXNPcGVuKCkpIHsKLQkJCQkJU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyIGNwQ29udGFpbmVyID0gKFNlcnZlckNsYXNzcGF0aENvbnRhaW5lcikgSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKAotCQkJCQkJCVNlcnZlckNsYXNzcGF0aENvbnRhaW5lci5DTEFTU1BBVEhfQ09OVEFJTkVSX1BBVEgsIHJvb3QuZ2V0SmF2YVByb2plY3QoKSk7Ci0JCQkJCWlmIChjcENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGNwQ29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKSkgewotCQkJCQkJCWlmIChlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKHJvb3QuZ2V0UGF0aCgpKSAmJiBlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWZvciAoSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSkgewotCQkJCQkJCQkJaWYgKGF0dHJpYnV0ZS5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCQkJCQlTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIuVEVTVF9DTEFTU1BBVEhfQVRUUklCVVRFX1ZBTFVFKSkgewotCQkJCQkJCQkJCWRlY29yYXRpb24uc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yTWFwLkdSQVlfTElHSFQpOwotCQkJCQkJCQkJCWRlY29yYXRpb24uYWRkT3ZlcmxheShKZHRVaUltYWdlcy5ERVNDX09WUl9MT0NLRUQsIElEZWNvcmF0aW9uLlRPUF9MRUZUKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQobmV3IExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQoSmR0Q2xhc3NwYXRoQ29udGFpbmVyRWxlbWVudERlY29yYXRvci50aGlzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lciwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSk7CisgICAgfQogCi0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQkvLyBjbGFzcyBmaWxlcyByZXByZXNlbnQgYSBzaW5nbGUgdHlwZSBmaWxlIGluIGEgSkFSCi0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2xhc3NGaWxlKSB7Ci0JCQlJQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IChJQ2xhc3NGaWxlKSBlbGVtZW50OwotCQkJaWYgKGNsYXNzRmlsZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLQkJCQlpZiAoc2hvdWxkRGVjb3JhdGVJbXBvcnRlZFBhY2thZ2VGcmFnbWVudCgoSVBhY2thZ2VGcmFnbWVudCkgY2xhc3NGaWxlLmdldFBhcmVudCgpKSkgewotCQkJCQkvLyBtYWtlIGxpZ2h0IGdyYXkKLQkJCQkJZGVjb3JhdGlvbi5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JNYXAuR1JBWV9MSUdIVCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGRlY29yYXRlIHRoZSBjbGFzcyBwYXRoIGNvbnRhaW5lciBhbmQgYWRkIHRoZSBvcmlnaW5hdGluZyB0YXJnZXQgcnVudGltZQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NQYXRoQ29udGFpbmVyKSB7Ci0JCQlDbGFzc1BhdGhDb250YWluZXIgY29udGFpbmVyID0gKENsYXNzUGF0aENvbnRhaW5lcikgZWxlbWVudDsKLQkJCWlmIChjb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cnkoKS5nZXRQYXRoKCkuZXF1YWxzKFNlcnZlckNsYXNzcGF0aENvbnRhaW5lci5DTEFTU1BBVEhfQ09OVEFJTkVSX1BBVEgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGNvbnRhaW5lci5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSAmJiBjb250YWluZXIuZ2V0SmF2YVByb2plY3QoKS5pc09wZW4oKSkgewotCQkJCQkJU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyIGNwQ29udGFpbmVyID0gKFNlcnZlckNsYXNzcGF0aENvbnRhaW5lcikgSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVyKAotCQkJCQkJCQlTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIuQ0xBU1NQQVRIX0NPTlRBSU5FUl9QQVRILCBjb250YWluZXIuZ2V0SmF2YVByb2plY3QoKSk7Ci0JCQkJCQlkZWNvcmF0aW9uLmFkZFN1ZmZpeChjcENvbnRhaW5lci5nZXREZXNjcmlwdGlvblN1ZmZpeCgpKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIERlY29yYXRlcyB0aGUgZ2l2ZW4gPGNvZGU+ZWxlbWVudDwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVjb3JhdGUoT2JqZWN0IGVsZW1lbnQsIElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKKyAgICAgICAgLy8gcGFja2FnZSBmcmFnbWVudHMgYXJlIHRoZSBmaXJzdCBlbGVtZW50cyBiZWxvdyB0aGUgSkFSIGZpbGUKKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7CisgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KSBlbGVtZW50OworICAgICAgICAgICAgaWYgKHNob3VsZERlY29yYXRlSW1wb3J0ZWRQYWNrYWdlRnJhZ21lbnQocGFja2FnZUZyYWdtZW50KSkgeworICAgICAgICAgICAgICAgIC8vIG1ha2UgbGlnaHQgZ3JheSBhbmQgbG9jayBpY29uIGRlY29yYXRpb24KKyAgICAgICAgICAgICAgICBkZWNvcmF0aW9uLnNldEZvcmVncm91bmRDb2xvcihDb2xvck1hcC5HUkFZX0xJR0hUKTsKKyAgICAgICAgICAgICAgICBkZWNvcmF0aW9uLmFkZE92ZXJsYXkoSmR0VWlJbWFnZXMuREVTQ19PVlJfTE9DS0VELCBJRGVjb3JhdGlvbi5UT1BfTEVGVCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNob3VsZERlY29yYXRlRXhwb3J0ZWRQYWNrYWdlRnJhZ21lbnQocGFja2FnZUZyYWdtZW50KSkgeworICAgICAgICAgICAgICAgIGRlY29yYXRpb24uYWRkT3ZlcmxheShKZHRVaUltYWdlcy5ERVNDX09WUl9FWFBPUlRFRCwgSURlY29yYXRpb24uVE9QX1JJR0hUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBqYXIgcGFja2FnZSBmcmFnbWVudHMgcm9vdHM7IGRlY29yYXRlIHRob3NlIHRoYXQgY29tZSBmcm9tIGEgdGVzdCBkZXBlbmRlbmN5CisgICAgICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgeworICAgICAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKFNlcnZlckNsYXNzcGF0aENvbnRhaW5lci5DTEFTU1BBVEhfQ09OVEFJTkVSX1BBVEguZXF1YWxzKHJvb3QuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKS5nZXRQYXRoKCkpCisgICAgICAgICAgICAgICAgICAgICYmIHJvb3QuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkgJiYgcm9vdC5nZXRKYXZhUHJvamVjdCgpLmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgICAgIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lciBjcENvbnRhaW5lciA9IChTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIpIEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lci5DTEFTU1BBVEhfQ09OVEFJTkVSX1BBVEgsIHJvb3QuZ2V0SmF2YVByb2plY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjcENvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGNwQ29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKHJvb3QuZ2V0UGF0aCgpKSAmJiBlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5nZXROYW1lKCkuZXF1YWxzKFNlcnZlckNsYXNzcGF0aENvbnRhaW5lci5URVNUX0NMQVNTUEFUSF9BVFRSSUJVVEVfVkFMVUUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdGlvbi5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JNYXAuR1JBWV9MSUdIVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdGlvbi5hZGRPdmVybGF5KEpkdFVpSW1hZ2VzLkRFU0NfT1ZSX0xPQ0tFRCwgSURlY29yYXRpb24uVE9QX0xFRlQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogCi0JLyoqCi0JICogQ2hlY2tzIGlmIGEgZ2l2ZW4ge0BsaW5rIElQYWNrYWdlRnJhZ21lbnR9IGlzIGluIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHBhY2thZ2VzIGZvciB0aGUgY3VycmVudAotCSAqIHtAbGluayBJSmF2YVByb2plY3R9LgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUge0BsaW5rIElQYWNrYWdlRnJhZ21lbnR9IGlzIGluIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHBhY2thZ2VzCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZERlY29yYXRlRXhwb3J0ZWRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJSUphdmFQcm9qZWN0IGxhdmFQcm9qZWN0ID0gcGFja2FnZUZyYWdtZW50LmdldEphdmFQcm9qZWN0KCk7Ci0JCXJldHVybiBGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChsYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpCi0JCQkJJiYgQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmdldEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpCi0JCQkJCQkuZ2V0UGFja2FnZUV4cG9ydHMobGF2YVByb2plY3QpCi0JCQkJCQkuY29udGFpbnMocGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCkpOwotCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGNsYXNzIGZpbGVzIHJlcHJlc2VudCBhIHNpbmdsZSB0eXBlIGZpbGUgaW4gYSBKQVIKKyAgICAgICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpIHsKKyAgICAgICAgICAgIElDbGFzc0ZpbGUgY2xhc3NGaWxlID0gKElDbGFzc0ZpbGUpIGVsZW1lbnQ7CisgICAgICAgICAgICBpZiAoY2xhc3NGaWxlLmdldFBhcmVudCgpIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgeworICAgICAgICAgICAgICAgIGlmIChzaG91bGREZWNvcmF0ZUltcG9ydGVkUGFja2FnZUZyYWdtZW50KChJUGFja2FnZUZyYWdtZW50KSBjbGFzc0ZpbGUuZ2V0UGFyZW50KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgbGlnaHQgZ3JheQorICAgICAgICAgICAgICAgICAgICBkZWNvcmF0aW9uLnNldEZvcmVncm91bmRDb2xvcihDb2xvck1hcC5HUkFZX0xJR0hUKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZGVjb3JhdGUgdGhlIGNsYXNzIHBhdGggY29udGFpbmVyIGFuZCBhZGQgdGhlIG9yaWdpbmF0aW5nIHRhcmdldCBydW50aW1lCisgICAgICAgIGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzc1BhdGhDb250YWluZXIpIHsKKyAgICAgICAgICAgIENsYXNzUGF0aENvbnRhaW5lciBjb250YWluZXIgPSAoQ2xhc3NQYXRoQ29udGFpbmVyKSBlbGVtZW50OworICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyeSgpLmdldFBhdGgoKS5lcXVhbHMoU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLkNMQVNTUEFUSF9DT05UQUlORVJfUEFUSCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpICYmIGNvbnRhaW5lci5nZXRKYXZhUHJvamVjdCgpLmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJDbGFzc3BhdGhDb250YWluZXIgY3BDb250YWluZXIgPSAoU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyKSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLkNMQVNTUEFUSF9DT05UQUlORVJfUEFUSCwgY29udGFpbmVyLmdldEphdmFQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdGlvbi5hZGRTdWZmaXgoY3BDb250YWluZXIuZ2V0RGVzY3JpcHRpb25TdWZmaXgoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIENoZWNrcyBpZiBhIGdpdmVuIHtAbGluayBJUGFja2FnZUZyYWdtZW50fSBpcyBpbiB0aGUgbGlzdCBvZiByZXNvbHZlZCBpbXBvcnRzIGZvciB0aGUgY3VycmVudAotCSAqIHtAbGluayBJSmF2YVByb2plY3R9LgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUge0BsaW5rIElQYWNrYWdlRnJhZ21lbnR9IGlzIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGphdmEgcHJvamVjdAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGREZWNvcmF0ZUltcG9ydGVkUGFja2FnZUZyYWdtZW50KElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHBhY2thZ2VGcmFnbWVudC5nZXRQYXJlbnQoKTsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gcGFja2FnZUZyYWdtZW50LmdldEphdmFQcm9qZWN0KCk7CisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGEgZ2l2ZW4ge0BsaW5rIElQYWNrYWdlRnJhZ21lbnR9IGlzIGluIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHBhY2thZ2VzIGZvciB0aGUgY3VycmVudAorICAgICAqIHtAbGluayBJSmF2YVByb2plY3R9LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUge0BsaW5rIElQYWNrYWdlRnJhZ21lbnR9IGlzIGluIHRoZSBsaXN0IG9mIGV4cG9ydGVkIHBhY2thZ2VzCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZERlY29yYXRlRXhwb3J0ZWRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKKyAgICAgICAgSUphdmFQcm9qZWN0IGxhdmFQcm9qZWN0ID0gcGFja2FnZUZyYWdtZW50LmdldEphdmFQcm9qZWN0KCk7CisgICAgICAgIHJldHVybiBGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChsYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpCisgICAgICAgICAgICAmJiBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0UGFja2FnZUV4cG9ydHMobGF2YVByb2plY3QpLmNvbnRhaW5zKHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKKyAgICB9CiAKLQkJaWYgKCEoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpICYmIGphdmFQcm9qZWN0LmlzT3BlbigpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9CisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGEgZ2l2ZW4ge0BsaW5rIElQYWNrYWdlRnJhZ21lbnR9IGlzIGluIHRoZSBsaXN0IG9mIHJlc29sdmVkIGltcG9ydHMgZm9yIHRoZSBjdXJyZW50CisgICAgICoge0BsaW5rIElKYXZhUHJvamVjdH0uCisgICAgICogCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB7QGxpbmsgSVBhY2thZ2VGcmFnbWVudH0gaXMgbm90IGFjY2Vzc2libGUgZnJvbSB0aGUgamF2YSBwcm9qZWN0CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZERlY29yYXRlSW1wb3J0ZWRQYWNrYWdlRnJhZ21lbnQoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKKyAgICAgICAgSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcGFja2FnZUZyYWdtZW50LmdldFBhcmVudCgpOworICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBwYWNrYWdlRnJhZ21lbnQuZ2V0SmF2YVByb2plY3QoKTsKIAotCQkvLyBPbmx5IGRlY29yYXRlIGluIGJ1bmRsZSBwcm9qZWN0cwotCQlpZiAoIUZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KGphdmFQcm9qZWN0LmdldFByb2plY3QoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQorICAgICAgICBpZiAoIShqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkgJiYgamF2YVByb2plY3QuaXNPcGVuKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gcm9vdC5nZXRSYXdDbGFzc3BhdGhFbnRyeSgpOwotCQkJaWYgKGVudHJ5LmdldFBhdGgoKS5lcXVhbHMoU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyLkNMQVNTUEFUSF9DT05UQUlORVJfUEFUSCkpIHsKLQkJCQlpZiAoIUJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5nZXRCdW5kbGVNYW5pZmVzdE1hbmFnZXIoKQotCQkJCQkJLmdldFJlc29sdmVkUGFja2FnZUltcG9ydHMocm9vdC5nZXRKYXZhUHJvamVjdCgpKQotCQkJCQkJLmNvbnRhaW5zKHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KKyAgICAgICAgLy8gT25seSBkZWNvcmF0ZSBpbiBidW5kbGUgcHJvamVjdHMKKyAgICAgICAgaWYgKCFGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gRG9uJ3QgY2FyZQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IHJvb3QuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKFNlcnZlckNsYXNzcGF0aENvbnRhaW5lci5DTEFTU1BBVEhfQ09OVEFJTkVSX1BBVEgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0UmVzb2x2ZWRQYWNrYWdlSW1wb3J0cyhyb290LmdldEphdmFQcm9qZWN0KCkpLmNvbnRhaW5zKAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlDb2xvck1hcC5kaXNwb3NlKCk7Ci0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIC8vIERvbid0IGNhcmUKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgIENvbG9yTWFwLmRpc3Bvc2UoKTsKKyAgICAgICAgSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcik7CisgICAgfQogCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBEb24ndCBjYXJlCi0JfQorICAgIHB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLQkvKioKLQkgKiBJbnRlcm5hbCBjbGFzcyB1c2VkIGZvciBjcmVhdGluZyB7QGxpbmsgQ29sb3J9IGluc3RhbmNlcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb2xvck1hcCB7CisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICAvLyBEb24ndCBjYXJlCisgICAgfQogCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgR1JBWV9MSUdIVCA9IG5ldyBDb2xvcihEaXNwbGF5LmdldERlZmF1bHQoKSwgMTQ1LCAxNDUsIDE0NSk7CisgICAgLyoqCisgICAgICogSW50ZXJuYWwgY2xhc3MgdXNlZCBmb3IgY3JlYXRpbmcge0BsaW5rIENvbG9yfSBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29sb3JNYXAgewogCi0JCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwb3NlKCkgewotCQkJR1JBWV9MSUdIVC5kaXNwb3NlKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBHUkFZX0xJR0hUID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCAxNDUsIDE0NSwgMTQ1KTsKIAotCX0KKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgICAgICBHUkFZX0xJR0hULmRpc3Bvc2UoKTsKKyAgICAgICAgfQorCisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL3VpL2RlY29yYXRpb24vSmR0VWlJbWFnZXMuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvdWkvZGVjb3JhdGlvbi9KZHRVaUltYWdlcy5qYXZhCmluZGV4IDQ4NzRkNzkuLmNmMmRjNWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvdWkvZGVjb3JhdGlvbi9KZHRVaUltYWdlcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvdWkvZGVjb3JhdGlvbi9KZHRVaUltYWdlcy5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQuaW50ZXJuYWwudWkuZGVjb3JhdGlvbjsKIAogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKQEAgLTM2LDEzMSArMzcsMTI4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBKZHRVaUltYWdlcyB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9QQVRIX1BSRUZJWCA9ICJpY29ucy9mdWxsLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUEFUSF9QUkVGSVggPSAiaWNvbnMvZnVsbC8iOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJFRklYID0gSmR0VWlQbHVnaW4uUExVR0lOX0lEICsgJy4nOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BSRUZJWCA9IEpkdFVpUGx1Z2luLlBMVUdJTl9JRCArICcuJzsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOQU1FX1BSRUZJWF9MRU5HVEggPSBOQU1FX1BSRUZJWC5sZW5ndGgoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9QUkVGSVhfTEVOR1RIID0gTkFNRV9QUkVGSVgubGVuZ3RoKCk7CiAKLQkvKiBEZWNsYXJlIENvbW1vbiBwYXRocyAqLwotCXByaXZhdGUgc3RhdGljIFVSTCBJQ09OX0JBU0VfVVJMID0gbnVsbDsKKyAgICAvKiBEZWNsYXJlIENvbW1vbiBwYXRocyAqLworICAgIHByaXZhdGUgc3RhdGljIFVSTCBJQ09OX0JBU0VfVVJMID0gbnVsbDsKIAotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlJQ09OX0JBU0VfVVJMID0gbmV3IFVSTChKZHRVaVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSwgSUNPTl9QQVRIX1BSRUZJWCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CisgICAgc3RhdGljIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElDT05fQkFTRV9VUkwgPSBuZXcgVVJMKEpkdFVpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpLCBJQ09OX1BBVEhfUFJFRklYKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKiBBIHRhYmxlIG9mIGFsbCB0aGUgPGNvZGU+SW1hZ2VEZXNjcmlwdG9yPC9jb2RlPnMuICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPiBpbWFnZURlc2NyaXB0b3JzOworICAgIC8qKiBBIHRhYmxlIG9mIGFsbCB0aGUgPGNvZGU+SW1hZ2VEZXNjcmlwdG9yPC9jb2RlPnMuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPiBpbWFnZURlc2NyaXB0b3JzOwogCi0JLyoqIFRoZSBpbWFnZSByZWdpc3RyeSBjb250YWluaW5nIDxjb2RlPkltYWdlPC9jb2RlPnMuICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5OworICAgIC8qKiBUaGUgaW1hZ2UgcmVnaXN0cnkgY29udGFpbmluZyA8Y29kZT5JbWFnZTwvY29kZT5zLiAqLworICAgIHByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeTsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfTE9DS0VEID0gTkFNRV9QUkVGSVggKyAibG9ja2VkX292ci5naWYiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfTE9DS0VEID0gTkFNRV9QUkVGSVggKyAibG9ja2VkX292ci5naWYiOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09WUl9FWFBPUlRFRCA9IE5BTUVfUFJFRklYICsgInBhY2thZ2VfZXhwb3J0X292ci5naWYiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfRVhQT1JURUQgPSBOQU1FX1BSRUZJWCArICJwYWNrYWdlX2V4cG9ydF9vdnIuZ2lmIjsKIAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBPVlIgPSAib3ZyMTYvIjsgLy8gYmFzaWMgY29sb3JzIC0KKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1ZSID0gIm92cjE2LyI7IC8vIGJhc2ljIGNvbG9ycyAtCiAKLQkvLyBzaXplIDE2eDE2CisgICAgLy8gc2l6ZSAxNngxNgogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19PVlJfTE9DS0VEID0gY3JlYXRlTWFuYWdlZChPVlIsIElNR19PVlJfTE9DS0VEKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX09WUl9MT0NLRUQgPSBjcmVhdGVNYW5hZ2VkKE9WUiwgSU1HX09WUl9MT0NLRUQpOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19PVlJfRVhQT1JURUQgPSBjcmVhdGVNYW5hZ2VkKE9WUiwgSU1HX09WUl9FWFBPUlRFRCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19PVlJfRVhQT1JURUQgPSBjcmVhdGVNYW5hZ2VkKE9WUiwgSU1HX09WUl9FWFBPUlRFRCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5JbWFnZTxjb2RlPiBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXksCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIDxjb2RlPkltYWdlPGNvZGU+IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSwKKyAgICAgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHRoZSB0aHJlZSBpbWFnZSBkZXNjcmlwdG9ycyBmb3IgZW5hYmxlZCwgZGlzYWJsZWQsIGFuZCBob3ZlcmVkIHRvIGFuIGFjdGlvbi4gVGhlIGFjdGlvbnMgYXJlIHJldHJpZXZlZCBmcm9tCi0JICogdGhlICp0b29sMTYgZm9sZGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VG9vbEltYWdlRGVzY3JpcHRvcnMoSUFjdGlvbiBhY3Rpb24sIFN0cmluZyBpY29uTmFtZSkgewotCQlzZXRJbWFnZURlc2NyaXB0b3JzKGFjdGlvbiwgInRvb2wxNiIsIGljb25OYW1lKTsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGhyZWUgaW1hZ2UgZGVzY3JpcHRvcnMgZm9yIGVuYWJsZWQsIGRpc2FibGVkLCBhbmQgaG92ZXJlZCB0byBhbiBhY3Rpb24uIFRoZSBhY3Rpb25zIGFyZSByZXRyaWV2ZWQgZnJvbQorICAgICAqIHRoZSAqdG9vbDE2IGZvbGRlcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRvb2xJbWFnZURlc2NyaXB0b3JzKElBY3Rpb24gYWN0aW9uLCBTdHJpbmcgaWNvbk5hbWUpIHsKKyAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9ycyhhY3Rpb24sICJ0b29sMTYiLCBpY29uTmFtZSk7CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB0aGUgdGhyZWUgaW1hZ2UgZGVzY3JpcHRvcnMgZm9yIGVuYWJsZWQsIGRpc2FibGVkLCBhbmQgaG92ZXJlZCB0byBhbiBhY3Rpb24uIFRoZSBhY3Rpb25zIGFyZSByZXRyaWV2ZWQgZnJvbQotCSAqIHRoZSAqbGNsMTYgZm9sZGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TG9jYWxJbWFnZURlc2NyaXB0b3JzKElBY3Rpb24gYWN0aW9uLCBTdHJpbmcgaWNvbk5hbWUpIHsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9ycyhhY3Rpb24sICJsY2wxNiIsIGljb25OYW1lKTsKLQl9CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGhyZWUgaW1hZ2UgZGVzY3JpcHRvcnMgZm9yIGVuYWJsZWQsIGRpc2FibGVkLCBhbmQgaG92ZXJlZCB0byBhbiBhY3Rpb24uIFRoZSBhY3Rpb25zIGFyZSByZXRyaWV2ZWQgZnJvbQorICAgICAqIHRoZSAqbGNsMTYgZm9sZGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TG9jYWxJbWFnZURlc2NyaXB0b3JzKElBY3Rpb24gYWN0aW9uLCBTdHJpbmcgaWNvbk5hbWUpIHsKKyAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9ycyhhY3Rpb24sICJsY2wxNiIsIGljb25OYW1lKTsKKyAgICB9CiAKLQkvKgotCSAqIEhlbHBlciBtZXRob2QgdG8gYWNjZXNzIHRoZSBpbWFnZSByZWdpc3RyeSBmcm9tIHRoZSBKYXZhUGx1Z2luIGNsYXNzLgotCSAqLwotCS8qIHBhY2thZ2UgKi9zdGF0aWMgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsKLQkJCWZvciAoU3RyaW5nIHN0cmluZyA6IGltYWdlRGVzY3JpcHRvcnMua2V5U2V0KCkpIHsKLQkJCQlTdHJpbmcga2V5ID0gc3RyaW5nOwotCQkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgaW1hZ2VEZXNjcmlwdG9ycy5nZXQoa2V5KSk7Ci0JCQl9Ci0JCQlpbWFnZURlc2NyaXB0b3JzID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeTsKLQl9CisgICAgLyoKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGFjY2VzcyB0aGUgaW1hZ2UgcmVnaXN0cnkgZnJvbSB0aGUgSmF2YVBsdWdpbiBjbGFzcy4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovc3RhdGljIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKKyAgICAgICAgaWYgKGltYWdlUmVnaXN0cnkgPT0gbnVsbCkgeworICAgICAgICAgICAgaW1hZ2VSZWdpc3RyeSA9IG5ldyBJbWFnZVJlZ2lzdHJ5KCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBzdHJpbmcgOiBpbWFnZURlc2NyaXB0b3JzLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IHN0cmluZzsKKyAgICAgICAgICAgICAgICBpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGltYWdlRGVzY3JpcHRvcnMuZ2V0KGtleSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW1hZ2VEZXNjcmlwdG9ycyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGltYWdlUmVnaXN0cnk7CisgICAgfQogCi0JLy8gLS0tLSBIZWxwZXIgbWV0aG9kcyB0byBhY2Nlc3MgaWNvbnMgb24gdGhlIGZpbGUgc3lzdGVtCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIC0tLS0gSGVscGVyIG1ldGhvZHMgdG8gYWNjZXNzIGljb25zIG9uIHRoZSBmaWxlIHN5c3RlbQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9ycyhJQWN0aW9uIGFjdGlvbiwgU3RyaW5nIHR5cGUsIFN0cmluZyByZWxQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChtYWtlSWNvbkZpbGVVUkwoImQiICsgdHlwZSwgcmVsUGF0aCkpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlhY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoaWQpOwotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQl9Ci0JCS8qCi0JCSAqIHRyeSB7IEltYWdlRGVzY3JpcHRvciBpZCA9Ci0JCSAqIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG1ha2VJY29uRmlsZVVSTCggImMiICsgdHlwZSwgcmVsUGF0aCkpOwotCQkgKiBpZiAoaWQgIT0gbnVsbCkgeyBhY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoaWQpOyB9IH0gY2F0Y2gKLQkJICogKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7IEJlYW5zVUlQbHVnaW4ubG9nKGUpOyB9Ci0JCSAqLwotCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGNyZWF0ZSgiZSIgKyB0eXBlLCByZWxQYXRoKSk7Ci0JfQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9ycyhJQWN0aW9uIGFjdGlvbiwgU3RyaW5nIHR5cGUsIFN0cmluZyByZWxQYXRoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChtYWtlSWNvbkZpbGVVUkwoImQiICsgdHlwZSwgcmVsUGF0aCkpOworICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgICAqIHRyeSB7IEltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG1ha2VJY29uRmlsZVVSTCggImMiICsgdHlwZSwgcmVsUGF0aCkpOyBpZiAoaWQgIT0KKyAgICAgICAgICogbnVsbCkgeyBhY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoaWQpOyB9IH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7IEJlYW5zVUlQbHVnaW4ubG9nKGUpOyB9CisgICAgICAgICAqLworICAgICAgICBhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGNyZWF0ZSgiZSIgKyB0eXBlLCByZWxQYXRoKSk7CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZU1hbmFnZWQoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCUltYWdlRGVzY3JpcHRvciByZXN1bHQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChtYWtlSWNvbkZpbGVVUkwocHJlZml4LAotCQkJCQluYW1lLnN1YnN0cmluZyhOQU1FX1BSRUZJWF9MRU5HVEgpKSk7Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yPigpOwotCQkJfQotCQkJaW1hZ2VEZXNjcmlwdG9ycy5wdXQobmFtZSwgcmVzdWx0KTsKLQkJCWlmIChpbWFnZVJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgY3JlYXRlTWFuYWdlZChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIHJlc3VsdCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG1ha2VJY29uRmlsZVVSTChwcmVmaXgsIG5hbWUuc3Vic3RyaW5nKE5BTUVfUFJFRklYX0xFTkdUSCkpKTsKKyAgICAgICAgICAgIGlmIChpbWFnZURlc2NyaXB0b3JzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbWFnZURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbWFnZURlc2NyaXB0b3I+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbWFnZURlc2NyaXB0b3JzLnB1dChuYW1lLCByZXN1bHQpOworICAgICAgICAgICAgaWYgKGltYWdlUmVnaXN0cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG1ha2VJY29uRmlsZVVSTChwcmVmaXgsIG5hbWUpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0JfQorICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChtYWtlSWNvbkZpbGVVUkwocHJlZml4LCBuYW1lKSk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIFVSTCBtYWtlSWNvbkZpbGVVUkwoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlpZiAoSUNPTl9CQVNFX1VSTCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCk7Ci0JCX0KKyAgICBwcml2YXRlIHN0YXRpYyBVUkwgbWFrZUljb25GaWxlVVJMKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElDT05fQkFTRV9VUkwgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbigpOworICAgICAgICB9CiAKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocHJlZml4KTsKLQkJYnVmZmVyLmFwcGVuZCgnLycpOwotCQlidWZmZXIuYXBwZW5kKG5hbWUpOwotCQlyZXR1cm4gbmV3IFVSTChJQ09OX0JBU0VfVVJMLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQorICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwcmVmaXgpOworICAgICAgICBidWZmZXIuYXBwZW5kKCcvJyk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQobmFtZSk7CisgICAgICAgIHJldHVybiBuZXcgVVJMKElDT05fQkFTRV9VUkwsIGJ1ZmZlci50b1N0cmluZygpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL3VpL3Byb3BlcnRpZXMvVGVzdFNvdXJjZUZvbGRlclByZWZlcmVuY2VQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L2ludGVybmFsL3VpL3Byb3BlcnRpZXMvVGVzdFNvdXJjZUZvbGRlclByZWZlcmVuY2VQYWdlLmphdmEKaW5kZXggYzA4NjY2NC4uOTE5YWE2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL1Rlc3RTb3VyY2VGb2xkZXJQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9UZXN0U291cmNlRm9sZGVyUHJlZmVyZW5jZVBhZ2UuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmludGVybmFsLnVpLnByb3BlcnRpZXM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtNTUsMTgxICs1NiwxNzkgQEAKIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCiBwdWJsaWMgY2xhc3MgVGVzdFNvdXJjZUZvbGRlclByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIHsKIAotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKKyAgICBwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7CiAKLQlwcml2YXRlIGJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKIAotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBsaXN0Vmlld2VyOworICAgIHByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBsaXN0Vmlld2VyOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST0pFQ1RfTElTVF9NVUxUSVBMSUVSID0gMzA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST0pFQ1RfTElTVF9NVUxUSVBMSUVSID0gMzA7CiAKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7CisgICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewogCi0JCUZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7CisgICAgICAgIEZvbnQgZm9udCA9IHBhcmVudC5nZXRGb250KCk7CiAKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KGZvbnQpOworICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKyAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CisgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKyAgICAgICAgY29tcG9zaXRlLnNldEZvbnQoZm9udCk7CiAKLQkJaW5pdGlhbGl6ZSgpOworICAgICAgICBpbml0aWFsaXplKCk7CiAKLQkJTGFiZWwgZGVzY3JpcHRpb24gPSBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKGNvbXBvc2l0ZSk7Ci0JCWRlc2NyaXB0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuVE9QLCB0cnVlLCBmYWxzZSkpOworICAgICAgICBMYWJlbCBkZXNjcmlwdGlvbiA9IGNyZWF0ZURlc2NyaXB0aW9uTGFiZWwoY29tcG9zaXRlKTsKKyAgICAgICAgZGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIHRydWUsIGZhbHNlKSk7CiAKLQkJbGlzdFZpZXdlciA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KGNvbXBvc2l0ZSwgU1dULlRPUCB8IFNXVC5CT1JERVIpOwotCQlsaXN0Vmlld2VyLmdldFRhYmxlKCkuc2V0Rm9udChmb250KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOworICAgICAgICBsaXN0Vmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoY29tcG9zaXRlLCBTV1QuVE9QIHwgU1dULkJPUkRFUik7CisgICAgICAgIGxpc3RWaWV3ZXIuZ2V0VGFibGUoKS5zZXRGb250KGZvbnQpOworICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisgICAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CiAKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiAhcHJvamVjdC5pc09wZW4oKSkKLQkJCWxpc3RWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsICYmICFwcm9qZWN0LmlzT3BlbigpKQorICAgICAgICAgICAgbGlzdFZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChmYWxzZSk7CiAKLQkJLy8gT25seSBzZXQgYSBoZWlnaHQgaGludCBpZiBpdCB3aWxsIG5vdCByZXN1bHQgaW4gYSBjdXQgb2ZmIGRpYWxvZwotCQlpZiAoRGlhbG9nVXRpbC5pblJlZ3VsYXJGb250TW9kZShwYXJlbnQpKSB7Ci0JCQlkYXRhLmhlaWdodEhpbnQgPSBnZXREZWZhdWx0Rm9udEhlaWdodChsaXN0Vmlld2VyLmdldFRhYmxlKCksIFBST0pFQ1RfTElTVF9NVUxUSVBMSUVSKTsKLQkJfQotCQlsaXN0Vmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGlzdFZpZXdlci5nZXRUYWJsZSgpLnNldEZvbnQoZm9udCk7CisgICAgICAgIC8vIE9ubHkgc2V0IGEgaGVpZ2h0IGhpbnQgaWYgaXQgd2lsbCBub3QgcmVzdWx0IGluIGEgY3V0IG9mZiBkaWFsb2cKKyAgICAgICAgaWYgKERpYWxvZ1V0aWwuaW5SZWd1bGFyRm9udE1vZGUocGFyZW50KSkgeworICAgICAgICAgICAgZGF0YS5oZWlnaHRIaW50ID0gZ2V0RGVmYXVsdEZvbnRIZWlnaHQobGlzdFZpZXdlci5nZXRUYWJsZSgpLCBQUk9KRUNUX0xJU1RfTVVMVElQTElFUik7CisgICAgICAgIH0KKyAgICAgICAgbGlzdFZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIGxpc3RWaWV3ZXIuZ2V0VGFibGUoKS5zZXRGb250KGZvbnQpOwogCi0JCWxpc3RWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ2xhc3NwYXRoRW50cnlMYWJlbFByb3ZpZGVyKCkpOwotCQlsaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQ2xhc3NwYXRoRW50cnlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWxpc3RWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcigpKTsKLQkJbGlzdFZpZXdlci5zZXRJbnB1dChwcm9qZWN0KTsKLQkJbGlzdFZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoU2VydmVyTW9kdWxlRGVsZWdhdGUuZ2V0U291cmNlQ2xhc3NwYXRoRW50cmllcyhwcm9qZWN0LCB0cnVlKS50b0FycmF5KCkpOworICAgICAgICBsaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENsYXNzcGF0aEVudHJ5TGFiZWxQcm92aWRlcigpKTsKKyAgICAgICAgbGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IENsYXNzcGF0aEVudHJ5Q29udGVudFByb3ZpZGVyKCkpOworICAgICAgICBsaXN0Vmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoKSk7CisgICAgICAgIGxpc3RWaWV3ZXIuc2V0SW5wdXQocHJvamVjdCk7CisgICAgICAgIGxpc3RWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKFNlcnZlck1vZHVsZURlbGVnYXRlLmdldFNvdXJjZUNsYXNzcGF0aEVudHJpZXMocHJvamVjdCwgdHJ1ZSkudG9BcnJheSgpKTsKIAotCQkvLyBjaGVjayBmb3IgaW5pdGlhbCBtb2RpZmljYXRpb24gdG8gYXZvaWQgd29yayBpZiBubyBjaGFuZ2VzIGFyZSBtYWRlCi0JCWxpc3RWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7CisgICAgICAgIC8vIGNoZWNrIGZvciBpbml0aWFsIG1vZGlmaWNhdGlvbiB0byBhdm9pZCB3b3JrIGlmIG5vIGNoYW5nZXMgYXJlIG1hZGUKKyAgICAgICAgbGlzdFZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7CiAKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKIAotCXByaXZhdGUgc3RhdGljIGludCBnZXREZWZhdWx0Rm9udEhlaWdodChDb250cm9sIGNvbnRyb2wsIGludCBsaW5lcykgewotCQlGb250RGF0YVtdIHZpZXdlckZvbnREYXRhID0gY29udHJvbC5nZXRGb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJaW50IGZvbnRIZWlnaHQgPSAxMDsKKyAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZTsKKyAgICB9CiAKLQkJLy8gSWYgd2UgaGF2ZSBubyBmb250IGRhdGEgdXNlIG91ciBndWVzcwotCQlpZiAodmlld2VyRm9udERhdGEubGVuZ3RoID4gMCkgewotCQkJZm9udEhlaWdodCA9IHZpZXdlckZvbnREYXRhWzBdLmdldEhlaWdodCgpOwotCQl9Ci0JCXJldHVybiBsaW5lcyAqIGZvbnRIZWlnaHQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldERlZmF1bHRGb250SGVpZ2h0KENvbnRyb2wgY29udHJvbCwgaW50IGxpbmVzKSB7CisgICAgICAgIEZvbnREYXRhW10gdmlld2VyRm9udERhdGEgPSBjb250cm9sLmdldEZvbnQoKS5nZXRGb250RGF0YSgpOworICAgICAgICBpbnQgZm9udEhlaWdodCA9IDEwOwogCi0JfQorICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIGZvbnQgZGF0YSB1c2Ugb3VyIGd1ZXNzCisgICAgICAgIGlmICh2aWV3ZXJGb250RGF0YS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmb250SGVpZ2h0ID0gdmlld2VyRm9udERhdGFbMF0uZ2V0SGVpZ2h0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpbmVzICogZm9udEhlaWdodDsKIAotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBnZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCQlzZXREZXNjcmlwdGlvbigiU2VsZWN0IEphdmEgc291cmNlIGZvbGRlcnMgdGhhdCBjb250YWluIHVuaXQgYW5kIGludGVncmF0aW9uIHRlc3QgY2xhc3Nlcy5cblRoZSBjb250ZW50cyBvZiB0aG9zZSB0ZXN0IGZvbGRlcnMgd2lsbCBub3QgZ2V0IGRlcGxveWVkIHRvIGFueSBzZXJ2ZXIgcnVudGltZS4iKTsKLQl9CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlpZiAoIW1vZGlmaWVkKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQorICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBwcm9qZWN0ID0gKElQcm9qZWN0KSBnZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOworICAgICAgICBzZXREZXNjcmlwdGlvbigKKyAgICAgICAgICAgICJTZWxlY3QgSmF2YSBzb3VyY2UgZm9sZGVycyB0aGF0IGNvbnRhaW4gdW5pdCBhbmQgaW50ZWdyYXRpb24gdGVzdCBjbGFzc2VzLlxuVGhlIGNvbnRlbnRzIG9mIHRob3NlIHRlc3QgZm9sZGVycyB3aWxsIG5vdCBnZXQgZGVwbG95ZWQgdG8gYW55IHNlcnZlciBydW50aW1lLiIpOworICAgIH0KIAotCQl0cnkgewotCQkJTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKLQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpLmdldFJhd0NsYXNzcGF0aCgpKSB7Ci0JCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJCVNldDxJQ2xhc3NwYXRoQXR0cmlidXRlPiBhdHRycyA9IG5ldyBIYXNoU2V0PElDbGFzc3BhdGhBdHRyaWJ1dGU+KCk7Ci0JCQkJCWZvciAoSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyIDogZW50cnkuZ2V0RXh0cmFBdHRyaWJ1dGVzKCkpIHsKLQkJCQkJCWlmICghYXR0ci5nZXROYW1lKCkuZXF1YWxzKFNlcnZlck1vZHVsZURlbGVnYXRlLlRFU1RfQ0xBU1NQQVRIX0VOVFJZX0FUVFJJQlVURSkpIHsKLQkJCQkJCQlhdHRycy5hZGQoYXR0cik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYXR0cnMuYWRkKGdldENsYXNzcGF0aEF0dHJpYnV0ZShlbnRyeSkpOworICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKKyAgICAgICAgaWYgKCFtb2RpZmllZCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAotCQkJCQllbnRyaWVzLmFkZChKYXZhQ29yZS5uZXdTb3VyY2VFbnRyeShlbnRyeS5nZXRQYXRoKCksIGVudHJ5LmdldEluY2x1c2lvblBhdHRlcm5zKCksCi0JCQkJCQkJZW50cnkuZ2V0RXhjbHVzaW9uUGF0dGVybnMoKSwgZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKSwKLQkJCQkJCQkoSUNsYXNzcGF0aEF0dHJpYnV0ZVtdKSBhdHRycy50b0FycmF5KG5ldyBJQ2xhc3NwYXRoQXR0cmlidXRlW2F0dHJzLnNpemUoKV0pKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZW50cmllcy5hZGQoZW50cnkpOwotCQkJCX0KLQkJCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7CisgICAgICAgICAgICBmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KS5nZXRSYXdDbGFzc3BhdGgoKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgeworICAgICAgICAgICAgICAgICAgICBTZXQ8SUNsYXNzcGF0aEF0dHJpYnV0ZT4gYXR0cnMgPSBuZXcgSGFzaFNldDxJQ2xhc3NwYXRoQXR0cmlidXRlPigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0ciA6IGVudHJ5LmdldEV4dHJhQXR0cmlidXRlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHIuZ2V0TmFtZSgpLmVxdWFscyhTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZS5URVNUX0NMQVNTUEFUSF9FTlRSWV9BVFRSSUJVVEUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuYWRkKGF0dHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGF0dHJzLmFkZChnZXRDbGFzc3BhdGhBdHRyaWJ1dGUoZW50cnkpKTsKIAotCQkJSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpCi0JCQkJCS5zZXRSYXdDbGFzc3BhdGgoKElDbGFzc3BhdGhFbnRyeVtdKSBlbnRyaWVzLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLnNpemUoKV0pLAotCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl9CisgICAgICAgICAgICAgICAgICAgIGVudHJpZXMuYWRkKEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KGVudHJ5LmdldFBhdGgoKSwgZW50cnkuZ2V0SW5jbHVzaW9uUGF0dGVybnMoKSwgZW50cnkuZ2V0RXhjbHVzaW9uUGF0dGVybnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCksIChJQ2xhc3NwYXRoQXR0cmlidXRlW10pIGF0dHJzLnRvQXJyYXkobmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbYXR0cnMuc2l6ZSgpXSkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLmFkZChlbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCXJldHVybiB0cnVlOwotCX0KKyAgICAgICAgICAgIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KS5zZXRSYXdDbGFzc3BhdGgoKElDbGFzc3BhdGhFbnRyeVtdKSBlbnRyaWVzLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLnNpemUoKV0pLAorICAgICAgICAgICAgICAgIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworICAgICAgICB9CiAKLQlwcml2YXRlIElDbGFzc3BhdGhBdHRyaWJ1dGUgZ2V0Q2xhc3NwYXRoQXR0cmlidXRlKElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlJQ2xhc3NwYXRoQXR0cmlidXRlIHRlc3RGb2xkZXJBdHRyaWJ1dGUgPSBKYXZhQ29yZS5uZXdDbGFzc3BhdGhBdHRyaWJ1dGUoCi0JCQkJU2VydmVyTW9kdWxlRGVsZWdhdGUuVEVTVF9DTEFTU1BBVEhfRU5UUllfQVRUUklCVVRFLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCUlDbGFzc3BhdGhBdHRyaWJ1dGUgc291cmNlRm9sZGVyQXR0cmlidXRlID0gSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKAotCQkJCVNlcnZlck1vZHVsZURlbGVnYXRlLlRFU1RfQ0xBU1NQQVRIX0VOVFJZX0FUVFJJQlVURSwgImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JCU9iamVjdFtdIHRlc3RGb2xkZXJzID0gbGlzdFZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJZm9yIChPYmplY3QgdGVzdEZvbGRlciA6IHRlc3RGb2xkZXJzKSB7Ci0JCQlpZiAoKChJQ2xhc3NwYXRoRW50cnkpIHRlc3RGb2xkZXIpLmdldFBhdGgoKS5lcXVhbHMoZW50cnkuZ2V0UGF0aCgpKSkgewotCQkJCXJldHVybiB0ZXN0Rm9sZGVyQXR0cmlidXRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2VGb2xkZXJBdHRyaWJ1dGU7Ci0JfQorICAgIHByaXZhdGUgSUNsYXNzcGF0aEF0dHJpYnV0ZSBnZXRDbGFzc3BhdGhBdHRyaWJ1dGUoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7CisgICAgICAgIElDbGFzc3BhdGhBdHRyaWJ1dGUgdGVzdEZvbGRlckF0dHJpYnV0ZSA9IEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZShTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZS5URVNUX0NMQVNTUEFUSF9FTlRSWV9BVFRSSUJVVEUsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgSUNsYXNzcGF0aEF0dHJpYnV0ZSBzb3VyY2VGb2xkZXJBdHRyaWJ1dGUgPSBKYXZhQ29yZS5uZXdDbGFzc3BhdGhBdHRyaWJ1dGUoU2VydmVyTW9kdWxlRGVsZWdhdGUuVEVTVF9DTEFTU1BBVEhfRU5UUllfQVRUUklCVVRFLCAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAogCi0JY2xhc3MgQ2xhc3NwYXRoRW50cnlMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIgeworICAgICAgICBPYmplY3RbXSB0ZXN0Rm9sZGVycyA9IGxpc3RWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7CisgICAgICAgIGZvciAoT2JqZWN0IHRlc3RGb2xkZXIgOiB0ZXN0Rm9sZGVycykgeworICAgICAgICAgICAgaWYgKCgoSUNsYXNzcGF0aEVudHJ5KSB0ZXN0Rm9sZGVyKS5nZXRQYXRoKCkuZXF1YWxzKGVudHJ5LmdldFBhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVzdEZvbGRlckF0dHJpYnV0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc291cmNlRm9sZGVyQXR0cmlidXRlOworICAgIH0KIAotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19QQUNLRlJBR19ST09UKTsKLQkJfQorICAgIGNsYXNzIENsYXNzcGF0aEVudHJ5TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKIAotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiAoKElDbGFzc3BhdGhFbnRyeSkgZWxlbWVudCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpOwotCQl9CisgICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgeworICAgICAgICAgICAgcmV0dXJuIEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1BBQ0tGUkFHX1JPT1QpOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJLy8gbm90aGluZyB0byBkbwotCQl9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworICAgICAgICAgICAgcmV0dXJuICgoSUNsYXNzcGF0aEVudHJ5KSBlbGVtZW50KS5nZXRQYXRoKCkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJLy8gbm90aGluZyB0byBkbwotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAKLQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgfQogCi0JY2xhc3MgQ2xhc3NwYXRoRW50cnlDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7CisgICAgfQogCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQlMaXN0PElDbGFzc3BhdGhFbnRyeT4gc291cmNlRm9sZGVycyA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwotCQkJCXRyeSB7Ci0JCQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpLmdldFJhd0NsYXNzcGF0aCgpKSB7Ci0JCQkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQkJCQlzb3VyY2VGb2xkZXJzLmFkZChlbnRyeSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHNvdXJjZUZvbGRlcnMudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W3NvdXJjZUZvbGRlcnMuc2l6ZSgpXSk7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQorICAgIGNsYXNzIENsYXNzcGF0aEVudHJ5Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewogCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvCi0JCX0KKyAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKyAgICAgICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgeworICAgICAgICAgICAgICAgIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBzb3VyY2VGb2xkZXJzID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkuZ2V0UmF3Q2xhc3NwYXRoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZvbGRlcnMuYWRkKGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlRm9sZGVycy50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbc291cmNlRm9sZGVycy5zaXplKCldKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvCi0JCX0KLQl9CisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgICAgICAgfQorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC91aS9KZHRVaVBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2pkdC91aS9KZHRVaVBsdWdpbi5qYXZhCmluZGV4IGYyYTlhY2IuLmE2OWYyYWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9qZHQvdWkvSmR0VWlQbHVnaW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvamR0L3VpL0pkdFVpUGx1Z2luLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC51aTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwpAQCAtMjEsMjcgKzIyLDI3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBKZHRVaVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewogCi0JLyoqIFRoZSBidW5kbGUtc3ltYm9saWMgbmFtZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LnVpIjsKKyAgICAvKiogVGhlIGJ1bmRsZS1zeW1ib2xpYyBuYW1lICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5qZHQudWkiOwogCi0JLyoqIElkIGZvciB0aGUgZGVjb3JhdG9yICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDT1JBVE9SX0lEID0gUExVR0lOX0lEICsgIi5ub3RBY2Nlc3NpYmxlSmF2YUVsZW1lbnREZWNvcmF0b3IiOworICAgIC8qKiBJZCBmb3IgdGhlIGRlY29yYXRvciAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ09SQVRPUl9JRCA9IFBMVUdJTl9JRCArICIubm90QWNjZXNzaWJsZUphdmFFbGVtZW50RGVjb3JhdG9yIjsKIAotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKZHRVaVBsdWdpbiBwbHVnaW47CisgICAgLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQorICAgIHByaXZhdGUgc3RhdGljIEpkdFVpUGx1Z2luIHBsdWdpbjsKIAotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KKyAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKKyAgICAgICAgcGx1Z2luID0gdGhpczsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGx1Z2luID0gbnVsbDsKKyAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIEpkdFVpUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgSmR0VWlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKKyAgICAgICAgcmV0dXJuIHBsdWdpbjsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmluZGV4IDJmNGJmN2IuLjZmZTRiZDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtNyw2ICs3LDggQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQpAQCAtODEsMzUgKzgzLDM3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249NDgKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnk9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCkBAIC0xMjAsMzAgKzEyNCwzMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbGFtYmRhX2JvZHk9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lcz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xMjAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZGlzYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvZmYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5lbmFibGluZ190YWc9QGZvcm1hdHRlclw6b24KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCkBAIC0xNTcsMTggKzE2MiwxNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQ9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbG9jYWxfdmFyaWFibGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWVtYmVyPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21ldGhvZD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYWNrYWdlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3R5cGU9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2xhYmVsPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX3R5cGVfYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKQEAgLTIxNiw2ICsyMjAsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfbGFtYmRhX2Fycm93PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydApAQCAtMjM0LDEyICsyMzksMTQgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydApAQCAtMjYzLDYgKzI3MCw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydApAQCAtMjkwLDYgKzI5OCw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfbGFtYmRhX2Fycm93PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydApAQCAtMzE4LDYgKzMyNyw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl90cnk9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKQEAgLTMyNyw2ICszMzcsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydApAQCAtMzQyLDE1ICszNTMsMTcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTEyMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTE1MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9c3BhY2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV9vbl9vZmZfdGFncz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9vcl9vcGVyYXRvcl9tdWx0aWNhdGNoPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX291dGVyX2V4cHJlc3Npb25zX3doZW5fbmVzdGVkPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFGb3JtYXR0ZXI9b3JnLmVjbGlwc2UuamR0LmNvcmUuZGVmYXVsdEphdmFGb3JtYXR0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKaW5kZXggN2U3ZmU3My4uNmM5ODAxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTEsNyArMSw2NSBAQAorY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbWV0aG9kcz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zX2ludGVyZmFjZV9tZXRob2RzPXRydWUKK2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X2Z1bmN0aW9uYWxfaW50ZXJmYWNlcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCitjbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlX2NoYW5nZXNfb25seT1mYWxzZQorY2xlYW51cC5pbnNlcnRfaW5mZXJyZWRfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV9yZWR1bmRhbnRfdHlwZV9hcmd1bWVudHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Fub255bW91c19jbGFzc19jcmVhdGlvbj1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPXRydWUKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9sYW1iZGE9dHJ1ZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3R5cGVfYXJndW1lbnRzPWZhbHNlCitjbGVhbnVwX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIENsZWFuIFVwCiBjbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIGVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X015bHluIGJhc2VkIG9uIEVjbGlwc2UKK2Zvcm1hdHRlcl9wcm9maWxlPV9WaXJnbyBXZWIgU2VydmVyIC0gQ29kZSBGb3JtYXR0ZXIKIGZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEyCiBpbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAogb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmFnZW1lbnQvcmVtb3RlL0J1bmRsZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvQnVuZGxlLmphdmEKaW5kZXggMTU5M2EzYy4uNTg1ZjEzZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvQnVuZGxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvQnVuZGxlLmphdmEKQEAgLTQsMTAgKzQsMTEgQEAKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGU7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKQEAgLTIxLDkzICsyMiw5MyBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIyODY5ODMyNzQzMTYxMDQ1N0w7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjI4Njk4MzI3NDMxNjEwNDU3TDsKIAotCXByaXZhdGUgZmluYWwgU2V0PFBhY2thZ2VFeHBvcnQ+IGV4cG9ydHMgPSBuZXcgSGFzaFNldDxQYWNrYWdlRXhwb3J0PigpOworICAgIHByaXZhdGUgZmluYWwgU2V0PFBhY2thZ2VFeHBvcnQ+IGV4cG9ydHMgPSBuZXcgSGFzaFNldDxQYWNrYWdlRXhwb3J0PigpOwogCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7CiAKLQlwcml2YXRlIGZpbmFsIFNldDxQYWNrYWdlSW1wb3J0PiBpbXBvcnRzID0gbmV3IEhhc2hTZXQ8UGFja2FnZUltcG9ydD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxQYWNrYWdlSW1wb3J0PiBpbXBvcnRzID0gbmV3IEhhc2hTZXQ8UGFja2FnZUltcG9ydD4oKTsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIHN0YXRlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHN0YXRlOwogCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3ltYm9saWNOYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHN5bWJvbGljTmFtZTsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIHZlcnNpb247CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmVyc2lvbjsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxvY2F0aW9uOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxvY2F0aW9uOwogCi0JcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwogCi0JcHJpdmF0ZSBmaW5hbCBTZXQ8U2VydmljZVJlZmVyZW5jZT4gcmVnaXN0ZXJlZFNlcnZpY2VzID0gbmV3IEhhc2hTZXQ8U2VydmljZVJlZmVyZW5jZT4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTZXJ2aWNlUmVmZXJlbmNlPiByZWdpc3RlcmVkU2VydmljZXMgPSBuZXcgSGFzaFNldDxTZXJ2aWNlUmVmZXJlbmNlPigpOwogCi0JcHJpdmF0ZSBmaW5hbCBTZXQ8U2VydmljZVJlZmVyZW5jZT4gc2VydmljZXNJblVzZSA9IG5ldyBIYXNoU2V0PFNlcnZpY2VSZWZlcmVuY2U+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U2VydmljZVJlZmVyZW5jZT4gc2VydmljZXNJblVzZSA9IG5ldyBIYXNoU2V0PFNlcnZpY2VSZWZlcmVuY2U+KCk7CiAKLQlwdWJsaWMgQnVuZGxlKFN0cmluZyBpZCwgU3RyaW5nIHN5bWJvbGljTmFtZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBzdGF0ZSwgU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCXRoaXMuc3ltYm9saWNOYW1lID0gc3ltYm9saWNOYW1lOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KKyAgICBwdWJsaWMgQnVuZGxlKFN0cmluZyBpZCwgU3RyaW5nIHN5bWJvbGljTmFtZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBzdGF0ZSwgU3RyaW5nIGxvY2F0aW9uKSB7CisgICAgICAgIHRoaXMuc3ltYm9saWNOYW1lID0gc3ltYm9saWNOYW1lOworICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOworICAgIH0KIAotCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEhlYWRlcnMoKSB7Ci0JCXJldHVybiBoZWFkZXJzOwotCX0KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRIZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJzOworICAgIH0KIAotCXB1YmxpYyBTZXQ8UGFja2FnZUV4cG9ydD4gZ2V0UGFja2FnZUV4cG9ydHMoKSB7Ci0JCXJldHVybiBleHBvcnRzOwotCX0KKyAgICBwdWJsaWMgU2V0PFBhY2thZ2VFeHBvcnQ+IGdldFBhY2thZ2VFeHBvcnRzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5leHBvcnRzOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaWQ7CisgICAgfQogCi0JcHVibGljIFNldDxQYWNrYWdlSW1wb3J0PiBnZXRQYWNrYWdlSW1wb3J0cygpIHsKLQkJcmV0dXJuIGltcG9ydHM7Ci0JfQorICAgIHB1YmxpYyBTZXQ8UGFja2FnZUltcG9ydD4gZ2V0UGFja2FnZUltcG9ydHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmltcG9ydHM7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRTdGF0ZSgpIHsKLQkJcmV0dXJuIHN0YXRlOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZTsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGdldFN5bWJvbGljTmFtZSgpIHsKLQkJcmV0dXJuIHN5bWJvbGljTmFtZTsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRTeW1ib2xpY05hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN5bWJvbGljTmFtZTsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnZlcnNpb247CisgICAgfQogCi0JcHVibGljIHZvaWQgYWRkUGFja2FnZUV4cG9ydChQYWNrYWdlRXhwb3J0IHBlKSB7Ci0JCXRoaXMuZXhwb3J0cy5hZGQocGUpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBhZGRQYWNrYWdlRXhwb3J0KFBhY2thZ2VFeHBvcnQgcGUpIHsKKyAgICAgICAgdGhpcy5leHBvcnRzLmFkZChwZSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgYWRkUGFja2FnZUltcG9ydChQYWNrYWdlSW1wb3J0IHBpKSB7Ci0JCXRoaXMuaW1wb3J0cy5hZGQocGkpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBhZGRQYWNrYWdlSW1wb3J0KFBhY2thZ2VJbXBvcnQgcGkpIHsKKyAgICAgICAgdGhpcy5pbXBvcnRzLmFkZChwaSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgYWRkUmVnaXN0ZXJlZFNlcnZpY2UoU2VydmljZVJlZmVyZW5jZSBwaSkgewotCQl0aGlzLnJlZ2lzdGVyZWRTZXJ2aWNlcy5hZGQocGkpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBhZGRSZWdpc3RlcmVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHBpKSB7CisgICAgICAgIHRoaXMucmVnaXN0ZXJlZFNlcnZpY2VzLmFkZChwaSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgYWRkVXNpbmdTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcGkpIHsKLQkJdGhpcy5zZXJ2aWNlc0luVXNlLmFkZChwaSk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGFkZFVzaW5nU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHBpKSB7CisgICAgICAgIHRoaXMuc2VydmljZXNJblVzZS5hZGQocGkpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5oZWFkZXJzLnB1dChrZXksIHZhbHVlKTsKLQl9CisgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLmhlYWRlcnMucHV0KGtleSwgdmFsdWUpOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb247CisgICAgfQogCi0JcHVibGljIFNldDxTZXJ2aWNlUmVmZXJlbmNlPiBnZXRSZWdpc3RlcmVkU2VydmljZXMoKSB7Ci0JCXJldHVybiByZWdpc3RlcmVkU2VydmljZXM7Ci0JfQorICAgIHB1YmxpYyBTZXQ8U2VydmljZVJlZmVyZW5jZT4gZ2V0UmVnaXN0ZXJlZFNlcnZpY2VzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlcmVkU2VydmljZXM7CisgICAgfQogCi0JcHVibGljIFNldDxTZXJ2aWNlUmVmZXJlbmNlPiBnZXRTZXJ2aWNlc0luVXNlKCkgewotCQlyZXR1cm4gc2VydmljZXNJblVzZTsKLQl9CisgICAgcHVibGljIFNldDxTZXJ2aWNlUmVmZXJlbmNlPiBnZXRTZXJ2aWNlc0luVXNlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlc0luVXNlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmFnZW1lbnQvcmVtb3RlL0J1bmRsZUFkbWluLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5hZ2VtZW50L3JlbW90ZS9CdW5kbGVBZG1pbi5qYXZhCmluZGV4IDI3NTg1MzguLmFjZjIzMDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmFnZW1lbnQvcmVtb3RlL0J1bmRsZUFkbWluLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvQnVuZGxlQWRtaW4uamF2YQpAQCAtNCwxMCArNCwxMSBAQAogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAorICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZTsKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0xNyw4ICsxOCw4IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQnVuZGxlQWRtaW4gewogCi0JTWFwPExvbmcsIEJ1bmRsZT4gcmV0cmlldmVCdW5kbGVzKCk7CisgICAgTWFwPExvbmcsIEJ1bmRsZT4gcmV0cmlldmVCdW5kbGVzKCk7CiAKLQlTdHJpbmcgZXhlY3V0ZShTdHJpbmcgY21kTGluZSk7CisgICAgU3RyaW5nIGV4ZWN1dGUoU3RyaW5nIGNtZExpbmUpOwogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5hZ2VtZW50L3JlbW90ZS9QYWNrYWdlRXhwb3J0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5hZ2VtZW50L3JlbW90ZS9QYWNrYWdlRXhwb3J0LmphdmEKaW5kZXggYTgzNjA2Ni4uYjIwOTc5MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvUGFja2FnZUV4cG9ydC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmFnZW1lbnQvcmVtb3RlL1BhY2thZ2VFeHBvcnQuamF2YQpAQCAtNCwxMCArNCwxMSBAQAogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAorICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZTsKIAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwpAQCAtMTcsMjkgKzE4LDI5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQYWNrYWdlRXhwb3J0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00Nzk4MDEyNzgxNTQyNTI0MTU5TDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDc5ODAxMjc4MTU0MjUyNDE1OUw7CiAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CiAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyB2ZXJzaW9uOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZlcnNpb247CiAKLQlwdWJsaWMgUGFja2FnZUV4cG9ydChTdHJpbmcgbmFtZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9CisgICAgcHVibGljIFBhY2thZ2VFeHBvcnQoU3RyaW5nIG5hbWUsIFN0cmluZyB2ZXJzaW9uKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgfQogCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQogCi0JLyoqCi0JICogQHJldHVybiB0aGUgdmVyc2lvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHZlcnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnZlcnNpb247CisgICAgfQogCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvUGFja2FnZUltcG9ydC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvUGFja2FnZUltcG9ydC5qYXZhCmluZGV4IGUwNTY4OGYuLjAwMjc4ODIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmFnZW1lbnQvcmVtb3RlL1BhY2thZ2VJbXBvcnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5hZ2VtZW50L3JlbW90ZS9QYWNrYWdlSW1wb3J0LmphdmEKQEAgLTQsMTAgKzQsMTEgQEAKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGU7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKQEAgLTE3LDM5ICsxOCwzOSBAQAogICovCiBwdWJsaWMgY2xhc3MgUGFja2FnZUltcG9ydCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4Mzc2NDkxMDM3OTI2NDE1MTUxTDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4Mzc2NDkxMDM3OTI2NDE1MTUxTDsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIHZlcnNpb247CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmVyc2lvbjsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIHN1cHBsaWVySWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3VwcGxpZXJJZDsKIAotCXB1YmxpYyBQYWNrYWdlSW1wb3J0KFN0cmluZyBuYW1lLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHN1cHBsaWVySWQpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5zdXBwbGllcklkID0gc3VwcGxpZXJJZDsKLQl9CisgICAgcHVibGljIFBhY2thZ2VJbXBvcnQoU3RyaW5nIG5hbWUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgc3VwcGxpZXJJZCkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICB0aGlzLnN1cHBsaWVySWQgPSBzdXBwbGllcklkOworICAgIH0KIAotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KIAotCS8qKgotCSAqIEByZXR1cm4gdGhlIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uOworICAgIH0KIAotCS8qKgotCSAqIEByZXR1cm4gdGhlIHN1cHBsaWVySWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN1cHBsaWVySWQoKSB7Ci0JCXJldHVybiBzdXBwbGllcklkOwotCX0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBzdXBwbGllcklkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdXBwbGllcklkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zdXBwbGllcklkOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvU2VydmljZVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvU2VydmljZVJlZmVyZW5jZS5qYXZhCmluZGV4IDAxZGZmM2UuLmQ0NzIwYmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmFnZW1lbnQvcmVtb3RlL1NlcnZpY2VSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5hZ2VtZW50L3JlbW90ZS9TZXJ2aWNlUmVmZXJlbmNlLmphdmEKQEAgLTQsMTAgKzQsMTEgQEAKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGU7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKQEAgLTIxLDU2ICsyMiw1NiBAQAogICovCiBwdWJsaWMgY2xhc3MgU2VydmljZVJlZmVyZW5jZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAKLQlwdWJsaWMgZW51bSBUeXBlIHsKLQkJSU5fVVNFLCBSRUdJU1RFUkVECi0JfQorICAgIHB1YmxpYyBlbnVtIFR5cGUgeworICAgICAgICBJTl9VU0UsIFJFR0lTVEVSRUQKKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDg5NjkyNDYwMDI0NjE4NzkxNEw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ4OTY5MjQ2MDAyNDYxODc5MTRMOwogCi0JcHJpdmF0ZSBmaW5hbCBMb25nIGJ1bmRsZUlkOworICAgIHByaXZhdGUgZmluYWwgTG9uZyBidW5kbGVJZDsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nW10gY2xhenplczsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGNsYXp6ZXM7CiAKLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAKLQlwcml2YXRlIGZpbmFsIFNldDxMb25nPiB1c2luZ0J1bmRsZXMgPSBuZXcgSGFzaFNldDxMb25nPigpOworICAgIHByaXZhdGUgZmluYWwgU2V0PExvbmc+IHVzaW5nQnVuZGxlcyA9IG5ldyBIYXNoU2V0PExvbmc+KCk7CiAKLQlwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKIAotCXB1YmxpYyBTZXJ2aWNlUmVmZXJlbmNlKFR5cGUgdHlwZSwgTG9uZyBidW5kbGVJZCwgU3RyaW5nW10gY2xhenplcykgewotCQl0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7Ci0JCXRoaXMuY2xhenplcyA9IGNsYXp6ZXM7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQorICAgIHB1YmxpYyBTZXJ2aWNlUmVmZXJlbmNlKFR5cGUgdHlwZSwgTG9uZyBidW5kbGVJZCwgU3RyaW5nW10gY2xhenplcykgeworICAgICAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7CisgICAgICAgIHRoaXMuY2xhenplcyA9IGNsYXp6ZXM7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQogCi0JcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXM7CisgICAgfQogCi0JcHVibGljIFN0cmluZ1tdIGdldENsYXp6ZXMoKSB7Ci0JCXJldHVybiBjbGF6emVzOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhenplcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2xhenplczsKKyAgICB9CiAKLQlwdWJsaWMgU2V0PExvbmc+IGdldFVzaW5nQnVuZGxlSWRzKCkgewotCQlyZXR1cm4gdXNpbmdCdW5kbGVzOwotCX0KKyAgICBwdWJsaWMgU2V0PExvbmc+IGdldFVzaW5nQnVuZGxlSWRzKCkgeworICAgICAgICByZXR1cm4gdGhpcy51c2luZ0J1bmRsZXM7CisgICAgfQogCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMucHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIGFkZFVzaW5nQnVuZGxlKExvbmcgaWQpIHsKLQkJdGhpcy51c2luZ0J1bmRsZXMuYWRkKGlkKTsKLQl9CisgICAgcHVibGljIHZvaWQgYWRkVXNpbmdCdW5kbGUoTG9uZyBpZCkgeworICAgICAgICB0aGlzLnVzaW5nQnVuZGxlcy5hZGQoaWQpOworICAgIH0KIAotCXB1YmxpYyBMb25nIGdldEJ1bmRsZUlkKCkgewotCQlyZXR1cm4gYnVuZGxlSWQ7Ci0JfQorICAgIHB1YmxpYyBMb25nIGdldEJ1bmRsZUlkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5idW5kbGVJZDsKKyAgICB9CiAKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0eXBlCi0JICovCi0JcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQorICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmFnZW1lbnQvcmVtb3RlL1N0YW5kYXJkQnVuZGxlQWRtaW4uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmFnZW1lbnQvcmVtb3RlL1N0YW5kYXJkQnVuZGxlQWRtaW4uamF2YQppbmRleCBmNzYyYWVlLi4xMGY0OTE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5hZ2VtZW50L3JlbW90ZS9TdGFuZGFyZEJ1bmRsZUFkbWluLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvU3RhbmRhcmRCdW5kbGVBZG1pbi5qYXZhCkBAIC00LDExICs0LDEyIEBACiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCisgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc29uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICogICAgIFNBUCBBRyAtIHN1cHBvcnQgZm9yIG5ldyBlcXVpbm94IGNvbnNvbGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZTsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwpAQCAtMjMsNyArMjQsNiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5mZWxpeC5zZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZFByb2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmZlbGl4LnNlcnZpY2UuY29tbWFuZC5Db21tYW5kU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZW1pbmkuYmx1ZXByaW50LnV0aWwuT3NnaVNlcnZpY2VSZWZlcmVuY2VVdGlsczsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuQnVuZGxlRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLkV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuUGxhdGZvcm1BZG1pbjsKQEAgLTMxLDggKzMxLDYgQEAKIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKIGltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5qbXguZXhwb3J0LmFubm90YXRpb24uTWFuYWdlZE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmpteC5leHBvcnQuYW5ub3RhdGlvbi5NYW5hZ2VkUmVzb3VyY2U7CiAKIC8qKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCkBAIC00MCwxODMgKzM4LDE3OCBAQAogQE1hbmFnZWRSZXNvdXJjZShvYmplY3ROYW1lID0gIm9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbDp0eXBlPUJ1bmRsZUFkbWluIiwgZGVzY3JpcHRpb24gPSAiVmlyZ28gSURFIENvbm5lY3RvciBCZWFuIikKIHB1YmxpYyBjbGFzcyBTdGFuZGFyZEJ1bmRsZUFkbWluIGltcGxlbWVudHMgQnVuZGxlQWRtaW4gewogCi0JcHJpdmF0ZSBmaW5hbCBQbGF0Zm9ybUFkbWluIHBsYXRmb3JtQWRtaW47CisgICAgcHJpdmF0ZSBmaW5hbCBQbGF0Zm9ybUFkbWluIHBsYXRmb3JtQWRtaW47CiAKLQlwcml2YXRlIGZpbmFsIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsKIAotCXByaXZhdGUgZmluYWwgU2VydmljZVRyYWNrZXI8Q29tbWFuZFByb2Nlc3NvciwgQ29tbWFuZFByb2Nlc3Nvcj4gY29tbWFuZFByb2Nlc3NvclRyYWNrZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlVHJhY2tlcjxDb21tYW5kUHJvY2Vzc29yLCBDb21tYW5kUHJvY2Vzc29yPiBjb21tYW5kUHJvY2Vzc29yVHJhY2tlcjsKIAotCXB1YmxpYyBTdGFuZGFyZEJ1bmRsZUFkbWluKFBsYXRmb3JtQWRtaW4gcGxhdGZvcm1BZG1pbiwgLypQYWNrYWdlQWRtaW4gcGFja2FnZUFkbWluLCovQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB7Ci0JCXRoaXMucGxhdGZvcm1BZG1pbiA9IHBsYXRmb3JtQWRtaW47Ci0JCXRoaXMuYnVuZGxlQ29udGV4dCA9IGJ1bmRsZUNvbnRleHQ7Ci0JCXRoaXMuY29tbWFuZFByb2Nlc3NvclRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXI8Q29tbWFuZFByb2Nlc3NvciwgQ29tbWFuZFByb2Nlc3Nvcj4oYnVuZGxlQ29udGV4dCwKLQkJCQlDb21tYW5kUHJvY2Vzc29yLmNsYXNzLCBudWxsKTsKLQkJdGhpcy5jb21tYW5kUHJvY2Vzc29yVHJhY2tlci5vcGVuKCk7Ci0JfQorICAgIHB1YmxpYyBTdGFuZGFyZEJ1bmRsZUFkbWluKFBsYXRmb3JtQWRtaW4gcGxhdGZvcm1BZG1pbiwgLyogUGFja2FnZUFkbWluIHBhY2thZ2VBZG1pbiwgKi9CdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHsKKyAgICAgICAgdGhpcy5wbGF0Zm9ybUFkbWluID0gcGxhdGZvcm1BZG1pbjsKKyAgICAgICAgdGhpcy5idW5kbGVDb250ZXh0ID0gYnVuZGxlQ29udGV4dDsKKyAgICAgICAgdGhpcy5jb21tYW5kUHJvY2Vzc29yVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcjxDb21tYW5kUHJvY2Vzc29yLCBDb21tYW5kUHJvY2Vzc29yPihidW5kbGVDb250ZXh0LCBDb21tYW5kUHJvY2Vzc29yLmNsYXNzLCBudWxsKTsKKyAgICAgICAgdGhpcy5jb21tYW5kUHJvY2Vzc29yVHJhY2tlci5vcGVuKCk7CisgICAgfQogCi0JQE1hbmFnZWRPcGVyYXRpb24oZGVzY3JpcHRpb24gPSAiU3RvcCB0aGUgZ2l2ZW4gYnVuZGxlIikKLQlwdWJsaWMgdm9pZCBzdG9wKGxvbmcgYnVuZGxlSWQpIHsKLQkJZXhlY3V0ZSgic3RvcCAiICsgYnVuZGxlSWQpOwotCX0KKyAgICBATWFuYWdlZE9wZXJhdGlvbihkZXNjcmlwdGlvbiA9ICJTdG9wIHRoZSBnaXZlbiBidW5kbGUiKQorICAgIHB1YmxpYyB2b2lkIHN0b3AobG9uZyBidW5kbGVJZCkgeworICAgICAgICBleGVjdXRlKCJzdG9wICIgKyBidW5kbGVJZCk7CisgICAgfQogCi0JQE1hbmFnZWRPcGVyYXRpb24oZGVzY3JpcHRpb24gPSAiU3RhcnQgdGhlIGdpdmVuIGJ1bmRsZSIpCi0JcHVibGljIHZvaWQgc3RhcnQobG9uZyBidW5kbGVJZCkgewotCQlleGVjdXRlKCJzdGFydCAiICsgYnVuZGxlSWQpOwotCX0KKyAgICBATWFuYWdlZE9wZXJhdGlvbihkZXNjcmlwdGlvbiA9ICJTdGFydCB0aGUgZ2l2ZW4gYnVuZGxlIikKKyAgICBwdWJsaWMgdm9pZCBzdGFydChsb25nIGJ1bmRsZUlkKSB7CisgICAgICAgIGV4ZWN1dGUoInN0YXJ0ICIgKyBidW5kbGVJZCk7CisgICAgfQogCi0JQE1hbmFnZWRPcGVyYXRpb24oZGVzY3JpcHRpb24gPSAiUmVmcmVzaCB0aGUgZ2l2ZW4gYnVuZGxlIikKLQlwdWJsaWMgdm9pZCByZWZyZXNoKGxvbmcgYnVuZGxlSWQpIHsKLQkJZXhlY3V0ZSgicmVmcmVzaCAiICsgYnVuZGxlSWQpOwotCX0KKyAgICBATWFuYWdlZE9wZXJhdGlvbihkZXNjcmlwdGlvbiA9ICJSZWZyZXNoIHRoZSBnaXZlbiBidW5kbGUiKQorICAgIHB1YmxpYyB2b2lkIHJlZnJlc2gobG9uZyBidW5kbGVJZCkgeworICAgICAgICBleGVjdXRlKCJyZWZyZXNoICIgKyBidW5kbGVJZCk7CisgICAgfQogCi0JQE1hbmFnZWRPcGVyYXRpb24oZGVzY3JpcHRpb24gPSAiUmVmcmVzaCB0aGUgZ2l2ZW4gYnVuZGxlIikKLQlwdWJsaWMgdm9pZCB1cGRhdGUobG9uZyBidW5kbGVJZCkgewotCQlleGVjdXRlKCJ1cGRhdGUgIiArIGJ1bmRsZUlkKTsKLQl9CisgICAgQE1hbmFnZWRPcGVyYXRpb24oZGVzY3JpcHRpb24gPSAiUmVmcmVzaCB0aGUgZ2l2ZW4gYnVuZGxlIikKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUobG9uZyBidW5kbGVJZCkgeworICAgICAgICBleGVjdXRlKCJ1cGRhdGUgIiArIGJ1bmRsZUlkKTsKKyAgICB9CiAKLQlATWFuYWdlZE9wZXJhdGlvbihkZXNjcmlwdGlvbiA9ICJFeGVjdXRlcyB0aGUgZ2l2ZW4gY29tbWFuZCIpCi0JcHVibGljIFN0cmluZyBleGVjdXRlKFN0cmluZyBjbWRMaW5lKSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JCVN0cmluZ0J1ZmZlcklucHV0U3RyZWFtIGluID0gbmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKCIiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKG91dHB1dCk7CisgICAgQE1hbmFnZWRPcGVyYXRpb24oZGVzY3JpcHRpb24gPSAiRXhlY3V0ZXMgdGhlIGdpdmVuIGNvbW1hbmQiKQorICAgIHB1YmxpYyBTdHJpbmcgZXhlY3V0ZShTdHJpbmcgY21kTGluZSkgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgICAgICBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSBpbiA9IG5ldyBTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSgiIik7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIFByaW50U3RyZWFtIG91dCA9IG5ldyBQcmludFN0cmVhbShvdXRwdXQpOwogCi0JCXRyeSB7Ci0JCQlDb21tYW5kUHJvY2Vzc29yIGNvbW1hbmRQcm9jZXNzb3IgPSBjb21tYW5kUHJvY2Vzc29yVHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0JCQlpZiAoY29tbWFuZFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQkJQ29tbWFuZFNlc3Npb24gY29tbWFuZFNlc3Npb24gPSBjb21tYW5kUHJvY2Vzc29yLmNyZWF0ZVNlc3Npb24oaW4sIG91dCwgb3V0KTsKLQkJCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlyZXN1bHQgPSBjb21tYW5kU2Vzc2lvbi5leGVjdXRlKGNtZExpbmUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKG91dCk7Ci0JCQkJCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9ICIiOwotCQkJCX0KLQkJCQlyZXR1cm4gb3V0cHV0LnRvU3RyaW5nKCkgKyAiXG4iICsgcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gIk5vIENvbW1hbmRQcm9jZXNzb3IgcmVnaXN0ZXJlZDsgY2Fubm90IGV4ZWN1dGUgY29tbWFuZHMiOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlvdXQuY2xvc2UoKTsKLQkJCQlvdXRwdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENvbW1hbmRQcm9jZXNzb3IgY29tbWFuZFByb2Nlc3NvciA9IHRoaXMuY29tbWFuZFByb2Nlc3NvclRyYWNrZXIuZ2V0U2VydmljZSgpOworICAgICAgICAgICAgaWYgKGNvbW1hbmRQcm9jZXNzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENvbW1hbmRTZXNzaW9uIGNvbW1hbmRTZXNzaW9uID0gY29tbWFuZFByb2Nlc3Nvci5jcmVhdGVTZXNzaW9uKGluLCBvdXQsIG91dCk7CisgICAgICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tbWFuZFNlc3Npb24uZXhlY3V0ZShjbWRMaW5lKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShvdXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0LnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAiIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dC50b1N0cmluZygpICsgIlxuIiArIHJlc3VsdC50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJObyBDb21tYW5kUHJvY2Vzc29yIHJlZ2lzdGVyZWQ7IGNhbm5vdCBleGVjdXRlIGNvbW1hbmRzIjsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlATWFuYWdlZE9wZXJhdGlvbihkZXNjcmlwdGlvbiA9ICJSZXR1cm5zIHRoZSBjdXJyZW50IE9TR2kgQnVuZGxlcyIpCi0JcHVibGljIE1hcDxMb25nLCBCdW5kbGU+IHJldHJpZXZlQnVuZGxlcygpIHsKLQkJTWFwPExvbmcsIEJ1bmRsZT4gYnVuZGxlcyA9IG5ldyBIYXNoTWFwPExvbmcsIEJ1bmRsZT4oKTsKLQkJZm9yIChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlIGIgOiBidW5kbGVDb250ZXh0LmdldEJ1bmRsZXMoKSkgeworICAgIEBNYW5hZ2VkT3BlcmF0aW9uKGRlc2NyaXB0aW9uID0gIlJldHVybnMgdGhlIGN1cnJlbnQgT1NHaSBCdW5kbGVzIikKKyAgICBwdWJsaWMgTWFwPExvbmcsIEJ1bmRsZT4gcmV0cmlldmVCdW5kbGVzKCkgeworICAgICAgICBNYXA8TG9uZywgQnVuZGxlPiBidW5kbGVzID0gbmV3IEhhc2hNYXA8TG9uZywgQnVuZGxlPigpOworICAgICAgICBmb3IgKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUgYiA6IHRoaXMuYnVuZGxlQ29udGV4dC5nZXRCdW5kbGVzKCkpIHsKIAotCQkJT2JqZWN0IHZlcnNpb24gPSBiLmdldEhlYWRlcnMoKS5nZXQoIkJ1bmRsZS1WZXJzaW9uIik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZShMb25nLnRvU3RyaW5nKGIuZ2V0QnVuZGxlSWQoKSksIGIuZ2V0U3ltYm9saWNOYW1lKCksICh2ZXJzaW9uICE9IG51bGwKLQkJCQkJPyB2ZXJzaW9uLnRvU3RyaW5nKCkKLQkJCQkJOiAiMCIpLCBnZXRTdGF0ZShiKSwgYi5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIE9iamVjdCB2ZXJzaW9uID0gYi5nZXRIZWFkZXJzKCkuZ2V0KCJCdW5kbGUtVmVyc2lvbiIpOworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoTG9uZy50b1N0cmluZyhiLmdldEJ1bmRsZUlkKCkpLCBiLmdldFN5bWJvbGljTmFtZSgpLCB2ZXJzaW9uICE9IG51bGwgPyB2ZXJzaW9uLnRvU3RyaW5nKCkgOiAiMCIsIGdldFN0YXRlKGIpLAorICAgICAgICAgICAgICAgIGIuZ2V0TG9jYXRpb24oKSk7CiAKLQkJCURpY3Rpb25hcnk8PywgPz4gaGVhZGVycyA9IGIuZ2V0SGVhZGVycygpOwotCQkJRW51bWVyYXRpb248Pz4ga2V5cyA9IGhlYWRlcnMua2V5cygpOwotCQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJCU9iamVjdCB2YWx1ZSA9IGhlYWRlcnMuZ2V0KGtleSk7Ci0JCQkJYnVuZGxlLmFkZEhlYWRlcihrZXkudG9TdHJpbmcoKSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0JCQl9CisgICAgICAgICAgICBEaWN0aW9uYXJ5PD8sID8+IGhlYWRlcnMgPSBiLmdldEhlYWRlcnMoKTsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uPD8+IGtleXMgPSBoZWFkZXJzLmtleXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IGtleXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBoZWFkZXJzLmdldChrZXkpOworICAgICAgICAgICAgICAgIGJ1bmRsZS5hZGRIZWFkZXIoa2V5LnRvU3RyaW5nKCksIHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQogCi0JCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVEZXNjcmlwdGlvbiA9IHBsYXRmb3JtQWRtaW4uZ2V0U3RhdGUoZmFsc2UpLmdldEJ1bmRsZShiLmdldEJ1bmRsZUlkKCkpOworICAgICAgICAgICAgQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlRGVzY3JpcHRpb24gPSB0aGlzLnBsYXRmb3JtQWRtaW4uZ2V0U3RhdGUoZmFsc2UpLmdldEJ1bmRsZShiLmdldEJ1bmRsZUlkKCkpOwogCi0JCQlFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBvcnRlZFBhY2thZ2VzID0gYnVuZGxlRGVzY3JpcHRpb24uZ2V0RXhwb3J0UGFja2FnZXMoKTsKKyAgICAgICAgICAgIEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdIGV4cG9ydGVkUGFja2FnZXMgPSBidW5kbGVEZXNjcmlwdGlvbi5nZXRFeHBvcnRQYWNrYWdlcygpOwogCi0JCQlpZiAoZXhwb3J0ZWRQYWNrYWdlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gZXhwb3J0ZWRQYWNrYWdlIDogZXhwb3J0ZWRQYWNrYWdlcykgewotCQkJCQlQYWNrYWdlRXhwb3J0IHBhY2thZ2VFeHBvcnQgPSBuZXcgUGFja2FnZUV4cG9ydChleHBvcnRlZFBhY2thZ2UuZ2V0TmFtZSgpLAotCQkJCQkJCShleHBvcnRlZFBhY2thZ2UuZ2V0VmVyc2lvbigpICE9IG51bGwgPyBleHBvcnRlZFBhY2thZ2UuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkgOiAiMCIpKTsKLQkJCQkJYnVuZGxlLmFkZFBhY2thZ2VFeHBvcnQocGFja2FnZUV4cG9ydCk7Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgaWYgKGV4cG9ydGVkUGFja2FnZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGV4cG9ydGVkUGFja2FnZSA6IGV4cG9ydGVkUGFja2FnZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgUGFja2FnZUV4cG9ydCBwYWNrYWdlRXhwb3J0ID0gbmV3IFBhY2thZ2VFeHBvcnQoZXhwb3J0ZWRQYWNrYWdlLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGVkUGFja2FnZS5nZXRWZXJzaW9uKCkgIT0gbnVsbCA/IGV4cG9ydGVkUGFja2FnZS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSA6ICIwIik7CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5hZGRQYWNrYWdlRXhwb3J0KHBhY2thZ2VFeHBvcnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gdmlzaWJsZVBhY2thZ2VzID0gcGxhdGZvcm1BZG1pbi5nZXRTdGF0ZUhlbHBlcigpLmdldFZpc2libGVQYWNrYWdlcygKLQkJCQkJYnVuZGxlRGVzY3JpcHRpb24pOworICAgICAgICAgICAgRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gdmlzaWJsZVBhY2thZ2VzID0gdGhpcy5wbGF0Zm9ybUFkbWluLmdldFN0YXRlSGVscGVyKCkuZ2V0VmlzaWJsZVBhY2thZ2VzKGJ1bmRsZURlc2NyaXB0aW9uKTsKIAotCQkJaWYgKHZpc2libGVQYWNrYWdlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb24gdmlzaWJsZVBhY2thZ2UgOiB2aXNpYmxlUGFja2FnZXMpIHsKLQkJCQkJUGFja2FnZUltcG9ydCBwYWNrYWdlSW1wb3J0ID0gbmV3IFBhY2thZ2VJbXBvcnQodmlzaWJsZVBhY2thZ2UuZ2V0TmFtZSgpLAotCQkJCQkJCSh2aXNpYmxlUGFja2FnZS5nZXRWZXJzaW9uKCkgIT0gbnVsbCA/IHZpc2libGVQYWNrYWdlLmdldFZlcnNpb24oKS50b1N0cmluZygpIDogIjAiKSwKLQkJCQkJCQlMb25nLnRvU3RyaW5nKHZpc2libGVQYWNrYWdlLmdldFN1cHBsaWVyKCkuZ2V0QnVuZGxlSWQoKSkpOwotCQkJCQlidW5kbGUuYWRkUGFja2FnZUltcG9ydChwYWNrYWdlSW1wb3J0KTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBpZiAodmlzaWJsZVBhY2thZ2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiB2aXNpYmxlUGFja2FnZSA6IHZpc2libGVQYWNrYWdlcykgeworICAgICAgICAgICAgICAgICAgICBQYWNrYWdlSW1wb3J0IHBhY2thZ2VJbXBvcnQgPSBuZXcgUGFja2FnZUltcG9ydCh2aXNpYmxlUGFja2FnZS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlUGFja2FnZS5nZXRWZXJzaW9uKCkgIT0gbnVsbCA/IHZpc2libGVQYWNrYWdlLmdldFZlcnNpb24oKS50b1N0cmluZygpIDogIjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyh2aXNpYmxlUGFja2FnZS5nZXRTdXBwbGllcigpLmdldEJ1bmRsZUlkKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmFkZFBhY2thZ2VJbXBvcnQocGFja2FnZUltcG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlpZiAoYi5nZXRSZWdpc3RlcmVkU2VydmljZXMoKSAhPSBudWxsKSB7Ci0JCQkJZm9yIChTZXJ2aWNlUmVmZXJlbmNlIHJlZiA6IGIuZ2V0UmVnaXN0ZXJlZFNlcnZpY2VzKCkpIHsKLQkJCQkJb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlLlNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gbmV3IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZS5TZXJ2aWNlUmVmZXJlbmNlKAotCQkJCQkJCVR5cGUuUkVHSVNURVJFRCwgcmVmLmdldEJ1bmRsZSgpLmdldEJ1bmRsZUlkKCksCi0JCQkJCQkJT3NnaVNlcnZpY2VSZWZlcmVuY2VVdGlscy5nZXRTZXJ2aWNlT2JqZWN0Q2xhc3NlcyhyZWYpKTsKLQkJCQkJTWFwPD8sID8+IHByb3BzID0gT3NnaVNlcnZpY2VSZWZlcmVuY2VVdGlscy5nZXRTZXJ2aWNlUHJvcGVydGllc0FzTWFwKHJlZik7Ci0JCQkJCWZvciAoT2JqZWN0IGtleSA6IHByb3BzLmtleVNldCgpKSB7Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXQoa2V5KS50b1N0cmluZygpOwotCQkJCQkJaWYgKHByb3BzLmdldChrZXkpLmdldENsYXNzKCkuaXNBcnJheSgpKSB7Ci0JCQkJCQkJdmFsdWUgPSBBcnJheXMuZGVlcFRvU3RyaW5nKChPYmplY3RbXSkgcHJvcHMuZ2V0KGtleSkpOwotCQkJCQkJfQotCQkJCQkJcmVmZXJlbmNlLmFkZFByb3BlcnR5KGtleS50b1N0cmluZygpLCB2YWx1ZSk7Ci0JCQkJCX0KKyAgICAgICAgICAgIGlmIChiLmdldFJlZ2lzdGVyZWRTZXJ2aWNlcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFNlcnZpY2VSZWZlcmVuY2UgcmVmIDogYi5nZXRSZWdpc3RlcmVkU2VydmljZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGUuU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlLlNlcnZpY2VSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBUeXBlLlJFR0lTVEVSRUQsIHJlZi5nZXRCdW5kbGUoKS5nZXRCdW5kbGVJZCgpLCBPc2dpU2VydmljZVJlZmVyZW5jZVV0aWxzLmdldFNlcnZpY2VPYmplY3RDbGFzc2VzKHJlZikpOworICAgICAgICAgICAgICAgICAgICBNYXA8PywgPz4gcHJvcHMgPSBPc2dpU2VydmljZVJlZmVyZW5jZVV0aWxzLmdldFNlcnZpY2VQcm9wZXJ0aWVzQXNNYXAocmVmKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3Qga2V5IDogcHJvcHMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb3BzLmdldChrZXkpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcHMuZ2V0KGtleSkuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEFycmF5cy5kZWVwVG9TdHJpbmcoKE9iamVjdFtdKSBwcm9wcy5nZXQoa2V5KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UuYWRkUHJvcGVydHkoa2V5LnRvU3RyaW5nKCksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCWlmIChyZWYuZ2V0VXNpbmdCdW5kbGVzKCkgIT0gbnVsbCkgewotCQkJCQkJZm9yIChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlIHVzaW5nQnVuZGxlIDogcmVmLmdldFVzaW5nQnVuZGxlcygpKSB7Ci0JCQkJCQkJcmVmZXJlbmNlLmFkZFVzaW5nQnVuZGxlKHVzaW5nQnVuZGxlLmdldEJ1bmRsZUlkKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJ1bmRsZS5hZGRSZWdpc3RlcmVkU2VydmljZShyZWZlcmVuY2UpOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZi5nZXRVc2luZ0J1bmRsZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUgdXNpbmdCdW5kbGUgOiByZWYuZ2V0VXNpbmdCdW5kbGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UuYWRkVXNpbmdCdW5kbGUodXNpbmdCdW5kbGUuZ2V0QnVuZGxlSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmFkZFJlZ2lzdGVyZWRTZXJ2aWNlKHJlZmVyZW5jZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlpZiAoYi5nZXRTZXJ2aWNlc0luVXNlKCkgIT0gbnVsbCkgewotCQkJCWZvciAoU2VydmljZVJlZmVyZW5jZSByZWYgOiBiLmdldFNlcnZpY2VzSW5Vc2UoKSkgewotCQkJCQlvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGUuU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlLlNlcnZpY2VSZWZlcmVuY2UoCi0JCQkJCQkJVHlwZS5JTl9VU0UsIHJlZi5nZXRCdW5kbGUoKS5nZXRCdW5kbGVJZCgpLAotCQkJCQkJCU9zZ2lTZXJ2aWNlUmVmZXJlbmNlVXRpbHMuZ2V0U2VydmljZU9iamVjdENsYXNzZXMocmVmKSk7Ci0JCQkJCU1hcDw/LCA/PiBwcm9wcyA9IE9zZ2lTZXJ2aWNlUmVmZXJlbmNlVXRpbHMuZ2V0U2VydmljZVByb3BlcnRpZXNBc01hcChyZWYpOwotCQkJCQlmb3IgKE9iamVjdCBrZXkgOiBwcm9wcy5rZXlTZXQoKSkgewotCQkJCQkJU3RyaW5nIHZhbHVlID0gcHJvcHMuZ2V0KGtleSkudG9TdHJpbmcoKTsKLQkJCQkJCWlmIChwcm9wcy5nZXQoa2V5KS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgewotCQkJCQkJCXZhbHVlID0gQXJyYXlzLmRlZXBUb1N0cmluZygoT2JqZWN0W10pIHByb3BzLmdldChrZXkpKTsKLQkJCQkJCX0KLQkJCQkJCXJlZmVyZW5jZS5hZGRQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSwgdmFsdWUpOwotCQkJCQl9CisgICAgICAgICAgICBpZiAoYi5nZXRTZXJ2aWNlc0luVXNlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoU2VydmljZVJlZmVyZW5jZSByZWYgOiBiLmdldFNlcnZpY2VzSW5Vc2UoKSkgeworICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGUuU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlLlNlcnZpY2VSZWZlcmVuY2UoCisgICAgICAgICAgICAgICAgICAgICAgICBUeXBlLklOX1VTRSwgcmVmLmdldEJ1bmRsZSgpLmdldEJ1bmRsZUlkKCksIE9zZ2lTZXJ2aWNlUmVmZXJlbmNlVXRpbHMuZ2V0U2VydmljZU9iamVjdENsYXNzZXMocmVmKSk7CisgICAgICAgICAgICAgICAgICAgIE1hcDw/LCA/PiBwcm9wcyA9IE9zZ2lTZXJ2aWNlUmVmZXJlbmNlVXRpbHMuZ2V0U2VydmljZVByb3BlcnRpZXNBc01hcChyZWYpOworICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBrZXkgOiBwcm9wcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcHMuZ2V0KGtleSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcy5nZXQoa2V5KS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQXJyYXlzLmRlZXBUb1N0cmluZygoT2JqZWN0W10pIHByb3BzLmdldChrZXkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZS5hZGRQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJaWYgKHJlZi5nZXRVc2luZ0J1bmRsZXMoKSAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUgdXNpbmdCdW5kbGUgOiByZWYuZ2V0VXNpbmdCdW5kbGVzKCkpIHsKLQkJCQkJCQlyZWZlcmVuY2UuYWRkVXNpbmdCdW5kbGUodXNpbmdCdW5kbGUuZ2V0QnVuZGxlSWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnVuZGxlLmFkZFVzaW5nU2VydmljZShyZWZlcmVuY2UpOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZi5nZXRVc2luZ0J1bmRsZXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUgdXNpbmdCdW5kbGUgOiByZWYuZ2V0VXNpbmdCdW5kbGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2UuYWRkVXNpbmdCdW5kbGUodXNpbmdCdW5kbGUuZ2V0QnVuZGxlSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlLmFkZFVzaW5nU2VydmljZShyZWZlcmVuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJYnVuZGxlcy5wdXQoTG9uZy52YWx1ZU9mKGJ1bmRsZS5nZXRJZCgpKSwgYnVuZGxlKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlczsKLQl9CisgICAgICAgICAgICBidW5kbGVzLnB1dChMb25nLnZhbHVlT2YoYnVuZGxlLmdldElkKCkpLCBidW5kbGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidW5kbGVzOworICAgIH0KIAotCXByaXZhdGUgU3RyaW5nIGdldFN0YXRlKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUgYikgewotCQlzd2l0Y2ggKGIuZ2V0U3RhdGUoKSkgewotCQljYXNlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUuQUNUSVZFOgotCQkJcmV0dXJuICJBQ1RJVkUiOwotCQljYXNlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUuSU5TVEFMTEVEOgotCQkJcmV0dXJuICJJTlNUQUxMRUQiOwotCQljYXNlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUuUkVTT0xWRUQ6Ci0JCQlyZXR1cm4gIlJFU09MVkVEIjsKLQkJY2FzZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlLlNUQVJUSU5HOgotCQkJcmV0dXJuICJTVEFSVElORyI7Ci0JCWNhc2Ugb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZS5TVE9QUElORzoKLQkJCXJldHVybiAiIjsKLQkJY2FzZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlLlVOSU5TVEFMTEVEOgotCQkJcmV0dXJuICJVTklOU1RBTExFRCI7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gIlVOS05PV04iOwotCQl9Ci0JfQorICAgIHByaXZhdGUgU3RyaW5nIGdldFN0YXRlKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUgYikgeworICAgICAgICBzd2l0Y2ggKGIuZ2V0U3RhdGUoKSkgeworICAgICAgICAgICAgY2FzZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlLkFDVElWRToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkFDVElWRSI7CisgICAgICAgICAgICBjYXNlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUuSU5TVEFMTEVEOgorICAgICAgICAgICAgICAgIHJldHVybiAiSU5TVEFMTEVEIjsKKyAgICAgICAgICAgIGNhc2Ugb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZS5SRVNPTFZFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlJFU09MVkVEIjsKKyAgICAgICAgICAgIGNhc2Ugb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZS5TVEFSVElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlNUQVJUSU5HIjsKKyAgICAgICAgICAgIGNhc2Ugb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZS5TVE9QUElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICBjYXNlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUuVU5JTlNUQUxMRUQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJVTklOU1RBTExFRCI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgICAgICAgIH0KKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCBiYmFjYTZkLi40MzIxYmQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0xLDQgKzEsMyBAQAotI1dlZCBNYXIgMDIgMTY6MDA6MDYgUFNUIDIwMTEKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQpAQCAtOCw2ICs3LDggQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQpAQCAtODIsMzUgKzgzLDM3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249NDgKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnk9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCkBAIC0xMjEsMzAgKzEyNCwzMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbGFtYmRhX2JvZHk9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lcz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xMjAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZGlzYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvZmYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5lbmFibGluZ190YWc9QGZvcm1hdHRlclw6b24KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCkBAIC0xNTgsNyArMTYyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkPWluc2VydApAQCAtMTY2LDEwICsxNzAsMTEgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZW1iZXI9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWw9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfdHlwZV9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydApAQCAtMjE3LDYgKzIyMiw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0yMzUsMTIgKzI0MSwxNCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CkBAIC0yNjQsNiArMjcyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0CkBAIC0yOTEsNiArMzAwLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0zMTksNiArMzI5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3RyeT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydApAQCAtMzI4LDYgKzMzOSw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0zNDMsMTUgKzM1NSwxNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTIwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj1zcGFjZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX29uX29mZl90YWdzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YUZvcm1hdHRlcj1vcmcuZWNsaXBzZS5qZHQuY29yZS5kZWZhdWx0SmF2YUZvcm1hdHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKaW5kZXggN2U3ZmU3My4uNmM5ODAxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0xLDcgKzEsNjUgQEAKK2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9uc19pbnRlcmZhY2VfbWV0aG9kcz10cnVlCitjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAuY29udmVydF9mdW5jdGlvbmFsX2ludGVyZmFjZXM9ZmFsc2UKK2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQorY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9ZmFsc2UKK2NsZWFudXAuaW5zZXJ0X2luZmVycmVkX3R5cGVfYXJndW1lbnRzPWZhbHNlCitjbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3R5cGVfYWJzdHJhY3RfaWZfbWlzc2luZ19tZXRob2Q9ZmFsc2UKK2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQorY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitjbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfcmVkdW5kYW50X3R5cGVfYXJndW1lbnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCitjbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQorY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCitjbGVhbnVwLnVzZV9hbm9ueW1vdXNfY2xhc3NfY3JlYXRpb249ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQorY2xlYW51cC51c2VfbGFtYmRhPXRydWUKK2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwLnVzZV90eXBlX2FyZ3VtZW50cz1mYWxzZQorY2xlYW51cF9wcm9maWxlPV9WaXJnbyBXZWIgU2VydmVyIC0gQ29kZSBDbGVhbiBVcAogY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCiBlZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9NeWx5biBiYXNlZCBvbiBFY2xpcHNlCitmb3JtYXR0ZXJfcHJvZmlsZT1fVmlyZ28gV2ViIFNlcnZlciAtIENvZGUgRm9ybWF0dGVyCiBmb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMgogaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKIG9yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9CdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5qYXZhCmluZGV4IDE1Mzk2MmEuLmMxZTRlMzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9CdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9CdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKQEAgLTE3LDEwMSArMTgsMTAxIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUubWVzc2FnZXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS5tZXNzYWdlcyI7CiAKLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KKyAgICBzdGF0aWMgeworICAgICAgICAvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKKyAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuY2xhc3MpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfbGluZVRvb0xvbmc7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9saW5lVG9vTG9uZzsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfbm9NYWluU2VjdGlvbjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX25vTWFpblNlY3Rpb247CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX2R1cGxpY2F0ZUhlYWRlcjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX2R1cGxpY2F0ZUhlYWRlcjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfbm9Db2xvbjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX25vQ29sb247CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX25vU3BhY2VWYWx1ZTsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX25vU3BhY2VWYWx1ZTsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfbmFtZUhlYWRlckluTWFpbjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX25hbWVIZWFkZXJJbk1haW47CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX25vTmFtZUhlYWRlcjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX25vTmFtZUhlYWRlcjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfaW52YWxpZEhlYWRlck5hbWU7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9pbnZhbGlkSGVhZGVyTmFtZTsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfbm9MaW5lVGVybWluYXRpb247CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9ub0xpbmVUZXJtaW5hdGlvbjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfcGFyc2VIZWFkZXI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9wYXJzZUhlYWRlcjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfYXR0X3ZhbHVlOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfYXR0X3ZhbHVlOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9kaXJfdmFsdWU7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9kaXJfdmFsdWU7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX2lsbGVnYWxfdmFsdWU7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9pbGxlZ2FsX3ZhbHVlOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9kZXByZWNhdGVkX2F0dHJpYnV0ZV9vcHRpb25hbDsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX2RlcHJlY2F0ZWRfYXR0cmlidXRlX29wdGlvbmFsOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9kZXByZWNhdGVkX2F0dHJpYnV0ZV9yZXByb3ZpZGU7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9kZXByZWNhdGVkX2F0dHJpYnV0ZV9yZXByb3ZpZGU7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX2RlcHJlY2F0ZWRfYXR0cmlidXRlX3NpbmdsZXRvbjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX2RlcHJlY2F0ZWRfYXR0cmlidXRlX3NpbmdsZXRvbjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfZGVwcmVjYXRlZF9hdHRyaWJ1dGVfc3BlY2lmaWNhdGlvbl92ZXJzaW9uOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfZGVwcmVjYXRlZF9hdHRyaWJ1dGVfc3BlY2lmaWNhdGlvbl92ZXJzaW9uOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9kaXJlY3RpdmVfaGFzTm9FZmZlY3RXaXRoXzsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX2RpcmVjdGl2ZV9oYXNOb0VmZmVjdFdpdGhfOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9zaW5nbGV0b25BdHRyUmVxdWlyZWQ7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9zaW5nbGV0b25BdHRyUmVxdWlyZWQ7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX3NpbmdsZXRvblJlcXVpcmVkOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfc2luZ2xldG9uUmVxdWlyZWQ7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX2hlYWRlck1pc3Npbmc7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9oZWFkZXJNaXNzaW5nOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9Ob1N5bWJvbGljTmFtZTsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX05vU3ltYm9saWNOYW1lOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9pbGxlZ2FsTWFuaWZlc3RWZXJzaW9uOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfaWxsZWdhbE1hbmlmZXN0VmVyc2lvbjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfQ2xhc3NwYXRoTm90RW1wdHk7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9DbGFzc3BhdGhOb3RFbXB0eTsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfZnJhZ21lbnRBY3RpdmF0b3I7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9mcmFnbWVudEFjdGl2YXRvcjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfTm9FeGlzdDsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX05vRXhpc3Q7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX0ludmFsaWRGb3JtYXRJbkJ1bmRsZVZlcnNpb247CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9JbnZhbGlkRm9ybWF0SW5CdW5kbGVWZXJzaW9uOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9Ob3RFeGlzdEluUHJvamVjdDsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX05vdEV4aXN0SW5Qcm9qZWN0OwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9CdW5kbGVSYW5nZUludmFsaWRJbkJ1bmRsZVZlcnNpb247CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9CdW5kbGVSYW5nZUludmFsaWRJbkJ1bmRsZVZlcnNpb247CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX2ludmFsaWRWZXJzaW9uUmFuZ2VGb3JtYXQ7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9pbnZhbGlkVmVyc2lvblJhbmdlRm9ybWF0OwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9Ob3RFeGlzdFBERTsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX05vdEV4aXN0UERFOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9Ib3N0Tm90RXhpc3RQREU7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9Ib3N0Tm90RXhpc3RQREU7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX0hvc3ROZWVkZWQ7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9Ib3N0TmVlZGVkOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9QYWNrYWdlTm90RXhwb3J0ZWQ7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9QYWNrYWdlTm90RXhwb3J0ZWQ7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX0ludmFsaWRTeW1ib2xpY05hbWU7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9JbnZhbGlkU3ltYm9saWNOYW1lOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9pbnZhbGlkRmlsdGVyU3ludGF4OworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfaW52YWxpZEZpbHRlclN5bnRheDsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZUVycm9yUmVwb3J0ZXJfaW1wb3J0ZXhwb3J0X3NlcnZpY2VzRGVwcmVjYXRlZDsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX2ltcG9ydGV4cG9ydF9zZXJ2aWNlc0RlcHJlY2F0ZWQ7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX3VuZWNlc3NhcnlEZXBlbmRlbmN5RHVlVG9GcmFnbWVudEhvc3Q7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl91bmVjZXNzYXJ5RGVwZW5kZW5jeUR1ZVRvRnJhZ21lbnRIb3N0OwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9taXNzaW5nUGFja2FnZXNJblByb2plY3Q7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9taXNzaW5nUGFja2FnZXNJblByb2plY3Q7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX25vRXhlY3V0aW9uRW52aXJvbm1lbnRTZXQ7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9ub0V4ZWN1dGlvbkVudmlyb25tZW50U2V0OwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9taXNzaW5nQnVuZGxlQ2xhc3NQYXRoRW50cnk7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9taXNzaW5nQnVuZGxlQ2xhc3NQYXRoRW50cnk7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX3N0YXJ0SGVhZGVyX2F1dG9TdGFydERlcHJlY2F0ZWQ7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9zdGFydEhlYWRlcl9hdXRvU3RhcnREZXByZWNhdGVkOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9leHBvcnROb0pSRTsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX2V4cG9ydE5vSlJFOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9pbXBvcnROb0pSRTsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVFcnJvclJlcG9ydGVyX2ltcG9ydE5vSlJFOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9sYXp5U3RhcnRfdW5zdXBwb3J0ZWQ7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlRXJyb3JSZXBvcnRlcl9sYXp5U3RhcnRfdW5zdXBwb3J0ZWQ7CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9CdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9CdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uamF2YQppbmRleCAxOGM1MmQ0Li45MmUxOWFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL0J1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwpAQCAtMjEsODQgKzIyLDgyIEBACiAKIC8qKgogICogQWN0aXZhdG9yIGZvciB0aGUgbWFuaWZlc3QuY29yZSBwbHVnaW4uCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKIAotCS8qKiBUaGUgYnVuZGxlIHN5bWJvbGljIG5hbWUgb2YgdGhpcyBwbHVnaW4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUiOworICAgIC8qKiBUaGUgYnVuZGxlIHN5bWJvbGljIG5hbWUgb2YgdGhpcyBwbHVnaW4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUiOwogCi0JLyoqIEJ1bmRsZSBtYW5pZmVzdCBmaWxlIG5hbWUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVF9GSUxFX05BTUUgPSAiTUFOSUZFU1QuTUYiOworICAgIC8qKiBCdW5kbGUgbWFuaWZlc3QgZmlsZSBuYW1lICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1RfRklMRV9OQU1FID0gIk1BTklGRVNULk1GIjsKIAotCS8qKiBUZXN0IGJ1bmRsZSBtYW5pZmVzdCBmaWxlIG5hbWUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX01BTklGRVNUX0ZJTEVfTkFNRSA9ICJURVNULk1GIjsKKyAgICAvKiogVGVzdCBidW5kbGUgbWFuaWZlc3QgZmlsZSBuYW1lICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9NQU5JRkVTVF9GSUxFX05BTUUgPSAiVEVTVC5NRiI7CiAKLQkvKiogQnVuZGxlIG1hbmlmZXN0IGZvbGRlciBuYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1RfRk9MREVSX05BTUUgPSAiTUVUQS1JTkYiOworICAgIC8qKiBCdW5kbGUgbWFuaWZlc3QgZm9sZGVyIG5hbWUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVF9GT0xERVJfTkFNRSA9ICJNRVRBLUlORiI7CiAKLQkvKiogUmVsYXRpdmUgcGF0aCB0byBhIGJ1bmRsZSBtYW5pZmVzdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0ZJTEVfTE9DQVRJT04gPSBuZXcgU3RyaW5nQnVpbGRlcignLycpLmFwcGVuZChNQU5JRkVTVF9GT0xERVJfTkFNRSkKLQkJCS5hcHBlbmQoJy8nKQotCQkJLmFwcGVuZChNQU5JRkVTVF9GSUxFX05BTUUpCi0JCQkudG9TdHJpbmcoKTsKKyAgICAvKiogUmVsYXRpdmUgcGF0aCB0byBhIGJ1bmRsZSBtYW5pZmVzdCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0ZJTEVfTE9DQVRJT04gPSBuZXcgU3RyaW5nQnVpbGRlcignLycpLmFwcGVuZChNQU5JRkVTVF9GT0xERVJfTkFNRSkuYXBwZW5kKCcvJykuYXBwZW5kKAorICAgICAgICBNQU5JRkVTVF9GSUxFX05BTUUpLnRvU3RyaW5nKCk7CiAKLQkvKiogUmVsYXRpdmUgcGF0aCB0byBhIHRlc3QgYnVuZGxlIG1hbmlmZXN0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9NQU5JRkVTVF9GSUxFX0xPQ0FUSU9OID0gbmV3IFN0cmluZ0J1aWxkZXIoJy8nKS5hcHBlbmQoTUFOSUZFU1RfRk9MREVSX05BTUUpCi0JCQkuYXBwZW5kKCcvJykKLQkJCS5hcHBlbmQoVEVTVF9NQU5JRkVTVF9GSUxFX05BTUUpCi0JCQkudG9TdHJpbmcoKTsKKyAgICAvKiogUmVsYXRpdmUgcGF0aCB0byBhIHRlc3QgYnVuZGxlIG1hbmlmZXN0ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9NQU5JRkVTVF9GSUxFX0xPQ0FUSU9OID0gbmV3IFN0cmluZ0J1aWxkZXIoJy8nKS5hcHBlbmQoTUFOSUZFU1RfRk9MREVSX05BTUUpLmFwcGVuZCgnLycpLmFwcGVuZCgKKyAgICAgICAgVEVTVF9NQU5JRkVTVF9GSUxFX05BTUUpLnRvU3RyaW5nKCk7CiAKLQkvKiogTW9kdWxlLVR5cGUgbWFuaWZlc3QgaGVhZGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1RZUEVfTUFOSUZFU1RfSEVBREVSID0gIk1vZHVsZS1UeXBlIjsKKyAgICAvKiogTW9kdWxlLVR5cGUgbWFuaWZlc3QgaGVhZGVyICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1RZUEVfTUFOSUZFU1RfSEVBREVSID0gIk1vZHVsZS1UeXBlIjsKIAotCS8qKiBUaGUgc2hhcmVkIGluc3RhbmNlICovCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luIHBsdWdpbjsKKyAgICAvKiogVGhlIHNoYXJlZCBpbnN0YW5jZSAqLworICAgIHByaXZhdGUgc3RhdGljIEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbiBwbHVnaW47CiAKLQkvKiogVGhlIGJ1bmRsZSBtYW5pZmVzdCBtYW5hZ2VyIGhvc3RlZCB3aXRoIHRoaXMgcGx1Z2luICovCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlTWFuaWZlc3RNYW5hZ2VyIGJ1bmRsZU1hbmlmZXN0TWFuYWdlcjsKKyAgICAvKiogVGhlIGJ1bmRsZSBtYW5pZmVzdCBtYW5hZ2VyIGhvc3RlZCB3aXRoIHRoaXMgcGx1Z2luICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQnVuZGxlTWFuaWZlc3RNYW5hZ2VyIGJ1bmRsZU1hbmlmZXN0TWFuYWdlcjsKIAotCXByaXZhdGUgZmluYWwgU2VydmljZVJlZ2lzdHJhdGlvblRyYWNrZXIgdHJhY2tlciA9IG5ldyBTZXJ2aWNlUmVnaXN0cmF0aW9uVHJhY2tlcigpOworICAgIHByaXZhdGUgZmluYWwgU2VydmljZVJlZ2lzdHJhdGlvblRyYWNrZXIgdHJhY2tlciA9IG5ldyBTZXJ2aWNlUmVnaXN0cmF0aW9uVHJhY2tlcigpOwogCi0JcHJpdmF0ZSB2b2xhdGlsZSBFdmVudExvZ2dlciBldmVudExvZ2dlciA9IG51bGw7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBFdmVudExvZ2dlciBldmVudExvZ2dlciA9IG51bGw7CiAKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJYnVuZGxlTWFuaWZlc3RNYW5hZ2VyID0gbmV3IEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpOwotCQlidW5kbGVNYW5pZmVzdE1hbmFnZXIuc3RhcnQoKTsKLQkJcGx1Z2luID0gdGhpczsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zdGFydChjb250ZXh0KTsKKyAgICAgICAgYnVuZGxlTWFuaWZlc3RNYW5hZ2VyID0gbmV3IEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpOworICAgICAgICBidW5kbGVNYW5pZmVzdE1hbmFnZXIuc3RhcnQoKTsKKyAgICAgICAgcGx1Z2luID0gdGhpczsKIAotCQl0aGlzLmV2ZW50TG9nZ2VyID0gbmV3IE5vT3BFdmVudExvZ2dlcigpOwotCQl0aGlzLnRyYWNrZXIudHJhY2soY29udGV4dC5yZWdpc3RlclNlcnZpY2UoRXZlbnRMb2dnZXIuY2xhc3MuZ2V0TmFtZSgpLCB0aGlzLmV2ZW50TG9nZ2VyLCBudWxsKSk7CisgICAgICAgIHRoaXMuZXZlbnRMb2dnZXIgPSBuZXcgTm9PcEV2ZW50TG9nZ2VyKCk7CisgICAgICAgIHRoaXMudHJhY2tlci50cmFjayhjb250ZXh0LnJlZ2lzdGVyU2VydmljZShFdmVudExvZ2dlci5jbGFzcy5nZXROYW1lKCksIHRoaXMuZXZlbnRMb2dnZXIsIG51bGwpKTsKIAotCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgcmVwb3NpdG9yeSBidW5kbGUgaXMgc3RhcnRlZAotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS52aXJnby5yZXBvc2l0b3J5Iik7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCAmJiBidW5kbGUuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQl0cnkgewotCQkJCWJ1bmRsZS5zdGFydCgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHJlcG9zaXRvcnkgYnVuZGxlIGlzIHN0YXJ0ZWQKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudmlyZ28ucmVwb3NpdG9yeSIpOworICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwgJiYgYnVuZGxlLmdldFN0YXRlKCkgIT0gQnVuZGxlLkFDVElWRSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBidW5kbGUuc3RhcnQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCWJ1bmRsZU1hbmlmZXN0TWFuYWdlci5zdG9wKCk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwbHVnaW4gPSBudWxsOworICAgICAgICBidW5kbGVNYW5pZmVzdE1hbmFnZXIuc3RvcCgpOwogCi0JCXRoaXMudHJhY2tlci51bnJlZ2lzdGVyQWxsKCk7CisgICAgICAgIHRoaXMudHJhY2tlci51bnJlZ2lzdGVyQWxsKCk7CiAKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9CisgICAgICAgIHN1cGVyLnN0b3AoY29udGV4dCk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9CisgICAgcHVibGljIHN0YXRpYyBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKKyAgICAgICAgcmV0dXJuIHBsdWdpbjsKKyAgICB9CiAKLQkvKiogUmV0dXJucyB0aGUgYnVuZGxlIG1hbmlmZXN0IG1vZGVsIG1hbmFnZXIgKi8KLQlwdWJsaWMgc3RhdGljIElCdW5kbGVNYW5pZmVzdE1hbmFnZXIgZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkgewotCQlyZXR1cm4gYnVuZGxlTWFuaWZlc3RNYW5hZ2VyOwotCX0KKyAgICAvKiogUmV0dXJucyB0aGUgYnVuZGxlIG1hbmlmZXN0IG1vZGVsIG1hbmFnZXIgKi8KKyAgICBwdWJsaWMgc3RhdGljIElCdW5kbGVNYW5pZmVzdE1hbmFnZXIgZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gYnVuZGxlTWFuaWZlc3RNYW5hZ2VyOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL0J1bmRsZU1hbmlmZXN0VXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9CdW5kbGVNYW5pZmVzdFV0aWxzLmphdmEKaW5kZXggOTNmNWNjYS4uZjQyN2U0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL0J1bmRsZU1hbmlmZXN0VXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvQnVuZGxlTWFuaWZlc3RVdGlscy5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKQEAgLTU2LDcgKzU3LDcgQEAKIAogLyoqCiAgKiBIZWxwZXIgbWV0aG9kcyB0byBsb2NhdGVkIGFuZCBsb2FkIHtAbGluayBCdW5kbGVNYW5pZmVzdH0gaW5zdGFuY2VzLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAYXV0aG9yIFN0ZWZmZW4gUGluZ2VsCiAgKiBAYXV0aG9yIE1hcnRpbiBMaXBwZXJ0CkBAIC02NCwzNTEgKzY1LDM0MSBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlTWFuaWZlc3RVdGlscyB7CiAKLQkvKiogVVJMIGZpbGUgc2NoZW1hICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU0NIRU1FID0gImZpbGUiOworICAgIC8qKiBVUkwgZmlsZSBzY2hlbWEgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9TQ0hFTUUgPSAiZmlsZSI7CiAKLQkvKioKLQkgKiBSZXR1cm5zIGEge0BsaW5rIEJ1bmRsZU1hbmlmZXN0fSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIDxjb2RlPmphdmFQcm9qZWN0PC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIHRoZSBzb3VyY2UgZm9sZGVycyBvZiB0aGUge0BsaW5rIElKYXZhUHJvamVjdH0gYW5kIHJldHVybnMgdGhlIGZpcnN0IGZvdW5kCi0JICogTUVUQS1JTkYvTUFOSUZFU1QuTUYgYXMgdGhlIHZhbGlkIG1hbmlmZXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnVuZGxlTWFuaWZlc3QgZ2V0QnVuZGxlTWFuaWZlc3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBib29sZWFuIHRlc3RCdW5kbGUpIHsKLQkJSUZpbGUgbWFuaWZlc3RGaWxlID0gbG9jYXRlTWFuaWZlc3QoamF2YVByb2plY3QsIHRlc3RCdW5kbGUpOwotCQlpZiAobWFuaWZlc3RGaWxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIEJ1bmRsZU1hbmlmZXN0RmFjdG9yeS5jcmVhdGVCdW5kbGVNYW5pZmVzdChuZXcgSW5wdXRTdHJlYW1SZWFkZXIobWFuaWZlc3RGaWxlLmdldENvbnRlbnRzKHRydWUpKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEJ1bmRsZU1hbmlmZXN0fSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIDxjb2RlPmphdmFQcm9qZWN0PC9jb2RlPi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIHRoZSBzb3VyY2UgZm9sZGVycyBvZiB0aGUge0BsaW5rIElKYXZhUHJvamVjdH0gYW5kIHJldHVybnMgdGhlIGZpcnN0IGZvdW5kCisgICAgICogTUVUQS1JTkYvTUFOSUZFU1QuTUYgYXMgdGhlIHZhbGlkIG1hbmlmZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVuZGxlTWFuaWZlc3QgZ2V0QnVuZGxlTWFuaWZlc3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBib29sZWFuIHRlc3RCdW5kbGUpIHsKKyAgICAgICAgSUZpbGUgbWFuaWZlc3RGaWxlID0gbG9jYXRlTWFuaWZlc3QoamF2YVByb2plY3QsIHRlc3RCdW5kbGUpOworICAgICAgICBpZiAobWFuaWZlc3RGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJ1bmRsZU1hbmlmZXN0RmFjdG9yeS5jcmVhdGVCdW5kbGVNYW5pZmVzdChuZXcgSW5wdXRTdHJlYW1SZWFkZXIobWFuaWZlc3RGaWxlLmdldENvbnRlbnRzKHRydWUpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIExvY2F0ZXMgdGhlIHtAbGluayBJUmVzb3VyY2V9IHJlcHJlc2VudGluZyB0aGUgTUFOSUZFU1QuTUYgb2YgYSA8Y29kZT5qYXZhUHJvamVjdDwvY29kZT4uCi0JICogPHA+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyB0aGUgc291cmNlIGZvbGRlcnMgb2YgdGhlIHtAbGluayBJSmF2YVByb2plY3R9IGFuZCByZXR1cm5zIHRoZSBmaXJzdCBmb3VuZAotCSAqIE1FVEEtSU5GL01BTklGRVNULk1GIGFzIHRoZSB2YWxpZCBtYW5pZmVzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGxvY2F0ZU1hbmlmZXN0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiB0ZXN0QnVuZGxlKSB7Ci0JCVN0cmluZyBtYW5pZmVzdExvY2F0aW9uID0gKHRlc3RCdW5kbGUKLQkJCQk/IEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5URVNUX01BTklGRVNUX0ZJTEVfTE9DQVRJT04KLQkJCQk6IEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5NQU5JRkVTVF9GSUxFX0xPQ0FUSU9OKTsKLQkJdHJ5IHsKLQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogU2VydmVyTW9kdWxlRGVsZWdhdGUuZ2V0U291cmNlQ2xhc3NwYXRoRW50cmllcyhqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCksCi0JCQkJCXRlc3RCdW5kbGUpKSB7Ci0JCQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKS5hcHBlbmQobWFuaWZlc3RMb2NhdGlvbikucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQlJRmlsZSBtYW5pZmVzdEZpbGVIYW5kbGUgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZShwYXRoKTsKLQkJCQlpZiAobWFuaWZlc3RGaWxlSGFuZGxlLmV4aXN0cygpKSB7Ci0JCQkJCXJldHVybiBtYW5pZmVzdEZpbGVIYW5kbGU7Ci0JCQkJfQotCQkJfQorICAgIC8qKgorICAgICAqIExvY2F0ZXMgdGhlIHtAbGluayBJUmVzb3VyY2V9IHJlcHJlc2VudGluZyB0aGUgTUFOSUZFU1QuTUYgb2YgYSA8Y29kZT5qYXZhUHJvamVjdDwvY29kZT4uCisgICAgICogPHA+CisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyB0aGUgc291cmNlIGZvbGRlcnMgb2YgdGhlIHtAbGluayBJSmF2YVByb2plY3R9IGFuZCByZXR1cm5zIHRoZSBmaXJzdCBmb3VuZAorICAgICAqIE1FVEEtSU5GL01BTklGRVNULk1GIGFzIHRoZSB2YWxpZCBtYW5pZmVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIElGaWxlIGxvY2F0ZU1hbmlmZXN0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiB0ZXN0QnVuZGxlKSB7CisgICAgICAgIFN0cmluZyBtYW5pZmVzdExvY2F0aW9uID0gdGVzdEJ1bmRsZSA/IEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5URVNUX01BTklGRVNUX0ZJTEVfTE9DQVRJT04gOiBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uTUFOSUZFU1RfRklMRV9MT0NBVElPTjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogU2VydmVyTW9kdWxlRGVsZWdhdGUuZ2V0U291cmNlQ2xhc3NwYXRoRW50cmllcyhqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCksIHRlc3RCdW5kbGUpKSB7CisgICAgICAgICAgICAgICAgSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKS5hcHBlbmQobWFuaWZlc3RMb2NhdGlvbikucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKKyAgICAgICAgICAgICAgICBJRmlsZSBtYW5pZmVzdEZpbGVIYW5kbGUgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZShwYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3RGaWxlSGFuZGxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdEZpbGVIYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlpZiAoRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuaGFzUHJvamVjdEZhY2V0KGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwgRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRCkpIHsKLQkJCQlXZWJBcnRpZmFjdEVkaXQgd2ViQXJ0aWZhY3QgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZChqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJCWlmICh3ZWJBcnRpZmFjdCAhPSBudWxsKSB7Ci0JCQkJCUlQYXRoIHdlYkRvdFhtbFBhdGggPSB3ZWJBcnRpZmFjdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclBhdGgoKTsKLQkJCQkJaWYgKHdlYkRvdFhtbFBhdGggIT0gbnVsbCkgewotCQkJCQkJSVBhdGggcGF0aCA9IHdlYkRvdFhtbFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDIpCi0JCQkJCQkJCS5hcHBlbmQobWFuaWZlc3RMb2NhdGlvbikKLQkJCQkJCQkJLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0JCQkJCQlJRmlsZSBtYW5pZmVzdEZpbGVIYW5kbGUgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RmlsZShwYXRoKTsKLQkJCQkJCWlmIChtYW5pZmVzdEZpbGVIYW5kbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQlyZXR1cm4gbWFuaWZlc3RGaWxlSGFuZGxlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgaWYgKEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldChqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCksIEZhY2V0Q29yZVBsdWdpbi5XRUJfRkFDRVRfSUQpKSB7CisgICAgICAgICAgICAgICAgV2ViQXJ0aWZhY3RFZGl0IHdlYkFydGlmYWN0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICBpZiAod2ViQXJ0aWZhY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJUGF0aCB3ZWJEb3RYbWxQYXRoID0gd2ViQXJ0aWZhY3QuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh3ZWJEb3RYbWxQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIHBhdGggPSB3ZWJEb3RYbWxQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygyKS5hcHBlbmQobWFuaWZlc3RMb2NhdGlvbikucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIElGaWxlIG1hbmlmZXN0RmlsZUhhbmRsZSA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGaWxlKHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hbmlmZXN0RmlsZUhhbmRsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdEZpbGVIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyBhIGZ1bGwgcXVhbGlmaWVkIGxvY2F0aW9uIG9mIHRoZSBNRVRBLUlORiBmb2xkZXIuCi0JICogPHA+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyB0aGUgc291cmNlIGZvbGRlcnMgb2YgdGhlIHtAbGluayBJSmF2YVByb2plY3R9IGFuZCByZXR1cm5zIHRoZSBmaXJzdCBmb3VuZAotCSAqIE1FVEEtSU5GL01BTklGRVNULk1GIGFzIHRoZSB2YWxpZCBtYW5pZmVzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhdGVNYW5pZmVzdEZvbGRlcihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbG9jYXRlTWFuaWZlc3QoamF2YVByb2plY3QsIGZhbHNlKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUlDb250YWluZXIgY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7Ci0JCQlJUGF0aCBsb2NhdGlvbiA9IGNvbnRhaW5lci5nZXRSYXdMb2NhdGlvbigpOwotCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbG9jYXRpb24udG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZ1bGwgcXVhbGlmaWVkIGxvY2F0aW9uIG9mIHRoZSBNRVRBLUlORiBmb2xkZXIuCisgICAgICogPHA+CisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyB0aGUgc291cmNlIGZvbGRlcnMgb2YgdGhlIHtAbGluayBJSmF2YVByb2plY3R9IGFuZCByZXR1cm5zIHRoZSBmaXJzdCBmb3VuZAorICAgICAqIE1FVEEtSU5GL01BTklGRVNULk1GIGFzIHRoZSB2YWxpZCBtYW5pZmVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhdGVNYW5pZmVzdEZvbGRlcihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKKyAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gbG9jYXRlTWFuaWZlc3QoamF2YVByb2plY3QsIGZhbHNlKTsKKyAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIElDb250YWluZXIgY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBJUGF0aCBsb2NhdGlvbiA9IGNvbnRhaW5lci5nZXRSYXdMb2NhdGlvbigpOworICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRpb24udG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIGEge0BsaW5rIEZpbGV9IGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gPGNvZGU+amF2YVByb2plY3Q8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgdGhlIHNvdXJjZSBmb2xkZXJzIG9mIHRoZSB7QGxpbmsgSUphdmFQcm9qZWN0fSBhbmQgcmV0dXJucyB0aGUgZmlyc3QgZm91bmQKLQkgKiBNRVRBLUlORi9NQU5JRkVTVC5NRiBhcyB0aGUgdmFsaWQgbWFuaWZlc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGxvY2F0ZU1hbmlmZXN0RmlsZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGJvb2xlYW4gdGVzdEJ1bmRsZSkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBsb2NhdGVNYW5pZmVzdChqYXZhUHJvamVjdCwgdGVzdEJ1bmRsZSk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlVUkkgdXJpID0gY29udmVydFJlc291cmNlVG9VcmwocmVzb3VyY2UpOwotCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBGaWxlKHVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgRmlsZX0gaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiA8Y29kZT5qYXZhUHJvamVjdDwvY29kZT4uCisgICAgICogPHA+CisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyB0aGUgc291cmNlIGZvbGRlcnMgb2YgdGhlIHtAbGluayBJSmF2YVByb2plY3R9IGFuZCByZXR1cm5zIHRoZSBmaXJzdCBmb3VuZAorICAgICAqIE1FVEEtSU5GL01BTklGRVNULk1GIGFzIHRoZSB2YWxpZCBtYW5pZmVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgbG9jYXRlTWFuaWZlc3RGaWxlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiB0ZXN0QnVuZGxlKSB7CisgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGxvY2F0ZU1hbmlmZXN0KGphdmFQcm9qZWN0LCB0ZXN0QnVuZGxlKTsKKyAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFVSSSB1cmkgPSBjb252ZXJ0UmVzb3VyY2VUb1VybChyZXNvdXJjZSk7CisgICAgICAgICAgICBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUodXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBDb252ZXJ0cyBhIGdpdmVuIHtAbGluayBJUmVzb3VyY2V9IGludG8gYSBmdWxsIHF1YWxpZmllZCB7QGxpbmsgVVJJfSBob25vcmluZyBldmVudHVhbCB1c2VkIEVjbGlwc2UgdmFyaWFibGVzIGluCi0JICogdGhlIHBhdGggZXhwcmVzc2lvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBVUkkgY29udmVydFJlc291cmNlVG9VcmwoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlVUkkgdXJpID0gcmVzb3VyY2UuZ2V0UmF3TG9jYXRpb25VUkkoKTsKLQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7Ci0JCQkJaWYgKEZJTEVfU0NIRU1FLmVxdWFsc0lnbm9yZUNhc2Uoc2NoZW1lKSkgewotCQkJCQlyZXR1cm4gdXJpOwotCQkJCX0gZWxzZSBpZiAoInNvdXJjZWNvbnRyb2wiLmVxdWFscyhzY2hlbWUpKSB7Ci0JCQkJCS8vIHNwZWNpYWwgY2FzZSBvZiBSYXRpb25hbCBUZWFtIENvbmNlcnQKLQkJCQkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCQkJCUZpbGUgZmlsZSA9IHBhdGgudG9GaWxlKCk7Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlyZXR1cm4gZmlsZS50b1VSSSgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVBhdGhWYXJpYWJsZU1hbmFnZXIgdmFyaWFibGVNYW5hZ2VyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFBhdGhWYXJpYWJsZU1hbmFnZXIoKTsKLQkJCQkJcmV0dXJuIHZhcmlhYmxlTWFuYWdlci5yZXNvbHZlVVJJKHVyaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBhIGdpdmVuIHtAbGluayBJUmVzb3VyY2V9IGludG8gYSBmdWxsIHF1YWxpZmllZCB7QGxpbmsgVVJJfSBob25vcmluZyBldmVudHVhbCB1c2VkIEVjbGlwc2UgdmFyaWFibGVzIGluCisgICAgICogdGhlIHBhdGggZXhwcmVzc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBVUkkgY29udmVydFJlc291cmNlVG9VcmwoSVJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICBVUkkgdXJpID0gcmVzb3VyY2UuZ2V0UmF3TG9jYXRpb25VUkkoKTsKKyAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKEZJTEVfU0NIRU1FLmVxdWFsc0lnbm9yZUNhc2Uoc2NoZW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInNvdXJjZWNvbnRyb2wiLmVxdWFscyhzY2hlbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBvZiBSYXRpb25hbCBUZWFtIENvbmNlcnQKKyAgICAgICAgICAgICAgICAgICAgSVBhdGggcGF0aCA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IHBhdGgudG9GaWxlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS50b1VSSSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgSVBhdGhWYXJpYWJsZU1hbmFnZXIgdmFyaWFibGVNYW5hZ2VyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFBhdGhWYXJpYWJsZU1hbmFnZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlTWFuYWdlci5yZXNvbHZlVVJJKHVyaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIEZpbmRzIGEge0BsaW5rIElSZXNvdXJjZX0gaWRlbnRpZmllZCBieSBhIGdpdmVuIDxjb2RlPnBhdGg8L2NvZGU+IGluIHRoZSBnaXZlbiA8Y29kZT5wcm9qZWN0PC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIElSZXNvdXJjZSBmaW5kUmVzb3VyY2UoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcGF0aCkgewotCQlpZiAocGF0aCAhPSBudWxsICYmIHByb2plY3QgIT0gbnVsbCAmJiBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHByb2plY3QuZmluZE1lbWJlcihwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBGaW5kcyBhIHtAbGluayBJUmVzb3VyY2V9IGlkZW50aWZpZWQgYnkgYSBnaXZlbiA8Y29kZT5wYXRoPC9jb2RlPiBpbiB0aGUgZ2l2ZW4gPGNvZGU+cHJvamVjdDwvY29kZT4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBJUmVzb3VyY2UgZmluZFJlc291cmNlKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHBhdGgpIHsKKyAgICAgICAgaWYgKHBhdGggIT0gbnVsbCAmJiBwcm9qZWN0ICE9IG51bGwgJiYgcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9qZWN0LmZpbmRNZW1iZXIocGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBEdW1wcyBhIG5ldyBNQU5JRkVTVC5NRiBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFQcm9qZWN0fS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlTmV3QnVuZGxlTWFuaWZlc3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgc3ltYm9saWNOYW1lLCBTdHJpbmcgYnVuZGxlVmVyc2lvbiwKLQkJCVN0cmluZyBwcm92aWRlck5hbWUsIFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcgc2VydmVyTW9kdWxlLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMpIHsKKyAgICAvKioKKyAgICAgKiBEdW1wcyBhIG5ldyBNQU5JRkVTVC5NRiBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFQcm9qZWN0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlTmV3QnVuZGxlTWFuaWZlc3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgc3ltYm9saWNOYW1lLCBTdHJpbmcgYnVuZGxlVmVyc2lvbiwgU3RyaW5nIHByb3ZpZGVyTmFtZSwKKyAgICAgICAgU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBzZXJ2ZXJNb2R1bGUsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcykgewogCi0JCUJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gbnVsbDsKKyAgICAgICAgQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBudWxsOwogCi0JCUZpbGUgZXhpc3RpbmdNYW5pZmVzdEZpbGUgPSBsb2NhdGVNYW5pZmVzdEZpbGUoamF2YVByb2plY3QsIGZhbHNlKTsKLQkJaWYgKGV4aXN0aW5nTWFuaWZlc3RGaWxlICE9IG51bGwpIHsKLQkJCUZpbGVSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoZXhpc3RpbmdNYW5pZmVzdEZpbGUpOwotCQkJCW1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RGYWN0b3J5LmNyZWF0ZUJ1bmRsZU1hbmlmZXN0KG5ldyBGaWxlUmVhZGVyKGV4aXN0aW5nTWFuaWZlc3RGaWxlKSk7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAocmVhZGVyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQltYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0RmFjdG9yeS5jcmVhdGVCdW5kbGVNYW5pZmVzdCgpOwotCQl9CisgICAgICAgIEZpbGUgZXhpc3RpbmdNYW5pZmVzdEZpbGUgPSBsb2NhdGVNYW5pZmVzdEZpbGUoamF2YVByb2plY3QsIGZhbHNlKTsKKyAgICAgICAgaWYgKGV4aXN0aW5nTWFuaWZlc3RGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIEZpbGVSZWFkZXIgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoZXhpc3RpbmdNYW5pZmVzdEZpbGUpOworICAgICAgICAgICAgICAgIG1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RGYWN0b3J5LmNyZWF0ZUJ1bmRsZU1hbmlmZXN0KG5ldyBGaWxlUmVhZGVyKGV4aXN0aW5nTWFuaWZlc3RGaWxlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0RmFjdG9yeS5jcmVhdGVCdW5kbGVNYW5pZmVzdCgpOworICAgICAgICB9CiAKLQkJbWFuaWZlc3Quc2V0QnVuZGxlTWFuaWZlc3RWZXJzaW9uKDIpOwotCQlEaWN0aW9uYXJ5PFN0cmluZywgU3RyaW5nPiBkaWN0b25hcnkgPSBtYW5pZmVzdC50b0RpY3Rpb25hcnkoKTsKLQkJaWYgKFN0cmluZ1V0aWxzLmlzTm90Qmxhbmsoc3ltYm9saWNOYW1lKSkgewotCQkJZGljdG9uYXJ5LnB1dChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgc3ltYm9saWNOYW1lKTsKLQkJfQotCQlpZiAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhidW5kbGVWZXJzaW9uKSkgewotCQkJZGljdG9uYXJ5LnB1dChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sIGJ1bmRsZVZlcnNpb24pOwotCQl9Ci0JCWlmIChTdHJpbmdVdGlscy5pc05vdEJsYW5rKGJ1bmRsZU5hbWUpKSB7Ci0JCQlkaWN0b25hcnkucHV0KENvbnN0YW50cy5CVU5ETEVfTkFNRSwgYnVuZGxlTmFtZSk7Ci0JCX0KLQkJaWYgKFN0cmluZ1V0aWxzLmlzTm90QmxhbmsocHJvdmlkZXJOYW1lKSkgewotCQkJZGljdG9uYXJ5LnB1dChDb25zdGFudHMuQlVORExFX0RFU0NSSVBUSU9OLCBwcm92aWRlck5hbWUpOwotCQl9CisgICAgICAgIG1hbmlmZXN0LnNldEJ1bmRsZU1hbmlmZXN0VmVyc2lvbigyKTsKKyAgICAgICAgRGljdGlvbmFyeTxTdHJpbmcsIFN0cmluZz4gZGljdG9uYXJ5ID0gbWFuaWZlc3QudG9EaWN0aW9uYXJ5KCk7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEJsYW5rKHN5bWJvbGljTmFtZSkpIHsKKyAgICAgICAgICAgIGRpY3RvbmFyeS5wdXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsIHN5bWJvbGljTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90QmxhbmsoYnVuZGxlVmVyc2lvbikpIHsKKyAgICAgICAgICAgIGRpY3RvbmFyeS5wdXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCBidW5kbGVWZXJzaW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhidW5kbGVOYW1lKSkgeworICAgICAgICAgICAgZGljdG9uYXJ5LnB1dChDb25zdGFudHMuQlVORExFX05BTUUsIGJ1bmRsZU5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEJsYW5rKHByb3ZpZGVyTmFtZSkpIHsKKyAgICAgICAgICAgIGRpY3RvbmFyeS5wdXQoQ29uc3RhbnRzLkJVTkRMRV9ERVNDUklQVElPTiwgcHJvdmlkZXJOYW1lKTsKKyAgICAgICAgfQogCi0JCWZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHByb3BlcnRpZXMuZW50cnlTZXQoKSkgewotCQkJaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoZW50cnkuZ2V0VmFsdWUoKSkgJiYgU3RyaW5nVXRpbHMuaXNOb3RFbXB0eShlbnRyeS5nZXRLZXkoKSkpIHsKLQkJCQlkaWN0b25hcnkucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KGVudHJ5LmdldFZhbHVlKCkpICYmIFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoZW50cnkuZ2V0S2V5KCkpKSB7CisgICAgICAgICAgICAgICAgZGljdG9uYXJ5LnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChleGlzdGluZ01hbmlmZXN0RmlsZSAhPSBudWxsKSB7Ci0JCQkJd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoZXhpc3RpbmdNYW5pZmVzdEZpbGUpOwotCQkJfSBlbHNlIHsKLQkJCQl3cml0ZXIgPSBuZXcgRmlsZVdyaXRlcihnZXRGaXJzdFBvc3NpYmxlTWFuaWZlc3RGaWxlKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwgZmFsc2UpLmdldFJhd0xvY2F0aW9uKCkKLQkJCQkJCS50b0ZpbGUoKSk7Ci0JCQl9Ci0JCQlCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0RmFjdG9yeS5jcmVhdGVCdW5kbGVNYW5pZmVzdChkaWN0b25hcnkpOwotCQkJYnVuZGxlTWFuaWZlc3Qud3JpdGUod3JpdGVyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdyaXRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIFdyaXRlciB3cml0ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGV4aXN0aW5nTWFuaWZlc3RGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIgPSBuZXcgRmlsZVdyaXRlcihleGlzdGluZ01hbmlmZXN0RmlsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGdldEZpcnN0UG9zc2libGVNYW5pZmVzdEZpbGUoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLCBmYWxzZSkuZ2V0UmF3TG9jYXRpb24oKS50b0ZpbGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0RmFjdG9yeS5jcmVhdGVCdW5kbGVNYW5pZmVzdChkaWN0b25hcnkpOworICAgICAgICAgICAgYnVuZGxlTWFuaWZlc3Qud3JpdGUod3JpdGVyKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlTmV3UGFyTWFuaWZlc3QoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHN5bWJvbGljTmFtZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBuYW1lLAotCQkJU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCURpY3Rpb25hcnk8U3RyaW5nLCBTdHJpbmc+IG1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RGYWN0b3J5LmNyZWF0ZUJ1bmRsZU1hbmlmZXN0KCkudG9EaWN0aW9uYXJ5KCk7Ci0JCWlmIChTdHJpbmdVdGlscy5pc05vdEJsYW5rKHN5bWJvbGljTmFtZSkpIHsKLQkJCW1hbmlmZXN0LnB1dCgiQXBwbGljYXRpb24tU3ltYm9saWNOYW1lIiwgc3ltYm9saWNOYW1lKTsKLQkJfQotCQlpZiAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayh2ZXJzaW9uKSkgewotCQkJbWFuaWZlc3QucHV0KCJBcHBsaWNhdGlvbi1WZXJzaW9uIiwgdmVyc2lvbik7Ci0JCX0KLQkJaWYgKFN0cmluZ1V0aWxzLmlzTm90QmxhbmsobmFtZSkpIHsKLQkJCW1hbmlmZXN0LnB1dCgiQXBwbGljYXRpb24tTmFtZSIsIG5hbWUpOwotCQl9Ci0JCWlmIChTdHJpbmdVdGlscy5pc05vdEJsYW5rKGRlc2NyaXB0aW9uKSkgewotCQkJbWFuaWZlc3QucHV0KCJBcHBsaWNhdGlvbi1EZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKLQkJfQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVOZXdQYXJNYW5pZmVzdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgc3ltYm9saWNOYW1lLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICBEaWN0aW9uYXJ5PFN0cmluZywgU3RyaW5nPiBtYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0RmFjdG9yeS5jcmVhdGVCdW5kbGVNYW5pZmVzdCgpLnRvRGljdGlvbmFyeSgpOworICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhzeW1ib2xpY05hbWUpKSB7CisgICAgICAgICAgICBtYW5pZmVzdC5wdXQoIkFwcGxpY2F0aW9uLVN5bWJvbGljTmFtZSIsIHN5bWJvbGljTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90QmxhbmsodmVyc2lvbikpIHsKKyAgICAgICAgICAgIG1hbmlmZXN0LnB1dCgiQXBwbGljYXRpb24tVmVyc2lvbiIsIHZlcnNpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEJsYW5rKG5hbWUpKSB7CisgICAgICAgICAgICBtYW5pZmVzdC5wdXQoIkFwcGxpY2F0aW9uLU5hbWUiLCBuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RCbGFuayhkZXNjcmlwdGlvbikpIHsKKyAgICAgICAgICAgIG1hbmlmZXN0LnB1dCgiQXBwbGljYXRpb24tRGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgICAgIH0KIAotCQlXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGdldEZpcnN0UG9zc2libGVNYW5pZmVzdEZpbGUocHJvamVjdCwgZmFsc2UpLmdldFJhd0xvY2F0aW9uKCkudG9GaWxlKCkpOwotCQkJQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdEZhY3RvcnkuY3JlYXRlQnVuZGxlTWFuaWZlc3QobWFuaWZlc3QpOwotCQkJYnVuZGxlTWFuaWZlc3Qud3JpdGUod3JpdGVyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdyaXRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIFdyaXRlciB3cml0ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoZ2V0Rmlyc3RQb3NzaWJsZU1hbmlmZXN0RmlsZShwcm9qZWN0LCBmYWxzZSkuZ2V0UmF3TG9jYXRpb24oKS50b0ZpbGUoKSk7CisgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0RmFjdG9yeS5jcmVhdGVCdW5kbGVNYW5pZmVzdChtYW5pZmVzdCk7CisgICAgICAgICAgICBidW5kbGVNYW5pZmVzdC53cml0ZSh3cml0ZXIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAod3JpdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0Rmlyc3RQb3NzaWJsZU1hbmlmZXN0RmlsZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzVGVzdE1hbmlmZXN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoRmFjZXRVdGlscy5oYXNOYXR1cmUocHJvamVjdCwgSmF2YUNvcmUuTkFUVVJFX0lEKSkgeworICAgIHB1YmxpYyBzdGF0aWMgSUZpbGUgZ2V0Rmlyc3RQb3NzaWJsZU1hbmlmZXN0RmlsZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIGlzVGVzdE1hbmlmZXN0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoRmFjZXRVdGlscy5oYXNOYXR1cmUocHJvamVjdCwgSmF2YUNvcmUuTkFUVVJFX0lEKSkgewogCi0JCQkJTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oCi0JCQkJCQlTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZS5nZXRTb3VyY2VDbGFzc3BhdGhFbnRyaWVzKHByb2plY3QsIGlzVGVzdE1hbmlmZXN0KSk7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChlbnRyaWVzLCBuZXcgQ29tcGFyYXRvcjxJQ2xhc3NwYXRoRW50cnk+KCkgeworICAgICAgICAgICAgICAgIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KAorICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZS5nZXRTb3VyY2VDbGFzc3BhdGhFbnRyaWVzKHByb2plY3QsIGlzVGVzdE1hbmlmZXN0KSk7CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChlbnRyaWVzLCBuZXcgQ29tcGFyYXRvcjxJQ2xhc3NwYXRoRW50cnk+KCkgewogCi0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShJQ2xhc3NwYXRoRW50cnkgbzEsIElDbGFzc3BhdGhFbnRyeSBvMikgewotCQkJCQkJU3RyaW5nIHMxID0gbzEuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJCQlTdHJpbmcgczIgPSBvMi5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQkJCWlmICgoIi8iICsgcHJvamVjdC5nZXROYW1lKCkgKyAiL3NyYy9tYWluL3Jlc291cmNlcyIpLmVxdWFscyhzMSkpIHsKLQkJCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCQl9IGVsc2UgaWYgKCgiLyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIvc3JjL3Rlc3QvcmVzb3VyY2VzIikuZXF1YWxzKHMxKSkgewotCQkJCQkJCXJldHVybiAtMTsKLQkJCQkJCX0KLQkJCQkJCWlmICgoIi8iICsgcHJvamVjdC5nZXROYW1lKCkgKyAiL3NyYy9tYWluL3Jlc291cmNlcyIpLmVxdWFscyhzMikpIHsKLQkJCQkJCQlyZXR1cm4gMTsKLQkJCQkJCX0gZWxzZSBpZiAoKCIvIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIi9zcmMvdGVzdC9yZXNvdXJjZXMiKS5lcXVhbHMoczIpKSB7Ci0JCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gczEuY29tcGFyZVRvKHMyKTsKLQkJCQkJfQotCQkJCX0pOworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoSUNsYXNzcGF0aEVudHJ5IG8xLCBJQ2xhc3NwYXRoRW50cnkgbzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzMSA9IG8xLmdldFBhdGgoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMyID0gbzIuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCIvIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIi9zcmMvbWFpbi9yZXNvdXJjZXMiKS5lcXVhbHMoczEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoIi8iICsgcHJvamVjdC5nZXROYW1lKCkgKyAiL3NyYy90ZXN0L3Jlc291cmNlcyIpLmVxdWFscyhzMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCIvIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIi9zcmMvbWFpbi9yZXNvdXJjZXMiKS5lcXVhbHMoczIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgiLyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIvc3JjL3Rlc3QvcmVzb3VyY2VzIikuZXF1YWxzKHMyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMxLmNvbXBhcmVUbyhzMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKIAotCQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogZW50cmllcykgewotCQkJCQlyZXR1cm4gY3JlYXRlTmV3TWFuaWZlc3RJbkZvbGRlcihmaW5kUmVzb3VyY2UocHJvamVjdCwgZW50cnkuZ2V0UGF0aCgpKSwgaXNUZXN0TWFuaWZlc3QpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5ld01hbmlmZXN0SW5Gb2xkZXIocHJvamVjdCwgaXNUZXN0TWFuaWZlc3QpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgICAgICAgICAgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBlbnRyaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVOZXdNYW5pZmVzdEluRm9sZGVyKGZpbmRSZXNvdXJjZShwcm9qZWN0LCBlbnRyeS5nZXRQYXRoKCkpLCBpc1Rlc3RNYW5pZmVzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlTmV3TWFuaWZlc3RJbkZvbGRlcihwcm9qZWN0LCBpc1Rlc3RNYW5pZmVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXByaXZhdGUgc3RhdGljIElGaWxlIGNyZWF0ZU5ld01hbmlmZXN0SW5Gb2xkZXIoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGlzVGVzdE1hbmlmZXN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBtYW5pZmVzdEZpbGVQYXRoID0gIk1FVEEtSU5GLyIKLQkJCQkrIChpc1Rlc3RNYW5pZmVzdAotCQkJCQkJPyBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uVEVTVF9NQU5JRkVTVF9GSUxFX05BTUUKLQkJCQkJCTogQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLk1BTklGRVNUX0ZJTEVfTkFNRSk7Ci0JCUlGaWxlIG1hbmlmZXN0RmlsZSA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCW1hbmlmZXN0RmlsZSA9ICgoSUZvbGRlcikgcmVzb3VyY2UpLmdldEZpbGUobWFuaWZlc3RGaWxlUGF0aCk7Ci0JCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJbWFuaWZlc3RGaWxlID0gKChJUHJvamVjdCkgcmVzb3VyY2UpLmdldEZpbGUobWFuaWZlc3RGaWxlUGF0aCk7Ci0JCX0KLQkJaWYgKG1hbmlmZXN0RmlsZSAhPSBudWxsICYmICFtYW5pZmVzdEZpbGUuZXhpc3RzKCkpIHsKLQkJCWlmICghbWFuaWZlc3RGaWxlLmdldFBhcmVudCgpLmV4aXN0cygpKSB7Ci0JCQkJKChJRm9sZGVyKSBtYW5pZmVzdEZpbGUuZ2V0UGFyZW50KCkpLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJCW1hbmlmZXN0RmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJNYW5pZmVzdC1WZXJzaW9uOiAxLjAiLmdldEJ5dGVzKCkpLCB0cnVlLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQlyZXR1cm4gbWFuaWZlc3RGaWxlOwotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBJRmlsZSBjcmVhdGVOZXdNYW5pZmVzdEluRm9sZGVyKElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpc1Rlc3RNYW5pZmVzdCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbWFuaWZlc3RGaWxlUGF0aCA9ICJNRVRBLUlORi8iCisgICAgICAgICAgICArIChpc1Rlc3RNYW5pZmVzdCA/IEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5URVNUX01BTklGRVNUX0ZJTEVfTkFNRSA6IEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5NQU5JRkVTVF9GSUxFX05BTUUpOworICAgICAgICBJRmlsZSBtYW5pZmVzdEZpbGUgPSBudWxsOworICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisgICAgICAgICAgICBtYW5pZmVzdEZpbGUgPSAoKElGb2xkZXIpIHJlc291cmNlKS5nZXRGaWxlKG1hbmlmZXN0RmlsZVBhdGgpOworICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKKyAgICAgICAgICAgIG1hbmlmZXN0RmlsZSA9ICgoSVByb2plY3QpIHJlc291cmNlKS5nZXRGaWxlKG1hbmlmZXN0RmlsZVBhdGgpOworICAgICAgICB9CisgICAgICAgIGlmIChtYW5pZmVzdEZpbGUgIT0gbnVsbCAmJiAhbWFuaWZlc3RGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBpZiAoIW1hbmlmZXN0RmlsZS5nZXRQYXJlbnQoKS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICgoSUZvbGRlcikgbWFuaWZlc3RGaWxlLmdldFBhcmVudCgpKS5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYW5pZmVzdEZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiTWFuaWZlc3QtVmVyc2lvbjogMS4wIi5nZXRCeXRlcygpKSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hbmlmZXN0RmlsZTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIGludCBnZXRMaW5lTnVtYmVyKElEb2N1bWVudCBkb2N1bWVudCwgQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBTdHJpbmcgdmFsdWVTdWJzdHJpbmcpIHsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGxpbmUgbnVtYmVyIGluIGNhc2UgdGhlIGJ1bmRsZSBtb2RlbCBpcyBjcmFzaGVkCi0JCWlmIChoZWFkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRMaW5lTnVtYmVyKElEb2N1bWVudCBkb2N1bWVudCwgQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBTdHJpbmcgdmFsdWVTdWJzdHJpbmcpIHsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBhIGxpbmUgbnVtYmVyIGluIGNhc2UgdGhlIGJ1bmRsZSBtb2RlbCBpcyBjcmFzaGVkCisgICAgICAgIGlmIChoZWFkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KIAotCQlmb3IgKGludCBsID0gaGVhZGVyLmdldExpbmVOdW1iZXIoKTsgbCA8IGhlYWRlci5nZXRMaW5lTnVtYmVyKCkgKyBoZWFkZXIuZ2V0TGluZXNTcGFuKCk7IGwrKykgewotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmVSZWdpb24gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24obCk7Ci0JCQkJU3RyaW5nIGxpbmVTdHIgPSBkb2N1bWVudC5nZXQobGluZVJlZ2lvbi5nZXRPZmZzZXQoKSwgbGluZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJaWYgKGxpbmVTdHIuaW5kZXhPZih2YWx1ZVN1YnN0cmluZykgPj0gMCkgewotCQkJCQlyZXR1cm4gbCArIDE7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gYmxlKSB7Ci0JCQl9Ci0JCX0KLQkJLy8gaXQgbWlnaHQgc3BhbiBtdWx0aXBsZSBsaW5lcywgdHJ5IGEgbG9uZ2VyIGFsZ29yaXRobQotCQl0cnkgewotCQkJSVJlZ2lvbiBsaW5lUmVnaW9uID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGhlYWRlci5nZXRMaW5lTnVtYmVyKCkpOwotCQkJU3RyaW5nIGxpbmVTdHIgPSBkb2N1bWVudC5nZXQobGluZVJlZ2lvbi5nZXRPZmZzZXQoKSwgbGluZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQlmb3IgKGludCBsID0gaGVhZGVyLmdldExpbmVOdW1iZXIoKSArIDE7IGwgPCBoZWFkZXIuZ2V0TGluZU51bWJlcigpICsgaGVhZGVyLmdldExpbmVzU3BhbigpOyBsKyspIHsKLQkJCQlsaW5lUmVnaW9uID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGwpOwotCQkJCWxpbmVTdHIgKz0gZG9jdW1lbnQuZ2V0KGxpbmVSZWdpb24uZ2V0T2Zmc2V0KCkgKyAxLyogdGhlIHNwYWNlICovLCBsaW5lUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQlpZiAobGluZVN0ci5pbmRleE9mKHZhbHVlU3Vic3RyaW5nKSA+PSAwKSB7Ci0JCQkJCXJldHVybiBsOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gYmxlKSB7Ci0JCX0KLQkJcmV0dXJuIGhlYWRlci5nZXRMaW5lTnVtYmVyKCkgKyAxOwotCX0KKyAgICAgICAgZm9yIChpbnQgbCA9IGhlYWRlci5nZXRMaW5lTnVtYmVyKCk7IGwgPCBoZWFkZXIuZ2V0TGluZU51bWJlcigpICsgaGVhZGVyLmdldExpbmVzU3BhbigpOyBsKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSVJlZ2lvbiBsaW5lUmVnaW9uID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGwpOworICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lU3RyID0gZG9jdW1lbnQuZ2V0KGxpbmVSZWdpb24uZ2V0T2Zmc2V0KCksIGxpbmVSZWdpb24uZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGlmIChsaW5lU3RyLmluZGV4T2YodmFsdWVTdWJzdHJpbmcpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwgKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGJsZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGl0IG1pZ2h0IHNwYW4gbXVsdGlwbGUgbGluZXMsIHRyeSBhIGxvbmdlciBhbGdvcml0aG0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElSZWdpb24gbGluZVJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihoZWFkZXIuZ2V0TGluZU51bWJlcigpKTsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lU3RyID0gZG9jdW1lbnQuZ2V0KGxpbmVSZWdpb24uZ2V0T2Zmc2V0KCksIGxpbmVSZWdpb24uZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgZm9yIChpbnQgbCA9IGhlYWRlci5nZXRMaW5lTnVtYmVyKCkgKyAxOyBsIDwgaGVhZGVyLmdldExpbmVOdW1iZXIoKSArIGhlYWRlci5nZXRMaW5lc1NwYW4oKTsgbCsrKSB7CisgICAgICAgICAgICAgICAgbGluZVJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihsKTsKKyAgICAgICAgICAgICAgICBsaW5lU3RyICs9IGRvY3VtZW50LmdldChsaW5lUmVnaW9uLmdldE9mZnNldCgpICsgMS8qIHRoZSBzcGFjZSAqLywgbGluZVJlZ2lvbi5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKGxpbmVTdHIuaW5kZXhPZih2YWx1ZVN1YnN0cmluZykgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGJsZSkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBoZWFkZXIuZ2V0TGluZU51bWJlcigpICsgMTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIGludCBnZXRQYWNrYWdlTGluZU51bWJlcihJRG9jdW1lbnQgZG9jdW1lbnQsIEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgTWFuaWZlc3RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZWxlbWVudC5nZXRWYWx1ZSgpOwotCQlpZiAoZWxlbWVudC5nZXREaXJlY3RpdmVLZXlzKCkgIT0gbnVsbCB8fCBlbGVtZW50LmdldEtleXMoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0TGluZU51bWJlcihkb2N1bWVudCwgaGVhZGVyLCBwYWNrYWdlTmFtZSArICI7Iik7Ci0JCX0KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQYWNrYWdlTGluZU51bWJlcihJRG9jdW1lbnQgZG9jdW1lbnQsIEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgTWFuaWZlc3RFbGVtZW50IGVsZW1lbnQpIHsKKyAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZWxlbWVudC5nZXRWYWx1ZSgpOworICAgICAgICBpZiAoZWxlbWVudC5nZXREaXJlY3RpdmVLZXlzKCkgIT0gbnVsbCB8fCBlbGVtZW50LmdldEtleXMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TGluZU51bWJlcihkb2N1bWVudCwgaGVhZGVyLCBwYWNrYWdlTmFtZSArICI7Iik7CisgICAgICAgIH0KIAotCQkvLyBjaGVjayBmb3IgdGhpcyBleGFjdCBwYWNrYWdlIG9uIHRoZSBsYXN0IGxpbmUKLQkJdHJ5IHsKLQkJCUlSZWdpb24gbGluZVJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihoZWFkZXIuZ2V0TGluZU51bWJlcigpICsgaGVhZGVyLmdldExpbmVzU3BhbigpIC0gMSk7Ci0JCQlTdHJpbmcgbGluZVN0ciA9IGRvY3VtZW50LmdldChsaW5lUmVnaW9uLmdldE9mZnNldCgpLCBsaW5lUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCWlmIChsaW5lU3RyLmVuZHNXaXRoKHBhY2thZ2VOYW1lKSkgewotCQkJCXJldHVybiBoZWFkZXIuZ2V0TGluZU51bWJlcigpICsgaGVhZGVyLmdldExpbmVzU3BhbigpOwotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBibGUpIHsKLQkJfQorICAgICAgICAvLyBjaGVjayBmb3IgdGhpcyBleGFjdCBwYWNrYWdlIG9uIHRoZSBsYXN0IGxpbmUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElSZWdpb24gbGluZVJlZ2lvbiA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihoZWFkZXIuZ2V0TGluZU51bWJlcigpICsgaGVhZGVyLmdldExpbmVzU3BhbigpIC0gMSk7CisgICAgICAgICAgICBTdHJpbmcgbGluZVN0ciA9IGRvY3VtZW50LmdldChsaW5lUmVnaW9uLmdldE9mZnNldCgpLCBsaW5lUmVnaW9uLmdldExlbmd0aCgpKTsKKyAgICAgICAgICAgIGlmIChsaW5lU3RyLmVuZHNXaXRoKHBhY2thZ2VOYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXIuZ2V0TGluZU51bWJlcigpICsgaGVhZGVyLmdldExpbmVzU3BhbigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBibGUpIHsKKyAgICAgICAgfQogCi0JCS8vIHNlYXJjaCBhbGwgZXhjZXB0IGxhc3QgbGluZQotCQlyZXR1cm4gZ2V0TGluZU51bWJlcihkb2N1bWVudCwgaGVhZGVyLCBwYWNrYWdlTmFtZSArICIsIik7Ci0JfQorICAgICAgICAvLyBzZWFyY2ggYWxsIGV4Y2VwdCBsYXN0IGxpbmUKKyAgICAgICAgcmV0dXJuIGdldExpbmVOdW1iZXIoZG9jdW1lbnQsIGhlYWRlciwgcGFja2FnZU5hbWUgKyAiLCIpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL0lCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuamF2YQppbmRleCAxMjdmYmVjLi5hODQ5YmZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CkBAIC0yMiw3ICsyMyw3IEBACiAgKiBSZWdpc3RlciBhbmQgdW4tcmVnaXN0ZXIgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIHdpdGggdGhlCiAgKiB7QGxpbmsgSUJ1bmRsZU1hbmlmZXN0TWFuYWdlciNhZGRCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyKCl9IGFuZAogICoge0BsaW5rIElCdW5kbGVNYW5pZmVzdE1hbmFnZXIjcmVtb3ZlQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcigpfSBtZXRob2QKLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKiBAc2VlIElCdW5kbGVNYW5pZmVzdE1hbmFnZXIKQEAgLTMwLDE1ICszMSwxNCBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyIHsKIAotCWVudW0gVHlwZSB7Ci0JCUlNUE9SVF9QQUNLQUdFLCBJTVBPUlRfQlVORExFLCBJTVBPUlRfTElCUkFSWSwgRVhQT1JUX1BBQ0tBR0UsIFJFUVVJUkVfQlVORExFCi0JfQorICAgIGVudW0gVHlwZSB7CisgICAgICAgIElNUE9SVF9QQUNLQUdFLCBJTVBPUlRfQlVORExFLCBJTVBPUlRfTElCUkFSWSwgRVhQT1JUX1BBQ0tBR0UsIFJFUVVJUkVfQlVORExFCisgICAgfQogCi0JLyoqCi0JICogTm90aWZpZWQgaWYgaW4gY2FzZSBvZiBhIGNoYW5nZSB0byBhIHtAbGluayBCdW5kbGVNYW5pZmVzdH0gd2l0aGluIHRoZSB7QGxpbmsgSUphdmFQcm9qZWN0fS4KLQkgKi8KLQl2b2lkIGJ1bmRsZU1hbmlmZXN0Q2hhbmdlZChCdW5kbGVNYW5pZmVzdCBuZXdCdW5kbGVNYW5mZXN0LCBCdW5kbGVNYW5pZmVzdCBvbGRCdW5kbGVNYW5pZmVzdCwKLQkJCUJ1bmRsZU1hbmlmZXN0IG5ld1Rlc3RCdW5kbGVNYW5pZmVzdCwgQnVuZGxlTWFuaWZlc3Qgb2xkVGVzdEJ1bmRsZU1hbmlmZXN0LCBTZXQ8VHlwZT4gdHlwZSwKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCk7CisgICAgLyoqCisgICAgICogTm90aWZpZWQgaWYgaW4gY2FzZSBvZiBhIGNoYW5nZSB0byBhIHtAbGluayBCdW5kbGVNYW5pZmVzdH0gd2l0aGluIHRoZSB7QGxpbmsgSUphdmFQcm9qZWN0fS4KKyAgICAgKi8KKyAgICB2b2lkIGJ1bmRsZU1hbmlmZXN0Q2hhbmdlZChCdW5kbGVNYW5pZmVzdCBuZXdCdW5kbGVNYW5mZXN0LCBCdW5kbGVNYW5pZmVzdCBvbGRCdW5kbGVNYW5pZmVzdCwgQnVuZGxlTWFuaWZlc3QgbmV3VGVzdEJ1bmRsZU1hbmlmZXN0LAorICAgICAgICBCdW5kbGVNYW5pZmVzdCBvbGRUZXN0QnVuZGxlTWFuaWZlc3QsIFNldDxUeXBlPiB0eXBlLCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpOwogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvSUJ1bmRsZU1hbmlmZXN0TWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL0lCdW5kbGVNYW5pZmVzdE1hbmFnZXIuamF2YQppbmRleCA1MGVkMzJjLi5hNzUwYmE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvSUJ1bmRsZU1hbmlmZXN0TWFuYWdlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9JQnVuZGxlTWFuaWZlc3RNYW5hZ2VyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwpAQCAtMTgsNDkgKzE5LDQ5IEBACiAvKioKICAqIEEge0BsaW5rIElCdW5kbGVNYW5pZmVzdE1hbmFnZXJ9IGltcGxlbWVudGF0aW9uIG1hbmFnZXMgdGhlIGxpZmUtY3ljbGUgb2Yge0BsaW5rIEJ1bmRsZU1hbmlmZXN0fWluc3RhbmNlcyBhbmQKICAqIHByb3ZpZGVzIHJlYWQgYWNjZXNzIHRvIG1hbmlmZXN0IGluc3RhbmNlcy4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUJ1bmRsZU1hbmlmZXN0TWFuYWdlciB7CiAKLQkvKioKLQkgKiBSZXR1cm5zIGEge0BsaW5rIEJ1bmRsZU1hbmlmZXN0fSBmb3IgdGhlIGdpdmVuIHtAbGluayBJSmF2YVByb2plY3R9LgotCSAqIDxwPgotCSAqIElmIHRoZSB7QGxpbmsgQnVuZGxlTWFuaWZlc3R9IGhhcyBub3QgYWxyZWFkeSBiZWVuIGxvYWRlZCB0aGlzIG1ldGhvZCB3aWxsIHRyeSB0byBsb2NhdGUgYSBNQU5JRkVTVC5NRiBmaWxlIGluCi0JICogdGhlIHtAbGluayBJSmF2YVByb2plY3R9J3Mgc291cmNlIGZvbGRlcnMgYW5kIGNyZWF0ZSB0aGUge0BsaW5rIEJ1bmRsZU1hbmlmZXN0fSBpbnN0YW5jZS4KLQkgKi8KLQlCdW5kbGVNYW5pZmVzdCBnZXRCdW5kbGVNYW5pZmVzdChJSmF2YVByb2plY3QgamF2YVByb2plY3QpOworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgQnVuZGxlTWFuaWZlc3R9IGZvciB0aGUgZ2l2ZW4ge0BsaW5rIElKYXZhUHJvamVjdH0uCisgICAgICogPHA+CisgICAgICogSWYgdGhlIHtAbGluayBCdW5kbGVNYW5pZmVzdH0gaGFzIG5vdCBhbHJlYWR5IGJlZW4gbG9hZGVkIHRoaXMgbWV0aG9kIHdpbGwgdHJ5IHRvIGxvY2F0ZSBhIE1BTklGRVNULk1GIGZpbGUgaW4KKyAgICAgKiB0aGUge0BsaW5rIElKYXZhUHJvamVjdH0ncyBzb3VyY2UgZm9sZGVycyBhbmQgY3JlYXRlIHRoZSB7QGxpbmsgQnVuZGxlTWFuaWZlc3R9IGluc3RhbmNlLgorICAgICAqLworICAgIEJ1bmRsZU1hbmlmZXN0IGdldEJ1bmRsZU1hbmlmZXN0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIGEge0BsaW5rIEJ1bmRsZU1hbmlmZXN0fSBmb3IgdGhlIGdpdmVuIHtAbGluayBJSmF2YVByb2plY3R9J3MgdGVzdCBkZXBlbmRlbmNpZXMuCi0JICogPHA+Ci0JICogSWYgdGhlIHtAbGluayBCdW5kbGVNYW5pZmVzdH0gaGFzIG5vdCBhbHJlYWR5IGJlZW4gbG9hZGVkIHRoaXMgbWV0aG9kIHdpbGwgdHJ5IHRvIGxvY2F0ZSBhIFRFU1QuTUYgZmlsZSBpbiB0aGUKLQkgKiB7QGxpbmsgSUphdmFQcm9qZWN0fSdzIHNvdXJjZSBmb2xkZXJzIGFuZCBjcmVhdGUgdGhlIHtAbGluayBCdW5kbGVNYW5pZmVzdH0gaW5zdGFuY2UuCi0JICovCi0JQnVuZGxlTWFuaWZlc3QgZ2V0VGVzdEJ1bmRsZU1hbmlmZXN0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBCdW5kbGVNYW5pZmVzdH0gZm9yIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFQcm9qZWN0fSdzIHRlc3QgZGVwZW5kZW5jaWVzLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSB7QGxpbmsgQnVuZGxlTWFuaWZlc3R9IGhhcyBub3QgYWxyZWFkeSBiZWVuIGxvYWRlZCB0aGlzIG1ldGhvZCB3aWxsIHRyeSB0byBsb2NhdGUgYSBURVNULk1GIGZpbGUgaW4gdGhlCisgICAgICoge0BsaW5rIElKYXZhUHJvamVjdH0ncyBzb3VyY2UgZm9sZGVycyBhbmQgY3JlYXRlIHRoZSB7QGxpbmsgQnVuZGxlTWFuaWZlc3R9IGluc3RhbmNlLgorICAgICAqLworICAgIEJ1bmRsZU1hbmlmZXN0IGdldFRlc3RCdW5kbGVNYW5pZmVzdChJSmF2YVByb2plY3QgamF2YVByb2plY3QpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgcGFja2FnZSBpbXBvcnRzLgotCSAqIDxwPgotCSAqIE5vdGU6IHRoZSByZXNvbHZlZCBwYWNrYWdlIGltcG9ydHMgZG8gbm90IG5lZWQgdG8gYmUgc2FtZSBhcyB0aGUgSW1wb3J0LVBhY2thZ2UgaGVhZGVycyBhcyB0aGlzIG1ldGhvZCByZXR1cm5zCi0JICogdHJhbnNpdGl2ZWx5IGltcG9ydGVkIHBhY2thZ2VzIChSZXF1aXJlLUJ1bmRsZSwgTGlicmFyeS1JbXBvcnQpIGFzIHdlbGwuCi0JICovCi0JU2V0PFN0cmluZz4gZ2V0UmVzb2x2ZWRQYWNrYWdlSW1wb3J0cyhJSmF2YVByb2plY3QgamF2YVByb2plY3QpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlc29sdmVkIHBhY2thZ2UgaW1wb3J0cy4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiB0aGUgcmVzb2x2ZWQgcGFja2FnZSBpbXBvcnRzIGRvIG5vdCBuZWVkIHRvIGJlIHNhbWUgYXMgdGhlIEltcG9ydC1QYWNrYWdlIGhlYWRlcnMgYXMgdGhpcyBtZXRob2QgcmV0dXJucworICAgICAqIHRyYW5zaXRpdmVseSBpbXBvcnRlZCBwYWNrYWdlcyAoUmVxdWlyZS1CdW5kbGUsIExpYnJhcnktSW1wb3J0KSBhcyB3ZWxsLgorICAgICAqLworICAgIFNldDxTdHJpbmc+IGdldFJlc29sdmVkUGFja2FnZUltcG9ydHMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4cG9ydGVkIHBhY2thZ2VzIG9mIHRoZSBnaXZlbiA8Y29kZT5qYXZhUHJvamVjdDwvY29kZT4uCi0JICovCi0JU2V0PFN0cmluZz4gZ2V0UGFja2FnZUV4cG9ydHMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBleHBvcnRlZCBwYWNrYWdlcyBvZiB0aGUgZ2l2ZW4gPGNvZGU+amF2YVByb2plY3Q8L2NvZGU+LgorICAgICAqLworICAgIFNldDxTdHJpbmc+IGdldFBhY2thZ2VFeHBvcnRzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCk7CiAKLQkvKioKLQkgKiBBZGQgYSB7QGxpbmsgSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXJ9IHdpdGggdGhlIG1vZGVsIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBhZGRCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyKElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyIGJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIpOworICAgIC8qKgorICAgICAqIEFkZCBhIHtAbGluayBJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcn0gd2l0aCB0aGUgbW9kZWwgbWFuYWdlci4KKyAgICAgKi8KKyAgICB2b2lkIGFkZEJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIoSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIgYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcik7CiAKLQkvKioKLQkgKiBSZW1vdmUgYSByZWdpc3RlcmVkIHtAbGluayBJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcn0gZnJvbSB0aGUgbW9kZWwgbWFuYWdlci4KLQkgKi8KLQl2b2lkIHJlbW92ZUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIoSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIgYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcik7CisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgcmVnaXN0ZXJlZCB7QGxpbmsgSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXJ9IGZyb20gdGhlIG1vZGVsIG1hbmFnZXIuCisgICAgICovCisgICAgdm9pZCByZW1vdmVCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyKElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyIGJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIpOwogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvSUJ1bmRsZU1hbmlmZXN0TWFuZ2VyV29ya2luZ0NvcHkuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9JQnVuZGxlTWFuaWZlc3RNYW5nZXJXb3JraW5nQ29weS5qYXZhCmluZGV4IDkwOTg5MGIuLjA1MDIyYWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9JQnVuZGxlTWFuaWZlc3RNYW5nZXJXb3JraW5nQ29weS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9JQnVuZGxlTWFuaWZlc3RNYW5nZXJXb3JraW5nQ29weS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLlNldDsKQEAgLTE2LDE1ICsxNywxNSBAQAogCiAvKioKICAqIEV4dGVuc2lvbiBpbnRlcmZhY2UgZm9yIHtAbGluayBJQnVuZGxlTWFuaWZlc3RNYW5hZ2VyfSB0aGF0IGFsbG93cyB3cml0ZSBhY2Nlc3MgZm9yIGNlcnRhaW4gbWFuYWdlZCByZXNvdXJjZXMuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElCdW5kbGVNYW5pZmVzdE1hbmdlcldvcmtpbmdDb3B5IGV4dGVuZHMgSUJ1bmRsZU1hbmlmZXN0TWFuYWdlciB7CiAKLQkvKioKLQkgKiBTZXRzIHRoZSByZXNvbHZlZCBwYWNrYWdlIGltcG9ydHMgZm9yIHRoZSBnaXZlbiA8Y29kZT5qYXZhUHJvamVjdDwvY29kZT4uCi0JICovCi0Jdm9pZCB1cGRhdGVSZXNvbHZlZFBhY2thZ2VJbXBvcnRzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU2V0PFN0cmluZz4gcmVzb2x2ZWRQYWNrYWdlSW1wb3J0cyk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcmVzb2x2ZWQgcGFja2FnZSBpbXBvcnRzIGZvciB0aGUgZ2l2ZW4gPGNvZGU+amF2YVByb2plY3Q8L2NvZGU+LgorICAgICAqLworICAgIHZvaWQgdXBkYXRlUmVzb2x2ZWRQYWNrYWdlSW1wb3J0cyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFNldDxTdHJpbmc+IHJlc29sdmVkUGFja2FnZUltcG9ydHMpOwogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvSUhlYWRlckNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL0lIZWFkZXJDb25zdGFudHMuamF2YQppbmRleCAxYjUwYjYxLi5jMDIyM2FhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvSUhlYWRlckNvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9JSGVhZGVyQ29uc3RhbnRzLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmU7CiAKIC8qKgpAQCAtMTUsMzggKzE2LDM4IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUhlYWRlckNvbnN0YW50cyB7CiAKLQlwdWJsaWMgU3RyaW5nIElNUE9SVF9CVU5ETEUgPSAiSW1wb3J0LUJ1bmRsZSI7CisgICAgcHVibGljIFN0cmluZyBJTVBPUlRfQlVORExFID0gIkltcG9ydC1CdW5kbGUiOwogCi0JcHVibGljIFN0cmluZyBJTVBPUlRfTElCUkFSWSA9ICJJbXBvcnQtTGlicmFyeSI7CisgICAgcHVibGljIFN0cmluZyBJTVBPUlRfTElCUkFSWSA9ICJJbXBvcnQtTGlicmFyeSI7CiAKLQlwdWJsaWMgU3RyaW5nIElNUE9SVF9URU1QTEFURSA9ICJJbXBvcnQtVGVtcGxhdGUiOworICAgIHB1YmxpYyBTdHJpbmcgSU1QT1JUX1RFTVBMQVRFID0gIkltcG9ydC1UZW1wbGF0ZSI7CiAKLQlwdWJsaWMgU3RyaW5nIEVYUE9SVF9URU1QTEFURSA9ICJFeHBvcnQtVGVtcGxhdGUiOworICAgIHB1YmxpYyBTdHJpbmcgRVhQT1JUX1RFTVBMQVRFID0gIkV4cG9ydC1UZW1wbGF0ZSI7CiAKLQlwdWJsaWMgU3RyaW5nIEVYQ0xVREVEX0lNUE9SVFMgPSAiRXhjbHVkZWQtSW1wb3J0cyI7CisgICAgcHVibGljIFN0cmluZyBFWENMVURFRF9JTVBPUlRTID0gIkV4Y2x1ZGVkLUltcG9ydHMiOwogCi0JcHVibGljIFN0cmluZyBFWENMVURFRF9FWFBPUlRTID0gIkV4Y2x1ZGVkLUV4cG9ydHMiOworICAgIHB1YmxpYyBTdHJpbmcgRVhDTFVERURfRVhQT1JUUyA9ICJFeGNsdWRlZC1FeHBvcnRzIjsKIAotCXB1YmxpYyBTdHJpbmcgVU5WRVJTSU9ORURfSU1QT1JUUyA9ICJVbnZlcnNpb25lZC1JbXBvcnRzIjsKKyAgICBwdWJsaWMgU3RyaW5nIFVOVkVSU0lPTkVEX0lNUE9SVFMgPSAiVW52ZXJzaW9uZWQtSW1wb3J0cyI7CiAKLQlwdWJsaWMgU3RyaW5nIElHTk9SRURfRVhJU1RJTkdfSEVBREVSUyA9ICJJZ25vcmVkLUV4aXN0aW5nLUhlYWRlcnMiOworICAgIHB1YmxpYyBTdHJpbmcgSUdOT1JFRF9FWElTVElOR19IRUFERVJTID0gIklnbm9yZWQtRXhpc3RpbmctSGVhZGVycyI7CiAKLQlwdWJsaWMgU3RyaW5nIFBBUl9TWU1CT0xJQ05BTUUgPSAiQXBwbGljYXRpb24tU3ltYm9saWNOYW1lIjsKKyAgICBwdWJsaWMgU3RyaW5nIFBBUl9TWU1CT0xJQ05BTUUgPSAiQXBwbGljYXRpb24tU3ltYm9saWNOYW1lIjsKIAotCXB1YmxpYyBTdHJpbmcgUEFSX1ZFUlNJT04gPSAiQXBwbGljYXRpb24tVmVyc2lvbiI7CisgICAgcHVibGljIFN0cmluZyBQQVJfVkVSU0lPTiA9ICJBcHBsaWNhdGlvbi1WZXJzaW9uIjsKIAotCXB1YmxpYyBTdHJpbmcgUEFSX05BTUUgPSAiQXBwbGljYXRpb24tTmFtZSI7CisgICAgcHVibGljIFN0cmluZyBQQVJfTkFNRSA9ICJBcHBsaWNhdGlvbi1OYW1lIjsKIAotCXB1YmxpYyBTdHJpbmcgUEFSX0RFU0NSSVBUSU9OID0gIkFwcGxpY2F0aW9uLURlc2NyaXB0aW9uIjsKKyAgICBwdWJsaWMgU3RyaW5nIFBBUl9ERVNDUklQVElPTiA9ICJBcHBsaWNhdGlvbi1EZXNjcmlwdGlvbiI7CiAKLQlwdWJsaWMgU3RyaW5nIFBST01PVEVTX0RJUkVDVElWRSA9ICJwcm9tb3Rlcy1leHBvcnRzIjsKKyAgICBwdWJsaWMgU3RyaW5nIFBST01PVEVTX0RJUkVDVElWRSA9ICJwcm9tb3Rlcy1leHBvcnRzIjsKIAotCS8vIHRlbXBsYXRlLm1mIGhlYWRlcnMKKyAgICAvLyB0ZW1wbGF0ZS5tZiBoZWFkZXJzCiAKLQlwdWJsaWMgU3RyaW5nIFRFU1RfSU1QT1JUX0JVTkRMRSA9ICJUZXN0LUltcG9ydC1CdW5kbGUiOworICAgIHB1YmxpYyBTdHJpbmcgVEVTVF9JTVBPUlRfQlVORExFID0gIlRlc3QtSW1wb3J0LUJ1bmRsZSI7CiAKLQlwdWJsaWMgU3RyaW5nIFRFU1RfSU1QT1JUX0xJQlJBUlkgPSAiVGVzdC1JbXBvcnQtTGlicmFyeSI7CisgICAgcHVibGljIFN0cmluZyBURVNUX0lNUE9SVF9MSUJSQVJZID0gIlRlc3QtSW1wb3J0LUxpYnJhcnkiOwogCi0JcHVibGljIFN0cmluZyBURVNUX0lNUE9SVF9QQUNLQUdFID0gIlRlc3QtSW1wb3J0LVBhY2thZ2UiOworICAgIHB1YmxpYyBTdHJpbmcgVEVTVF9JTVBPUlRfUEFDS0FHRSA9ICJUZXN0LUltcG9ydC1QYWNrYWdlIjsKIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL2RlcGVuZGVuY2llcy9JRGVwZW5kZW5jeUxvY2F0b3IuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9kZXBlbmRlbmNpZXMvSURlcGVuZGVuY3lMb2NhdG9yLmphdmEKaW5kZXggM2FlY2MwNi4uMzNjOWEyMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL2RlcGVuZGVuY2llcy9JRGVwZW5kZW5jeUxvY2F0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvZGVwZW5kZW5jaWVzL0lEZXBlbmRlbmN5TG9jYXRvci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLmRlcGVuZGVuY2llczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTIyLDIxICsyMywyMSBAQAogCiAvKioKICAqIEltcGxlbWVudG9ycyBvZiB0aGlzIGludGVyZmFjZSBjYW4gY2FsY3VsYXRlIGRlcGVuZGVuY2llcyBmb3IgYSBnaXZlbiB7QGxpbmsgQnVuZGxlTWFuaWZlc3R9LgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMi4wLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJRGVwZW5kZW5jeUxvY2F0b3IgewogCi0JZW51bSBKYXZhVmVyc2lvbiB7Ci0JCUphdmE1LCBKYXZhNjsKLQl9CisgICAgZW51bSBKYXZhVmVyc2lvbiB7CisgICAgICAgIEphdmE1LCBKYXZhNjsKKyAgICB9CiAKLQlNYXA8RmlsZSwgTGlzdDxTdHJpbmc+PiBsb2NhdGVEZXBlbmRlbmNpZXMoQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QpIHRocm93cyBEZXBlbmRlbmN5TG9jYXRpb25FeGNlcHRpb247CisgICAgTWFwPEZpbGUsIExpc3Q8U3RyaW5nPj4gbG9jYXRlRGVwZW5kZW5jaWVzKEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0KSB0aHJvd3MgRGVwZW5kZW5jeUxvY2F0aW9uRXhjZXB0aW9uOwogCi0JU2V0PD8gZXh0ZW5kcyBCdW5kbGVEZWZpbml0aW9uPiBnZXRCdW5kbGVzKCk7CisgICAgU2V0PD8gZXh0ZW5kcyBCdW5kbGVEZWZpbml0aW9uPiBnZXRCdW5kbGVzKCk7CiAKLQlTZXQ8PyBleHRlbmRzIExpYnJhcnlEZWZpbml0aW9uPiBnZXRMaWJyYXJpZXMoKTsKKyAgICBTZXQ8PyBleHRlbmRzIExpYnJhcnlEZWZpbml0aW9uPiBnZXRMaWJyYXJpZXMoKTsKIAotCXZvaWQgc2h1dGRvd24oKTsKKyAgICB2b2lkIHNodXRkb3duKCk7CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvZWRpdG9yL21vZGVsL0ltcG9ydEJ1bmRsZUhlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL2VkaXRvci9tb2RlbC9JbXBvcnRCdW5kbGVIZWFkZXIuamF2YQppbmRleCBhZjUwNDBkLi41OTllNDdlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvZWRpdG9yL21vZGVsL0ltcG9ydEJ1bmRsZUhlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9lZGl0b3IvbW9kZWwvSW1wb3J0QnVuZGxlSGVhZGVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUuZWRpdG9yLm1vZGVsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKQEAgLTIxLDQzICsyMiw0MyBAQAogICovCiBwdWJsaWMgY2xhc3MgSW1wb3J0QnVuZGxlSGVhZGVyIGV4dGVuZHMgQ29tcG9zaXRlTWFuaWZlc3RIZWFkZXIgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKLQlwdWJsaWMgSW1wb3J0QnVuZGxlSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIElCdW5kbGUgYnVuZGxlLCBTdHJpbmcgbGluZURlbGltaXRlcikgewotCQlzdXBlcihuYW1lLCB2YWx1ZSwgYnVuZGxlLCBsaW5lRGVsaW1pdGVyKTsKLQl9CisgICAgcHVibGljIEltcG9ydEJ1bmRsZUhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBJQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgdmFsdWUsIGJ1bmRsZSwgbGluZURlbGltaXRlcik7CisgICAgfQogCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlKFN0cmluZyBpZCkgewotCQlhZGRCdW5kbGUoaWQsIG51bGwpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBhZGRCdW5kbGUoU3RyaW5nIGlkKSB7CisgICAgICAgIGFkZEJ1bmRsZShpZCwgbnVsbCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJSW1wb3J0QnVuZGxlT2JqZWN0IGVsZW1lbnQgPSBuZXcgSW1wb3J0QnVuZGxlT2JqZWN0KHRoaXMsIGlkKTsKKyAgICBwdWJsaWMgdm9pZCBhZGRCdW5kbGUoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbikgeworICAgICAgICBJbXBvcnRCdW5kbGVPYmplY3QgZWxlbWVudCA9IG5ldyBJbXBvcnRCdW5kbGVPYmplY3QodGhpcywgaWQpOwogCi0JCWlmICh2ZXJzaW9uICE9IG51bGwgJiYgdmVyc2lvbi50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQllbGVtZW50LnNldEF0dHJpYnV0ZShDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUsIHZlcnNpb24udHJpbSgpKTsKLQkJfQorICAgICAgICBpZiAodmVyc2lvbiAhPSBudWxsICYmIHZlcnNpb24udHJpbSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLCB2ZXJzaW9uLnRyaW0oKSk7CisgICAgICAgIH0KIAotCQlhZGRNYW5pZmVzdEVsZW1lbnQoZWxlbWVudCk7Ci0JfQorICAgICAgICBhZGRNYW5pZmVzdEVsZW1lbnQoZWxlbWVudCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgcmVtb3ZlQnVuZGxlKFN0cmluZyBpZCkgewotCQlyZW1vdmVNYW5pZmVzdEVsZW1lbnQoaWQpOwotCX0KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVCdW5kbGUoU3RyaW5nIGlkKSB7CisgICAgICAgIHJlbW92ZU1hbmlmZXN0RWxlbWVudChpZCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgcmVtb3ZlQnVuZGxlKEltcG9ydEJ1bmRsZU9iamVjdCBidW5kbGUpIHsKLQkJcmVtb3ZlTWFuaWZlc3RFbGVtZW50KGJ1bmRsZSk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUJ1bmRsZShJbXBvcnRCdW5kbGVPYmplY3QgYnVuZGxlKSB7CisgICAgICAgIHJlbW92ZU1hbmlmZXN0RWxlbWVudChidW5kbGUpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQREVNYW5pZmVzdEVsZW1lbnQgY3JlYXRlRWxlbWVudChNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gbmV3IEltcG9ydEJ1bmRsZU9iamVjdCh0aGlzLCBlbGVtZW50KTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFBERU1hbmlmZXN0RWxlbWVudCBjcmVhdGVFbGVtZW50KE1hbmlmZXN0RWxlbWVudCBlbGVtZW50KSB7CisgICAgICAgIHJldHVybiBuZXcgSW1wb3J0QnVuZGxlT2JqZWN0KHRoaXMsIGVsZW1lbnQpOworICAgIH0KIAotCXB1YmxpYyBJbXBvcnRCdW5kbGVPYmplY3RbXSBnZXRJbXBvcnRlZEJ1bmRsZXMoKSB7Ci0JCVBERU1hbmlmZXN0RWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0RWxlbWVudHMoKTsKLQkJSW1wb3J0QnVuZGxlT2JqZWN0W10gcmVzdWx0ID0gbmV3IEltcG9ydEJ1bmRsZU9iamVjdFtlbGVtZW50cy5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGVsZW1lbnRzLCAwLCByZXN1bHQsIDAsIGVsZW1lbnRzLmxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgIHB1YmxpYyBJbXBvcnRCdW5kbGVPYmplY3RbXSBnZXRJbXBvcnRlZEJ1bmRsZXMoKSB7CisgICAgICAgIFBERU1hbmlmZXN0RWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0RWxlbWVudHMoKTsKKyAgICAgICAgSW1wb3J0QnVuZGxlT2JqZWN0W10gcmVzdWx0ID0gbmV3IEltcG9ydEJ1bmRsZU9iamVjdFtlbGVtZW50cy5sZW5ndGhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGVsZW1lbnRzLCAwLCByZXN1bHQsIDAsIGVsZW1lbnRzLmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL2VkaXRvci9tb2RlbC9JbXBvcnRCdW5kbGVPYmplY3QuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9lZGl0b3IvbW9kZWwvSW1wb3J0QnVuZGxlT2JqZWN0LmphdmEKaW5kZXggZmE4ZGFhNy4uNzFkNzIxYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL2VkaXRvci9tb2RlbC9JbXBvcnRCdW5kbGVPYmplY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvZWRpdG9yL21vZGVsL0ltcG9ydEJ1bmRsZU9iamVjdC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLmVkaXRvci5tb2RlbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7CkBAIC0yMSw3NCArMjIsNzQgQEAKICAqLwogcHVibGljIGNsYXNzIEltcG9ydEJ1bmRsZU9iamVjdCBleHRlbmRzIFBERU1hbmlmZXN0RWxlbWVudCB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAotCXB1YmxpYyBJbXBvcnRCdW5kbGVPYmplY3QoTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBNYW5pZmVzdEVsZW1lbnQgbWFuaWZlc3RFbGVtZW50KSB7Ci0JCXN1cGVyKGhlYWRlciwgbWFuaWZlc3RFbGVtZW50KTsKLQl9CisgICAgcHVibGljIEltcG9ydEJ1bmRsZU9iamVjdChNYW5pZmVzdEhlYWRlciBoZWFkZXIsIE1hbmlmZXN0RWxlbWVudCBtYW5pZmVzdEVsZW1lbnQpIHsKKyAgICAgICAgc3VwZXIoaGVhZGVyLCBtYW5pZmVzdEVsZW1lbnQpOworICAgIH0KIAotCXB1YmxpYyBJbXBvcnRCdW5kbGVPYmplY3QoTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBTdHJpbmcgdmFsdWUpIHsKLQkJc3VwZXIoaGVhZGVyLCB2YWx1ZSk7Ci0JfQorICAgIHB1YmxpYyBJbXBvcnRCdW5kbGVPYmplY3QoTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIoaGVhZGVyLCB2YWx1ZSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCVN0cmluZyBvbGQgPSBnZXRJZCgpOwotCQlzZXRWYWx1ZShpZCk7Ci0JCWZIZWFkZXIudXBkYXRlKCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQodGhpcywgZkhlYWRlci5nZXROYW1lKCksIG9sZCwgaWQpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgU3RyaW5nIG9sZCA9IGdldElkKCk7CisgICAgICAgIHNldFZhbHVlKGlkKTsKKyAgICAgICAgdGhpcy5mSGVhZGVyLnVwZGF0ZSgpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VkKHRoaXMsIHRoaXMuZkhlYWRlci5nZXROYW1lKCksIG9sZCwgaWQpOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZSgpOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUoKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGQgPSBnZXRWZXJzaW9uKCk7Ci0JCS8vIFJlc2V0IHRoZSBwcmV2aW91cyB2YWx1ZQotCQlzZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLCBudWxsKTsKLQkJLy8gUGFyc2UgdGhlIHZlcnNpb24gU3RyaW5nIGludG8gc2VnbWVudHMKLQkJU3RyaW5nW10gdmFsdWVzID0gTWFuaWZlc3RFbGVtZW50LmdldEFycmF5RnJvbUxpc3QodmVyc2lvbik7Ci0JCS8vIElmIHRoZXJlIGFyZSB2YWx1ZXMsIGFkZCB0aGVtCi0JCWlmICgodmFsdWVzICE9IG51bGwpICYmICh2YWx1ZXMubGVuZ3RoID4gMCkpIHsKLQkJCWZvciAoU3RyaW5nIGVsZW1lbnQgOiB2YWx1ZXMpIHsKLQkJCQlhZGRBdHRyaWJ1dGUoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlmSGVhZGVyLnVwZGF0ZSgpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKHRoaXMsIENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURSwgb2xkLCB2ZXJzaW9uKTsKLQl9CisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworICAgICAgICBTdHJpbmcgb2xkID0gZ2V0VmVyc2lvbigpOworICAgICAgICAvLyBSZXNldCB0aGUgcHJldmlvdXMgdmFsdWUKKyAgICAgICAgc2V0QXR0cmlidXRlKENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURSwgbnVsbCk7CisgICAgICAgIC8vIFBhcnNlIHRoZSB2ZXJzaW9uIFN0cmluZyBpbnRvIHNlZ21lbnRzCisgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IE1hbmlmZXN0RWxlbWVudC5nZXRBcnJheUZyb21MaXN0KHZlcnNpb24pOworICAgICAgICAvLyBJZiB0aGVyZSBhcmUgdmFsdWVzLCBhZGQgdGhlbQorICAgICAgICBpZiAodmFsdWVzICE9IG51bGwgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLCBlbGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlzLmZIZWFkZXIudXBkYXRlKCk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWQodGhpcywgQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLCBvbGQsIHZlcnNpb24pOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJU3RyaW5nW10gdmVyc2lvblNlZ21lbnRzID0gZ2V0QXR0cmlidXRlcyhDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUpOwotCQlTdHJpbmdCdWZmZXIgdmVyc2lvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHZlcnNpb25TZWdtZW50cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIGlmICh2ZXJzaW9uU2VnbWVudHMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKHZlcnNpb25TZWdtZW50cy5sZW5ndGggPT0gMSkgewotCQkJdmVyc2lvbi5hcHBlbmQodmVyc2lvblNlZ21lbnRzWzBdKTsKLQkJfSBlbHNlIGlmICh2ZXJzaW9uU2VnbWVudHMubGVuZ3RoID09IDIpIHsKLQkJCXZlcnNpb24uYXBwZW5kKHZlcnNpb25TZWdtZW50c1swXSk7Ci0JCQl2ZXJzaW9uLmFwcGVuZCgnLCcpOwotCQkJdmVyc2lvbi5hcHBlbmQodmVyc2lvblNlZ21lbnRzWzFdKTsKLQkJfQotCQlyZXR1cm4gdmVyc2lvbi50b1N0cmluZygpOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisgICAgICAgIFN0cmluZ1tdIHZlcnNpb25TZWdtZW50cyA9IGdldEF0dHJpYnV0ZXMoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHZlcnNpb24gPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmICh2ZXJzaW9uU2VnbWVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvblNlZ21lbnRzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uU2VnbWVudHMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIHZlcnNpb24uYXBwZW5kKHZlcnNpb25TZWdtZW50c1swXSk7CisgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvblNlZ21lbnRzLmxlbmd0aCA9PSAyKSB7CisgICAgICAgICAgICB2ZXJzaW9uLmFwcGVuZCh2ZXJzaW9uU2VnbWVudHNbMF0pOworICAgICAgICAgICAgdmVyc2lvbi5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgIHZlcnNpb24uYXBwZW5kKHZlcnNpb25TZWdtZW50c1sxXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZlcnNpb24udG9TdHJpbmcoKTsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgewotCQlyZXR1cm4gQ29uc3RhbnRzLlJFU09MVVRJT05fT1BUSU9OQUwuZXF1YWxzKGdldERpcmVjdGl2ZShDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUpKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgeworICAgICAgICByZXR1cm4gQ29uc3RhbnRzLlJFU09MVVRJT05fT1BUSU9OQUwuZXF1YWxzKGdldERpcmVjdGl2ZShDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUpKTsKIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChib29sZWFuIG9wdGlvbmFsKSB7Ci0JCWJvb2xlYW4gb2xkID0gaXNPcHRpb25hbCgpOwotCQlpZiAob3B0aW9uYWwpIHsKLQkJCXNldERpcmVjdGl2ZShDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUsIENvbnN0YW50cy5SRVNPTFVUSU9OX09QVElPTkFMKTsKLQkJfSBlbHNlIHsKLQkJCXNldERpcmVjdGl2ZShDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUsIG51bGwpOwotCQkJc2V0QXR0cmlidXRlKElDb3JlQ29uc3RhbnRzLk9QVElPTkFMX0FUVFJJQlVURSwgbnVsbCk7Ci0JCX0KLQkJZkhlYWRlci51cGRhdGUoKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZCh0aGlzLCBDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUsIEJvb2xlYW4udG9TdHJpbmcob2xkKSwgQm9vbGVhbi50b1N0cmluZyhvcHRpb25hbCkpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChib29sZWFuIG9wdGlvbmFsKSB7CisgICAgICAgIGJvb2xlYW4gb2xkID0gaXNPcHRpb25hbCgpOworICAgICAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgICAgICAgIHNldERpcmVjdGl2ZShDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUsIENvbnN0YW50cy5SRVNPTFVUSU9OX09QVElPTkFMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldERpcmVjdGl2ZShDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUsIG51bGwpOworICAgICAgICAgICAgc2V0QXR0cmlidXRlKElDb3JlQ29uc3RhbnRzLk9QVElPTkFMX0FUVFJJQlVURSwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5mSGVhZGVyLnVwZGF0ZSgpOworICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2VkKHRoaXMsIENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSwgQm9vbGVhbi50b1N0cmluZyhvbGQpLCBCb29sZWFuLnRvU3RyaW5nKG9wdGlvbmFsKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL2VkaXRvci9tb2RlbC9JbXBvcnRMaWJyYXJ5SGVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvZWRpdG9yL21vZGVsL0ltcG9ydExpYnJhcnlIZWFkZXIuamF2YQppbmRleCBkNDI0NmRiLi4zOWYyMWJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvZWRpdG9yL21vZGVsL0ltcG9ydExpYnJhcnlIZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvZWRpdG9yL21vZGVsL0ltcG9ydExpYnJhcnlIZWFkZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS5lZGl0b3IubW9kZWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50OwpAQCAtMjEsNDQgKzIyLDQ0IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBJbXBvcnRMaWJyYXJ5SGVhZGVyIGV4dGVuZHMgQ29tcG9zaXRlTWFuaWZlc3RIZWFkZXIgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKLQlwdWJsaWMgSW1wb3J0TGlicmFyeUhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBJQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHsKLQkJc3VwZXIobmFtZSwgdmFsdWUsIGJ1bmRsZSwgbGluZURlbGltaXRlcik7Ci0JfQorICAgIHB1YmxpYyBJbXBvcnRMaWJyYXJ5SGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIElCdW5kbGUgYnVuZGxlLCBTdHJpbmcgbGluZURlbGltaXRlcikgeworICAgICAgICBzdXBlcihuYW1lLCB2YWx1ZSwgYnVuZGxlLCBsaW5lRGVsaW1pdGVyKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBhZGRMaWJyYXJ5KFN0cmluZyBpZCkgewotCQlhZGRMaWJyYXJ5KGlkLCBudWxsKTsKLQl9CisgICAgcHVibGljIHZvaWQgYWRkTGlicmFyeShTdHJpbmcgaWQpIHsKKyAgICAgICAgYWRkTGlicmFyeShpZCwgbnVsbCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgYWRkTGlicmFyeShTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCUltcG9ydExpYnJhcnlPYmplY3QgZWxlbWVudCA9IG5ldyBJbXBvcnRMaWJyYXJ5T2JqZWN0KHRoaXMsIGlkKTsKKyAgICBwdWJsaWMgdm9pZCBhZGRMaWJyYXJ5KFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgSW1wb3J0TGlicmFyeU9iamVjdCBlbGVtZW50ID0gbmV3IEltcG9ydExpYnJhcnlPYmplY3QodGhpcywgaWQpOwogCi0JCWlmICh2ZXJzaW9uICE9IG51bGwgJiYgdmVyc2lvbi50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQllbGVtZW50LnNldEF0dHJpYnV0ZShDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUsIHZlcnNpb24udHJpbSgpKTsKLQkJfQorICAgICAgICBpZiAodmVyc2lvbiAhPSBudWxsICYmIHZlcnNpb24udHJpbSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLCB2ZXJzaW9uLnRyaW0oKSk7CisgICAgICAgIH0KIAotCQlhZGRNYW5pZmVzdEVsZW1lbnQoZWxlbWVudCk7Ci0JfQorICAgICAgICBhZGRNYW5pZmVzdEVsZW1lbnQoZWxlbWVudCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlicmFyeShTdHJpbmcgaWQpIHsKLQkJcmVtb3ZlTWFuaWZlc3RFbGVtZW50KGlkKTsKLQl9CisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlicmFyeShTdHJpbmcgaWQpIHsKKyAgICAgICAgcmVtb3ZlTWFuaWZlc3RFbGVtZW50KGlkKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCByZW1vdmVMaWJyYXJ5KEltcG9ydExpYnJhcnlPYmplY3QgYnVuZGxlKSB7Ci0JCXJlbW92ZU1hbmlmZXN0RWxlbWVudChidW5kbGUpOwotCX0KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaWJyYXJ5KEltcG9ydExpYnJhcnlPYmplY3QgYnVuZGxlKSB7CisgICAgICAgIHJlbW92ZU1hbmlmZXN0RWxlbWVudChidW5kbGUpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQREVNYW5pZmVzdEVsZW1lbnQgY3JlYXRlRWxlbWVudChNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gbmV3IEltcG9ydExpYnJhcnlPYmplY3QodGhpcywgZWxlbWVudCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQREVNYW5pZmVzdEVsZW1lbnQgY3JlYXRlRWxlbWVudChNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCkgeworICAgICAgICByZXR1cm4gbmV3IEltcG9ydExpYnJhcnlPYmplY3QodGhpcywgZWxlbWVudCk7CisgICAgfQogCi0JcHVibGljIEltcG9ydExpYnJhcnlPYmplY3RbXSBnZXRJbXBvcnRlZExpYnJhcmllcygpIHsKLQkJUERFTWFuaWZlc3RFbGVtZW50W10gZWxlbWVudHMgPSBnZXRFbGVtZW50cygpOwotCQlJbXBvcnRMaWJyYXJ5T2JqZWN0W10gcmVzdWx0ID0gbmV3IEltcG9ydExpYnJhcnlPYmplY3RbZWxlbWVudHMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShlbGVtZW50cywgMCwgcmVzdWx0LCAwLCBlbGVtZW50cy5sZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICBwdWJsaWMgSW1wb3J0TGlicmFyeU9iamVjdFtdIGdldEltcG9ydGVkTGlicmFyaWVzKCkgeworICAgICAgICBQREVNYW5pZmVzdEVsZW1lbnRbXSBlbGVtZW50cyA9IGdldEVsZW1lbnRzKCk7CisgICAgICAgIEltcG9ydExpYnJhcnlPYmplY3RbXSByZXN1bHQgPSBuZXcgSW1wb3J0TGlicmFyeU9iamVjdFtlbGVtZW50cy5sZW5ndGhdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGVsZW1lbnRzLCAwLCByZXN1bHQsIDAsIGVsZW1lbnRzLmxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvZWRpdG9yL21vZGVsL0ltcG9ydExpYnJhcnlPYmplY3QuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9lZGl0b3IvbW9kZWwvSW1wb3J0TGlicmFyeU9iamVjdC5qYXZhCmluZGV4IDEwMDg1ZjcuLmY1YjE4NmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9lZGl0b3IvbW9kZWwvSW1wb3J0TGlicmFyeU9iamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9lZGl0b3IvbW9kZWwvSW1wb3J0TGlicmFyeU9iamVjdC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLmVkaXRvci5tb2RlbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7CkBAIC0yMSw3NSArMjIsNzUgQEAKICAqLwogcHVibGljIGNsYXNzIEltcG9ydExpYnJhcnlPYmplY3QgZXh0ZW5kcyBQREVNYW5pZmVzdEVsZW1lbnQgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKLQlwdWJsaWMgSW1wb3J0TGlicmFyeU9iamVjdChNYW5pZmVzdEhlYWRlciBoZWFkZXIsIE1hbmlmZXN0RWxlbWVudCBtYW5pZmVzdEVsZW1lbnQpIHsKLQkJc3VwZXIoaGVhZGVyLCBtYW5pZmVzdEVsZW1lbnQpOwotCX0KKyAgICBwdWJsaWMgSW1wb3J0TGlicmFyeU9iamVjdChNYW5pZmVzdEhlYWRlciBoZWFkZXIsIE1hbmlmZXN0RWxlbWVudCBtYW5pZmVzdEVsZW1lbnQpIHsKKyAgICAgICAgc3VwZXIoaGVhZGVyLCBtYW5pZmVzdEVsZW1lbnQpOworICAgIH0KIAotCXB1YmxpYyBJbXBvcnRMaWJyYXJ5T2JqZWN0KE1hbmlmZXN0SGVhZGVyIGhlYWRlciwgU3RyaW5nIHZhbHVlKSB7Ci0JCXN1cGVyKGhlYWRlciwgdmFsdWUpOwotCX0KKyAgICBwdWJsaWMgSW1wb3J0TGlicmFyeU9iamVjdChNYW5pZmVzdEhlYWRlciBoZWFkZXIsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzdXBlcihoZWFkZXIsIHZhbHVlKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJU3RyaW5nIG9sZCA9IGdldElkKCk7Ci0JCXNldFZhbHVlKGlkKTsKLQkJZkhlYWRlci51cGRhdGUoKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZCh0aGlzLCBmSGVhZGVyLmdldE5hbWUoKSwgb2xkLCBpZCk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworICAgICAgICBTdHJpbmcgb2xkID0gZ2V0SWQoKTsKKyAgICAgICAgc2V0VmFsdWUoaWQpOworICAgICAgICB0aGlzLmZIZWFkZXIudXBkYXRlKCk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWQodGhpcywgdGhpcy5mSGVhZGVyLmdldE5hbWUoKSwgb2xkLCBpZCk7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZSgpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZCA9IGdldFZlcnNpb24oKTsKLQkJLy8gUmVzZXQgdGhlIHByZXZpb3VzIHZhbHVlCi0JCXNldEF0dHJpYnV0ZShDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUsIG51bGwpOwotCQkvLyBQYXJzZSB0aGUgdmVyc2lvbiBTdHJpbmcgaW50byBzZWdtZW50cwotCQlTdHJpbmdbXSB2YWx1ZXMgPSBNYW5pZmVzdEVsZW1lbnQuZ2V0QXJyYXlGcm9tTGlzdCh2ZXJzaW9uKTsKLQkJLy8gSWYgdGhlcmUgYXJlIHZhbHVlcywgYWRkIHRoZW0KLQkJaWYgKCh2YWx1ZXMgIT0gbnVsbCkgJiYgKHZhbHVlcy5sZW5ndGggPiAwKSkgewotCQkJZm9yIChTdHJpbmcgZWxlbWVudCA6IHZhbHVlcykgewotCQkJCWFkZEF0dHJpYnV0ZShDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUsIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWZIZWFkZXIudXBkYXRlKCk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQodGhpcywgQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLCBvbGQsIHZlcnNpb24pOwotCX0KKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisgICAgICAgIFN0cmluZyBvbGQgPSBnZXRWZXJzaW9uKCk7CisgICAgICAgIC8vIFJlc2V0IHRoZSBwcmV2aW91cyB2YWx1ZQorICAgICAgICBzZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLCBudWxsKTsKKyAgICAgICAgLy8gUGFyc2UgdGhlIHZlcnNpb24gU3RyaW5nIGludG8gc2VnbWVudHMKKyAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gTWFuaWZlc3RFbGVtZW50LmdldEFycmF5RnJvbUxpc3QodmVyc2lvbik7CisgICAgICAgIC8vIElmIHRoZXJlIGFyZSB2YWx1ZXMsIGFkZCB0aGVtCisgICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgZWxlbWVudCA6IHZhbHVlcykgeworICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUsIGVsZW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRoaXMuZkhlYWRlci51cGRhdGUoKTsKKyAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlZCh0aGlzLCBDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUsIG9sZCwgdmVyc2lvbik7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlTdHJpbmdbXSB2ZXJzaW9uU2VnbWVudHMgPSBnZXRBdHRyaWJ1dGVzKENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURSk7Ci0JCVN0cmluZ0J1ZmZlciB2ZXJzaW9uID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAodmVyc2lvblNlZ21lbnRzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKHZlcnNpb25TZWdtZW50cy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSBpZiAodmVyc2lvblNlZ21lbnRzLmxlbmd0aCA9PSAxKSB7Ci0JCQl2ZXJzaW9uLmFwcGVuZCh2ZXJzaW9uU2VnbWVudHNbMF0pOwotCQl9IGVsc2UgaWYgKHZlcnNpb25TZWdtZW50cy5sZW5ndGggPT0gMikgewotCQkJdmVyc2lvbi5hcHBlbmQodmVyc2lvblNlZ21lbnRzWzBdKTsKLQkJCXZlcnNpb24uYXBwZW5kKCcsJyk7Ci0JCQl2ZXJzaW9uLmFwcGVuZCh2ZXJzaW9uU2VnbWVudHNbMV0pOwotCQl9Ci0JCXJldHVybiB2ZXJzaW9uLnRvU3RyaW5nKCk7Ci0JfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgU3RyaW5nW10gdmVyc2lvblNlZ21lbnRzID0gZ2V0QXR0cmlidXRlcyhDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUpOworICAgICAgICBTdHJpbmdCdWZmZXIgdmVyc2lvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaWYgKHZlcnNpb25TZWdtZW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uU2VnbWVudHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25TZWdtZW50cy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgdmVyc2lvbi5hcHBlbmQodmVyc2lvblNlZ21lbnRzWzBdKTsKKyAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uU2VnbWVudHMubGVuZ3RoID09IDIpIHsKKyAgICAgICAgICAgIHZlcnNpb24uYXBwZW5kKHZlcnNpb25TZWdtZW50c1swXSk7CisgICAgICAgICAgICB2ZXJzaW9uLmFwcGVuZCgnLCcpOworICAgICAgICAgICAgdmVyc2lvbi5hcHBlbmQodmVyc2lvblNlZ21lbnRzWzFdKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmVyc2lvbi50b1N0cmluZygpOworICAgIH0KIAotCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBDb25zdGFudHMuUkVTT0xVVElPTl9PUFRJT05BTC5lcXVhbHMoZ2V0RGlyZWN0aXZlKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSkpOworICAgIHB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7CisgICAgICAgIHJldHVybiBDb25zdGFudHMuUkVTT0xVVElPTl9PUFRJT05BTC5lcXVhbHMoZ2V0RGlyZWN0aXZlKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSkpOwogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKGJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJYm9vbGVhbiBvbGQgPSBpc09wdGlvbmFsKCk7Ci0JCWlmIChvcHRpb25hbCkgewotCQkJc2V0RGlyZWN0aXZlKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSwgQ29uc3RhbnRzLlJFU09MVVRJT05fT1BUSU9OQUwpOwotCQl9IGVsc2UgewotCQkJc2V0RGlyZWN0aXZlKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSwgbnVsbCk7Ci0JCQlzZXRBdHRyaWJ1dGUoSUNvcmVDb25zdGFudHMuT1BUSU9OQUxfQVRUUklCVVRFLCBudWxsKTsKLQkJfQotCQlmSGVhZGVyLnVwZGF0ZSgpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKHRoaXMsIENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSwgQm9vbGVhbi50b1N0cmluZyhvbGQpLCBCb29sZWFuLnRvU3RyaW5nKG9wdGlvbmFsKSk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKGJvb2xlYW4gb3B0aW9uYWwpIHsKKyAgICAgICAgYm9vbGVhbiBvbGQgPSBpc09wdGlvbmFsKCk7CisgICAgICAgIGlmIChvcHRpb25hbCkgeworICAgICAgICAgICAgc2V0RGlyZWN0aXZlKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSwgQ29uc3RhbnRzLlJFU09MVVRJT05fT1BUSU9OQUwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0RGlyZWN0aXZlKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSwgbnVsbCk7CisgICAgICAgICAgICBzZXRBdHRyaWJ1dGUoSUNvcmVDb25zdGFudHMuT1BUSU9OQUxfQVRUUklCVVRFLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmZIZWFkZXIudXBkYXRlKCk7CisgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZWQodGhpcywgQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLCBCb29sZWFuLnRvU3RyaW5nKG9sZCksIEJvb2xlYW4udG9TdHJpbmcob3B0aW9uYWwpKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9lZGl0b3IvbW9kZWwvU3ByaW5nQnVuZGxlTW9kZWwuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9lZGl0b3IvbW9kZWwvU3ByaW5nQnVuZGxlTW9kZWwuamF2YQppbmRleCAzYmIxZjkzLi4wNDg2NTM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvZWRpdG9yL21vZGVsL1NwcmluZ0J1bmRsZU1vZGVsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL2VkaXRvci9tb2RlbC9TcHJpbmdCdW5kbGVNb2RlbC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLmVkaXRvci5tb2RlbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7CkBAIC0yMCwyMiArMjEsMjIgQEAKICAqLwogcHVibGljIGNsYXNzIFNwcmluZ0J1bmRsZU1vZGVsIGV4dGVuZHMgQnVuZGxlTW9kZWwgewogCi0JcHJpdmF0ZSBJQnVuZGxlTW9kZWxGYWN0b3J5IGZGYWN0b3J5OworICAgIHByaXZhdGUgSUJ1bmRsZU1vZGVsRmFjdG9yeSBmRmFjdG9yeTsKIAotCXB1YmxpYyBTcHJpbmdCdW5kbGVNb2RlbChTdHJpbmcgc3RyaW5nLCBib29sZWFuIGlzUmVjb25jaWxpbmcpIHsKLQkJdGhpcyhuZXcgRG9jdW1lbnQoc3RyaW5nKSwgaXNSZWNvbmNpbGluZyk7Ci0JfQorICAgIHB1YmxpYyBTcHJpbmdCdW5kbGVNb2RlbChTdHJpbmcgc3RyaW5nLCBib29sZWFuIGlzUmVjb25jaWxpbmcpIHsKKyAgICAgICAgdGhpcyhuZXcgRG9jdW1lbnQoc3RyaW5nKSwgaXNSZWNvbmNpbGluZyk7CisgICAgfQogCi0JcHVibGljIFNwcmluZ0J1bmRsZU1vZGVsKElEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiBpc1JlY29uY2lsaW5nKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBpc1JlY29uY2lsaW5nKTsKLQl9CisgICAgcHVibGljIFNwcmluZ0J1bmRsZU1vZGVsKElEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiBpc1JlY29uY2lsaW5nKSB7CisgICAgICAgIHN1cGVyKGRvY3VtZW50LCBpc1JlY29uY2lsaW5nKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUJ1bmRsZU1vZGVsRmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCQlpZiAoZkZhY3RvcnkgPT0gbnVsbCkgewotCQkJZkZhY3RvcnkgPSBuZXcgU3ByaW5nQnVuZGxlTW9kZWxGYWN0b3J5KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmRmFjdG9yeTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCdW5kbGVNb2RlbEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKKyAgICAgICAgaWYgKHRoaXMuZkZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5mRmFjdG9yeSA9IG5ldyBTcHJpbmdCdW5kbGVNb2RlbEZhY3RvcnkodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZkZhY3Rvcnk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvZWRpdG9yL21vZGVsL1NwcmluZ0J1bmRsZU1vZGVsRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9jb3JlL2VkaXRvci9tb2RlbC9TcHJpbmdCdW5kbGVNb2RlbEZhY3RvcnkuamF2YQppbmRleCAxODgzYWU1Li5iNGFkYTc4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2NvcmUvZWRpdG9yL21vZGVsL1NwcmluZ0J1bmRsZU1vZGVsRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvY29yZS9lZGl0b3IvbW9kZWwvU3ByaW5nQnVuZGxlTW9kZWxGYWN0b3J5LmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUuZWRpdG9yLm1vZGVsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwpAQCAtMzksODEgKzQwLDc5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTcHJpbmdCdW5kbGVNb2RlbEZhY3RvcnkgaW1wbGVtZW50cyBJQnVuZGxlTW9kZWxGYWN0b3J5IHsKIAotCXByaXZhdGUgZmluYWwgSUJ1bmRsZU1vZGVsIGZNb2RlbDsKKyAgICBwcml2YXRlIGZpbmFsIElCdW5kbGVNb2RlbCBmTW9kZWw7CiAKLQlwdWJsaWMgU3ByaW5nQnVuZGxlTW9kZWxGYWN0b3J5KElCdW5kbGVNb2RlbCBtb2RlbCkgewotCQlmTW9kZWwgPSBtb2RlbDsKLQl9CisgICAgcHVibGljIFNwcmluZ0J1bmRsZU1vZGVsRmFjdG9yeShJQnVuZGxlTW9kZWwgbW9kZWwpIHsKKyAgICAgICAgdGhpcy5mTW9kZWwgPSBtb2RlbDsKKyAgICB9CiAKLQlwdWJsaWMgSU1hbmlmZXN0SGVhZGVyIGNyZWF0ZUhlYWRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIHB1YmxpYyBJTWFuaWZlc3RIZWFkZXIgY3JlYXRlSGVhZGVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlwdWJsaWMgSU1hbmlmZXN0SGVhZGVyIGNyZWF0ZUhlYWRlcihTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJTWFuaWZlc3RIZWFkZXIgaGVhZGVyID0gbnVsbDsKLQkJSUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQlpZiAoZk1vZGVsICE9IG51bGwpIHsKLQkJCWJ1bmRsZSA9IGZNb2RlbC5nZXRCdW5kbGUoKTsKLQkJfQotCQlTdHJpbmcgbmV3TGluZTsKLQkJaWYgKGZNb2RlbCBpbnN0YW5jZW9mIEJ1bmRsZU1vZGVsKSB7Ci0JCQluZXdMaW5lID0gVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcigoKEJ1bmRsZU1vZGVsKSBmTW9kZWwpLmdldERvY3VtZW50KCkpOwotCQl9IGVsc2UgewotCQkJbmV3TGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQl9CisgICAgcHVibGljIElNYW5pZmVzdEhlYWRlciBjcmVhdGVIZWFkZXIoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIE1hbmlmZXN0SGVhZGVyIGhlYWRlciA9IG51bGw7CisgICAgICAgIElCdW5kbGUgYnVuZGxlID0gbnVsbDsKKyAgICAgICAgaWYgKHRoaXMuZk1vZGVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1bmRsZSA9IHRoaXMuZk1vZGVsLmdldEJ1bmRsZSgpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBuZXdMaW5lOworICAgICAgICBpZiAodGhpcy5mTW9kZWwgaW5zdGFuY2VvZiBCdW5kbGVNb2RlbCkgeworICAgICAgICAgICAgbmV3TGluZSA9IFRleHRVdGlsaXRpZXMuZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoKChCdW5kbGVNb2RlbCkgdGhpcy5mTW9kZWwpLmdldERvY3VtZW50KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3TGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CiAKLQkJaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5CVU5ETEVfQUNUSVZBVE9SKSkgewotCQkJaGVhZGVyID0gbmV3IEJ1bmRsZUFjdGl2YXRvckhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5CVU5ETEVfTE9DQUxJWkFUSU9OKSkgewotCQkJaGVhZGVyID0gbmV3IEJ1bmRsZUxvY2FsaXphdGlvbkhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5CVU5ETEVfTkFNRSkpIHsKLQkJCWhlYWRlciA9IG5ldyBCdW5kbGVOYW1lSGVhZGVyKGtleSwgdmFsdWUsIGJ1bmRsZSwgbmV3TGluZSk7Ci0JCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5UKSkgewotCQkJaGVhZGVyID0gbmV3IFJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkpIHsKLQkJCWhlYWRlciA9IG5ldyBCdW5kbGVTeW1ib2xpY05hbWVIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuQlVORExFX1ZFTkRPUikpIHsKLQkJCWhlYWRlciA9IG5ldyBCdW5kbGVWZW5kb3JIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuQlVORExFX1ZFUlNJT04pKSB7Ci0JCQloZWFkZXIgPSBuZXcgQnVuZGxlVmVyc2lvbkhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5CVU5ETEVfQ0xBU1NQQVRIKSkgewotCQkJaGVhZGVyID0gbmV3IEJ1bmRsZUNsYXNzcGF0aEhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKElDb3JlQ29uc3RhbnRzLkVDTElQU0VfTEFaWVNUQVJUKQotCQkJCXx8IGtleS5lcXVhbHNJZ25vcmVDYXNlKElDb3JlQ29uc3RhbnRzLkVDTElQU0VfQVVUT1NUQVJUKSkgewotCQkJaGVhZGVyID0gbmV3IExhenlTdGFydEhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSkKLQkJCQl8fCBrZXkuZXF1YWxzSWdub3JlQ2FzZShJQ29yZUNvbnN0YW50cy5QUk9WSURFX1BBQ0tBR0UpKSB7Ci0JCQloZWFkZXIgPSBuZXcgRXhwb3J0UGFja2FnZUhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5GUkFHTUVOVF9IT1NUKSkgewotCQkJaGVhZGVyID0gbmV3IEZyYWdtZW50SG9zdEhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSkpIHsKLQkJCWhlYWRlciA9IG5ldyBJbXBvcnRQYWNrYWdlSGVhZGVyKGtleSwgdmFsdWUsIGJ1bmRsZSwgbmV3TGluZSk7Ci0JCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFKSkgewotCQkJaGVhZGVyID0gbmV3IFJlcXVpcmVCdW5kbGVIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9CVU5ETEUpKSB7Ci0JCQloZWFkZXIgPSBuZXcgSW1wb3J0QnVuZGxlSGVhZGVyKGtleSwgdmFsdWUsIGJ1bmRsZSwgbmV3TGluZSk7Ci0JCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSkpIHsKLQkJCWhlYWRlciA9IG5ldyBJbXBvcnRMaWJyYXJ5SGVhZGVyKGtleSwgdmFsdWUsIGJ1bmRsZSwgbmV3TGluZSk7Ci0JCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfVEVNUExBVEUpKSB7Ci0JCQloZWFkZXIgPSBuZXcgSW1wb3J0UGFja2FnZUhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKElIZWFkZXJDb25zdGFudHMuRVhQT1JUX1RFTVBMQVRFKSkgewotCQkJaGVhZGVyID0gbmV3IEV4cG9ydFBhY2thZ2VIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShJSGVhZGVyQ29uc3RhbnRzLkVYQ0xVREVEX0lNUE9SVFMpKSB7Ci0JCQloZWFkZXIgPSBuZXcgSW1wb3J0UGFja2FnZUhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKElIZWFkZXJDb25zdGFudHMuRVhDTFVERURfRVhQT1JUUykpIHsKLQkJCWhlYWRlciA9IG5ldyBFeHBvcnRQYWNrYWdlSGVhZGVyKGtleSwgdmFsdWUsIGJ1bmRsZSwgbmV3TGluZSk7Ci0JCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5VTlZFUlNJT05FRF9JTVBPUlRTKSkgewotCQkJaGVhZGVyID0gbmV3IEltcG9ydFBhY2thZ2VIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShJSGVhZGVyQ29uc3RhbnRzLlRFU1RfSU1QT1JUX0JVTkRMRSkpIHsKLQkJCWhlYWRlciA9IG5ldyBJbXBvcnRCdW5kbGVIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShJSGVhZGVyQ29uc3RhbnRzLlRFU1RfSU1QT1JUX0xJQlJBUlkpKSB7Ci0JCQloZWFkZXIgPSBuZXcgSW1wb3J0TGlicmFyeUhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKElIZWFkZXJDb25zdGFudHMuVEVTVF9JTVBPUlRfUEFDS0FHRSkpIHsKLQkJCWhlYWRlciA9IG5ldyBJbXBvcnRQYWNrYWdlSGVhZGVyKGtleSwgdmFsdWUsIGJ1bmRsZSwgbmV3TGluZSk7Ci0JCX0gZWxzZSB7Ci0JCQloZWFkZXIgPSBuZXcgTWFuaWZlc3RIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKLQkJfQotCQlyZXR1cm4gaGVhZGVyOwotCX0KKyAgICAgICAgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5CVU5ETEVfQUNUSVZBVE9SKSkgeworICAgICAgICAgICAgaGVhZGVyID0gbmV3IEJ1bmRsZUFjdGl2YXRvckhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOworICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5CVU5ETEVfTE9DQUxJWkFUSU9OKSkgeworICAgICAgICAgICAgaGVhZGVyID0gbmV3IEJ1bmRsZUxvY2FsaXphdGlvbkhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOworICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5CVU5ETEVfTkFNRSkpIHsKKyAgICAgICAgICAgIGhlYWRlciA9IG5ldyBCdW5kbGVOYW1lSGVhZGVyKGtleSwgdmFsdWUsIGJ1bmRsZSwgbmV3TGluZSk7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5UKSkgeworICAgICAgICAgICAgaGVhZGVyID0gbmV3IFJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkpIHsKKyAgICAgICAgICAgIGhlYWRlciA9IG5ldyBCdW5kbGVTeW1ib2xpY05hbWVIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuQlVORExFX1ZFTkRPUikpIHsKKyAgICAgICAgICAgIGhlYWRlciA9IG5ldyBCdW5kbGVWZW5kb3JIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuQlVORExFX1ZFUlNJT04pKSB7CisgICAgICAgICAgICBoZWFkZXIgPSBuZXcgQnVuZGxlVmVyc2lvbkhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOworICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5CVU5ETEVfQ0xBU1NQQVRIKSkgeworICAgICAgICAgICAgaGVhZGVyID0gbmV3IEJ1bmRsZUNsYXNzcGF0aEhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOworICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKElDb3JlQ29uc3RhbnRzLkVDTElQU0VfTEFaWVNUQVJUKSB8fCBrZXkuZXF1YWxzSWdub3JlQ2FzZShJQ29yZUNvbnN0YW50cy5FQ0xJUFNFX0FVVE9TVEFSVCkpIHsKKyAgICAgICAgICAgIGhlYWRlciA9IG5ldyBMYXp5U3RhcnRIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UpIHx8IGtleS5lcXVhbHNJZ25vcmVDYXNlKElDb3JlQ29uc3RhbnRzLlBST1ZJREVfUEFDS0FHRSkpIHsKKyAgICAgICAgICAgIGhlYWRlciA9IG5ldyBFeHBvcnRQYWNrYWdlSGVhZGVyKGtleSwgdmFsdWUsIGJ1bmRsZSwgbmV3TGluZSk7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QpKSB7CisgICAgICAgICAgICBoZWFkZXIgPSBuZXcgRnJhZ21lbnRIb3N0SGVhZGVyKGtleSwgdmFsdWUsIGJ1bmRsZSwgbmV3TGluZSk7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFKSkgeworICAgICAgICAgICAgaGVhZGVyID0gbmV3IEltcG9ydFBhY2thZ2VIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUpKSB7CisgICAgICAgICAgICBoZWFkZXIgPSBuZXcgUmVxdWlyZUJ1bmRsZUhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOworICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSkpIHsKKyAgICAgICAgICAgIGhlYWRlciA9IG5ldyBJbXBvcnRCdW5kbGVIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9MSUJSQVJZKSkgeworICAgICAgICAgICAgaGVhZGVyID0gbmV3IEltcG9ydExpYnJhcnlIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9URU1QTEFURSkpIHsKKyAgICAgICAgICAgIGhlYWRlciA9IG5ldyBJbXBvcnRQYWNrYWdlSGVhZGVyKGtleSwgdmFsdWUsIGJ1bmRsZSwgbmV3TGluZSk7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5FWFBPUlRfVEVNUExBVEUpKSB7CisgICAgICAgICAgICBoZWFkZXIgPSBuZXcgRXhwb3J0UGFja2FnZUhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOworICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKElIZWFkZXJDb25zdGFudHMuRVhDTFVERURfSU1QT1JUUykpIHsKKyAgICAgICAgICAgIGhlYWRlciA9IG5ldyBJbXBvcnRQYWNrYWdlSGVhZGVyKGtleSwgdmFsdWUsIGJ1bmRsZSwgbmV3TGluZSk7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9FWFBPUlRTKSkgeworICAgICAgICAgICAgaGVhZGVyID0gbmV3IEV4cG9ydFBhY2thZ2VIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKKyAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShJSGVhZGVyQ29uc3RhbnRzLlVOVkVSU0lPTkVEX0lNUE9SVFMpKSB7CisgICAgICAgICAgICBoZWFkZXIgPSBuZXcgSW1wb3J0UGFja2FnZUhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOworICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKElIZWFkZXJDb25zdGFudHMuVEVTVF9JTVBPUlRfQlVORExFKSkgeworICAgICAgICAgICAgaGVhZGVyID0gbmV3IEltcG9ydEJ1bmRsZUhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOworICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKElIZWFkZXJDb25zdGFudHMuVEVTVF9JTVBPUlRfTElCUkFSWSkpIHsKKyAgICAgICAgICAgIGhlYWRlciA9IG5ldyBJbXBvcnRMaWJyYXJ5SGVhZGVyKGtleSwgdmFsdWUsIGJ1bmRsZSwgbmV3TGluZSk7CisgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5URVNUX0lNUE9SVF9QQUNLQUdFKSkgeworICAgICAgICAgICAgaGVhZGVyID0gbmV3IEltcG9ydFBhY2thZ2VIZWFkZXIoa2V5LCB2YWx1ZSwgYnVuZGxlLCBuZXdMaW5lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhlYWRlciA9IG5ldyBNYW5pZmVzdEhlYWRlcihrZXksIHZhbHVlLCBidW5kbGUsIG5ld0xpbmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoZWFkZXI7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvQnVuZGxlTWFuaWZlc3REaWZmZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS9CdW5kbGVNYW5pZmVzdERpZmZlci5qYXZhCmluZGV4IDY4OWJjOTMuLmE5MDQ3MzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS9CdW5kbGVNYW5pZmVzdERpZmZlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS9CdW5kbGVNYW5pZmVzdERpZmZlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtMjcsNzAgKzI4LDY2IEBACiAKIC8qKgogICogVXRpbGl0eSB0aGF0IGNoZWNrcyB0d28ge0BsaW5rIEJ1bmRsZU1hbmlmZXN0fSBpbnN0YW5jZXMgZm9yIGVxdWFsaXR5LgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjEKICAqLwogY2xhc3MgQnVuZGxlTWFuaWZlc3REaWZmZXIgewogCi0JLyoqCi0JICogRGlmZnMgdGhlIHR3byBnaXZlbiBidW5kbGVzIGFuZCBwcm92aWRlcyBhIHNldCBvZiBjaGFuZ2VzLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGVNYW5pZmVzdDEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBtYW5pZmVzdCB0byBjaGVjawotCSAqIEBwYXJhbSBidW5kbGVNYW5pZmVzdDIKLQkgKiAgICAgICAgICAgIHRoZSBzZWNvbmQgbWFuaWZlc3QgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHtAbGluayBTZXR9IG9mIHtAbGluayBJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lci5UeXBlfSBleHByZXNzaW5nIHRoZSBhY3R1YWwgY2hhbmdlLgotCSAqLwotCXN0YXRpYyBTZXQ8VHlwZT4gZGlmZihCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdDEsIEJ1bmRsZU1hbmlmZXN0IGJ1bmRsZU1hbmlmZXN0MikgewotCQlpZiAoYnVuZGxlTWFuaWZlc3QxID09IG51bGwgJiYgYnVuZGxlTWFuaWZlc3QyID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQl9IGVsc2UgaWYgKChidW5kbGVNYW5pZmVzdDEgPT0gbnVsbCAmJiBidW5kbGVNYW5pZmVzdDIgIT0gbnVsbCkKLQkJCQl8fCAoYnVuZGxlTWFuaWZlc3QxICE9IG51bGwgJiYgYnVuZGxlTWFuaWZlc3QyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gQnVuZGxlTWFuaWZlc3RNYW5hZ2VyLklNUE9SVFNfQ0hBTkdFRDsKLQkJfQorICAgIC8qKgorICAgICAqIERpZmZzIHRoZSB0d28gZ2l2ZW4gYnVuZGxlcyBhbmQgcHJvdmlkZXMgYSBzZXQgb2YgY2hhbmdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidW5kbGVNYW5pZmVzdDEgdGhlIGZpcnN0IG1hbmlmZXN0IHRvIGNoZWNrCisgICAgICogQHBhcmFtIGJ1bmRsZU1hbmlmZXN0MiB0aGUgc2Vjb25kIG1hbmlmZXN0IHRvIGNoZWNrCisgICAgICogQHJldHVybiB7QGxpbmsgU2V0fSBvZiB7QGxpbmsgSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuVHlwZX0gZXhwcmVzc2luZyB0aGUgYWN0dWFsIGNoYW5nZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgU2V0PFR5cGU+IGRpZmYoQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QxLCBCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdDIpIHsKKyAgICAgICAgaWYgKGJ1bmRsZU1hbmlmZXN0MSA9PSBudWxsICYmIGJ1bmRsZU1hbmlmZXN0MiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfSBlbHNlIGlmIChidW5kbGVNYW5pZmVzdDEgPT0gbnVsbCAmJiBidW5kbGVNYW5pZmVzdDIgIT0gbnVsbCB8fCBidW5kbGVNYW5pZmVzdDEgIT0gbnVsbCAmJiBidW5kbGVNYW5pZmVzdDIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEJ1bmRsZU1hbmlmZXN0TWFuYWdlci5JTVBPUlRTX0NIQU5HRUQ7CisgICAgICAgIH0KIAotCQlJbXBvcnRQYWNrYWdlIGltcG9ydFBhY2thZ2VIZWFkZXIxID0gYnVuZGxlTWFuaWZlc3QxLmdldEltcG9ydFBhY2thZ2UoKTsKLQkJSW1wb3J0UGFja2FnZSBpbXBvcnRQYWNrYWdlSGVhZGVyMiA9IGJ1bmRsZU1hbmlmZXN0Mi5nZXRJbXBvcnRQYWNrYWdlKCk7CisgICAgICAgIEltcG9ydFBhY2thZ2UgaW1wb3J0UGFja2FnZUhlYWRlcjEgPSBidW5kbGVNYW5pZmVzdDEuZ2V0SW1wb3J0UGFja2FnZSgpOworICAgICAgICBJbXBvcnRQYWNrYWdlIGltcG9ydFBhY2thZ2VIZWFkZXIyID0gYnVuZGxlTWFuaWZlc3QyLmdldEltcG9ydFBhY2thZ2UoKTsKIAotCQlFeHBvcnRQYWNrYWdlIGV4cG9ydFBhY2thZ2VIZWFkZXIxID0gYnVuZGxlTWFuaWZlc3QxLmdldEV4cG9ydFBhY2thZ2UoKTsKLQkJRXhwb3J0UGFja2FnZSBleHBvcnRQYWNrYWdlSGVhZGVyMiA9IGJ1bmRsZU1hbmlmZXN0Mi5nZXRFeHBvcnRQYWNrYWdlKCk7CisgICAgICAgIEV4cG9ydFBhY2thZ2UgZXhwb3J0UGFja2FnZUhlYWRlcjEgPSBidW5kbGVNYW5pZmVzdDEuZ2V0RXhwb3J0UGFja2FnZSgpOworICAgICAgICBFeHBvcnRQYWNrYWdlIGV4cG9ydFBhY2thZ2VIZWFkZXIyID0gYnVuZGxlTWFuaWZlc3QyLmdldEV4cG9ydFBhY2thZ2UoKTsKIAotCQlJbXBvcnRMaWJyYXJ5IGltcG9ydExpYnJhcnlIZWFkZXIxID0gYnVuZGxlTWFuaWZlc3QxLmdldEltcG9ydExpYnJhcnkoKTsKLQkJSW1wb3J0TGlicmFyeSBpbXBvcnRMaWJyYXJ5SGVhZGVyMiA9IGJ1bmRsZU1hbmlmZXN0Mi5nZXRJbXBvcnRMaWJyYXJ5KCk7CisgICAgICAgIEltcG9ydExpYnJhcnkgaW1wb3J0TGlicmFyeUhlYWRlcjEgPSBidW5kbGVNYW5pZmVzdDEuZ2V0SW1wb3J0TGlicmFyeSgpOworICAgICAgICBJbXBvcnRMaWJyYXJ5IGltcG9ydExpYnJhcnlIZWFkZXIyID0gYnVuZGxlTWFuaWZlc3QyLmdldEltcG9ydExpYnJhcnkoKTsKIAotCQlJbXBvcnRCdW5kbGUgaW1wb3J0QnVuZGxlSGVhZGVyMSA9IGJ1bmRsZU1hbmlmZXN0MS5nZXRJbXBvcnRCdW5kbGUoKTsKLQkJSW1wb3J0QnVuZGxlIGltcG9ydEJ1bmRsZUhlYWRlcjIgPSBidW5kbGVNYW5pZmVzdDIuZ2V0SW1wb3J0QnVuZGxlKCk7CisgICAgICAgIEltcG9ydEJ1bmRsZSBpbXBvcnRCdW5kbGVIZWFkZXIxID0gYnVuZGxlTWFuaWZlc3QxLmdldEltcG9ydEJ1bmRsZSgpOworICAgICAgICBJbXBvcnRCdW5kbGUgaW1wb3J0QnVuZGxlSGVhZGVyMiA9IGJ1bmRsZU1hbmlmZXN0Mi5nZXRJbXBvcnRCdW5kbGUoKTsKIAotCQlSZXF1aXJlQnVuZGxlIHJlcXVpcmVCdW5kbGVIZWFkZXIxID0gYnVuZGxlTWFuaWZlc3QxLmdldFJlcXVpcmVCdW5kbGUoKTsKLQkJUmVxdWlyZUJ1bmRsZSByZXF1aXJlQnVuZGxlSGVhZGVyMiA9IGJ1bmRsZU1hbmlmZXN0Mi5nZXRSZXF1aXJlQnVuZGxlKCk7CisgICAgICAgIFJlcXVpcmVCdW5kbGUgcmVxdWlyZUJ1bmRsZUhlYWRlcjEgPSBidW5kbGVNYW5pZmVzdDEuZ2V0UmVxdWlyZUJ1bmRsZSgpOworICAgICAgICBSZXF1aXJlQnVuZGxlIHJlcXVpcmVCdW5kbGVIZWFkZXIyID0gYnVuZGxlTWFuaWZlc3QyLmdldFJlcXVpcmVCdW5kbGUoKTsKIAotCQlTdHJpbmcgZXhlY0Vudmlyb25tZW50MSA9IGJ1bmRsZU1hbmlmZXN0MS50b0RpY3Rpb25hcnkoKS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5UKTsKLQkJU3RyaW5nIGV4ZWNFbnZpcm9ubWVudDIgPSBidW5kbGVNYW5pZmVzdDIudG9EaWN0aW9uYXJ5KCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfUkVRVUlSRURFWEVDVVRJT05FTlZJUk9OTUVOVCk7CisgICAgICAgIFN0cmluZyBleGVjRW52aXJvbm1lbnQxID0gYnVuZGxlTWFuaWZlc3QxLnRvRGljdGlvbmFyeSgpLmdldChDb25zdGFudHMuQlVORExFX1JFUVVJUkVERVhFQ1VUSU9ORU5WSVJPTk1FTlQpOworICAgICAgICBTdHJpbmcgZXhlY0Vudmlyb25tZW50MiA9IGJ1bmRsZU1hbmlmZXN0Mi50b0RpY3Rpb25hcnkoKS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5UKTsKIAotCQlTZXQ8VHlwZT4gZGlmZmVyZW5jZXMgPSBuZXcgSGFzaFNldDxUeXBlPigpOworICAgICAgICBTZXQ8VHlwZT4gZGlmZmVyZW5jZXMgPSBuZXcgSGFzaFNldDxUeXBlPigpOwogCi0JCWlmICghT2JqZWN0VXRpbHMuZXF1YWxzKGltcG9ydFBhY2thZ2VIZWFkZXIxLmdldEltcG9ydGVkUGFja2FnZXMoKSwgaW1wb3J0UGFja2FnZUhlYWRlcjIuZ2V0SW1wb3J0ZWRQYWNrYWdlcygpKSkgewotCQkJZGlmZmVyZW5jZXMuYWRkKFR5cGUuSU1QT1JUX1BBQ0tBR0UpOwotCQl9Ci0JCWlmICghT2JqZWN0VXRpbHMuZXF1YWxzKGV4ZWNFbnZpcm9ubWVudDEsIGV4ZWNFbnZpcm9ubWVudDIpKSB7Ci0JCQlkaWZmZXJlbmNlcy5hZGQoVHlwZS5JTVBPUlRfUEFDS0FHRSk7Ci0JCX0KLQkJaWYgKCFPYmplY3RVdGlscy5lcXVhbHMoZXhwb3J0UGFja2FnZUhlYWRlcjEuZ2V0RXhwb3J0ZWRQYWNrYWdlcygpLCBleHBvcnRQYWNrYWdlSGVhZGVyMi5nZXRFeHBvcnRlZFBhY2thZ2VzKCkpKSB7Ci0JCQlkaWZmZXJlbmNlcy5hZGQoVHlwZS5FWFBPUlRfUEFDS0FHRSk7Ci0JCX0KLQkJaWYgKCFPYmplY3RVdGlscy5lcXVhbHMoaW1wb3J0TGlicmFyeUhlYWRlcjEuZ2V0SW1wb3J0ZWRMaWJyYXJpZXMoKSwKLQkJCQlpbXBvcnRMaWJyYXJ5SGVhZGVyMi5nZXRJbXBvcnRlZExpYnJhcmllcygpKSkgewotCQkJZGlmZmVyZW5jZXMuYWRkKFR5cGUuSU1QT1JUX0xJQlJBUlkpOwotCQl9Ci0JCWlmICghT2JqZWN0VXRpbHMuZXF1YWxzKGltcG9ydEJ1bmRsZUhlYWRlcjEuZ2V0SW1wb3J0ZWRCdW5kbGVzKCksIGltcG9ydEJ1bmRsZUhlYWRlcjIuZ2V0SW1wb3J0ZWRCdW5kbGVzKCkpKSB7Ci0JCQlkaWZmZXJlbmNlcy5hZGQoVHlwZS5JTVBPUlRfQlVORExFKTsKLQkJfQotCQlpZiAoIU9iamVjdFV0aWxzLmVxdWFscyhyZXF1aXJlQnVuZGxlSGVhZGVyMS5nZXRSZXF1aXJlZEJ1bmRsZXMoKSwgcmVxdWlyZUJ1bmRsZUhlYWRlcjIuZ2V0UmVxdWlyZWRCdW5kbGVzKCkpKSB7Ci0JCQlkaWZmZXJlbmNlcy5hZGQoVHlwZS5SRVFVSVJFX0JVTkRMRSk7Ci0JCX0KKyAgICAgICAgaWYgKCFPYmplY3RVdGlscy5lcXVhbHMoaW1wb3J0UGFja2FnZUhlYWRlcjEuZ2V0SW1wb3J0ZWRQYWNrYWdlcygpLCBpbXBvcnRQYWNrYWdlSGVhZGVyMi5nZXRJbXBvcnRlZFBhY2thZ2VzKCkpKSB7CisgICAgICAgICAgICBkaWZmZXJlbmNlcy5hZGQoVHlwZS5JTVBPUlRfUEFDS0FHRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFPYmplY3RVdGlscy5lcXVhbHMoZXhlY0Vudmlyb25tZW50MSwgZXhlY0Vudmlyb25tZW50MikpIHsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VzLmFkZChUeXBlLklNUE9SVF9QQUNLQUdFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmVxdWFscyhleHBvcnRQYWNrYWdlSGVhZGVyMS5nZXRFeHBvcnRlZFBhY2thZ2VzKCksIGV4cG9ydFBhY2thZ2VIZWFkZXIyLmdldEV4cG9ydGVkUGFja2FnZXMoKSkpIHsKKyAgICAgICAgICAgIGRpZmZlcmVuY2VzLmFkZChUeXBlLkVYUE9SVF9QQUNLQUdFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmVxdWFscyhpbXBvcnRMaWJyYXJ5SGVhZGVyMS5nZXRJbXBvcnRlZExpYnJhcmllcygpLCBpbXBvcnRMaWJyYXJ5SGVhZGVyMi5nZXRJbXBvcnRlZExpYnJhcmllcygpKSkgeworICAgICAgICAgICAgZGlmZmVyZW5jZXMuYWRkKFR5cGUuSU1QT1JUX0xJQlJBUlkpOworICAgICAgICB9CisgICAgICAgIGlmICghT2JqZWN0VXRpbHMuZXF1YWxzKGltcG9ydEJ1bmRsZUhlYWRlcjEuZ2V0SW1wb3J0ZWRCdW5kbGVzKCksIGltcG9ydEJ1bmRsZUhlYWRlcjIuZ2V0SW1wb3J0ZWRCdW5kbGVzKCkpKSB7CisgICAgICAgICAgICBkaWZmZXJlbmNlcy5hZGQoVHlwZS5JTVBPUlRfQlVORExFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmVxdWFscyhyZXF1aXJlQnVuZGxlSGVhZGVyMS5nZXRSZXF1aXJlZEJ1bmRsZXMoKSwgcmVxdWlyZUJ1bmRsZUhlYWRlcjIuZ2V0UmVxdWlyZWRCdW5kbGVzKCkpKSB7CisgICAgICAgICAgICBkaWZmZXJlbmNlcy5hZGQoVHlwZS5SRVFVSVJFX0JVTkRMRSk7CisgICAgICAgIH0KIAotCQlyZXR1cm4gZGlmZmVyZW5jZXM7Ci0JfQorICAgICAgICByZXR1cm4gZGlmZmVyZW5jZXM7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvQnVuZGxlTWFuaWZlc3RNYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvQnVuZGxlTWFuaWZlc3RNYW5hZ2VyLmphdmEKaW5kZXggZTc4MjJlYS4uMDhiMzlmZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL0J1bmRsZU1hbmlmZXN0TWFuYWdlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS9CdW5kbGVNYW5pZmVzdE1hbmFnZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKQEAgLTUyLDQ5MyArNTMsNDc5IEBACiAvKioKICAqIERlZmF1bHQge0BsaW5rIElCdW5kbGVNYW5pZmVzdE1hbmFnZXJ9IGltcGxlbWVudGF0aW9uIHVzZWQgdG8gbWFuYWdlIHRoZSBsaWZlLWN5Y2xlIG9mIHRoZSB7QGxpbmsgQnVuZGxlTWFuaWZlc3R9CiAgKiBpbnN0YW5jZXMuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBhdXRob3IgTGVvIERvcyBTYW50b3MKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlTWFuaWZlc3RNYW5hZ2VyIGltcGxlbWVudHMgSUJ1bmRsZU1hbmlmZXN0TWFuZ2VyV29ya2luZ0NvcHkgewogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8SUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuVHlwZT4gSU1QT1JUU19DSEFOR0VEOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyLlR5cGU+IElNUE9SVFNfQ0hBTkdFRDsKIAotCXN0YXRpYyB7Ci0JCUlNUE9SVFNfQ0hBTkdFRCA9IG5ldyBIYXNoU2V0PElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyLlR5cGU+KCk7Ci0JCUlNUE9SVFNfQ0hBTkdFRC5hZGQoSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuVHlwZS5JTVBPUlRfUEFDS0FHRSk7Ci0JCUlNUE9SVFNfQ0hBTkdFRC5hZGQoSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuVHlwZS5JTVBPUlRfQlVORExFKTsKLQkJSU1QT1JUU19DSEFOR0VELmFkZChJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lci5UeXBlLklNUE9SVF9MSUJSQVJZKTsKLQkJSU1QT1JUU19DSEFOR0VELmFkZChJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lci5UeXBlLlJFUVVJUkVfQlVORExFKTsKLQl9CisgICAgc3RhdGljIHsKKyAgICAgICAgSU1QT1JUU19DSEFOR0VEID0gbmV3IEhhc2hTZXQ8SUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuVHlwZT4oKTsKKyAgICAgICAgSU1QT1JUU19DSEFOR0VELmFkZChJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lci5UeXBlLklNUE9SVF9QQUNLQUdFKTsKKyAgICAgICAgSU1QT1JUU19DSEFOR0VELmFkZChJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lci5UeXBlLklNUE9SVF9CVU5ETEUpOworICAgICAgICBJTVBPUlRTX0NIQU5HRUQuYWRkKElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyLlR5cGUuSU1QT1JUX0xJQlJBUlkpOworICAgICAgICBJTVBPUlRTX0NIQU5HRUQuYWRkKElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyLlR5cGUuUkVRVUlSRV9CVU5ETEUpOworICAgIH0KIAotCS8qKiBJbnRlcm5hbCByZWFkIHdyaXRlIGxvY2sgdG8gcHJvdGVjdCB0aGUgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucyBvZiB0aGUgaW50ZXJuYWwgY2FjaGVzICovCi0JcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIHJ3bCA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgLyoqIEludGVybmFsIHJlYWQgd3JpdGUgbG9jayB0byBwcm90ZWN0IHRoZSByZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zIG9mIHRoZSBpbnRlcm5hbCBjYWNoZXMgKi8KKyAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgcndsID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKIAotCS8qKiBXcml0ZSBsb2NrIHRvIHByb3RlY3QgdGhlIG1vZGVsIGZyb20gY29uY3VycmVudCB3cml0ZSBvcGVyYXRpb25zICovCi0JcHJpdmF0ZSBmaW5hbCBMb2NrIHcgPSByd2wud3JpdGVMb2NrKCk7CisgICAgLyoqIFdyaXRlIGxvY2sgdG8gcHJvdGVjdCB0aGUgbW9kZWwgZnJvbSBjb25jdXJyZW50IHdyaXRlIG9wZXJhdGlvbnMgKi8KKyAgICBwcml2YXRlIGZpbmFsIExvY2sgdyA9IHRoaXMucndsLndyaXRlTG9jaygpOwogCi0JLyoqIFJlYWQgbG9jayB0byBwcm90ZWN0IGZyb20gcmVhZGluZyB3aGlsZSB3cml0aW5nIHRvIHRoZSBtb2RlbCByZXNvdXJjZXMgKi8KLQlwcml2YXRlIGZpbmFsIExvY2sgciA9IHJ3bC5yZWFkTG9jaygpOworICAgIC8qKiBSZWFkIGxvY2sgdG8gcHJvdGVjdCBmcm9tIHJlYWRpbmcgd2hpbGUgd3JpdGluZyB0byB0aGUgbW9kZWwgcmVzb3VyY2VzICovCisgICAgcHJpdmF0ZSBmaW5hbCBMb2NrIHIgPSB0aGlzLnJ3bC5yZWFkTG9jaygpOwogCi0JLyoqIEludGVybmFsIGNhY2hlIG9mIHtAbGluayBCdW5kbGVNYW5pZmVzdH0ga2V5ZWQgYnkge0BsaW5rIElKYXZhUHJvamVjdH0gKi8KLQlwcml2YXRlIE1hcDxJSmF2YVByb2plY3QsIEJ1bmRsZU1hbmlmZXN0PiBidW5kbGVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPElKYXZhUHJvamVjdCwgQnVuZGxlTWFuaWZlc3Q+KCk7CisgICAgLyoqIEludGVybmFsIGNhY2hlIG9mIHtAbGluayBCdW5kbGVNYW5pZmVzdH0ga2V5ZWQgYnkge0BsaW5rIElKYXZhUHJvamVjdH0gKi8KKyAgICBwcml2YXRlIE1hcDxJSmF2YVByb2plY3QsIEJ1bmRsZU1hbmlmZXN0PiBidW5kbGVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPElKYXZhUHJvamVjdCwgQnVuZGxlTWFuaWZlc3Q+KCk7CiAKLQkvKiogSW50ZXJuYWwgY2FjaGUgb2Yge0BsaW5rIEJ1bmRsZU1hbmlmZXN0fSBrZXllZCBieSB7QGxpbmsgSUphdmFQcm9qZWN0fTsgdGhlc2UgcmVwcmVzZW50IHRoZSAqLwotCXByaXZhdGUgZmluYWwgTWFwPElKYXZhUHJvamVjdCwgQnVuZGxlTWFuaWZlc3Q+IHRlc3RCdW5kbGVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPElKYXZhUHJvamVjdCwgQnVuZGxlTWFuaWZlc3Q+KCk7CisgICAgLyoqIEludGVybmFsIGNhY2hlIG9mIHtAbGluayBCdW5kbGVNYW5pZmVzdH0ga2V5ZWQgYnkge0BsaW5rIElKYXZhUHJvamVjdH07IHRoZXNlIHJlcHJlc2VudCB0aGUgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1hcDxJSmF2YVByb2plY3QsIEJ1bmRsZU1hbmlmZXN0PiB0ZXN0QnVuZGxlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJSmF2YVByb2plY3QsIEJ1bmRsZU1hbmlmZXN0PigpOwogCi0JLyoqIEludGVybmFsIGNhY2hlIG9mIHJlc29sdmVkIHBhY2thZ2UgaW1wb3J0cyBrZXllZCBieSB7QGxpbmsgSUphdmFQcm9qZWN0fSAqLwotCXByaXZhdGUgTWFwPElKYXZhUHJvamVjdCwgU2V0PFN0cmluZz4+IHBhY2thZ2VJbXBvcnRzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPElKYXZhUHJvamVjdCwgU2V0PFN0cmluZz4+KCk7CisgICAgLyoqIEludGVybmFsIGNhY2hlIG9mIHJlc29sdmVkIHBhY2thZ2UgaW1wb3J0cyBrZXllZCBieSB7QGxpbmsgSUphdmFQcm9qZWN0fSAqLworICAgIHByaXZhdGUgTWFwPElKYXZhUHJvamVjdCwgU2V0PFN0cmluZz4+IHBhY2thZ2VJbXBvcnRzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPElKYXZhUHJvamVjdCwgU2V0PFN0cmluZz4+KCk7CiAKLQkvKiogSW50ZXJuYWwgbGlzdGVuZXIgbGlzdCAqLwotCXByaXZhdGUgZmluYWwgTGlzdDxJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcj4gYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8SUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXI+KCk7CisgICAgLyoqIEludGVybmFsIGxpc3RlbmVyIGxpc3QgKi8KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXI+IGJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyPigpOwogCi0JcHJpdmF0ZSBmaW5hbCBNYXA8SUphdmFQcm9qZWN0LCBMb25nPiBidW5kbGVUaW1lc3RhbXBzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPElKYXZhUHJvamVjdCwgTG9uZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxJSmF2YVByb2plY3QsIExvbmc+IGJ1bmRsZVRpbWVzdGFtcHMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SUphdmFQcm9qZWN0LCBMb25nPigpOwogCi0JcHJpdmF0ZSBmaW5hbCBNYXA8SUphdmFQcm9qZWN0LCBMb25nPiB0ZXN0QnVuZGxlVGltZXN0YW1wcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJSmF2YVByb2plY3QsIExvbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8SUphdmFQcm9qZWN0LCBMb25nPiB0ZXN0QnVuZGxlVGltZXN0YW1wcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJSmF2YVByb2plY3QsIExvbmc+KCk7CiAKLQkvKioKLQkgKiBSZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGNoYW5nZXMgb2YgRWNsaXBzZSBmaWxlIHJlc291cmNlcyBhbmQgdHJpZ2dlcnMgYSByZWZyZXNoIGZvcgotCSAqIGNvcnJlc3BvbmRpbmcgY2xhc3MgcGF0aCBjb250YWluZXIKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBudWxsOworICAgIC8qKgorICAgICAqIFJlc291cmNlIGNoYW5nZSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gY2hhbmdlcyBvZiBFY2xpcHNlIGZpbGUgcmVzb3VyY2VzIGFuZCB0cmlnZ2VycyBhIHJlZnJlc2ggZm9yCisgICAgICogY29ycmVzcG9uZGluZyBjbGFzcyBwYXRoIGNvbnRhaW5lcgorICAgICAqLworICAgIHByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG51bGw7CiAKLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHBhckNoYW5nZUxpc3RlbmVyID0gbnVsbDsKKyAgICBwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHBhckNoYW5nZUxpc3RlbmVyID0gbnVsbDsKIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQnVuZGxlTWFuaWZlc3QgZ2V0QnVuZGxlTWFuaWZlc3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyLmxvY2soKTsKLQkJCWlmIChidW5kbGVzLmNvbnRhaW5zS2V5KGphdmFQcm9qZWN0KSkgewotCQkJCXJldHVybiBidW5kbGVzLmdldChqYXZhUHJvamVjdCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlyLnVubG9jaygpOwotCQl9Ci0JCS8vIExvYWQgYW5kIHN0b3JlIHRoZSBidW5kbGUgaWYgbm90IGZvdW5kOyBsb2FkQnVuZGxlTWFuaWZlc3Qgd2lsbCBhY3F1aXJlIHdyaXRlIGxvY2suCi0JCXJldHVybiBsb2FkQnVuZGxlTWFuaWZlc3QoamF2YVByb2plY3QsIGZhbHNlKTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGVNYW5pZmVzdCBnZXRCdW5kbGVNYW5pZmVzdChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMuci5sb2NrKCk7CisgICAgICAgICAgICBpZiAodGhpcy5idW5kbGVzLmNvbnRhaW5zS2V5KGphdmFQcm9qZWN0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1bmRsZXMuZ2V0KGphdmFQcm9qZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRoaXMuci51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICAvLyBMb2FkIGFuZCBzdG9yZSB0aGUgYnVuZGxlIGlmIG5vdCBmb3VuZDsgbG9hZEJ1bmRsZU1hbmlmZXN0IHdpbGwgYWNxdWlyZSB3cml0ZSBsb2NrLgorICAgICAgICByZXR1cm4gbG9hZEJ1bmRsZU1hbmlmZXN0KGphdmFQcm9qZWN0LCBmYWxzZSk7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdW5kbGVNYW5pZmVzdCBnZXRUZXN0QnVuZGxlTWFuaWZlc3QoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyLmxvY2soKTsKLQkJCWlmICh0ZXN0QnVuZGxlcy5jb250YWluc0tleShqYXZhUHJvamVjdCkpIHsKLQkJCQlyZXR1cm4gdGVzdEJ1bmRsZXMuZ2V0KGphdmFQcm9qZWN0KTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXIudW5sb2NrKCk7Ci0JCX0KLQkJLy8gTG9hZCBhbmQgc3RvcmUgdGhlIGJ1bmRsZSBpZiBub3QgZm91bmQ7IGxvYWRCdW5kbGVNYW5pZmVzdCB3aWxsIGFjcXVpcmUgd3JpdGUgbG9jay4KLQkJcmV0dXJuIGxvYWRCdW5kbGVNYW5pZmVzdChqYXZhUHJvamVjdCwgdHJ1ZSk7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlTWFuaWZlc3QgZ2V0VGVzdEJ1bmRsZU1hbmlmZXN0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5yLmxvY2soKTsKKyAgICAgICAgICAgIGlmICh0aGlzLnRlc3RCdW5kbGVzLmNvbnRhaW5zS2V5KGphdmFQcm9qZWN0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRlc3RCdW5kbGVzLmdldChqYXZhUHJvamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0aGlzLnIudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTG9hZCBhbmQgc3RvcmUgdGhlIGJ1bmRsZSBpZiBub3QgZm91bmQ7IGxvYWRCdW5kbGVNYW5pZmVzdCB3aWxsIGFjcXVpcmUgd3JpdGUgbG9jay4KKyAgICAgICAgcmV0dXJuIGxvYWRCdW5kbGVNYW5pZmVzdChqYXZhUHJvamVjdCwgdHJ1ZSk7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRQYWNrYWdlRXhwb3J0cyhJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCXIubG9jaygpOwotCQkJaWYgKGJ1bmRsZXMuY29udGFpbnNLZXkoamF2YVByb2plY3QpKSB7Ci0JCQkJQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QgPSBidW5kbGVzLmdldChqYXZhUHJvamVjdCk7Ci0JCQkJaWYgKGJ1bmRsZU1hbmlmZXN0LmdldEV4cG9ydFBhY2thZ2UoKSAhPSBudWxsCi0JCQkJCQkmJiBidW5kbGVNYW5pZmVzdC5nZXRFeHBvcnRQYWNrYWdlKCkuZ2V0RXhwb3J0ZWRQYWNrYWdlcygpICE9IG51bGwpIHsKLQkJCQkJU2V0PFN0cmluZz4gcGFja2FnZUV4cG9ydHMgPSBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQkJCWZvciAoRXhwb3J0ZWRQYWNrYWdlIHBhY2thZ2VFeHBvcnQgOiBidW5kbGVNYW5pZmVzdC5nZXRFeHBvcnRQYWNrYWdlKCkuZ2V0RXhwb3J0ZWRQYWNrYWdlcygpKSB7Ci0JCQkJCQlwYWNrYWdlRXhwb3J0cy5hZGQocGFja2FnZUV4cG9ydC5nZXRQYWNrYWdlTmFtZSgpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcGFja2FnZUV4cG9ydHM7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyLnVubG9jaygpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UGFja2FnZUV4cG9ydHMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLnIubG9jaygpOworICAgICAgICAgICAgaWYgKHRoaXMuYnVuZGxlcy5jb250YWluc0tleShqYXZhUHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCA9IHRoaXMuYnVuZGxlcy5nZXQoamF2YVByb2plY3QpOworICAgICAgICAgICAgICAgIGlmIChidW5kbGVNYW5pZmVzdC5nZXRFeHBvcnRQYWNrYWdlKCkgIT0gbnVsbCAmJiBidW5kbGVNYW5pZmVzdC5nZXRFeHBvcnRQYWNrYWdlKCkuZ2V0RXhwb3J0ZWRQYWNrYWdlcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gcGFja2FnZUV4cG9ydHMgPSBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoRXhwb3J0ZWRQYWNrYWdlIHBhY2thZ2VFeHBvcnQgOiBidW5kbGVNYW5pZmVzdC5nZXRFeHBvcnRQYWNrYWdlKCkuZ2V0RXhwb3J0ZWRQYWNrYWdlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlRXhwb3J0cy5hZGQocGFja2FnZUV4cG9ydC5nZXRQYWNrYWdlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZUV4cG9ydHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0aGlzLnIudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFNldDxTdHJpbmc+IGdldFJlc29sdmVkUGFja2FnZUltcG9ydHMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyLmxvY2soKTsKLQkJCWlmIChwYWNrYWdlSW1wb3J0cy5jb250YWluc0tleShqYXZhUHJvamVjdCkpIHsKLQkJCQlyZXR1cm4gcGFja2FnZUltcG9ydHMuZ2V0KGphdmFQcm9qZWN0KTsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQl9IGZpbmFsbHkgewotCQkJci51bmxvY2soKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFJlc29sdmVkUGFja2FnZUltcG9ydHMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLnIubG9jaygpOworICAgICAgICAgICAgaWYgKHRoaXMucGFja2FnZUltcG9ydHMuY29udGFpbnNLZXkoamF2YVByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFja2FnZUltcG9ydHMuZ2V0KGphdmFQcm9qZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdGhpcy5yLnVubG9jaygpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogU3RhcnRzIHRoZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJdGhpcy5yZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IE1hbmlmZXN0UmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnBhckNoYW5nZUxpc3RlbmVyID0gbmV3IFBhckNoYW5nZUxpc3RlbmVyKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihwYXJDaGFuZ2VMaXN0ZW5lcik7Ci0JfQorICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgbW9kZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBNYW5pZmVzdFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKKyAgICAgICAgdGhpcy5wYXJDaGFuZ2VMaXN0ZW5lciA9IG5ldyBQYXJDaGFuZ2VMaXN0ZW5lcigpOworICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOworICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnBhckNoYW5nZUxpc3RlbmVyKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTdG9wcyB0aGUgbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHBhckNoYW5nZUxpc3RlbmVyKTsKLQkJYnVuZGxlcyA9IG51bGw7Ci0JCXBhY2thZ2VJbXBvcnRzID0gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIG1vZGVsLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMucmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7CisgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMucGFyQ2hhbmdlTGlzdGVuZXIpOworICAgICAgICB0aGlzLmJ1bmRsZXMgPSBudWxsOworICAgICAgICB0aGlzLnBhY2thZ2VJbXBvcnRzID0gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlUmVzb2x2ZWRQYWNrYWdlSW1wb3J0cyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFNldDxTdHJpbmc+IHJlc29sdmVkUGFja2FnZUltcG9ydHMpIHsKLQkJdHJ5IHsKLQkJCXcubG9jaygpOwotCQkJcGFja2FnZUltcG9ydHMucHV0KGphdmFQcm9qZWN0LCByZXNvbHZlZFBhY2thZ2VJbXBvcnRzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXcudW5sb2NrKCk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVJlc29sdmVkUGFja2FnZUltcG9ydHMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTZXQ8U3RyaW5nPiByZXNvbHZlZFBhY2thZ2VJbXBvcnRzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLncubG9jaygpOworICAgICAgICAgICAgdGhpcy5wYWNrYWdlSW1wb3J0cy5wdXQoamF2YVByb2plY3QsIHJlc29sdmVkUGFja2FnZUltcG9ydHMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdGhpcy53LnVubG9jaygpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogSW50ZXJuYWwgbWV0aG9kIHRvIGxvY2F0ZSBhbmQgbG9hZCB7QGxpbmsgQnVuZGxlTWFuaWZlc3R9cyBmb3IgZ2l2ZW4ge0BsaW5rIElKYXZhUHJvamVjdH0uCi0JICogCi0JICogQHBhcmFtIHRlc3RCdW5kbGUKLQkgKi8KLQlwcml2YXRlIEJ1bmRsZU1hbmlmZXN0IGxvYWRCdW5kbGVNYW5pZmVzdChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGJvb2xlYW4gdGVzdEJ1bmRsZSkgewotCQlJRmlsZSBtYW5pZmVzdEZpbGUgPSBCdW5kbGVNYW5pZmVzdFV0aWxzLmxvY2F0ZU1hbmlmZXN0KGphdmFQcm9qZWN0LCB0ZXN0QnVuZGxlKTsKLQkJQnVuZGxlTWFuaWZlc3Qgb2xkQnVuZGxlTWFuaWZlc3QgPSBudWxsOworICAgIC8qKgorICAgICAqIEludGVybmFsIG1ldGhvZCB0byBsb2NhdGUgYW5kIGxvYWQge0BsaW5rIEJ1bmRsZU1hbmlmZXN0fXMgZm9yIGdpdmVuIHtAbGluayBJSmF2YVByb2plY3R9LgorICAgICAqCisgICAgICogQHBhcmFtIHRlc3RCdW5kbGUKKyAgICAgKi8KKyAgICBwcml2YXRlIEJ1bmRsZU1hbmlmZXN0IGxvYWRCdW5kbGVNYW5pZmVzdChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGJvb2xlYW4gdGVzdEJ1bmRsZSkgeworICAgICAgICBJRmlsZSBtYW5pZmVzdEZpbGUgPSBCdW5kbGVNYW5pZmVzdFV0aWxzLmxvY2F0ZU1hbmlmZXN0KGphdmFQcm9qZWN0LCB0ZXN0QnVuZGxlKTsKKyAgICAgICAgQnVuZGxlTWFuaWZlc3Qgb2xkQnVuZGxlTWFuaWZlc3QgPSBudWxsOwogCi0JCU1hcDxJSmF2YVByb2plY3QsIEJ1bmRsZU1hbmlmZXN0PiBtYW5pZmVzdHMgPSAodGVzdEJ1bmRsZSA/IHRlc3RCdW5kbGVzIDogYnVuZGxlcyk7Ci0JCU1hcDxJSmF2YVByb2plY3QsIExvbmc+IHRpbWVzdGFtcHMgPSAodGVzdEJ1bmRsZSA/IHRlc3RCdW5kbGVUaW1lc3RhbXBzIDogYnVuZGxlVGltZXN0YW1wcyk7CisgICAgICAgIE1hcDxJSmF2YVByb2plY3QsIEJ1bmRsZU1hbmlmZXN0PiBtYW5pZmVzdHMgPSB0ZXN0QnVuZGxlID8gdGhpcy50ZXN0QnVuZGxlcyA6IHRoaXMuYnVuZGxlczsKKyAgICAgICAgTWFwPElKYXZhUHJvamVjdCwgTG9uZz4gdGltZXN0YW1wcyA9IHRlc3RCdW5kbGUgPyB0aGlzLnRlc3RCdW5kbGVUaW1lc3RhbXBzIDogdGhpcy5idW5kbGVUaW1lc3RhbXBzOwogCi0JCWlmIChtYW5pZmVzdEZpbGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl3LmxvY2soKTsKLQkJCQltYW5pZmVzdHMucmVtb3ZlKGphdmFQcm9qZWN0KTsKLQkJCQl0aW1lc3RhbXBzLnJlbW92ZShqYXZhUHJvamVjdCk7Ci0JCQkJYnVuZGxlTWFuaWZlc3RDaGFuZ2VkKG51bGwsIG51bGwsIG51bGwsIG51bGwsIElNUE9SVFNfQ0hBTkdFRCwgamF2YVByb2plY3QpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl3LnVubG9jaygpOwotCQkJfQotCQl9CisgICAgICAgIGlmIChtYW5pZmVzdEZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLncubG9jaygpOworICAgICAgICAgICAgICAgIG1hbmlmZXN0cy5yZW1vdmUoamF2YVByb2plY3QpOworICAgICAgICAgICAgICAgIHRpbWVzdGFtcHMucmVtb3ZlKGphdmFQcm9qZWN0KTsKKyAgICAgICAgICAgICAgICBidW5kbGVNYW5pZmVzdENoYW5nZWQobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgSU1QT1JUU19DSEFOR0VELCBqYXZhUHJvamVjdCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRoaXMudy51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWlmIChtYW5pZmVzdEZpbGUgIT0gbnVsbCkgewotCQkJci5sb2NrKCk7Ci0JCQl0cnkgewotCQkJCWlmICh0aW1lc3RhbXBzLmNvbnRhaW5zS2V5KGphdmFQcm9qZWN0KSkgewotCQkJCQlMb25nIG9sZFRpbWVzdGFtcCA9IHRpbWVzdGFtcHMuZ2V0KGphdmFQcm9qZWN0KTsKLQkJCQkJb2xkQnVuZGxlTWFuaWZlc3QgPSBtYW5pZmVzdHMuZ2V0KGphdmFQcm9qZWN0KTsKLQkJCQkJaWYgKG9sZFRpbWVzdGFtcC5sb25nVmFsdWUoKSA+PSBtYW5pZmVzdEZpbGUuZ2V0TG9jYWxUaW1lU3RhbXAoKSkgewotCQkJCQkJcmV0dXJuIG9sZEJ1bmRsZU1hbmlmZXN0OwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlyLnVubG9jaygpOwotCQkJfQotCQkJQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdFV0aWxzLmdldEJ1bmRsZU1hbmlmZXN0KGphdmFQcm9qZWN0LCB0ZXN0QnVuZGxlKTsKLQkJCXRyeSB7Ci0JCQkJdy5sb2NrKCk7Ci0JCQkJaWYgKGJ1bmRsZU1hbmlmZXN0ICE9IG51bGwpIHsKLQkJCQkJbWFuaWZlc3RzLnB1dChqYXZhUHJvamVjdCwgYnVuZGxlTWFuaWZlc3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1hbmlmZXN0cy5yZW1vdmUoamF2YVByb2plY3QpOwotCQkJCX0KLQkJCQl0aW1lc3RhbXBzLnB1dChqYXZhUHJvamVjdCwgbWFuaWZlc3RGaWxlLmdldExvY2FsVGltZVN0YW1wKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl3LnVubG9jaygpOwotCQkJfQotCQkJaWYgKHRlc3RCdW5kbGUpIHsKLQkJCQlidW5kbGVNYW5pZmVzdENoYW5nZWQobnVsbCwgbnVsbCwgYnVuZGxlTWFuaWZlc3QsIG9sZEJ1bmRsZU1hbmlmZXN0LCBqYXZhUHJvamVjdCk7Ci0JCQl9IGVsc2UgewotCQkJCWJ1bmRsZU1hbmlmZXN0Q2hhbmdlZChidW5kbGVNYW5pZmVzdCwgb2xkQnVuZGxlTWFuaWZlc3QsIG51bGwsIG51bGwsIGphdmFQcm9qZWN0KTsKLQkJCX0KLQkJCXJldHVybiBidW5kbGVNYW5pZmVzdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgICAgIGlmIChtYW5pZmVzdEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5yLmxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcHMuY29udGFpbnNLZXkoamF2YVByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgICAgIExvbmcgb2xkVGltZXN0YW1wID0gdGltZXN0YW1wcy5nZXQoamF2YVByb2plY3QpOworICAgICAgICAgICAgICAgICAgICBvbGRCdW5kbGVNYW5pZmVzdCA9IG1hbmlmZXN0cy5nZXQoamF2YVByb2plY3QpOworICAgICAgICAgICAgICAgICAgICBpZiAob2xkVGltZXN0YW1wLmxvbmdWYWx1ZSgpID49IG1hbmlmZXN0RmlsZS5nZXRMb2NhbFRpbWVTdGFtcCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkQnVuZGxlTWFuaWZlc3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRoaXMuci51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJ1bmRsZU1hbmlmZXN0IGJ1bmRsZU1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RVdGlscy5nZXRCdW5kbGVNYW5pZmVzdChqYXZhUHJvamVjdCwgdGVzdEJ1bmRsZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoaXMudy5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZU1hbmlmZXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RzLnB1dChqYXZhUHJvamVjdCwgYnVuZGxlTWFuaWZlc3QpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0cy5yZW1vdmUoamF2YVByb2plY3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aW1lc3RhbXBzLnB1dChqYXZhUHJvamVjdCwgbWFuaWZlc3RGaWxlLmdldExvY2FsVGltZVN0YW1wKCkpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0aGlzLncudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGVzdEJ1bmRsZSkgeworICAgICAgICAgICAgICAgIGJ1bmRsZU1hbmlmZXN0Q2hhbmdlZChudWxsLCBudWxsLCBidW5kbGVNYW5pZmVzdCwgb2xkQnVuZGxlTWFuaWZlc3QsIGphdmFQcm9qZWN0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVuZGxlTWFuaWZlc3RDaGFuZ2VkKGJ1bmRsZU1hbmlmZXN0LCBvbGRCdW5kbGVNYW5pZmVzdCwgbnVsbCwgbnVsbCwgamF2YVByb2plY3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZU1hbmlmZXN0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIFRyaWdnZXJzIGFuIHVwZGF0ZSB0byB0aGUgc2F2ZWQge0BsaW5rIEJ1bmRsZU1hbmlmZXN0fSBmb3IgdGhlIGdpdmVuIDxjb2RlPmphdmFQcm9qZWN0PC9jb2RlPgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVCdW5kbGVNYW5pZmVzdChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGJvb2xlYW4gdGVzdEJ1bmRsZSkgewotCQkvLyBSZS1sb2FkIHRoZSBidW5kbGUgbWFuaWZlc3QKLQkJbG9hZEJ1bmRsZU1hbmlmZXN0KGphdmFQcm9qZWN0LCB0ZXN0QnVuZGxlKTsKLQl9CisgICAgLyoqCisgICAgICogVHJpZ2dlcnMgYW4gdXBkYXRlIHRvIHRoZSBzYXZlZCB7QGxpbmsgQnVuZGxlTWFuaWZlc3R9IGZvciB0aGUgZ2l2ZW4gPGNvZGU+amF2YVByb2plY3Q8L2NvZGU+CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1bmRsZU1hbmlmZXN0KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiB0ZXN0QnVuZGxlKSB7CisgICAgICAgIC8vIFJlLWxvYWQgdGhlIGJ1bmRsZSBtYW5pZmVzdAorICAgICAgICBsb2FkQnVuZGxlTWFuaWZlc3QoamF2YVByb2plY3QsIHRlc3RCdW5kbGUpOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyKElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyIGJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIpIHsKLQkJdGhpcy5idW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVycy5hZGQoYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyKElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyIGJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIpIHsKKyAgICAgICAgdGhpcy5idW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVycy5hZGQoYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcik7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIoSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIgYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcikgewotCQlpZiAoYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcnMuY29udGFpbnMoYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcikpIHsKLQkJCWJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXJzLnJlbW92ZShidW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcihJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lciBidW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyKSB7CisgICAgICAgIGlmICh0aGlzLmJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXJzLmNvbnRhaW5zKGJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIpKSB7CisgICAgICAgICAgICB0aGlzLmJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXJzLnJlbW92ZShidW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIE5vdGlmaWVzIHtAbGluayBJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcn0gb2YgY2hhbmdlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVuZGxlTWFuaWZlc3RDaGFuZ2VkKEJ1bmRsZU1hbmlmZXN0IG5ld0J1bmRsZU1hbmlmZXN0LCBCdW5kbGVNYW5pZmVzdCBvbGRCdW5kbGVNYW5pZmVzdCwKLQkJCUJ1bmRsZU1hbmlmZXN0IG5ld1Rlc3RCdW5kbGVNYW5pZmVzdCwgQnVuZGxlTWFuaWZlc3Qgb2xkVGVzdEJ1bmRsZU1hbmlmZXN0LCBJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJU2V0PElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyLlR5cGU+IHR5cGVzID0gbmV3IEhhc2hTZXQ8SUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuVHlwZT4oKTsKLQkJdHlwZXMuYWRkQWxsKEJ1bmRsZU1hbmlmZXN0RGlmZmVyLmRpZmYobmV3QnVuZGxlTWFuaWZlc3QsIG9sZEJ1bmRsZU1hbmlmZXN0KSk7Ci0JCXR5cGVzLmFkZEFsbChCdW5kbGVNYW5pZmVzdERpZmZlci5kaWZmKG5ld1Rlc3RCdW5kbGVNYW5pZmVzdCwgb2xkVGVzdEJ1bmRsZU1hbmlmZXN0KSk7Ci0JCWJ1bmRsZU1hbmlmZXN0Q2hhbmdlZChuZXdCdW5kbGVNYW5pZmVzdCwgb2xkQnVuZGxlTWFuaWZlc3QsIG5ld1Rlc3RCdW5kbGVNYW5pZmVzdCwgb2xkVGVzdEJ1bmRsZU1hbmlmZXN0LAotCQkJCXR5cGVzLCBqYXZhUHJvamVjdCk7Ci0JfQorICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHtAbGluayBJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcn0gb2YgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYnVuZGxlTWFuaWZlc3RDaGFuZ2VkKEJ1bmRsZU1hbmlmZXN0IG5ld0J1bmRsZU1hbmlmZXN0LCBCdW5kbGVNYW5pZmVzdCBvbGRCdW5kbGVNYW5pZmVzdCwgQnVuZGxlTWFuaWZlc3QgbmV3VGVzdEJ1bmRsZU1hbmlmZXN0LAorICAgICAgICBCdW5kbGVNYW5pZmVzdCBvbGRUZXN0QnVuZGxlTWFuaWZlc3QsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgeworICAgICAgICBTZXQ8SUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuVHlwZT4gdHlwZXMgPSBuZXcgSGFzaFNldDxJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lci5UeXBlPigpOworICAgICAgICB0eXBlcy5hZGRBbGwoQnVuZGxlTWFuaWZlc3REaWZmZXIuZGlmZihuZXdCdW5kbGVNYW5pZmVzdCwgb2xkQnVuZGxlTWFuaWZlc3QpKTsKKyAgICAgICAgdHlwZXMuYWRkQWxsKEJ1bmRsZU1hbmlmZXN0RGlmZmVyLmRpZmYobmV3VGVzdEJ1bmRsZU1hbmlmZXN0LCBvbGRUZXN0QnVuZGxlTWFuaWZlc3QpKTsKKyAgICAgICAgYnVuZGxlTWFuaWZlc3RDaGFuZ2VkKG5ld0J1bmRsZU1hbmlmZXN0LCBvbGRCdW5kbGVNYW5pZmVzdCwgbmV3VGVzdEJ1bmRsZU1hbmlmZXN0LCBvbGRUZXN0QnVuZGxlTWFuaWZlc3QsIHR5cGVzLCBqYXZhUHJvamVjdCk7CisgICAgfQogCi0JLyoqCi0JICogTm90aWZpZXMge0BsaW5rIElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyfSBvZiBjaGFuZ2VzLgotCSAqLwotCXByaXZhdGUgdm9pZCBidW5kbGVNYW5pZmVzdENoYW5nZWQoQnVuZGxlTWFuaWZlc3QgbmV3QnVuZGxlTWFuaWZlc3QsIEJ1bmRsZU1hbmlmZXN0IG9sZEJ1bmRsZU1hbmlmZXN0LAotCQkJQnVuZGxlTWFuaWZlc3QgbmV3VGVzdEJ1bmRsZU1hbmlmZXN0LCBCdW5kbGVNYW5pZmVzdCBvbGRUZXN0QnVuZGxlTWFuaWZlc3QsCi0JCQlTZXQ8SUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIuVHlwZT4gdHlwZXMsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlmb3IgKElCdW5kbGVNYW5pZmVzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogYnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCWxpc3RlbmVyLmJ1bmRsZU1hbmlmZXN0Q2hhbmdlZChuZXdCdW5kbGVNYW5pZmVzdCwgb2xkQnVuZGxlTWFuaWZlc3QsIG5ld1Rlc3RCdW5kbGVNYW5pZmVzdCwKLQkJCQkJb2xkVGVzdEJ1bmRsZU1hbmlmZXN0LCB0eXBlcywgamF2YVByb2plY3QpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIE5vdGlmaWVzIHtAbGluayBJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lcn0gb2YgY2hhbmdlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYnVuZGxlTWFuaWZlc3RDaGFuZ2VkKEJ1bmRsZU1hbmlmZXN0IG5ld0J1bmRsZU1hbmlmZXN0LCBCdW5kbGVNYW5pZmVzdCBvbGRCdW5kbGVNYW5pZmVzdCwgQnVuZGxlTWFuaWZlc3QgbmV3VGVzdEJ1bmRsZU1hbmlmZXN0LAorICAgICAgICBCdW5kbGVNYW5pZmVzdCBvbGRUZXN0QnVuZGxlTWFuaWZlc3QsIFNldDxJQnVuZGxlTWFuaWZlc3RDaGFuZ2VMaXN0ZW5lci5UeXBlPiB0eXBlcywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7CisgICAgICAgIGZvciAoSUJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmJ1bmRsZU1hbmlmZXN0Q2hhbmdlTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBsaXN0ZW5lci5idW5kbGVNYW5pZmVzdENoYW5nZWQobmV3QnVuZGxlTWFuaWZlc3QsIG9sZEJ1bmRsZU1hbmlmZXN0LCBuZXdUZXN0QnVuZGxlTWFuaWZlc3QsIG9sZFRlc3RCdW5kbGVNYW5pZmVzdCwgdHlwZXMsIGphdmFQcm9qZWN0KTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgdm9pZCB1cGRhdGVCdW5kbGVNYW5pZmVzdEZvclJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QgPSBnZXRCdW5kbGVNYW5pZmVzdChqYXZhUHJvamVjdCk7Ci0JCUJ1bmRsZU1hbmlmZXN0IHRlc3RCdW5kbGVNYW5pZmVzdCA9IGdldFRlc3RCdW5kbGVNYW5pZmVzdChqYXZhUHJvamVjdCk7Ci0JCWJ1bmRsZU1hbmlmZXN0Q2hhbmdlZChidW5kbGVNYW5pZmVzdCwgYnVuZGxlTWFuaWZlc3QsIHRlc3RCdW5kbGVNYW5pZmVzdCwgdGVzdEJ1bmRsZU1hbmlmZXN0LCBJTVBPUlRTX0NIQU5HRUQsCi0JCQkJamF2YVByb2plY3QpOwotCX0KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlQnVuZGxlTWFuaWZlc3RGb3JSZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlLmdldFByb2plY3QoKSk7CisgICAgICAgIEJ1bmRsZU1hbmlmZXN0IGJ1bmRsZU1hbmlmZXN0ID0gZ2V0QnVuZGxlTWFuaWZlc3QoamF2YVByb2plY3QpOworICAgICAgICBCdW5kbGVNYW5pZmVzdCB0ZXN0QnVuZGxlTWFuaWZlc3QgPSBnZXRUZXN0QnVuZGxlTWFuaWZlc3QoamF2YVByb2plY3QpOworICAgICAgICBidW5kbGVNYW5pZmVzdENoYW5nZWQoYnVuZGxlTWFuaWZlc3QsIGJ1bmRsZU1hbmlmZXN0LCB0ZXN0QnVuZGxlTWFuaWZlc3QsIHRlc3RCdW5kbGVNYW5pZmVzdCwgSU1QT1JUU19DSEFOR0VELCBqYXZhUHJvamVjdCk7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhckxpbmtlZEJ1bmRsZU1hbmlmZXN0cyhQYXIgcGFyKSB7Ci0JCWlmIChwYXIgIT0gbnVsbCAmJiBwYXIuZ2V0QnVuZGxlKCkgIT0gbnVsbCkgewotCQkJZm9yIChCdW5kbGUgYnVuZGxlIDogcGFyLmdldEJ1bmRsZSgpKSB7Ci0JCQkJSVByb2plY3QgYnVuZGxlUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJCWlmIChGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChidW5kbGVQcm9qZWN0KSkgewotCQkJCQl1cGRhdGVCdW5kbGVNYW5pZmVzdEZvclJlc291cmNlKGJ1bmRsZVByb2plY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGFyTGlua2VkQnVuZGxlTWFuaWZlc3RzKFBhciBwYXIpIHsKKyAgICAgICAgaWYgKHBhciAhPSBudWxsICYmIHBhci5nZXRCdW5kbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBwYXIuZ2V0QnVuZGxlKCkpIHsKKyAgICAgICAgICAgICAgICBJUHJvamVjdCBidW5kbGVQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KGJ1bmRsZVByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUJ1bmRsZU1hbmlmZXN0Rm9yUmVzb3VyY2UoYnVuZGxlUHJvamVjdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICoge0BsaW5rIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyfSB0aGF0IGxpc3RlbnMgdG8gY2hhbmdlcyB0byBQQVIgcHJvamVjdCBkZWxldGlvbnMuIENvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0Ci0JICogZGVwZW5kZW50IGJ1bmRsZXMgZHVyaW5nIHRoZSBwcmUtZGVsZXRlIHBoYXNlLCB0aGVuIHVwZGF0ZXMgdGhvc2UgYnVuZGxlcycgY2xhc3NwYXRoIGNvbnRhaW5lcnMgZHVyaW5nIHRoZQotCSAqIHBvc3QtY2hhbmdlIHBoYXNlLgotCSAqLwotCWNsYXNzIFBhckNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvciB7CisgICAgLyoqCisgICAgICoge0BsaW5rIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyfSB0aGF0IGxpc3RlbnMgdG8gY2hhbmdlcyB0byBQQVIgcHJvamVjdCBkZWxldGlvbnMuIENvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0CisgICAgICogZGVwZW5kZW50IGJ1bmRsZXMgZHVyaW5nIHRoZSBwcmUtZGVsZXRlIHBoYXNlLCB0aGVuIHVwZGF0ZXMgdGhvc2UgYnVuZGxlcycgY2xhc3NwYXRoIGNvbnRhaW5lcnMgZHVyaW5nIHRoZQorICAgICAqIHBvc3QtY2hhbmdlIHBoYXNlLgorICAgICAqLworICAgIGNsYXNzIFBhckNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZURlbHRhVmlzaXRvciB7CiAKLQkJcHJpdmF0ZSBmaW5hbCBNYXA8SVJlc291cmNlLCBQYXI+IHBhclByb2plY3RzID0gbmV3IEhhc2hNYXA8SVJlc291cmNlLCBQYXI+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPElSZXNvdXJjZSwgUGFyPiBwYXJQcm9qZWN0cyA9IG5ldyBIYXNoTWFwPElSZXNvdXJjZSwgUGFyPigpOwogCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSVdvcmtzcGFjZSkgewotCQkJCWludCBldmVudFR5cGUgPSBldmVudC5nZXRUeXBlKCk7Ci0JCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEU6Ci0JCQkJCS8vIGNhcHR1cmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhciBjb250ZW50cyBiZWZvcmUgZGVsZXRpb24KLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gZXZlbnQuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgRmFjZXRVdGlscy5pc1BhclByb2plY3QocmVzb3VyY2UpKSB7Ci0JCQkJCQlQYXIgcGFyID0gRmFjZXRVdGlscy5nZXRQYXJEZWZpbml0aW9uKHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCQkJCQlpZiAocGFyICE9IG51bGwpIHsKLQkJCQkJCQlwYXJQcm9qZWN0cy5wdXQocmVzb3VyY2UsIHBhcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRToKLQkJCQkJLy8gdGhlbiB1cGRhdGUgYnVuZGxlIG1hbmlmZXN0cyBwb3N0IGRlbGV0aW9uCi0JCQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZGVsdGEuYWNjZXB0KHRoaXMpOwotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQkJCQkiRXJyb3Igd2hpbGUgdHJhdmVyc2luZyByZXNvdXJjZSBjaGFuZ2UgZGVsdGEiLCBlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSVdvcmtzcGFjZSkgeworICAgICAgICAgICAgICAgIGludCBldmVudFR5cGUgPSBldmVudC5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChldmVudFR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFyIGNvbnRlbnRzIGJlZm9yZSBkZWxldGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZXZlbnQuZ2V0UmVzb3VyY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsICYmIEZhY2V0VXRpbHMuaXNQYXJQcm9qZWN0KHJlc291cmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhciBwYXIgPSBGYWNldFV0aWxzLmdldFBhckRlZmluaXRpb24ocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJQcm9qZWN0cy5wdXQocmVzb3VyY2UsIHBhcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0U6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHVwZGF0ZSBidW5kbGUgbWFuaWZlc3RzIHBvc3QgZGVsZXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIElSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEuYWNjZXB0KHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5QTFVHSU5fSUQsICJFcnJvciB3aGlsZSB0cmF2ZXJzaW5nIHJlc291cmNlIGNoYW5nZSBkZWx0YSIsIGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCWlmIChwYXJQcm9qZWN0cy5jb250YWluc0tleShyZXNvdXJjZSkpIHsKLQkJCQkJdXBkYXRlUGFyTGlua2VkQnVuZGxlTWFuaWZlc3RzKHBhclByb2plY3RzLmdldChyZXNvdXJjZSkpOwotCQkJCQlwYXJQcm9qZWN0cy5yZW1vdmUocmVzb3VyY2UpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9OworICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKKyAgICAgICAgICAgIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhclByb2plY3RzLmNvbnRhaW5zS2V5KHJlc291cmNlKSkgeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVQYXJMaW5rZWRCdW5kbGVNYW5pZmVzdHModGhpcy5wYXJQcm9qZWN0cy5nZXQocmVzb3VyY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJQcm9qZWN0cy5yZW1vdmUocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9OwogCi0JLyoqCi0JICoge0BsaW5rIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyfSB0aGF0IGxpc3RlbnMgdG8gY2hhbmdlcyB0byB0aGUgTUFOSUZFU1QuTUYgcmVzb3VyY2VzLgotCSAqLwotCWNsYXNzIE1hbmlmZXN0UmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXJ9IHRoYXQgbGlzdGVucyB0byBjaGFuZ2VzIHRvIHRoZSBNQU5JRkVTVC5NRiByZXNvdXJjZXMuCisgICAgICovCisgICAgY2xhc3MgTWFuaWZlc3RSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewogCi0JCS8qKgotCQkgKiBJbnRlcm5hbCByZXNvdXJjZSBkZWx0YSB2aXNpdG9yLgotCQkgKi8KLQkJcHJvdGVjdGVkIGNsYXNzIE1hbmlmZXN0UmVzb3VyY2VWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludGVybmFsIHJlc291cmNlIGRlbHRhIHZpc2l0b3IuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgTWFuaWZlc3RSZXNvdXJjZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewogCi0JCQlwcm90ZWN0ZWQgaW50IGV2ZW50VHlwZTsKKyAgICAgICAgICAgIHByb3RlY3RlZCBpbnQgZXZlbnRUeXBlOwogCi0JCQlwdWJsaWMgTWFuaWZlc3RSZXNvdXJjZVZpc2l0b3IoaW50IGV2ZW50VHlwZSkgewotCQkJCXRoaXMuZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotCQkJfQorICAgICAgICAgICAgcHVibGljIE1hbmlmZXN0UmVzb3VyY2VWaXNpdG9yKGludCBldmVudFR5cGUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKKyAgICAgICAgICAgIH0KIAotCQkJcHVibGljIGZpbmFsIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRDoKLQkJCQkJcmV0dXJuIHJlc291cmNlQWRkZWQocmVzb3VyY2UpOworICAgICAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlRGVsdGEuQURERUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VBZGRlZChyZXNvdXJjZSk7CiAKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLk9QRU46Ci0JCQkJCXJldHVybiByZXNvdXJjZU9wZW5lZChyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlRGVsdGEuT1BFTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZU9wZW5lZChyZXNvdXJjZSk7CiAKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6Ci0JCQkJCXJldHVybiByZXNvdXJjZUNoYW5nZWQocmVzb3VyY2UsIGRlbHRhLmdldEZsYWdzKCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VDaGFuZ2VkKHJlc291cmNlLCBkZWx0YS5nZXRGbGFncygpKTsKIAotCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRDoKLQkJCQkJcmV0dXJuIHJlc291cmNlUmVtb3ZlZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQorICAgICAgICAgICAgICAgICAgICBjYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VSZW1vdmVkKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAKLQkJCXByb3RlY3RlZCBib29sZWFuIHJlc291cmNlQWRkZWQoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUgJiYgaXNQYXJYbWwocmVzb3VyY2UpKSB7Ci0JCQkJCXBhclJlc291cmNlQ2hhbmdlZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQorICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VBZGRlZChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSAmJiBpc1BhclhtbChyZXNvdXJjZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyUmVzb3VyY2VDaGFuZ2VkKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAKLQkJCXByb3RlY3RlZCBib29sZWFuIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBmbGFncykgewotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCWlmICgoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSAhPSAwKSB7Ci0JCQkJCQlpZiAoKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KHJlc291cmNlKSB8fCBGYWNldFV0aWxzLmhhc1Byb2plY3RGYWNldChyZXNvdXJjZSwKLQkJCQkJCQkJRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRCkpKSB7Ci0JCQkJCQkJaWYgKGlzTWFuaWZlc3QocmVzb3VyY2UpKSB7Ci0JCQkJCQkJCXVwZGF0ZUJ1bmRsZU1hbmlmZXN0KEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZS5nZXRQcm9qZWN0KCkpLCBmYWxzZSk7Ci0JCQkJCQkJfSBlbHNlIGlmIChpc1Rlc3RNYW5pZmVzdChyZXNvdXJjZSkpIHsKLQkJCQkJCQkJdXBkYXRlQnVuZGxlTWFuaWZlc3QoSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlLmdldFByb2plY3QoKSksIHRydWUpOwotCQkJCQkJCX0gZWxzZSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscygiLmNsYXNzcGF0aCIpCi0JCQkJCQkJCQkmJiByZXNvdXJjZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCQkJCXVwZGF0ZUJ1bmRsZU1hbmlmZXN0KEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZS5nZXRQcm9qZWN0KCkpLCBmYWxzZSk7Ci0JCQkJCQkJCXVwZGF0ZUJ1bmRsZU1hbmlmZXN0KEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZS5nZXRQcm9qZWN0KCkpLCB0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlIHJlc291cmNlLCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KHJlc291cmNlKSB8fCBGYWNldFV0aWxzLmhhc1Byb2plY3RGYWNldChyZXNvdXJjZSwgRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNNYW5pZmVzdChyZXNvdXJjZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQnVuZGxlTWFuaWZlc3QoSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlLmdldFByb2plY3QoKSksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzVGVzdE1hbmlmZXN0KHJlc291cmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVCdW5kbGVNYW5pZmVzdChKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKCIuY2xhc3NwYXRoIikgJiYgcmVzb3VyY2UuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBJUHJvamVjdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVCdW5kbGVNYW5pZmVzdChKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVCdW5kbGVNYW5pZmVzdChKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCQlpZiAoaXNQYXJYbWwocmVzb3VyY2UpKSB7Ci0JCQkJCQkJcGFyUmVzb3VyY2VDaGFuZ2VkKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGFyWG1sKHJlc291cmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhclJlc291cmNlQ2hhbmdlZChyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KIAotCQkJcHJpdmF0ZSB2b2lkIHBhclJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCQkvLyB0YXJnZXQgb2YgYSBwYXIgcHJvamVjdCBvciBwYXIgYnVuZGxlcyBoYXMgY2hhbmdlZAotCQkJCWlmIChGYWNldFV0aWxzLmlzUGFyUHJvamVjdChyZXNvdXJjZSkpIHsKLQkJCQkJUGFyIHBhciA9IEZhY2V0VXRpbHMuZ2V0UGFyRGVmaW5pdGlvbihyZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQkJCQl1cGRhdGVQYXJMaW5rZWRCdW5kbGVNYW5pZmVzdHMocGFyKTsKLQkJCQl9Ci0JCQkJLy8gdGFyZ2V0IG9mIGJ1bmRsZSBwcm9qZWN0IGNvdWxkIGhhdmUgY2hhbmdlZAotCQkJCWVsc2UgaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KHJlc291cmNlKSkgewotCQkJCQl1cGRhdGVCdW5kbGVNYW5pZmVzdEZvclJlc291cmNlKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBwcml2YXRlIHZvaWQgcGFyUmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICAgICAgICAgIC8vIHRhcmdldCBvZiBhIHBhciBwcm9qZWN0IG9yIHBhciBidW5kbGVzIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNQYXJQcm9qZWN0KHJlc291cmNlKSkgeworICAgICAgICAgICAgICAgICAgICBQYXIgcGFyID0gRmFjZXRVdGlscy5nZXRQYXJEZWZpbml0aW9uKHJlc291cmNlLmdldFByb2plY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBhckxpbmtlZEJ1bmRsZU1hbmlmZXN0cyhwYXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB0YXJnZXQgb2YgYnVuZGxlIHByb2plY3QgY291bGQgaGF2ZSBjaGFuZ2VkCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocmVzb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUJ1bmRsZU1hbmlmZXN0Rm9yUmVzb3VyY2UocmVzb3VyY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VPcGVuZWQoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZXNvdXJjZU9wZW5lZChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KIAotCQkJcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VSZW1vdmVkKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJCWlmIChpc01hbmlmZXN0KHJlc291cmNlKSkgewotCQkJCQl1cGRhdGVCdW5kbGVNYW5pZmVzdChKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSwgZmFsc2UpOwotCQkJCX0gZWxzZSBpZiAoaXNUZXN0TWFuaWZlc3QocmVzb3VyY2UpKSB7Ci0JCQkJCXVwZGF0ZUJ1bmRsZU1hbmlmZXN0KEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZS5nZXRQcm9qZWN0KCkpLCB0cnVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlc291cmNlUmVtb3ZlZChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNNYW5pZmVzdChyZXNvdXJjZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlQnVuZGxlTWFuaWZlc3QoSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlLmdldFByb2plY3QoKSksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzVGVzdE1hbmlmZXN0KHJlc291cmNlKSkgeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVCdW5kbGVNYW5pZmVzdChKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElTVEVORVJfRkxBR1MgPSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFCi0JCQkJfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQ7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJU1RFTkVSX0ZMQUdTID0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRDsKIAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVklTSVRPUl9GTEFHUyA9IElSZXNvdXJjZURlbHRhLkFEREVEIHwgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCB8IElSZXNvdXJjZURlbHRhLlJFTU9WRUQ7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBWSVNJVE9SX0ZMQUdTID0gSVJlc291cmNlRGVsdGEuQURERUQgfCBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIHwgSVJlc291cmNlRGVsdGEuUkVNT1ZFRDsKIAotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIElXb3Jrc3BhY2UpIHsKLQkJCQlpbnQgZXZlbnRUeXBlID0gZXZlbnQuZ2V0VHlwZSgpOwotCQkJCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRToKLQkJCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJCQlpZiAoZGVsdGEgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlkZWx0YS5hY2NlcHQoZ2V0VmlzaXRvcihldmVudFR5cGUpLCBWSVNJVE9SX0ZMQUdTKTsKLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKLQkJCQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkJCQkJIkVycm9yIHdoaWxlIHRyYXZlcnNpbmcgcmVzb3VyY2UgY2hhbmdlIGRlbHRhIiwgZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCWludCBldmVudFR5cGUgPSBldmVudC5nZXRUeXBlKCk7Ci0JCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFOgotCQkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQkJCWlmIChkZWx0YSAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWRlbHRhLmFjY2VwdChnZXRWaXNpdG9yKGV2ZW50VHlwZSksIFZJU0lUT1JfRkxBR1MpOwotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQkJCQkiRXJyb3Igd2hpbGUgdHJhdmVyc2luZyByZXNvdXJjZSBjaGFuZ2UgZGVsdGEiLCBlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQorICAgICAgICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIElXb3Jrc3BhY2UpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXZlbnRUeXBlID0gZXZlbnQuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0U6CisgICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhLmFjY2VwdChnZXRWaXNpdG9yKGV2ZW50VHlwZSksIFZJU0lUT1JfRkxBR1MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5QTFVHSU5fSUQsICJFcnJvciB3aGlsZSB0cmF2ZXJzaW5nIHJlc291cmNlIGNoYW5nZSBkZWx0YSIsIGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSVByb2plY3QpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXZlbnRUeXBlID0gZXZlbnQuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0U6CisgICAgICAgICAgICAgICAgICAgICAgICBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhLmFjY2VwdChnZXRWaXNpdG9yKGV2ZW50VHlwZSksIFZJU0lUT1JfRkxBR1MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5QTFVHSU5fSUQsICJFcnJvciB3aGlsZSB0cmF2ZXJzaW5nIHJlc291cmNlIGNoYW5nZSBkZWx0YSIsIGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJfQorICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIElSZXNvdXJjZURlbHRhVmlzaXRvciBnZXRWaXNpdG9yKGludCBldmVudFR5cGUpIHsKLQkJCXJldHVybiBuZXcgTWFuaWZlc3RSZXNvdXJjZVZpc2l0b3IoZXZlbnRUeXBlKTsKLQkJfQorICAgICAgICBwcm90ZWN0ZWQgSVJlc291cmNlRGVsdGFWaXNpdG9yIGdldFZpc2l0b3IoaW50IGV2ZW50VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW5pZmVzdFJlc291cmNlVmlzaXRvcihldmVudFR5cGUpOworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gaXNUZXN0TWFuaWZlc3QoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUKLQkJCQkJJiYgcmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscygiVEVTVC5NRiIpICYmIHJlc291cmNlLmdldFBhcmVudCgpICE9IG51bGwKLQkJCQkJJiYgcmVzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLmxhc3RTZWdtZW50KCkuZXF1YWxzKCJNRVRBLUlORiIpOwotCQl9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVGVzdE1hbmlmZXN0KElSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIHJlc291cmNlLmdldE5hbWUoKS5lcXVhbHMoIlRFU1QuTUYiKQorICAgICAgICAgICAgICAgICYmIHJlc291cmNlLmdldFBhcmVudCgpICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLmxhc3RTZWdtZW50KCkuZXF1YWxzKCJNRVRBLUlORiIpOworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gaXNNYW5pZmVzdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCXJldHVybiByZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpICYmIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRQotCQkJCQkmJiByZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5NQU5JRkVTVF9GSUxFX05BTUUpCi0JCQkJCSYmIHJlc291cmNlLmdldFBhcmVudCgpICE9IG51bGwKLQkJCQkJJiYgcmVzb3VyY2UuZ2V0UGFyZW50KCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLmxhc3RTZWdtZW50KCkuZXF1YWxzKCJNRVRBLUlORiIpOwotCQl9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTWFuaWZlc3QoSVJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc0FjY2Vzc2libGUoKSAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUKKyAgICAgICAgICAgICAgICAmJiByZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5NQU5JRkVTVF9GSUxFX05BTUUpICYmIHJlc291cmNlLmdldFBhcmVudCgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiByZXNvdXJjZS5nZXRQYXJlbnQoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkubGFzdFNlZ21lbnQoKS5lcXVhbHMoIk1FVEEtSU5GIik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgYm9vbGVhbiBpc1BhclhtbChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCXJldHVybiByZXNvdXJjZSAhPSBudWxsCi0JCQkJCSYmIChyZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWwiKSB8fCByZXNvdXJjZS5nZXROYW1lKCkKLQkJCQkJCQkuZXF1YWxzKCJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnBhci54bWwiKSk7Ci0JCX0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQYXJYbWwoSVJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2UgIT0gbnVsbCAmJiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscygib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sIikKKyAgICAgICAgICAgICAgICB8fCByZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnBhci54bWwiKSk7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS9tb2RlbC9BYnN0cmFjdE1hbmlmZXN0RWxlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL21vZGVsL0Fic3RyYWN0TWFuaWZlc3RFbGVtZW50LmphdmEKaW5kZXggZTI2ZWVkMC4uNzQ2M2JhNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL21vZGVsL0Fic3RyYWN0TWFuaWZlc3RFbGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL21vZGVsL0Fic3RyYWN0TWFuaWZlc3RFbGVtZW50LmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUubW9kZWw7CiAKIC8qKgpAQCAtMTUsNzEgKzE2LDcxIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBBYnN0cmFjdE1hbmlmZXN0RWxlbWVudCB7CiAKLQlwcml2YXRlIEFic3RyYWN0TWFuaWZlc3RFbGVtZW50IHBhcmVudDsKKyAgICBwcml2YXRlIEFic3RyYWN0TWFuaWZlc3RFbGVtZW50IHBhcmVudDsKIAotCXByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKIAotCXB1YmxpYyBBYnN0cmFjdE1hbmlmZXN0RWxlbWVudChBYnN0cmFjdE1hbmlmZXN0RWxlbWVudCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KKyAgICBwdWJsaWMgQWJzdHJhY3RNYW5pZmVzdEVsZW1lbnQoQWJzdHJhY3RNYW5pZmVzdEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CiAKLQlwdWJsaWMgQWJzdHJhY3RNYW5pZmVzdEVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBBYnN0cmFjdE1hbmlmZXN0RWxlbWVudFswXTsKLQl9CisgICAgcHVibGljIEFic3RyYWN0TWFuaWZlc3RFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB7CisgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RNYW5pZmVzdEVsZW1lbnRbMF07CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KIAotCXB1YmxpYyBBYnN0cmFjdE1hbmlmZXN0RWxlbWVudCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQorICAgIHB1YmxpYyBBYnN0cmFjdE1hbmlmZXN0RWxlbWVudCBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBhcmVudDsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoQWJzdHJhY3RNYW5pZmVzdEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoQWJzdHJhY3RNYW5pZmVzdEVsZW1lbnQgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWZpbmFsIGludCBwcmltZSA9IDMxOwotCQlpbnQgcmVzdWx0ID0gMTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG5hbWUgPT0gbnVsbCkgPyAwIDogbmFtZS5oYXNoQ29kZSgpKTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHBhcmVudCA9PSBudWxsKSA/IDAgOiBwYXJlbnQuaGFzaENvZGUoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAodGhpcy5uYW1lID09IG51bGwgPyAwIDogdGhpcy5uYW1lLmhhc2hDb2RlKCkpOworICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICh0aGlzLnBhcmVudCA9PSBudWxsID8gMCA6IHRoaXMucGFyZW50Lmhhc2hDb2RlKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlBYnN0cmFjdE1hbmlmZXN0RWxlbWVudCBvdGhlciA9IChBYnN0cmFjdE1hbmlmZXN0RWxlbWVudCkgb2JqOwotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIubmFtZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGVsc2UgaWYgKCFuYW1lLmVxdWFscyhvdGhlci5uYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLnBhcmVudCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGVsc2UgaWYgKCFwYXJlbnQuZXF1YWxzKG90aGVyLnBhcmVudCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gb2JqKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEFic3RyYWN0TWFuaWZlc3RFbGVtZW50IG90aGVyID0gKEFic3RyYWN0TWFuaWZlc3RFbGVtZW50KSBvYmo7CisgICAgICAgIGlmICh0aGlzLm5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG90aGVyLm5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghdGhpcy5uYW1lLmVxdWFscyhvdGhlci5uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnBhcmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAob3RoZXIucGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMucGFyZW50LmVxdWFscyhvdGhlci5wYXJlbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvbW9kZWwvQnVuZGxlTWFuaWZlc3QuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS9tb2RlbC9CdW5kbGVNYW5pZmVzdC5qYXZhCmluZGV4IDlhYTNiZTYuLjBjYzBlNzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS9tb2RlbC9CdW5kbGVNYW5pZmVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS9tb2RlbC9CdW5kbGVNYW5pZmVzdC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLm1vZGVsOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKQEAgLTQyLDIzNCArNDMsMjMxIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVNYW5pZmVzdCBleHRlbmRzIEFic3RyYWN0TWFuaWZlc3RFbGVtZW50IHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVU5ETEVfTUFOSUZFU1RfVFlQRSA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVTkRMRV9NQU5JRkVTVF9UWVBFID0gMTsKIAotCXByaXZhdGUgSUZpbGUgZmlsZTsKKyAgICBwcml2YXRlIGZpbmFsIElGaWxlIGZpbGU7CiAKLQlwcml2YXRlIE1hcDxTdHJpbmcsIEJ1bmRsZU1hbmlmZXN0SGVhZGVyPiBoZWFkZXJNYXA7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBCdW5kbGVNYW5pZmVzdEhlYWRlcj4gaGVhZGVyTWFwOwogCi0vLwlwcml2YXRlIFNldDxWYWxpZGF0aW9uUHJvYmxlbT4gcHJvYmxlbXM7CisgICAgLy8gcHJpdmF0ZSBTZXQ8VmFsaWRhdGlvblByb2JsZW0+IHByb2JsZW1zOwogCi0JcHJpdmF0ZSBJRG9jdW1lbnQgdGV4dERvY3VtZW50OworICAgIHByaXZhdGUgSURvY3VtZW50IHRleHREb2N1bWVudDsKIAotCXB1YmxpYyBCdW5kbGVNYW5pZmVzdChJRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKG51bGwsIGZpbGUuZ2V0TmFtZSgpKTsKLQkJdGhpcy5maWxlID0gZmlsZTsKLS8vCQl0aGlzLnByb2JsZW1zID0gbmV3IExpbmtlZEhhc2hTZXQ8VmFsaWRhdGlvblByb2JsZW0+KCk7Ci0JCWluaXQoKTsKLQl9CisgICAgcHVibGljIEJ1bmRsZU1hbmlmZXN0KElGaWxlIGZpbGUpIHsKKyAgICAgICAgc3VwZXIobnVsbCwgZmlsZS5nZXROYW1lKCkpOworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgICAvLyB0aGlzLnByb2JsZW1zID0gbmV3IExpbmtlZEhhc2hTZXQ8VmFsaWRhdGlvblByb2JsZW0+KCk7CisgICAgICAgIGluaXQoKTsKKyAgICB9CiAKLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gdGV4dERvY3VtZW50OwotCX0KKyAgICBwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgeworICAgICAgICByZXR1cm4gdGhpcy50ZXh0RG9jdW1lbnQ7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0TWFuaWZlc3RFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCUxpc3Q8QnVuZGxlTWFuaWZlc3RIZWFkZXI+IGhlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZU1hbmlmZXN0SGVhZGVyPih0aGlzLmhlYWRlck1hcC52YWx1ZXMoKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoaGVhZGVycywgbmV3IENvbXBhcmF0b3I8QnVuZGxlTWFuaWZlc3RIZWFkZXI+KCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBYnN0cmFjdE1hbmlmZXN0RWxlbWVudFtdIGdldENoaWxkcmVuKCkgeworICAgICAgICBMaXN0PEJ1bmRsZU1hbmlmZXN0SGVhZGVyPiBoZWFkZXJzID0gbmV3IEFycmF5TGlzdDxCdW5kbGVNYW5pZmVzdEhlYWRlcj4odGhpcy5oZWFkZXJNYXAudmFsdWVzKCkpOworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGhlYWRlcnMsIG5ldyBDb21wYXJhdG9yPEJ1bmRsZU1hbmlmZXN0SGVhZGVyPigpIHsKIAotCQkJcHVibGljIGludCBjb21wYXJlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIG8xLCBCdW5kbGVNYW5pZmVzdEhlYWRlciBvMikgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihvMS5nZXRMaW5lTnVtYmVyKCkpLmNvbXBhcmVUbyhuZXcgSW50ZWdlcihvMi5nZXRMaW5lTnVtYmVyKCkpKTsKLQkJCX0KLQkJfSk7CisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoQnVuZGxlTWFuaWZlc3RIZWFkZXIgbzEsIEJ1bmRsZU1hbmlmZXN0SGVhZGVyIG8yKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKG8xLmdldExpbmVOdW1iZXIoKSkuY29tcGFyZVRvKG5ldyBJbnRlZ2VyKG8yLmdldExpbmVOdW1iZXIoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKIAotCQlyZXR1cm4gaGVhZGVycy50b0FycmF5KG5ldyBCdW5kbGVNYW5pZmVzdEhlYWRlclt0aGlzLmhlYWRlck1hcC5zaXplKCldKTsKLQl9CisgICAgICAgIHJldHVybiBoZWFkZXJzLnRvQXJyYXkobmV3IEJ1bmRsZU1hbmlmZXN0SGVhZGVyW3RoaXMuaGVhZGVyTWFwLnNpemUoKV0pOworICAgIH0KIAotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0RWxlbWVudFJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5maWxlOwotCX0KKyAgICBwdWJsaWMgSVJlc291cmNlIGdldEVsZW1lbnRSZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmlsZTsKKyAgICB9CiAKLQlwdWJsaWMgaW50IGdldEVsZW1lbnRUeXBlKCkgewotCQlyZXR1cm4gQlVORExFX01BTklGRVNUX1RZUEU7Ci0JfQorICAgIHB1YmxpYyBpbnQgZ2V0RWxlbWVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBCVU5ETEVfTUFOSUZFU1RfVFlQRTsKKyAgICB9CiAKLQlwdWJsaWMgQnVuZGxlTWFuaWZlc3RIZWFkZXIgZ2V0SGVhZGVyKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIHRoaXMuaGVhZGVyTWFwLmdldChrZXkudG9Mb3dlckNhc2UoKSk7Ci0JfQorICAgIHB1YmxpYyBCdW5kbGVNYW5pZmVzdEhlYWRlciBnZXRIZWFkZXIoU3RyaW5nIGtleSkgeworICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJNYXAuZ2V0KGtleS50b0xvd2VyQ2FzZSgpKTsKKyAgICB9CiAKLS8vCXB1YmxpYyBTZXQ8VmFsaWRhdGlvblByb2JsZW0+IGdldFByb2JsZW1zKCkgewotLy8JCXJldHVybiBwcm9ibGVtczsKLS8vCX0KKyAgICAvLyBwdWJsaWMgU2V0PFZhbGlkYXRpb25Qcm9ibGVtPiBnZXRQcm9ibGVtcygpIHsKKyAgICAvLyByZXR1cm4gcHJvYmxlbXM7CisgICAgLy8gfQogCi0JcHVibGljIGJvb2xlYW4gaXNFbGVtZW50QXJjaGl2ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50QXJjaGl2ZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlidWlsZGVyLmFwcGVuZChmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSkuYXBwZW5kKCJcbiIpOwotCQlmb3IgKEFic3RyYWN0TWFuaWZlc3RFbGVtZW50IGVsZW1lbnQgOiBnZXRDaGlsZHJlbigpKSB7Ci0JCQlidWlsZGVyLmFwcGVuZChlbGVtZW50LnRvU3RyaW5nKCkpLmFwcGVuZCgiXG4iKTsKLQkJfQotCQlyZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLmFwcGVuZCh0aGlzLmZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGZvciAoQWJzdHJhY3RNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCA6IGdldENoaWxkcmVuKCkpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGVsZW1lbnQudG9TdHJpbmcoKSkuYXBwZW5kKCJcbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQogCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SGVhZGVyTmFtZShTdHJpbmcgbGluZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjID0gbGluZS5jaGFyQXQoaSk7Ci0JCQlpZiAoYyA9PSAnOicpIHsKLQkJCQlyZXR1cm4gbGluZS5zdWJzdHJpbmcoMCwgaSk7Ci0JCQl9Ci0JCQlpZiAoKGMgPCAnQScgfHwgJ1onIDwgYykgJiYgKGMgPCAnYScgfHwgJ3onIDwgYykgJiYgKGMgPCAnMCcgfHwgJzknIDwgYykpIHsKLQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlpZiAoYyAhPSAnLScgJiYgYyAhPSAnXycpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwcml2YXRlIFN0cmluZyBnZXRIZWFkZXJOYW1lKFN0cmluZyBsaW5lKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIGMgPSBsaW5lLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjID09ICc6JykgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW5lLnN1YnN0cmluZygwLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoYyA8ICdBJyB8fCAnWicgPCBjKSAmJiAoYyA8ICdhJyB8fCAneicgPCBjKSAmJiAoYyA8ICcwJyB8fCAnOScgPCBjKSkgeworICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjICE9ICctJyAmJiBjICE9ICdfJykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JcHJvdGVjdGVkIElEb2N1bWVudCBjcmVhdGVEb2N1bWVudChJRmlsZSBmaWxlKSB7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCS8vIGJydXRlIGZvcmNlIGhlcmUgYXMgd2UgbmVlZCB0byBnZXQgdGhlIGZpbmFsIGZpbGUgY29udGVudHMgYXMgaXQgbWlnaHQgaGF2ZSBiZWVuCi0JCQkvLyB1cGRhdGVkIGJ5IGJ1bmRsb3IKLQkJCVN0cmluZyBjb250ZW50cyA9IGNvbnZlcnRTdHJlYW1Ub1N0cmluZyhmaWxlLmdldENvbnRlbnRzKHRydWUpKTsKLQkJCXJldHVybiBuZXcgRG9jdW1lbnQoY29udGVudHMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgcHJvdGVjdGVkIElEb2N1bWVudCBjcmVhdGVEb2N1bWVudChJRmlsZSBmaWxlKSB7CisgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGJydXRlIGZvcmNlIGhlcmUgYXMgd2UgbmVlZCB0byBnZXQgdGhlIGZpbmFsIGZpbGUgY29udGVudHMgYXMgaXQgbWlnaHQgaGF2ZSBiZWVuCisgICAgICAgICAgICAvLyB1cGRhdGVkIGJ5IGJ1bmRsb3IKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50cyA9IGNvbnZlcnRTdHJlYW1Ub1N0cmluZyhmaWxlLmdldENvbnRlbnRzKHRydWUpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRG9jdW1lbnQoY29udGVudHMpOworICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBlcnJvcihpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSkgewotCQkvLyBUT0RPOiByZS1pbXBsZW1lbnQgdmFsaWRhdGlvbiB3aXRoIEVjbGlwc2UgQVBJcwotLy8JCXByb2JsZW1zLmFkZChuZXcgVmFsaWRhdGlvblByb2JsZW0oc2V2ZXJpdHksIG1lc3NhZ2UsIGZpbGUsIGxpbmUpKTsKLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgZXJyb3IoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUpIHsKKyAgICAgICAgLy8gVE9ETzogcmUtaW1wbGVtZW50IHZhbGlkYXRpb24gd2l0aCBFY2xpcHNlIEFQSXMKKyAgICAgICAgLy8gcHJvYmxlbXMuYWRkKG5ldyBWYWxpZGF0aW9uUHJvYmxlbShzZXZlcml0eSwgbWVzc2FnZSwgZmlsZSwgbGluZSkpOworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXRoaXMudGV4dERvY3VtZW50ID0gY3JlYXRlRG9jdW1lbnQoZmlsZSk7Ci0JCXBhcnNlTWFuaWZlc3QodGV4dERvY3VtZW50KTsKLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgdGhpcy50ZXh0RG9jdW1lbnQgPSBjcmVhdGVEb2N1bWVudCh0aGlzLmZpbGUpOworICAgICAgICBwYXJzZU1hbmlmZXN0KHRoaXMudGV4dERvY3VtZW50KTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZU1hbmlmZXN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQl0cnkgewotCQkJaGVhZGVyTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCdW5kbGVNYW5pZmVzdEhlYWRlcj4oKTsKLQkJCUJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciA9IG51bGw7Ci0JCQlpbnQgbCA9IDA7Ci0JCQlmb3IgKDsgbCA8IGRvY3VtZW50LmdldE51bWJlck9mTGluZXMoKTsgbCsrKSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihsKTsKLQkJCQlTdHJpbmcgbGluZSA9IGRvY3VtZW50LmdldChsaW5lSW5mby5nZXRPZmZzZXQoKSwgbGluZUluZm8uZ2V0TGVuZ3RoKCkpOwotCQkJCS8vIHRlc3QgbGluZXMnIGxlbmd0aAotCQkJCUNoYXJzZXQgY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihsKTsKLQkJCQlpZiAobGluZURlbGltaXRlciA9PSBudWxsKSB7Ci0JCQkJCWxpbmVEZWxpbWl0ZXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlCeXRlQnVmZmVyIGJ5dGVCdWYgPSBjaGFyc2V0LmVuY29kZShsaW5lKTsKLQkJCQlpZiAoYnl0ZUJ1Zi5saW1pdCgpICsgbGluZURlbGltaXRlci5sZW5ndGgoKSA+IDUxMikgewotCQkJCQllcnJvcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX2xpbmVUb29Mb25nLCBsICsgMSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJLy8gcGFyc2UKLQkJCQlpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCS8vIEVtcHR5IExpbmUKLQkJCQkJaWYgKGwgPT0gMCkgewotCQkJCQkJZXJyb3IoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9ub01haW5TZWN0aW9uLCAxKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQkvKiBmbHVzaCBsYXN0IGxpbmUgKi8KLQkJCQkJaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0JCQkJCQloZWFkZXJNYXAucHV0KGhlYWRlci5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSwgaGVhZGVyKTsKLQkJCQkJCWhlYWRlciA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7IC8qIGRvbmUgcHJvY2Vzc2luZyBtYWluIGF0dHJpYnV0ZXMgKi8KLQkJCQl9Ci0JCQkJaWYgKGxpbmUuY2hhckF0KDApID09ICcgJykgewotCQkJCQkvLyBDb250aW51YXRpb24gTGluZQotCQkJCQlpZiAobCA9PSAwKSB7IC8qIGlmIG5vIHByZXZpb3VzIGxpbmUgKi8KLQkJCQkJCWVycm9yKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIEJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfbm9NYWluU2VjdGlvbiwgMSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0JCQkJCQloZWFkZXIuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDEpKTsKLQkJCQkJfQorICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlTWFuaWZlc3QoSURvY3VtZW50IGRvY3VtZW50KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLmhlYWRlck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQnVuZGxlTWFuaWZlc3RIZWFkZXI+KCk7CisgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIgPSBudWxsOworICAgICAgICAgICAgaW50IGwgPSAwOworICAgICAgICAgICAgZm9yICg7IGwgPCBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCk7IGwrKykgeworICAgICAgICAgICAgICAgIElSZWdpb24gbGluZUluZm8gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24obCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBkb2N1bWVudC5nZXQobGluZUluZm8uZ2V0T2Zmc2V0KCksIGxpbmVJbmZvLmdldExlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAvLyB0ZXN0IGxpbmVzJyBsZW5ndGgKKyAgICAgICAgICAgICAgICBDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZURlbGltaXRlciA9IGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIobCk7CisgICAgICAgICAgICAgICAgaWYgKGxpbmVEZWxpbWl0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsaW5lRGVsaW1pdGVyID0gIiI7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBieXRlQnVmID0gY2hhcnNldC5lbmNvZGUobGluZSk7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVCdWYubGltaXQoKSArIGxpbmVEZWxpbWl0ZXIubGVuZ3RoKCkgPiA1MTIpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9saW5lVG9vTG9uZywgbCArIDEpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHBhcnNlCisgICAgICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBFbXB0eSBMaW5lCisgICAgICAgICAgICAgICAgICAgIGlmIChsID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIEJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfbm9NYWluU2VjdGlvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogZmx1c2ggbGFzdCBsaW5lICovCisgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJNYXAucHV0KGhlYWRlci5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSwgaGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIGRvbmUgcHJvY2Vzc2luZyBtYWluIGF0dHJpYnV0ZXMgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxpbmUuY2hhckF0KDApID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51YXRpb24gTGluZQorICAgICAgICAgICAgICAgICAgICBpZiAobCA9PSAwKSB7IC8qIGlmIG5vIHByZXZpb3VzIGxpbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIEJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfbm9NYWluU2VjdGlvbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQkvLyBFeHBlY3RpbmcgTmV3IEhlYWRlcgotCQkJCWlmIChoZWFkZXIgIT0gbnVsbCkgewotCQkJCQloZWFkZXJNYXAucHV0KGhlYWRlci5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSwgaGVhZGVyKTsKLQkJCQkJaGVhZGVyID0gbnVsbDsKLQkJCQl9CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RpbmcgTmV3IEhlYWRlcgorICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlck1hcC5wdXQoaGVhZGVyLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLCBoZWFkZXIpOworICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KIAotCQkJCWludCBjb2xvbiA9IGxpbmUuaW5kZXhPZignOicpOwotCQkJCWlmIChjb2xvbiA9PSAtMSkgeyAvKiBubyBjb2xvbiAqLwotCQkJCQllcnJvcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX25vQ29sb24sIGwgKyAxKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgaGVhZGVyTmFtZSA9IGdldEhlYWRlck5hbWUobGluZSk7Ci0JCQkJaWYgKGhlYWRlck5hbWUgPT0gbnVsbCkgewotCQkJCQllcnJvcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX2ludmFsaWRIZWFkZXJOYW1lLAotCQkJCQkJCWwgKyAxKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAobGluZS5sZW5ndGgoKSA8IGNvbG9uICsgMiB8fCBsaW5lLmNoYXJBdChjb2xvbiArIDEpICE9ICcgJykgewotCQkJCQllcnJvcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX25vU3BhY2VWYWx1ZSwgbCArIDEpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICgiTmFtZSIuZXF1YWxzKGhlYWRlck5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZXJyb3IoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9uYW1lSGVhZGVySW5NYWluLAotCQkJCQkJCWwgKyAxKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQloZWFkZXIgPSBuZXcgQnVuZGxlTWFuaWZlc3RIZWFkZXIodGhpcywgaGVhZGVyTmFtZSwgbGluZS5zdWJzdHJpbmcoY29sb24gKyAyKSwgbCk7Ci0JCQkJaWYgKGhlYWRlck1hcC5jb250YWluc0tleShoZWFkZXIuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJCWVycm9yKElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9kdXBsaWNhdGVIZWFkZXIsCi0JCQkJCQkJbCArIDEpOwotCQkJCX0KKyAgICAgICAgICAgICAgICBpbnQgY29sb24gPSBsaW5lLmluZGV4T2YoJzonKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sb24gPT0gLTEpIHsgLyogbm8gY29sb24gKi8KKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9ub0NvbG9uLCBsICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nIGhlYWRlck5hbWUgPSBnZXRIZWFkZXJOYW1lKGxpbmUpOworICAgICAgICAgICAgICAgIGlmIChoZWFkZXJOYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9pbnZhbGlkSGVhZGVyTmFtZSwgbCArIDEpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpIDwgY29sb24gKyAyIHx8IGxpbmUuY2hhckF0KGNvbG9uICsgMSkgIT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIEJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfbm9TcGFjZVZhbHVlLCBsICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCJOYW1lIi5lcXVhbHMoaGVhZGVyTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICBlcnJvcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX25hbWVIZWFkZXJJbk1haW4sIGwgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoZWFkZXIgPSBuZXcgQnVuZGxlTWFuaWZlc3RIZWFkZXIodGhpcywgaGVhZGVyTmFtZSwgbGluZS5zdWJzdHJpbmcoY29sb24gKyAyKSwgbCk7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGVhZGVyTWFwLmNvbnRhaW5zS2V5KGhlYWRlci5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX2R1cGxpY2F0ZUhlYWRlciwgbCArIDEpOworICAgICAgICAgICAgICAgIH0KIAotCQkJfQotCQkJaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0JCQkJLy8gbGluZ2VyaW5nIGhlYWRlciwgbGluZSBub3QgdGVybWluYXRlZAotCQkJCWVycm9yKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIEJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfbm9MaW5lVGVybWluYXRpb24sIGwgKyAxKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBJZiB0aGVyZSBpcyBhbnkgbW9yZSBoZWFkZXJzLCBub3Qgc3RhcnRpbmcgd2l0aCBhIE5hbWUgaGVhZGVyCi0JCQkvLyB0aGUgZW1wdHkgbGluZXMgYXJlIGEgbWlzdGFrZSwgcmVwb3J0IGl0LgotCQkJZm9yICg7IGwgPCBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCk7IGwrKykgewotCQkJCUlSZWdpb24gbGluZUluZm8gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24obCk7Ci0JCQkJU3RyaW5nIGxpbmUgPSBkb2N1bWVudC5nZXQobGluZUluZm8uZ2V0T2Zmc2V0KCksIGxpbmVJbmZvLmdldExlbmd0aCgpKTsKLQkJCQlpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoIWxpbmUuc3RhcnRzV2l0aCgiTmFtZToiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWVycm9yKElNYXJrZXIuU0VWRVJJVFlfRVJST1IsIEJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfbm9OYW1lSGVhZGVyLCBsKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBsaW5nZXJpbmcgaGVhZGVyLCBsaW5lIG5vdCB0ZXJtaW5hdGVkCisgICAgICAgICAgICAgICAgZXJyb3IoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9ub0xpbmVUZXJtaW5hdGlvbiwgbCArIDEpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGFueSBtb3JlIGhlYWRlcnMsIG5vdCBzdGFydGluZyB3aXRoIGEgTmFtZSBoZWFkZXIKKyAgICAgICAgICAgIC8vIHRoZSBlbXB0eSBsaW5lcyBhcmUgYSBtaXN0YWtlLCByZXBvcnQgaXQuCisgICAgICAgICAgICBmb3IgKDsgbCA8IGRvY3VtZW50LmdldE51bWJlck9mTGluZXMoKTsgbCsrKSB7CisgICAgICAgICAgICAgICAgSVJlZ2lvbiBsaW5lSW5mbyA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihsKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGRvY3VtZW50LmdldChsaW5lSW5mby5nZXRPZmZzZXQoKSwgbGluZUluZm8uZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKCJOYW1lOiIpKSB7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9ub05hbWVIZWFkZXIsIGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KIAotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBibGUpIHsKLQkJfQotCX0KKyAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gYmxlKSB7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdHJlYW1Ub1N0cmluZyhJbnB1dFN0cmVhbSBpcykgewotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHB1YmxpYyBTdHJpbmcgY29udmVydFN0cmVhbVRvU3RyaW5nKElucHV0U3RyZWFtIGlzKSB7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAKLQkJU3RyaW5nIGxpbmUgPSBudWxsOwotCQl0cnkgewotCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQlzYi5hcHBlbmQobGluZSArICJcbiIpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KKyAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQobGluZSArICJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS9tb2RlbC9CdW5kbGVNYW5pZmVzdEhlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL21vZGVsL0J1bmRsZU1hbmlmZXN0SGVhZGVyLmphdmEKaW5kZXggMTIxNWExZS4uMWUwZWRjNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL21vZGVsL0J1bmRsZU1hbmlmZXN0SGVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL21vZGVsL0J1bmRsZU1hbmlmZXN0SGVhZGVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUubW9kZWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMjksOTYgKzMwLDkwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVNYW5pZmVzdEhlYWRlciBleHRlbmRzIEFic3RyYWN0TWFuaWZlc3RFbGVtZW50IHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVU5ETEVfTUFOSUZFU1RfSEVBREVSX1RZUEUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVU5ETEVfTUFOSUZFU1RfSEVBREVSX1RZUEUgPSAxOwogCi0JcHJpdmF0ZSBpbnQgbGluZU51bWJlcjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBsaW5lTnVtYmVyOwogCi0JcHJpdmF0ZSBpbnQgbGluZXM7CisgICAgcHJpdmF0ZSBpbnQgbGluZXM7CiAKLQlwcml2YXRlIEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudFtdIG1hbmlmZXN0RWxlbWVudHM7CisgICAgcHJpdmF0ZSBCdW5kbGVNYW5pZmVzdEhlYWRlckVsZW1lbnRbXSBtYW5pZmVzdEVsZW1lbnRzOwogCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CiAKLQlwcm90ZWN0ZWQgQnVuZGxlTWFuaWZlc3RIZWFkZXIoQnVuZGxlTWFuaWZlc3QgcGFyZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBpbnQgbGluZU51bWJlcikgewotCQlzdXBlcihwYXJlbnQsIG5hbWUpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JCXRoaXMubGluZXMgPSAxOwotCX0KKyAgICBwcm90ZWN0ZWQgQnVuZGxlTWFuaWZlc3RIZWFkZXIoQnVuZGxlTWFuaWZlc3QgcGFyZW50LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBpbnQgbGluZU51bWJlcikgeworICAgICAgICBzdXBlcihwYXJlbnQsIG5hbWUpOworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIHRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7CisgICAgICAgIHRoaXMubGluZXMgPSAxOworICAgIH0KIAotCXB1YmxpYyB2b2lkIGFwcGVuZChTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52YWx1ZSArPSB2YWx1ZTsKLQkJbGluZXMrKzsKLQl9CisgICAgcHVibGljIHZvaWQgYXBwZW5kKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlICs9IHZhbHVlOworICAgICAgICB0aGlzLmxpbmVzKys7CisgICAgfQogCi0JcHVibGljIEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudFtdIGdldEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudHMoKSB7Ci0JCWlmICh0aGlzLm1hbmlmZXN0RWxlbWVudHMgPT0gbnVsbCkgewotCQkJaW5pdCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLm1hbmlmZXN0RWxlbWVudHM7Ci0JfQorICAgIHB1YmxpYyBCdW5kbGVNYW5pZmVzdEhlYWRlckVsZW1lbnRbXSBnZXRCdW5kbGVNYW5pZmVzdEhlYWRlckVsZW1lbnRzKCkgeworICAgICAgICBpZiAodGhpcy5tYW5pZmVzdEVsZW1lbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgIGluaXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5tYW5pZmVzdEVsZW1lbnRzOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBBYnN0cmFjdE1hbmlmZXN0RWxlbWVudFtdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gZ2V0QnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50cygpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWJzdHJhY3RNYW5pZmVzdEVsZW1lbnRbXSBnZXRDaGlsZHJlbigpIHsKKyAgICAgICAgcmV0dXJuIGdldEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudHMoKTsKKyAgICB9CiAKLQlwdWJsaWMgaW50IGdldEVsZW1lbnRUeXBlKCkgewotCQlyZXR1cm4gQlVORExFX01BTklGRVNUX0hFQURFUl9UWVBFOwotCX0KKyAgICBwdWJsaWMgaW50IGdldEVsZW1lbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gQlVORExFX01BTklGRVNUX0hFQURFUl9UWVBFOworICAgIH0KIAotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIGxpbmVOdW1iZXI7Ci0JfQorICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGluZU51bWJlcjsKKyAgICB9CiAKLQlwdWJsaWMgaW50IGdldExpbmVzU3BhbigpIHsKLQkJcmV0dXJuIGxpbmVzOwotCX0KKyAgICBwdWJsaWMgaW50IGdldExpbmVzU3BhbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGluZXM7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlpZiAodGhpcy5tYW5pZmVzdEVsZW1lbnRzID09IG51bGwpIHsKLQkJCWlmIChnZXRWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQl0cnkgeworICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisgICAgICAgIGlmICh0aGlzLm1hbmlmZXN0RWxlbWVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGdldFZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHRyeSB7CiAKLQkJCQkJLy8gTWFrZSBzdXJlIHRoZSBldmVyeSAiIGlzIGNsb3NlZAotCQkJCQlpZiAoU3RyaW5nVXRpbHMuY291bnRNYXRjaGVzKGdldFZhbHVlKCksICJcIiIpICUgMiAhPSAwKSB7Ci0JCQkJCQl0aHJvdyBuZXcgQnVuZGxlRXhjZXB0aW9uKCIiKTsKLQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGV2ZXJ5ICIgaXMgY2xvc2VkCisgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5jb3VudE1hdGNoZXMoZ2V0VmFsdWUoKSwgIlwiIikgJSAyICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdW5kbGVFeGNlcHRpb24oIiIpOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJTGlzdDxCdW5kbGVNYW5pZmVzdEhlYWRlckVsZW1lbnQ+IGhlYWRlckVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxCdW5kbGVNYW5pZmVzdEhlYWRlckVsZW1lbnQ+KCk7Ci0JCQkJCU1hbmlmZXN0RWxlbWVudFtdIGVsZW1lbnRzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlSGVhZGVyKGdldE5hbWUoKSwgZ2V0VmFsdWUoKSk7Ci0JCQkJCWZvciAoTWFuaWZlc3RFbGVtZW50IGVsZW1lbnQgOiBlbGVtZW50cykgewotCQkJCQkJaGVhZGVyRWxlbWVudHMuYWRkKG5ldyBCdW5kbGVNYW5pZmVzdEhlYWRlckVsZW1lbnQodGhpcywgZWxlbWVudCkpOwotCQkJCQl9Ci0JCQkJCXRoaXMubWFuaWZlc3RFbGVtZW50cyA9IGhlYWRlckVsZW1lbnRzLnRvQXJyYXkobmV3IEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudFtoZWFkZXJFbGVtZW50cy5zaXplKCldKTsKLQkJCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX3BhcnNlSGVhZGVyLCBnZXROYW1lKCkpOwotCQkJCQkoKEJ1bmRsZU1hbmlmZXN0KSBnZXRQYXJlbnQoKSkuZXJyb3IoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgbWVzc2FnZSwgZ2V0TGluZU51bWJlcigpICsgMSk7Ci0JCQkJCXRoaXMubWFuaWZlc3RFbGVtZW50cyA9IG5ldyBCdW5kbGVNYW5pZmVzdEhlYWRlckVsZW1lbnRbMF07Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLm1hbmlmZXN0RWxlbWVudHMgPSBuZXcgQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50WzBdOwotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgICAgICAgICBMaXN0PEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudD4gaGVhZGVyRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudD4oKTsKKyAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3RFbGVtZW50W10gZWxlbWVudHMgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VIZWFkZXIoZ2V0TmFtZSgpLCBnZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCA6IGVsZW1lbnRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJFbGVtZW50cy5hZGQobmV3IEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudCh0aGlzLCBlbGVtZW50KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5pZmVzdEVsZW1lbnRzID0gaGVhZGVyRWxlbWVudHMudG9BcnJheShuZXcgQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50W2hlYWRlckVsZW1lbnRzLnNpemUoKV0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKEJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfcGFyc2VIZWFkZXIsIGdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICgoQnVuZGxlTWFuaWZlc3QpIGdldFBhcmVudCgpKS5lcnJvcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBtZXNzYWdlLCBnZXRMaW5lTnVtYmVyKCkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5pZmVzdEVsZW1lbnRzID0gbmV3IEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudFswXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMubWFuaWZlc3RFbGVtZW50cyA9IG5ldyBCdW5kbGVNYW5pZmVzdEhlYWRlckVsZW1lbnRbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlidWlsZGVyLmFwcGVuZCgiWyIpCi0JCQkJLmFwcGVuZChsaW5lTnVtYmVyKQotCQkJCS5hcHBlbmQoIl0gIikKLQkJCQkuYXBwZW5kKGdldE5hbWUoKSkKLQkJCQkuYXBwZW5kKCIgPCIpCi0JCQkJLmFwcGVuZChsaW5lcykKLQkJCQkuYXBwZW5kKCI+IDpcbiIpOwotCQlmb3IgKEFic3RyYWN0TWFuaWZlc3RFbGVtZW50IGVsZW1lbnQgOiBnZXRDaGlsZHJlbigpKSB7Ci0JCQlidWlsZGVyLmFwcGVuZCgiICAgIikuYXBwZW5kKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIlsiKS5hcHBlbmQodGhpcy5saW5lTnVtYmVyKS5hcHBlbmQoIl0gIikuYXBwZW5kKGdldE5hbWUoKSkuYXBwZW5kKCIgPCIpLmFwcGVuZCh0aGlzLmxpbmVzKS5hcHBlbmQoIj4gOlxuIik7CisgICAgICAgIGZvciAoQWJzdHJhY3RNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCA6IGdldENoaWxkcmVuKCkpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgICAiKS5hcHBlbmQoZWxlbWVudC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS9tb2RlbC9CdW5kbGVNYW5pZmVzdEhlYWRlckVsZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS9tb2RlbC9CdW5kbGVNYW5pZmVzdEhlYWRlckVsZW1lbnQuamF2YQppbmRleCA1MGQzNTYwLi5kZDAxZDM0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvbW9kZWwvQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL21vZGVsL0J1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLm1vZGVsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKQEAgLTIxLDI2ICsyMiwyNiBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RNYW5pZmVzdEVsZW1lbnQgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVTkRMRV9NQU5JRkVTVF9IRUFERVJfRUxFTUVOVF9UWVBFID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVORExFX01BTklGRVNUX0hFQURFUl9FTEVNRU5UX1RZUEUgPSAyOwogCi0JcHJpdmF0ZSBNYW5pZmVzdEVsZW1lbnQgbWFuaWZlc3RFbGVtZW50OworICAgIHByaXZhdGUgZmluYWwgTWFuaWZlc3RFbGVtZW50IG1hbmlmZXN0RWxlbWVudDsKIAotCXB1YmxpYyBCdW5kbGVNYW5pZmVzdEhlYWRlckVsZW1lbnQoQnVuZGxlTWFuaWZlc3RIZWFkZXIgcGFyZW50LCBNYW5pZmVzdEVsZW1lbnQgbWFuaWZlc3RFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgbWFuaWZlc3RFbGVtZW50LnRvU3RyaW5nKCkpOwotCQl0aGlzLm1hbmlmZXN0RWxlbWVudCA9IG1hbmlmZXN0RWxlbWVudDsKLQl9CisgICAgcHVibGljIEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudChCdW5kbGVNYW5pZmVzdEhlYWRlciBwYXJlbnQsIE1hbmlmZXN0RWxlbWVudCBtYW5pZmVzdEVsZW1lbnQpIHsKKyAgICAgICAgc3VwZXIocGFyZW50LCBtYW5pZmVzdEVsZW1lbnQudG9TdHJpbmcoKSk7CisgICAgICAgIHRoaXMubWFuaWZlc3RFbGVtZW50ID0gbWFuaWZlc3RFbGVtZW50OworICAgIH0KIAotCXB1YmxpYyBpbnQgZ2V0RWxlbWVudFR5cGUoKSB7Ci0JCXJldHVybiBCVU5ETEVfTUFOSUZFU1RfSEVBREVSX0VMRU1FTlRfVFlQRTsKLQl9CisgICAgcHVibGljIGludCBnZXRFbGVtZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEJVTkRMRV9NQU5JRkVTVF9IRUFERVJfRUxFTUVOVF9UWVBFOworICAgIH0KIAotCXB1YmxpYyBNYW5pZmVzdEVsZW1lbnQgZ2V0TWFuaWZlc3RFbGVtZW50KCkgewotCQlyZXR1cm4gbWFuaWZlc3RFbGVtZW50OwotCX0KKyAgICBwdWJsaWMgTWFuaWZlc3RFbGVtZW50IGdldE1hbmlmZXN0RWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWFuaWZlc3RFbGVtZW50OworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQnVpbGRlcigpLmFwcGVuZChtYW5pZmVzdEVsZW1lbnQuZ2V0VmFsdWUoKSkudG9TdHJpbmcoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKHRoaXMubWFuaWZlc3RFbGVtZW50LmdldFZhbHVlKCkpLnRvU3RyaW5nKCk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9CdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9CdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0LmphdmEKaW5kZXggZjkwZjMwOC4uNzA2NzEzOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL0J1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQuamF2YQpAQCAtMSw0ICsxLDQgQEAKLS8vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAvLyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNvbiBvZiBWTXdhcmUsIEluYy4KIC8vICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogLy8gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKQEAgLTYsMTUwICs2LDE1MSBAQAogLy8gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogLy8gKgogLy8gKiBDb250cmlidXRvcnM6Ci0vLyAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisvLyAqIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vL3BhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbjsKKy8vIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbjsKIC8vCi0vL2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotLy9pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLS8vaW1wb3J0IGphdmEudXRpbC5MaXN0OworLy8gaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisvLyBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKy8vIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIC8vCiAvLwogLy8KLS8vLyoqCisvLy8gKioKIC8vICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAvLyAqIEBzaW5jZSAxLjAuMAogLy8gKi8KLS8vLyoqCisvLy8gKioKIC8vICogVE9ETyBDRCBhZGQgY29tbWVudHMKIC8vICovCi0vL3B1YmxpYyBjbGFzcyBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0aW9uQ29udGV4dCB7CisvLyBwdWJsaWMgY2xhc3MgQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBleHRlbmRzIEFic3RyYWN0VmFsaWRhdGlvbkNvbnRleHQgewogLy8KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQk9PTEVBTl9WQUxVRVMgPSBuZXcgU3RyaW5nW10geyAidHJ1ZSIsICJmYWxzZSIgfTsKKy8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQk9PTEVBTl9WQUxVRVMgPSBuZXcgU3RyaW5nW10geyAidHJ1ZSIsICJmYWxzZSIgfTsKIC8vCi0vLwlwdWJsaWMgQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dChJUmVzb3VyY2VNb2RlbEVsZW1lbnQgcm9vdEVsZW1lbnQsCi0vLwkJCUlSZXNvdXJjZU1vZGVsRWxlbWVudCBjb250ZXh0RWxlbWVudCkgewotLy8JCXN1cGVyKHJvb3RFbGVtZW50LCBjb250ZXh0RWxlbWVudCk7Ci0vLwl9CisvLyBwdWJsaWMgQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dChJUmVzb3VyY2VNb2RlbEVsZW1lbnQgcm9vdEVsZW1lbnQsCisvLyBJUmVzb3VyY2VNb2RlbEVsZW1lbnQgY29udGV4dEVsZW1lbnQpIHsKKy8vIHN1cGVyKHJvb3RFbGVtZW50LCBjb250ZXh0RWxlbWVudCk7CisvLyB9CiAvLwotLy8JcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIHByb2JsZW1JZCwgU3RyaW5nIG1zZywgaW50IGxpbmUsIFZhbGlkYXRpb25Qcm9ibGVtQXR0cmlidXRlLi4uIGF0dHJpYnV0ZXMpIHsKLS8vCQllcnJvcihnZXRSb290RWxlbWVudCgpLCBwcm9ibGVtSWQsIG1zZywgbWVyZ2VBdHRyaWJ1dGVzKGxpbmUsIGF0dHJpYnV0ZXMpKTsKLS8vCX0KKy8vIHB1YmxpYyB2b2lkIGVycm9yKFN0cmluZyBwcm9ibGVtSWQsIFN0cmluZyBtc2csIGludCBsaW5lLCBWYWxpZGF0aW9uUHJvYmxlbUF0dHJpYnV0ZS4uLiBhdHRyaWJ1dGVzKSB7CisvLyBlcnJvcihnZXRSb290RWxlbWVudCgpLCBwcm9ibGVtSWQsIG1zZywgbWVyZ2VBdHRyaWJ1dGVzKGxpbmUsIGF0dHJpYnV0ZXMpKTsKKy8vIH0KIC8vCi0vLwlwdWJsaWMgdm9pZCBlcnJvcklsbGVnYWxBdHRyaWJ1dGVWYWx1ZShCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsIE1hbmlmZXN0RWxlbWVudCBlbGVtZW50LAotLy8JCQlTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLS8vCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9hdHRfdmFsdWUsCi0vLwkJCQkobmV3IFN0cmluZ1tdIHsgdmFsdWUsIGtleSB9KSk7Ci0vLwkJZXJyb3IoZ2V0Um9vdEVsZW1lbnQoKSwgIklMTEVHQUxfQVRUUklCVVRFX1ZBTFVFIiwgbXNnLCBuZXcgVmFsaWRhdGlvblByb2JsZW1BdHRyaWJ1dGUoCi0vLwkJCQlJTWFya2VyLkxJTkVfTlVNQkVSLCBCdW5kbGVNYW5pZmVzdFV0aWxzLmdldExpbmVOdW1iZXIoZ2V0RG9jdW1lbnQoKSwgaGVhZGVyLCBrZXkKLS8vCQkJCQkJKyAiPSIpKSk7Ci0vLwl9CisvLyBwdWJsaWMgdm9pZCBlcnJvcklsbGVnYWxBdHRyaWJ1dGVWYWx1ZShCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsIE1hbmlmZXN0RWxlbWVudCBlbGVtZW50LAorLy8gU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisvLyBTdHJpbmcgbXNnID0gTkxTLmJpbmQoQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9hdHRfdmFsdWUsCisvLyAobmV3IFN0cmluZ1tdIHsgdmFsdWUsIGtleSB9KSk7CisvLyBlcnJvcihnZXRSb290RWxlbWVudCgpLCAiSUxMRUdBTF9BVFRSSUJVVEVfVkFMVUUiLCBtc2csIG5ldyBWYWxpZGF0aW9uUHJvYmxlbUF0dHJpYnV0ZSgKKy8vIElNYXJrZXIuTElORV9OVU1CRVIsIEJ1bmRsZU1hbmlmZXN0VXRpbHMuZ2V0TGluZU51bWJlcihnZXREb2N1bWVudCgpLCBoZWFkZXIsIGtleQorLy8gKyAiPSIpKSk7CisvLyB9CiAvLwotLy8JcHVibGljIHZvaWQgZXJyb3JJbGxlZ2FsRGlyZWN0aXZlVmFsdWUoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCwKLS8vCQkJU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0vLwkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfZGlyX3ZhbHVlLAotLy8JCQkJKG5ldyBTdHJpbmdbXSB7IHZhbHVlLCBrZXkgfSkpOwotLy8JCWVycm9yKGdldFJvb3RFbGVtZW50KCksICJJTExFR0FMX0RJUkVDVElWRV9WQUxVRSIsIG1zZywgbmV3IFZhbGlkYXRpb25Qcm9ibGVtQXR0cmlidXRlKAotLy8JCQkJSU1hcmtlci5MSU5FX05VTUJFUiwgQnVuZGxlTWFuaWZlc3RVdGlscy5nZXRMaW5lTnVtYmVyKGdldERvY3VtZW50KCksIGhlYWRlciwga2V5Ci0vLwkJCQkJCSsgIjo9IikpKTsKLS8vCX0KKy8vIHB1YmxpYyB2b2lkIGVycm9ySWxsZWdhbERpcmVjdGl2ZVZhbHVlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgTWFuaWZlc3RFbGVtZW50IGVsZW1lbnQsCisvLyBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKy8vIFN0cmluZyBtc2cgPSBOTFMuYmluZChCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX2Rpcl92YWx1ZSwKKy8vIChuZXcgU3RyaW5nW10geyB2YWx1ZSwga2V5IH0pKTsKKy8vIGVycm9yKGdldFJvb3RFbGVtZW50KCksICJJTExFR0FMX0RJUkVDVElWRV9WQUxVRSIsIG1zZywgbmV3IFZhbGlkYXRpb25Qcm9ibGVtQXR0cmlidXRlKAorLy8gSU1hcmtlci5MSU5FX05VTUJFUiwgQnVuZGxlTWFuaWZlc3RVdGlscy5nZXRMaW5lTnVtYmVyKGdldERvY3VtZW50KCksIGhlYWRlciwga2V5CisvLyArICI6PSIpKSk7CisvLyB9CiAvLwotLy8JcHVibGljIHZvaWQgZXJyb3JJbGxlZ2FsVmFsdWUoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGlsbGVnYWxWYWx1ZSwgU3RyaW5nIGVycm9ySWQpIHsKLS8vCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9pbGxlZ2FsX3ZhbHVlLCBpbGxlZ2FsVmFsdWUpOwotLy8JCWVycm9yKGdldFJvb3RFbGVtZW50KCksIGVycm9ySWQsIG1zZywgbmV3IFZhbGlkYXRpb25Qcm9ibGVtQXR0cmlidXRlKAotLy8JCQkJSU1hcmtlci5MSU5FX05VTUJFUiwgQnVuZGxlTWFuaWZlc3RVdGlscwotLy8JCQkJCQkuZ2V0TGluZU51bWJlcihnZXREb2N1bWVudCgpLCBoZWFkZXIsIGlsbGVnYWxWYWx1ZSkpKTsKLS8vCX0KKy8vIHB1YmxpYyB2b2lkIGVycm9ySWxsZWdhbFZhbHVlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgTWFuaWZlc3RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBpbGxlZ2FsVmFsdWUsIFN0cmluZworLy8vIGVycm9ySWQpIHsKKy8vIFN0cmluZyBtc2cgPSBOTFMuYmluZChCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX2lsbGVnYWxfdmFsdWUsIGlsbGVnYWxWYWx1ZSk7CisvLyBlcnJvcihnZXRSb290RWxlbWVudCgpLCBlcnJvcklkLCBtc2csIG5ldyBWYWxpZGF0aW9uUHJvYmxlbUF0dHJpYnV0ZSgKKy8vIElNYXJrZXIuTElORV9OVU1CRVIsIEJ1bmRsZU1hbmlmZXN0VXRpbHMKKy8vIC5nZXRMaW5lTnVtYmVyKGdldERvY3VtZW50KCksIGhlYWRlciwgaWxsZWdhbFZhbHVlKSkpOworLy8gfQogLy8KLS8vCXB1YmxpYyBCdW5kbGVNYW5pZmVzdCBnZXRCdW5kbGVNYW5pZmVzdCgpIHsKLS8vCQlyZXR1cm4gKEJ1bmRsZU1hbmlmZXN0KSBnZXRSb290RWxlbWVudCgpOwotLy8JfQorLy8gcHVibGljIEJ1bmRsZU1hbmlmZXN0IGdldEJ1bmRsZU1hbmlmZXN0KCkgeworLy8gcmV0dXJuIChCdW5kbGVNYW5pZmVzdCkgZ2V0Um9vdEVsZW1lbnQoKTsKKy8vIH0KIC8vCi0vLwlwdWJsaWMgdm9pZCBpbmZvKFN0cmluZyBwcm9ibGVtSWQsIFN0cmluZyBtc2csIGludCBsaW5lLCBWYWxpZGF0aW9uUHJvYmxlbUF0dHJpYnV0ZS4uLiBhdHRyaWJ1dGVzKSB7Ci0vLwkJaW5mbyhnZXRSb290RWxlbWVudCgpLCBwcm9ibGVtSWQsIG1zZywgbWVyZ2VBdHRyaWJ1dGVzKGxpbmUsIGF0dHJpYnV0ZXMpKTsKLS8vCX0KKy8vIHB1YmxpYyB2b2lkIGluZm8oU3RyaW5nIHByb2JsZW1JZCwgU3RyaW5nIG1zZywgaW50IGxpbmUsIFZhbGlkYXRpb25Qcm9ibGVtQXR0cmlidXRlLi4uIGF0dHJpYnV0ZXMpIHsKKy8vIGluZm8oZ2V0Um9vdEVsZW1lbnQoKSwgcHJvYmxlbUlkLCBtc2csIG1lcmdlQXR0cmlidXRlcyhsaW5lLCBhdHRyaWJ1dGVzKSk7CisvLyB9CiAvLwotLy8JcHVibGljIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVWYWx1ZShCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsIE1hbmlmZXN0RWxlbWVudCBlbGVtZW50LAotLy8JCQlTdHJpbmcga2V5LCBTdHJpbmdbXSBhbGxvd2VkVmFsdWVzKSB7Ci0vLwkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoa2V5KTsKLS8vCQlpZiAodmFsdWUgPT0gbnVsbCkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsb3dlZFZhbHVlcy5sZW5ndGg7IGkrKykgewotLy8JCQlpZiAoYWxsb3dlZFZhbHVlc1tpXS5lcXVhbHModmFsdWUpKSB7Ci0vLwkJCQlyZXR1cm47Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJZXJyb3JJbGxlZ2FsQXR0cmlidXRlVmFsdWUoaGVhZGVyLCBlbGVtZW50LCBrZXksIHZhbHVlKTsKLS8vCX0KKy8vIHB1YmxpYyB2b2lkIHZhbGlkYXRlQXR0cmlidXRlVmFsdWUoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCwKKy8vIFN0cmluZyBrZXksIFN0cmluZ1tdIGFsbG93ZWRWYWx1ZXMpIHsKKy8vIFN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSk7CisvLyBpZiAodmFsdWUgPT0gbnVsbCkgeworLy8gcmV0dXJuOworLy8gfQorLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxvd2VkVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisvLyBpZiAoYWxsb3dlZFZhbHVlc1tpXS5lcXVhbHModmFsdWUpKSB7CisvLyByZXR1cm47CisvLyB9CisvLyB9CisvLyBlcnJvcklsbGVnYWxBdHRyaWJ1dGVWYWx1ZShoZWFkZXIsIGVsZW1lbnQsIGtleSwgdmFsdWUpOworLy8gfQogLy8KLS8vCXB1YmxpYyB2b2lkIHZhbGlkYXRlQm9vbGVhbkF0dHJpYnV0ZVZhbHVlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgTWFuaWZlc3RFbGVtZW50IGVsZW1lbnQsCi0vLwkJCVN0cmluZyBrZXkpIHsKLS8vCQl2YWxpZGF0ZUF0dHJpYnV0ZVZhbHVlKGhlYWRlciwgZWxlbWVudCwga2V5LCBCT09MRUFOX1ZBTFVFUyk7Ci0vLwl9CisvLyBwdWJsaWMgdm9pZCB2YWxpZGF0ZUJvb2xlYW5BdHRyaWJ1dGVWYWx1ZShCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsIE1hbmlmZXN0RWxlbWVudCBlbGVtZW50LAorLy8gU3RyaW5nIGtleSkgeworLy8gdmFsaWRhdGVBdHRyaWJ1dGVWYWx1ZShoZWFkZXIsIGVsZW1lbnQsIGtleSwgQk9PTEVBTl9WQUxVRVMpOworLy8gfQogLy8KLS8vCXB1YmxpYyB2b2lkIHZhbGlkYXRlQm9vbGVhbkRpcmVjdGl2ZVZhbHVlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgTWFuaWZlc3RFbGVtZW50IGVsZW1lbnQsCi0vLwkJCVN0cmluZyBrZXkpIHsKLS8vCQl2YWxpZGF0ZURpcmVjdGl2ZVZhbHVlKGhlYWRlciwgZWxlbWVudCwga2V5LCBCT09MRUFOX1ZBTFVFUyk7Ci0vLwl9CisvLyBwdWJsaWMgdm9pZCB2YWxpZGF0ZUJvb2xlYW5EaXJlY3RpdmVWYWx1ZShCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsIE1hbmlmZXN0RWxlbWVudCBlbGVtZW50LAorLy8gU3RyaW5nIGtleSkgeworLy8gdmFsaWRhdGVEaXJlY3RpdmVWYWx1ZShoZWFkZXIsIGVsZW1lbnQsIGtleSwgQk9PTEVBTl9WQUxVRVMpOworLy8gfQogLy8KLS8vCXB1YmxpYyB2b2lkIHZhbGlkYXRlQm9vbGVhblZhbHVlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlcikgewotLy8JCXZhbGlkYXRlSGVhZGVyVmFsdWUoaGVhZGVyLCBCT09MRUFOX1ZBTFVFUywgIklMTEVHQUxfVkFMVUUiKTsKLS8vCX0KKy8vIHB1YmxpYyB2b2lkIHZhbGlkYXRlQm9vbGVhblZhbHVlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlcikgeworLy8gdmFsaWRhdGVIZWFkZXJWYWx1ZShoZWFkZXIsIEJPT0xFQU5fVkFMVUVTLCAiSUxMRUdBTF9WQUxVRSIpOworLy8gfQogLy8KLS8vCXB1YmxpYyB2b2lkIHZhbGlkYXRlRGlyZWN0aXZlVmFsdWUoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCwKLS8vCQkJU3RyaW5nIGtleSwgU3RyaW5nW10gYWxsb3dlZFZhbHVlcykgewotLy8JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0RGlyZWN0aXZlKGtleSk7Ci0vLwkJaWYgKHZhbHVlID09IG51bGwpIHsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbG93ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJaWYgKGFsbG93ZWRWYWx1ZXNbaV0uZXF1YWxzKHZhbHVlKSkgewotLy8JCQkJcmV0dXJuOwotLy8JCQl9Ci0vLwkJfQotLy8JCWVycm9ySWxsZWdhbERpcmVjdGl2ZVZhbHVlKGhlYWRlciwgZWxlbWVudCwga2V5LCB2YWx1ZSk7Ci0vLwl9CisvLyBwdWJsaWMgdm9pZCB2YWxpZGF0ZURpcmVjdGl2ZVZhbHVlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgTWFuaWZlc3RFbGVtZW50IGVsZW1lbnQsCisvLyBTdHJpbmcga2V5LCBTdHJpbmdbXSBhbGxvd2VkVmFsdWVzKSB7CisvLyBTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldERpcmVjdGl2ZShrZXkpOworLy8gaWYgKHZhbHVlID09IG51bGwpIHsKKy8vIHJldHVybjsKKy8vIH0KKy8vIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsb3dlZFZhbHVlcy5sZW5ndGg7IGkrKykgeworLy8gaWYgKGFsbG93ZWRWYWx1ZXNbaV0uZXF1YWxzKHZhbHVlKSkgeworLy8gcmV0dXJuOworLy8gfQorLy8gfQorLy8gZXJyb3JJbGxlZ2FsRGlyZWN0aXZlVmFsdWUoaGVhZGVyLCBlbGVtZW50LCBrZXksIHZhbHVlKTsKKy8vIH0KIC8vCi0vLwlwdWJsaWMgdm9pZCB2YWxpZGF0ZUhlYWRlclZhbHVlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgU3RyaW5nW10gYWxsb3dlZFZhbHVlcywgU3RyaW5nIGVycm9ySWQpIHsKLS8vCQlCdW5kbGVNYW5pZmVzdEhlYWRlckVsZW1lbnRbXSBlbGVtZW50cyA9IGhlYWRlci5nZXRCdW5kbGVNYW5pZmVzdEhlYWRlckVsZW1lbnRzKCk7Ci0vLwkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgewotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbG93ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCWlmIChhbGxvd2VkVmFsdWVzW2ldLmVxdWFscyhlbGVtZW50c1swXS5nZXRNYW5pZmVzdEVsZW1lbnQoKS5nZXRWYWx1ZSgpKSkgewotLy8JCQkJCXJldHVybjsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQllcnJvcklsbGVnYWxWYWx1ZShoZWFkZXIsIGVsZW1lbnRzWzBdLmdldE1hbmlmZXN0RWxlbWVudCgpLCBlbGVtZW50c1swXQotLy8JCQkJCS5nZXRNYW5pZmVzdEVsZW1lbnQoKS5nZXRWYWx1ZSgpLCBlcnJvcklkKTsKLS8vCQl9Ci0vLwl9CisvLyBwdWJsaWMgdm9pZCB2YWxpZGF0ZUhlYWRlclZhbHVlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgU3RyaW5nW10gYWxsb3dlZFZhbHVlcywgU3RyaW5nIGVycm9ySWQpIHsKKy8vIEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudFtdIGVsZW1lbnRzID0gaGVhZGVyLmdldEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudHMoKTsKKy8vIGlmIChlbGVtZW50cyAhPSBudWxsICYmIGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKKy8vIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsb3dlZFZhbHVlcy5sZW5ndGg7IGkrKykgeworLy8gaWYgKGFsbG93ZWRWYWx1ZXNbaV0uZXF1YWxzKGVsZW1lbnRzWzBdLmdldE1hbmlmZXN0RWxlbWVudCgpLmdldFZhbHVlKCkpKSB7CisvLyByZXR1cm47CisvLyB9CisvLyB9CisvLyBlcnJvcklsbGVnYWxWYWx1ZShoZWFkZXIsIGVsZW1lbnRzWzBdLmdldE1hbmlmZXN0RWxlbWVudCgpLCBlbGVtZW50c1swXQorLy8gLmdldE1hbmlmZXN0RWxlbWVudCgpLmdldFZhbHVlKCksIGVycm9ySWQpOworLy8gfQorLy8gfQogLy8KLS8vCXB1YmxpYyBCdW5kbGVNYW5pZmVzdEhlYWRlciB2YWxpZGF0ZVJlcXVpcmVkSGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgbWlzc2luZ1JlcXVpcmVkSGVhZGVyRXJyb3JJZCkgewotLy8JCUJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciA9IGdldEJ1bmRsZU1hbmlmZXN0KCkuZ2V0SGVhZGVyKG5hbWUpOwotLy8JCWlmIChoZWFkZXIgPT0gbnVsbCkgewotLy8JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9oZWFkZXJNaXNzaW5nLAotLy8JCQkJCW5hbWUpOwotLy8JCQllcnJvcihnZXRSb290RWxlbWVudCgpLCBtaXNzaW5nUmVxdWlyZWRIZWFkZXJFcnJvcklkLCBtc2csIG5ldyBWYWxpZGF0aW9uUHJvYmxlbUF0dHJpYnV0ZSgKLS8vCQkJCQlJTWFya2VyLkxJTkVfTlVNQkVSLCBuZXcgSW50ZWdlcigxKSkpOwotLy8JCX0KLS8vCQlyZXR1cm4gaGVhZGVyOwotLy8JfQorLy8gcHVibGljIEJ1bmRsZU1hbmlmZXN0SGVhZGVyIHZhbGlkYXRlUmVxdWlyZWRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBtaXNzaW5nUmVxdWlyZWRIZWFkZXJFcnJvcklkKSB7CisvLyBCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIgPSBnZXRCdW5kbGVNYW5pZmVzdCgpLmdldEhlYWRlcihuYW1lKTsKKy8vIGlmIChoZWFkZXIgPT0gbnVsbCkgeworLy8gU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfaGVhZGVyTWlzc2luZywKKy8vIG5hbWUpOworLy8gZXJyb3IoZ2V0Um9vdEVsZW1lbnQoKSwgbWlzc2luZ1JlcXVpcmVkSGVhZGVyRXJyb3JJZCwgbXNnLCBuZXcgVmFsaWRhdGlvblByb2JsZW1BdHRyaWJ1dGUoCisvLyBJTWFya2VyLkxJTkVfTlVNQkVSLCBuZXcgSW50ZWdlcigxKSkpOworLy8gfQorLy8gcmV0dXJuIGhlYWRlcjsKKy8vIH0KIC8vCi0vLwlwdWJsaWMgdm9pZCB3YXJuaW5nKFN0cmluZyBwcm9ibGVtSWQsIFN0cmluZyBtc2csIGludCBsaW5lLCBWYWxpZGF0aW9uUHJvYmxlbUF0dHJpYnV0ZS4uLiBhdHRyaWJ1dGVzKSB7Ci0vLwkJd2FybmluZyhnZXRSb290RWxlbWVudCgpLCBwcm9ibGVtSWQsIG1zZywgbWVyZ2VBdHRyaWJ1dGVzKGxpbmUsIGF0dHJpYnV0ZXMpKTsKLS8vCX0KKy8vIHB1YmxpYyB2b2lkIHdhcm5pbmcoU3RyaW5nIHByb2JsZW1JZCwgU3RyaW5nIG1zZywgaW50IGxpbmUsIFZhbGlkYXRpb25Qcm9ibGVtQXR0cmlidXRlLi4uIGF0dHJpYnV0ZXMpIHsKKy8vIHdhcm5pbmcoZ2V0Um9vdEVsZW1lbnQoKSwgcHJvYmxlbUlkLCBtc2csIG1lcmdlQXR0cmlidXRlcyhsaW5lLCBhdHRyaWJ1dGVzKSk7CisvLyB9CiAvLwotLy8JcHJpdmF0ZSBWYWxpZGF0aW9uUHJvYmxlbUF0dHJpYnV0ZVtdIG1lcmdlQXR0cmlidXRlcyhpbnQgbGluZSwgVmFsaWRhdGlvblByb2JsZW1BdHRyaWJ1dGUuLi4gYXR0cmlidXRlcykgewotLy8JCUxpc3Q8VmFsaWRhdGlvblByb2JsZW1BdHRyaWJ1dGU+IGF0dHJpYnV0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFZhbGlkYXRpb25Qcm9ibGVtQXR0cmlidXRlPigpOwotLy8JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwgJiYgYXR0cmlidXRlcy5sZW5ndGggPiAwKSB7Ci0vLwkJCSBhdHRyaWJ1dGVMaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KGF0dHJpYnV0ZXMpKTsKLS8vCQl9Ci0vLwkJYXR0cmlidXRlTGlzdC5hZGQobmV3IFZhbGlkYXRpb25Qcm9ibGVtQXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIGxpbmUpKTsKLS8vCQlyZXR1cm4gYXR0cmlidXRlTGlzdC50b0FycmF5KG5ldyBWYWxpZGF0aW9uUHJvYmxlbUF0dHJpYnV0ZVthdHRyaWJ1dGVMaXN0LnNpemUoKV0pOwotLy8JfQorLy8gcHJpdmF0ZSBWYWxpZGF0aW9uUHJvYmxlbUF0dHJpYnV0ZVtdIG1lcmdlQXR0cmlidXRlcyhpbnQgbGluZSwgVmFsaWRhdGlvblByb2JsZW1BdHRyaWJ1dGUuLi4gYXR0cmlidXRlcykgeworLy8gTGlzdDxWYWxpZGF0aW9uUHJvYmxlbUF0dHJpYnV0ZT4gYXR0cmlidXRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8VmFsaWRhdGlvblByb2JsZW1BdHRyaWJ1dGU+KCk7CisvLyBpZiAoYXR0cmlidXRlcyAhPSBudWxsICYmIGF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgeworLy8gYXR0cmlidXRlTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChhdHRyaWJ1dGVzKSk7CisvLyB9CisvLyBhdHRyaWJ1dGVMaXN0LmFkZChuZXcgVmFsaWRhdGlvblByb2JsZW1BdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUiwgbGluZSkpOworLy8gcmV0dXJuIGF0dHJpYnV0ZUxpc3QudG9BcnJheShuZXcgVmFsaWRhdGlvblByb2JsZW1BdHRyaWJ1dGVbYXR0cmlidXRlTGlzdC5zaXplKCldKTsKKy8vIH0KIC8vCi0vLwlwcml2YXRlIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLS8vCQlyZXR1cm4gZ2V0QnVuZGxlTWFuaWZlc3QoKS5nZXREb2N1bWVudCgpOwotLy8JfQotLy8JCi0vL30KKy8vIHByaXZhdGUgSURvY3VtZW50IGdldERvY3VtZW50KCkgeworLy8gcmV0dXJuIGdldEJ1bmRsZU1hbmlmZXN0KCkuZ2V0RG9jdW1lbnQoKTsKKy8vIH0KKy8vCisvLyB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9CdW5kbGVNYW5pZmVzdFZhbGlkYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vQnVuZGxlTWFuaWZlc3RWYWxpZGF0b3IuamF2YQppbmRleCBlNDJhYjYxLi5kYzdiMWZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9CdW5kbGVNYW5pZmVzdFZhbGlkYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL0J1bmRsZU1hbmlmZXN0VmFsaWRhdG9yLmphdmEKQEAgLTEsNCArMSw0IEBACi0vLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogLy8gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgU3ByaW5nU291cmNlLCBhIGRpdmlzb24gb2YgVk13YXJlLCBJbmMuCiAvLyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKIC8vICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCkBAIC02LDEwMCArNiwxMDAgQEAKIC8vICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKIC8vICoKIC8vICogQ29udHJpYnV0b3JzOgotLy8gKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorLy8gKiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy9wYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb247CisvLyBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb247CiAvLwogLy8KIC8vCi0vLy8qKgorLy8vICoqCiAvLyAqIHtAbGluayBBYnN0cmFjdFZhbGlkYXRvcn0gdGhhdCBoYW5kbGVzIHZhbGlkYXRpb24gb2YgTUFOSUZFU1QuTUYuCiAvLyAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogLy8gKiBAc2luY2UgMS4wLjAKIC8vICovCi0vL3B1YmxpYyBjbGFzcyBCdW5kbGVNYW5pZmVzdFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yIHsKKy8vIHB1YmxpYyBjbGFzcyBCdW5kbGVNYW5pZmVzdFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yIHsKIC8vCi0vLwkvKioKLS8vCSAqIHtAaW5oZXJpdERvY30KLS8vCSAqLwotLy8JcHVibGljIFNldDxJUmVzb3VyY2U+IGRlcml2ZVJlc291cmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0vLwl9CisvLyAvKioKKy8vICoge0Bpbmhlcml0RG9jfQorLy8gKi8KKy8vIHB1YmxpYyBTZXQ8SVJlc291cmNlPiBkZXJpdmVSZXNvdXJjZXMoT2JqZWN0IG9iamVjdCkgeworLy8gcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisvLyB9CiAvLwotLy8JLyoqCi0vLwkgKiB7QGluaGVyaXREb2N9Ci0vLwkgKi8KLS8vCXB1YmxpYyBTZXQ8SVJlc291cmNlPiBnZXRBZmZlY3RlZFJlc291cmNlcyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBpbnQgZGVsdGFLaW5kKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHJlc291cmNlLmdldFByb2plY3QoKSk7Ci0vLwkJSVJlc291cmNlIGJ1bmRsZU1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RVdGlscy5sb2NhdGVNYW5pZmVzdChqYXZhUHJvamVjdCwgZmFsc2UpOwotLy8JCVNldDxJUmVzb3VyY2U+IHJlc291cmNlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PElSZXNvdXJjZT4oKTsKLS8vCQlpZiAoKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KHJlc291cmNlKSAmJiByZXNvdXJjZS5lcXVhbHMoYnVuZGxlTWFuaWZlc3QpKQotLy8JCQkJfHwgKEZhY2V0VXRpbHMuaXNQYXJQcm9qZWN0KHJlc291cmNlKSAmJiBTcHJpbmdDb3JlVXRpbHMuaXNNYW5pZmVzdChyZXNvdXJjZSkpKSB7Ci0vLwkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotLy8JCX0KLS8vCQllbHNlIGlmIChGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChyZXNvdXJjZSkKLS8vCQkJCSYmIHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpLmVxdWFscygidGVtcGxhdGUubWYiKSkgewotLy8JCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHJlc291cmNlczsKLS8vCX0KKy8vIC8qKgorLy8gKiB7QGluaGVyaXREb2N9CisvLyAqLworLy8gcHVibGljIFNldDxJUmVzb3VyY2U+IGdldEFmZmVjdGVkUmVzb3VyY2VzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIGludCBkZWx0YUtpbmQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKy8vIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZS5nZXRQcm9qZWN0KCkpOworLy8gSVJlc291cmNlIGJ1bmRsZU1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RVdGlscy5sb2NhdGVNYW5pZmVzdChqYXZhUHJvamVjdCwgZmFsc2UpOworLy8gU2V0PElSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IExpbmtlZEhhc2hTZXQ8SVJlc291cmNlPigpOworLy8gaWYgKChGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChyZXNvdXJjZSkgJiYgcmVzb3VyY2UuZXF1YWxzKGJ1bmRsZU1hbmlmZXN0KSkKKy8vIHx8IChGYWNldFV0aWxzLmlzUGFyUHJvamVjdChyZXNvdXJjZSkgJiYgU3ByaW5nQ29yZVV0aWxzLmlzTWFuaWZlc3QocmVzb3VyY2UpKSkgeworLy8gcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisvLyB9CisvLyBlbHNlIGlmIChGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChyZXNvdXJjZSkKKy8vICYmIHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpLmVxdWFscygidGVtcGxhdGUubWYiKSkgeworLy8gcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisvLyB9CisvLyByZXR1cm4gcmVzb3VyY2VzOworLy8gfQogLy8KLS8vCS8qKgotLy8JICoge0Bpbmhlcml0RG9jfQotLy8JICovCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCBJVmFsaWRhdGlvbkNvbnRleHQgY3JlYXRlQ29udGV4dChJUmVzb3VyY2VNb2RlbEVsZW1lbnQgcm9vdEVsZW1lbnQsIElSZXNvdXJjZU1vZGVsRWxlbWVudCBjb250ZXh0RWxlbWVudCkgewotLy8JCXJldHVybiBuZXcgQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dChyb290RWxlbWVudCwgY29udGV4dEVsZW1lbnQpOwotLy8JfQorLy8gLyoqCisvLyAqIHtAaW5oZXJpdERvY30KKy8vICovCisvLyBAT3ZlcnJpZGUKKy8vIHByb3RlY3RlZCBJVmFsaWRhdGlvbkNvbnRleHQgY3JlYXRlQ29udGV4dChJUmVzb3VyY2VNb2RlbEVsZW1lbnQgcm9vdEVsZW1lbnQsIElSZXNvdXJjZU1vZGVsRWxlbWVudCBjb250ZXh0RWxlbWVudCkgeworLy8gcmV0dXJuIG5ldyBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0KHJvb3RFbGVtZW50LCBjb250ZXh0RWxlbWVudCk7CisvLyB9CiAvLwotLy8JLyoqCi0vLwkgKiB7QGluaGVyaXREb2N9Ci0vLwkgKi8KLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIElWYWxpZGF0aW9uRWxlbWVudExpZmVjeWNsZU1hbmFnZXIgY3JlYXRlVmFsaWRhdGlvbkVsZW1lbnRMaWZlY3ljbGVNYW5hZ2VyKCkgewotLy8JCXJldHVybiBuZXcgQnVuZGxlTWFuaWZlc3RFbGVtZW50TGlmZWN5Y2xlTWFuYWdlcigpOwotLy8JfQorLy8gLyoqCisvLyAqIHtAaW5oZXJpdERvY30KKy8vICovCisvLyBAT3ZlcnJpZGUKKy8vIHByb3RlY3RlZCBJVmFsaWRhdGlvbkVsZW1lbnRMaWZlY3ljbGVNYW5hZ2VyIGNyZWF0ZVZhbGlkYXRpb25FbGVtZW50TGlmZWN5Y2xlTWFuYWdlcigpIHsKKy8vIHJldHVybiBuZXcgQnVuZGxlTWFuaWZlc3RFbGVtZW50TGlmZWN5Y2xlTWFuYWdlcigpOworLy8gfQogLy8KLS8vCS8qKgotLy8JICoge0Bpbmhlcml0RG9jfQotLy8JICovCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzKElNb2RlbEVsZW1lbnQgZWxlbWVudCkgewotLy8JCXJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgQnVuZGxlTWFuaWZlc3QgfHwgZWxlbWVudCBpbnN0YW5jZW9mIEJ1bmRsZU1hbmlmZXN0SGVhZGVyOwotLy8JfQorLy8gLyoqCisvLyAqIHtAaW5oZXJpdERvY30KKy8vICovCisvLyBAT3ZlcnJpZGUKKy8vIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzKElNb2RlbEVsZW1lbnQgZWxlbWVudCkgeworLy8gcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBCdW5kbGVNYW5pZmVzdCB8fCBlbGVtZW50IGluc3RhbmNlb2YgQnVuZGxlTWFuaWZlc3RIZWFkZXI7CisvLyB9CiAvLwotLy8Jc3RhdGljIGNsYXNzIEJ1bmRsZU1hbmlmZXN0RWxlbWVudExpZmVjeWNsZU1hbmFnZXIgaW1wbGVtZW50cyBJVmFsaWRhdGlvbkVsZW1lbnRMaWZlY3ljbGVNYW5hZ2VyIHsKKy8vIHN0YXRpYyBjbGFzcyBCdW5kbGVNYW5pZmVzdEVsZW1lbnRMaWZlY3ljbGVNYW5hZ2VyIGltcGxlbWVudHMgSVZhbGlkYXRpb25FbGVtZW50TGlmZWN5Y2xlTWFuYWdlciB7CiAvLwotLy8JCXByaXZhdGUgSVJlc291cmNlTW9kZWxFbGVtZW50IHJvb3RFbGVtZW50ID0gbnVsbDsKKy8vIHByaXZhdGUgSVJlc291cmNlTW9kZWxFbGVtZW50IHJvb3RFbGVtZW50ID0gbnVsbDsKIC8vCi0vLwkJLyoqCi0vLwkJICoge0Bpbmhlcml0RG9jfQotLy8JCSAqLwotLy8JCXB1YmxpYyB2b2lkIGRlc3RvcnkoKSB7Ci0vLwkJCS8vIG5vdGhpbmcgdG8gZG8KLS8vCQl9CisvLyAvKioKKy8vICoge0Bpbmhlcml0RG9jfQorLy8gKi8KKy8vIHB1YmxpYyB2b2lkIGRlc3RvcnkoKSB7CisvLyAvLyBub3RoaW5nIHRvIGRvCisvLyB9CiAvLwotLy8JCS8qKgotLy8JCSAqIHtAaW5oZXJpdERvY30KLS8vCQkgKi8KLS8vCQlwdWJsaWMgU2V0PElSZXNvdXJjZU1vZGVsRWxlbWVudD4gZ2V0Q29udGV4dEVsZW1lbnRzKCkgewotLy8JCQlTZXQ8SVJlc291cmNlTW9kZWxFbGVtZW50PiBjb250ZXh0RWxlbWVudHMgPSBuZXcgSGFzaFNldDxJUmVzb3VyY2VNb2RlbEVsZW1lbnQ+KCk7Ci0vLwkJCWNvbnRleHRFbGVtZW50cy5hZGQoZ2V0Um9vdEVsZW1lbnQoKSk7Ci0vLwkJCXJldHVybiBjb250ZXh0RWxlbWVudHM7Ci0vLwkJfQorLy8gLyoqCisvLyAqIHtAaW5oZXJpdERvY30KKy8vICovCisvLyBwdWJsaWMgU2V0PElSZXNvdXJjZU1vZGVsRWxlbWVudD4gZ2V0Q29udGV4dEVsZW1lbnRzKCkgeworLy8gU2V0PElSZXNvdXJjZU1vZGVsRWxlbWVudD4gY29udGV4dEVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8SVJlc291cmNlTW9kZWxFbGVtZW50PigpOworLy8gY29udGV4dEVsZW1lbnRzLmFkZChnZXRSb290RWxlbWVudCgpKTsKKy8vIHJldHVybiBjb250ZXh0RWxlbWVudHM7CisvLyB9CiAvLwotLy8JCS8qKgotLy8JCSAqIHtAaW5oZXJpdERvY30KLS8vCQkgKi8KLS8vCQlwdWJsaWMgSVJlc291cmNlTW9kZWxFbGVtZW50IGdldFJvb3RFbGVtZW50KCkgewotLy8JCQlyZXR1cm4gcm9vdEVsZW1lbnQ7Ci0vLwkJfQorLy8gLyoqCisvLyAqIHtAaW5oZXJpdERvY30KKy8vICovCisvLyBwdWJsaWMgSVJlc291cmNlTW9kZWxFbGVtZW50IGdldFJvb3RFbGVtZW50KCkgeworLy8gcmV0dXJuIHJvb3RFbGVtZW50OworLy8gfQogLy8KLS8vCQlwdWJsaWMgdm9pZCBpbml0KElSZXNvdXJjZSByZXNvdXJjZSkgewotLy8JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotLy8JCQkJcm9vdEVsZW1lbnQgPSBuZXcgQnVuZGxlTWFuaWZlc3QoKElGaWxlKSByZXNvdXJjZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9CisvLyBwdWJsaWMgdm9pZCBpbml0KElSZXNvdXJjZSByZXNvdXJjZSkgeworLy8gaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKKy8vIHJvb3RFbGVtZW50ID0gbmV3IEJ1bmRsZU1hbmlmZXN0KChJRmlsZSkgcmVzb3VyY2UpOworLy8gfQorLy8gfQorLy8gfQogLy8KLS8vfQorLy8gfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQWJzdHJhY3RBcHBsaWNhdGlvbk1hbmlmZXN0SGVhZGVyUnVsZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQWJzdHJhY3RBcHBsaWNhdGlvbk1hbmlmZXN0SGVhZGVyUnVsZS5qYXZhCmluZGV4IDY5MGU0ZGIuLmZiMzQ1ZDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0Fic3RyYWN0QXBwbGljYXRpb25NYW5pZmVzdEhlYWRlclJ1bGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9BYnN0cmFjdEFwcGxpY2F0aW9uTWFuaWZlc3RIZWFkZXJSdWxlLmphdmEKQEAgLTEsNCArMSw0IEBACi0vLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogLy8gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgU3ByaW5nU291cmNlLCBhIGRpdmlzb24gb2YgVk13YXJlLCBJbmMuCiAvLyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKIC8vICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCkBAIC02LDI2ICs2LDI2IEBACiAvLyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAvLyAqCiAvLyAqIENvbnRyaWJ1dG9yczoKLS8vICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKy8vICogU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLnJ1bGVzOworLy8gcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLnJ1bGVzOwogLy8KLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlLkZhY2V0VXRpbHM7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLkJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQ7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUuRmFjZXRVdGlsczsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLkJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQ7CiAvLwogLy8KLS8vLyoqCisvLy8gKioKIC8vICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAvLyAqIEBzaW5jZSAxLjAuMAogLy8gKi8KLS8vLyoqCisvLy8gKioKIC8vICogVE9ETyBDRCBhZGQgY29tbWVudHMKIC8vICovCi0vL3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFwcGxpY2F0aW9uTWFuaWZlc3RIZWFkZXJSdWxlIGV4dGVuZHMgQWJzdHJhY3RNYW5pZmVzdEhlYWRlclJ1bGUgeworLy8gcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXBwbGljYXRpb25NYW5pZmVzdEhlYWRlclJ1bGUgZXh0ZW5kcyBBYnN0cmFjdE1hbmlmZXN0SGVhZGVyUnVsZSB7CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NvbnRleHQoQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0vLwkJcmV0dXJuIEZhY2V0VXRpbHMuaXNQYXJQcm9qZWN0KGNvbnRleHQuZ2V0Um9vdEVsZW1lbnQoKS5nZXRFbGVtZW50UmVzb3VyY2UoKSk7Ci0vLwl9CisvLyBAT3ZlcnJpZGUKKy8vIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzQ29udGV4dChCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKy8vIHJldHVybiBGYWNldFV0aWxzLmlzUGFyUHJvamVjdChjb250ZXh0LmdldFJvb3RFbGVtZW50KCkuZ2V0RWxlbWVudFJlc291cmNlKCkpOworLy8gfQogLy8KLS8vfQorLy8gfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQWJzdHJhY3RCdW5kbGVNYW5pZmVzdEhlYWRlclJ1bGUuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0Fic3RyYWN0QnVuZGxlTWFuaWZlc3RIZWFkZXJSdWxlLmphdmEKaW5kZXggMDNhNWYwMS4uYjI2YzY5MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQWJzdHJhY3RCdW5kbGVNYW5pZmVzdEhlYWRlclJ1bGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9BYnN0cmFjdEJ1bmRsZU1hbmlmZXN0SGVhZGVyUnVsZS5qYXZhCkBAIC0xLDQgKzEsNCBAQAotLy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIC8vICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIFNwcmluZ1NvdXJjZSwgYSBkaXZpc29uIG9mIFZNd2FyZSwgSW5jLgogLy8gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAvLyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMApAQCAtNiwzOCArNiwzOCBAQAogLy8gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogLy8gKgogLy8gKiBDb250cmlidXRvcnM6Ci0vLyAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisvLyAqIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vL3BhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5ydWxlczsKKy8vIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5ydWxlczsKIC8vCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlLkZhY2V0VXRpbHM7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS5CdW5kbGVNYW5pZmVzdFV0aWxzOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5CdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0OwotLy9pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworLy8gaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUuZmFjZXQuY29yZS5GYWNldFV0aWxzOworLy8gaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLkJ1bmRsZU1hbmlmZXN0VXRpbHM7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5CdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0OworLy8gaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwogLy8KIC8vCi0vLy8qKgorLy8vICoqCiAvLyAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogLy8gKiBAc2luY2UgMS4wLjAKIC8vICovCi0vLy8qKgorLy8vICoqCiAvLyAqIFRPRE8gQ0QgYWRkIGNvbW1lbnRzCiAvLyAqLwotLy9wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCdW5kbGVNYW5pZmVzdEhlYWRlclJ1bGUgZXh0ZW5kcyBBYnN0cmFjdE1hbmlmZXN0SGVhZGVyUnVsZSB7CisvLyBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCdW5kbGVNYW5pZmVzdEhlYWRlclJ1bGUgZXh0ZW5kcyBBYnN0cmFjdE1hbmlmZXN0SGVhZGVyUnVsZSB7CiAvLwotLy8JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWZXJzaW9uIE1BWF9WRVJTSU9OID0gbmV3IFZlcnNpb24oSW50ZWdlci5NQVhfVkFMVUUsIAotLy8JCQlJbnRlZ2VyLk1BWF9WQUxVRSwgSW50ZWdlci5NQVhfVkFMVUUpOworLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWZXJzaW9uIE1BWF9WRVJTSU9OID0gbmV3IFZlcnNpb24oSW50ZWdlci5NQVhfVkFMVUUsCisvLyBJbnRlZ2VyLk1BWF9WQUxVRSwgSW50ZWdlci5NQVhfVkFMVUUpOwogLy8KLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDb250ZXh0KEJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgewotLy8JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGNvbnRleHQuZ2V0Um9vdEVsZW1lbnQoKS5nZXRFbGVtZW50UmVzb3VyY2UoKTsKLS8vCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLS8vCQkKLS8vCQlyZXR1cm4gRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QoY29udGV4dC5nZXRSb290RWxlbWVudCgpLmdldEVsZW1lbnRSZXNvdXJjZSgpKQotLy8JCQkJJiYgKHJlc291cmNlLmVxdWFscyhCdW5kbGVNYW5pZmVzdFV0aWxzLmxvY2F0ZU1hbmlmZXN0KGphdmFQcm9qZWN0LCBmYWxzZSkpIHx8IHJlc291cmNlCi0vLwkJCQkJCS5lcXVhbHMoQnVuZGxlTWFuaWZlc3RVdGlscy5sb2NhdGVNYW5pZmVzdChqYXZhUHJvamVjdCwgdHJ1ZSkpKTsKLS8vCX0KLS8vfQorLy8gQE92ZXJyaWRlCisvLyBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NvbnRleHQoQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisvLyBJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb250ZXh0LmdldFJvb3RFbGVtZW50KCkuZ2V0RWxlbWVudFJlc291cmNlKCk7CisvLyBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKKy8vCisvLyByZXR1cm4gRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QoY29udGV4dC5nZXRSb290RWxlbWVudCgpLmdldEVsZW1lbnRSZXNvdXJjZSgpKQorLy8gJiYgKHJlc291cmNlLmVxdWFscyhCdW5kbGVNYW5pZmVzdFV0aWxzLmxvY2F0ZU1hbmlmZXN0KGphdmFQcm9qZWN0LCBmYWxzZSkpIHx8IHJlc291cmNlCisvLyAuZXF1YWxzKEJ1bmRsZU1hbmlmZXN0VXRpbHMubG9jYXRlTWFuaWZlc3QoamF2YVByb2plY3QsIHRydWUpKSk7CisvLyB9CisvLyB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9BYnN0cmFjdE1hbmlmZXN0SGVhZGVyUnVsZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQWJzdHJhY3RNYW5pZmVzdEhlYWRlclJ1bGUuamF2YQppbmRleCA0NjJlNTFlLi5kOTAzYTcyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9BYnN0cmFjdE1hbmlmZXN0SGVhZGVyUnVsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0Fic3RyYWN0TWFuaWZlc3RIZWFkZXJSdWxlLmphdmEKQEAgLTEsNCArMSw0IEBACi0vLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogLy8gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgU3ByaW5nU291cmNlLCBhIGRpdmlzb24gb2YgVk13YXJlLCBJbmMuCiAvLyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKIC8vICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCkBAIC02LDU5ICs2LDYwIEBACiAvLyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAvLyAqCiAvLyAqIENvbnRyaWJ1dG9yczoKLS8vICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKy8vICogU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLnJ1bGVzOworLy8gcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLnJ1bGVzOwogLy8KIC8vCi0vLy8qKgorLy8vICoqCiAvLyAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogLy8gKiBAc2luY2UgMS4wLjAKIC8vICovCi0vLy8qKgorLy8vICoqCiAvLyAqIFRPRE8gQ0QgYWRkIGNvbW1lbnRzCiAvLyAqLwotLy9wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNYW5pZmVzdEhlYWRlclJ1bGUgaW1wbGVtZW50cwotLy8JCUlWYWxpZGF0aW9uUnVsZTxCdW5kbGVNYW5pZmVzdCwgQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dD4geworLy8gcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFuaWZlc3RIZWFkZXJSdWxlIGltcGxlbWVudHMKKy8vIElWYWxpZGF0aW9uUnVsZTxCdW5kbGVNYW5pZmVzdCwgQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dD4gewogLy8KLS8vCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKElNb2RlbEVsZW1lbnQgZWxlbWVudCwgSVZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLS8vCQlyZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIEJ1bmRsZU1hbmlmZXN0ICYmIGNvbnRleHQgaW5zdGFuY2VvZiBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0Ci0vLwkJCQkmJiAoKEJ1bmRsZU1hbmlmZXN0KSBlbGVtZW50KS5nZXRQcm9ibGVtcygpLnNpemUoKSA9PSAwCi0vLwkJCQkmJiBzdXBwb3J0c0NvbnRleHQoKEJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQpIGNvbnRleHQpOwotLy8JfQorLy8gcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSU1vZGVsRWxlbWVudCBlbGVtZW50LCBJVmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgeworLy8gcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBCdW5kbGVNYW5pZmVzdCAmJiBjb250ZXh0IGluc3RhbmNlb2YgQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dAorLy8gJiYgKChCdW5kbGVNYW5pZmVzdCkgZWxlbWVudCkuZ2V0UHJvYmxlbXMoKS5zaXplKCkgPT0gMAorLy8gJiYgc3VwcG9ydHNDb250ZXh0KChCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0KSBjb250ZXh0KTsKKy8vIH0KIC8vCi0vLwlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZShCdW5kbGVNYW5pZmVzdCBlbGVtZW50LCBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotLy8JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGNvbnRleHQuZ2V0Um9vdEVsZW1lbnQoKS5nZXRFbGVtZW50UmVzb3VyY2UoKTsKKy8vIHB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKEJ1bmRsZU1hbmlmZXN0IGVsZW1lbnQsIEJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQorLy8vIHsKKy8vIElSZXNvdXJjZSByZXNvdXJjZSA9IGNvbnRleHQuZ2V0Um9vdEVsZW1lbnQoKS5nZXRFbGVtZW50UmVzb3VyY2UoKTsKIC8vCi0vLwkJZm9yIChTdHJpbmcgaGVhZGVyTmFtZSA6IGdldEhlYWRlck5hbWUoKSkgewotLy8JCQlCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIgPSBudWxsOwotLy8JCQlpZiAoaXNSZXF1aXJlZEhlYWRlcihyZXNvdXJjZSkpIHsKLS8vCQkJCWhlYWRlciA9IGNvbnRleHQudmFsaWRhdGVSZXF1aXJlZEhlYWRlcihoZWFkZXJOYW1lLCBnZXRNaXNzaW5nUmVxdWlyZWRIZWFkZXJFcnJvcklkKCkpOwotLy8JCQl9Ci0vLwkJCWVsc2UgewotLy8JCQkJaGVhZGVyID0gY29udGV4dC5nZXRCdW5kbGVNYW5pZmVzdCgpLmdldEhlYWRlcihoZWFkZXJOYW1lKTsKLS8vCQkJfQotLy8JCQlpZiAoaGVhZGVyICE9IG51bGwpIHsKLS8vCQkJCXZhbGlkYXRlSGVhZGVyKGhlYWRlciwgY29udGV4dCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9CisvLyBmb3IgKFN0cmluZyBoZWFkZXJOYW1lIDogZ2V0SGVhZGVyTmFtZSgpKSB7CisvLyBCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIgPSBudWxsOworLy8gaWYgKGlzUmVxdWlyZWRIZWFkZXIocmVzb3VyY2UpKSB7CisvLyBoZWFkZXIgPSBjb250ZXh0LnZhbGlkYXRlUmVxdWlyZWRIZWFkZXIoaGVhZGVyTmFtZSwgZ2V0TWlzc2luZ1JlcXVpcmVkSGVhZGVyRXJyb3JJZCgpKTsKKy8vIH0KKy8vIGVsc2UgeworLy8gaGVhZGVyID0gY29udGV4dC5nZXRCdW5kbGVNYW5pZmVzdCgpLmdldEhlYWRlcihoZWFkZXJOYW1lKTsKKy8vIH0KKy8vIGlmIChoZWFkZXIgIT0gbnVsbCkgeworLy8gdmFsaWRhdGVIZWFkZXIoaGVhZGVyLCBjb250ZXh0KTsKKy8vIH0KKy8vIH0KKy8vIH0KIC8vCi0vLwkvKioKLS8vCSAqIEludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgdmFsaWRhdGlvbiBydWxlcyB0byBwcm92aWRlIGEgdW5pcXVlIGVycm9yIGlkIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgbWFya2VyIGluCi0vLwkgKiB0aGUgY2FzZSB0aGF0IHRoZSBoZWFkZXIgaXMgcmVxdWlyZWQgYW5kIG1pc3NpbmcuCi0vLwkgKi8KLS8vCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWlzc2luZ1JlcXVpcmVkSGVhZGVyRXJyb3JJZCgpIHsKLS8vCQlyZXR1cm4gIk1JU1NJTkdfUkVRVUlSRURfSEVBREVSIjsKLS8vCX0KKy8vIC8qKgorLy8gKiBJbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHZhbGlkYXRpb24gcnVsZXMgdG8gcHJvdmlkZSBhIHVuaXF1ZSBlcnJvciBpZCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIG1hcmtlciBpbgorLy8gKiB0aGUgY2FzZSB0aGF0IHRoZSBoZWFkZXIgaXMgcmVxdWlyZWQgYW5kIG1pc3NpbmcuCisvLyAqLworLy8gcHJvdGVjdGVkIFN0cmluZyBnZXRNaXNzaW5nUmVxdWlyZWRIZWFkZXJFcnJvcklkKCkgeworLy8gcmV0dXJuICJNSVNTSU5HX1JFUVVJUkVEX0hFQURFUiI7CisvLyB9CiAvLwotLy8JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGdldEhlYWRlck5hbWUoKTsKKy8vIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmdbXSBnZXRIZWFkZXJOYW1lKCk7CiAvLwotLy8JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1aXJlZEhlYWRlcihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLS8vCQlyZXR1cm4gZmFsc2U7Ci0vLwl9CisvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSGVhZGVyKElSZXNvdXJjZSByZXNvdXJjZSkgeworLy8gcmV0dXJuIGZhbHNlOworLy8gfQogLy8KLS8vCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHN1cHBvcnRzQ29udGV4dChCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpOworLy8gcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNDb250ZXh0KEJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCk7CiAvLwotLy8JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVIZWFkZXIoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpOwotLy99CisvLyBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2YWxpZGF0ZUhlYWRlcihCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsIEJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCk7CisvLyB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9BcHBsaWNhdGlvblN5bWJvbGljTmFtZVJ1bGUuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0FwcGxpY2F0aW9uU3ltYm9saWNOYW1lUnVsZS5qYXZhCmluZGV4IGJjOGZiOTMuLjYwZWY1ZjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0FwcGxpY2F0aW9uU3ltYm9saWNOYW1lUnVsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0FwcGxpY2F0aW9uU3ltYm9saWNOYW1lUnVsZS5qYXZhCkBAIC0xLDQgKzEsNCBAQAotLy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIC8vICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIFNwcmluZ1NvdXJjZSwgYSBkaXZpc29uIG9mIFZNd2FyZSwgSW5jLgogLy8gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAvLyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMApAQCAtNiw1NCArNiw1NCBAQAogLy8gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogLy8gKgogLy8gKiBDb250cmlidXRvcnM6Ci0vLyAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisvLyAqIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vL3BhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5ydWxlczsKKy8vIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5ydWxlczsKIC8vCiAvLwogLy8KLS8vLyoqCisvLy8gKioKIC8vICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAvLyAqIEBzaW5jZSAxLjAuMAogLy8gKi8KLS8vLyoqCisvLy8gKioKIC8vICogVE9ETyBDRCBhZGQgY29tbWVudHMKIC8vICovCi0vL0BTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0vL3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblN5bWJvbGljTmFtZVJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFwcGxpY2F0aW9uTWFuaWZlc3RIZWFkZXJSdWxlIHsKKy8vIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCisvLyBwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25TeW1ib2xpY05hbWVSdWxlIGV4dGVuZHMgQWJzdHJhY3RBcHBsaWNhdGlvbk1hbmlmZXN0SGVhZGVyUnVsZSB7CiAvLwotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQVBQTElDQVRJT05fU1lNQk9MSUNfTkFNRV9NQU5JRkVTVF9IRUFERVIgPSAKLS8vCQluZXcgU3RyaW5nW10geyAiQXBwbGljYXRpb24tU3ltYm9saWNOYW1lIiB9OworLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQVBQTElDQVRJT05fU1lNQk9MSUNfTkFNRV9NQU5JRkVTVF9IRUFERVIgPQorLy8gbmV3IFN0cmluZ1tdIHsgIkFwcGxpY2F0aW9uLVN5bWJvbGljTmFtZSIgfTsKIC8vCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRIZWFkZXJOYW1lKCkgewotLy8JCXJldHVybiBBUFBMSUNBVElPTl9TWU1CT0xJQ19OQU1FX01BTklGRVNUX0hFQURFUjsKLS8vCX0KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIFN0cmluZ1tdIGdldEhlYWRlck5hbWUoKSB7CisvLyByZXR1cm4gQVBQTElDQVRJT05fU1lNQk9MSUNfTkFNRV9NQU5JRkVTVF9IRUFERVI7CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSGVhZGVyKElSZXNvdXJjZSByZXNvdXJjZSkgewotLy8JCXJldHVybiB0cnVlOwotLy8JfQorLy8gQE92ZXJyaWRlCisvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSGVhZGVyKElSZXNvdXJjZSByZXNvdXJjZSkgeworLy8gcmV0dXJuIHRydWU7CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlcihCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsCi0vLwkJCUJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgeworLy8gQE92ZXJyaWRlCisvLyBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlcihCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsCisvLyBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKIC8vCi0vLwkJQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50W10gZWxlbWVudHMgPSBoZWFkZXIuZ2V0QnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50cygpOwotLy8JCVN0cmluZyBpZCA9IGVsZW1lbnRzLmxlbmd0aCA+IDAgPyBlbGVtZW50c1swXS5nZXRNYW5pZmVzdEVsZW1lbnQoKS5nZXRWYWx1ZSgpIDogbnVsbDsKLS8vCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKSB7Ci0vLwkJCWNvbnRleHQuZXJyb3IoIk5PX1NZTUJPTElDX05BTUUiLAotLy8JCQkJCUJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfTm9TeW1ib2xpY05hbWUsIGhlYWRlcgotLy8JCQkJCQkJLmdldExpbmVOdW1iZXIoKSArIDEpOwotLy8JCX0KKy8vIEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudFtdIGVsZW1lbnRzID0gaGVhZGVyLmdldEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudHMoKTsKKy8vIFN0cmluZyBpZCA9IGVsZW1lbnRzLmxlbmd0aCA+IDAgPyBlbGVtZW50c1swXS5nZXRNYW5pZmVzdEVsZW1lbnQoKS5nZXRWYWx1ZSgpIDogbnVsbDsKKy8vIGlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApIHsKKy8vIGNvbnRleHQuZXJyb3IoIk5PX1NZTUJPTElDX05BTUUiLAorLy8gQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9Ob1N5bWJvbGljTmFtZSwgaGVhZGVyCisvLyAuZ2V0TGluZU51bWJlcigpICsgMSk7CisvLyB9CiAvLwotLy8JCWlmIChTdHJpbmdVdGlscy5oYXNUZXh0KGlkKSAmJiAhSWRVdGlsLmlzVmFsaWRDb21wb3NpdGVJRDNfMChpZCkpIHsKLS8vCQkJY29udGV4dC5lcnJvcigiSUxMQUdFTF9TWU1CT0xJQ19OQU1FIiwKLS8vCQkJCQlCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX0ludmFsaWRTeW1ib2xpY05hbWUsCi0vLwkJCQkJQnVuZGxlTWFuaWZlc3RVdGlscy5nZXRMaW5lTnVtYmVyKGNvbnRleHQuZ2V0QnVuZGxlTWFuaWZlc3QoKS5nZXREb2N1bWVudCgpLAotLy8JCQkJCQkJaGVhZGVyLCBpZCkpOwotLy8JCX0KKy8vIGlmIChTdHJpbmdVdGlscy5oYXNUZXh0KGlkKSAmJiAhSWRVdGlsLmlzVmFsaWRDb21wb3NpdGVJRDNfMChpZCkpIHsKKy8vIGNvbnRleHQuZXJyb3IoIklMTEFHRUxfU1lNQk9MSUNfTkFNRSIsCisvLyBCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX0ludmFsaWRTeW1ib2xpY05hbWUsCisvLyBCdW5kbGVNYW5pZmVzdFV0aWxzLmdldExpbmVOdW1iZXIoY29udGV4dC5nZXRCdW5kbGVNYW5pZmVzdCgpLmdldERvY3VtZW50KCksCisvLyBoZWFkZXIsIGlkKSk7CisvLyB9CiAvLwotLy8JfQorLy8gfQogLy8KLS8vfQorLy8gfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQXBwbGljYXRpb25WZXJzaW9uUnVsZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQXBwbGljYXRpb25WZXJzaW9uUnVsZS5qYXZhCmluZGV4IDY5YTU5NTYuLjQ4ZWFlYmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0FwcGxpY2F0aW9uVmVyc2lvblJ1bGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9BcHBsaWNhdGlvblZlcnNpb25SdWxlLmphdmEKQEAgLTEsNCArMSw0IEBACi0vLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogLy8gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgU3ByaW5nU291cmNlLCBhIGRpdmlzb24gb2YgVk13YXJlLCBJbmMuCiAvLyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKIC8vICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCkBAIC02LDQ4ICs2LDQ4IEBACiAvLyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAvLyAqCiAvLyAqIENvbnRyaWJ1dG9yczoKLS8vICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKy8vICogU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLnJ1bGVzOworLy8gcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLnJ1bGVzOwogLy8KLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UucGRlLmludGVybmFsLmNvcmUudXRpbC5WZXJzaW9uVXRpbDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLm1vZGVsLkJ1bmRsZU1hbmlmZXN0SGVhZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5CdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0OworLy8gaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwuY29yZS51dGlsLlZlcnNpb25VdGlsOworLy8gaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLm1vZGVsLkJ1bmRsZU1hbmlmZXN0SGVhZGVyOworLy8gaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24uQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dDsKIC8vCiAvLwotLy8vKioKKy8vLyAqKgogLy8gKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKIC8vICogQHNpbmNlIDEuMC4wCiAvLyAqLwotLy8vKioKKy8vLyAqKgogLy8gKiBUT0RPIENEIGFkZCBjb21tZW50cwogLy8gKi8KLS8vQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLS8vcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uVmVyc2lvblJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEFwcGxpY2F0aW9uTWFuaWZlc3RIZWFkZXJSdWxlIHsKKy8vIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCisvLyBwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25WZXJzaW9uUnVsZSBleHRlbmRzIEFic3RyYWN0QXBwbGljYXRpb25NYW5pZmVzdEhlYWRlclJ1bGUgewogLy8KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFQUExJQ0FUSU9OX1ZFUlNJT05fTUFOSUZFU1RfSEVBREVSID0gCi0vLwkJbmV3IFN0cmluZ1tdIHsgIkFwcGxpY2F0aW9uLVZlcnNpb24iIH07CisvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBUFBMSUNBVElPTl9WRVJTSU9OX01BTklGRVNUX0hFQURFUiA9CisvLyBuZXcgU3RyaW5nW10geyAiQXBwbGljYXRpb24tVmVyc2lvbiIgfTsKIC8vCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRIZWFkZXJOYW1lKCkgewotLy8JCXJldHVybiBBUFBMSUNBVElPTl9WRVJTSU9OX01BTklGRVNUX0hFQURFUjsKLS8vCX0KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIFN0cmluZ1tdIGdldEhlYWRlck5hbWUoKSB7CisvLyByZXR1cm4gQVBQTElDQVRJT05fVkVSU0lPTl9NQU5JRkVTVF9IRUFERVI7CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSGVhZGVyKElSZXNvdXJjZSByZXNvdXJjZSkgewotLy8JCXJldHVybiB0cnVlOwotLy8JfQorLy8gQE92ZXJyaWRlCisvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSGVhZGVyKElSZXNvdXJjZSByZXNvdXJjZSkgeworLy8gcmV0dXJuIHRydWU7CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlcihCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsCi0vLwkJCUJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgewotLy8JCUlTdGF0dXMgc3RhdHVzID0gVmVyc2lvblV0aWwudmFsaWRhdGVWZXJzaW9uKGhlYWRlci5nZXRWYWx1ZSgpKTsKLS8vCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJY29udGV4dC5lcnJvcigiSUxMRUdBTF9CVU5ETEVfVkVSU0lPTiIsIHN0YXR1cy5nZXRNZXNzYWdlKCksCi0vLwkJCQloZWFkZXIuZ2V0TGluZU51bWJlcigpICsgMSk7Ci0vLwkJfQotLy8JfQorLy8gQE92ZXJyaWRlCisvLyBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlcihCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsCisvLyBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKy8vIElTdGF0dXMgc3RhdHVzID0gVmVyc2lvblV0aWwudmFsaWRhdGVWZXJzaW9uKGhlYWRlci5nZXRWYWx1ZSgpKTsKKy8vIGlmICghc3RhdHVzLmlzT0soKSkgeworLy8gY29udGV4dC5lcnJvcigiSUxMRUdBTF9CVU5ETEVfVkVSU0lPTiIsIHN0YXR1cy5nZXRNZXNzYWdlKCksCisvLyBoZWFkZXIuZ2V0TGluZU51bWJlcigpICsgMSk7CisvLyB9CisvLyB9CiAvLwotLy99CisvLyB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9CdW5kbGVBY3RpdmF0aW9uUG9saWN5UnVsZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQnVuZGxlQWN0aXZhdGlvblBvbGljeVJ1bGUuamF2YQppbmRleCA0ZWQ2NjJiLi5hZTcwMmJlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9CdW5kbGVBY3RpdmF0aW9uUG9saWN5UnVsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0J1bmRsZUFjdGl2YXRpb25Qb2xpY3lSdWxlLmphdmEKQEAgLTEsNCArMSw0IEBACi0vLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogLy8gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgU3ByaW5nU291cmNlLCBhIGRpdmlzb24gb2YgVk13YXJlLCBJbmMuCiAvLyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKIC8vICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCkBAIC02LDMzICs2LDM0IEBACiAvLyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAvLyAqCiAvLyAqIENvbnRyaWJ1dG9yczoKLS8vICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKy8vICogU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLnJ1bGVzOworLy8gcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLnJ1bGVzOwogLy8KLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLm1vZGVsLkJ1bmRsZU1hbmlmZXN0SGVhZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5CdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0OwotLy9pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS5tb2RlbC5CdW5kbGVNYW5pZmVzdEhlYWRlcjsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLkJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQ7CisvLyBpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKIC8vCiAvLwotLy8vKioKKy8vLyAqKgogLy8gKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKIC8vICogQHNpbmNlIDEuMC4wCiAvLyAqLwotLy8vKioKKy8vLyAqKgogLy8gKiBUT0RPIENEIGFkZCBjb21tZW50cwogLy8gKi8KLS8vcHVibGljIGNsYXNzIEJ1bmRsZUFjdGl2YXRpb25Qb2xpY3lSdWxlIGV4dGVuZHMgQWJzdHJhY3RCdW5kbGVNYW5pZmVzdEhlYWRlclJ1bGUgeworLy8gcHVibGljIGNsYXNzIEJ1bmRsZUFjdGl2YXRpb25Qb2xpY3lSdWxlIGV4dGVuZHMgQWJzdHJhY3RCdW5kbGVNYW5pZmVzdEhlYWRlclJ1bGUgewogLy8KLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEhlYWRlck5hbWUoKSB7Ci0vLwkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5CVU5ETEVfQUNUSVZBVElPTlBPTElDWSB9OwotLy8JfQorLy8gQE92ZXJyaWRlCisvLyBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0SGVhZGVyTmFtZSgpIHsKKy8vIHJldHVybiBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuQlVORExFX0FDVElWQVRJT05QT0xJQ1kgfTsKKy8vIH0KIC8vCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSGVhZGVyKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwKLS8vCQkJQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0vLwkJY29udGV4dC52YWxpZGF0ZUhlYWRlclZhbHVlKGhlYWRlciwgbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkFDVElWQVRJT05fTEFaWSB9LCBNYW5pZmVzdFZhbGlkYXRpb25SdWxlQ29uc3RhbnRzLklMTEVHQUxfQlVORExFX0FDVElWQVRJT05fUE9MSUNZKTsKLS8vCX0KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVIZWFkZXIoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLAorLy8gQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisvLyBjb250ZXh0LnZhbGlkYXRlSGVhZGVyVmFsdWUoaGVhZGVyLCBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuQUNUSVZBVElPTl9MQVpZIH0sCisvLy8gTWFuaWZlc3RWYWxpZGF0aW9uUnVsZUNvbnN0YW50cy5JTExFR0FMX0JVTkRMRV9BQ1RJVkFUSU9OX1BPTElDWSk7CisvLyB9CiAvLwotLy99CisvLyB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9CdW5kbGVBY3RpdmF0b3JSdWxlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9CdW5kbGVBY3RpdmF0b3JSdWxlLmphdmEKaW5kZXggYjkxZDM3Yy4uMzQ1MDk3OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQnVuZGxlQWN0aXZhdG9yUnVsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0J1bmRsZUFjdGl2YXRvclJ1bGUuamF2YQpAQCAtMSw0ICsxLDQgQEAKLS8vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAvLyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNvbiBvZiBWTXdhcmUsIEluYy4KIC8vICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogLy8gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKQEAgLTYsNDYgKzYsNDcgQEAKIC8vICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKIC8vICoKIC8vICogQ29udHJpYnV0b3JzOgotLy8gKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorLy8gKiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy9wYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24ucnVsZXM7CisvLyBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24ucnVsZXM7CiAvLwogLy8KIC8vCi0vLy8qKgorLy8vICoqCiAvLyAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogLy8gKiBAc2luY2UgMS4wLjAKIC8vICovCi0vLy8qKgorLy8vICoqCiAvLyAqIFRPRE8gQ0QgYWRkIGNvbW1lbnRzCiAvLyAqLwotLy9wdWJsaWMgY2xhc3MgQnVuZGxlQWN0aXZhdG9yUnVsZSBleHRlbmRzIEFic3RyYWN0QnVuZGxlTWFuaWZlc3RIZWFkZXJSdWxlIHsKKy8vIHB1YmxpYyBjbGFzcyBCdW5kbGVBY3RpdmF0b3JSdWxlIGV4dGVuZHMgQWJzdHJhY3RCdW5kbGVNYW5pZmVzdEhlYWRlclJ1bGUgewogLy8KLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEhlYWRlck5hbWUoKSB7Ci0vLwkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5CVU5ETEVfQUNUSVZBVE9SIH07Ci0vLwl9CisvLyBAT3ZlcnJpZGUKKy8vIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRIZWFkZXJOYW1lKCkgeworLy8gcmV0dXJuIG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5CVU5ETEVfQUNUSVZBVE9SIH07CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlcihCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsCi0vLwkJCUJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgewotLy8JCVN0cmluZyBhY3RpdmF0b3JDbGFzcyA9IGhlYWRlci5nZXRWYWx1ZSgpOwotLy8JCS8vVE9ETyAtLSBub3Qgc3VyZSBpZiB0aGlzIGxvZ2ljIGlzIG9rLCBpdCBpcyBtdWNoIHNpbXBsZXIgdGhhbiBvbGQgbG9naWMsIGJ1dCBhc3N1bWluZyB0aGF0IHRoZSBjbGFzcyBuZWVkcyB0byBiZSBpbiB0aGUgc2FtZSBidW5kbGUgYXMgTWFuaWZlc3QKLS8vCQlJUHJvamVjdCBwcm9qZWN0ID0gY29udGV4dC5nZXRSb290RWxlbWVudCgpLmdldEVsZW1lbnRSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKLS8vCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0vLwkJSVR5cGUgZmluZFR5cGU7Ci0vLwkJdHJ5IHsKLS8vCQkJZmluZFR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShhY3RpdmF0b3JDbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0vLwkJCWlmIChmaW5kVHlwZSA9PSBudWxsKSB7Ci0vLwkJCQljb250ZXh0LmVycm9yKCJJTExFR0FMX0FDVElWQVRPUl9DTEFTUyIsIE5MUy5iaW5kKAotLy8JCQkJCQlCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX05vRXhpc3QsIGFjdGl2YXRvckNsYXNzKSwgaGVhZGVyCi0vLwkJCQkJCS5nZXRMaW5lTnVtYmVyKCkgKyAxKTsKLS8vCQkJfQotLy8JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWNvbnRleHQuZXJyb3IoIklMTEVHQUxfQUNUSVZBVE9SX0NMQVNTIiwgTkxTLmJpbmQoCi0vLwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9Ob0V4aXN0LCBhY3RpdmF0b3JDbGFzcyksIGhlYWRlcgotLy8JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCS5nZXRMaW5lTnVtYmVyKCkgKyAxKTsKLS8vCQl9Ci0vLwl9CisvLyBAT3ZlcnJpZGUKKy8vIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSGVhZGVyKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwKKy8vIEJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgeworLy8gU3RyaW5nIGFjdGl2YXRvckNsYXNzID0gaGVhZGVyLmdldFZhbHVlKCk7CisvLyAvL1RPRE8gLS0gbm90IHN1cmUgaWYgdGhpcyBsb2dpYyBpcyBvaywgaXQgaXMgbXVjaCBzaW1wbGVyIHRoYW4gb2xkIGxvZ2ljLCBidXQgYXNzdW1pbmcgdGhhdCB0aGUgY2xhc3MgbmVlZHMgdG8gYmUgaW4KKy8vLyB0aGUgc2FtZSBidW5kbGUgYXMgTWFuaWZlc3QKKy8vIElQcm9qZWN0IHByb2plY3QgPSBjb250ZXh0LmdldFJvb3RFbGVtZW50KCkuZ2V0RWxlbWVudFJlc291cmNlKCkuZ2V0UHJvamVjdCgpOworLy8gSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOworLy8gSVR5cGUgZmluZFR5cGU7CisvLyB0cnkgeworLy8gZmluZFR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShhY3RpdmF0b3JDbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisvLyBpZiAoZmluZFR5cGUgPT0gbnVsbCkgeworLy8gY29udGV4dC5lcnJvcigiSUxMRUdBTF9BQ1RJVkFUT1JfQ0xBU1MiLCBOTFMuYmluZCgKKy8vIEJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfTm9FeGlzdCwgYWN0aXZhdG9yQ2xhc3MpLCBoZWFkZXIKKy8vIC5nZXRMaW5lTnVtYmVyKCkgKyAxKTsKKy8vIH0KKy8vIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisvLyBjb250ZXh0LmVycm9yKCJJTExFR0FMX0FDVElWQVRPUl9DTEFTUyIsIE5MUy5iaW5kKAorLy8gQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9Ob0V4aXN0LCBhY3RpdmF0b3JDbGFzcyksIGhlYWRlcgorLy8gLmdldExpbmVOdW1iZXIoKSArIDEpOworLy8gfQorLy8gfQogLy8KLS8vfQorLy8gfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQnVuZGxlTWFuaWZlc3RWZXJzaW9uUnVsZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQnVuZGxlTWFuaWZlc3RWZXJzaW9uUnVsZS5qYXZhCmluZGV4IGFiYWQyZjcuLmNhNzAxNDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0J1bmRsZU1hbmlmZXN0VmVyc2lvblJ1bGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9CdW5kbGVNYW5pZmVzdFZlcnNpb25SdWxlLmphdmEKQEAgLTEsNCArMSw0IEBACi0vLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogLy8gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgU3ByaW5nU291cmNlLCBhIGRpdmlzb24gb2YgVk13YXJlLCBJbmMuCiAvLyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKIC8vICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCkBAIC02LDYxICs2LDYxIEBACiAvLyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAvLyAqCiAvLyAqIENvbnRyaWJ1dG9yczoKLS8vICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKy8vICogU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLnJ1bGVzOworLy8gcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLnJ1bGVzOwogLy8KLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlLkZhY2V0Q29yZVBsdWdpbjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlLkZhY2V0VXRpbHM7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS5CdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlczsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLm1vZGVsLkJ1bmRsZU1hbmlmZXN0SGVhZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5CdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0OwotLy9pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUuRmFjZXRDb3JlUGx1Z2luOworLy8gaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5mYWNldC5jb3JlLkZhY2V0VXRpbHM7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUuQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXM7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUubW9kZWwuQnVuZGxlTWFuaWZlc3RIZWFkZXI7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5CdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0OworLy8gaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7CiAvLwogLy8KLS8vLyoqCisvLy8gKioKIC8vICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAvLyAqIEBzaW5jZSAxLjAuMAogLy8gKi8KLS8vLyoqCisvLy8gKioKIC8vICogVE9ETyBDRCBhZGQgY29tbWVudHMKIC8vICovCi0vL3B1YmxpYyBjbGFzcyBCdW5kbGVNYW5pZmVzdFZlcnNpb25SdWxlIGV4dGVuZHMgQWJzdHJhY3RCdW5kbGVNYW5pZmVzdEhlYWRlclJ1bGUgeworLy8gcHVibGljIGNsYXNzIEJ1bmRsZU1hbmlmZXN0VmVyc2lvblJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZU1hbmlmZXN0SGVhZGVyUnVsZSB7CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NvbnRleHQoQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0vLwkJaWYgKHN1cGVyLnN1cHBvcnRzQ29udGV4dChjb250ZXh0KSkgewotLy8JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb250ZXh0LmdldFJvb3RFbGVtZW50KCkuZ2V0RWxlbWVudFJlc291cmNlKCk7Ci0vLwkJCXJldHVybiAhRmFjZXRVdGlscy5oYXNQcm9qZWN0RmFjZXQocmVzb3VyY2UsIEZhY2V0Q29yZVBsdWdpbi5XRUJfRkFDRVRfSUQpOwotLy8JCX0KLS8vCQlyZXR1cm4gZmFsc2U7Ci0vLwl9Ci0vLwkKLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEhlYWRlck5hbWUoKSB7Ci0vLwkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OIH07Ci0vLwl9CisvLyBAT3ZlcnJpZGUKKy8vIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzQ29udGV4dChCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKy8vIGlmIChzdXBlci5zdXBwb3J0c0NvbnRleHQoY29udGV4dCkpIHsKKy8vIElSZXNvdXJjZSByZXNvdXJjZSA9IGNvbnRleHQuZ2V0Um9vdEVsZW1lbnQoKS5nZXRFbGVtZW50UmVzb3VyY2UoKTsKKy8vIHJldHVybiAhRmFjZXRVdGlscy5oYXNQcm9qZWN0RmFjZXQocmVzb3VyY2UsIEZhY2V0Q29yZVBsdWdpbi5XRUJfRkFDRVRfSUQpOworLy8gfQorLy8gcmV0dXJuIGZhbHNlOworLy8gfQogLy8KLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1aXJlZEhlYWRlcihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLS8vCQlyZXR1cm4gdHJ1ZTsKLS8vCX0KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIFN0cmluZ1tdIGdldEhlYWRlck5hbWUoKSB7CisvLyByZXR1cm4gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04gfTsKKy8vIH0KIC8vCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSGVhZGVyKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwKLS8vCQkJQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0vLwkJU3RyaW5nIHZlcnNpb24gPSBoZWFkZXIuZ2V0VmFsdWUoKTsKLS8vCQlpZiAoISIyIi5lcXVhbHModmVyc2lvbikpIHsKLS8vCQkJY29udGV4dC53YXJuaW5nKE1hbmlmZXN0VmFsaWRhdGlvblJ1bGVDb25zdGFudHMuSUxMRUdBTF9CVU5ETEVfTUFOSUZFU1RfVkVSU0lPTiwKLS8vCQkJCQlCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX2lsbGVnYWxNYW5pZmVzdFZlcnNpb24sIGhlYWRlcgotLy8JCQkJCQkJLmdldExpbmVOdW1iZXIoKSArIDEpOwotLy8JCX0KLS8vCX0KLS8vCQotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgU3RyaW5nIGdldE1pc3NpbmdSZXF1aXJlZEhlYWRlckVycm9ySWQoKSB7Ci0vLwkJcmV0dXJuIE1hbmlmZXN0VmFsaWRhdGlvblJ1bGVDb25zdGFudHMuTUlTU0lOR19CVU5ETEVfTUFOSUZFU1RfVkVSU0lPTjsKLS8vCX0KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1aXJlZEhlYWRlcihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKy8vIHJldHVybiB0cnVlOworLy8gfQogLy8KLS8vfQorLy8gQE92ZXJyaWRlCisvLyBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlcihCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsCisvLyBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKy8vIFN0cmluZyB2ZXJzaW9uID0gaGVhZGVyLmdldFZhbHVlKCk7CisvLyBpZiAoISIyIi5lcXVhbHModmVyc2lvbikpIHsKKy8vIGNvbnRleHQud2FybmluZyhNYW5pZmVzdFZhbGlkYXRpb25SdWxlQ29uc3RhbnRzLklMTEVHQUxfQlVORExFX01BTklGRVNUX1ZFUlNJT04sCisvLyBCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX2lsbGVnYWxNYW5pZmVzdFZlcnNpb24sIGhlYWRlcgorLy8gLmdldExpbmVOdW1iZXIoKSArIDEpOworLy8gfQorLy8gfQorLy8KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIFN0cmluZyBnZXRNaXNzaW5nUmVxdWlyZWRIZWFkZXJFcnJvcklkKCkgeworLy8gcmV0dXJuIE1hbmlmZXN0VmFsaWRhdGlvblJ1bGVDb25zdGFudHMuTUlTU0lOR19CVU5ETEVfTUFOSUZFU1RfVkVSU0lPTjsKKy8vIH0KKy8vCisvLyB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9CdW5kbGVOYW1lUnVsZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQnVuZGxlTmFtZVJ1bGUuamF2YQppbmRleCA3ZDg0NmIzLi4xZDE5Yjc2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9CdW5kbGVOYW1lUnVsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0J1bmRsZU5hbWVSdWxlLmphdmEKQEAgLTEsNCArMSw0IEBACi0vLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogLy8gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgU3ByaW5nU291cmNlLCBhIGRpdmlzb24gb2YgVk13YXJlLCBJbmMuCiAvLyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKIC8vICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCkBAIC02LDQ0ICs2LDQ0IEBACiAvLyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAvLyAqCiAvLyAqIENvbnRyaWJ1dG9yczoKLS8vICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKy8vICogU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLnJ1bGVzOworLy8gcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLnJ1bGVzOwogLy8KLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLm1vZGVsLkJ1bmRsZU1hbmlmZXN0SGVhZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5CdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0OwotLy9pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUubW9kZWwuQnVuZGxlTWFuaWZlc3RIZWFkZXI7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5CdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0OworLy8gaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7CiAvLwogLy8KLS8vLyoqCisvLy8gKioKIC8vICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAvLyAqIEBzaW5jZSAxLjAuMAogLy8gKi8KLS8vLyoqCisvLy8gKioKIC8vICogVE9ETyBDRCBhZGQgY29tbWVudHMKIC8vICovCi0vL3B1YmxpYyBjbGFzcyBCdW5kbGVOYW1lUnVsZSBleHRlbmRzIEFic3RyYWN0QnVuZGxlTWFuaWZlc3RIZWFkZXJSdWxlIHsKKy8vIHB1YmxpYyBjbGFzcyBCdW5kbGVOYW1lUnVsZSBleHRlbmRzIEFic3RyYWN0QnVuZGxlTWFuaWZlc3RIZWFkZXJSdWxlIHsKIC8vCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRIZWFkZXJOYW1lKCkgewotLy8JCXJldHVybiBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuQlVORExFX05BTUUgfTsKLS8vCX0KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIFN0cmluZ1tdIGdldEhlYWRlck5hbWUoKSB7CisvLyByZXR1cm4gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkJVTkRMRV9OQU1FIH07CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSGVhZGVyKElSZXNvdXJjZSByZXNvdXJjZSkgewotLy8JCXJldHVybiB0cnVlOwotLy8JfQorLy8gQE92ZXJyaWRlCisvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSGVhZGVyKElSZXNvdXJjZSByZXNvdXJjZSkgeworLy8gcmV0dXJuIHRydWU7CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlcihCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsCi0vLwkJCUJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgewotLy8JCS8vIG5vdGhpbmcgdG8gdmFsaWRhdGUgb24gdGhlIGJ1bmRsZSBuYW1lCi0vLwl9Ci0vLwkKLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIFN0cmluZyBnZXRNaXNzaW5nUmVxdWlyZWRIZWFkZXJFcnJvcklkKCkgewotLy8JCXJldHVybiBNYW5pZmVzdFZhbGlkYXRpb25SdWxlQ29uc3RhbnRzLk1JU1NJTkdfQlVORExFX05BTUU7Ci0vLwl9CisvLyBAT3ZlcnJpZGUKKy8vIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSGVhZGVyKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwKKy8vIEJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgeworLy8gLy8gbm90aGluZyB0byB2YWxpZGF0ZSBvbiB0aGUgYnVuZGxlIG5hbWUKKy8vIH0KIC8vCi0vL30KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIFN0cmluZyBnZXRNaXNzaW5nUmVxdWlyZWRIZWFkZXJFcnJvcklkKCkgeworLy8gcmV0dXJuIE1hbmlmZXN0VmFsaWRhdGlvblJ1bGVDb25zdGFudHMuTUlTU0lOR19CVU5ETEVfTkFNRTsKKy8vIH0KKy8vCisvLyB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9CdW5kbGVTeW1ib2xpY05hbWVSdWxlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9CdW5kbGVTeW1ib2xpY05hbWVSdWxlLmphdmEKaW5kZXggYmVjZjY2Mi4uYjAxOGNmYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQnVuZGxlU3ltYm9saWNOYW1lUnVsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0J1bmRsZVN5bWJvbGljTmFtZVJ1bGUuamF2YQpAQCAtMSw0ICsxLDQgQEAKLS8vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAvLyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNvbiBvZiBWTXdhcmUsIEluYy4KIC8vICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogLy8gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKQEAgLTYsNjkgKzYsNjkgQEAKIC8vICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKIC8vICoKIC8vICogQ29udHJpYnV0b3JzOgotLy8gKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorLy8gKiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy9wYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24ucnVsZXM7CisvLyBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24ucnVsZXM7CiAvLwogLy8KIC8vCi0vLy8qKgorLy8vICoqCiAvLyAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogLy8gKiBAc2luY2UgMS4wLjAKIC8vICovCi0vLy8qKgorLy8vICoqCiAvLyAqIFRPRE8gQ0QgYWRkIGNvbW1lbnRzCiAvLyAqLwotLy9AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotLy9wdWJsaWMgY2xhc3MgQnVuZGxlU3ltYm9saWNOYW1lUnVsZSBleHRlbmRzIEFic3RyYWN0QnVuZGxlTWFuaWZlc3RIZWFkZXJSdWxlIHsKKy8vIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCisvLyBwdWJsaWMgY2xhc3MgQnVuZGxlU3ltYm9saWNOYW1lUnVsZSBleHRlbmRzIEFic3RyYWN0QnVuZGxlTWFuaWZlc3RIZWFkZXJSdWxlIHsKIC8vCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGUkFHTUVOVF9BVFRBQ0hNRU5UX0RJUkVDVElWRV9BTExPV0VEX1ZBTFVFUyA9IG5ldyBTdHJpbmdbXSB7Ci0vLwkJCUNvbnN0YW50cy5GUkFHTUVOVF9BVFRBQ0hNRU5UX0FMV0FZUywgQ29uc3RhbnRzLkZSQUdNRU5UX0FUVEFDSE1FTlRfTkVWRVIsCi0vLwkJCUNvbnN0YW50cy5GUkFHTUVOVF9BVFRBQ0hNRU5UX1JFU09MVkVUSU1FIH07CisvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGUkFHTUVOVF9BVFRBQ0hNRU5UX0RJUkVDVElWRV9BTExPV0VEX1ZBTFVFUyA9IG5ldyBTdHJpbmdbXSB7CisvLyBDb25zdGFudHMuRlJBR01FTlRfQVRUQUNITUVOVF9BTFdBWVMsIENvbnN0YW50cy5GUkFHTUVOVF9BVFRBQ0hNRU5UX05FVkVSLAorLy8gQ29uc3RhbnRzLkZSQUdNRU5UX0FUVEFDSE1FTlRfUkVTT0xWRVRJTUUgfTsKIC8vCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRIZWFkZXJOYW1lKCkgewotLy8JCXJldHVybiBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSB9OwotLy8JfQorLy8gQE92ZXJyaWRlCisvLyBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0SGVhZGVyTmFtZSgpIHsKKy8vIHJldHVybiBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSB9OworLy8gfQogLy8KLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1aXJlZEhlYWRlcihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLS8vCQlyZXR1cm4gIUZhY2V0VXRpbHMuaGFzUHJvamVjdEZhY2V0KHJlc291cmNlLCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKTsKLS8vCX0KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXF1aXJlZEhlYWRlcihJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKy8vIHJldHVybiAhRmFjZXRVdGlscy5oYXNQcm9qZWN0RmFjZXQocmVzb3VyY2UsIEZhY2V0Q29yZVBsdWdpbi5XRUJfRkFDRVRfSUQpOworLy8gfQogLy8KLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVIZWFkZXIoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVIZWFkZXIoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKIC8vCi0vLwkJQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50W10gZWxlbWVudHMgPSBoZWFkZXIuZ2V0QnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50cygpOwotLy8JCVN0cmluZyBpZCA9IGVsZW1lbnRzLmxlbmd0aCA+IDAgPyBlbGVtZW50c1swXS5nZXRNYW5pZmVzdEVsZW1lbnQoKS5nZXRWYWx1ZSgpIDogbnVsbDsKLS8vCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKSB7Ci0vLwkJCWNvbnRleHQuZXJyb3IoIk5PX1NZTUJPTElDX05BTUUiLCBCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX05vU3ltYm9saWNOYW1lLCBoZWFkZXIKLS8vCQkJCQkuZ2V0TGluZU51bWJlcigpICsgMSk7Ci0vLwkJfQorLy8gQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50W10gZWxlbWVudHMgPSBoZWFkZXIuZ2V0QnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50cygpOworLy8gU3RyaW5nIGlkID0gZWxlbWVudHMubGVuZ3RoID4gMCA/IGVsZW1lbnRzWzBdLmdldE1hbmlmZXN0RWxlbWVudCgpLmdldFZhbHVlKCkgOiBudWxsOworLy8gaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCkgeworLy8gY29udGV4dC5lcnJvcigiTk9fU1lNQk9MSUNfTkFNRSIsIEJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfTm9TeW1ib2xpY05hbWUsIGhlYWRlcgorLy8gLmdldExpbmVOdW1iZXIoKSArIDEpOworLy8gfQogLy8KLS8vCQlpZiAoU3RyaW5nVXRpbHMuaGFzVGV4dChpZCkgJiYgIUlkVXRpbC5pc1ZhbGlkQ29tcG9zaXRlSUQzXzAoaWQpKSB7Ci0vLwkJCWNvbnRleHQuZXJyb3IoIklMTEFHRUxfU1lNQk9MSUNfTkFNRSIsIEJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfSW52YWxpZFN5bWJvbGljTmFtZSwKLS8vCQkJCQlCdW5kbGVNYW5pZmVzdFV0aWxzLmdldExpbmVOdW1iZXIoY29udGV4dC5nZXRCdW5kbGVNYW5pZmVzdCgpLmdldERvY3VtZW50KCksIGhlYWRlciwgaWQpKTsKLS8vCQl9CisvLyBpZiAoU3RyaW5nVXRpbHMuaGFzVGV4dChpZCkgJiYgIUlkVXRpbC5pc1ZhbGlkQ29tcG9zaXRlSUQzXzAoaWQpKSB7CisvLyBjb250ZXh0LmVycm9yKCJJTExBR0VMX1NZTUJPTElDX05BTUUiLCBCdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlcy5CdW5kbGVFcnJvclJlcG9ydGVyX0ludmFsaWRTeW1ib2xpY05hbWUsCisvLyBCdW5kbGVNYW5pZmVzdFV0aWxzLmdldExpbmVOdW1iZXIoY29udGV4dC5nZXRCdW5kbGVNYW5pZmVzdCgpLmdldERvY3VtZW50KCksIGhlYWRlciwgaWQpKTsKKy8vIH0KIC8vCi0vLwkJaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLS8vCQkJLy8gdmFsaWRhdGUgc2luZ2xldG9uIGRpcmVjdGl2ZQotLy8JCQljb250ZXh0LnZhbGlkYXRlQm9vbGVhbkF0dHJpYnV0ZVZhbHVlKGhlYWRlciwgZWxlbWVudHNbMF0uZ2V0TWFuaWZlc3RFbGVtZW50KCksCi0vLwkJCQkJQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUpOwotLy8JCQljb250ZXh0LnZhbGlkYXRlQm9vbGVhbkRpcmVjdGl2ZVZhbHVlKGhlYWRlciwgZWxlbWVudHNbMF0uZ2V0TWFuaWZlc3RFbGVtZW50KCksCi0vLwkJCQkJQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUpOworLy8gaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKKy8vIC8vIHZhbGlkYXRlIHNpbmdsZXRvbiBkaXJlY3RpdmUKKy8vIGNvbnRleHQudmFsaWRhdGVCb29sZWFuQXR0cmlidXRlVmFsdWUoaGVhZGVyLCBlbGVtZW50c1swXS5nZXRNYW5pZmVzdEVsZW1lbnQoKSwKKy8vIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFKTsKKy8vIGNvbnRleHQudmFsaWRhdGVCb29sZWFuRGlyZWN0aXZlVmFsdWUoaGVhZGVyLCBlbGVtZW50c1swXS5nZXRNYW5pZmVzdEVsZW1lbnQoKSwKKy8vIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFKTsKIC8vCi0vLwkJCS8vIHZhbGlkYXRlIGZyYWdtZW50LWF0dGFjaG1lbnQgZGlyZWN0aXZlCi0vLwkJCWNvbnRleHQudmFsaWRhdGVBdHRyaWJ1dGVWYWx1ZShoZWFkZXIsIGVsZW1lbnRzWzBdLmdldE1hbmlmZXN0RWxlbWVudCgpLAotLy8JCQkJCUNvbnN0YW50cy5GUkFHTUVOVF9BVFRBQ0hNRU5UX0RJUkVDVElWRSwgRlJBR01FTlRfQVRUQUNITUVOVF9ESVJFQ1RJVkVfQUxMT1dFRF9WQUxVRVMpOwotLy8JCQljb250ZXh0LnZhbGlkYXRlRGlyZWN0aXZlVmFsdWUoaGVhZGVyLCBlbGVtZW50c1swXS5nZXRNYW5pZmVzdEVsZW1lbnQoKSwKLS8vCQkJCQlDb25zdGFudHMuRlJBR01FTlRfQVRUQUNITUVOVF9ESVJFQ1RJVkUsIEZSQUdNRU5UX0FUVEFDSE1FTlRfRElSRUNUSVZFX0FMTE9XRURfVkFMVUVTKTsKLS8vCQl9Ci0vLwl9CisvLyAvLyB2YWxpZGF0ZSBmcmFnbWVudC1hdHRhY2htZW50IGRpcmVjdGl2ZQorLy8gY29udGV4dC52YWxpZGF0ZUF0dHJpYnV0ZVZhbHVlKGhlYWRlciwgZWxlbWVudHNbMF0uZ2V0TWFuaWZlc3RFbGVtZW50KCksCisvLyBDb25zdGFudHMuRlJBR01FTlRfQVRUQUNITUVOVF9ESVJFQ1RJVkUsIEZSQUdNRU5UX0FUVEFDSE1FTlRfRElSRUNUSVZFX0FMTE9XRURfVkFMVUVTKTsKKy8vIGNvbnRleHQudmFsaWRhdGVEaXJlY3RpdmVWYWx1ZShoZWFkZXIsIGVsZW1lbnRzWzBdLmdldE1hbmlmZXN0RWxlbWVudCgpLAorLy8gQ29uc3RhbnRzLkZSQUdNRU5UX0FUVEFDSE1FTlRfRElSRUNUSVZFLCBGUkFHTUVOVF9BVFRBQ0hNRU5UX0RJUkVDVElWRV9BTExPV0VEX1ZBTFVFUyk7CisvLyB9CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgU3RyaW5nIGdldE1pc3NpbmdSZXF1aXJlZEhlYWRlckVycm9ySWQoKSB7Ci0vLwkJcmV0dXJuIE1hbmlmZXN0VmFsaWRhdGlvblJ1bGVDb25zdGFudHMuTUlTU0lOR19CVU5ETEVfU1lNQk9MSUNfTkFNRTsKLS8vCX0KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIFN0cmluZyBnZXRNaXNzaW5nUmVxdWlyZWRIZWFkZXJFcnJvcklkKCkgeworLy8gcmV0dXJuIE1hbmlmZXN0VmFsaWRhdGlvblJ1bGVDb25zdGFudHMuTUlTU0lOR19CVU5ETEVfU1lNQk9MSUNfTkFNRTsKKy8vIH0KIC8vCi0vL30KKy8vIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0J1bmRsZVZlcnNpb25SdWxlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9CdW5kbGVWZXJzaW9uUnVsZS5qYXZhCmluZGV4IDRkMGJjMDEuLmE1MTZiYmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0J1bmRsZVZlcnNpb25SdWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvQnVuZGxlVmVyc2lvblJ1bGUuamF2YQpAQCAtMSw0ICsxLDQgQEAKLS8vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAvLyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNvbiBvZiBWTXdhcmUsIEluYy4KIC8vICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogLy8gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKQEAgLTYsNTEgKzYsNTEgQEAKIC8vICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKIC8vICoKIC8vICogQ29udHJpYnV0b3JzOgotLy8gKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorLy8gKiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy9wYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24ucnVsZXM7CisvLyBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24ucnVsZXM7CiAvLwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwuY29yZS51dGlsLlZlcnNpb25VdGlsOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUuRmFjZXRDb3JlUGx1Z2luOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUuRmFjZXRVdGlsczsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLm1vZGVsLkJ1bmRsZU1hbmlmZXN0SGVhZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5CdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0OwotLy9pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UucGRlLmludGVybmFsLmNvcmUudXRpbC5WZXJzaW9uVXRpbDsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUuZmFjZXQuY29yZS5GYWNldENvcmVQbHVnaW47CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUuRmFjZXRVdGlsczsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS5tb2RlbC5CdW5kbGVNYW5pZmVzdEhlYWRlcjsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS52YWxpZGF0aW9uLkJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQ7CisvLyBpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKIC8vCiAvLwotLy8vKioKKy8vLyAqKgogLy8gKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKIC8vICogQHNpbmNlIDEuMC4wCiAvLyAqLwotLy8vKioKKy8vLyAqKgogLy8gKiBUT0RPIENEIGFkZCBjb21tZW50cwogLy8gKi8KLS8vQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLS8vcHVibGljIGNsYXNzIEJ1bmRsZVZlcnNpb25SdWxlIGV4dGVuZHMgQWJzdHJhY3RCdW5kbGVNYW5pZmVzdEhlYWRlclJ1bGUgeworLy8gQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKKy8vIHB1YmxpYyBjbGFzcyBCdW5kbGVWZXJzaW9uUnVsZSBleHRlbmRzIEFic3RyYWN0QnVuZGxlTWFuaWZlc3RIZWFkZXJSdWxlIHsKIC8vCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRIZWFkZXJOYW1lKCkgewotLy8JCXJldHVybiBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuQlVORExFX1ZFUlNJT04gfTsKLS8vCX0KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIFN0cmluZ1tdIGdldEhlYWRlck5hbWUoKSB7CisvLyByZXR1cm4gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OIH07CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSGVhZGVyKElSZXNvdXJjZSByZXNvdXJjZSkgewotLy8JCXJldHVybiAhRmFjZXRVdGlscy5oYXNQcm9qZWN0RmFjZXQocmVzb3VyY2UsIEZhY2V0Q29yZVBsdWdpbi5XRUJfRkFDRVRfSUQpOwotLy8JfQorLy8gQE92ZXJyaWRlCisvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcXVpcmVkSGVhZGVyKElSZXNvdXJjZSByZXNvdXJjZSkgeworLy8gcmV0dXJuICFGYWNldFV0aWxzLmhhc1Byb2plY3RGYWNldChyZXNvdXJjZSwgRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRCk7CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlcihCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsIEJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgewotLy8JCUlTdGF0dXMgc3RhdHVzID0gVmVyc2lvblV0aWwudmFsaWRhdGVWZXJzaW9uKGhlYWRlci5nZXRWYWx1ZSgpKTsKLS8vCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJY29udGV4dC5lcnJvcigiSUxMRUdBTF9CVU5ETEVfVkVSU0lPTiIsIHN0YXR1cy5nZXRNZXNzYWdlKCksIGhlYWRlci5nZXRMaW5lTnVtYmVyKCkgKyAxKTsKLS8vCQl9Ci0vLwl9CisvLyBAT3ZlcnJpZGUKKy8vIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSGVhZGVyKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisvLyBJU3RhdHVzIHN0YXR1cyA9IFZlcnNpb25VdGlsLnZhbGlkYXRlVmVyc2lvbihoZWFkZXIuZ2V0VmFsdWUoKSk7CisvLyBpZiAoIXN0YXR1cy5pc09LKCkpIHsKKy8vIGNvbnRleHQuZXJyb3IoIklMTEVHQUxfQlVORExFX1ZFUlNJT04iLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBoZWFkZXIuZ2V0TGluZU51bWJlcigpICsgMSk7CisvLyB9CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgU3RyaW5nIGdldE1pc3NpbmdSZXF1aXJlZEhlYWRlckVycm9ySWQoKSB7Ci0vLwkJcmV0dXJuIE1hbmlmZXN0VmFsaWRhdGlvblJ1bGVDb25zdGFudHMuTUlTU0lOR19CVU5ETEVfVkVSU0lPTjsKLS8vCX0KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIFN0cmluZyBnZXRNaXNzaW5nUmVxdWlyZWRIZWFkZXJFcnJvcklkKCkgeworLy8gcmV0dXJuIE1hbmlmZXN0VmFsaWRhdGlvblJ1bGVDb25zdGFudHMuTUlTU0lOR19CVU5ETEVfVkVSU0lPTjsKKy8vIH0KIC8vCi0vL30KKy8vIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0V4cG9ydFBhY2thZ2VSdWxlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9FeHBvcnRQYWNrYWdlUnVsZS5qYXZhCmluZGV4IDA0YWRlMmEuLmI2N2IzOWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL0V4cG9ydFBhY2thZ2VSdWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvRXhwb3J0UGFja2FnZVJ1bGUuamF2YQpAQCAtMSw0ICsxLDQgQEAKLS8vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAvLyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNvbiBvZiBWTXdhcmUsIEluYy4KIC8vICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogLy8gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKQEAgLTYsOTkgKzYsOTkgQEAKIC8vICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKIC8vICoKIC8vICogQ29udHJpYnV0b3JzOgotLy8gKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorLy8gKiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy9wYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24ucnVsZXM7CisvLyBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24ucnVsZXM7CiAvLwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwuY29yZS51dGlsLlZlcnNpb25VdGlsOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUuQnVuZGxlTWFuaWZlc3RVdGlsczsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLm1vZGVsLkJ1bmRsZU1hbmlmZXN0SGVhZGVyOwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUubW9kZWwuQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50OwotLy9pbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5CdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0OwotLy9pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50czsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CisvLyBpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwuY29yZS51dGlsLlZlcnNpb25VdGlsOworLy8gaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLkJ1bmRsZU1hbmlmZXN0VXRpbHM7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUubW9kZWwuQnVuZGxlTWFuaWZlc3RIZWFkZXI7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUubW9kZWwuQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50OworLy8gaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24uQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dDsKKy8vIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQ29uc3RhbnRzOwogLy8KIC8vCi0vLy8qKgorLy8vICoqCiAvLyAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogLy8gKiBAc2luY2UgMS4wLjAKIC8vICovCi0vLy8qKgorLy8vICoqCiAvLyAqIFRPRE8gQ0QgYWRkIGNvbW1lbnRzCiAvLyAqLwotLy9AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotLy9wdWJsaWMgY2xhc3MgRXhwb3J0UGFja2FnZVJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZU1hbmlmZXN0SGVhZGVyUnVsZSB7CisvLyBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorLy8gcHVibGljIGNsYXNzIEV4cG9ydFBhY2thZ2VSdWxlIGV4dGVuZHMgQWJzdHJhY3RCdW5kbGVNYW5pZmVzdEhlYWRlclJ1bGUgewogLy8KLS8vCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUV4cG9ydFBhY2thZ2UoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCwKLS8vCQkJQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0vLwkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotLy8JCXRyeSB7Ci0vLwkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBKYXZhQ29yZS5jcmVhdGUoCi0vLwkJCQkJY29udGV4dC5nZXRSb290RWxlbWVudCgpLmdldEVsZW1lbnRSZXNvdXJjZSgpLmdldFByb2plY3QoKSkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKKy8vIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUV4cG9ydFBhY2thZ2UoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCwKKy8vIEJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgeworLy8gYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworLy8gdHJ5IHsKKy8vIElQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHMgPSBKYXZhQ29yZS5jcmVhdGUoCisvLyBjb250ZXh0LmdldFJvb3RFbGVtZW50KCkuZ2V0RWxlbWVudFJlc291cmNlKCkuZ2V0UHJvamVjdCgpKS5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwogLy8KLS8vCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCByb290IDogcm9vdHMpIHsKLS8vCQkJCWludCBraW5kID0gcm9vdC5nZXRLaW5kKCk7Ci0vLwkJCQlpZiAoa2luZCA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRQotLy8JCQkJCQl8fCAoa2luZCA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWSAmJiAhcm9vdC5pc0V4dGVybmFsKCkpKSB7Ci0vLwkJCQkJSUphdmFFbGVtZW50W10gamF2YUVsZW1lbnRzID0gcm9vdC5nZXRDaGlsZHJlbigpOwotLy8JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgamF2YUVsZW1lbnRzLmxlbmd0aDsgaisrKQotLy8JCQkJCQlpZiAoamF2YUVsZW1lbnRzW2pdIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotLy8JCQkJCQkJSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KSBqYXZhRWxlbWVudHNbal07Ci0vLwkJCQkJCQlTdHJpbmcgbmFtZSA9IGZyYWdtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0vLwkJCQkJCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0vLwkJCQkJCQkJbmFtZSA9ICIuIjsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJCWlmIChmcmFnbWVudC5jb250YWluc0phdmFSZXNvdXJjZXMoKQotLy8JCQkJCQkJCQl8fCBmcmFnbWVudC5nZXROb25KYXZhUmVzb3VyY2VzKCkubGVuZ3RoID4gMCkgewotLy8JCQkJCQkJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50LmdldFZhbHVlKCkpKSB7Ci0vLwkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLS8vCQl9CisvLyBmb3IgKElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgOiByb290cykgeworLy8gaW50IGtpbmQgPSByb290LmdldEtpbmQoKTsKKy8vIGlmIChraW5kID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFCisvLyB8fCAoa2luZCA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWSAmJiAhcm9vdC5pc0V4dGVybmFsKCkpKSB7CisvLyBJSmF2YUVsZW1lbnRbXSBqYXZhRWxlbWVudHMgPSByb290LmdldENoaWxkcmVuKCk7CisvLyBmb3IgKGludCBqID0gMDsgaiA8IGphdmFFbGVtZW50cy5sZW5ndGg7IGorKykKKy8vIGlmIChqYXZhRWxlbWVudHNbal0gaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7CisvLyBJUGFja2FnZUZyYWdtZW50IGZyYWdtZW50ID0gKElQYWNrYWdlRnJhZ21lbnQpIGphdmFFbGVtZW50c1tqXTsKKy8vIFN0cmluZyBuYW1lID0gZnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKTsKKy8vIGlmIChuYW1lLmxlbmd0aCgpID09IDApIHsKKy8vIG5hbWUgPSAiLiI7CisvLyB9CisvLyBpZiAoZnJhZ21lbnQuY29udGFpbnNKYXZhUmVzb3VyY2VzKCkKKy8vIHx8IGZyYWdtZW50LmdldE5vbkphdmFSZXNvdXJjZXMoKS5sZW5ndGggPiAwKSB7CisvLyBpZiAobmFtZS5lcXVhbHMoZWxlbWVudC5nZXRWYWx1ZSgpKSkgeworLy8gZm91bmQgPSB0cnVlOworLy8gfQorLy8gfQorLy8gfQorLy8gfQorLy8gfQorLy8gfQorLy8gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisvLyB9CiAvLwotLy8JCS8vIGlmIHdlIGFjdHVhbGx5IGhhdmUgcGFja2FnZXMgdG8gYWRkCi0vLwkJaWYgKCFmb3VuZCkgewotLy8JCQljb250ZXh0Lndhcm5pbmcoIk1JU1NJTkdfUEFDS0FHRV9FWFBPUlQiLCAiQnVuZGxlIGRvZXMgZXhwb3J0IG5vbi1leGlzdGluZyBwYWNrYWdlIiwgaGVhZGVyCi0vLwkJCQkJCQkuZ2V0TGluZU51bWJlcigpICsgMSk7Ci0vLwkJfQotLy8JfQorLy8gLy8gaWYgd2UgYWN0dWFsbHkgaGF2ZSBwYWNrYWdlcyB0byBhZGQKKy8vIGlmICghZm91bmQpIHsKKy8vIGNvbnRleHQud2FybmluZygiTUlTU0lOR19QQUNLQUdFX0VYUE9SVCIsICJCdW5kbGUgZG9lcyBleHBvcnQgbm9uLWV4aXN0aW5nIHBhY2thZ2UiLCBoZWFkZXIKKy8vIC5nZXRMaW5lTnVtYmVyKCkgKyAxKTsKKy8vIH0KKy8vIH0KIC8vCi0vLwlwcml2YXRlIHZvaWQgdmFsaWRhdGVWZXJzaW9uQXR0cmlidXRlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgTWFuaWZlc3RFbGVtZW50IGVsZW1lbnQsCi0vLwkJCUJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgewotLy8JCVN0cmluZyB2ZXJzaW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFKTsKLS8vCQlpZiAodmVyc2lvbiA9PSBudWxsKQotLy8JCQlyZXR1cm47Ci0vLwkJSVN0YXR1cyBzdGF0dXMgPSBWZXJzaW9uVXRpbC52YWxpZGF0ZVZlcnNpb24odmVyc2lvbik7Ci0vLwkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCWNvbnRleHQuZXJyb3IoIklMTEVHQUxfVkVSU0lPTl9SQU5HRSIsIHN0YXR1cy5nZXRNZXNzYWdlKCksIEJ1bmRsZU1hbmlmZXN0VXRpbHMKLS8vCQkJCQkuZ2V0UGFja2FnZUxpbmVOdW1iZXIoY29udGV4dC5nZXRCdW5kbGVNYW5pZmVzdCgpLmdldERvY3VtZW50KCksIGhlYWRlciwKLS8vCQkJCQkJCWVsZW1lbnQpKTsKLS8vCQl9Ci0vLwl9CisvLyBwcml2YXRlIHZvaWQgdmFsaWRhdGVWZXJzaW9uQXR0cmlidXRlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgTWFuaWZlc3RFbGVtZW50IGVsZW1lbnQsCisvLyBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKy8vIFN0cmluZyB2ZXJzaW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFKTsKKy8vIGlmICh2ZXJzaW9uID09IG51bGwpCisvLyByZXR1cm47CisvLyBJU3RhdHVzIHN0YXR1cyA9IFZlcnNpb25VdGlsLnZhbGlkYXRlVmVyc2lvbih2ZXJzaW9uKTsKKy8vIGlmICghc3RhdHVzLmlzT0soKSkgeworLy8gY29udGV4dC5lcnJvcigiSUxMRUdBTF9WRVJTSU9OX1JBTkdFIiwgc3RhdHVzLmdldE1lc3NhZ2UoKSwgQnVuZGxlTWFuaWZlc3RVdGlscworLy8gLmdldFBhY2thZ2VMaW5lTnVtYmVyKGNvbnRleHQuZ2V0QnVuZGxlTWFuaWZlc3QoKS5nZXREb2N1bWVudCgpLCBoZWFkZXIsCisvLyBlbGVtZW50KSk7CisvLyB9CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0SGVhZGVyTmFtZSgpIHsKLS8vCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFIH07Ci0vLwl9CisvLyBAT3ZlcnJpZGUKKy8vIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRIZWFkZXJOYW1lKCkgeworLy8gcmV0dXJuIG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSB9OworLy8gfQogLy8KLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVIZWFkZXIoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLAotLy8JCQlCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLS8vCQlmb3IgKEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudCBlbGVtZW50IDogaGVhZGVyLmdldEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudHMoKSkgewotLy8JCQl2YWxpZGF0ZVZlcnNpb25BdHRyaWJ1dGUoaGVhZGVyLCBlbGVtZW50LmdldE1hbmlmZXN0RWxlbWVudCgpLCBjb250ZXh0KTsKLS8vCQkJdmFsaWRhdGVFeHBvcnRQYWNrYWdlKGhlYWRlciwgZWxlbWVudC5nZXRNYW5pZmVzdEVsZW1lbnQoKSwgY29udGV4dCk7Ci0vLwkJfQotLy8JfQorLy8gQE92ZXJyaWRlCisvLyBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlcihCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsCisvLyBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKy8vIGZvciAoQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50IGVsZW1lbnQgOiBoZWFkZXIuZ2V0QnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50cygpKSB7CisvLyB2YWxpZGF0ZVZlcnNpb25BdHRyaWJ1dGUoaGVhZGVyLCBlbGVtZW50LmdldE1hbmlmZXN0RWxlbWVudCgpLCBjb250ZXh0KTsKKy8vIHZhbGlkYXRlRXhwb3J0UGFja2FnZShoZWFkZXIsIGVsZW1lbnQuZ2V0TWFuaWZlc3RFbGVtZW50KCksIGNvbnRleHQpOworLy8gfQorLy8gfQogLy8KLS8vfQorLy8gfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvSW1wb3J0UGFja2FnZUJ1bmRsZUFuZExpYnJhcnlSdWxlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9JbXBvcnRQYWNrYWdlQnVuZGxlQW5kTGlicmFyeVJ1bGUuamF2YQppbmRleCA4MDhiZjNkLi41ZmFiNzdlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9JbXBvcnRQYWNrYWdlQnVuZGxlQW5kTGlicmFyeVJ1bGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9JbXBvcnRQYWNrYWdlQnVuZGxlQW5kTGlicmFyeVJ1bGUuamF2YQpAQCAtMSw0ICsxLDQgQEAKLS8vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAvLyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNvbiBvZiBWTXdhcmUsIEluYy4KIC8vICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogLy8gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKQEAgLTYsNzYgKzYsNzYgQEAKIC8vICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKIC8vICoKIC8vICogQ29udHJpYnV0b3JzOgotLy8gKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorLy8gKiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy9wYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24ucnVsZXM7CisvLyBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24ucnVsZXM7CiAvLwogLy8KLS8vLyoqCisvLy8gKioKIC8vICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAvLyAqIEBzaW5jZSAxLjAuMAogLy8gKi8KLS8vLyoqCisvLy8gKioKIC8vICogVE9ETyBDRCBhZGQgY29tbWVudHMKIC8vICovCi0vL0BTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0vL3B1YmxpYyBjbGFzcyBJbXBvcnRQYWNrYWdlQnVuZGxlQW5kTGlicmFyeVJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZU1hbmlmZXN0SGVhZGVyUnVsZSB7CisvLyBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorLy8gcHVibGljIGNsYXNzIEltcG9ydFBhY2thZ2VCdW5kbGVBbmRMaWJyYXJ5UnVsZSBleHRlbmRzIEFic3RyYWN0QnVuZGxlTWFuaWZlc3RIZWFkZXJSdWxlIHsKIC8vCi0vLwlwcml2YXRlIHZvaWQgdmFsaWRhdGVSZXNvbHV0aW9uRGlyZWN0aXZlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgTWFuaWZlc3RFbGVtZW50IGVsZW1lbnQsCi0vLwkJCUJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgewotLy8JCVN0cmluZyByZXNvbHV0aW9uID0gZWxlbWVudC5nZXREaXJlY3RpdmUoQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFKTsKLS8vCQlpZiAocmVzb2x1dGlvbiAhPSBudWxsKSB7Ci0vLwkJCWNvbnRleHQudmFsaWRhdGVEaXJlY3RpdmVWYWx1ZShoZWFkZXIsIGVsZW1lbnQsIENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSwKLS8vCQkJCQluZXcgU3RyaW5nW10geyBDb25zdGFudHMuUkVTT0xVVElPTl9NQU5EQVRPUlksIENvbnN0YW50cy5SRVNPTFVUSU9OX09QVElPTkFMIH0pOwotLy8JCX0KLS8vCX0KKy8vIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVJlc29sdXRpb25EaXJlY3RpdmUoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCwKKy8vIEJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgeworLy8gU3RyaW5nIHJlc29sdXRpb24gPSBlbGVtZW50LmdldERpcmVjdGl2ZShDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUpOworLy8gaWYgKHJlc29sdXRpb24gIT0gbnVsbCkgeworLy8gY29udGV4dC52YWxpZGF0ZURpcmVjdGl2ZVZhbHVlKGhlYWRlciwgZWxlbWVudCwgQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLAorLy8gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLlJFU09MVVRJT05fTUFOREFUT1JZLCBDb25zdGFudHMuUkVTT0xVVElPTl9PUFRJT05BTCB9KTsKKy8vIH0KKy8vIH0KIC8vCi0vLwlwcml2YXRlIHZvaWQgdmFsaWRhdGVWZXJzaW9uQXR0cmlidXRlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgTWFuaWZlc3RFbGVtZW50IGVsZW1lbnQsCi0vLwkJCUJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgewotLy8JCVN0cmluZyB2ZXJzaW9uID0gbnVsbDsKLS8vCQlpZiAoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLmVxdWFscyhoZWFkZXIuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLS8vCQkJdmVyc2lvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTl9BVFRSSUJVVEUpOwotLy8JCX0gZWxzZSB7Ci0vLwkJCXZlcnNpb24gPSBlbGVtZW50LmdldEF0dHJpYnV0ZShDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUpOwotLy8JCX0KLS8vCQkKLS8vCQlpZiAodmVyc2lvbiA9PSBudWxsKQotLy8JCQlyZXR1cm47Ci0vLwkJSVN0YXR1cyBzdGF0dXMgPSBWZXJzaW9uVXRpbC52YWxpZGF0ZVZlcnNpb25SYW5nZSh2ZXJzaW9uKTsKLS8vCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJU3RyaW5nIGVycm9ySWQgPSBnZXRJbGxlZ2FsVmVyc2lvbkVycm9ySWQoaGVhZGVyKTsKLS8vCQkJU3RyaW5nIGFydGlmYWN0TmFtZSA9IGVsZW1lbnQuZ2V0VmFsdWUoKTsKLS8vCQkJY29udGV4dC5lcnJvcihlcnJvcklkLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBCdW5kbGVNYW5pZmVzdFV0aWxzCi0vLwkJCQkJLmdldFBhY2thZ2VMaW5lTnVtYmVyKGNvbnRleHQuZ2V0QnVuZGxlTWFuaWZlc3QoKS5nZXREb2N1bWVudCgpLCBoZWFkZXIsCi0vLwkJCQkJCQllbGVtZW50KSwgbmV3IFZhbGlkYXRpb25Qcm9ibGVtQXR0cmlidXRlKE1hbmlmZXN0VmFsaWRhdGlvblJ1bGVDb25zdGFudHMuSU1QT1JUX0FSVElGQUNUX05BTUUsIGFydGlmYWN0TmFtZSkpOwotLy8JCX0KLS8vCX0KLS8vCQotLy8JcHJvdGVjdGVkIFN0cmluZyBnZXRJbGxlZ2FsVmVyc2lvbkVycm9ySWQoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyKSB7Ci0vLwkJaWYgKGhlYWRlci5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UpKSB7Ci0vLwkJCXJldHVybiBNYW5pZmVzdFZhbGlkYXRpb25SdWxlQ29uc3RhbnRzLklMTEVHQUxfSU1QT1JUX1BBQ0tBR0VfVkVSU0lPTjsKLS8vCQl9IGVsc2UgaWYgKGhlYWRlci5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiSW1wb3J0LUJ1bmRsZSIpKSB7Ci0vLwkJCXJldHVybiBNYW5pZmVzdFZhbGlkYXRpb25SdWxlQ29uc3RhbnRzLklMTEVHQUxfSU1QT1JUX0JVTkRMRV9WRVJTSU9OOwotLy8JCX0gZWxzZSBpZiAoaGVhZGVyLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKCJSZXF1aXJlLUJ1bmRsZSIpKSB7Ci0vLwkJCXJldHVybiBNYW5pZmVzdFZhbGlkYXRpb25SdWxlQ29uc3RhbnRzLklMTEVHQUxfUkVRVUlSRV9CVU5ETEVfVkVSU0lPTjsKLS8vCQl9IGVsc2UgaWYgKGhlYWRlci5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiSW1wb3J0LUxpYnJhcnkiKSkgewotLy8JCQlyZXR1cm4gTWFuaWZlc3RWYWxpZGF0aW9uUnVsZUNvbnN0YW50cy5JTExFR0FMX0lNUE9SVF9MSUJSQVJZX1ZFUlNJT047Ci0vLwkJfQotLy8JCXJldHVybiAiIjsKLS8vCX0KKy8vIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVZlcnNpb25BdHRyaWJ1dGUoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCwKKy8vIEJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgeworLy8gU3RyaW5nIHZlcnNpb24gPSBudWxsOworLy8gaWYgKENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRS5lcXVhbHMoaGVhZGVyLmdldEVsZW1lbnROYW1lKCkpKSB7CisvLyB2ZXJzaW9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OX0FUVFJJQlVURSk7CisvLyB9IGVsc2UgeworLy8gdmVyc2lvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURSk7CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0SGVhZGVyTmFtZSgpIHsKLS8vCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiSW1wb3J0LUJ1bmRsZSIsICJJbXBvcnQtTGlicmFyeSIsIENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSB9OwotLy8JfQorLy8gaWYgKHZlcnNpb24gPT0gbnVsbCkKKy8vIHJldHVybjsKKy8vIElTdGF0dXMgc3RhdHVzID0gVmVyc2lvblV0aWwudmFsaWRhdGVWZXJzaW9uUmFuZ2UodmVyc2lvbik7CisvLyBpZiAoIXN0YXR1cy5pc09LKCkpIHsKKy8vIFN0cmluZyBlcnJvcklkID0gZ2V0SWxsZWdhbFZlcnNpb25FcnJvcklkKGhlYWRlcik7CisvLyBTdHJpbmcgYXJ0aWZhY3ROYW1lID0gZWxlbWVudC5nZXRWYWx1ZSgpOworLy8gY29udGV4dC5lcnJvcihlcnJvcklkLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBCdW5kbGVNYW5pZmVzdFV0aWxzCisvLyAuZ2V0UGFja2FnZUxpbmVOdW1iZXIoY29udGV4dC5nZXRCdW5kbGVNYW5pZmVzdCgpLmdldERvY3VtZW50KCksIGhlYWRlciwKKy8vIGVsZW1lbnQpLCBuZXcgVmFsaWRhdGlvblByb2JsZW1BdHRyaWJ1dGUoTWFuaWZlc3RWYWxpZGF0aW9uUnVsZUNvbnN0YW50cy5JTVBPUlRfQVJUSUZBQ1RfTkFNRSwgYXJ0aWZhY3ROYW1lKSk7CisvLyB9CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlcihCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsCi0vLwkJCUJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgewotLy8JCWZvciAoQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50IGVsZW1lbnQgOiBoZWFkZXIuZ2V0QnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50cygpKSB7Ci0vLwkJCXZhbGlkYXRlUmVzb2x1dGlvbkRpcmVjdGl2ZShoZWFkZXIsIGVsZW1lbnQuZ2V0TWFuaWZlc3RFbGVtZW50KCksIGNvbnRleHQpOwotLy8JCQl2YWxpZGF0ZVZlcnNpb25BdHRyaWJ1dGUoaGVhZGVyLCBlbGVtZW50LmdldE1hbmlmZXN0RWxlbWVudCgpLCBjb250ZXh0KTsKLS8vCQl9Ci0vLwl9CisvLyBwcm90ZWN0ZWQgU3RyaW5nIGdldElsbGVnYWxWZXJzaW9uRXJyb3JJZChCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIpIHsKKy8vIGlmIChoZWFkZXIuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFKSkgeworLy8gcmV0dXJuIE1hbmlmZXN0VmFsaWRhdGlvblJ1bGVDb25zdGFudHMuSUxMRUdBTF9JTVBPUlRfUEFDS0FHRV9WRVJTSU9OOworLy8gfSBlbHNlIGlmIChoZWFkZXIuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIkltcG9ydC1CdW5kbGUiKSkgeworLy8gcmV0dXJuIE1hbmlmZXN0VmFsaWRhdGlvblJ1bGVDb25zdGFudHMuSUxMRUdBTF9JTVBPUlRfQlVORExFX1ZFUlNJT047CisvLyB9IGVsc2UgaWYgKGhlYWRlci5nZXRFbGVtZW50TmFtZSgpLmVxdWFscygiUmVxdWlyZS1CdW5kbGUiKSkgeworLy8gcmV0dXJuIE1hbmlmZXN0VmFsaWRhdGlvblJ1bGVDb25zdGFudHMuSUxMRUdBTF9SRVFVSVJFX0JVTkRMRV9WRVJTSU9OOworLy8gfSBlbHNlIGlmIChoZWFkZXIuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoIkltcG9ydC1MaWJyYXJ5IikpIHsKKy8vIHJldHVybiBNYW5pZmVzdFZhbGlkYXRpb25SdWxlQ29uc3RhbnRzLklMTEVHQUxfSU1QT1JUX0xJQlJBUllfVkVSU0lPTjsKKy8vIH0KKy8vIHJldHVybiAiIjsKKy8vIH0KIC8vCi0vL30KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIFN0cmluZ1tdIGdldEhlYWRlck5hbWUoKSB7CisvLyByZXR1cm4gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiSW1wb3J0LUJ1bmRsZSIsICJJbXBvcnQtTGlicmFyeSIsIENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSB9OworLy8gfQorLy8KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVIZWFkZXIoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLAorLy8gQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisvLyBmb3IgKEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudCBlbGVtZW50IDogaGVhZGVyLmdldEJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudHMoKSkgeworLy8gdmFsaWRhdGVSZXNvbHV0aW9uRGlyZWN0aXZlKGhlYWRlciwgZWxlbWVudC5nZXRNYW5pZmVzdEVsZW1lbnQoKSwgY29udGV4dCk7CisvLyB2YWxpZGF0ZVZlcnNpb25BdHRyaWJ1dGUoaGVhZGVyLCBlbGVtZW50LmdldE1hbmlmZXN0RWxlbWVudCgpLCBjb250ZXh0KTsKKy8vIH0KKy8vIH0KKy8vCisvLyB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9NYW5pZmVzdFBhcnNpbmdQcm9ibGVtc1J1bGUuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL01hbmlmZXN0UGFyc2luZ1Byb2JsZW1zUnVsZS5qYXZhCmluZGV4IDg3NGQ4NTYuLjNlZjIzNmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL01hbmlmZXN0UGFyc2luZ1Byb2JsZW1zUnVsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL01hbmlmZXN0UGFyc2luZ1Byb2JsZW1zUnVsZS5qYXZhCkBAIC0xLDQgKzEsNCBAQAotLy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIC8vICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIFNwcmluZ1NvdXJjZSwgYSBkaXZpc29uIG9mIFZNd2FyZSwgSW5jLgogLy8gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAvLyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMApAQCAtNiwyOCArNiwyOCBAQAogLy8gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogLy8gKgogLy8gKiBDb250cmlidXRvcnM6Ci0vLyAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisvLyAqIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vL3BhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5ydWxlczsKKy8vIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5ydWxlczsKIC8vCiAvLwotLy8vKioKKy8vLyAqKgogLy8gKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKIC8vICogQHNpbmNlIDEuMC4wCiAvLyAqLwotLy8vKioKKy8vLyAqKgogLy8gKiBUT0RPIENEIGFkZCBjb21tZW50cwogLy8gKi8KLS8vcHVibGljIGNsYXNzIE1hbmlmZXN0UGFyc2luZ1Byb2JsZW1zUnVsZSBpbXBsZW1lbnRzCi0vLwkJSVZhbGlkYXRpb25SdWxlPEJ1bmRsZU1hbmlmZXN0LCBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0PiB7CisvLyBwdWJsaWMgY2xhc3MgTWFuaWZlc3RQYXJzaW5nUHJvYmxlbXNSdWxlIGltcGxlbWVudHMKKy8vIElWYWxpZGF0aW9uUnVsZTxCdW5kbGVNYW5pZmVzdCwgQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dD4gewogLy8KLS8vCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKElNb2RlbEVsZW1lbnQgZWxlbWVudCwgSVZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLS8vCQlyZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIEJ1bmRsZU1hbmlmZXN0Ci0vLwkJCQkmJiBjb250ZXh0IGluc3RhbmNlb2YgQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dDsKLS8vCX0KKy8vIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKElNb2RlbEVsZW1lbnQgZWxlbWVudCwgSVZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKy8vIHJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgQnVuZGxlTWFuaWZlc3QKKy8vICYmIGNvbnRleHQgaW5zdGFuY2VvZiBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0OworLy8gfQogLy8KLS8vCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEJ1bmRsZU1hbmlmZXN0IGVsZW1lbnQsIEJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCwKLS8vCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0vLwkJY29udGV4dC5hZGRQcm9ibGVtcyhlbGVtZW50LmdldFByb2JsZW1zKCkudG9BcnJheShuZXcgVmFsaWRhdGlvblByb2JsZW1bZWxlbWVudC5nZXRQcm9ibGVtcygpLnNpemUoKV0pKTsKLS8vCX0KLS8vfQorLy8gcHVibGljIHZvaWQgdmFsaWRhdGUoQnVuZGxlTWFuaWZlc3QgZWxlbWVudCwgQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LAorLy8gSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisvLyBjb250ZXh0LmFkZFByb2JsZW1zKGVsZW1lbnQuZ2V0UHJvYmxlbXMoKS50b0FycmF5KG5ldyBWYWxpZGF0aW9uUHJvYmxlbVtlbGVtZW50LmdldFByb2JsZW1zKCkuc2l6ZSgpXSkpOworLy8gfQorLy8gfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvTWFuaWZlc3RWYWxpZGF0aW9uUnVsZUNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvTWFuaWZlc3RWYWxpZGF0aW9uUnVsZUNvbnN0YW50cy5qYXZhCmluZGV4IGY5MGQ0NDYuLjllZjZlOWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL01hbmlmZXN0VmFsaWRhdGlvblJ1bGVDb25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9NYW5pZmVzdFZhbGlkYXRpb25SdWxlQ29uc3RhbnRzLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUudmFsaWRhdGlvbi5ydWxlczsKIAogLyoqCkBAIC0xNSwyNiArMTYsMjYgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBNYW5pZmVzdFZhbGlkYXRpb25SdWxlQ29uc3RhbnRzIHsKIAotCVN0cmluZyBNSVNTSU5HX0JVTkRMRV9TWU1CT0xJQ19OQU1FID0gIk1JU1NJTkdfQlVORExFX1NZTUJPTElDX05BTUUiOworICAgIFN0cmluZyBNSVNTSU5HX0JVTkRMRV9TWU1CT0xJQ19OQU1FID0gIk1JU1NJTkdfQlVORExFX1NZTUJPTElDX05BTUUiOwogCi0JU3RyaW5nIE1JU1NJTkdfQlVORExFX05BTUUgPSAiTUlTU0lOR19CVU5ETEVfTkFNRSI7CisgICAgU3RyaW5nIE1JU1NJTkdfQlVORExFX05BTUUgPSAiTUlTU0lOR19CVU5ETEVfTkFNRSI7CiAKLQlTdHJpbmcgTUlTU0lOR19CVU5ETEVfVkVSU0lPTiA9ICJNSVNTSU5HX0JVTkRMRV9WRVJTSU9OIjsKKyAgICBTdHJpbmcgTUlTU0lOR19CVU5ETEVfVkVSU0lPTiA9ICJNSVNTSU5HX0JVTkRMRV9WRVJTSU9OIjsKIAotCVN0cmluZyBNSVNTSU5HX0JVTkRMRV9NQU5JRkVTVF9WRVJTSU9OID0gIk1JU1NJTkdfQlVORExFX01BTklGRVNUX1ZFUlNJT04iOworICAgIFN0cmluZyBNSVNTSU5HX0JVTkRMRV9NQU5JRkVTVF9WRVJTSU9OID0gIk1JU1NJTkdfQlVORExFX01BTklGRVNUX1ZFUlNJT04iOwogCi0JU3RyaW5nIElMTEVHQUxfQlVORExFX01BTklGRVNUX1ZFUlNJT04gPSAiSUxMRUdBTF9CVU5ETEVfTUFOSUZFU1RfVkVSU0lPTiI7CisgICAgU3RyaW5nIElMTEVHQUxfQlVORExFX01BTklGRVNUX1ZFUlNJT04gPSAiSUxMRUdBTF9CVU5ETEVfTUFOSUZFU1RfVkVSU0lPTiI7CiAKLQlTdHJpbmcgSUxMRUdBTF9CVU5ETEVfQUNUSVZBVElPTl9QT0xJQ1kgPSAiSUxMRUdBTF9CVU5ETEVfQUNUSVZBVElPTl9QT0xJQ1kiOworICAgIFN0cmluZyBJTExFR0FMX0JVTkRMRV9BQ1RJVkFUSU9OX1BPTElDWSA9ICJJTExFR0FMX0JVTkRMRV9BQ1RJVkFUSU9OX1BPTElDWSI7CiAKLQlTdHJpbmcgSUxMRUdBTF9JTVBPUlRfQlVORExFX1ZFUlNJT04gPSAiSUxMRUdBTF9JTVBPUlRfQlVORExFX1ZFUlNJT04iOworICAgIFN0cmluZyBJTExFR0FMX0lNUE9SVF9CVU5ETEVfVkVSU0lPTiA9ICJJTExFR0FMX0lNUE9SVF9CVU5ETEVfVkVSU0lPTiI7CiAKLQlTdHJpbmcgSUxMRUdBTF9SRVFVSVJFX0JVTkRMRV9WRVJTSU9OID0gIklMTEVHQUxfUkVRVUlSRV9CVU5ETEVfVkVSU0lPTiI7CisgICAgU3RyaW5nIElMTEVHQUxfUkVRVUlSRV9CVU5ETEVfVkVSU0lPTiA9ICJJTExFR0FMX1JFUVVJUkVfQlVORExFX1ZFUlNJT04iOwogCi0JU3RyaW5nIElMTEVHQUxfSU1QT1JUX0xJQlJBUllfVkVSU0lPTiA9ICJJTExFR0FMX0lNUE9SVF9MSUJSQVJZX1ZFUlNJT04iOworICAgIFN0cmluZyBJTExFR0FMX0lNUE9SVF9MSUJSQVJZX1ZFUlNJT04gPSAiSUxMRUdBTF9JTVBPUlRfTElCUkFSWV9WRVJTSU9OIjsKIAotCVN0cmluZyBJTExFR0FMX0lNUE9SVF9QQUNLQUdFX1ZFUlNJT04gPSAiSUxMRUdBTF9JTVBPUlRfUEFDS0FHRV9WRVJTSU9OIjsKKyAgICBTdHJpbmcgSUxMRUdBTF9JTVBPUlRfUEFDS0FHRV9WRVJTSU9OID0gIklMTEVHQUxfSU1QT1JUX1BBQ0tBR0VfVkVSU0lPTiI7CiAKLQlTdHJpbmcgSU1QT1JUX0FSVElGQUNUX05BTUUgPSAiSU1QT1JUX0FSVElGQUNUX05BTUUiOworICAgIFN0cmluZyBJTVBPUlRfQVJUSUZBQ1RfTkFNRSA9ICJJTVBPUlRfQVJUSUZBQ1RfTkFNRSI7CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL1JlcXVpcmVCdW5kbGVSdWxlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmlmZXN0L2ludGVybmFsL2NvcmUvdmFsaWRhdGlvbi9ydWxlcy9SZXF1aXJlQnVuZGxlUnVsZS5qYXZhCmluZGV4IDEwNmFkNjkuLjc4Y2JkYWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuaWZlc3QvaW50ZXJuYWwvY29yZS92YWxpZGF0aW9uL3J1bGVzL1JlcXVpcmVCdW5kbGVSdWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5pZmVzdC9pbnRlcm5hbC9jb3JlL3ZhbGlkYXRpb24vcnVsZXMvUmVxdWlyZUJ1bmRsZVJ1bGUuamF2YQpAQCAtMSw0ICsxLDQgQEAKLS8vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAvLyAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNvbiBvZiBWTXdhcmUsIEluYy4KIC8vICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogLy8gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKQEAgLTYsNzIgKzYsNzIgQEAKIC8vICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKIC8vICoKIC8vICogQ29udHJpYnV0b3JzOgotLy8gKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorLy8gKiBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy9wYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24ucnVsZXM7CisvLyBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24ucnVsZXM7CiAvLwotLy9pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC5jb3JlLnV0aWwuVmVyc2lvblV0aWw7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS5CdW5kbGVNYW5pZmVzdENvcmVNZXNzYWdlczsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLkJ1bmRsZU1hbmlmZXN0VXRpbHM7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuaW50ZXJuYWwuY29yZS5tb2RlbC5CdW5kbGVNYW5pZmVzdEhlYWRlcjsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLm1vZGVsLkJ1bmRsZU1hbmlmZXN0SGVhZGVyRWxlbWVudDsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24uQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dDsKLS8vaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKKy8vIGltcG9ydCBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwuY29yZS51dGlsLlZlcnNpb25VdGlsOworLy8gaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLkJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzOworLy8gaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLkJ1bmRsZU1hbmlmZXN0VXRpbHM7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUubW9kZWwuQnVuZGxlTWFuaWZlc3RIZWFkZXI7CisvLyBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmludGVybmFsLmNvcmUubW9kZWwuQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50OworLy8gaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5pbnRlcm5hbC5jb3JlLnZhbGlkYXRpb24uQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dDsKKy8vIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQ29uc3RhbnRzOwogLy8KIC8vCi0vLy8qKgorLy8vICoqCiAvLyAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogLy8gKiBAc2luY2UgMS4wLjAKIC8vICovCi0vLy8qKgorLy8vICoqCiAvLyAqIFRPRE8gQ0QgYWRkIGNvbW1lbnRzCiAvLyAqLwotLy9AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotLy9wdWJsaWMgY2xhc3MgUmVxdWlyZUJ1bmRsZVJ1bGUgZXh0ZW5kcyBBYnN0cmFjdEJ1bmRsZU1hbmlmZXN0SGVhZGVyUnVsZSB7CisvLyBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorLy8gcHVibGljIGNsYXNzIFJlcXVpcmVCdW5kbGVSdWxlIGV4dGVuZHMgQWJzdHJhY3RCdW5kbGVNYW5pZmVzdEhlYWRlclJ1bGUgewogLy8KLS8vCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUJ1bmRsZVZlcnNpb25BdHRyaWJ1dGUoQnVuZGxlTWFuaWZlc3RIZWFkZXIgaGVhZGVyLAotLy8JCQlNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCwgQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0vLwkJU3RyaW5nIHZlcnNpb25SYW5nZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTl9BVFRSSUJVVEUpOwotLy8JCWlmICh2ZXJzaW9uUmFuZ2UgIT0gbnVsbCAmJiAhVmVyc2lvblV0aWwudmFsaWRhdGVWZXJzaW9uUmFuZ2UodmVyc2lvblJhbmdlKS5pc09LKCkpIHsKLS8vCQkJY29udGV4dC5lcnJvcigiSUxMRUdBTF9CVU5ETEVfVkVSU0lPTiIsCi0vLwkJCQkJQnVuZGxlTWFuaWZlc3RDb3JlTWVzc2FnZXMuQnVuZGxlRXJyb3JSZXBvcnRlcl9JbnZhbGlkRm9ybWF0SW5CdW5kbGVWZXJzaW9uLAotLy8JCQkJCUJ1bmRsZU1hbmlmZXN0VXRpbHMuZ2V0UGFja2FnZUxpbmVOdW1iZXIoY29udGV4dC5nZXRCdW5kbGVNYW5pZmVzdCgpCi0vLwkJCQkJCQkuZ2V0RG9jdW1lbnQoKSwgaGVhZGVyLCBlbGVtZW50KSk7Ci0vLwkJfQotLy8JfQorLy8gcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQnVuZGxlVmVyc2lvbkF0dHJpYnV0ZShCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsCisvLyBNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCwgQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisvLyBTdHJpbmcgdmVyc2lvblJhbmdlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OX0FUVFJJQlVURSk7CisvLyBpZiAodmVyc2lvblJhbmdlICE9IG51bGwgJiYgIVZlcnNpb25VdGlsLnZhbGlkYXRlVmVyc2lvblJhbmdlKHZlcnNpb25SYW5nZSkuaXNPSygpKSB7CisvLyBjb250ZXh0LmVycm9yKCJJTExFR0FMX0JVTkRMRV9WRVJTSU9OIiwKKy8vIEJ1bmRsZU1hbmlmZXN0Q29yZU1lc3NhZ2VzLkJ1bmRsZUVycm9yUmVwb3J0ZXJfSW52YWxpZEZvcm1hdEluQnVuZGxlVmVyc2lvbiwKKy8vIEJ1bmRsZU1hbmlmZXN0VXRpbHMuZ2V0UGFja2FnZUxpbmVOdW1iZXIoY29udGV4dC5nZXRCdW5kbGVNYW5pZmVzdCgpCisvLyAuZ2V0RG9jdW1lbnQoKSwgaGVhZGVyLCBlbGVtZW50KSk7CisvLyB9CisvLyB9CiAvLwotLy8JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUmVzb2x1dGlvbkRpcmVjdGl2ZShCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsIE1hbmlmZXN0RWxlbWVudCBlbGVtZW50LAotLy8JCQlCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLS8vCQlTdHJpbmcgcmVzb2x1dGlvbiA9IGVsZW1lbnQuZ2V0RGlyZWN0aXZlKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSk7Ci0vLwkJaWYgKHJlc29sdXRpb24gIT0gbnVsbCkgewotLy8JCQljb250ZXh0LnZhbGlkYXRlRGlyZWN0aXZlVmFsdWUoaGVhZGVyLCBlbGVtZW50LCBDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUsCi0vLwkJCQkJbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLlJFU09MVVRJT05fTUFOREFUT1JZLCBDb25zdGFudHMuUkVTT0xVVElPTl9PUFRJT05BTCB9KTsKLS8vCQl9Ci0vLwl9CisvLyBwcml2YXRlIHZvaWQgdmFsaWRhdGVSZXNvbHV0aW9uRGlyZWN0aXZlKEJ1bmRsZU1hbmlmZXN0SGVhZGVyIGhlYWRlciwgTWFuaWZlc3RFbGVtZW50IGVsZW1lbnQsCisvLyBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKy8vIFN0cmluZyByZXNvbHV0aW9uID0gZWxlbWVudC5nZXREaXJlY3RpdmUoQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFKTsKKy8vIGlmIChyZXNvbHV0aW9uICE9IG51bGwpIHsKKy8vIGNvbnRleHQudmFsaWRhdGVEaXJlY3RpdmVWYWx1ZShoZWFkZXIsIGVsZW1lbnQsIENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSwKKy8vIG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5SRVNPTFVUSU9OX01BTkRBVE9SWSwgQ29uc3RhbnRzLlJFU09MVVRJT05fT1BUSU9OQUwgfSk7CisvLyB9CisvLyB9CiAvLwotLy8JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVmlzaWJpbGl0eURpcmVjdGl2ZShCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsIE1hbmlmZXN0RWxlbWVudCBlbGVtZW50LAotLy8JCQlCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLS8vCQlTdHJpbmcgdmlzaWJpbGl0eSA9IGVsZW1lbnQuZ2V0RGlyZWN0aXZlKENvbnN0YW50cy5WSVNJQklMSVRZX0RJUkVDVElWRSk7Ci0vLwkJaWYgKHZpc2liaWxpdHkgIT0gbnVsbCkgewotLy8JCQljb250ZXh0LnZhbGlkYXRlRGlyZWN0aXZlVmFsdWUoaGVhZGVyLCBlbGVtZW50LCBDb25zdGFudHMuVklTSUJJTElUWV9ESVJFQ1RJVkUsCi0vLwkJCQkJbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLlZJU0lCSUxJVFlfUFJJVkFURSwgQ29uc3RhbnRzLlZJU0lCSUxJVFlfUkVFWFBPUlQgfSk7Ci0vLwkJfQotLy8JfQorLy8gcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVmlzaWJpbGl0eURpcmVjdGl2ZShCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsIE1hbmlmZXN0RWxlbWVudCBlbGVtZW50LAorLy8gQnVuZGxlTWFuaWZlc3RWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7CisvLyBTdHJpbmcgdmlzaWJpbGl0eSA9IGVsZW1lbnQuZ2V0RGlyZWN0aXZlKENvbnN0YW50cy5WSVNJQklMSVRZX0RJUkVDVElWRSk7CisvLyBpZiAodmlzaWJpbGl0eSAhPSBudWxsKSB7CisvLyBjb250ZXh0LnZhbGlkYXRlRGlyZWN0aXZlVmFsdWUoaGVhZGVyLCBlbGVtZW50LCBDb25zdGFudHMuVklTSUJJTElUWV9ESVJFQ1RJVkUsCisvLyBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuVklTSUJJTElUWV9QUklWQVRFLCBDb25zdGFudHMuVklTSUJJTElUWV9SRUVYUE9SVCB9KTsKKy8vIH0KKy8vIH0KIC8vCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRIZWFkZXJOYW1lKCkgewotLy8JCXJldHVybiBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUgfTsKLS8vCX0KKy8vIEBPdmVycmlkZQorLy8gcHJvdGVjdGVkIFN0cmluZ1tdIGdldEhlYWRlck5hbWUoKSB7CisvLyByZXR1cm4gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFIH07CisvLyB9CiAvLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlcihCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsCi0vLwkJCUJ1bmRsZU1hbmlmZXN0VmFsaWRhdGlvbkNvbnRleHQgY29udGV4dCkgewotLy8JCWZvciAoQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50IGVsZW1lbnQgOiBoZWFkZXIuZ2V0QnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50cygpKSB7Ci0vLwkJCXZhbGlkYXRlQnVuZGxlVmVyc2lvbkF0dHJpYnV0ZShoZWFkZXIsIGVsZW1lbnQuZ2V0TWFuaWZlc3RFbGVtZW50KCksIGNvbnRleHQpOwotLy8JCQl2YWxpZGF0ZVZpc2liaWxpdHlEaXJlY3RpdmUoaGVhZGVyLCBlbGVtZW50LmdldE1hbmlmZXN0RWxlbWVudCgpLCBjb250ZXh0KTsKLS8vCQkJdmFsaWRhdGVSZXNvbHV0aW9uRGlyZWN0aXZlKGhlYWRlciwgZWxlbWVudC5nZXRNYW5pZmVzdEVsZW1lbnQoKSwgY29udGV4dCk7Ci0vLwkJfQotLy8JfQorLy8gQE92ZXJyaWRlCisvLyBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUhlYWRlcihCdW5kbGVNYW5pZmVzdEhlYWRlciBoZWFkZXIsCisvLyBCdW5kbGVNYW5pZmVzdFZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKy8vIGZvciAoQnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50IGVsZW1lbnQgOiBoZWFkZXIuZ2V0QnVuZGxlTWFuaWZlc3RIZWFkZXJFbGVtZW50cygpKSB7CisvLyB2YWxpZGF0ZUJ1bmRsZVZlcnNpb25BdHRyaWJ1dGUoaGVhZGVyLCBlbGVtZW50LmdldE1hbmlmZXN0RWxlbWVudCgpLCBjb250ZXh0KTsKKy8vIHZhbGlkYXRlVmlzaWJpbGl0eURpcmVjdGl2ZShoZWFkZXIsIGVsZW1lbnQuZ2V0TWFuaWZlc3RFbGVtZW50KCksIGNvbnRleHQpOworLy8gdmFsaWRhdGVSZXNvbHV0aW9uRGlyZWN0aXZlKGhlYWRlciwgZWxlbWVudC5nZXRNYW5pZmVzdEVsZW1lbnQoKSwgY29udGV4dCk7CisvLyB9CisvLyB9CiAvLwotLy99CisvLyB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21vZHVsZS9jb3JlL1NlcnZlck1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21vZHVsZS9jb3JlL1NlcnZlck1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlLmphdmEKaW5kZXggZDAyZTYxOS4uMzlkZGFlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tb2R1bGUvY29yZS9TZXJ2ZXJNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbW9kdWxlL2NvcmUvU2VydmVyTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubW9kdWxlLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKQEAgLTIxLDYyICsyMiw2MyBAQAogCiAvKioKICAqIHtAbGluayBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZX0gaW1wbGVtZW50YXRpb24gZm9yIGRtIFNlcnZlciBzcGVjaWZpYyBwcm9qZWN0IHR5cGVzLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAYXV0aG9yIFRlcnJ5IEhvbgogICogQHNpbmNlIDIuMC4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSBleHRlbmRzIE1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlIHsKIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBvYmopLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopIHsKKyAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKKyAgICAgICAgICAgIHJlc291cmNlID0gKChJQWRhcHRhYmxlKSBvYmopLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQogCi0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKSkgewotCQkJCWlmIChtb2R1bGUuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkgewotCQkJCQlyZXR1cm4gbmV3IFNlcnZlck1vZHVsZUFydGlmYWN0KG1vZHVsZSk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhGYWNldENvcmVQbHVnaW4uQlVORExFX0ZBQ0VUX0lEKSkgewotCQkJCWlmIChtb2R1bGUuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkgewotCQkJCQlyZXR1cm4gbmV3IFNlcnZlck1vZHVsZUFydGlmYWN0KG1vZHVsZSk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhGYWNldENvcmVQbHVnaW4uUEFSX0ZBQ0VUX0lEKSkgewotCQkJCWlmIChtb2R1bGUuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkgewotCQkJCQlyZXR1cm4gbmV3IFNlcnZlck1vZHVsZUFydGlmYWN0KG1vZHVsZSk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhGYWNldENvcmVQbHVnaW4uUExBTl9GQUNFVF9JRCkpIHsKLQkJCQlpZiAobW9kdWxlLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpIHsKLQkJCQkJcmV0dXJuIG5ldyBTZXJ2ZXJNb2R1bGVBcnRpZmFjdChtb2R1bGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4ob2JqKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKKyAgICAgICAgICAgIGZvciAoSU1vZHVsZSBtb2R1bGUgOiBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobW9kdWxlLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJNb2R1bGVBcnRpZmFjdChtb2R1bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSU1vZHVsZSBtb2R1bGUgOiBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoRmFjZXRDb3JlUGx1Z2luLkJVTkRMRV9GQUNFVF9JRCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobW9kdWxlLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJNb2R1bGVBcnRpZmFjdChtb2R1bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSU1vZHVsZSBtb2R1bGUgOiBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobW9kdWxlLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJNb2R1bGVBcnRpZmFjdChtb2R1bGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSU1vZHVsZSBtb2R1bGUgOiBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoRmFjZXRDb3JlUGx1Z2luLlBMQU5fRkFDRVRfSUQpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1vZHVsZS5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyTW9kdWxlQXJ0aWZhY3QobW9kdWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG9iaik7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIHtAbGluayBJTW9kdWxlQXJ0aWZhY3R9IGltcGxlbWVudGF0aW9uIGNhcnJ5aW5nIHtAbGluayBJTW9kdWxlfSBpbnN0YW5jZXMuCi0JICovCi0JY2xhc3MgU2VydmVyTW9kdWxlQXJ0aWZhY3QgaW1wbGVtZW50cyBJTW9kdWxlQXJ0aWZhY3QgewotCQlwcml2YXRlIGZpbmFsIElNb2R1bGUgbW9kdWxlOworICAgIC8qKgorICAgICAqIHtAbGluayBJTW9kdWxlQXJ0aWZhY3R9IGltcGxlbWVudGF0aW9uIGNhcnJ5aW5nIHtAbGluayBJTW9kdWxlfSBpbnN0YW5jZXMuCisgICAgICovCisgICAgY2xhc3MgU2VydmVyTW9kdWxlQXJ0aWZhY3QgaW1wbGVtZW50cyBJTW9kdWxlQXJ0aWZhY3QgewogCi0JCXB1YmxpYyBTZXJ2ZXJNb2R1bGVBcnRpZmFjdChJTW9kdWxlIG1vZHVsZSkgewotCQkJdGhpcy5tb2R1bGUgPSBtb2R1bGU7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJTW9kdWxlIG1vZHVsZTsKIAotCQlwdWJsaWMgSU1vZHVsZSBnZXRNb2R1bGUoKSB7Ci0JCQlyZXR1cm4gbW9kdWxlOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgU2VydmVyTW9kdWxlQXJ0aWZhY3QoSU1vZHVsZSBtb2R1bGUpIHsKKyAgICAgICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElNb2R1bGUgZ2V0TW9kdWxlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9kdWxlOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tb2R1bGUvY29yZS9TZXJ2ZXJNb2R1bGVEZWxlZ2F0ZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tb2R1bGUvY29yZS9TZXJ2ZXJNb2R1bGVEZWxlZ2F0ZS5qYXZhCmluZGV4IGIxMzA0ZDEuLjJmM2NmYWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbW9kdWxlL2NvcmUvU2VydmVyTW9kdWxlRGVsZWdhdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21vZHVsZS9jb3JlL1NlcnZlck1vZHVsZURlbGVnYXRlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1vZHVsZS5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTY0LDcgKzY1LDcgQEAKIAogLyoqCiAgKiB7QGxpbmsgUHJvamVjdE1vZHVsZX0gZXh0ZW5zaW9uIHRoYXQga25vd3MgaG93IHRvIGhhbmRsZSBwYXIgYW5kIGJ1bmRsZSBwcm9qZWN0cy4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBUZXJyeSBIb24KICAqIEBzaW5jZSAxLjAuMApAQCAtNzIsNDkwICs3Myw0NzMgQEAKIEBTdXBwcmVzc1dhcm5pbmdzKHsgImRlcHJlY2F0aW9uIiwgInJlc3RyaWN0aW9uIiB9KQogcHVibGljIGNsYXNzIFNlcnZlck1vZHVsZURlbGVnYXRlIGV4dGVuZHMgUHJvamVjdE1vZHVsZSB7CiAKLQkvKiogTWFrZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0xBU1NQQVRIX0VOVFJZX0FUVFJJQlVURSA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUuamR0LmNvcmUudGVzdC5jbGFzc3BhdGhlbnRyeSI7CisgICAgLyoqIE1ha2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTUEFUSF9FTlRSWV9BVFRSSUJVVEUgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmpkdC5jb3JlLnRlc3QuY2xhc3NwYXRoZW50cnkiOwogCi0JcHVibGljIFNlcnZlck1vZHVsZURlbGVnYXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIocHJvamVjdCk7Ci0JfQorICAgIHB1YmxpYyBTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZShJUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHN1cGVyKHByb2plY3QpOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBtb2R1bGVSZWxhdGl2ZVBhdGggPSBQYXRoLkVNUFRZOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBJUGF0aCBtb2R1bGVSZWxhdGl2ZVBhdGggPSBQYXRoLkVNUFRZOwogCi0JCS8vIEhhbmRsZSBzaW1wbGUgY2FzZSBvZiBwcm9qZWN0IGJlaW5nIGEgYnVuZGxlIGZpcnN0Ci0JCWZpbmFsIFNldDxJTW9kdWxlUmVzb3VyY2U+IHJlc291cmNlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PElNb2R1bGVSZXNvdXJjZT4oKTsKLQkJaWYgKGdldE1vZHVsZSgpLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpLmVxdWFscyhGYWNldENvcmVQbHVnaW4uQlVORExFX0ZBQ0VUX0lEKSkgewotCQkJaWYgKEZhY2V0VXRpbHMuaGFzUHJvamVjdEZhY2V0KGdldFByb2plY3QoKSwgRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRCkpIHsKLQkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhnZXRQcm9qZWN0KCkpOwotCQkJCWZvciAoSU1vZHVsZSB3ZWJNb2R1bGUgOiBtb2R1bGVzKSB7Ci0JCQkJCWlmICh3ZWJNb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkuZXF1YWxzKEZhY2V0Q29yZVBsdWdpbi5XRUJfRkFDRVRfSUQpKSB7Ci0JCQkJCQlNb2R1bGVEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IChNb2R1bGVEZWxlZ2F0ZSkgd2ViTW9kdWxlLmxvYWRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKLQkJCQkJCXJlc291cmNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChkZWxlZ2F0ZS5tZW1iZXJzKCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJlc291cmNlcy5hZGRBbGwoZ2V0TWVtYmVycyhnZXRQcm9qZWN0KCksIG1vZHVsZVJlbGF0aXZlUGF0aCkpOwotCQl9Ci0JCS8vIE1vcmUgY29tcGxleCBoYW5kbGluZyBvZiBQQVIgYW5kIG5lc3RlZCBidW5kbGUgcHJvamVjdAotCQllbHNlIGlmIChnZXRNb2R1bGUoKS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKS5lcXVhbHMoRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRCkpIHsKKyAgICAgICAgLy8gSGFuZGxlIHNpbXBsZSBjYXNlIG9mIHByb2plY3QgYmVpbmcgYSBidW5kbGUgZmlyc3QKKyAgICAgICAgZmluYWwgU2V0PElNb2R1bGVSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IExpbmtlZEhhc2hTZXQ8SU1vZHVsZVJlc291cmNlPigpOworICAgICAgICBpZiAoZ2V0TW9kdWxlKCkuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkuZXF1YWxzKEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQpKSB7CisgICAgICAgICAgICBpZiAoRmFjZXRVdGlscy5oYXNQcm9qZWN0RmFjZXQoZ2V0UHJvamVjdCgpLCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKSkgeworICAgICAgICAgICAgICAgIElNb2R1bGVbXSBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICAgICAgZm9yIChJTW9kdWxlIHdlYk1vZHVsZSA6IG1vZHVsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdlYk1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKS5lcXVhbHMoRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZURlbGVnYXRlIGRlbGVnYXRlID0gKE1vZHVsZURlbGVnYXRlKSB3ZWJNb2R1bGUubG9hZEFkYXB0ZXIoTW9kdWxlRGVsZWdhdGUuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KGRlbGVnYXRlLm1lbWJlcnMoKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzb3VyY2VzLmFkZEFsbChnZXRNZW1iZXJzKGdldFByb2plY3QoKSwgbW9kdWxlUmVsYXRpdmVQYXRoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTW9yZSBjb21wbGV4IGhhbmRsaW5nIG9mIFBBUiBhbmQgbmVzdGVkIGJ1bmRsZSBwcm9qZWN0CisgICAgICAgIGVsc2UgaWYgKGdldE1vZHVsZSgpLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpLmVxdWFscyhGYWNldENvcmVQbHVnaW4uUEFSX0ZBQ0VUX0lEKSkgewogCi0JCQkvLyBHZXQgdGhlIE1FVEEtSU5GIGZvbGRlciBvZiB0aGUgUEFSIGZpcnN0Ci0JCQlJUmVzb3VyY2UgbWV0YUluZkZvbGRlciA9IGdldFByb2plY3QoKS5maW5kTWVtYmVyKEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5NQU5JRkVTVF9GT0xERVJfTkFNRSk7Ci0JCQlpZiAobWV0YUluZkZvbGRlciBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQlTdHJpbmcgbW9kdWxlRm9sZGVyTmFtZSA9IEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5NQU5JRkVTVF9GT0xERVJfTkFNRTsKLQkJCQltb2R1bGVSZWxhdGl2ZVBhdGggPSBuZXcgUGF0aChtb2R1bGVGb2xkZXJOYW1lKTsKLQkJCQlNb2R1bGVGb2xkZXIgZm9sZGVyID0gbmV3IE1vZHVsZUZvbGRlcihudWxsLCBtb2R1bGVGb2xkZXJOYW1lLCBQYXRoLkVNUFRZKTsKLQkJCQlmb2xkZXIuc2V0TWVtYmVycyhnZXRNb2R1bGVSZXNvdXJjZXMobW9kdWxlUmVsYXRpdmVQYXRoLCAoSUNvbnRhaW5lcikgbWV0YUluZkZvbGRlcikpOwotCQkJCXJlc291cmNlcy5hZGQoZm9sZGVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQkiQ2Fubm90IGZpbmQgTUVUQS1JTkYvTUFOSUZFU1QuTUYgaW4gcHJvamVjdCBbIiArIGdldFByb2plY3QoKS5nZXROYW1lKCkgKyAiXSIpKTsKLQkJCX0KKyAgICAgICAgICAgIC8vIEdldCB0aGUgTUVUQS1JTkYgZm9sZGVyIG9mIHRoZSBQQVIgZmlyc3QKKyAgICAgICAgICAgIElSZXNvdXJjZSBtZXRhSW5mRm9sZGVyID0gZ2V0UHJvamVjdCgpLmZpbmRNZW1iZXIoQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLk1BTklGRVNUX0ZPTERFUl9OQU1FKTsKKyAgICAgICAgICAgIGlmIChtZXRhSW5mRm9sZGVyIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgeworICAgICAgICAgICAgICAgIFN0cmluZyBtb2R1bGVGb2xkZXJOYW1lID0gQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLk1BTklGRVNUX0ZPTERFUl9OQU1FOworICAgICAgICAgICAgICAgIG1vZHVsZVJlbGF0aXZlUGF0aCA9IG5ldyBQYXRoKG1vZHVsZUZvbGRlck5hbWUpOworICAgICAgICAgICAgICAgIE1vZHVsZUZvbGRlciBmb2xkZXIgPSBuZXcgTW9kdWxlRm9sZGVyKG51bGwsIG1vZHVsZUZvbGRlck5hbWUsIFBhdGguRU1QVFkpOworICAgICAgICAgICAgICAgIGZvbGRlci5zZXRNZW1iZXJzKGdldE1vZHVsZVJlc291cmNlcyhtb2R1bGVSZWxhdGl2ZVBhdGgsIChJQ29udGFpbmVyKSBtZXRhSW5mRm9sZGVyKSk7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChmb2xkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uUExVR0lOX0lELAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGZpbmQgTUVUQS1JTkYvTUFOSUZFU1QuTUYgaW4gcHJvamVjdCBbIiArIGdldFByb2plY3QoKS5nZXROYW1lKCkgKyAiXSIpKTsKKyAgICAgICAgICAgIH0KIAotCQkJLy8gRmluZCBsaW5rZWQgb3IgbmVzdGVkIGphcnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBkZXBsb3ltZW50Ci0JCQlnZXRQcm9qZWN0KCkuYWNjZXB0KG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgeworICAgICAgICAgICAgLy8gRmluZCBsaW5rZWQgb3IgbmVzdGVkIGphcnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBkZXBsb3ltZW50CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuYWNjZXB0KG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewogCi0JCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlICYmIHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoImphciIpKSB7Ci0JCQkJCQlyZXNvdXJjZXMuYWRkKG5ldyBNb2R1bGVGaWxlKChJRmlsZSkgcmVzb3VyY2UsIHJlc291cmNlLmdldE5hbWUoKSwgUGF0aC5FTVBUWSkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0sIElSZXNvdXJjZS5ERVBUSF9PTkUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUgJiYgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygiamFyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5hZGQobmV3IE1vZHVsZUZpbGUoKElGaWxlKSByZXNvdXJjZSwgcmVzb3VyY2UuZ2V0TmFtZSgpLCBQYXRoLkVNUFRZKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgSVJlc291cmNlLkRFUFRIX09ORSwgZmFsc2UpOwogCi0JCQkvLyBJdGVyYXRlIG5lc3RlZCBidW5kbGUgcHJvamVjdHMKLQkJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBnZXRDaGlsZE1vZHVsZXMoKSkgeworICAgICAgICAgICAgLy8gSXRlcmF0ZSBuZXN0ZWQgYnVuZGxlIHByb2plY3RzCisgICAgICAgICAgICBmb3IgKElNb2R1bGUgbW9kdWxlIDogZ2V0Q2hpbGRNb2R1bGVzKCkpIHsKIAotCQkJCS8vIFNwZWNpYWwgaGFuZGxpbmcgb2YgcGFyIG5lc3RlZCB3YXJzIHdpdGggYnVuZGxlIG5hdHVyZQotCQkJCWlmIChGYWNldFV0aWxzLmhhc1Byb2plY3RGYWNldChtb2R1bGUuZ2V0UHJvamVjdCgpLCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKSkgewotCQkJCQltb2R1bGVSZWxhdGl2ZVBhdGggPSBuZXcgUGF0aChtb2R1bGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArICIud2FyIik7Ci0JCQkJCU1vZHVsZURlbGVnYXRlIGRlbGVnYXRlID0gKE1vZHVsZURlbGVnYXRlKSBtb2R1bGUubG9hZEFkYXB0ZXIoTW9kdWxlRGVsZWdhdGUuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgb2YgcGFyIG5lc3RlZCB3YXJzIHdpdGggYnVuZGxlIG5hdHVyZQorICAgICAgICAgICAgICAgIGlmIChGYWNldFV0aWxzLmhhc1Byb2plY3RGYWNldChtb2R1bGUuZ2V0UHJvamVjdCgpLCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKSkgeworICAgICAgICAgICAgICAgICAgICBtb2R1bGVSZWxhdGl2ZVBhdGggPSBuZXcgUGF0aChtb2R1bGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArICIud2FyIik7CisgICAgICAgICAgICAgICAgICAgIE1vZHVsZURlbGVnYXRlIGRlbGVnYXRlID0gKE1vZHVsZURlbGVnYXRlKSBtb2R1bGUubG9hZEFkYXB0ZXIoTW9kdWxlRGVsZWdhdGUuY2xhc3MsIG51bGwpOwogCi0JCQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1lbWJlcnMgPSBkZWxlZ2F0ZS5tZW1iZXJzKCk7Ci0JCQkJCWZvciAoSU1vZHVsZVJlc291cmNlIG1lbWJlciA6IG1lbWJlcnMpIHsKLQkJCQkJCWlmIChtZW1iZXIgaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkgewotCQkJCQkJCXJlc291cmNlcy5hZGQobmV3IFBhck1vZHVsZUZpbGUoKElNb2R1bGVGaWxlKSBtZW1iZXIsIG1vZHVsZVJlbGF0aXZlUGF0aCkpOwotCQkJCQkJfSBlbHNlIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7Ci0JCQkJCQkJcmVzb3VyY2VzLmFkZChuZXcgUGFyTW9kdWxlRm9sZGVyKChJTW9kdWxlRm9sZGVyKSBtZW1iZXIsIG1vZHVsZVJlbGF0aXZlUGF0aCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIEFsbCBvdGhlciBidW5kbGVzIHByb2plY3QgbmVzdGVkIGluIGEgcGFyCi0JCQkJZWxzZSBpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QobW9kdWxlLmdldFByb2plY3QoKSkpIHsKLQkJCQkJU3RyaW5nIG1vZHVsZUZvbGRlck5hbWUgPSBtb2R1bGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArICIuamFyIjsKLQkJCQkJbW9kdWxlUmVsYXRpdmVQYXRoID0gbmV3IFBhdGgobW9kdWxlRm9sZGVyTmFtZSk7Ci0JCQkJCU1vZHVsZUZvbGRlciBmb2xkZXIgPSBuZXcgTW9kdWxlRm9sZGVyKG51bGwsIG1vZHVsZUZvbGRlck5hbWUsIFBhdGguRU1QVFkpOwotCQkJCQlmb2xkZXIuc2V0TWVtYmVycyhnZXRNZW1iZXJzKG1vZHVsZS5nZXRQcm9qZWN0KCksIG1vZHVsZVJlbGF0aXZlUGF0aCkudG9BcnJheSgKLQkJCQkJCQluZXcgSU1vZHVsZVJlc291cmNlWzBdKSk7Ci0JCQkJCXJlc291cmNlcy5hZGQoZm9sZGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaGFuZGxpbmcgZm9yIHBsYW4gcHJvamVjdHMKLQkJZWxzZSBpZiAoZ2V0TW9kdWxlKCkuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkuZXF1YWxzKEZhY2V0Q29yZVBsdWdpbi5QTEFOX0ZBQ0VUX0lEKSkgeworICAgICAgICAgICAgICAgICAgICBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzID0gZGVsZWdhdGUubWVtYmVycygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKElNb2R1bGVSZXNvdXJjZSBtZW1iZXIgOiBtZW1iZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyIGluc3RhbmNlb2YgSU1vZHVsZUZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuYWRkKG5ldyBQYXJNb2R1bGVGaWxlKChJTW9kdWxlRmlsZSkgbWVtYmVyLCBtb2R1bGVSZWxhdGl2ZVBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtYmVyIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5hZGQobmV3IFBhck1vZHVsZUZvbGRlcigoSU1vZHVsZUZvbGRlcikgbWVtYmVyLCBtb2R1bGVSZWxhdGl2ZVBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBBbGwgb3RoZXIgYnVuZGxlcyBwcm9qZWN0IG5lc3RlZCBpbiBhIHBhcgorICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KG1vZHVsZS5nZXRQcm9qZWN0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtb2R1bGVGb2xkZXJOYW1lID0gbW9kdWxlLmdldFByb2plY3QoKS5nZXROYW1lKCkgKyAiLmphciI7CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZVJlbGF0aXZlUGF0aCA9IG5ldyBQYXRoKG1vZHVsZUZvbGRlck5hbWUpOworICAgICAgICAgICAgICAgICAgICBNb2R1bGVGb2xkZXIgZm9sZGVyID0gbmV3IE1vZHVsZUZvbGRlcihudWxsLCBtb2R1bGVGb2xkZXJOYW1lLCBQYXRoLkVNUFRZKTsKKyAgICAgICAgICAgICAgICAgICAgZm9sZGVyLnNldE1lbWJlcnMoZ2V0TWVtYmVycyhtb2R1bGUuZ2V0UHJvamVjdCgpLCBtb2R1bGVSZWxhdGl2ZVBhdGgpLnRvQXJyYXkobmV3IElNb2R1bGVSZXNvdXJjZVswXSkpOworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuYWRkKGZvbGRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGhhbmRsaW5nIGZvciBwbGFuIHByb2plY3RzCisgICAgICAgIGVsc2UgaWYgKGdldE1vZHVsZSgpLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpLmVxdWFscyhGYWNldENvcmVQbHVnaW4uUExBTl9GQUNFVF9JRCkpIHsKIAotCQkJLy8gR2V0IHRoZSBwbGFuIGZpbGUKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGdldE1vZHVsZSgpLmdldElkKCk7Ci0JCQlmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5pbmRleE9mKCc6JykgKyAxKTsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZmlsZU5hbWUpKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiByZXNvdXJjZXMudG9BcnJheShuZXcgSU1vZHVsZVJlc291cmNlW3Jlc291cmNlcy5zaXplKCldKTsKLQkJCX0KKyAgICAgICAgICAgIC8vIEdldCB0aGUgcGxhbiBmaWxlCisgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBnZXRNb2R1bGUoKS5nZXRJZCgpOworICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUuaW5kZXhPZignOicpICsgMSk7CisgICAgICAgICAgICBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGZpbGVOYW1lKSk7CisgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VzLnRvQXJyYXkobmV3IElNb2R1bGVSZXNvdXJjZVtyZXNvdXJjZXMuc2l6ZSgpXSk7CisgICAgICAgICAgICB9CiAKLQkJCU1vZHVsZUZpbGUgcGxhbkZpbGUgPSBuZXcgTW9kdWxlRmlsZShmaWxlLCBmaWxlLmdldE5hbWUoKSwgbW9kdWxlUmVsYXRpdmVQYXRoKTsKLQkJCXJlc291cmNlcy5hZGQocGxhbkZpbGUpOworICAgICAgICAgICAgTW9kdWxlRmlsZSBwbGFuRmlsZSA9IG5ldyBNb2R1bGVGaWxlKGZpbGUsIGZpbGUuZ2V0TmFtZSgpLCBtb2R1bGVSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChwbGFuRmlsZSk7CiAKLQkJCS8vIEl0ZXJhdGUgbmVzdGVkIGJ1bmRsZSBwcm9qZWN0cwotCQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IGdldENoaWxkTW9kdWxlcygpKSB7CisgICAgICAgICAgICAvLyBJdGVyYXRlIG5lc3RlZCBidW5kbGUgcHJvamVjdHMKKyAgICAgICAgICAgIGZvciAoSU1vZHVsZSBtb2R1bGUgOiBnZXRDaGlsZE1vZHVsZXMoKSkgewogCi0JCQkJLy8gU3BlY2lhbCBoYW5kbGluZyBvZiBwYXIgbmVzdGVkIHdhcnMgd2l0aCBidW5kbGUgbmF0dXJlCi0JCQkJaWYgKEZhY2V0VXRpbHMuaGFzUHJvamVjdEZhY2V0KG1vZHVsZS5nZXRQcm9qZWN0KCksIEZhY2V0Q29yZVBsdWdpbi5XRUJfRkFDRVRfSUQpKSB7Ci0JCQkJCW1vZHVsZVJlbGF0aXZlUGF0aCA9IG5ldyBQYXRoKG1vZHVsZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIi53YXIiKTsKLQkJCQkJTW9kdWxlRGVsZWdhdGUgZGVsZWdhdGUgPSAoTW9kdWxlRGVsZWdhdGUpIG1vZHVsZS5sb2FkQWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBvZiBwYXIgbmVzdGVkIHdhcnMgd2l0aCBidW5kbGUgbmF0dXJlCisgICAgICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaGFzUHJvamVjdEZhY2V0KG1vZHVsZS5nZXRQcm9qZWN0KCksIEZhY2V0Q29yZVBsdWdpbi5XRUJfRkFDRVRfSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZVJlbGF0aXZlUGF0aCA9IG5ldyBQYXRoKG1vZHVsZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIi53YXIiKTsKKyAgICAgICAgICAgICAgICAgICAgTW9kdWxlRGVsZWdhdGUgZGVsZWdhdGUgPSAoTW9kdWxlRGVsZWdhdGUpIG1vZHVsZS5sb2FkQWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbnVsbCk7CiAKLQkJCQkJSU1vZHVsZVJlc291cmNlW10gbWVtYmVycyA9IGRlbGVnYXRlLm1lbWJlcnMoKTsKLQkJCQkJZm9yIChJTW9kdWxlUmVzb3VyY2UgbWVtYmVyIDogbWVtYmVycykgewotCQkJCQkJaWYgKG1lbWJlciBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSB7Ci0JCQkJCQkJcmVzb3VyY2VzLmFkZChuZXcgUGFyTW9kdWxlRmlsZSgoSU1vZHVsZUZpbGUpIG1lbWJlciwgbW9kdWxlUmVsYXRpdmVQYXRoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKG1lbWJlciBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKLQkJCQkJCQlyZXNvdXJjZXMuYWRkKG5ldyBQYXJNb2R1bGVGb2xkZXIoKElNb2R1bGVGb2xkZXIpIG1lbWJlciwgbW9kdWxlUmVsYXRpdmVQYXRoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gQWxsIG90aGVyIGJ1bmRsZXMgcHJvamVjdCBuZXN0ZWQgaW4gYSBwYXIKLQkJCQllbHNlIGlmIChGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChtb2R1bGUuZ2V0UHJvamVjdCgpKSkgewotCQkJCQlTdHJpbmcgbW9kdWxlRm9sZGVyTmFtZSA9IG1vZHVsZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIi5qYXIiOwotCQkJCQltb2R1bGVSZWxhdGl2ZVBhdGggPSBuZXcgUGF0aChtb2R1bGVGb2xkZXJOYW1lKTsKLQkJCQkJTW9kdWxlRm9sZGVyIGZvbGRlciA9IG5ldyBNb2R1bGVGb2xkZXIobnVsbCwgbW9kdWxlRm9sZGVyTmFtZSwgUGF0aC5FTVBUWSk7Ci0JCQkJCWZvbGRlci5zZXRNZW1iZXJzKGdldE1lbWJlcnMobW9kdWxlLmdldFByb2plY3QoKSwgbW9kdWxlUmVsYXRpdmVQYXRoKS50b0FycmF5KAotCQkJCQkJCW5ldyBJTW9kdWxlUmVzb3VyY2VbMF0pKTsKLQkJCQkJcmVzb3VyY2VzLmFkZChmb2xkZXIpOwotCQkJCX0gZWxzZSBpZiAoRmFjZXRVdGlscy5pc1BhclByb2plY3QobW9kdWxlLmdldFByb2plY3QoKSkpIHsKLQkJCQkJbW9kdWxlUmVsYXRpdmVQYXRoID0gbmV3IFBhdGgobW9kdWxlLmdldFByb2plY3QoKS5nZXROYW1lKCkgKyAiLnBhciIpOwotCQkJCQlNb2R1bGVEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IChNb2R1bGVEZWxlZ2F0ZSkgbW9kdWxlLmxvYWRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgSU1vZHVsZVJlc291cmNlW10gbWVtYmVycyA9IGRlbGVnYXRlLm1lbWJlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJTW9kdWxlUmVzb3VyY2UgbWVtYmVyIDogbWVtYmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWJlciBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChuZXcgUGFyTW9kdWxlRmlsZSgoSU1vZHVsZUZpbGUpIG1lbWJlciwgbW9kdWxlUmVsYXRpdmVQYXRoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lbWJlciBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuYWRkKG5ldyBQYXJNb2R1bGVGb2xkZXIoKElNb2R1bGVGb2xkZXIpIG1lbWJlciwgbW9kdWxlUmVsYXRpdmVQYXRoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQWxsIG90aGVyIGJ1bmRsZXMgcHJvamVjdCBuZXN0ZWQgaW4gYSBwYXIKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChtb2R1bGUuZ2V0UHJvamVjdCgpKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbW9kdWxlRm9sZGVyTmFtZSA9IG1vZHVsZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIi5qYXIiOworICAgICAgICAgICAgICAgICAgICBtb2R1bGVSZWxhdGl2ZVBhdGggPSBuZXcgUGF0aChtb2R1bGVGb2xkZXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgTW9kdWxlRm9sZGVyIGZvbGRlciA9IG5ldyBNb2R1bGVGb2xkZXIobnVsbCwgbW9kdWxlRm9sZGVyTmFtZSwgUGF0aC5FTVBUWSk7CisgICAgICAgICAgICAgICAgICAgIGZvbGRlci5zZXRNZW1iZXJzKGdldE1lbWJlcnMobW9kdWxlLmdldFByb2plY3QoKSwgbW9kdWxlUmVsYXRpdmVQYXRoKS50b0FycmF5KG5ldyBJTW9kdWxlUmVzb3VyY2VbMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChmb2xkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRmFjZXRVdGlscy5pc1BhclByb2plY3QobW9kdWxlLmdldFByb2plY3QoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlUmVsYXRpdmVQYXRoID0gbmV3IFBhdGgobW9kdWxlLmdldFByb2plY3QoKS5nZXROYW1lKCkgKyAiLnBhciIpOworICAgICAgICAgICAgICAgICAgICBNb2R1bGVEZWxlZ2F0ZSBkZWxlZ2F0ZSA9IChNb2R1bGVEZWxlZ2F0ZSkgbW9kdWxlLmxvYWRBZGFwdGVyKE1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKIAotCQkJCQlJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzID0gZGVsZWdhdGUubWVtYmVycygpOwotCQkJCQlmb3IgKElNb2R1bGVSZXNvdXJjZSBtZW1iZXIgOiBtZW1iZXJzKSB7Ci0JCQkJCQlpZiAobWVtYmVyIGluc3RhbmNlb2YgSU1vZHVsZUZpbGUpIHsKLQkJCQkJCQlyZXNvdXJjZXMuYWRkKG5ldyBQYXJNb2R1bGVGaWxlKChJTW9kdWxlRmlsZSkgbWVtYmVyLCBtb2R1bGVSZWxhdGl2ZVBhdGgpKTsKLQkJCQkJCX0gZWxzZSBpZiAobWVtYmVyIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewotCQkJCQkJCXJlc291cmNlcy5hZGQobmV3IFBhck1vZHVsZUZvbGRlcigoSU1vZHVsZUZvbGRlcikgbWVtYmVyLCBtb2R1bGVSZWxhdGl2ZVBhdGgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgICAgICBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzID0gZGVsZWdhdGUubWVtYmVycygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKElNb2R1bGVSZXNvdXJjZSBtZW1iZXIgOiBtZW1iZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtYmVyIGluc3RhbmNlb2YgSU1vZHVsZUZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuYWRkKG5ldyBQYXJNb2R1bGVGaWxlKChJTW9kdWxlRmlsZSkgbWVtYmVyLCBtb2R1bGVSZWxhdGl2ZVBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtYmVyIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5hZGQobmV3IFBhck1vZHVsZUZvbGRlcigoSU1vZHVsZUZvbGRlcikgbWVtYmVyLCBtb2R1bGVSZWxhdGl2ZVBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXJldHVybiByZXNvdXJjZXMudG9BcnJheShuZXcgSU1vZHVsZVJlc291cmNlW3Jlc291cmNlcy5zaXplKCldKTsKLQl9CisgICAgICAgIHJldHVybiByZXNvdXJjZXMudG9BcnJheShuZXcgSU1vZHVsZVJlc291cmNlW3Jlc291cmNlcy5zaXplKCldKTsKKyAgICB9CiAKLQkvKioKLQkgKiBHZXQgYWxsIHJlc291cmNlcyBmcm9tIHByb2plY3QncyBvdXRwdXQgbG9jYXRpb25zCi0JICovCi0JcHJpdmF0ZSBTZXQ8SU1vZHVsZVJlc291cmNlPiBnZXRNZW1iZXJzKElQcm9qZWN0IHByb2plY3QsIElQYXRoIG1vZHVsZVJlbGF0aXZlUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiwKLQkJCUNvcmVFeGNlcHRpb24gewotCQlTZXQ8SU1vZHVsZVJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgTGlua2VkSGFzaFNldDxJTW9kdWxlUmVzb3VyY2U+KCk7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CisgICAgLyoqCisgICAgICogR2V0IGFsbCByZXNvdXJjZXMgZnJvbSBwcm9qZWN0J3Mgb3V0cHV0IGxvY2F0aW9ucworICAgICAqLworICAgIHByaXZhdGUgU2V0PElNb2R1bGVSZXNvdXJjZT4gZ2V0TWVtYmVycyhJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBtb2R1bGVSZWxhdGl2ZVBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24geworICAgICAgICBTZXQ8SU1vZHVsZVJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgTGlua2VkSGFzaFNldDxJTW9kdWxlUmVzb3VyY2U+KCk7CisgICAgICAgIElXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CiAKLQkJLy8gQWRkIGRlZmF1bHQgb3V0cHV0IGxvY2F0aW9uCi0JCUlSZXNvdXJjZSBkZWZhdWx0QmluRm9sZGVyID0gcm9vdC5maW5kTWVtYmVyKGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCkpOwotCQlpZiAoZGVmYXVsdEJpbkZvbGRlciBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCXJlc291cmNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnZXRNb2R1bGVSZXNvdXJjZXMobW9kdWxlUmVsYXRpdmVQYXRoLCAoSUNvbnRhaW5lcikgZGVmYXVsdEJpbkZvbGRlcikpKTsKLQkJfQorICAgICAgICAvLyBBZGQgZGVmYXVsdCBvdXRwdXQgbG9jYXRpb24KKyAgICAgICAgSVJlc291cmNlIGRlZmF1bHRCaW5Gb2xkZXIgPSByb290LmZpbmRNZW1iZXIoamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKSk7CisgICAgICAgIGlmIChkZWZhdWx0QmluRm9sZGVyIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgeworICAgICAgICAgICAgcmVzb3VyY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KGdldE1vZHVsZVJlc291cmNlcyhtb2R1bGVSZWxhdGl2ZVBhdGgsIChJQ29udGFpbmVyKSBkZWZhdWx0QmluRm9sZGVyKSkpOworICAgICAgICB9CiAKLQkJLy8gQWRkIG91dHB1dCBmb3IgZXZlcnkgc291cmNlIGVudHJ5Ci0JCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogZ2V0U291cmNlQ2xhc3NwYXRoRW50cmllcyhwcm9qZWN0LCBmYWxzZSkpIHsKLQkJCUlSZXNvdXJjZSBiaW5Gb2xkZXIgPSByb290LmZpbmRNZW1iZXIoZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKSk7Ci0JCQlpZiAoYmluRm9sZGVyIGluc3RhbmNlb2YgSUNvbnRhaW5lciAmJiAhKGJpbkZvbGRlciBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSkgewotCQkJCXJlc291cmNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnZXRNb2R1bGVSZXNvdXJjZXMobW9kdWxlUmVsYXRpdmVQYXRoLCAoSUNvbnRhaW5lcikgZGVmYXVsdEJpbkZvbGRlcikpKTsKLQkJCX0KLQkJfQorICAgICAgICAvLyBBZGQgb3V0cHV0IGZvciBldmVyeSBzb3VyY2UgZW50cnkKKyAgICAgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBnZXRTb3VyY2VDbGFzc3BhdGhFbnRyaWVzKHByb2plY3QsIGZhbHNlKSkgeworICAgICAgICAgICAgSVJlc291cmNlIGJpbkZvbGRlciA9IHJvb3QuZmluZE1lbWJlcihlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIGlmIChiaW5Gb2xkZXIgaW5zdGFuY2VvZiBJQ29udGFpbmVyICYmICEoYmluRm9sZGVyIGluc3RhbmNlb2YgSVdvcmtzcGFjZVJvb3QpKSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KGdldE1vZHVsZVJlc291cmNlcyhtb2R1bGVSZWxhdGl2ZVBhdGgsIChJQ29udGFpbmVyKSBkZWZhdWx0QmluRm9sZGVyKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8gQWRkIEJ1bmRsZS1DbGFzc1BhdGggZW50cmllcwotCQlCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5nZXRCdW5kbGVNYW5pZmVzdE1hbmFnZXIoKS5nZXRCdW5kbGVNYW5pZmVzdChqYXZhUHJvamVjdCk7Ci0JCWlmIChtYW5pZmVzdCAhPSBudWxsKSB7Ci0JCQlMaXN0PFN0cmluZz4gYnVuZGxlQ2xhc3NQYXRoRW50cmllcyA9IG1hbmlmZXN0LmdldEJ1bmRsZUNsYXNzcGF0aCgpOwotCQkJaWYgKGJ1bmRsZUNsYXNzUGF0aEVudHJpZXMgIT0gbnVsbCkgewotCQkJCS8vIHJlbW92ZSB0aGUgLiBmb3IgdGhlIGNsYXNzIGZvbGRlciBmcm9tIHRoZSBidW5kbGUgY2xhc3NwYXRoIGVudHJpZXMKLQkJCQlidW5kbGVDbGFzc1BhdGhFbnRyaWVzLnJlbW92ZSgiLiIpOworICAgICAgICAvLyBBZGQgQnVuZGxlLUNsYXNzUGF0aCBlbnRyaWVzCisgICAgICAgIEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmdldEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpLmdldEJ1bmRsZU1hbmlmZXN0KGphdmFQcm9qZWN0KTsKKyAgICAgICAgaWYgKG1hbmlmZXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBidW5kbGVDbGFzc1BhdGhFbnRyaWVzID0gbWFuaWZlc3QuZ2V0QnVuZGxlQ2xhc3NwYXRoKCk7CisgICAgICAgICAgICBpZiAoYnVuZGxlQ2xhc3NQYXRoRW50cmllcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSAuIGZvciB0aGUgY2xhc3MgZm9sZGVyIGZyb20gdGhlIGJ1bmRsZSBjbGFzc3BhdGggZW50cmllcworICAgICAgICAgICAgICAgIGJ1bmRsZUNsYXNzUGF0aEVudHJpZXMucmVtb3ZlKCIuIik7CiAKLQkJCQkvLyBnZXQgYWxsIHJlc291cmNlcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBCdW5kbGUtQ2xhc3NQYXRoIGhlYWRlcgotCQkJCXJlc291cmNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnZXRNb2R1bGVSZXNvdXJjZXMobW9kdWxlUmVsYXRpdmVQYXRoLCBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCksCi0JCQkJCQlidW5kbGVDbGFzc1BhdGhFbnRyaWVzKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQorICAgICAgICAgICAgICAgIC8vIGdldCBhbGwgcmVzb3VyY2VzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIEJ1bmRsZS1DbGFzc1BhdGggaGVhZGVyCisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KGdldE1vZHVsZVJlc291cmNlcyhtb2R1bGVSZWxhdGl2ZVBhdGgsIGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwgYnVuZGxlQ2xhc3NQYXRoRW50cmllcykpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzb3VyY2VzOworICAgIH0KIAotCS8qKgotCSAqIEdldHMgYWxsIHJlc291cmNlcyBvZiB0aGUgZ2l2ZW4gPGNvZGU+Y29udGFpbmVyPC9jb2RlPiBidXQgZmlsdGVycyBhZ2FpbnN0IG5hbWVzIGdpdmVuIGJ5IDxjb2RlPmZpbHRlcnM8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRNb2R1bGVSZXNvdXJjZXMoSVBhdGggcGF0aCwgSUNvbnRhaW5lciBjb250YWluZXIsIExpc3Q8U3RyaW5nPiBmaWx0ZXJzKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBjb250YWluZXIubWVtYmVycygpOwotCQlpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gcmVzb3VyY2VzLmxlbmd0aDsKLQkJCUxpc3Q8SU1vZHVsZVJlc291cmNlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlUmVzb3VyY2U+KHNpemUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyByZWxhdGl2ZVBhdGggPSByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQkJZm9yIChTdHJpbmcgZmlsdGVyIDogZmlsdGVycykgewotCQkJCQkJCWlmIChmaWx0ZXIudHJpbSgpLnN0YXJ0c1dpdGgocmVsYXRpdmVQYXRoKSkgewotCQkJCQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lcjIgPSAoSUNvbnRhaW5lcikgcmVzb3VyY2U7Ci0JCQkJCQkJCU1vZHVsZUZvbGRlciBtZiA9IG5ldyBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlRm9sZGVyKGNvbnRhaW5lcjIsCi0JCQkJCQkJCQkJbmFtZSwgcGF0aCk7Ci0JCQkJCQkJCW1mLnNldE1lbWJlcnMoZ2V0TW9kdWxlUmVzb3VyY2VzKHBhdGguYXBwZW5kKG5hbWUpLCBjb250YWluZXIyLCBmaWx0ZXJzKSk7Ci0JCQkJCQkJCWxpc3QuYWRkKG1mKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJCWZvciAoU3RyaW5nIGZpbHRlciA6IGZpbHRlcnMpIHsKLQkJCQkJCQlpZiAocmVsYXRpdmVQYXRoLmVxdWFscyhmaWx0ZXIudHJpbSgpKSkgewotCQkJCQkJCQlsaXN0LmFkZChuZXcgTW9kdWxlRmlsZSgoSUZpbGUpIHJlc291cmNlLCBuYW1lLCBwYXRoKSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1vZHVsZVJlc291cmNlcyA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbbGlzdC5zaXplKCldOwotCQkJbGlzdC50b0FycmF5KG1vZHVsZVJlc291cmNlcyk7Ci0JCQlyZXR1cm4gbW9kdWxlUmVzb3VyY2VzOwotCQl9Ci0JCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlWzBdOwotCX0KKyAgICAvKioKKyAgICAgKiBHZXRzIGFsbCByZXNvdXJjZXMgb2YgdGhlIGdpdmVuIDxjb2RlPmNvbnRhaW5lcjwvY29kZT4gYnV0IGZpbHRlcnMgYWdhaW5zdCBuYW1lcyBnaXZlbiBieSA8Y29kZT5maWx0ZXJzPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gZ2V0TW9kdWxlUmVzb3VyY2VzKElQYXRoIHBhdGgsIElDb250YWluZXIgY29udGFpbmVyLCBMaXN0PFN0cmluZz4gZmlsdGVycykgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBjb250YWluZXIubWVtYmVycygpOworICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGludCBzaXplID0gcmVzb3VyY2VzLmxlbmd0aDsKKyAgICAgICAgICAgIExpc3Q8SU1vZHVsZVJlc291cmNlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlUmVzb3VyY2U+KHNpemUpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWxhdGl2ZVBhdGggPSByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsdGVyIDogZmlsdGVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIudHJpbSgpLnN0YXJ0c1dpdGgocmVsYXRpdmVQYXRoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lcjIgPSAoSUNvbnRhaW5lcikgcmVzb3VyY2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUZvbGRlciBtZiA9IG5ldyBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlRm9sZGVyKGNvbnRhaW5lcjIsIG5hbWUsIHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZi5zZXRNZW1iZXJzKGdldE1vZHVsZVJlc291cmNlcyhwYXRoLmFwcGVuZChuYW1lKSwgY29udGFpbmVyMiwgZmlsdGVycykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChtZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBmaWx0ZXIgOiBmaWx0ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlUGF0aC5lcXVhbHMoZmlsdGVyLnRyaW0oKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQobmV3IE1vZHVsZUZpbGUoKElGaWxlKSByZXNvdXJjZSwgbmFtZSwgcGF0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJTW9kdWxlUmVzb3VyY2VbXSBtb2R1bGVSZXNvdXJjZXMgPSBuZXcgSU1vZHVsZVJlc291cmNlW2xpc3Quc2l6ZSgpXTsKKyAgICAgICAgICAgIGxpc3QudG9BcnJheShtb2R1bGVSZXNvdXJjZXMpOworICAgICAgICAgICAgcmV0dXJuIG1vZHVsZVJlc291cmNlczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IElNb2R1bGVSZXNvdXJjZVswXTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoKSB7Ci0JCWlmIChGYWNldFV0aWxzLmlzUGFyUHJvamVjdChnZXRQcm9qZWN0KCkpKSB7Ci0JCQlTZXQ8SU1vZHVsZT4gbW9kdWxlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PElNb2R1bGU+KCk7CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKCkgeworICAgICAgICBpZiAoRmFjZXRVdGlscy5pc1BhclByb2plY3QoZ2V0UHJvamVjdCgpKSkgeworICAgICAgICAgICAgU2V0PElNb2R1bGU+IG1vZHVsZXMgPSBuZXcgTGlua2VkSGFzaFNldDxJTW9kdWxlPigpOwogCi0JCQlQYXIgcGFyID0gRmFjZXRVdGlscy5nZXRQYXJEZWZpbml0aW9uKGdldFByb2plY3QoKSk7Ci0JCQlpZiAocGFyICE9IG51bGwgJiYgcGFyLmdldEJ1bmRsZSgpICE9IG51bGwpIHsKLQkJCQlmb3IgKEJ1bmRsZSBidW5kbGUgOiBwYXIuZ2V0QnVuZGxlKCkpIHsKLQkJCQkJSVByb2plY3QgYnVuZGxlUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQotCQkJCQkJCS5nZXRSb290KCkKLQkJCQkJCQkuZ2V0UHJvamVjdChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJCQlpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QoYnVuZGxlUHJvamVjdCkpIHsKLQkJCQkJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoYnVuZGxlUHJvamVjdCkpIHsKLQkJCQkJCQlpZiAobW9kdWxlLmdldElkKCkuZXF1YWxzKAotCQkJCQkJCQkJU2VydmVyTW9kdWxlRmFjdG9yeURlbGVnYXRlLk1PRFVMRV9GQUNUT1JZX0lEICsgIjoiICsgZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArICIkIgotCQkJCQkJCQkJCQkrIGJ1bmRsZVByb2plY3QuZ2V0TmFtZSgpKSkgewotCQkJCQkJCQltb2R1bGVzLmFkZChtb2R1bGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtb2R1bGVzLnRvQXJyYXkobmV3IElNb2R1bGVbbW9kdWxlcy5zaXplKCldKTsKLQkJfSBlbHNlIGlmIChGYWNldFV0aWxzLmlzUGxhblByb2plY3QoZ2V0UHJvamVjdCgpKSkgewotCQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0TW9kdWxlKCkuZ2V0SWQoKTsKLQkJCWZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmluZGV4T2YoJzonKSArIDEpOwotCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlTmFtZSkpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIG5ldyBJTW9kdWxlWzBdOwotCQkJfQorICAgICAgICAgICAgUGFyIHBhciA9IEZhY2V0VXRpbHMuZ2V0UGFyRGVmaW5pdGlvbihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgaWYgKHBhciAhPSBudWxsICYmIHBhci5nZXRCdW5kbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogcGFyLmdldEJ1bmRsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0IGJ1bmRsZVByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KGJ1bmRsZVByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElNb2R1bGUgbW9kdWxlIDogU2VydmVyVXRpbC5nZXRNb2R1bGVzKGJ1bmRsZVByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZHVsZS5nZXRJZCgpLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyTW9kdWxlRmFjdG9yeURlbGVnYXRlLk1PRFVMRV9GQUNUT1JZX0lEICsgIjoiICsgZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArICIkIiArIGJ1bmRsZVByb2plY3QuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLmFkZChtb2R1bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtb2R1bGVzLnRvQXJyYXkobmV3IElNb2R1bGVbbW9kdWxlcy5zaXplKCldKTsKKyAgICAgICAgfSBlbHNlIGlmIChGYWNldFV0aWxzLmlzUGxhblByb2plY3QoZ2V0UHJvamVjdCgpKSkgeworICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZ2V0TW9kdWxlKCkuZ2V0SWQoKTsKKyAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmluZGV4T2YoJzonKSArIDEpOworICAgICAgICAgICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlTmFtZSkpOworICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJTW9kdWxlWzBdOworICAgICAgICAgICAgfQogCi0JCQlyZXR1cm4gZ2V0UGxhbkRlcGVuZGVuY2llcyhmaWxlKS50b0FycmF5KG5ldyBJTW9kdWxlWzBdKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRQbGFuRGVwZW5kZW5jaWVzKGZpbGUpLnRvQXJyYXkobmV3IElNb2R1bGVbMF0pOwogCi0JCX0KLQkJcmV0dXJuIG5ldyBJTW9kdWxlWzBdOwotCX0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IElNb2R1bGVbMF07CisgICAgfQogCi0JLyoqCi0JICoge0BsaW5rIElNb2R1bGVGaWxlfSBpbXBsZW1lbnRhdGlvbiB0aGF0IHdyYXBzIGFub3RoZXIge0BsaW5rIElNb2R1bGVGaWxlfSBidXQgbW92ZXMgdGhlIHJlbGF0aXZlIHBhdGggaW50byBhIHN1YgotCSAqIGRpcmVjdG9yeSBvZiBhIG5lc3RlZCBwYXIgbW9kdWxlLgotCSAqLwotCXN0YXRpYyBjbGFzcyBQYXJNb2R1bGVGaWxlIGltcGxlbWVudHMgSU1vZHVsZUZpbGUgeworICAgIC8qKgorICAgICAqIHtAbGluayBJTW9kdWxlRmlsZX0gaW1wbGVtZW50YXRpb24gdGhhdCB3cmFwcyBhbm90aGVyIHtAbGluayBJTW9kdWxlRmlsZX0gYnV0IG1vdmVzIHRoZSByZWxhdGl2ZSBwYXRoIGludG8gYSBzdWIKKyAgICAgKiBkaXJlY3Rvcnkgb2YgYSBuZXN0ZWQgcGFyIG1vZHVsZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgUGFyTW9kdWxlRmlsZSBpbXBsZW1lbnRzIElNb2R1bGVGaWxlIHsKIAotCQlwcml2YXRlIGZpbmFsIElNb2R1bGVGaWxlIHdyYXBwZWRGaWxlOworICAgICAgICBwcml2YXRlIGZpbmFsIElNb2R1bGVGaWxlIHdyYXBwZWRGaWxlOwogCi0JCXByaXZhdGUgZmluYWwgSVBhdGggbW9kdWxlUGF0aDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJUGF0aCBtb2R1bGVQYXRoOwogCi0JCXB1YmxpYyBQYXJNb2R1bGVGaWxlKElNb2R1bGVGaWxlIHdyYXBwZWRGaWxlLCBJUGF0aCBtb2R1bGVQYXRoKSB7Ci0JCQl0aGlzLndyYXBwZWRGaWxlID0gd3JhcHBlZEZpbGU7Ci0JCQl0aGlzLm1vZHVsZVBhdGggPSBtb2R1bGVQYXRoOwotCQl9CisgICAgICAgIHB1YmxpYyBQYXJNb2R1bGVGaWxlKElNb2R1bGVGaWxlIHdyYXBwZWRGaWxlLCBJUGF0aCBtb2R1bGVQYXRoKSB7CisgICAgICAgICAgICB0aGlzLndyYXBwZWRGaWxlID0gd3JhcHBlZEZpbGU7CisgICAgICAgICAgICB0aGlzLm1vZHVsZVBhdGggPSBtb2R1bGVQYXRoOworICAgICAgICB9CiAKLQkJcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZEZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJfQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBwZWRGaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgSVBhdGggZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkgewotCQkJcmV0dXJuIG1vZHVsZVBhdGguYXBwZW5kKHdyYXBwZWRGaWxlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKTsKLQkJfQorICAgICAgICBwdWJsaWMgSVBhdGggZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9kdWxlUGF0aC5hcHBlbmQodGhpcy53cmFwcGVkRmlsZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZEZpbGUuZ2V0TmFtZSgpOwotCQl9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLndyYXBwZWRGaWxlLmdldE5hbWUoKTsKKyAgICAgICAgfQogCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIHdyYXBwZWRGaWxlLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCX0KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkRmlsZS5nZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gbW9kdWxlUGF0aC5oYXNoQ29kZSgpICogMzcgKyB3cmFwcGVkRmlsZS5oYXNoQ29kZSgpOwotCQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9kdWxlUGF0aC5oYXNoQ29kZSgpICogMzcgKyB0aGlzLndyYXBwZWRGaWxlLmhhc2hDb2RlKCk7CisgICAgICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFBhck1vZHVsZUZpbGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJUGFyTW9kdWxlRmlsZSBvdGhlciA9IChQYXJNb2R1bGVGaWxlKSBvYmo7Ci0JCQlpZiAoIU9iamVjdFV0aWxzLmVxdWFscyhtb2R1bGVQYXRoLCBvdGhlci5tb2R1bGVQYXRoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBPYmplY3RVdGlscy5lcXVhbHMod3JhcHBlZEZpbGUsIG90aGVyLndyYXBwZWRGaWxlKTsKLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFBhck1vZHVsZUZpbGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUGFyTW9kdWxlRmlsZSBvdGhlciA9IChQYXJNb2R1bGVGaWxlKSBvYmo7CisgICAgICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmVxdWFscyh0aGlzLm1vZHVsZVBhdGgsIG90aGVyLm1vZHVsZVBhdGgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9iamVjdFV0aWxzLmVxdWFscyh0aGlzLndyYXBwZWRGaWxlLCBvdGhlci53cmFwcGVkRmlsZSk7CisgICAgICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiTW9kdWxlRmlsZSBbIiArIG1vZHVsZVBhdGggKyAiLyIgKyB3cmFwcGVkRmlsZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSArICIsICIKLQkJCQkJKyB3cmFwcGVkRmlsZS5nZXROYW1lKCkgKyAiLCAiICsgd3JhcHBlZEZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSArICJdIjsKLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiTW9kdWxlRmlsZSBbIiArIHRoaXMubW9kdWxlUGF0aCArICIvIiArIHRoaXMud3JhcHBlZEZpbGUuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkgKyAiLCAiICsgdGhpcy53cmFwcGVkRmlsZS5nZXROYW1lKCkgKyAiLCAiCisgICAgICAgICAgICAgICAgKyB0aGlzLndyYXBwZWRGaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkgKyAiXSI7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiB7QGxpbmsgSU1vZHVsZUZvbGRlcn0gaW1wbGVtZW50YXRpb24gdGhhdCB3cmFwcyBhbm90aGVyIHtAbGluayBJTW9kdWxlRm9sZGVyfSBidXQgbW92ZXMgdGhlIHJlbGF0aXZlIHBhdGggaW50byBhCi0JICogc3ViIGRpcmVjdG9yeSBvZiBhIG5lc3RlZCBwYXIgbW9kdWxlLgotCSAqIAotCSAqIEBzZWUgUGFyTW9kdWxlRm9sZGVyI21lbWJlcnMoKQotCSAqLwotCXN0YXRpYyBjbGFzcyBQYXJNb2R1bGVGb2xkZXIgaW1wbGVtZW50cyBJTW9kdWxlRm9sZGVyIHsKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgSU1vZHVsZUZvbGRlcn0gaW1wbGVtZW50YXRpb24gdGhhdCB3cmFwcyBhbm90aGVyIHtAbGluayBJTW9kdWxlRm9sZGVyfSBidXQgbW92ZXMgdGhlIHJlbGF0aXZlIHBhdGggaW50byBhCisgICAgICogc3ViIGRpcmVjdG9yeSBvZiBhIG5lc3RlZCBwYXIgbW9kdWxlLgorICAgICAqCisgICAgICogQHNlZSBQYXJNb2R1bGVGb2xkZXIjbWVtYmVycygpCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFBhck1vZHVsZUZvbGRlciBpbXBsZW1lbnRzIElNb2R1bGVGb2xkZXIgewogCi0JCXByaXZhdGUgZmluYWwgSU1vZHVsZUZvbGRlciB3cmFwcGVkRm9sZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIElNb2R1bGVGb2xkZXIgd3JhcHBlZEZvbGRlcjsKIAotCQlwcml2YXRlIGZpbmFsIElQYXRoIG1vZHVsZVBhdGg7CisgICAgICAgIHByaXZhdGUgZmluYWwgSVBhdGggbW9kdWxlUGF0aDsKIAotCQlwdWJsaWMgUGFyTW9kdWxlRm9sZGVyKElNb2R1bGVGb2xkZXIgd3JhcHBlZEZvbGRlciwgSVBhdGggbW9kdWxlUGF0aCkgewotCQkJdGhpcy53cmFwcGVkRm9sZGVyID0gd3JhcHBlZEZvbGRlcjsKLQkJCXRoaXMubW9kdWxlUGF0aCA9IG1vZHVsZVBhdGg7Ci0JCX0KKyAgICAgICAgcHVibGljIFBhck1vZHVsZUZvbGRlcihJTW9kdWxlRm9sZGVyIHdyYXBwZWRGb2xkZXIsIElQYXRoIG1vZHVsZVBhdGgpIHsKKyAgICAgICAgICAgIHRoaXMud3JhcHBlZEZvbGRlciA9IHdyYXBwZWRGb2xkZXI7CisgICAgICAgICAgICB0aGlzLm1vZHVsZVBhdGggPSBtb2R1bGVQYXRoOworICAgICAgICB9CiAKLQkJcHVibGljIElNb2R1bGVSZXNvdXJjZVtdIG1lbWJlcnMoKSB7Ci0JCQlTZXQ8SU1vZHVsZVJlc291cmNlPiBtZW1iZXJzID0gbmV3IExpbmtlZEhhc2hTZXQ8SU1vZHVsZVJlc291cmNlPigpOwotCQkJZm9yIChJTW9kdWxlUmVzb3VyY2UgcmVzb3VyY2UgOiB3cmFwcGVkRm9sZGVyLm1lbWJlcnMoKSkgewotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSB7Ci0JCQkJCW1lbWJlcnMuYWRkKG5ldyBQYXJNb2R1bGVGaWxlKChJTW9kdWxlRmlsZSkgcmVzb3VyY2UsIG1vZHVsZVBhdGgpKTsKLQkJCQl9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewotCQkJCQltZW1iZXJzLmFkZChuZXcgUGFyTW9kdWxlRm9sZGVyKChJTW9kdWxlRm9sZGVyKSByZXNvdXJjZSwgbW9kdWxlUGF0aCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtZW1iZXJzLnRvQXJyYXkobmV3IElNb2R1bGVSZXNvdXJjZVttZW1iZXJzLnNpemUoKV0pOwotCQl9CisgICAgICAgIHB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKCkgeworICAgICAgICAgICAgU2V0PElNb2R1bGVSZXNvdXJjZT4gbWVtYmVycyA9IG5ldyBMaW5rZWRIYXNoU2V0PElNb2R1bGVSZXNvdXJjZT4oKTsKKyAgICAgICAgICAgIGZvciAoSU1vZHVsZVJlc291cmNlIHJlc291cmNlIDogdGhpcy53cmFwcGVkRm9sZGVyLm1lbWJlcnMoKSkgeworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWJlcnMuYWRkKG5ldyBQYXJNb2R1bGVGaWxlKChJTW9kdWxlRmlsZSkgcmVzb3VyY2UsIHRoaXMubW9kdWxlUGF0aCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWJlcnMuYWRkKG5ldyBQYXJNb2R1bGVGb2xkZXIoKElNb2R1bGVGb2xkZXIpIHJlc291cmNlLCB0aGlzLm1vZHVsZVBhdGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWVtYmVycy50b0FycmF5KG5ldyBJTW9kdWxlUmVzb3VyY2VbbWVtYmVycy5zaXplKCldKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBJUGF0aCBnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSB7Ci0JCQlyZXR1cm4gbW9kdWxlUGF0aC5hcHBlbmQod3JhcHBlZEZvbGRlci5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSk7Ci0JCX0KKyAgICAgICAgcHVibGljIElQYXRoIGdldE1vZHVsZVJlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm1vZHVsZVBhdGguYXBwZW5kKHRoaXMud3JhcHBlZEZvbGRlci5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZEZvbGRlci5nZXROYW1lKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZEZvbGRlci5nZXROYW1lKCk7CisgICAgICAgIH0KIAotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCXJldHVybiB3cmFwcGVkRm9sZGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCX0KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy53cmFwcGVkRm9sZGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiBtb2R1bGVQYXRoLmhhc2hDb2RlKCkgKiAzNyArIHdyYXBwZWRGb2xkZXIuaGFzaENvZGUoKTsKLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm1vZHVsZVBhdGguaGFzaENvZGUoKSAqIDM3ICsgdGhpcy53cmFwcGVkRm9sZGVyLmhhc2hDb2RlKCk7CisgICAgICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFBhck1vZHVsZUZvbGRlcikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlQYXJNb2R1bGVGb2xkZXIgb3RoZXIgPSAoUGFyTW9kdWxlRm9sZGVyKSBvYmo7Ci0JCQlpZiAoIU9iamVjdFV0aWxzLmVxdWFscyhtb2R1bGVQYXRoLCBvdGhlci5tb2R1bGVQYXRoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBPYmplY3RVdGlscy5lcXVhbHMod3JhcHBlZEZvbGRlciwgb3RoZXIud3JhcHBlZEZvbGRlcik7Ci0JCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQYXJNb2R1bGVGb2xkZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUGFyTW9kdWxlRm9sZGVyIG90aGVyID0gKFBhck1vZHVsZUZvbGRlcikgb2JqOworICAgICAgICAgICAgaWYgKCFPYmplY3RVdGlscy5lcXVhbHModGhpcy5tb2R1bGVQYXRoLCBvdGhlci5tb2R1bGVQYXRoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPYmplY3RVdGlscy5lcXVhbHModGhpcy53cmFwcGVkRm9sZGVyLCBvdGhlci53cmFwcGVkRm9sZGVyKTsKKyAgICAgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJNb2R1bGVGaWxlIFsiICsgbW9kdWxlUGF0aCArICIvIiArIHdyYXBwZWRGb2xkZXIuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkgKyAiLCAiCi0JCQkJCSsgd3JhcHBlZEZvbGRlci5nZXROYW1lKCkgKyAiXSI7Ci0JCX0KLQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJNb2R1bGVGaWxlIFsiICsgdGhpcy5tb2R1bGVQYXRoICsgIi8iICsgdGhpcy53cmFwcGVkRm9sZGVyLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpICsgIiwgIiArIHRoaXMud3JhcHBlZEZvbGRlci5nZXROYW1lKCkgKyAiXSI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIFNldDxJQ2xhc3NwYXRoRW50cnk+IGdldFNvdXJjZUNsYXNzcGF0aEVudHJpZXMoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBvbmx5VGVzdEZvbGRlcnMpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCX0KLQkJU2V0PElDbGFzc3BhdGhFbnRyeT4gZW50cmllcyA9IG5ldyBMaW5rZWRIYXNoU2V0PElDbGFzc3BhdGhFbnRyeT4oKTsKLQkJdHJ5IHsKLQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkpIHsKLQkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQkJaWYgKChvbmx5VGVzdEZvbGRlcnMgJiYgIWlzU291cmNlRm9sZGVyKGVudHJ5LmdldEV4dHJhQXR0cmlidXRlcygpKSkKLQkJCQkJCQl8fCAoIW9ubHlUZXN0Rm9sZGVycyAmJiBpc1NvdXJjZUZvbGRlcihlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSkpKSB7Ci0JCQkJCQllbnRyaWVzLmFkZChlbnRyeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIGVudHJpZXM7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgU2V0PElDbGFzc3BhdGhFbnRyeT4gZ2V0U291cmNlQ2xhc3NwYXRoRW50cmllcyhJUHJvamVjdCBwcm9qZWN0LCBib29sZWFuIG9ubHlUZXN0Rm9sZGVycykgeworICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CisgICAgICAgIGlmIChqYXZhUHJvamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfQorICAgICAgICBTZXQ8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8SUNsYXNzcGF0aEVudHJ5PigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgeworICAgICAgICAgICAgICAgICAgICBpZiAob25seVRlc3RGb2xkZXJzICYmICFpc1NvdXJjZUZvbGRlcihlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFvbmx5VGVzdEZvbGRlcnMgJiYgaXNTb3VyY2VGb2xkZXIoZW50cnkuZ2V0RXh0cmFBdHRyaWJ1dGVzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLmFkZChlbnRyeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVudHJpZXM7CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NvdXJjZUZvbGRlcihJQ2xhc3NwYXRoQXR0cmlidXRlW10gZXh0cmFBdHRyaWJ1dGVzKSB7Ci0JCWZvciAoSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBleHRyYUF0dHJpYnV0ZXMpIHsKLQkJCWlmIChURVNUX0NMQVNTUEFUSF9FTlRSWV9BVFRSSUJVVEUuZXF1YWxzKGF0dHJpYnV0ZS5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuICFCb29sZWFuLnZhbHVlT2YoYXR0cmlidXRlLmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU291cmNlRm9sZGVyKElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBleHRyYUF0dHJpYnV0ZXMpIHsKKyAgICAgICAgZm9yIChJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYnV0ZSA6IGV4dHJhQXR0cmlidXRlcykgeworICAgICAgICAgICAgaWYgKFRFU1RfQ0xBU1NQQVRIX0VOVFJZX0FUVFJJQlVURS5lcXVhbHMoYXR0cmlidXRlLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIUJvb2xlYW4udmFsdWVPZihhdHRyaWJ1dGUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JcHVibGljIFNldDxJTW9kdWxlPiBnZXRQbGFuRGVwZW5kZW5jaWVzKElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCX0KKyAgICBwdWJsaWMgU2V0PElNb2R1bGU+IGdldFBsYW5EZXBlbmRlbmNpZXMoSUZpbGUgZmlsZSkgeworICAgICAgICBpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfQogCi0JCVNldDxJTW9kdWxlPiBtb2R1bGVzID0gbmV3IEhhc2hTZXQ8SU1vZHVsZT4oKTsKKyAgICAgICAgU2V0PElNb2R1bGU+IG1vZHVsZXMgPSBuZXcgSGFzaFNldDxJTW9kdWxlPigpOwogCi0JCXRyeSB7Ci0JCQlEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCURvY3VtZW50IGRvYyA9IGRvY0J1aWxkZXIucGFyc2UoZmlsZS5nZXRDb250ZW50cyh0cnVlKSk7Ci0JCQlOb2RlTGlzdCBhcnRpZmFjdE5vZGVzID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhcnRpZmFjdCIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnRpZmFjdE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlFbGVtZW50IGFydGlmYWN0ID0gKEVsZW1lbnQpIGFydGlmYWN0Tm9kZXMuaXRlbShpKTsKLQkJCQlTdHJpbmcgdHlwZSA9IGFydGlmYWN0LmdldEF0dHJpYnV0ZSgidHlwZSIpOwotCQkJCVN0cmluZyBuYW1lID0gYXJ0aWZhY3QuZ2V0QXR0cmlidXRlKCJuYW1lIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGRvY0J1aWxkZXIucGFyc2UoZmlsZS5nZXRDb250ZW50cyh0cnVlKSk7CisgICAgICAgICAgICBOb2RlTGlzdCBhcnRpZmFjdE5vZGVzID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhcnRpZmFjdCIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnRpZmFjdE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IGFydGlmYWN0ID0gKEVsZW1lbnQpIGFydGlmYWN0Tm9kZXMuaXRlbShpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IGFydGlmYWN0LmdldEF0dHJpYnV0ZSgidHlwZSIpOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gYXJ0aWZhY3QuZ2V0QXR0cmlidXRlKCJuYW1lIik7CiAKLQkJCQlpZiAoImJ1bmRsZSIuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQkJCWZvciAoSVByb2plY3QgY2FuZGlkYXRlIDogcHJvamVjdHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoImJ1bmRsZSIuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSVByb2plY3QgY2FuZGlkYXRlIDogcHJvamVjdHMpIHsKIAotCQkJCQkJaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KGNhbmRpZGF0ZSkKLQkJCQkJCQkJfHwgRmFjZXRVdGlscy5oYXNQcm9qZWN0RmFjZXQoY2FuZGlkYXRlLCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KGNhbmRpZGF0ZSkgfHwgRmFjZXRVdGlscy5oYXNQcm9qZWN0RmFjZXQoY2FuZGlkYXRlLCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKSkgewogCi0JCQkJCQkJQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkKLQkJCQkJCQkJCS5nZXRCdW5kbGVNYW5pZmVzdChKYXZhQ29yZS5jcmVhdGUoY2FuZGlkYXRlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0QnVuZGxlTWFuaWZlc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFDb3JlLmNyZWF0ZShjYW5kaWRhdGUpKTsKIAotCQkJCQkJCWlmICgobWFuaWZlc3QgIT0gbnVsbCAmJiBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSAhPSBudWxsCi0JCQkJCQkJCQkmJiBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKS5nZXRTeW1ib2xpY05hbWUoKSAhPSBudWxsICYmIG1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpCi0JCQkJCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCkKLQkJCQkJCQkJCS5lcXVhbHMobmFtZSkpCi0JCQkJCQkJCQl8fCBjYW5kaWRhdGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCQkJCQlmb3IgKElNb2R1bGUgbW9kdWxlIDogU2VydmVyVXRpbC5nZXRNb2R1bGVzKGNhbmRpZGF0ZSkpIHsKLQkJCQkJCQkJCWlmICghbW9kdWxlLmdldElkKCkuY29udGFpbnMoIiQiKSkgewotCQkJCQkJCQkJCW1vZHVsZXMuYWRkKG1vZHVsZSk7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKCJwYXIiLmVxdWFscyh0eXBlKSkgewotCQkJCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQkJCQlmb3IgKElQcm9qZWN0IGNhbmRpZGF0ZSA6IHByb2plY3RzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hbmlmZXN0ICE9IG51bGwgJiYgbWFuaWZlc3QuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKS5nZXRTeW1ib2xpY05hbWUoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpLmdldFN5bWJvbGljTmFtZSgpLmVxdWFscyhuYW1lKSB8fCBjYW5kaWRhdGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElNb2R1bGUgbW9kdWxlIDogU2VydmVyVXRpbC5nZXRNb2R1bGVzKGNhbmRpZGF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbW9kdWxlLmdldElkKCkuY29udGFpbnMoIiQiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXMuYWRkKG1vZHVsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJwYXIiLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICBJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKElQcm9qZWN0IGNhbmRpZGF0ZSA6IHByb2plY3RzKSB7CiAKLQkJCQkJCWlmIChGYWNldFV0aWxzLmlzUGFyUHJvamVjdChjYW5kaWRhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRmFjZXRVdGlscy5pc1BhclByb2plY3QoY2FuZGlkYXRlKSkgewogCi0JCQkJCQkJaWYgKGNhbmRpZGF0ZS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQkJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoY2FuZGlkYXRlKSkgewotCQkJCQkJCQkJbW9kdWxlcy5hZGQobW9kdWxlKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJQcm9ibGVtIHdoaWxlIGdldHRpbmcgcGxhbiBkZXBlbmRlbmNpZXMuIiwKLQkJCQkJCQlCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uUExVR0lOX0lELCBlKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKLQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAiUHJvYmxlbSB3aGlsZSBnZXR0aW5nIHBsYW4gZGVwZW5kZW5jaWVzLiIsCi0JCQkJCQkJQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLlBMVUdJTl9JRCwgZSkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZShlLCBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uUExVR0lOX0lEKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoCi0JCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIlByb2JsZW0gd2hpbGUgZ2V0dGluZyBwbGFuIGRlcGVuZGVuY2llcy4iLAotCQkJCQkJCUJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5QTFVHSU5fSUQsIGUpKTsKLQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElNb2R1bGUgbW9kdWxlIDogU2VydmVyVXRpbC5nZXRNb2R1bGVzKGNhbmRpZGF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXMuYWRkKG1vZHVsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKKyAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJQcm9ibGVtIHdoaWxlIGdldHRpbmcgcGxhbiBkZXBlbmRlbmNpZXMuIiwgQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLlBMVUdJTl9JRCwgZSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoCisgICAgICAgICAgICAgICAgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAiUHJvYmxlbSB3aGlsZSBnZXR0aW5nIHBsYW4gZGVwZW5kZW5jaWVzLiIsIEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5QTFVHSU5fSUQsIGUpKTsKKyAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoZSwgQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLlBMVUdJTl9JRCk7CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAorICAgICAgICAgICAgICAgIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIlByb2JsZW0gd2hpbGUgZ2V0dGluZyBwbGFuIGRlcGVuZGVuY2llcy4iLCBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uUExVR0lOX0lELCBlKSk7CisgICAgICAgIH0KIAotCQlyZXR1cm4gbW9kdWxlczsKLQl9CisgICAgICAgIHJldHVybiBtb2R1bGVzOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbW9kdWxlL2NvcmUvU2VydmVyTW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21vZHVsZS9jb3JlL1NlcnZlck1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS5qYXZhCmluZGV4IDRiZTU1ODEuLjJmODI0MzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbW9kdWxlL2NvcmUvU2VydmVyTW9kdWxlRmFjdG9yeURlbGVnYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tb2R1bGUvY29yZS9TZXJ2ZXJNb2R1bGVGYWN0b3J5RGVsZWdhdGUuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubW9kdWxlLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMzUsMTE5ICszNiwxMTggQEAKIAogLyoqCiAgKiB7QGxpbmsgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZX0gZXh0ZW5zaW9uIHRoYXQga25vd3MgaG93IHRvIGhhbmRsZSBwYXIgYW5kIGJ1bmRsZSBwcm9qZWN0cy4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZXh0ZW5kcyBQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIHsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9GQUNUT1JZX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLnNlcnZlci5tb2R1bGVmYWN0b3J5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfRkFDVE9SWV9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5zZXJ2ZXIubW9kdWxlZmFjdG9yeSI7CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE1vZHVsZURlbGVnYXRlIGdldE1vZHVsZURlbGVnYXRlKElNb2R1bGUgbW9kdWxlKSB7Ci0JCXJldHVybiBuZXcgU2VydmVyTW9kdWxlRGVsZWdhdGUobW9kdWxlLmdldFByb2plY3QoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTW9kdWxlRGVsZWdhdGUgZ2V0TW9kdWxlRGVsZWdhdGUoSU1vZHVsZSBtb2R1bGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZShtb2R1bGUuZ2V0UHJvamVjdCgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNb2R1bGVbXSBjcmVhdGVNb2R1bGVzKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJZmluYWwgU2V0PElNb2R1bGU+IG1vZHVsZXMgPSBuZXcgSGFzaFNldDxJTW9kdWxlPigpOwotCQlpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkpIHsKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIElNb2R1bGVbXSBjcmVhdGVNb2R1bGVzKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgZmluYWwgU2V0PElNb2R1bGU+IG1vZHVsZXMgPSBuZXcgSGFzaFNldDxJTW9kdWxlPigpOworICAgICAgICBpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkpIHsKIAotCQkJLy8gQWRkIG1vZHVsZSBmb3IgYnVuZGxlIGRlcGxveW1lbnQKLQkJCW1vZHVsZXMuYWRkKGNyZWF0ZU1vZHVsZShwcm9qZWN0LmdldE5hbWUoKSwgcHJvamVjdC5nZXROYW1lKCksIEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQsICIxLjAiLAotCQkJCQlwcm9qZWN0KSk7CisgICAgICAgICAgICAvLyBBZGQgbW9kdWxlIGZvciBidW5kbGUgZGVwbG95bWVudAorICAgICAgICAgICAgbW9kdWxlcy5hZGQoY3JlYXRlTW9kdWxlKHByb2plY3QuZ2V0TmFtZSgpLCBwcm9qZWN0LmdldE5hbWUoKSwgRmFjZXRDb3JlUGx1Z2luLkJVTkRMRV9GQUNFVF9JRCwgIjEuMCIsIHByb2plY3QpKTsKIAotCQkJLy8gQWRkIG1vZHVsZSBmb3IgcGFyIGRlcGxveW1lbnQKLQkJCWZvciAoSVByb2plY3QgcGFyUHJvamVjdCA6IEZhY2V0VXRpbHMuZ2V0UGFyUHJvamVjdHMocHJvamVjdCkpIHsKLQkJCQltb2R1bGVzLmFkZChjcmVhdGVNb2R1bGUocGFyUHJvamVjdC5nZXROYW1lKCkgKyAiJCIgKyBwcm9qZWN0LmdldE5hbWUoKSwgcHJvamVjdC5nZXROYW1lKCksCi0JCQkJCQlGYWNldENvcmVQbHVnaW4uQlVORExFX0ZBQ0VUX0lELCAiMS4wIiwgcHJvamVjdCkpOwotCQkJfQorICAgICAgICAgICAgLy8gQWRkIG1vZHVsZSBmb3IgcGFyIGRlcGxveW1lbnQKKyAgICAgICAgICAgIGZvciAoSVByb2plY3QgcGFyUHJvamVjdCA6IEZhY2V0VXRpbHMuZ2V0UGFyUHJvamVjdHMocHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVzLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW9kdWxlKHBhclByb2plY3QuZ2V0TmFtZSgpICsgIiQiICsgcHJvamVjdC5nZXROYW1lKCksIHByb2plY3QuZ2V0TmFtZSgpLCBGYWNldENvcmVQbHVnaW4uQlVORExFX0ZBQ0VUX0lELCAiMS4wIiwgcHJvamVjdCkpOworICAgICAgICAgICAgfQogCi0JCX0gZWxzZSBpZiAoRmFjZXRVdGlscy5pc1BhclByb2plY3QocHJvamVjdCkpIHsKLQkJCW1vZHVsZXMuYWRkKGNyZWF0ZU1vZHVsZShwcm9qZWN0LmdldE5hbWUoKSwgcHJvamVjdC5nZXROYW1lKCksIEZhY2V0Q29yZVBsdWdpbi5QQVJfRkFDRVRfSUQsICIxLjAiLCBwcm9qZWN0KSk7Ci0JCX0KKyAgICAgICAgfSBlbHNlIGlmIChGYWNldFV0aWxzLmlzUGFyUHJvamVjdChwcm9qZWN0KSkgeworICAgICAgICAgICAgbW9kdWxlcy5hZGQoY3JlYXRlTW9kdWxlKHByb2plY3QuZ2V0TmFtZSgpLCBwcm9qZWN0LmdldE5hbWUoKSwgRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRCwgIjEuMCIsIHByb2plY3QpKTsKKyAgICAgICAgfQogCi0JCS8vIEV2ZXJ5IHByb2plY3QgY2FuIGFsc28gYmUgYSBwbGFuIHByb2plY3QKLQkJaWYgKEZhY2V0VXRpbHMuaXNQbGFuUHJvamVjdChwcm9qZWN0KSkgeworICAgICAgICAvLyBFdmVyeSBwcm9qZWN0IGNhbiBhbHNvIGJlIGEgcGxhbiBwcm9qZWN0CisgICAgICAgIGlmIChGYWNldFV0aWxzLmlzUGxhblByb2plY3QocHJvamVjdCkpIHsKIAotCQkJLy8gQ29sbGVjdCBvdXRwdXQgbG9jYXRpb25zIGlmIGphdmEgcHJvamVjdAotCQkJZmluYWwgU2V0PElQYXRoPiBvdXRwdXRMb2NhdGlvbnMgPSBuZXcgSGFzaFNldDxJUGF0aD4oKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKEZhY2V0VXRpbHMuaGFzTmF0dXJlKHByb2plY3QsIEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKLQkJCQkJSUphdmFQcm9qZWN0IGplID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCQl0cnkgewotCQkJCQkJb3V0cHV0TG9jYXRpb25zLmFkZChqZS5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogamUuZ2V0UmF3Q2xhc3NwYXRoKCkpIHsKLQkJCQkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQkJCQkJaWYgKGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQkJCQkJb3V0cHV0TG9jYXRpb25zLmFkZChlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vc2FmZSB0byBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCQlwcm9qZWN0LmFjY2VwdChuZXcgSVJlc291cmNlVmlzaXRvcigpIHsKKyAgICAgICAgICAgIC8vIENvbGxlY3Qgb3V0cHV0IGxvY2F0aW9ucyBpZiBqYXZhIHByb2plY3QKKyAgICAgICAgICAgIGZpbmFsIFNldDxJUGF0aD4gb3V0cHV0TG9jYXRpb25zID0gbmV3IEhhc2hTZXQ8SVBhdGg+KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChGYWNldFV0aWxzLmhhc05hdHVyZShwcm9qZWN0LCBKYXZhQ29yZS5OQVRVUkVfSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIElKYXZhUHJvamVjdCBqZSA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dExvY2F0aW9ucy5hZGQoamUuZ2V0T3V0cHV0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGplLmdldFJhd0NsYXNzcGF0aCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dExvY2F0aW9ucy5hZGQoZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYWZlIHRvIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByb2plY3QuYWNjZXB0KG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewogCi0JCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUgJiYgcmVzb3VyY2UuZ2V0TmFtZSgpLmVuZHNXaXRoKCIucGxhbiIpKSB7Ci0JCQkJCQkJbW9kdWxlcy5hZGQoY3JlYXRlTW9kdWxlKHJlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgcmVzb3VyY2UuZ2V0UHJvamVjdCgpLmdldE5hbWUoKQotCQkJCQkJCQkJKyAiLyIgKyByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSwKLQkJCQkJCQkJCUZhY2V0Q29yZVBsdWdpbi5QTEFOX0ZBQ0VUX0lELCAiMi4wIiwgcHJvamVjdCkpOwotCQkJCQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJCQlJUGF0aCBwYXRoID0gKChJQ29udGFpbmVyKSByZXNvdXJjZSkuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCQlmb3IgKElQYXRoIG91dHB1dExvY2F0aW9uIDogb3V0cHV0TG9jYXRpb25zKSB7Ci0JCQkJCQkJCWlmIChvdXRwdXRMb2NhdGlvbi5pc1ByZWZpeE9mKHBhdGgpKSB7Ci0JCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBDRCBsb2cgZXhjZXB0aW9uCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZXMudG9BcnJheShuZXcgSU1vZHVsZVttb2R1bGVzLnNpemUoKV0pOwotCX0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSAmJiByZXNvdXJjZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5wbGFuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLmFkZChjcmVhdGVNb2R1bGUocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIi8iICsgcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCksIEZhY2V0Q29yZVBsdWdpbi5QTEFOX0ZBQ0VUX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMi4wIiwgcHJvamVjdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gKChJQ29udGFpbmVyKSByZXNvdXJjZSkuZ2V0RnVsbFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElQYXRoIG91dHB1dExvY2F0aW9uIDogb3V0cHV0TG9jYXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRMb2NhdGlvbi5pc1ByZWZpeE9mKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyBDRCBsb2cgZXhjZXB0aW9uCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1vZHVsZXMudG9BcnJheShuZXcgSU1vZHVsZVttb2R1bGVzLnNpemUoKV0pOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVBhdGhbXSBnZXRMaXN0ZW5lclBhdGhzKCkgewotCQlmaW5hbCBMaXN0PElQYXRoPiBwYXRocyA9IG5ldyBBcnJheUxpc3Q8SVBhdGg+KCk7Ci0JCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBnZXRNb2R1bGVzKCkpIHsKLQkJCWlmIChGYWNldFV0aWxzLmlzUGxhblByb2plY3QobW9kdWxlLmdldFByb2plY3QoKSkpIHsKLQkJCQl0cnkgewotCQkJCQltb2R1bGUuZ2V0UHJvamVjdCgpLmFjY2VwdChuZXcgSVJlc291cmNlVmlzaXRvcigpIHsKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIElQYXRoW10gZ2V0TGlzdGVuZXJQYXRocygpIHsKKyAgICAgICAgZmluYWwgTGlzdDxJUGF0aD4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0PElQYXRoPigpOworICAgICAgICBmb3IgKElNb2R1bGUgbW9kdWxlIDogZ2V0TW9kdWxlcygpKSB7CisgICAgICAgICAgICBpZiAoRmFjZXRVdGlscy5pc1BsYW5Qcm9qZWN0KG1vZHVsZS5nZXRQcm9qZWN0KCkpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmdldFByb2plY3QoKS5hY2NlcHQobmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7CiAKLQkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlICYmIHJlc291cmNlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnBsYW4iKSkgewotCQkJCQkJCQlwYXRocy5hZGQocmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlICYmIHJlc291cmNlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnBsYW4iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRocy5hZGQocmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIH0KIAotCQkJfQotCQl9Ci0JCXBhdGhzLmFkZChuZXcgUGF0aCgiLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnhtbCIpKTsKLQkJcGF0aHMuYWRkKG5ldyBQYXRoKCIucHJvamVjdCIpKTsKLQkJcGF0aHMuYWRkKG5ldyBQYXRoKCIuc2V0dGluZ3MiKSk7Ci0JCXBhdGhzLmFkZChuZXcgUGF0aCgiLmNsYXNzcGF0aCIpKTsKLQkJcmV0dXJuIHBhdGhzLnRvQXJyYXkobmV3IElQYXRoW3BhdGhzLnNpemUoKV0pOwotCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwYXRocy5hZGQobmV3IFBhdGgoIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWwiKSk7CisgICAgICAgIHBhdGhzLmFkZChuZXcgUGF0aCgiLnByb2plY3QiKSk7CisgICAgICAgIHBhdGhzLmFkZChuZXcgUGF0aCgiLnNldHRpbmdzIikpOworICAgICAgICBwYXRocy5hZGQobmV3IFBhdGgoIi5jbGFzc3BhdGgiKSk7CisgICAgICAgIHJldHVybiBwYXRocy50b0FycmF5KG5ldyBJUGF0aFtwYXRocy5zaXplKCldKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9rZXJuZWwvb3NnaS9wcm92aXNpb25pbmcvdG9vbHMvRGVwZW5kZW5jeUxvY2F0b3JWaXJnby5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2tlcm5lbC9vc2dpL3Byb3Zpc2lvbmluZy90b29scy9EZXBlbmRlbmN5TG9jYXRvclZpcmdvLmphdmEKaW5kZXggMGI3NjNhMi4uYTU1YjA4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2tlcm5lbC9vc2dpL3Byb3Zpc2lvbmluZy90b29scy9EZXBlbmRlbmN5TG9jYXRvclZpcmdvLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2tlcm5lbC9vc2dpL3Byb3Zpc2lvbmluZy90b29scy9EZXBlbmRlbmN5TG9jYXRvclZpcmdvLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28ua2VybmVsLm9zZ2kucHJvdmlzaW9uaW5nLnRvb2xzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMjgsMzYgKzI5LDM1IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5TG9jYXRvclZpcmdvIGltcGxlbWVudHMgSURlcGVuZGVuY3lMb2NhdG9yIHsKIAotCXByaXZhdGUgZmluYWwgRGVwZW5kZW5jeUxvY2F0b3IgZGVwZW5kZW5jeUxvY2F0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBEZXBlbmRlbmN5TG9jYXRvciBkZXBlbmRlbmN5TG9jYXRvcjsKIAotCXB1YmxpYyBEZXBlbmRlbmN5TG9jYXRvclZpcmdvKFN0cmluZyBzZXJ2ZXJIb21lUGF0aCwgU3RyaW5nW10gYWRkaXRpb25hbFNlYXJjaFBhdGhzLCBTdHJpbmcgaW5kZXhEaXJlY3RvcnlQYXRoLAotCQkJSmF2YVZlcnNpb24gamF2YVZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFNvbWUgcGxhdGZvcm0gZGVwZW5kZW50IHN0cmluZyBtYXRjaGluZwotCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoUGxhdGZvcm0uT1NfV0lOMzIpKSB7Ci0JCQlzZXJ2ZXJIb21lUGF0aCA9IHNlcnZlckhvbWVQYXRoLnJlcGxhY2UoJy8nLCAnXFwnKTsKLQkJCWluZGV4RGlyZWN0b3J5UGF0aCA9IGluZGV4RGlyZWN0b3J5UGF0aC5yZXBsYWNlKCcvJywgJ1xcJyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZGl0aW9uYWxTZWFyY2hQYXRocy5sZW5ndGg7IGkrKykgewotCQkJCWFkZGl0aW9uYWxTZWFyY2hQYXRoc1tpXSA9IGFkZGl0aW9uYWxTZWFyY2hQYXRoc1tpXS5yZXBsYWNlKCcvJywgJ1xcJyk7Ci0JCQl9Ci0JCX0KLQkJZGVwZW5kZW5jeUxvY2F0b3IgPSBuZXcgRGVwZW5kZW5jeUxvY2F0b3Ioc2VydmVySG9tZVBhdGgsIGFkZGl0aW9uYWxTZWFyY2hQYXRocywgaW5kZXhEaXJlY3RvcnlQYXRoLAotCQkJCW5ldyBOb09wRXZlbnRMb2dnZXIoKSk7Ci0JfQorICAgIHB1YmxpYyBEZXBlbmRlbmN5TG9jYXRvclZpcmdvKFN0cmluZyBzZXJ2ZXJIb21lUGF0aCwgU3RyaW5nW10gYWRkaXRpb25hbFNlYXJjaFBhdGhzLCBTdHJpbmcgaW5kZXhEaXJlY3RvcnlQYXRoLCBKYXZhVmVyc2lvbiBqYXZhVmVyc2lvbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU29tZSBwbGF0Zm9ybSBkZXBlbmRlbnQgc3RyaW5nIG1hdGNoaW5nCisgICAgICAgIGlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5PU19XSU4zMikpIHsKKyAgICAgICAgICAgIHNlcnZlckhvbWVQYXRoID0gc2VydmVySG9tZVBhdGgucmVwbGFjZSgnLycsICdcXCcpOworICAgICAgICAgICAgaW5kZXhEaXJlY3RvcnlQYXRoID0gaW5kZXhEaXJlY3RvcnlQYXRoLnJlcGxhY2UoJy8nLCAnXFwnKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbFNlYXJjaFBhdGhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWRkaXRpb25hbFNlYXJjaFBhdGhzW2ldID0gYWRkaXRpb25hbFNlYXJjaFBhdGhzW2ldLnJlcGxhY2UoJy8nLCAnXFwnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlzLmRlcGVuZGVuY3lMb2NhdG9yID0gbmV3IERlcGVuZGVuY3lMb2NhdG9yKHNlcnZlckhvbWVQYXRoLCBhZGRpdGlvbmFsU2VhcmNoUGF0aHMsIGluZGV4RGlyZWN0b3J5UGF0aCwgbmV3IE5vT3BFdmVudExvZ2dlcigpKTsKKyAgICB9CiAKLQlwdWJsaWMgTWFwPEZpbGUsIExpc3Q8U3RyaW5nPj4gbG9jYXRlRGVwZW5kZW5jaWVzKEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0KSB0aHJvd3MgRGVwZW5kZW5jeUxvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRlcGVuZGVuY3lMb2NhdG9yLmxvY2F0ZURlcGVuZGVuY2llcyhtYW5pZmVzdCk7Ci0JfQorICAgIHB1YmxpYyBNYXA8RmlsZSwgTGlzdDxTdHJpbmc+PiBsb2NhdGVEZXBlbmRlbmNpZXMoQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QpIHRocm93cyBEZXBlbmRlbmN5TG9jYXRpb25FeGNlcHRpb24geworICAgICAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmN5TG9jYXRvci5sb2NhdGVEZXBlbmRlbmNpZXMobWFuaWZlc3QpOworICAgIH0KIAotCXB1YmxpYyBTZXQ8PyBleHRlbmRzIEJ1bmRsZURlZmluaXRpb24+IGdldEJ1bmRsZXMoKSB7Ci0JCXJldHVybiBkZXBlbmRlbmN5TG9jYXRvci5nZXRCdW5kbGVzKCk7Ci0JfQorICAgIHB1YmxpYyBTZXQ8PyBleHRlbmRzIEJ1bmRsZURlZmluaXRpb24+IGdldEJ1bmRsZXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY3lMb2NhdG9yLmdldEJ1bmRsZXMoKTsKKyAgICB9CiAKLQlwdWJsaWMgU2V0PD8gZXh0ZW5kcyBMaWJyYXJ5RGVmaW5pdGlvbj4gZ2V0TGlicmFyaWVzKCkgewotCQlyZXR1cm4gZGVwZW5kZW5jeUxvY2F0b3IuZ2V0TGlicmFyaWVzKCk7Ci0JfQorICAgIHB1YmxpYyBTZXQ8PyBleHRlbmRzIExpYnJhcnlEZWZpbml0aW9uPiBnZXRMaWJyYXJpZXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY3lMb2NhdG9yLmdldExpYnJhcmllcygpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgewotCQlkZXBlbmRlbmN5TG9jYXRvci5zaHV0ZG93bigpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKyAgICAgICAgdGhpcy5kZXBlbmRlbmN5TG9jYXRvci5zaHV0ZG93bigpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2tlcm5lbC9vc2dpL3Byb3Zpc2lvbmluZy90b29scy9Ob09wRXZlbnRMb2dnZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9rZXJuZWwvb3NnaS9wcm92aXNpb25pbmcvdG9vbHMvTm9PcEV2ZW50TG9nZ2VyLmphdmEKaW5kZXggMWRiZTU0ZC4uZTBmYzkzNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2tlcm5lbC9vc2dpL3Byb3Zpc2lvbmluZy90b29scy9Ob09wRXZlbnRMb2dnZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28va2VybmVsL29zZ2kvcHJvdmlzaW9uaW5nL3Rvb2xzL05vT3BFdmVudExvZ2dlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbC5vc2dpLnByb3Zpc2lvbmluZy50b29sczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLm1lZGljLmV2ZW50bG9nLkV2ZW50TG9nZ2VyOwpAQCAtMTYsMjIgKzE3LDIyIEBACiAKIC8qKgogICogTm9PcCB7QGxpbmsgRXZlbnRMb2dnZXJ9IGltcGxlbWVudGF0aW9uCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAyLjEuMQogICovCiBwdWJsaWMgY2xhc3MgTm9PcEV2ZW50TG9nZ2VyIGltcGxlbWVudHMgRXZlbnRMb2dnZXIgewogCi0JcHVibGljIHZvaWQgbG9nKExvZ0V2ZW50IGFyZzAsIE9iamVjdC4uLiBhcmcxKSB7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGxvZyhMb2dFdmVudCBhcmcwLCBPYmplY3QuLi4gYXJnMSkgeworICAgIH0KIAotCXB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgYXJnMCwgTGV2ZWwgYXJnMSwgT2JqZWN0Li4uIGFyZzIpIHsKLQl9CisgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBhcmcwLCBMZXZlbCBhcmcxLCBPYmplY3QuLi4gYXJnMikgeworICAgIH0KIAotCXB1YmxpYyB2b2lkIGxvZyhMb2dFdmVudCBhcmcwLCBUaHJvd2FibGUgYXJnMSwgT2JqZWN0Li4uIGFyZzIpIHsKLQl9CisgICAgcHVibGljIHZvaWQgbG9nKExvZ0V2ZW50IGFyZzAsIFRocm93YWJsZSBhcmcxLCBPYmplY3QuLi4gYXJnMikgeworICAgIH0KIAotCXB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgYXJnMCwgTGV2ZWwgYXJnMSwgVGhyb3dhYmxlIGFyZzIsIE9iamVjdC4uLiBhcmczKSB7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgYXJnMCwgTGV2ZWwgYXJnMSwgVGhyb3dhYmxlIGFyZzIsIE9iamVjdC4uLiBhcmczKSB7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28va2VybmVsL29zZ2kvcHJvdmlzaW9uaW5nL3Rvb2xzL1ByZTM1RGVwZW5kZW5jeUxvY2F0b3JWaXJnby5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2tlcm5lbC9vc2dpL3Byb3Zpc2lvbmluZy90b29scy9QcmUzNURlcGVuZGVuY3lMb2NhdG9yVmlyZ28uamF2YQppbmRleCA0YzQ4YTY3Li5mMDdhNjVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28va2VybmVsL29zZ2kvcHJvdmlzaW9uaW5nL3Rvb2xzL1ByZTM1RGVwZW5kZW5jeUxvY2F0b3JWaXJnby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9rZXJuZWwvb3NnaS9wcm92aXNpb25pbmcvdG9vbHMvUHJlMzVEZXBlbmRlbmN5TG9jYXRvclZpcmdvLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28ua2VybmVsLm9zZ2kucHJvdmlzaW9uaW5nLnRvb2xzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMjcsMzYgKzI4LDM1IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQcmUzNURlcGVuZGVuY3lMb2NhdG9yVmlyZ28gaW1wbGVtZW50cyBJRGVwZW5kZW5jeUxvY2F0b3IgewogCi0JcHJpdmF0ZSBmaW5hbCBQcmUzNURlcGVuZGVuY3lMb2NhdG9yIGRlcGVuZGVuY3lMb2NhdG9yOworICAgIHByaXZhdGUgZmluYWwgUHJlMzVEZXBlbmRlbmN5TG9jYXRvciBkZXBlbmRlbmN5TG9jYXRvcjsKIAotCXB1YmxpYyBQcmUzNURlcGVuZGVuY3lMb2NhdG9yVmlyZ28oU3RyaW5nIHNlcnZlckhvbWVQYXRoLCBTdHJpbmdbXSBhZGRpdGlvbmFsU2VhcmNoUGF0aHMsCi0JCQlTdHJpbmcgaW5kZXhEaXJlY3RvcnlQYXRoLCBKYXZhVmVyc2lvbiBqYXZhVmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gU29tZSBwbGF0Zm9ybSBkZXBlbmRlbnQgc3RyaW5nIG1hdGNoaW5nCi0JCWlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5PU19XSU4zMikpIHsKLQkJCXNlcnZlckhvbWVQYXRoID0gc2VydmVySG9tZVBhdGgucmVwbGFjZSgnLycsICdcXCcpOwotCQkJaW5kZXhEaXJlY3RvcnlQYXRoID0gaW5kZXhEaXJlY3RvcnlQYXRoLnJlcGxhY2UoJy8nLCAnXFwnKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbFNlYXJjaFBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWRkaXRpb25hbFNlYXJjaFBhdGhzW2ldID0gYWRkaXRpb25hbFNlYXJjaFBhdGhzW2ldLnJlcGxhY2UoJy8nLCAnXFwnKTsKLQkJCX0KLQkJfQotCQlkZXBlbmRlbmN5TG9jYXRvciA9IG5ldyBQcmUzNURlcGVuZGVuY3lMb2NhdG9yKHNlcnZlckhvbWVQYXRoLCBhZGRpdGlvbmFsU2VhcmNoUGF0aHMsIGluZGV4RGlyZWN0b3J5UGF0aCwKLQkJCQluZXcgTm9PcEV2ZW50TG9nZ2VyKCkpOwotCX0KKyAgICBwdWJsaWMgUHJlMzVEZXBlbmRlbmN5TG9jYXRvclZpcmdvKFN0cmluZyBzZXJ2ZXJIb21lUGF0aCwgU3RyaW5nW10gYWRkaXRpb25hbFNlYXJjaFBhdGhzLCBTdHJpbmcgaW5kZXhEaXJlY3RvcnlQYXRoLCBKYXZhVmVyc2lvbiBqYXZhVmVyc2lvbikKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU29tZSBwbGF0Zm9ybSBkZXBlbmRlbnQgc3RyaW5nIG1hdGNoaW5nCisgICAgICAgIGlmIChQbGF0Zm9ybS5nZXRPUygpLmVxdWFscyhQbGF0Zm9ybS5PU19XSU4zMikpIHsKKyAgICAgICAgICAgIHNlcnZlckhvbWVQYXRoID0gc2VydmVySG9tZVBhdGgucmVwbGFjZSgnLycsICdcXCcpOworICAgICAgICAgICAgaW5kZXhEaXJlY3RvcnlQYXRoID0gaW5kZXhEaXJlY3RvcnlQYXRoLnJlcGxhY2UoJy8nLCAnXFwnKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbFNlYXJjaFBhdGhzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYWRkaXRpb25hbFNlYXJjaFBhdGhzW2ldID0gYWRkaXRpb25hbFNlYXJjaFBhdGhzW2ldLnJlcGxhY2UoJy8nLCAnXFwnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlzLmRlcGVuZGVuY3lMb2NhdG9yID0gbmV3IFByZTM1RGVwZW5kZW5jeUxvY2F0b3Ioc2VydmVySG9tZVBhdGgsIGFkZGl0aW9uYWxTZWFyY2hQYXRocywgaW5kZXhEaXJlY3RvcnlQYXRoLCBuZXcgTm9PcEV2ZW50TG9nZ2VyKCkpOworICAgIH0KIAotCXB1YmxpYyBNYXA8RmlsZSwgTGlzdDxTdHJpbmc+PiBsb2NhdGVEZXBlbmRlbmNpZXMoQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QpIHRocm93cyBEZXBlbmRlbmN5TG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZGVwZW5kZW5jeUxvY2F0b3IubG9jYXRlRGVwZW5kZW5jaWVzKG1hbmlmZXN0KTsKLQl9CisgICAgcHVibGljIE1hcDxGaWxlLCBMaXN0PFN0cmluZz4+IGxvY2F0ZURlcGVuZGVuY2llcyhCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdCkgdGhyb3dzIERlcGVuZGVuY3lMb2NhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY3lMb2NhdG9yLmxvY2F0ZURlcGVuZGVuY2llcyhtYW5pZmVzdCk7CisgICAgfQogCi0JcHVibGljIFNldDw/IGV4dGVuZHMgQnVuZGxlRGVmaW5pdGlvbj4gZ2V0QnVuZGxlcygpIHsKLQkJcmV0dXJuIGRlcGVuZGVuY3lMb2NhdG9yLmdldEJ1bmRsZXMoKTsKLQl9CisgICAgcHVibGljIFNldDw/IGV4dGVuZHMgQnVuZGxlRGVmaW5pdGlvbj4gZ2V0QnVuZGxlcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGVwZW5kZW5jeUxvY2F0b3IuZ2V0QnVuZGxlcygpOworICAgIH0KIAotCXB1YmxpYyBTZXQ8PyBleHRlbmRzIExpYnJhcnlEZWZpbml0aW9uPiBnZXRMaWJyYXJpZXMoKSB7Ci0JCXJldHVybiBkZXBlbmRlbmN5TG9jYXRvci5nZXRMaWJyYXJpZXMoKTsKLQl9CisgICAgcHVibGljIFNldDw/IGV4dGVuZHMgTGlicmFyeURlZmluaXRpb24+IGdldExpYnJhcmllcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGVwZW5kZW5jeUxvY2F0b3IuZ2V0TGlicmFyaWVzKCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWRlcGVuZGVuY3lMb2NhdG9yLnNodXRkb3duKCk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICB0aGlzLmRlcGVuZGVuY3lMb2NhdG9yLnNodXRkb3duKCk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmVkaXQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5lZGl0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCBiYmFjYTZkLi5kNDFlZTlkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmVkaXQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuZWRpdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTEsMTMgKzEsNCBAQAotI1dlZCBNYXIgMDIgMTY6MDA6MDYgUFNUIDIwMTEKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQpAQCAtODIsMzUgKzczLDM3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249NDgKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnk9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCkBAIC0xMjEsMzAgKzExNCwzMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbGFtYmRhX2JvZHk9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lcz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xMjAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZGlzYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvZmYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5lbmFibGluZ190YWc9QGZvcm1hdHRlclw6b24KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCkBAIC0xNTgsNyArMTUyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkPWluc2VydApAQCAtMTY2LDEwICsxNjAsMTEgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZW1iZXI9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWw9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfdHlwZV9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydApAQCAtMjE3LDYgKzIxMiw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0yMzUsMTIgKzIzMSwxNCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CkBAIC0yNjQsNiArMjYyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0CkBAIC0yOTEsNiArMjkwLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0zMTksNiArMzE5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3RyeT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydApAQCAtMzI4LDYgKzMyOSw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0zNDMsMTUgKzM0NSwxNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTIwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj1zcGFjZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX29uX29mZl90YWdzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YUZvcm1hdHRlcj1vcmcuZWNsaXBzZS5qZHQuY29yZS5kZWZhdWx0SmF2YUZvcm1hdHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5lZGl0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmVkaXQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwppbmRleCA3ZTdmZTczLi4xNWIzZmRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmVkaXQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmVkaXQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMSwxMyArMSw2NyBAQAorY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbWV0aG9kcz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zX2ludGVyZmFjZV9tZXRob2RzPXRydWUKK2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X2Z1bmN0aW9uYWxfaW50ZXJmYWNlcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCitjbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlX2NoYW5nZXNfb25seT1mYWxzZQorY2xlYW51cC5pbnNlcnRfaW5mZXJyZWRfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV9yZWR1bmRhbnRfdHlwZV9hcmd1bWVudHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Fub255bW91c19jbGFzc19jcmVhdGlvbj1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPXRydWUKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9sYW1iZGE9dHJ1ZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3R5cGVfYXJndW1lbnRzPWZhbHNlCitjbGVhbnVwX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIENsZWFuIFVwCiBjbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIGVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X015bHluIGJhc2VkIG9uIEVjbGlwc2UKK2Zvcm1hdHRlcl9wcm9maWxlPV9WaXJnbyBXZWIgU2VydmVyIC0gQ29kZSBGb3JtYXR0ZXIKIGZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEyCiBpbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKLW9yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5rZXl3b3JkdGhpcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LnVpLm92ZXJyaWRlYW5ub3RhdGlvbj10cnVlCiBzcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKIHNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQogc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmVkaXQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvcHJvdmlkZXIvQnVuZGxlSXRlbVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmVkaXQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvcHJvdmlkZXIvQnVuZGxlSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggOWJiODU0OC4uMzBiODVmOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5lZGl0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL3Byb3ZpZGVyL0J1bmRsZUl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuZWRpdC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9wcm92aWRlci9CdW5kbGVJdGVtUHJvdmlkZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLnByb3ZpZGVyOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC0zMiwxMDkgKzMzLDEwNyBAQAogLyoqCiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuQnVuZGxlfSBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KICAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAorICoKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIEJ1bmRsZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJ1bmRsZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQorcHVibGljIGNsYXNzIEJ1bmRsZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKKyAgICBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKIAotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOworICAgIC8qKgorICAgICAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgeworICAgICAgICBzdXBlcihhZGFwdGVyRmFjdG9yeSk7CisgICAgfQogCi0JCQlhZGRTeW1ib2xpY05hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQorICAgIC8qKgorICAgICAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIGlmICh0aGlzLml0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKKyAgICAgICAgICAgIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKIAotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTeW1ib2xpYyBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTeW1ib2xpY05hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQnVuZGxlX3N5bWJvbGljTmFtZV9mZWF0dXJlIiksCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CdW5kbGVfc3ltYm9saWNOYW1lX2ZlYXR1cmUiLCAiX1VJX0J1bmRsZV90eXBlIiksCi0JCQkJUGFyUGFja2FnZS5MaXRlcmFscy5CVU5ETEVfX1NZTUJPTElDX05BTUUsIHRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9CisgICAgICAgICAgICBhZGRTeW1ib2xpY05hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5pdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKyAgICB9CiAKLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQnVuZGxlLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQnVuZGxlIikpOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3ltYm9saWMgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTeW1ib2xpY05hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeworICAgICAgICB0aGlzLml0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgdGhpcy5hZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCisgICAgICAgICAgICBnZXRSZXNvdXJjZUxvY2F0b3IoKSwgZ2V0U3RyaW5nKCJfVUlfQnVuZGxlX3N5bWJvbGljTmFtZV9mZWF0dXJlIiksCisgICAgICAgICAgICBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0J1bmRsZV9zeW1ib2xpY05hbWVfZmVhdHVyZSIsICJfVUlfQnVuZGxlX3R5cGUiKSwKKyAgICAgICAgICAgIFBhclBhY2thZ2UuTGl0ZXJhbHMuQlVORExFX19TWU1CT0xJQ19OQU1FLCB0cnVlLCBmYWxzZSwgZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOworICAgIH0KIAotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEJ1bmRsZSkgb2JqZWN0KS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0J1bmRsZV90eXBlIikgOiBnZXRTdHJpbmcoIl9VSV9CdW5kbGVfdHlwZSIpICsgIiAiCi0JCQkJKyBsYWJlbDsKLQl9CisgICAgLyoqCisgICAgICogVGhpcyByZXR1cm5zIEJ1bmRsZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeworICAgICAgICByZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQnVuZGxlIikpOworICAgIH0KIAotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQgY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nCi0JICogYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOworICAgIC8qKgorICAgICAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIFN0cmluZyBsYWJlbCA9ICgoQnVuZGxlKSBvYmplY3QpLmdldFN5bWJvbGljTmFtZSgpOworICAgICAgICByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQnVuZGxlX3R5cGUiKSA6IGdldFN0cmluZygiX1VJX0J1bmRsZV90eXBlIikgKyAiICIgKyBsYWJlbDsKKyAgICB9CiAKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEJ1bmRsZS5jbGFzcykpIHsKLQkJY2FzZSBQYXJQYWNrYWdlLkJVTkRMRV9fU1lNQk9MSUNfTkFNRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQorICAgIC8qKgorICAgICAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQgY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nCisgICAgICogYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisgICAgICogLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CisgICAgICAgIHVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7CiAKLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQKLQkgKiB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQorICAgICAgICBzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQnVuZGxlLmNsYXNzKSkgeworICAgICAgICAgICAgY2FzZSBQYXJQYWNrYWdlLkJVTkRMRV9fU1lNQk9MSUNfTkFNRToKKyAgICAgICAgICAgICAgICBmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gUGFyRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9CisgICAgLyoqCisgICAgICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkCisgICAgICogdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIHN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworICAgICAgICByZXR1cm4gUGFyRWRpdFBsdWdpbi5JTlNUQU5DRTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuZWRpdC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9wcm92aWRlci9QYXJFZGl0UGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmVkaXQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvcHJvdmlkZXIvUGFyRWRpdFBsdWdpbi5qYXZhCmluZGV4IGI1MDE2OWEuLjhhOWVkY2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuZWRpdC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9wcm92aWRlci9QYXJFZGl0UGx1Z2luLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5lZGl0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL3Byb3ZpZGVyL1BhckVkaXRQbHVnaW4uamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLnByb3ZpZGVyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5FTUZQbHVnaW47CkBAIC0xNSw3MiArMTYsNzQgQEAKIAogLyoqCiAgKiBUaGlzIGlzIHRoZSBjZW50cmFsIHNpbmdsZXRvbiBmb3IgdGhlIFBhciBlZGl0IHBsdWdpbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKKyAqCiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBQYXJFZGl0UGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsKLQkvKioKLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhckVkaXRQbHVnaW4gSU5TVEFOQ0UgPSBuZXcgUGFyRWRpdFBsdWdpbigpOwogCi0JLyoqCi0JICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gcGx1Z2luOworICAgIC8qKgorICAgICAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXJFZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IFBhckVkaXRQbHVnaW4oKTsKIAotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyRWRpdFBsdWdpbigpIHsKLQkJc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKLQl9CisgICAgLyoqCisgICAgICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyRWRpdFBsdWdpbigpIHsKKyAgICAgICAgc3VwZXIobmV3IFJlc291cmNlTG9jYXRvcltdIHt9KTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2UgcGx1Z2luLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRQbHVnaW5SZXNvdXJjZUxvY2F0b3IoKSB7CisgICAgICAgIHJldHVybiBwbHVnaW47CisgICAgfQogCi0JLyoqCi0JICogVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWNsaXBzZSA8Yj5QbHVnaW48L2I+LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsZW1lbnRhdGlvbiBleHRlbmRzIEVjbGlwc2VQbHVnaW4gewotCQkvKioKLQkJICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIAotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgSW1wbGVtZW50YXRpb24oKSB7Ci0JCQlzdXBlcigpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKKyAgICAgICAgcmV0dXJuIHBsdWdpbjsKKyAgICB9CiAKLQkJCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuCi0JCQkvLwotCQkJcGx1Z2luID0gdGhpczsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbjwvYj4uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGVtZW50YXRpb24gZXh0ZW5kcyBFY2xpcHNlUGx1Z2luIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICAgICAqCisgICAgICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJbXBsZW1lbnRhdGlvbigpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisKKyAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgcGx1Z2luID0gdGhpczsKKyAgICAgICAgfQorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5lZGl0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL3Byb3ZpZGVyL1Bhckl0ZW1Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5lZGl0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL3Byb3ZpZGVyL1Bhckl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IGZhOTc3NmUuLjI4NzNiMDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuZWRpdC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9wcm92aWRlci9QYXJJdGVtUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmVkaXQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvcHJvdmlkZXIvUGFySXRlbVByb3ZpZGVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5wcm92aWRlcjsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpAQCAtMzIsMTI1ICszMywxMjUgQEAKIC8qKgogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLlBhcn0gb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCiAgKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKKyAqCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBQYXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KK3B1YmxpYyBjbGFzcyBQYXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCisgICAgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CiAKLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBQYXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKKyAgICAgICAgc3VwZXIoYWRhcHRlckZhY3RvcnkpOworICAgIH0KIAotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9CisgICAgLyoqCisgICAgICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKHRoaXMuaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwogCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFBhclBhY2thZ2UuTGl0ZXJhbHMuUEFSX19CVU5ETEUpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5pdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKKyAgICB9CiAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgorICAgIC8qKgorICAgICAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCisgICAgICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCisgICAgICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKyAgICAgKiBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOworICAgICAgICAgICAgdGhpcy5jaGlsZHJlbkZlYXR1cmVzLmFkZChQYXJQYWNrYWdlLkxpdGVyYWxzLlBBUl9fQlVORExFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbkZlYXR1cmVzOworICAgIH0KIAotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgorICAgICAgICAvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCiAKLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUGFyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUGFyIikpOwotCX0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKKyAgICB9CiAKLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX1Bhcl90eXBlIik7Ci0JfQorICAgIC8qKgorICAgICAqIFRoaXMgcmV0dXJucyBQYXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BhciIpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZwotCSAqIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKKyAgICAvKioKKyAgICAgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeworICAgICAgICByZXR1cm4gZ2V0U3RyaW5nKCJfVUlfUGFyX3R5cGUiKTsKKyAgICB9CiAKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBhci5jbGFzcykpIHsKLQkJY2FzZSBQYXJQYWNrYWdlLlBBUl9fQlVORExFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9CisgICAgLyoqCisgICAgICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZCBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcKKyAgICAgKiBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKKyAgICAgKiAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKIAotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZAotCSAqIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKKyAgICAgICAgc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBhci5jbGFzcykpIHsKKyAgICAgICAgICAgIGNhc2UgUGFyUGFja2FnZS5QQVJfX0JVTkRMRToKKyAgICAgICAgICAgICAgICBmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKKyAgICB9CiAKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoUGFyUGFja2FnZS5MaXRlcmFscy5QQVJfX0JVTkRMRSwKLQkJCQlQYXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCdW5kbGUoKSkpOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQKKyAgICAgKiB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIAotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBQYXJFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KKyAgICAgICAgbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoUGFyUGFja2FnZS5MaXRlcmFscy5QQVJfX0JVTkRMRSwgUGFyRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQnVuZGxlKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisgICAgICAgIHJldHVybiBQYXJFZGl0UGx1Z2luLklOU1RBTkNFOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5lZGl0L3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL3Byb3ZpZGVyL1Bhckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmVkaXQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvcHJvdmlkZXIvUGFySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCBjZmFiYzhmLi40YmFmYzA3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmVkaXQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvcHJvdmlkZXIvUGFySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmVkaXQvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvcHJvdmlkZXIvUGFySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLnByb3ZpZGVyOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTM0LDE5NCArMzUsMTk0IEBACiAgKiBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiBUaGUgYWRhcHRlcnMKICAqIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4gTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLiA8IS0tCiAgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKKyAqCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBQYXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFBhckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwKLQkJSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OworcHVibGljIGNsYXNzIFBhckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgUGFyQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsKIAotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorICAgICAqIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKIAotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisgICAgICogZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKIAotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LiA8IS0tCisgICAgICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKIAotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5QYXJ9IGluc3RhbmNlcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhckl0ZW1Qcm92aWRlciBwYXJJdGVtUHJvdmlkZXI7CisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7CisgICAgICAgIHRoaXMuc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgdGhpcy5zdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgdGhpcy5zdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgdGhpcy5zdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgdGhpcy5zdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7CisgICAgfQogCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuUGFyfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFyQWRhcHRlcigpIHsKLQkJaWYgKHBhckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwYXJJdGVtUHJvdmlkZXIgPSBuZXcgUGFySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9CisgICAgLyoqCisgICAgICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLlBhcn0gaW5zdGFuY2VzLiA8IS0tCisgICAgICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBQYXJJdGVtUHJvdmlkZXIgcGFySXRlbVByb3ZpZGVyOwogCi0JCXJldHVybiBwYXJJdGVtUHJvdmlkZXI7Ci0JfQorICAgIC8qKgorICAgICAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLlBhcn0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisgICAgICogLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFyQWRhcHRlcigpIHsKKyAgICAgICAgaWYgKHRoaXMucGFySXRlbVByb3ZpZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucGFySXRlbVByb3ZpZGVyID0gbmV3IFBhckl0ZW1Qcm92aWRlcih0aGlzKTsKKyAgICAgICAgfQogCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLkJ1bmRsZX0gaW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnVuZGxlSXRlbVByb3ZpZGVyIGJ1bmRsZUl0ZW1Qcm92aWRlcjsKKyAgICAgICAgcmV0dXJuIHRoaXMucGFySXRlbVByb3ZpZGVyOworICAgIH0KIAotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLkJ1bmRsZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJ1bmRsZUFkYXB0ZXIoKSB7Ci0JCWlmIChidW5kbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJYnVuZGxlSXRlbVByb3ZpZGVyID0gbmV3IEJ1bmRsZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQorICAgIC8qKgorICAgICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5CdW5kbGV9IGluc3RhbmNlcy4gPCEtLQorICAgICAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQnVuZGxlSXRlbVByb3ZpZGVyIGJ1bmRsZUl0ZW1Qcm92aWRlcjsKIAotCQlyZXR1cm4gYnVuZGxlSXRlbVByb3ZpZGVyOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5CdW5kbGV9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYworICAgICAqIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJ1bmRsZUFkYXB0ZXIoKSB7CisgICAgICAgIGlmICh0aGlzLmJ1bmRsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmJ1bmRsZUl0ZW1Qcm92aWRlciA9IG5ldyBCdW5kbGVJdGVtUHJvdmlkZXIodGhpcyk7CisgICAgICAgIH0KIAotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KKyAgICAgICAgcmV0dXJuIHRoaXMuYnVuZGxlSXRlbVByb3ZpZGVyOworICAgIH0KIAotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0JfQorICAgIC8qKgorICAgICAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiB0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOworICAgIH0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgeworICAgICAgICB0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7CisgICAgfQogCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOwotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzczw/PikgfHwgKCgoQ2xhc3M8Pz4pIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorICAgICAqIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKKyAgICB9CiAKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKKyAgICAgICAgaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKKyAgICAgICAgICAgIE9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKKyAgICAgICAgICAgIGlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzczw/PikgfHwgKChDbGFzczw/PikgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQorICAgIC8qKgorICAgICAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgeworICAgICAgICB0aGlzLmNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7CisgICAgfQogCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisgICAgLyoqCisgICAgICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7CisgICAgICAgIHRoaXMuY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKKyAgICB9CiAKLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisgICAgICogZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgdGhpcy5jaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwogCi0JLyoqCi0JICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHBhckl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlwYXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChidW5kbGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJYnVuZGxlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KKyAgICAgICAgaWYgKHRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICBpZiAodGhpcy5wYXJJdGVtUHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5wYXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmJ1bmRsZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmJ1bmRsZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggYmJhY2E2ZC4uNDMyMWJkOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTEsNCArMSwzIEBACi0jV2VkIE1hciAwMiAxNjowMDowNiBQU1QgMjAxMQogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9CkBAIC04LDYgKzcsOCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCkBAIC04MiwzNSArODMsMzcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTgwCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj00OAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbj0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeT04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2g9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKQEAgLTEyMSwzMCArMTI0LDMxIEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9sYW1iZGFfYm9keT1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTEyMAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2phdmFkb2NfYm91bmRhcmllcz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5wcmVzZXJ2ZV93aGl0ZV9zcGFjZV9iZXR3ZWVuX2NvZGVfYW5kX2xpbmVfY29tbWVudHM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5kaXNhYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9mZgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmVuYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvbgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKQEAgLTE1OCw3ICsxNjIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQ9aW5zZXJ0CkBAIC0xNjYsMTAgKzE3MCwxMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21lbWJlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZXRob2Q9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFja2FnZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl90eXBlPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9sYWJlbD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl90eXBlX2Fubm90YXRpb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0yMTcsNiArMjIyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTIzNSwxMiArMjQxLDE0IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKQEAgLTI2NCw2ICsyNzIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKQEAgLTI5MSw2ICszMDAsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTMxOSw2ICszMjksNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fdHJ5PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0CkBAIC0zMjgsNiArMzM5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKQEAgLTM0MywxNSArMzU1LDE3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xMjAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXNwYWNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2Vfb25fb2ZmX3RhZ3M9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfb3Jfb3BlcmF0b3JfbXVsdGljYXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9vdXRlcl9leHByZXNzaW9uc193aGVuX25lc3RlZD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhRm9ybWF0dGVyPW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRlZmF1bHRKYXZhRm9ybWF0dGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKaW5kZXggN2U3ZmU3My4uNmM5ODAxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMSw3ICsxLDY1IEBACitjbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19tZXRob2RzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnNfaW50ZXJmYWNlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfZnVuY3Rpb25hbF9pbnRlcmZhY2VzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKK2NsZWFudXAuY29ycmVjdF9pbmRlbnRhdGlvbj1mYWxzZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGVfY2hhbmdlc19vbmx5PWZhbHNlCitjbGVhbnVwLmluc2VydF9pbmZlcnJlZF90eXBlX2FyZ3VtZW50cz1mYWxzZQorY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV90eXBlX2Fic3RyYWN0X2lmX21pc3NpbmdfbWV0aG9kPWZhbHNlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKK2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK2NsZWFudXAucmVtb3ZlX3JlZHVuZGFudF90eXBlX2FyZ3VtZW50cz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorY2xlYW51cC51c2VfYW5vbnltb3VzX2NsYXNzX2NyZWF0aW9uPWZhbHNlCitjbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK2NsZWFudXAudXNlX2xhbWJkYT10cnVlCitjbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cC51c2VfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXBfcHJvZmlsZT1fVmlyZ28gV2ViIFNlcnZlciAtIENvZGUgQ2xlYW4gVXAKIGNsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCiBlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQogZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fTXlseW4gYmFzZWQgb24gRWNsaXBzZQorZm9ybWF0dGVyX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIEZvcm1hdHRlcgogZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTIKIGludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CiBvcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9CdW5kbGUuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvQnVuZGxlLmphdmEKaW5kZXggYmU4NWViMC4uYjRiNTcxNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9CdW5kbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL0J1bmRsZS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXI7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKQEAgLTIwLDM3ICsyMSwzNyBAQAogICogPGxpPntAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLkJ1bmRsZSNnZXRTeW1ib2xpY05hbWUgPGVtPlN5bWJvbGljIE5hbWU8L2VtPn08L2xpPgogICogPC91bD4KICAqIDwvcD4KLSAqIAorICoKICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5QYXJQYWNrYWdlI2dldEJ1bmRsZSgpCiAgKiBAbW9kZWwKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBCdW5kbGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TeW1ib2xpYyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ltYm9saWMgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhCi0JICogZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TeW1ib2xpYyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTeW1ib2xpY05hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5QYXJQYWNrYWdlI2dldEJ1bmRsZV9TeW1ib2xpY05hbWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKCk7CiAKLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLkJ1bmRsZSNnZXRTeW1ib2xpY05hbWUgPGVtPlN5bWJvbGljIE5hbWU8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3ltYm9saWMgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3ltYm9saWNOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTeW1ib2xpY05hbWUoU3RyaW5nIHZhbHVlKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TeW1ib2xpYyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAgICogPHA+CisgICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ltYm9saWMgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhCisgICAgICogZGVzY3JpcHRpb24gaGVyZS4uLgorICAgICAqIDwvcD4KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN5bWJvbGljIE5hbWU8L2VtPicgYXR0cmlidXRlLgorICAgICAqIEBzZWUgI3NldFN5bWJvbGljTmFtZShTdHJpbmcpCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLlBhclBhY2thZ2UjZ2V0QnVuZGxlX1N5bWJvbGljTmFtZSgpCisgICAgICogQG1vZGVsCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIFN0cmluZyBnZXRTeW1ib2xpY05hbWUoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuQnVuZGxlI2dldFN5bWJvbGljTmFtZSA8ZW0+U3ltYm9saWMgTmFtZTwvZW0+fScKKyAgICAgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3ltYm9saWMgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisgICAgICogQHNlZSAjZ2V0U3ltYm9saWNOYW1lKCkKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgdm9pZCBzZXRTeW1ib2xpY05hbWUoU3RyaW5nIHZhbHVlKTsKIAogfSAvLyBCdW5kbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvUGFyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL1Bhci5qYXZhCmluZGV4IGU2NmY1M2QuLjk4MWUyN2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvUGFyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9QYXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwpAQCAtMjEsMjYgKzIyLDI3IEBACiAgKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuUGFyI2dldEJ1bmRsZSA8ZW0+QnVuZGxlPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuUGFyUGFja2FnZSNnZXRQYXIoKQogICogQG1vZGVsCiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUGFyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnVuZGxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5CdW5kbGV9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJ1bmRsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEKLQkgKiBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJ1bmRsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuUGFyUGFja2FnZSNnZXRQYXJfQnVuZGxlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PEJ1bmRsZT4gZ2V0QnVuZGxlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CdW5kbGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZQorICAgICAqIHtAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLkJ1bmRsZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAgICogPHA+CisgICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QnVuZGxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYQorICAgICAqIGRlc2NyaXB0aW9uIGhlcmUuLi4KKyAgICAgKiA8L3A+CisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CdW5kbGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLlBhclBhY2thZ2UjZ2V0UGFyX0J1bmRsZSgpCisgICAgICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBFTGlzdDxCdW5kbGU+IGdldEJ1bmRsZSgpOwogCiB9IC8vIFBhcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9QYXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL1BhckZhY3RvcnkuamF2YQppbmRleCBlMDE3NDUwLi5hNDVlZWFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL1BhckZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL1BhckZhY3RvcnkuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwpAQCAtMTUsNDAgKzE2LDQxIEBACiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mCiAgKiB0aGUgbW9kZWwuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCisgKgogICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLlBhclBhY2thZ2UKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGludGVyZmFjZSBQYXJGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQYXJGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5QYXJGYWN0b3J5SW1wbC5pbml0KCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcjwvZW0+Jy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBhciBjcmVhdGVQYXIoKTsKKyAgICAvKioKKyAgICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBQYXJGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5QYXJGYWN0b3J5SW1wbC5pbml0KCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJ1bmRsZTwvZW0+Jy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CdW5kbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJ1bmRsZSBjcmVhdGVCdW5kbGUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcjwvZW0+Jy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBhcjwvZW0+Jy4KKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgUGFyIGNyZWF0ZVBhcigpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBhclBhY2thZ2UgZ2V0UGFyUGFja2FnZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnVuZGxlPC9lbT4nLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnVuZGxlPC9lbT4nLgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBCdW5kbGUgY3JlYXRlQnVuZGxlKCk7CiAKLX0gLy9QYXJGYWN0b3J5CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgUGFyUGFja2FnZSBnZXRQYXJQYWNrYWdlKCk7CisKK30gLy8gUGFyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9QYXJQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL1BhclBhY2thZ2UuamF2YQppbmRleCAxNjk5ZjI3Li5kNzkzNDk1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL1BhclBhY2thZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL1BhclBhY2thZ2UuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CkBAIC0yNCwxOTIgKzI1LDE5NCBAQAogICogPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CiAgKiA8L3VsPgogICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKKyAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuUGFyRmFjdG9yeQogICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgUGFyUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gInBhciI7CiAKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2VjbGlwc2Uub3JnL3ZpcmdvL3Bhci5lY29yZSI7CisgICAgLyoqCisgICAgICogVGhlIHBhY2thZ2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgU3RyaW5nIGVOQU1FID0gInBhciI7CiAKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIiOworICAgIC8qKgorICAgICAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIFN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly9lY2xpcHNlLm9yZy92aXJnby9wYXIuZWNvcmUiOwogCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBhclBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5pbXBsLlBhclBhY2thZ2VJbXBsLmluaXQoKTsKKyAgICAvKioKKyAgICAgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhciI7CiAKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5QYXJJbXBsIDxlbT5QYXI8L2VtPn0nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5pbXBsLlBhckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5QYXJQYWNrYWdlSW1wbCNnZXRQYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEFSID0gMDsKKyAgICAvKioKKyAgICAgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBQYXJQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5QYXJQYWNrYWdlSW1wbC5pbml0KCk7CiAKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnVuZGxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSX19CVU5ETEUgPSAwOworICAgIC8qKgorICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5pbXBsLlBhckltcGwgPGVtPlBhcjwvZW0+fScgY2xhc3MuIDwhLS0KKyAgICAgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5QYXJJbXBsCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmltcGwuUGFyUGFja2FnZUltcGwjZ2V0UGFyKCkKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgaW50IFBBUiA9IDA7CiAKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UGFyPC9lbT4nIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFSX0ZFQVRVUkVfQ09VTlQgPSAxOworICAgIC8qKgorICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CdW5kbGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisgICAgICogZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqIEBvcmRlcmVkCisgICAgICovCisgICAgaW50IFBBUl9fQlVORExFID0gMDsKIAotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5pbXBsLkJ1bmRsZUltcGwgPGVtPkJ1bmRsZTwvZW0+fScgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmltcGwuQnVuZGxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5pbXBsLlBhclBhY2thZ2VJbXBsI2dldEJ1bmRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCVU5ETEUgPSAxOworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QYXI8L2VtPicgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqIEBvcmRlcmVkCisgICAgICovCisgICAgaW50IFBBUl9GRUFUVVJFX0NPVU5UID0gMTsKIAotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeW1ib2xpYyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCVU5ETEVfX1NZTUJPTElDX05BTUUgPSAwOworICAgIC8qKgorICAgICAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5pbXBsLkJ1bmRsZUltcGwgPGVtPkJ1bmRsZTwvZW0+fScgY2xhc3MuIDwhLS0KKyAgICAgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5CdW5kbGVJbXBsCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmltcGwuUGFyUGFja2FnZUltcGwjZ2V0QnVuZGxlKCkKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgaW50IEJVTkRMRSA9IDE7CiAKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QnVuZGxlPC9lbT4nIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlVORExFX0ZFQVRVUkVfQ09VTlQgPSAxOworICAgIC8qKgorICAgICAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeW1ib2xpYyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqIEBvcmRlcmVkCisgICAgICovCisgICAgaW50IEJVTkRMRV9fU1lNQk9MSUNfTkFNRSA9IDA7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLlBhciA8ZW0+UGFyPC9lbT59Jy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLlBhcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGFyKCk7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJ1bmRsZTwvZW0+JyBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICogQG9yZGVyZWQKKyAgICAgKi8KKyAgICBpbnQgQlVORExFX0ZFQVRVUkVfQ09VTlQgPSAxOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuUGFyI2dldEJ1bmRsZQotCSAqIDxlbT5CdW5kbGU8L2VtPn0nLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QnVuZGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5QYXIjZ2V0QnVuZGxlKCkKLQkgKiBAc2VlICNnZXRQYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBhcl9CdW5kbGUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLlBhciA8ZW0+UGFyPC9lbT59Jy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhcjwvZW0+Jy4KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuUGFyCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEVDbGFzcyBnZXRQYXIoKTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuQnVuZGxlIDxlbT5CdW5kbGU8L2VtPn0nLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJ1bmRsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuQnVuZGxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCdW5kbGUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5QYXIjZ2V0QnVuZGxlCisgICAgICogPGVtPkJ1bmRsZTwvZW0+fScuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJ1bmRsZTwvZW0+Jy4KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuUGFyI2dldEJ1bmRsZSgpCisgICAgICogQHNlZSAjZ2V0UGFyKCkKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgRVJlZmVyZW5jZSBnZXRQYXJfQnVuZGxlKCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuQnVuZGxlI2dldFN5bWJvbGljTmFtZQotCSAqIDxlbT5TeW1ib2xpYyBOYW1lPC9lbT59Jy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TeW1ib2xpYyBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5CdW5kbGUjZ2V0U3ltYm9saWNOYW1lKCkKLQkgKiBAc2VlICNnZXRCdW5kbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJ1bmRsZV9TeW1ib2xpY05hbWUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLkJ1bmRsZSA8ZW0+QnVuZGxlPC9lbT59Jy4gPCEtLSBiZWdpbi11c2VyLWRvYworICAgICAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJ1bmRsZTwvZW0+Jy4KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuQnVuZGxlCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEVDbGFzcyBnZXRCdW5kbGUoKTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGFyRmFjdG9yeSBnZXRQYXJGYWN0b3J5KCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLkJ1bmRsZSNnZXRTeW1ib2xpY05hbWUKKyAgICAgKiA8ZW0+U3ltYm9saWMgTmFtZTwvZW0+fScuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TeW1ib2xpYyBOYW1lPC9lbT4nLgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5CdW5kbGUjZ2V0U3ltYm9saWNOYW1lKCkKKyAgICAgKiBAc2VlICNnZXRCdW5kbGUoKQorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBFQXR0cmlidXRlIGdldEJ1bmRsZV9TeW1ib2xpY05hbWUoKTsKIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmltcGwuUGFySW1wbCA8ZW0+UGFyPC9lbT59JyBjbGFzcy4gPCEtLQotCQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5QYXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5pbXBsLlBhclBhY2thZ2VJbXBsI2dldFBhcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQQVIgPSBlSU5TVEFOQ0UuZ2V0UGFyKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIFBhckZhY3RvcnkgZ2V0UGFyRmFjdG9yeSgpOwogCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnVuZGxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLiA8IS0tCi0JCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUEFSX19CVU5ETEUgPSBlSU5TVEFOQ0UuZ2V0UGFyX0J1bmRsZSgpOworICAgIC8qKgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKyAgICAgKiA8dWw+CisgICAgICogPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAgICAgKiA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAgICAgKiA8bGk+ZWFjaCBlbnVtLDwvbGk+CisgICAgICogPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgTGl0ZXJhbHMgewogCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5pbXBsLkJ1bmRsZUltcGwgPGVtPkJ1bmRsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmltcGwuQnVuZGxlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5QYXJQYWNrYWdlSW1wbCNnZXRCdW5kbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQlVORExFID0gZUlOU1RBTkNFLmdldEJ1bmRsZSgpOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5QYXJJbXBsIDxlbT5QYXI8L2VtPn0nIGNsYXNzLiA8IS0tCisgICAgICAgICAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmltcGwuUGFySW1wbAorICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5QYXJQYWNrYWdlSW1wbCNnZXRQYXIoKQorICAgICAgICAgKiBAZ2VuZXJhdGVkCisgICAgICAgICAqLworICAgICAgICBFQ2xhc3MgUEFSID0gZUlOU1RBTkNFLmdldFBhcigpOwogCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ltYm9saWMgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiAKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCVU5ETEVfX1NZTUJPTElDX05BTUUgPSBlSU5TVEFOQ0UuZ2V0QnVuZGxlX1N5bWJvbGljTmFtZSgpOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJ1bmRsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4gPCEtLQorICAgICAgICAgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICAgICAqCisgICAgICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgICAgICovCisgICAgICAgIEVSZWZlcmVuY2UgUEFSX19CVU5ETEUgPSBlSU5TVEFOQ0UuZ2V0UGFyX0J1bmRsZSgpOwogCi0JfQorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5CdW5kbGVJbXBsIDxlbT5CdW5kbGU8L2VtPn0nIGNsYXNzLgorICAgICAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmltcGwuQnVuZGxlSW1wbAorICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5QYXJQYWNrYWdlSW1wbCNnZXRCdW5kbGUoKQorICAgICAgICAgKiBAZ2VuZXJhdGVkCisgICAgICAgICAqLworICAgICAgICBFQ2xhc3MgQlVORExFID0gZUlOU1RBTkNFLmdldEJ1bmRsZSgpOwogCi19IC8vUGFyUGFja2FnZQorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN5bWJvbGljIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgICAgICoKKyAgICAgICAgICogQGdlbmVyYXRlZAorICAgICAgICAgKi8KKyAgICAgICAgRUF0dHJpYnV0ZSBCVU5ETEVfX1NZTUJPTElDX05BTUUgPSBlSU5TVEFOQ0UuZ2V0QnVuZGxlX1N5bWJvbGljTmFtZSgpOworCisgICAgfQorCit9IC8vIFBhclBhY2thZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvaW1wbC9CdW5kbGVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL2ltcGwvQnVuZGxlSW1wbC5qYXZhCmluZGV4IDEwNmM2MjYuLjllYjU3YzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvaW1wbC9CdW5kbGVJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9pbXBsL0J1bmRsZUltcGwuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmltcGw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CkBAIC0yNSwxNDYgKzI2LDE0NiBAQAogICogPGxpPntAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmltcGwuQnVuZGxlSW1wbCNnZXRTeW1ib2xpY05hbWUgPGVtPlN5bWJvbGljIE5hbWU8L2VtPn08L2xpPgogICogPC91bD4KICAqIDwvcD4KLSAqIAorICoKICAqIEBnZW5lcmF0ZWQKICAqLwogcHVibGljIGNsYXNzIEJ1bmRsZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEJ1bmRsZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5bWJvbGljTmFtZSgpIDxlbT5TeW1ib2xpYyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0U3ltYm9saWNOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTWU1CT0xJQ19OQU1FX0VERUZBVUxUID0gbnVsbDsKIAotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5bWJvbGljTmFtZSgpIDxlbT5TeW1ib2xpYyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0U3ltYm9saWNOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN5bWJvbGljTmFtZSA9IFNZTUJPTElDX05BTUVfRURFRkFVTFQ7CisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5bWJvbGljTmFtZSgpIDxlbT5TeW1ib2xpYyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAc2VlICNnZXRTeW1ib2xpY05hbWUoKQorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKiBAb3JkZXJlZAorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTUJPTElDX05BTUVfRURFRkFVTFQgPSBudWxsOwogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCdW5kbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeW1ib2xpY05hbWUoKSA8ZW0+U3ltYm9saWMgTmFtZTwvZW0+fScgYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQHNlZSAjZ2V0U3ltYm9saWNOYW1lKCkKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICogQG9yZGVyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN5bWJvbGljTmFtZSA9IFNZTUJPTElDX05BTUVfRURFRkFVTFQ7CiAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBQYXJQYWNrYWdlLkxpdGVyYWxzLkJVTkRMRTsKLQl9CisgICAgLyoqCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIEJ1bmRsZUltcGwoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKCkgewotCQlyZXR1cm4gc3ltYm9saWNOYW1lOwotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIFBhclBhY2thZ2UuTGl0ZXJhbHMuQlVORExFOworICAgIH0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW1ib2xpY05hbWUoU3RyaW5nIG5ld1N5bWJvbGljTmFtZSkgewotCQlTdHJpbmcgb2xkU3ltYm9saWNOYW1lID0gc3ltYm9saWNOYW1lOwotCQlzeW1ib2xpY05hbWUgPSBuZXdTeW1ib2xpY05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGFyUGFja2FnZS5CVU5ETEVfX1NZTUJPTElDX05BTUUsIG9sZFN5bWJvbGljTmFtZSwKLQkJCQkJc3ltYm9saWNOYW1lKSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTeW1ib2xpY05hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN5bWJvbGljTmFtZTsKKyAgICB9CiAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFBhclBhY2thZ2UuQlVORExFX19TWU1CT0xJQ19OQU1FOgotCQkJcmV0dXJuIGdldFN5bWJvbGljTmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTeW1ib2xpY05hbWUoU3RyaW5nIG5ld1N5bWJvbGljTmFtZSkgeworICAgICAgICBTdHJpbmcgb2xkU3ltYm9saWNOYW1lID0gdGhpcy5zeW1ib2xpY05hbWU7CisgICAgICAgIHRoaXMuc3ltYm9saWNOYW1lID0gbmV3U3ltYm9saWNOYW1lOworICAgICAgICBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKyAgICAgICAgICAgIGVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBhclBhY2thZ2UuQlVORExFX19TWU1CT0xJQ19OQU1FLCBvbGRTeW1ib2xpY05hbWUsIHRoaXMuc3ltYm9saWNOYW1lKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBQYXJQYWNrYWdlLkJVTkRMRV9fU1lNQk9MSUNfTkFNRToKLQkJCXNldFN5bWJvbGljTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9CisgICAgLyoqCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgeworICAgICAgICAgICAgY2FzZSBQYXJQYWNrYWdlLkJVTkRMRV9fU1lNQk9MSUNfTkFNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3ltYm9saWNOYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgUGFyUGFja2FnZS5CVU5ETEVfX1NZTUJPTElDX05BTUU6Ci0JCQlzZXRTeW1ib2xpY05hbWUoU1lNQk9MSUNfTkFNRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQorICAgIC8qKgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisgICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7CisgICAgICAgICAgICBjYXNlIFBhclBhY2thZ2UuQlVORExFX19TWU1CT0xJQ19OQU1FOgorICAgICAgICAgICAgICAgIHNldFN5bWJvbGljTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgUGFyUGFja2FnZS5CVU5ETEVfX1NZTUJPTElDX05BTUU6Ci0JCQlyZXR1cm4gU1lNQk9MSUNfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc3ltYm9saWNOYW1lICE9IG51bGwgOiAhU1lNQk9MSUNfTkFNRV9FREVGQVVMVC5lcXVhbHMoc3ltYm9saWNOYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQorICAgIC8qKgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisgICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7CisgICAgICAgICAgICBjYXNlIFBhclBhY2thZ2UuQlVORExFX19TWU1CT0xJQ19OQU1FOgorICAgICAgICAgICAgICAgIHNldFN5bWJvbGljTmFtZShTWU1CT0xJQ19OQU1FX0VERUZBVUxUKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSB7Ci0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQkJfQorICAgIC8qKgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisgICAgICAgIHN3aXRjaCAoZmVhdHVyZUlEKSB7CisgICAgICAgICAgICBjYXNlIFBhclBhY2thZ2UuQlVORExFX19TWU1CT0xJQ19OQU1FOgorICAgICAgICAgICAgICAgIHJldHVybiBTWU1CT0xJQ19OQU1FX0VERUZBVUxUID09IG51bGwgPyB0aGlzLnN5bWJvbGljTmFtZSAhPSBudWxsIDogIVNZTUJPTElDX05BTUVfRURFRkFVTFQuZXF1YWxzKHRoaXMuc3ltYm9saWNOYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisgICAgfQogCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHN5bWJvbGljTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3ltYm9saWNOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQorICAgIC8qKgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGlmIChlSXNQcm94eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQogCi19IC8vQnVuZGxlSW1wbAorICAgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiIChzeW1ib2xpY05hbWU6ICIpOworICAgICAgICByZXN1bHQuYXBwZW5kKHRoaXMuc3ltYm9saWNOYW1lKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgnKScpOworICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisgICAgfQorCit9IC8vIEJ1bmRsZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvaW1wbC9QYXJGYWN0b3J5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9pbXBsL1BhckZhY3RvcnlJbXBsLmphdmEKaW5kZXggNTE2ZDc1ZS4uZGE4MWJhNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9pbXBsL1BhckZhY3RvcnlJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9pbXBsL1BhckZhY3RvcnlJbXBsLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5pbXBsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKQEAgLTIyLDkxICsyMyw5MiBAQAogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKKyAqCiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBQYXJGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFBhckZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGFyRmFjdG9yeSBpbml0KCkgewotCQl0cnkgewotCQkJUGFyRmFjdG9yeSB0aGVQYXJGYWN0b3J5ID0gKFBhckZhY3RvcnkpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vZWNsaXBzZS5vcmcvdmlyZ28vcGFyLmVjb3JlIik7Ci0JCQlpZiAodGhlUGFyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVBhckZhY3Rvcnk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgUGFyRmFjdG9yeUltcGwoKTsKLQl9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhckZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGFyRmFjdG9yeSBpbml0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUGFyRmFjdG9yeSB0aGVQYXJGYWN0b3J5ID0gKFBhckZhY3RvcnkpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vZWNsaXBzZS5vcmcvdmlyZ28vcGFyLmVjb3JlIik7CisgICAgICAgICAgICBpZiAodGhlUGFyRmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoZVBhckZhY3Rvcnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIEVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUGFyRmFjdG9yeUltcGwoKTsKKyAgICB9CiAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJY2FzZSBQYXJQYWNrYWdlLlBBUjoKLQkJCXJldHVybiBjcmVhdGVQYXIoKTsKLQkJY2FzZSBQYXJQYWNrYWdlLkJVTkRMRToKLQkJCXJldHVybiBjcmVhdGVCdW5kbGUoKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIFBhckZhY3RvcnlJbXBsKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyIGNyZWF0ZVBhcigpIHsKLQkJUGFySW1wbCBwYXIgPSBuZXcgUGFySW1wbCgpOwotCQlyZXR1cm4gcGFyOwotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworICAgICAgICBzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgeworICAgICAgICAgICAgY2FzZSBQYXJQYWNrYWdlLlBBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlUGFyKCk7CisgICAgICAgICAgICBjYXNlIFBhclBhY2thZ2UuQlVORExFOgorICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVCdW5kbGUoKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnVuZGxlIGNyZWF0ZUJ1bmRsZSgpIHsKLQkJQnVuZGxlSW1wbCBidW5kbGUgPSBuZXcgQnVuZGxlSW1wbCgpOwotCQlyZXR1cm4gYnVuZGxlOwotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyIGNyZWF0ZVBhcigpIHsKKyAgICAgICAgUGFySW1wbCBwYXIgPSBuZXcgUGFySW1wbCgpOworICAgICAgICByZXR1cm4gcGFyOworICAgIH0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyUGFja2FnZSBnZXRQYXJQYWNrYWdlKCkgewotCQlyZXR1cm4gKFBhclBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQorICAgIC8qKgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGUgY3JlYXRlQnVuZGxlKCkgeworICAgICAgICBCdW5kbGVJbXBsIGJ1bmRsZSA9IG5ldyBCdW5kbGVJbXBsKCk7CisgICAgICAgIHJldHVybiBidW5kbGU7CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIFBhclBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIFBhclBhY2thZ2UuZUlOU1RBTkNFOwotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyUGFja2FnZSBnZXRQYXJQYWNrYWdlKCkgeworICAgICAgICByZXR1cm4gKFBhclBhY2thZ2UpIGdldEVQYWNrYWdlKCk7CisgICAgfQogCi19IC8vUGFyRmFjdG9yeUltcGwKKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHN0YXRpYyBQYXJQYWNrYWdlIGdldFBhY2thZ2UoKSB7CisgICAgICAgIHJldHVybiBQYXJQYWNrYWdlLmVJTlNUQU5DRTsKKyAgICB9CisKK30gLy8gUGFyRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvaW1wbC9QYXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL2ltcGwvUGFySW1wbC5qYXZhCmluZGV4IDhmNzhiMGQuLmViMDVmN2QgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvaW1wbC9QYXJJbXBsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci9pbXBsL1BhckltcGwuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLmltcGw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTMxLDEyMyArMzIsMTI0IEBACiAgKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbC5QYXJJbXBsI2dldEJ1bmRsZSA8ZW0+QnVuZGxlPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBQYXJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQYXIgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJ1bmRsZSgpIDxlbT5CdW5kbGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEJ1bmRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEJ1bmRsZT4gYnVuZGxlOwogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCdW5kbGUoKSA8ZW0+QnVuZGxlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYworICAgICAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldEJ1bmRsZSgpCisgICAgICogQGdlbmVyYXRlZAorICAgICAqIEBvcmRlcmVkCisgICAgICovCisgICAgcHJvdGVjdGVkIEVMaXN0PEJ1bmRsZT4gYnVuZGxlOwogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gUGFyUGFja2FnZS5MaXRlcmFscy5QQVI7Ci0JfQorICAgIC8qKgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBQYXJJbXBsKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8QnVuZGxlPiBnZXRCdW5kbGUoKSB7Ci0JCWlmIChidW5kbGUgPT0gbnVsbCkgewotCQkJYnVuZGxlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEJ1bmRsZT4oQnVuZGxlLmNsYXNzLCB0aGlzLCBQYXJQYWNrYWdlLlBBUl9fQlVORExFKTsKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIFBhclBhY2thZ2UuTGl0ZXJhbHMuUEFSOworICAgIH0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgUGFyUGFja2FnZS5QQVJfX0JVTkRMRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEJ1bmRsZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRUxpc3Q8QnVuZGxlPiBnZXRCdW5kbGUoKSB7CisgICAgICAgIGlmICh0aGlzLmJ1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmJ1bmRsZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxCdW5kbGU+KEJ1bmRsZS5jbGFzcywgdGhpcywgUGFyUGFja2FnZS5QQVJfX0JVTkRMRSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuYnVuZGxlOworICAgIH0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgUGFyUGFja2FnZS5QQVJfX0JVTkRMRToKLQkJCXJldHVybiBnZXRCdW5kbGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9CisgICAgLyoqCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgeworICAgICAgICAgICAgY2FzZSBQYXJQYWNrYWdlLlBBUl9fQlVORExFOgorICAgICAgICAgICAgICAgIHJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEJ1bmRsZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworICAgIH0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFBhclBhY2thZ2UuUEFSX19CVU5ETEU6Ci0JCQlnZXRCdW5kbGUoKS5jbGVhcigpOwotCQkJZ2V0QnVuZGxlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBCdW5kbGU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9CisgICAgLyoqCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgeworICAgICAgICAgICAgY2FzZSBQYXJQYWNrYWdlLlBBUl9fQlVORExFOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRCdW5kbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKyAgICB9CiAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBQYXJQYWNrYWdlLlBBUl9fQlVORExFOgotCQkJZ2V0QnVuZGxlKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9CisgICAgLyoqCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKyAgICAgICAgc3dpdGNoIChmZWF0dXJlSUQpIHsKKyAgICAgICAgICAgIGNhc2UgUGFyUGFja2FnZS5QQVJfX0JVTkRMRToKKyAgICAgICAgICAgICAgICBnZXRCdW5kbGUoKS5jbGVhcigpOworICAgICAgICAgICAgICAgIGdldEJ1bmRsZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQnVuZGxlPikgbmV3VmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworICAgIH0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFBhclBhY2thZ2UuUEFSX19CVU5ETEU6Ci0JCQlyZXR1cm4gYnVuZGxlICE9IG51bGwgJiYgIWJ1bmRsZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgeworICAgICAgICAgICAgY2FzZSBQYXJQYWNrYWdlLlBBUl9fQlVORExFOgorICAgICAgICAgICAgICAgIGdldEJ1bmRsZSgpLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworICAgIH0KIAotfSAvL1BhckltcGwKKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworICAgICAgICBzd2l0Y2ggKGZlYXR1cmVJRCkgeworICAgICAgICAgICAgY2FzZSBQYXJQYWNrYWdlLlBBUl9fQlVORExFOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1bmRsZSAhPSBudWxsICYmICF0aGlzLmJ1bmRsZS5pc0VtcHR5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworICAgIH0KKworfSAvLyBQYXJJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL2ltcGwvUGFyUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvaW1wbC9QYXJQYWNrYWdlSW1wbC5qYXZhCmluZGV4IDZhZGFiNDQuLjIzY2Q3MTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvaW1wbC9QYXJQYWNrYWdlSW1wbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvaW1wbC9QYXJQYWNrYWdlSW1wbC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuaW1wbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwpAQCAtMjIsMjAwICsyMywxOTkgQEAKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCisgKgogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgUGFyUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBQYXJQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGFyRUNsYXNzID0gbnVsbDsKIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBidW5kbGVFQ2xhc3MgPSBudWxsOworICAgIC8qKgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByaXZhdGUgRUNsYXNzIHBhckVDbGFzcyA9IG51bGw7CiAKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UgcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Ci0JICogTm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbwotCSAqIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5QYXJQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQYXJQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgUGFyRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIEVDbGFzcyBidW5kbGVFQ2xhc3MgPSBudWxsOwogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKKyAgICAgKiBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UgcGFja2FnZSBVUkkgdmFsdWUuCisgICAgICogPHA+CisgICAgICogTm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYyBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbworICAgICAqIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4gPCEtLQorICAgICAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLlBhclBhY2thZ2UjZU5TX1VSSQorICAgICAqIEBzZWUgI2luaXQoKQorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIFBhclBhY2thZ2VJbXBsKCkgeworICAgICAgICBzdXBlcihlTlNfVVJJLCBQYXJGYWN0b3J5LmVJTlNUQU5DRSk7CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgUGFyUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4gQ2xpZW50cyBzaG91bGQgbm90Ci0JICogaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBhclBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSB7Ci0JCQlyZXR1cm4gKFBhclBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBhclBhY2thZ2UuZU5TX1VSSSk7Ci0JCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CiAKLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlQYXJQYWNrYWdlSW1wbCB0aGVQYXJQYWNrYWdlID0gKFBhclBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgUGFyUGFja2FnZUltcGwKLQkJCQk/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKQotCQkJCTogbmV3IFBhclBhY2thZ2VJbXBsKCkpOworICAgIC8qKgorICAgICAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIFBhclBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuIENsaWVudHMgc2hvdWxkIG5vdAorICAgICAqIGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBzZWUgI2VOU19VUkkKKyAgICAgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorICAgICAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhclBhY2thZ2UgaW5pdCgpIHsKKyAgICAgICAgaWYgKGlzSW5pdGVkKSB7CisgICAgICAgICAgICByZXR1cm4gKFBhclBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBhclBhY2thZ2UuZU5TX1VSSSk7CisgICAgICAgIH0KIAotCQlpc0luaXRlZCA9IHRydWU7CisgICAgICAgIC8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKyAgICAgICAgUGFyUGFja2FnZUltcGwgdGhlUGFyUGFja2FnZSA9IChQYXJQYWNrYWdlSW1wbCkgKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIFBhclBhY2thZ2VJbXBsCisgICAgICAgICAgICA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBQYXJQYWNrYWdlSW1wbCgpKTsKIAotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVQYXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworICAgICAgICBpc0luaXRlZCA9IHRydWU7CiAKLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVQYXJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKyAgICAgICAgLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKyAgICAgICAgdGhlUGFyUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKIAotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVBhclBhY2thZ2UuZnJlZXplKCk7CisgICAgICAgIC8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKyAgICAgICAgdGhlUGFyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CiAKLQkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCi0JCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChQYXJQYWNrYWdlLmVOU19VUkksIHRoZVBhclBhY2thZ2UpOwotCQlyZXR1cm4gdGhlUGFyUGFja2FnZTsKLQl9CisgICAgICAgIC8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKyAgICAgICAgdGhlUGFyUGFja2FnZS5mcmVlemUoKTsKIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhcigpIHsKLQkJcmV0dXJuIHBhckVDbGFzczsKLQl9CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorICAgICAgICBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoUGFyUGFja2FnZS5lTlNfVVJJLCB0aGVQYXJQYWNrYWdlKTsKKyAgICAgICAgcmV0dXJuIHRoZVBhclBhY2thZ2U7CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcl9CdW5kbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcGFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQorICAgIC8qKgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBFQ2xhc3MgZ2V0UGFyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wYXJFQ2xhc3M7CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QnVuZGxlKCkgewotCQlyZXR1cm4gYnVuZGxlRUNsYXNzOwotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRVJlZmVyZW5jZSBnZXRQYXJfQnVuZGxlKCkgeworICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpIHRoaXMucGFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJ1bmRsZV9TeW1ib2xpY05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnVuZGxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQorICAgIC8qKgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBFQ2xhc3MgZ2V0QnVuZGxlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5idW5kbGVFQ2xhc3M7CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJGYWN0b3J5IGdldFBhckZhY3RvcnkoKSB7Ci0JCXJldHVybiAoUGFyRmFjdG9yeSkgZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCdW5kbGVfU3ltYm9saWNOYW1lKCkgeworICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpIHRoaXMuYnVuZGxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyRmFjdG9yeSBnZXRQYXJGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gKFBhckZhY3RvcnkpIGdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiBUaGlzIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dAotCSAqIGl0cyBmaXJzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlzQ3JlYXRlZCA9IHRydWU7CisgICAgLyoqCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwogCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlwYXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwYXJFQ2xhc3MsIFBBUl9fQlVORExFKTsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiBUaGlzIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dAorICAgICAqIGl0cyBmaXJzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgeworICAgICAgICBpZiAodGhpcy5pc0NyZWF0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmlzQ3JlYXRlZCA9IHRydWU7CiAKLQkJYnVuZGxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEJVTkRMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnVuZGxlRUNsYXNzLCBCVU5ETEVfX1NZTUJPTElDX05BTUUpOwotCX0KKyAgICAgICAgLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisgICAgICAgIHRoaXMucGFyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBUik7CisgICAgICAgIGNyZWF0ZUVSZWZlcmVuY2UodGhpcy5wYXJFQ2xhc3MsIFBBUl9fQlVORExFKTsKIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICB0aGlzLmJ1bmRsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCVU5ETEUpOworICAgICAgICBjcmVhdGVFQXR0cmlidXRlKHRoaXMuYnVuZGxlRUNsYXNzLCBCVU5ETEVfX1NZTUJPTElDX05BTUUpOworICAgIH0KIAotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuIFRoaXMgbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55Ci0JICogaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwogCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOworICAgIC8qKgorICAgICAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuIFRoaXMgbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55CisgICAgICogaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTsKIAotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisgICAgICAgIC8vIEluaXRpYWxpemUgcGFja2FnZQorICAgICAgICBzZXROYW1lKGVOQU1FKTsKKyAgICAgICAgc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisgICAgICAgIHNldE5zVVJJKGVOU19VUkkpOwogCi0JCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworICAgICAgICAvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCiAKLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworICAgICAgICAvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKIAotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHBhckVDbGFzcywgUGFyLmNsYXNzLCAiUGFyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQYXJfQnVuZGxlKCksIHRoaXMuZ2V0QnVuZGxlKCksIG51bGwsICJidW5kbGUiLCBudWxsLCAwLCAtMSwgUGFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULAotCQkJCSFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwKLQkJCQlJU19PUkRFUkVEKTsKKyAgICAgICAgLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwogCi0JCWluaXRFQ2xhc3MoYnVuZGxlRUNsYXNzLCBCdW5kbGUuY2xhc3MsICJCdW5kbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJ1bmRsZV9TeW1ib2xpY05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInN5bWJvbGljTmFtZSIsIG51bGwsIDAsIDEsIEJ1bmRsZS5jbGFzcywKLQkJCQkhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworICAgICAgICAvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworICAgICAgICBpbml0RUNsYXNzKHRoaXMucGFyRUNsYXNzLCBQYXIuY2xhc3MsICJQYXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisgICAgICAgIGluaXRFUmVmZXJlbmNlKGdldFBhcl9CdW5kbGUoKSwgdGhpcy5nZXRCdW5kbGUoKSwgbnVsbCwgImJ1bmRsZSIsIG51bGwsIDAsIC0xLCBQYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwKKyAgICAgICAgICAgIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9CisgICAgICAgIGluaXRFQ2xhc3ModGhpcy5idW5kbGVFQ2xhc3MsIEJ1bmRsZS5jbGFzcywgIkJ1bmRsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKyAgICAgICAgaW5pdEVBdHRyaWJ1dGUoZ2V0QnVuZGxlX1N5bWJvbGljTmFtZSgpLCB0aGlzLmVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzeW1ib2xpY05hbWUiLCBudWxsLCAwLCAxLCBCdW5kbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsCisgICAgICAgICAgICAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwogCi19IC8vUGFyUGFja2FnZUltcGwKKyAgICAgICAgLy8gQ3JlYXRlIHJlc291cmNlCisgICAgICAgIGNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworICAgIH0KKworfSAvLyBQYXJQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci91dGlsL1BhckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL3V0aWwvUGFyQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCAwM2FhYWViLi45YmI0YmJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL3V0aWwvUGFyQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL3V0aWwvUGFyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLnV0aWw7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwpAQCAtMjEsMTE4ICsyMiwxMTkgQEAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+CiAgKiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAorICoKICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5QYXJQYWNrYWdlCiAgKiBAZ2VuZXJhdGVkCiAgKi8KIHB1YmxpYyBjbGFzcyBQYXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBQYXJQYWNrYWdlIG1vZGVsUGFja2FnZTsKIAotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBQYXJQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgUGFyUGFja2FnZSBtb2RlbFBhY2thZ2U7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMKLQkgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mCi0JICogdGhlIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBQYXJBZGFwdGVyRmFjdG9yeSgpIHsKKyAgICAgICAgaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICBtb2RlbFBhY2thZ2UgPSBQYXJQYWNrYWdlLmVJTlNUQU5DRTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYXJTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPSBuZXcgUGFyU3dpdGNoPEFkYXB0ZXI+KCkgewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVBhcihQYXIgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUGFyQWRhcHRlcigpOwotCQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzCisgICAgICogaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZgorICAgICAqIHRoZSBtb2RlbC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUJ1bmRsZShCdW5kbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQnVuZGxlQWRhcHRlcigpOwotCQl9CisgICAgLyoqCisgICAgICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGFyU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0gbmV3IFBhclN3aXRjaDxBZGFwdGVyPigpIHsKIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQl9Ci0JfTsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VQYXIoUGFyIG9iamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVBhckFkYXB0ZXIoKTsKKyAgICAgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KSB0YXJnZXQpOwotCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBZGFwdGVyIGNhc2VCdW5kbGUoQnVuZGxlIG9iamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJ1bmRsZUFkYXB0ZXIoKTsKKyAgICAgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLlBhciA8ZW0+UGFyPC9lbT59Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7IGl0J3MgdXNlZnVsIHRvCi0JICogaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5QYXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworICAgICAgICB9CisgICAgfTsKIAotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5CdW5kbGUgPGVtPkJ1bmRsZTwvZW0+fScuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0bwotCSAqIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuQnVuZGxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJ1bmRsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5QYXIgPGVtPlBhcjwvZW0+fScuIDwhLS0KKyAgICAgKiBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0bworICAgICAqIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci5QYXIKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFyQWRhcHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi19IC8vUGFyQWRhcHRlckZhY3RvcnkKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuQnVuZGxlIDxlbT5CdW5kbGU8L2VtPn0nLiA8IS0tCisgICAgICogYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8KKyAgICAgKiBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuQnVuZGxlCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJ1bmRsZUFkYXB0ZXIoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKyAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCit9IC8vIFBhckFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL3V0aWwvUGFyU3dpdGNoLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucGFyL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcGFyL3V0aWwvUGFyU3dpdGNoLmphdmEKaW5kZXggYjc4Y2Q4MS4uZjg2NjRlOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Bhci91dGlsL1BhclN3aXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wYXIvdXRpbC9QYXJTd2l0Y2guamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLnV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTIzLDEyNyArMjQsMTI1IEBACiAgKiB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9dG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAogICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QgYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcwogICogcmV0dXJuZWQsIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKKyAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIuUGFyUGFja2FnZQogICogQGdlbmVyYXRlZAogICovCiBwdWJsaWMgY2xhc3MgUGFyU3dpdGNoPFQ+IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UgPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgUGFyUGFja2FnZSBtb2RlbFBhY2thZ2U7CiAKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyU3dpdGNoKCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFBhclBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFBhclBhY2thZ2UgbW9kZWxQYWNrYWdlOwogCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdAotCSAqIHJlc3VsdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyU3dpdGNoKCkgeworICAgICAgICBpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1vZGVsUGFja2FnZSA9IFBhclBhY2thZ2UuZUlOU1RBTkNFOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdAotCSAqIHJlc3VsdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybiBlU3VwZXJUeXBlcy5pc0VtcHR5KCkgPyBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6IGRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdAorICAgICAqIHJlc3VsdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgVCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKKyAgICAgICAgcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOworICAgIH0KIAotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQKLQkgKiByZXN1bHQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQljYXNlIFBhclBhY2thZ2UuUEFSOiB7Ci0JCQlQYXIgcGFyID0gKFBhcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVBhcihwYXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgUGFyUGFja2FnZS5CVU5ETEU6IHsKLQkJCUJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQnVuZGxlKGJ1bmRsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0CisgICAgICogcmVzdWx0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgeworICAgICAgICBpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisgICAgICAgICAgICByZXR1cm4gZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8gZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOiBkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFyPC9lbT4nLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzCi0JICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBhcihQYXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0CisgICAgICogcmVzdWx0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgeworICAgICAgICBzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgeworICAgICAgICAgICAgY2FzZSBQYXJQYWNrYWdlLlBBUjogeworICAgICAgICAgICAgICAgIFBhciBwYXIgPSAoUGFyKSB0aGVFT2JqZWN0OworICAgICAgICAgICAgICAgIFQgcmVzdWx0ID0gY2FzZVBhcihwYXIpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgUGFyUGFja2FnZS5CVU5ETEU6IHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSkgdGhlRU9iamVjdDsKKyAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IGNhc2VCdW5kbGUoYnVuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJ1bmRsZTwvZW0+Jy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcwotCSAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsgcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CdW5kbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VCdW5kbGUoQnVuZGxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFyPC9lbT4nLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzCisgICAgICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXI8L2VtPicuCisgICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBUIGNhc2VQYXIoUGFyIG9iamVjdCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzCi0JICogaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZQotCSAqIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CdW5kbGU8L2VtPicuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJ1bmRsZTwvZW0+Jy4KKyAgICAgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIFQgY2FzZUJ1bmRsZShCdW5kbGUgb2JqZWN0KSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotfSAvL1BhclN3aXRjaAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlCisgICAgICogYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisgICAgICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworfSAvLyBQYXJTd2l0Y2gKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggYmJhY2E2ZC4uNDMyMWJkOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTEsNCArMSwzIEBACi0jV2VkIE1hciAwMiAxNjowMDowNiBQU1QgMjAxMQogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9CkBAIC04LDYgKzcsOCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCkBAIC04MiwzNSArODMsMzcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTgwCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj00OAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbj0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeT04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2g9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKQEAgLTEyMSwzMCArMTI0LDMxIEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9sYW1iZGFfYm9keT1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTEyMAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2phdmFkb2NfYm91bmRhcmllcz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5wcmVzZXJ2ZV93aGl0ZV9zcGFjZV9iZXR3ZWVuX2NvZGVfYW5kX2xpbmVfY29tbWVudHM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5kaXNhYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9mZgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmVuYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvbgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKQEAgLTE1OCw3ICsxNjIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQ9aW5zZXJ0CkBAIC0xNjYsMTAgKzE3MCwxMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21lbWJlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZXRob2Q9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFja2FnZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl90eXBlPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9sYWJlbD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl90eXBlX2Fubm90YXRpb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0yMTcsNiArMjIyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTIzNSwxMiArMjQxLDE0IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKQEAgLTI2NCw2ICsyNzIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKQEAgLTI5MSw2ICszMDAsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTMxOSw2ICszMjksNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fdHJ5PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0CkBAIC0zMjgsNiArMzM5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKQEAgLTM0MywxNSArMzU1LDE3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xMjAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXNwYWNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2Vfb25fb2ZmX3RhZ3M9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfb3Jfb3BlcmF0b3JfbXVsdGljYXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9vdXRlcl9leHByZXNzaW9uc193aGVuX25lc3RlZD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhRm9ybWF0dGVyPW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRlZmF1bHRKYXZhRm9ybWF0dGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKaW5kZXggN2U3ZmU3My4uNmM5ODAxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMSw3ICsxLDY1IEBACitjbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19tZXRob2RzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnNfaW50ZXJmYWNlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfZnVuY3Rpb25hbF9pbnRlcmZhY2VzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKK2NsZWFudXAuY29ycmVjdF9pbmRlbnRhdGlvbj1mYWxzZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGVfY2hhbmdlc19vbmx5PWZhbHNlCitjbGVhbnVwLmluc2VydF9pbmZlcnJlZF90eXBlX2FyZ3VtZW50cz1mYWxzZQorY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV90eXBlX2Fic3RyYWN0X2lmX21pc3NpbmdfbWV0aG9kPWZhbHNlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKK2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK2NsZWFudXAucmVtb3ZlX3JlZHVuZGFudF90eXBlX2FyZ3VtZW50cz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorY2xlYW51cC51c2VfYW5vbnltb3VzX2NsYXNzX2NyZWF0aW9uPWZhbHNlCitjbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK2NsZWFudXAudXNlX2xhbWJkYT10cnVlCitjbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cC51c2VfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXBfcHJvZmlsZT1fVmlyZ28gV2ViIFNlcnZlciAtIENvZGUgQ2xlYW4gVXAKIGNsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCiBlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQogZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fTXlseW4gYmFzZWQgb24gRWNsaXBzZQorZm9ybWF0dGVyX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIEZvcm1hdHRlcgogZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTIKIGludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CiBvcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL0J1bmRsZUltcG9ydC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL0J1bmRsZUltcG9ydC5qYXZhCmluZGV4IDkxNjY0NWMuLmZiMWVhYzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbGVyZXBvc2l0b3J5L2RvbWFpbi9CdW5kbGVJbXBvcnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxlcmVwb3NpdG9yeS9kb21haW4vQnVuZGxlSW1wb3J0LmphdmEKQEAgLTQsMTAgKzQsMTEgQEAKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW47CiAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLmFydGVmYWN0cy5BcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwpAQCAtMTYsNDUgKzE3LDQ1IEBACiAKIC8qKgogICogUmVwcmVzZW50cyBhbiBidW5kbGUgaW1wb3J0IGluIGEgbGlicmFyeSBkZWZpbml0aW9uLgotICogCisgKgogICogQGF1dGhvciBhY29seWVyCiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVJbXBvcnQgewogCi0JcHJpdmF0ZSBieXRlW10gc3ltYm9saWNOYW1lOyAvLyBtYXRjaGluZyBidW5kbGUgc3ltYm9saWMgbmFtZQorICAgIHByaXZhdGUgYnl0ZVtdIHN5bWJvbGljTmFtZTsgLy8gbWF0Y2hpbmcgYnVuZGxlIHN5bWJvbGljIG5hbWUKIAotCXByaXZhdGUgVmVyc2lvblJhbmdlIHZlcnNpb25SYW5nZTsgLy8gYWNjZXB0YWJsZSByYW5nZSBmb3IgbWF0Y2hpbmcgdmVyc2lvbnMKKyAgICBwcml2YXRlIFZlcnNpb25SYW5nZSB2ZXJzaW9uUmFuZ2U7IC8vIGFjY2VwdGFibGUgcmFuZ2UgZm9yIG1hdGNoaW5nIHZlcnNpb25zCiAKLQlwcml2YXRlIExpYnJhcnlBcnRlZmFjdCBsaWJyYXJ5OyAvLyB0aGUgbGlicmFyeSBkZWNsYXJpbmcgdGhpcyBpbXBvcnQKKyAgICBwcml2YXRlIExpYnJhcnlBcnRlZmFjdCBsaWJyYXJ5OyAvLyB0aGUgbGlicmFyeSBkZWNsYXJpbmcgdGhpcyBpbXBvcnQKIAotCXByb3RlY3RlZCBCdW5kbGVJbXBvcnQoKSB7Ci0JfSAvLyBmb3IgcGVyc2lzdGVuY2UgdXNlIG9ubHkKKyAgICBwcm90ZWN0ZWQgQnVuZGxlSW1wb3J0KCkgeworICAgIH0gLy8gZm9yIHBlcnNpc3RlbmNlIHVzZSBvbmx5CiAKLQlwdWJsaWMgQnVuZGxlSW1wb3J0KExpYnJhcnlBcnRlZmFjdCBsaWIsIFN0cmluZyBzeW1ib2xpY05hbWUsIFZlcnNpb25SYW5nZSB2ZXJzaW9uUmFuZ2UpIHsKLQkJdGhpcy5saWJyYXJ5ID0gbGliOwotCQl0aGlzLnN5bWJvbGljTmFtZSA9IEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY29udmVydChzeW1ib2xpY05hbWUpOwotCQl0aGlzLnZlcnNpb25SYW5nZSA9IHZlcnNpb25SYW5nZTsKLQl9CisgICAgcHVibGljIEJ1bmRsZUltcG9ydChMaWJyYXJ5QXJ0ZWZhY3QgbGliLCBTdHJpbmcgc3ltYm9saWNOYW1lLCBWZXJzaW9uUmFuZ2UgdmVyc2lvblJhbmdlKSB7CisgICAgICAgIHRoaXMubGlicmFyeSA9IGxpYjsKKyAgICAgICAgdGhpcy5zeW1ib2xpY05hbWUgPSBBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNvbnZlcnQoc3ltYm9saWNOYW1lKTsKKyAgICAgICAgdGhpcy52ZXJzaW9uUmFuZ2UgPSB2ZXJzaW9uUmFuZ2U7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRTeW1ib2xpY05hbWUoKSB7Ci0JCXJldHVybiAoc3ltYm9saWNOYW1lICE9IG51bGwgPyBuZXcgU3RyaW5nKHN5bWJvbGljTmFtZSkgOiBudWxsKTsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRTeW1ib2xpY05hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN5bWJvbGljTmFtZSAhPSBudWxsID8gbmV3IFN0cmluZyh0aGlzLnN5bWJvbGljTmFtZSkgOiBudWxsOworICAgIH0KIAotCXB1YmxpYyBWZXJzaW9uUmFuZ2UgZ2V0VmVyc2lvblJhbmdlKCkgewotCQlyZXR1cm4gdmVyc2lvblJhbmdlOwotCX0KKyAgICBwdWJsaWMgVmVyc2lvblJhbmdlIGdldFZlcnNpb25SYW5nZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvblJhbmdlOworICAgIH0KIAotCXB1YmxpYyBMaWJyYXJ5QXJ0ZWZhY3QgZ2V0TGlicmFyeSgpIHsKLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQorICAgIHB1YmxpYyBMaWJyYXJ5QXJ0ZWZhY3QgZ2V0TGlicmFyeSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGlicmFyeTsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBpc1NhdGlzZmllZEJ5KEJ1bmRsZUFydGVmYWN0IGJ1bmRsZSkgewotCQlyZXR1cm4gKHRoaXMuc3ltYm9saWNOYW1lLmVxdWFscyhidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpICYmIHRoaXMudmVyc2lvblJhbmdlLmNvbnRhaW5zKGJ1bmRsZS5nZXRWZXJzaW9uKCkpKTsKLQl9CisgICAgcHVibGljIGJvb2xlYW4gaXNTYXRpc2ZpZWRCeShCdW5kbGVBcnRlZmFjdCBidW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9saWNOYW1lLmVxdWFscyhidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpICYmIHRoaXMudmVyc2lvblJhbmdlLmNvbnRhaW5zKGJ1bmRsZS5nZXRWZXJzaW9uKCkpOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmcuZm9ybWF0KCJJbXBvcnQtQnVuZGxlOiAlczt2ZXJzaW9uPVwiJXNcIiIsIHN5bWJvbGljTmFtZSwgdmVyc2lvblJhbmdlKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkltcG9ydC1CdW5kbGU6ICVzO3ZlcnNpb249XCIlc1wiIiwgdGhpcy5zeW1ib2xpY05hbWUsIHRoaXMudmVyc2lvblJhbmdlKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbGVyZXBvc2l0b3J5L2RvbWFpbi9Pc2dpVmVyc2lvbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL09zZ2lWZXJzaW9uLmphdmEKaW5kZXggOGYzZWExMS4uODAyM2VjYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL09zZ2lWZXJzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL09zZ2lWZXJzaW9uLmphdmEKQEAgLTQsMTAgKzQsMTEgQEAKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW47CiAKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwpAQCAtMTcsMTc1ICsxOCwxNzEgQEAKIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKIAogLyoqCi0gKiBQZXJzaXN0YWJsZSBPU0dpIFZlcnNpb24gKHdpdGggbWFqb3IsIG1pbm9yLCBzZXJ2aWNlL21pY3JvIGFuZCBxdWFsaWZpZXIKLSAqIGxldmVscykKKyAqIFBlcnNpc3RhYmxlIE9TR2kgVmVyc2lvbiAod2l0aCBtYWpvciwgbWlub3IsIHNlcnZpY2UvbWljcm8gYW5kIHF1YWxpZmllciBsZXZlbHMpCiAgKi8KIHB1YmxpYyBjbGFzcyBPc2dpVmVyc2lvbiBpbXBsZW1lbnRzIENvbXBhcmFibGU8T3NnaVZlcnNpb24+IHsKIAotCXByaXZhdGUgaW50IG1ham9yOworICAgIHByaXZhdGUgaW50IG1ham9yOwogCi0JcHJpdmF0ZSBpbnQgbWlub3I7CisgICAgcHJpdmF0ZSBpbnQgbWlub3I7CiAKLQlwcml2YXRlIGludCBzZXJ2aWNlOworICAgIHByaXZhdGUgaW50IHNlcnZpY2U7CiAKLQlwcml2YXRlIFN0cmluZyBxdWFsaWZpZXIgPSAiIjsKKyAgICBwcml2YXRlIFN0cmluZyBxdWFsaWZpZXIgPSAiIjsKIAotCS8qIGZvciBwZXJzaXN0ZW5jZSBvbmx5ICovCi0JcHJvdGVjdGVkIE9zZ2lWZXJzaW9uKCkgewotCX0KKyAgICAvKiBmb3IgcGVyc2lzdGVuY2Ugb25seSAqLworICAgIHByb3RlY3RlZCBPc2dpVmVyc2lvbigpIHsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGUgYW4gT3NnaVZlcnNpb24gZnJvbSBhIEJ1bmRsZSBieSBnZXR0aW5nIHRoZSBCVU5ETEVfVkVSU0lPTiBoZWFkZXIKLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogQHJldHVybiBhbiBPU0dpVmVyc2lvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBidW5kbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9zZ2lWZXJzaW9uIG9mQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLQkJU3RyaW5nIGhlYWRlclZhbHVlID0gYnVuZGxlLmdldEhlYWRlcnMoKS5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKTsKLQkJaWYgKGhlYWRlclZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgT3NnaVZlcnNpb24oMCwgMCwgMCwgIiIpOwotCQl9Ci0JCXJldHVybiBuZXcgT3NnaVZlcnNpb24oaGVhZGVyVmFsdWUucmVwbGFjZUFsbCgiXCIiLCAiIikpOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gT3NnaVZlcnNpb24gZnJvbSBhIEJ1bmRsZSBieSBnZXR0aW5nIHRoZSBCVU5ETEVfVkVSU0lPTiBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBidW5kbGUKKyAgICAgKiBAcmV0dXJuIGFuIE9TR2lWZXJzaW9uIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIGJ1bmRsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3NnaVZlcnNpb24gb2ZCdW5kbGUoQnVuZGxlIGJ1bmRsZSkgeworICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWUgPSBidW5kbGUuZ2V0SGVhZGVycygpLmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pOworICAgICAgICBpZiAoaGVhZGVyVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPc2dpVmVyc2lvbigwLCAwLCAwLCAiIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBPc2dpVmVyc2lvbihoZWFkZXJWYWx1ZS5yZXBsYWNlQWxsKCJcIiIsICIiKSk7CisgICAgfQogCi0JLyoqCi0JICogQnVpbGQgYW4gT3NnaVZlcnNpb24gZnJvbSBpdHMgU3RyaW5nIHJlcHJlc2VudGF0aW9uLiBBY2NlcHRhYmxlIGZvcm1zCi0JICogYXJlOiAxIDEuMCAxLjAuMSAxLjAuMC5xdWFsaWZpZXIgZXRjLgotCSAqIAotCSAqIEBwYXJhbSB0aGUgc3RyaW5nIHZlcnNpb24KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBPc2dpVmVyc2lvbihTdHJpbmcgcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCWlmIChzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIHZlcnNpb24gc3RyaW5nIHNwZWNpZmllZCIpOwotCQl9CisgICAgLyoqCisgICAgICogQnVpbGQgYW4gT3NnaVZlcnNpb24gZnJvbSBpdHMgU3RyaW5nIHJlcHJlc2VudGF0aW9uLiBBY2NlcHRhYmxlIGZvcm1zIGFyZTogMSAxLjAgMS4wLjEgMS4wLjAucXVhbGlmaWVyIGV0Yy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aGUgc3RyaW5nIHZlcnNpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBPc2dpVmVyc2lvbihTdHJpbmcgcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIHZlcnNpb24gc3RyaW5nIHNwZWNpZmllZCIpOworICAgICAgICB9CiAKLQkJcyA9IHMudHJpbSgpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzLCAiLiIpOwotCQlpZiAoIXRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IGNvbnZlcnQgJyIgKyBzICsgIicgaW50byBhbiBPU0dpIHZlcnNpb24iKTsKLQkJfQorICAgICAgICBzID0gcy50cmltKCk7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsICIuIik7CisgICAgICAgIGlmICghdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgY29udmVydCAnIiArIHMgKyAiJyBpbnRvIGFuIE9TR2kgdmVyc2lvbiIpOworICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCXRoaXMubWFqb3IgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQl0aGlzLm1pbm9yID0gdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSA/IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKSA6IDA7Ci0JCQl0aGlzLnNlcnZpY2UgPSB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpID8gSW50ZWdlci5wYXJzZUludCh0b2tlbml6ZXIubmV4dFRva2VuKCkpIDogMDsKLQkJCXRoaXMucXVhbGlmaWVyID0gdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSA/IHRva2VuaXplci5uZXh0VG9rZW4oKSA6ICIiOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZFeCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgY29udmVydCAnIiArIHMgKyAiJyBpbnRvIGFuIE9TR2kgdmVyc2lvbiIpOwotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5tYWpvciA9IEludGVnZXIucGFyc2VJbnQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKKyAgICAgICAgICAgIHRoaXMubWlub3IgPSB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpID8gSW50ZWdlci5wYXJzZUludCh0b2tlbml6ZXIubmV4dFRva2VuKCkpIDogMDsKKyAgICAgICAgICAgIHRoaXMuc2VydmljZSA9IHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgPyBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSkgOiAwOworICAgICAgICAgICAgdGhpcy5xdWFsaWZpZXIgPSB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpID8gdG9rZW5pemVyLm5leHRUb2tlbigpIDogIiI7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZkV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBjb252ZXJ0ICciICsgcyArICInIGludG8gYW4gT1NHaSB2ZXJzaW9uIik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGUgYW4gT3NnaVZlcnNpb24gZXhwbGljaXRseSBzcGVjaWZ5aW5nIGFsbCBsZXZlbHMuCi0JICogCi0JICogQHBhcmFtIG1ham9yCi0JICogQHBhcmFtIG1pbm9yCi0JICogQHBhcmFtIHNlcnZpY2UKLQkgKiBAcGFyYW0gcXVhbGlmaWVyCi0JICovCi0JcHVibGljIE9zZ2lWZXJzaW9uKGludCBtYWpvciwgaW50IG1pbm9yLCBpbnQgc2VydmljZSwgU3RyaW5nIHF1YWxpZmllcikgewotCQl0aGlzLm1ham9yID0gbWFqb3I7Ci0JCXRoaXMubWlub3IgPSBtaW5vcjsKLQkJdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKLQkJdGhpcy5xdWFsaWZpZXIgPSBudWxsICE9IHF1YWxpZmllciA/IHF1YWxpZmllciA6ICIiOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gT3NnaVZlcnNpb24gZXhwbGljaXRseSBzcGVjaWZ5aW5nIGFsbCBsZXZlbHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFqb3IKKyAgICAgKiBAcGFyYW0gbWlub3IKKyAgICAgKiBAcGFyYW0gc2VydmljZQorICAgICAqIEBwYXJhbSBxdWFsaWZpZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgT3NnaVZlcnNpb24oaW50IG1ham9yLCBpbnQgbWlub3IsIGludCBzZXJ2aWNlLCBTdHJpbmcgcXVhbGlmaWVyKSB7CisgICAgICAgIHRoaXMubWFqb3IgPSBtYWpvcjsKKyAgICAgICAgdGhpcy5taW5vciA9IG1pbm9yOworICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOworICAgICAgICB0aGlzLnF1YWxpZmllciA9IG51bGwgIT0gcXVhbGlmaWVyID8gcXVhbGlmaWVyIDogIiI7CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlIGEgcGVyc2lzdGFibGUgT3NnaVZlcnNpb24gZnJvbSBPU0dpJ3Mgb3duIChub24tcGVyc2lzdGVudCkgVmVyc2lvbgotCSAqIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqLwotCXB1YmxpYyBPc2dpVmVyc2lvbihWZXJzaW9uIHYpIHsKLQkJdGhpcy5tYWpvciA9IHYuZ2V0TWFqb3IoKTsKLQkJdGhpcy5taW5vciA9IHYuZ2V0TWlub3IoKTsKLQkJdGhpcy5zZXJ2aWNlID0gdi5nZXRNaWNybygpOwotCQl0aGlzLnF1YWxpZmllciA9IG51bGwgIT0gdi5nZXRRdWFsaWZpZXIoKSA/IHYuZ2V0UXVhbGlmaWVyKCkgOiAiIjsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcGVyc2lzdGFibGUgT3NnaVZlcnNpb24gZnJvbSBPU0dpJ3Mgb3duIChub24tcGVyc2lzdGVudCkgVmVyc2lvbiB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdgorICAgICAqLworICAgIHB1YmxpYyBPc2dpVmVyc2lvbihWZXJzaW9uIHYpIHsKKyAgICAgICAgdGhpcy5tYWpvciA9IHYuZ2V0TWFqb3IoKTsKKyAgICAgICAgdGhpcy5taW5vciA9IHYuZ2V0TWlub3IoKTsKKyAgICAgICAgdGhpcy5zZXJ2aWNlID0gdi5nZXRNaWNybygpOworICAgICAgICB0aGlzLnF1YWxpZmllciA9IG51bGwgIT0gdi5nZXRRdWFsaWZpZXIoKSA/IHYuZ2V0UXVhbGlmaWVyKCkgOiAiIjsKKyAgICB9CiAKLQlwdWJsaWMgaW50IGdldE1ham9yKCkgewotCQlyZXR1cm4gbWFqb3I7Ci0JfQorICAgIHB1YmxpYyBpbnQgZ2V0TWFqb3IoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1ham9yOworICAgIH0KIAotCXB1YmxpYyBpbnQgZ2V0TWlub3IoKSB7Ci0JCXJldHVybiBtaW5vcjsKLQl9CisgICAgcHVibGljIGludCBnZXRNaW5vcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWlub3I7CisgICAgfQogCi0JcHVibGljIGludCBnZXRTZXJ2aWNlKCkgewotCQlyZXR1cm4gc2VydmljZTsKLQl9CisgICAgcHVibGljIGludCBnZXRTZXJ2aWNlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVyKCkgewotCQlyZXR1cm4gcXVhbGlmaWVyOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucXVhbGlmaWVyOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWJ1aWxkZXIuYXBwZW5kKHRoaXMubWFqb3IpOwotCQlidWlsZGVyLmFwcGVuZCgiLiIpOwotCQlidWlsZGVyLmFwcGVuZCh0aGlzLm1pbm9yKTsKLQkJYnVpbGRlci5hcHBlbmQoIi4iKTsKLQkJYnVpbGRlci5hcHBlbmQodGhpcy5zZXJ2aWNlKTsKLQkJaWYgKHRoaXMucXVhbGlmaWVyICE9IG51bGwgJiYgIXRoaXMucXVhbGlmaWVyLmVxdWFscygiIikpIHsKLQkJCWJ1aWxkZXIuYXBwZW5kKCIuIik7Ci0JCQlidWlsZGVyLmFwcGVuZCh0aGlzLnF1YWxpZmllcik7Ci0JCX0KLQkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQodGhpcy5tYWpvcik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIuIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHRoaXMubWlub3IpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiLiIpOworICAgICAgICBidWlsZGVyLmFwcGVuZCh0aGlzLnNlcnZpY2UpOworICAgICAgICBpZiAodGhpcy5xdWFsaWZpZXIgIT0gbnVsbCAmJiAhdGhpcy5xdWFsaWZpZXIuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHRoaXMucXVhbGlmaWVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgIH0KIAotCS8qKgotCSAqIE9yZGVycyBhcyB5b3Ugd291bGQgZXhwZWN0IGZvciBtYWpvcixtaW5vcixzZXJ2aWNlLCBhbmQgYWxwaGFiZXRpY2FsbHkKLQkgKiBmb3IgcXVhbGlmaWVyLgotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9zZ2lWZXJzaW9uIG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKHRoaXMubWFqb3IgPiBvLm1ham9yKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfSBlbHNlIGlmICh0aGlzLm1ham9yIDwgby5tYWpvcikgewotCQkJcmV0dXJuIC0xOwotCQl9IGVsc2UgaWYgKHRoaXMubWlub3IgPiBvLm1pbm9yKSB7IC8vIG1ham9yIHZlcnNpb25zIGVxdWFsCi0JCQlyZXR1cm4gMTsKLQkJfSBlbHNlIGlmICh0aGlzLm1pbm9yIDwgby5taW5vcikgewotCQkJcmV0dXJuIC0xOwotCQl9IGVsc2UgaWYgKHRoaXMuc2VydmljZSA+IG8uc2VydmljZSkgeyAvLyBtYWpvciBhbmQgbWlub3IgdmVyc2lvbnMgZXF1YWwKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgaWYgKHRoaXMuc2VydmljZSA8IG8uc2VydmljZSkgewotCQkJcmV0dXJuIC0xOwotCQl9IGVsc2UgeyAvLyBtYWpvciwgbWlub3IsIGFuZCBzZXJ2aWNlIHZlcnNpb25zIGVxdWFscwotCQkJU3RyaW5nIG15UXVhbGlmaWVyID0gdGhpcy5xdWFsaWZpZXI7Ci0JCQlTdHJpbmcgb3RoZXJRdWFsaWZpZXIgPSBvLnF1YWxpZmllcjsKLQkJCWlmIChteVF1YWxpZmllciA9PSBudWxsKSB7Ci0JCQkJbXlRdWFsaWZpZXIgPSAiIjsKLQkJCX0KLQkJCWlmIChvdGhlclF1YWxpZmllciA9PSBudWxsKSB7Ci0JCQkJb3RoZXJRdWFsaWZpZXIgPSAiIjsKLQkJCX0KLQkJCXJldHVybiBteVF1YWxpZmllci5jb21wYXJlVG8ob3RoZXJRdWFsaWZpZXIpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIE9yZGVycyBhcyB5b3Ugd291bGQgZXhwZWN0IGZvciBtYWpvcixtaW5vcixzZXJ2aWNlLCBhbmQgYWxwaGFiZXRpY2FsbHkgZm9yIHF1YWxpZmllci4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPc2dpVmVyc2lvbiBvKSB7CisgICAgICAgIGlmIChvID09IHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLm1ham9yID4gby5tYWpvcikgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcy5tYWpvciA8IG8ubWFqb3IpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1pbm9yID4gby5taW5vcikgeyAvLyBtYWpvciB2ZXJzaW9ucyBlcXVhbAorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcy5taW5vciA8IG8ubWlub3IpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlcnZpY2UgPiBvLnNlcnZpY2UpIHsgLy8gbWFqb3IgYW5kIG1pbm9yIHZlcnNpb25zIGVxdWFsCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlcnZpY2UgPCBvLnNlcnZpY2UpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsgLy8gbWFqb3IsIG1pbm9yLCBhbmQgc2VydmljZSB2ZXJzaW9ucyBlcXVhbHMKKyAgICAgICAgICAgIFN0cmluZyBteVF1YWxpZmllciA9IHRoaXMucXVhbGlmaWVyOworICAgICAgICAgICAgU3RyaW5nIG90aGVyUXVhbGlmaWVyID0gby5xdWFsaWZpZXI7CisgICAgICAgICAgICBpZiAobXlRdWFsaWZpZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG15UXVhbGlmaWVyID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3RoZXJRdWFsaWZpZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG90aGVyUXVhbGlmaWVyID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbXlRdWFsaWZpZXIuY29tcGFyZVRvKG90aGVyUXVhbGlmaWVyKTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgT3NnaVZlcnNpb24pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJT3NnaVZlcnNpb24gdmVyc2lvbiA9IChPc2dpVmVyc2lvbikgb2JqOwotCQlyZXR1cm4gdGhpcy50b1N0cmluZygpLmVxdWFscyh2ZXJzaW9uLnRvU3RyaW5nKCkpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAodGhpcyA9PSBvYmopIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE9zZ2lWZXJzaW9uKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIE9zZ2lWZXJzaW9uIHZlcnNpb24gPSAoT3NnaVZlcnNpb24pIG9iajsKKyAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoKS5lcXVhbHModmVyc2lvbi50b1N0cmluZygpKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy50b1N0cmluZygpLmhhc2hDb2RlKCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKCkuaGFzaENvZGUoKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbGVyZXBvc2l0b3J5L2RvbWFpbi9QYWNrYWdlRXhwb3J0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxlcmVwb3NpdG9yeS9kb21haW4vUGFja2FnZUV4cG9ydC5qYXZhCmluZGV4IDkzN2U4OWIuLmM1NmRlZjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbGVyZXBvc2l0b3J5L2RvbWFpbi9QYWNrYWdlRXhwb3J0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL1BhY2thZ2VFeHBvcnQuamF2YQpAQCAtNCwxMCArNCwxMSBAQAogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAorICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbGVyZXBvc2l0b3J5LmRvbWFpbjsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpAQCAtMjEsODQgKzIyLDgzIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQYWNrYWdlRXhwb3J0IHsKIAotCXByaXZhdGUgYnl0ZVtdIG5hbWU7IC8vIHRoZSBmdWxseS1xdWFsaWZpZWQgcGFja2FnZSBuYW1lCisgICAgcHJpdmF0ZSBieXRlW10gbmFtZTsgLy8gdGhlIGZ1bGx5LXF1YWxpZmllZCBwYWNrYWdlIG5hbWUKIAotCXByaXZhdGUgT3NnaVZlcnNpb24gdmVyc2lvbjsgLy8gdGhlIHZlcnNpb24gb2YgdGhlIHBhY2thZ2UgYXMgZXhwb3J0ZWQgYnkKLQkJCQkJCQkJCS8vIHRoZSBvd25pbmcgYnVuZGxlCisgICAgcHJpdmF0ZSBPc2dpVmVyc2lvbiB2ZXJzaW9uOyAvLyB0aGUgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSBhcyBleHBvcnRlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG93bmluZyBidW5kbGUKIAotCXByaXZhdGUgU2V0PFBhY2thZ2VNZW1iZXI+IGV4cG9ydHM7IC8vIHRoZSBjb250ZW50cyBvZiB0aGUgZXhwb3J0ZWQgcGFja2FnZQorICAgIHByaXZhdGUgU2V0PFBhY2thZ2VNZW1iZXI+IGV4cG9ydHM7IC8vIHRoZSBjb250ZW50cyBvZiB0aGUgZXhwb3J0ZWQgcGFja2FnZQogCi0JcHJpdmF0ZSBCdW5kbGVBcnRlZmFjdCBidW5kbGU7IC8vIHRoZSBidW5kbGUgZXhwb3J0aW5nIHRoaXMgcGFja2FnZQorICAgIHByaXZhdGUgQnVuZGxlQXJ0ZWZhY3QgYnVuZGxlOyAvLyB0aGUgYnVuZGxlIGV4cG9ydGluZyB0aGlzIHBhY2thZ2UKIAotCS8qIGZvciBwZXJzaXN0ZW5jZSBvbmx5ICovCi0JcHJvdGVjdGVkIFBhY2thZ2VFeHBvcnQoKSB7Ci0JfQorICAgIC8qIGZvciBwZXJzaXN0ZW5jZSBvbmx5ICovCisgICAgcHJvdGVjdGVkIFBhY2thZ2VFeHBvcnQoKSB7CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHBhY2thZ2UgZXhwb3J0ZWQgYnkgdGhlIGdpdmVuIGJ1bmRsZSwgd2l0aCB0aGUgZ2l2ZW4gbmFtZQotCSAqIGFuZCB2ZXJzaW9uCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZSBidW5kbGUgZXhwb3J0aW5nIHRoZSBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBwYWNrYWdlCi0JICogQHBhcmFtIHZlcnNpb24gdGhlIGV4cG9ydGVkIHZlcnNpb24gb2YgdGhlIHBhY2thZ2UKLQkgKi8KLQlwdWJsaWMgUGFja2FnZUV4cG9ydChCdW5kbGVBcnRlZmFjdCBidW5kbGUsIFN0cmluZyBuYW1lLCBPc2dpVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQl0aGlzLm5hbWUgPSBBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNvbnZlcnQobmFtZSk7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMuZXhwb3J0cyA9IG5ldyBIYXNoU2V0PFBhY2thZ2VNZW1iZXI+KCk7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBwYWNrYWdlIGV4cG9ydGVkIGJ5IHRoZSBnaXZlbiBidW5kbGUsIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHZlcnNpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBidW5kbGUgYnVuZGxlIGV4cG9ydGluZyB0aGUgcGFja2FnZQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgcGFja2FnZQorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBleHBvcnRlZCB2ZXJzaW9uIG9mIHRoZSBwYWNrYWdlCisgICAgICovCisgICAgcHVibGljIFBhY2thZ2VFeHBvcnQoQnVuZGxlQXJ0ZWZhY3QgYnVuZGxlLCBTdHJpbmcgbmFtZSwgT3NnaVZlcnNpb24gdmVyc2lvbikgeworICAgICAgICB0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKKyAgICAgICAgdGhpcy5uYW1lID0gQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jb252ZXJ0KG5hbWUpOworICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICB0aGlzLmV4cG9ydHMgPSBuZXcgSGFzaFNldDxQYWNrYWdlTWVtYmVyPigpOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybiB0aGUgYnVuZGxlIGV4cG9ydGluZyB0aGlzIHBhY2thZ2UKLQkgKi8KLQlwdWJsaWMgQnVuZGxlQXJ0ZWZhY3QgZ2V0QnVuZGxlKCkgewotCQlyZXR1cm4gdGhpcy5idW5kbGU7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYnVuZGxlIGV4cG9ydGluZyB0aGlzIHBhY2thZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlQXJ0ZWZhY3QgZ2V0QnVuZGxlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5idW5kbGU7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJuIHRoZSBidW5kbGUgZXhwb3J0aW5nIHRoaXMgcGFja2FnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJ1bmRsZShCdW5kbGVBcnRlZmFjdCBidW5kbGUpIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYnVuZGxlIGV4cG9ydGluZyB0aGlzIHBhY2thZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCdW5kbGUoQnVuZGxlQXJ0ZWZhY3QgYnVuZGxlKSB7CisgICAgICAgIHRoaXMuYnVuZGxlID0gYnVuZGxlOworICAgIH0KIAotCS8qKgotCSAqIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgcGFja2FnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIChuYW1lICE9IG51bGwgPyBuZXcgU3RyaW5nKG5hbWUpIDogbnVsbCk7Ci0JfQorICAgIC8qKgorICAgICAqIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgcGFja2FnZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZSAhPSBudWxsID8gbmV3IFN0cmluZyh0aGlzLm5hbWUpIDogbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSBhcyBleHBvcnRlZCBieSB0aGUgb3duaW5nIGJ1bmRsZQotCSAqLwotCXB1YmxpYyBPc2dpVmVyc2lvbiBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy52ZXJzaW9uOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgcGFja2FnZSBhcyBleHBvcnRlZCBieSB0aGUgb3duaW5nIGJ1bmRsZQorICAgICAqLworICAgIHB1YmxpYyBPc2dpVmVyc2lvbiBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uOworICAgIH0KIAotCS8qKgotCSAqIFRoZSBzZXQgb2YgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIGV4cG9ydGVkIGJ5IHRoZSBwYWNrYWdlCi0JICovCi0JcHVibGljIFNldDxQYWNrYWdlTWVtYmVyPiBnZXRFeHBvcnRzKCkgewotCQlyZXR1cm4gdGhpcy5leHBvcnRzOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGUgc2V0IG9mIGNsYXNzZXMgYW5kIHJlc291cmNlcyBleHBvcnRlZCBieSB0aGUgcGFja2FnZQorICAgICAqLworICAgIHB1YmxpYyBTZXQ8UGFja2FnZU1lbWJlcj4gZ2V0RXhwb3J0cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZXhwb3J0czsKKyAgICB9CiAKLQkvKioKLQkgKiBBZGQgYSBuZXcgY2xhc3MgdG8gdGhlIHNldCBvZiBjbGFzc2VzIGV4cG9ydGVkIGJ5IHRoaXMgcGFja2FnZQotCSAqIAotCSAqIEBwYXJhbSBjbGFzc05hbWUgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDbGFzc0V4cG9ydChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRoaXMuZXhwb3J0cy5hZGQobmV3IFBhY2thZ2VNZW1iZXIoY2xhc3NOYW1lLCBQYWNrYWdlTWVtYmVyVHlwZS5DTEFTUywgdGhpcykpOwotCX0KKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgY2xhc3MgdG8gdGhlIHNldCBvZiBjbGFzc2VzIGV4cG9ydGVkIGJ5IHRoaXMgcGFja2FnZQorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGFkZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENsYXNzRXhwb3J0KFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgdGhpcy5leHBvcnRzLmFkZChuZXcgUGFja2FnZU1lbWJlcihjbGFzc05hbWUsIFBhY2thZ2VNZW1iZXJUeXBlLkNMQVNTLCB0aGlzKSk7CisgICAgfQogCi0JLyoqCi0JICogQWRkIGEgbmV3IHJlc291cmNlIHRvIHRoZSBzZXQgb2YgcmVzb3VyY2VzIGV4cG9ydGVkIGJ5IHRoaXMgcGFja2FnZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZU5hbWUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgcmVzb3VyY2UgaW4gdGhlIGV4cG9ydGVkIHBhY2thZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZUV4cG9ydChTdHJpbmcgcmVzb3VyY2VOYW1lKSB7Ci0JCXRoaXMuZXhwb3J0cy5hZGQobmV3IFBhY2thZ2VNZW1iZXIocmVzb3VyY2VOYW1lLCBQYWNrYWdlTWVtYmVyVHlwZS5SRVNPVVJDRSwgdGhpcykpOwotCX0KKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgcmVzb3VyY2UgdG8gdGhlIHNldCBvZiByZXNvdXJjZXMgZXhwb3J0ZWQgYnkgdGhpcyBwYWNrYWdlCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VOYW1lIHRoZSBmdWxsIHBhdGggdG8gdGhlIHJlc291cmNlIGluIHRoZSBleHBvcnRlZCBwYWNrYWdlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVzb3VyY2VFeHBvcnQoU3RyaW5nIHJlc291cmNlTmFtZSkgeworICAgICAgICB0aGlzLmV4cG9ydHMuYWRkKG5ldyBQYWNrYWdlTWVtYmVyKHJlc291cmNlTmFtZSwgUGFja2FnZU1lbWJlclR5cGUuUkVTT1VSQ0UsIHRoaXMpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxlcmVwb3NpdG9yeS9kb21haW4vUGFja2FnZUltcG9ydC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL1BhY2thZ2VJbXBvcnQuamF2YQppbmRleCAxN2IzOTE4Li5lMTg1NjNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxlcmVwb3NpdG9yeS9kb21haW4vUGFja2FnZUltcG9ydC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbGVyZXBvc2l0b3J5L2RvbWFpbi9QYWNrYWdlSW1wb3J0LmphdmEKQEAgLTQsNjUgKzQsNjYgQEAKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW47CiAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLmFydGVmYWN0cy5BcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwogCiAvKioKLSAqIFJlcHJlc2VudCBhbiBpbXBvcnQtcGFja2FnZSBkZWNsYXJhdGlvbiBmb3IgYW4gT1NHaSBidW5kbGUuIElnbm9yZXMgbWF0Y2hpbmcKLSAqIGF0dHJpYnV0ZXMgYW5kIG9ubHkgd29ycmllcyBhYm91dCB2ZXJzaW9uIHJhbmdlIGFuZCBvcHRpb25hbGl0eS4KLSAqIAorICogUmVwcmVzZW50IGFuIGltcG9ydC1wYWNrYWdlIGRlY2xhcmF0aW9uIGZvciBhbiBPU0dpIGJ1bmRsZS4gSWdub3JlcyBtYXRjaGluZyBhdHRyaWJ1dGVzIGFuZCBvbmx5IHdvcnJpZXMgYWJvdXQKKyAqIHZlcnNpb24gcmFuZ2UgYW5kIG9wdGlvbmFsaXR5LgorICoKICAqIEBhdXRob3IgYWNvbHllcgogICovCiBwdWJsaWMgY2xhc3MgUGFja2FnZUltcG9ydCB7CiAKLQlwcml2YXRlIGJ5dGVbXSBuYW1lOyAvLyBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGltcG9ydGVkCisgICAgcHJpdmF0ZSBieXRlW10gbmFtZTsgLy8gbmFtZSBvZiB0aGUgcGFja2FnZSB0byBiZSBpbXBvcnRlZAogCi0JcHJpdmF0ZSBib29sZWFuIGlzT3B0aW9uYWw7IC8vIHdoZXRoZXIgb3Igbm90IHRoaXMgaW1wb3J0IGlzIG9wdGlvbmFsCisgICAgcHJpdmF0ZSBib29sZWFuIGlzT3B0aW9uYWw7IC8vIHdoZXRoZXIgb3Igbm90IHRoaXMgaW1wb3J0IGlzIG9wdGlvbmFsCiAKLQlwcml2YXRlIFZlcnNpb25SYW5nZSBpbXBvcnRSYW5nZTsgLy8gdGhlIHJhbmdlIG9mIHZlcnNpb24gdGhhdCBhcmUKLQkJCQkJCQkJCQkvLyBhY2NlcHRhYmxlCisgICAgcHJpdmF0ZSBWZXJzaW9uUmFuZ2UgaW1wb3J0UmFuZ2U7IC8vIHRoZSByYW5nZSBvZiB2ZXJzaW9uIHRoYXQgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY2VwdGFibGUKIAotCS8qKiBmb3IgcGVyc2lzdGVuY2UgdXNlIG9ubHkgKi8KLQlwcm90ZWN0ZWQgUGFja2FnZUltcG9ydCgpIHsKLQl9CisgICAgLyoqIGZvciBwZXJzaXN0ZW5jZSB1c2Ugb25seSAqLworICAgIHByb3RlY3RlZCBQYWNrYWdlSW1wb3J0KCkgeworICAgIH0KIAotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBwYWNrYWdlIGltcG9ydC4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBiZSBpbXBvcnRlZAotCSAqIEBwYXJhbSBpc09wdGlvbmFsIHRydWUgaWYgdGhpcyBpcyBhbiBvcHRpb25hbCBpbXBvcnQKLQkgKiBAcGFyYW0gcmFuZ2UgdGhlIHJhbmdlIG9mIHZlcnNpb25zIHRoYXQgYXJlIGFjY2VwdGFibGUKLQkgKi8KLQlwdWJsaWMgUGFja2FnZUltcG9ydChTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc09wdGlvbmFsLCBWZXJzaW9uUmFuZ2UgcmFuZ2UpIHsKLQkJdGhpcy5uYW1lID0gQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jb252ZXJ0KG5hbWUpOwotCQl0aGlzLmlzT3B0aW9uYWwgPSBpc09wdGlvbmFsOwotCQl0aGlzLmltcG9ydFJhbmdlID0gcmFuZ2U7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBwYWNrYWdlIGltcG9ydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGltcG9ydGVkCisgICAgICogQHBhcmFtIGlzT3B0aW9uYWwgdHJ1ZSBpZiB0aGlzIGlzIGFuIG9wdGlvbmFsIGltcG9ydAorICAgICAqIEBwYXJhbSByYW5nZSB0aGUgcmFuZ2Ugb2YgdmVyc2lvbnMgdGhhdCBhcmUgYWNjZXB0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBQYWNrYWdlSW1wb3J0KFN0cmluZyBuYW1lLCBib29sZWFuIGlzT3B0aW9uYWwsIFZlcnNpb25SYW5nZSByYW5nZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNvbnZlcnQobmFtZSk7CisgICAgICAgIHRoaXMuaXNPcHRpb25hbCA9IGlzT3B0aW9uYWw7CisgICAgICAgIHRoaXMuaW1wb3J0UmFuZ2UgPSByYW5nZTsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAobmFtZSAhPSBudWxsID8gbmV3IFN0cmluZyhuYW1lKSA6IG51bGwpOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWUgIT0gbnVsbCA/IG5ldyBTdHJpbmcodGhpcy5uYW1lKSA6IG51bGw7CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIGlzT3B0aW9uYWw7Ci0JfQorICAgIHB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmlzT3B0aW9uYWw7CisgICAgfQogCi0JcHVibGljIFZlcnNpb25SYW5nZSBnZXRJbXBvcnRSYW5nZSgpIHsKLQkJcmV0dXJuIGltcG9ydFJhbmdlOwotCX0KKyAgICBwdWJsaWMgVmVyc2lvblJhbmdlIGdldEltcG9ydFJhbmdlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRSYW5nZTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGltcG9ydCBjYW4gYmUgc2F0aXNmaWVkIGJ5IHRoZSBnaXZlbiBleHBvcnRlZCBwYWNrYWdlCi0JICogCi0JICogQHBhcmFtIHBrZyB0aGUgY2FuZGlkYXRlIHBhY2thZ2UgZm9yIHNhdGlzZnlpbmcgdGhpcyBpbXBvcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdGlzZmllZEJ5KFBhY2thZ2VFeHBvcnQgcGtnKSB7Ci0JCXJldHVybiAodGhpcy5uYW1lLmVxdWFscyhwa2cuZ2V0TmFtZSgpKSAmJiB0aGlzLmltcG9ydFJhbmdlLmNvbnRhaW5zKHBrZy5nZXRWZXJzaW9uKCkpKTsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBpbXBvcnQgY2FuIGJlIHNhdGlzZmllZCBieSB0aGUgZ2l2ZW4gZXhwb3J0ZWQgcGFja2FnZQorICAgICAqCisgICAgICogQHBhcmFtIHBrZyB0aGUgY2FuZGlkYXRlIHBhY2thZ2UgZm9yIHNhdGlzZnlpbmcgdGhpcyBpbXBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NhdGlzZmllZEJ5KFBhY2thZ2VFeHBvcnQgcGtnKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWUuZXF1YWxzKHBrZy5nZXROYW1lKCkpICYmIHRoaXMuaW1wb3J0UmFuZ2UuY29udGFpbnMocGtnLmdldFZlcnNpb24oKSk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxlcmVwb3NpdG9yeS9kb21haW4vUGFja2FnZU1lbWJlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL1BhY2thZ2VNZW1iZXIuamF2YQppbmRleCA5OWVlNGRkLi42ZjEyNTVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxlcmVwb3NpdG9yeS9kb21haW4vUGFja2FnZU1lbWJlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbGVyZXBvc2l0b3J5L2RvbWFpbi9QYWNrYWdlTWVtYmVyLmphdmEKQEAgLTQsNjQgKzQsNjUgQEAKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW47CiAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLmFydGVmYWN0cy5BcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwogCiAvKioKICAqIEFuIGV4cG9ydGVkIG1lbWJlciBvZiBhbiBleHBvcnRlZCBwYWNrYWdlIChjbGFzcyBvciByZXNvdXJjZSkKLSAqIAorICoKICAqLwogcHVibGljIGNsYXNzIFBhY2thZ2VNZW1iZXIgewogCi0JcHJpdmF0ZSBieXRlW10gbmFtZTsgLy8gZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGV4cG9ydGVkIG1lbWJlcgorICAgIHByaXZhdGUgYnl0ZVtdIG5hbWU7IC8vIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBleHBvcnRlZCBtZW1iZXIKIAotCXByaXZhdGUgUGFja2FnZUV4cG9ydCBleHBvcnRpbmdQYWNrYWdlOyAvLyB0aGUgcGFja2FnZSBleHBvcnRpbmcgdGhpcyBtZW1iZXIKKyAgICBwcml2YXRlIFBhY2thZ2VFeHBvcnQgZXhwb3J0aW5nUGFja2FnZTsgLy8gdGhlIHBhY2thZ2UgZXhwb3J0aW5nIHRoaXMgbWVtYmVyCiAKLQlwcml2YXRlIFBhY2thZ2VNZW1iZXJUeXBlIG1lbWJlclR5cGU7IC8vIHRoZSBtZW1iZXIgdHlwZSAoY2xhc3Mgb3IgcmVzb3VyY2UpCisgICAgcHJpdmF0ZSBQYWNrYWdlTWVtYmVyVHlwZSBtZW1iZXJUeXBlOyAvLyB0aGUgbWVtYmVyIHR5cGUgKGNsYXNzIG9yIHJlc291cmNlKQogCi0JLyogZm9yIHBlcnNpc3RlbmNlIG9ubHkgKi8KLQlwcm90ZWN0ZWQgUGFja2FnZU1lbWJlcigpIHsKLQl9CisgICAgLyogZm9yIHBlcnNpc3RlbmNlIG9ubHkgKi8KKyAgICBwcm90ZWN0ZWQgUGFja2FnZU1lbWJlcigpIHsKKyAgICB9CiAKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgcGFja2FnZSBtZW1iZXIKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSB0aGUgZnVsbHktcXVhbGlmaWVkIG1lbWJlciBuYW1lCi0JICogQHBhcmFtIG1lbWJlclR5cGUgdGhlIG1lbWJlciB0eXBlIChjbGFzcyBvciByZXNvdXJjZSkKLQkgKiBAcGFyYW0gcGtnIHRoZSBleHBvcnRpbmcgcGFja2FnZQotCSAqLwotCXB1YmxpYyBQYWNrYWdlTWVtYmVyKFN0cmluZyBuYW1lLCBQYWNrYWdlTWVtYmVyVHlwZSBtZW1iZXJUeXBlLCBQYWNrYWdlRXhwb3J0IHBrZykgewotCQl0aGlzLm5hbWUgPSBBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNvbnZlcnQobmFtZSk7Ci0JCXRoaXMuZXhwb3J0aW5nUGFja2FnZSA9IHBrZzsKLQkJdGhpcy5tZW1iZXJUeXBlID0gbWVtYmVyVHlwZTsKLQl9CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHBhY2thZ2UgbWVtYmVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZnVsbHktcXVhbGlmaWVkIG1lbWJlciBuYW1lCisgICAgICogQHBhcmFtIG1lbWJlclR5cGUgdGhlIG1lbWJlciB0eXBlIChjbGFzcyBvciByZXNvdXJjZSkKKyAgICAgKiBAcGFyYW0gcGtnIHRoZSBleHBvcnRpbmcgcGFja2FnZQorICAgICAqLworICAgIHB1YmxpYyBQYWNrYWdlTWVtYmVyKFN0cmluZyBuYW1lLCBQYWNrYWdlTWVtYmVyVHlwZSBtZW1iZXJUeXBlLCBQYWNrYWdlRXhwb3J0IHBrZykgeworICAgICAgICB0aGlzLm5hbWUgPSBBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNvbnZlcnQobmFtZSk7CisgICAgICAgIHRoaXMuZXhwb3J0aW5nUGFja2FnZSA9IHBrZzsKKyAgICAgICAgdGhpcy5tZW1iZXJUeXBlID0gbWVtYmVyVHlwZTsKKyAgICB9CiAKLQkvKioKLQkgKiBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyBtZW1iZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAobmFtZSAhPSBudWxsID8gbmV3IFN0cmluZyh0aGlzLm5hbWUpIDogbnVsbCk7Ci0JfQorICAgIC8qKgorICAgICAqIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGlzIG1lbWJlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZSAhPSBudWxsID8gbmV3IFN0cmluZyh0aGlzLm5hbWUpIDogbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBUaGUgdHlwZSBvZiBtZW1iZXIgKGNsYXNzIG9yIHJlc291cmNlKQotCSAqLwotCXB1YmxpYyBQYWNrYWdlTWVtYmVyVHlwZSBnZXRNZW1iZXJUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5tZW1iZXJUeXBlOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBtZW1iZXIgKGNsYXNzIG9yIHJlc291cmNlKQorICAgICAqLworICAgIHB1YmxpYyBQYWNrYWdlTWVtYmVyVHlwZSBnZXRNZW1iZXJUeXBlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tZW1iZXJUeXBlOworICAgIH0KIAotCS8qKgotCSAqIFRoZSBwYWNrYWdlIGV4cG9ydGluZyB0aGlzIG1lbWJlcgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgUGFja2FnZUV4cG9ydCBnZXRFeHBvcnRpbmdQYWNrYWdlKCkgewotCQlyZXR1cm4gdGhpcy5leHBvcnRpbmdQYWNrYWdlOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGUgcGFja2FnZSBleHBvcnRpbmcgdGhpcyBtZW1iZXIKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFja2FnZUV4cG9ydCBnZXRFeHBvcnRpbmdQYWNrYWdlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5leHBvcnRpbmdQYWNrYWdlOworICAgIH0KIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbGVyZXBvc2l0b3J5L2RvbWFpbi9QYWNrYWdlTWVtYmVyVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL1BhY2thZ2VNZW1iZXJUeXBlLmphdmEKaW5kZXggNDU5ZjkyZC4uZTgzNjRkOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL1BhY2thZ2VNZW1iZXJUeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL1BhY2thZ2VNZW1iZXJUeXBlLmphdmEKQEAgLTQsMTUgKzQsMTYgQEAKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW47CiAKIC8qKgogICogVGhlIHR5cGUgb2YgbWVtYmVyIGV4cG9ydGVkIGJ5IGEgcGFja2FnZSAoSmF2YSBDbGFzcyBvciByZXNvdXJjZSkKICAqLwogcHVibGljIGVudW0gUGFja2FnZU1lbWJlclR5cGUgewotCUNMQVNTLCBSRVNPVVJDRQorICAgIENMQVNTLCBSRVNPVVJDRQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL1NwcmluZ1NvdXJjZUFwcGxpY2F0aW9uUGxhdGZvcm0uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbGVyZXBvc2l0b3J5L2RvbWFpbi9TcHJpbmdTb3VyY2VBcHBsaWNhdGlvblBsYXRmb3JtLmphdmEKaW5kZXggZTljZGE2Ni4uZmIzMzAzOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL1NwcmluZ1NvdXJjZUFwcGxpY2F0aW9uUGxhdGZvcm0uamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxlcmVwb3NpdG9yeS9kb21haW4vU3ByaW5nU291cmNlQXBwbGljYXRpb25QbGF0Zm9ybS5qYXZhCkBAIC00LDEwICs0LDExIEBACiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCisgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsZXJlcG9zaXRvcnkuZG9tYWluOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTE2LDM3ICsxNywzNyBAQAogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiAKIC8qKgotICogUmVwcmVzZW50cyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgU3ByaW5nU291cmNlQXBwbGljYXRpb25QbGF0Zm9ybSBvc2dpCi0gKiBwcm9maWxlCi0gKiAKKyAqIFJlcHJlc2VudHMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFNwcmluZ1NvdXJjZUFwcGxpY2F0aW9uUGxhdGZvcm0gb3NnaSBwcm9maWxlCisgKgogICogQGF1dGhvciBhY29seWVyCi0gKiAKKyAqCiAgKi8KIHB1YmxpYyBjbGFzcyBTcHJpbmdTb3VyY2VBcHBsaWNhdGlvblBsYXRmb3JtIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBfUFJPUFMgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsZXJlcG9zaXRvcnkuZG9tYWluLmVxdWlub3guQVBQcm9maWxlIjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9zZ2lWZXJzaW9uIFVOVkVSU0lPTkVEID0gbmV3IE9zZ2lWZXJzaW9uKCIwLjAuMCIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUF9QUk9QUyA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uZXF1aW5veC5BUFByb2ZpbGUiOwogCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSBhcFByb3BzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9zZ2lWZXJzaW9uIFVOVkVSU0lPTkVEID0gbmV3IE9zZ2lWZXJzaW9uKCIwLjAuMCIpOwogCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gZXhwb3J0ZWRTeXN0ZW1QYWNrYWdlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VCdW5kbGUgYXBQcm9wczsKIAotCXB1YmxpYyBTcHJpbmdTb3VyY2VBcHBsaWNhdGlvblBsYXRmb3JtKCkgewotCQl0aGlzLmFwUHJvcHMgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQVBfUFJPUFMpOwotCQlTdHJpbmcgc3lzdGVtUGFja2FnZXMgPSBhcFByb3BzLmdldFN0cmluZygib3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyIpOwotCQlwYXJzZVN5c3RlbVBhY2thZ2VzKHN5c3RlbVBhY2thZ2VzKTsKLQl9CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gZXhwb3J0ZWRTeXN0ZW1QYWNrYWdlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogCi0JcHVibGljIGJvb2xlYW4gaXNTYXRpc2ZpZWRWaWFTeXN0ZW1CdW5kbGUoUGFja2FnZUltcG9ydCBpbXApIHsKLQkJcmV0dXJuICh0aGlzLmV4cG9ydGVkU3lzdGVtUGFja2FnZXMuY29udGFpbnMoaW1wLmdldE5hbWUoKSkgJiYgaW1wLmdldEltcG9ydFJhbmdlKCkuY29udGFpbnMoVU5WRVJTSU9ORUQpKTsKLQl9CisgICAgcHVibGljIFNwcmluZ1NvdXJjZUFwcGxpY2F0aW9uUGxhdGZvcm0oKSB7CisgICAgICAgIHRoaXMuYXBQcm9wcyA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShBUF9QUk9QUyk7CisgICAgICAgIFN0cmluZyBzeXN0ZW1QYWNrYWdlcyA9IHRoaXMuYXBQcm9wcy5nZXRTdHJpbmcoIm9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMiKTsKKyAgICAgICAgcGFyc2VTeXN0ZW1QYWNrYWdlcyhzeXN0ZW1QYWNrYWdlcyk7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIHBhcnNlU3lzdGVtUGFja2FnZXMoU3RyaW5nIHN5c3RlbVBhY2thZ2VzUHJvcGVydHlWYWx1ZSkgewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzeXN0ZW1QYWNrYWdlc1Byb3BlcnR5VmFsdWUsICIsIik7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJdGhpcy5leHBvcnRlZFN5c3RlbVBhY2thZ2VzLmFkZCh0b2tlbik7Ci0JCX0KLQl9CisgICAgcHVibGljIGJvb2xlYW4gaXNTYXRpc2ZpZWRWaWFTeXN0ZW1CdW5kbGUoUGFja2FnZUltcG9ydCBpbXApIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZXhwb3J0ZWRTeXN0ZW1QYWNrYWdlcy5jb250YWlucyhpbXAuZ2V0TmFtZSgpKSAmJiBpbXAuZ2V0SW1wb3J0UmFuZ2UoKS5jb250YWlucyhVTlZFUlNJT05FRCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlU3lzdGVtUGFja2FnZXMoU3RyaW5nIHN5c3RlbVBhY2thZ2VzUHJvcGVydHlWYWx1ZSkgeworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzeXN0ZW1QYWNrYWdlc1Byb3BlcnR5VmFsdWUsICIsIik7CisgICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICBTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOworICAgICAgICAgICAgdGhpcy5leHBvcnRlZFN5c3RlbVBhY2thZ2VzLmFkZCh0b2tlbik7CisgICAgICAgIH0KKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbGVyZXBvc2l0b3J5L2RvbWFpbi9WZXJzaW9uUmFuZ2UuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9idW5kbGVyZXBvc2l0b3J5L2RvbWFpbi9WZXJzaW9uUmFuZ2UuamF2YQppbmRleCAxMmMzMWY4Li41Y2JiM2U1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvYnVuZGxlcmVwb3NpdG9yeS9kb21haW4vVmVyc2lvblJhbmdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2J1bmRsZXJlcG9zaXRvcnkvZG9tYWluL1ZlcnNpb25SYW5nZS5qYXZhCkBAIC00LDMwMSArNCwyOTYgQEAKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW47CiAKIC8qKgogICogUmVwcmVzZW50cyBhIHZlcnNpb24gcmFuZ2UgYXMgc3BlY2lmaWVkIGluIGFuIGltcG9ydCBwYWNrYWdlIGhlYWRlcgotICogCisgKgogICovCiBwdWJsaWMgY2xhc3MgVmVyc2lvblJhbmdlIHsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3NnaVZlcnNpb24gSU5GSU5JVFkgPSBuZXcgT3NnaVZlcnNpb24oSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRSwKLQkJIiIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3NnaVZlcnNpb24gSU5GSU5JVFkgPSBuZXcgT3NnaVZlcnNpb24oSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRSwgIiIpOwogCi0JcHJpdmF0ZSB0cmFuc2llbnQgT3NnaVZlcnNpb24gbG93ZXJCb3VuZDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBPc2dpVmVyc2lvbiBsb3dlckJvdW5kOwogCi0JcHJpdmF0ZSB0cmFuc2llbnQgT3NnaVZlcnNpb24gdXBwZXJCb3VuZDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBPc2dpVmVyc2lvbiB1cHBlckJvdW5kOwogCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5jbHVzaXZlTG93ZXJCb3VuZCA9IHRydWU7IC8vIGlmIHRydWUgdGhlbiB0aGUgYSB2ZXJzaW9uCi0JCQkJCQkJCQkJCQkJLy8gPT0gbG93ZXJCb3VuZCB3aWxsCi0JCQkJCQkJCQkJCQkJLy8gc2F0aXNmeSB0aGlzIHJhbmdlCisgICAgcHJpdmF0ZSBib29sZWFuIGlzSW5jbHVzaXZlTG93ZXJCb3VuZCA9IHRydWU7IC8vIGlmIHRydWUgdGhlbiB0aGUgYSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID09IGxvd2VyQm91bmQgd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXRpc2Z5IHRoaXMgcmFuZ2UKIAotCXByaXZhdGUgYm9vbGVhbiBpc0luY2x1c2l2ZVVwcGVyQm91bmQgPSBmYWxzZTsgLy8gaWYgdHJ1ZSB0aGVuIGEgdmVyc2lvbiA9PQotCQkJCQkJCQkJCQkJCS8vIHVwcGVyQm91bmQgd2lsbCBzYXRpc2Z5Ci0JCQkJCQkJCQkJCQkJLy8gdGhpcyByYW5nZQorICAgIHByaXZhdGUgYm9vbGVhbiBpc0luY2x1c2l2ZVVwcGVyQm91bmQgPSBmYWxzZTsgLy8gaWYgdHJ1ZSB0aGVuIGEgdmVyc2lvbiA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBwZXJCb3VuZCB3aWxsIHNhdGlzZnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcmFuZ2UKIAotCS8vIHRoZXNlIG5leHQgc2hlbmFuaWdhbnMgYXJlIGJlY2F1c2UgSlBBIGNhbid0IHBlcnNpc3QgYW4gZW1iZWRkYWJsZSB0eXBlCi0JLy8gbmVzdGVkIGluIGFuIGVtYmVkZGFibGUgdHlwZQotCS8vIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIGVpdGhlciBmdWRnZSB0aGluZ3MgaW4gdGhlIGRhdGFiYXNlIChieSBzdG9yaW5nCi0JLy8gdmVyc2lvbiByYW5nZXMgaW4gdGhlaXIgb3duIHRhYmxlKSwgb3IKLQkvLyBmdWRnZSB0aGluZ3MgaW4gdGhlIGRvbWFpbiBtb2RlbCAodG8gYWxsb3cgdmVyc2lvbiByYW5nZSBhbmQgaW1wb3J0Ci0JLy8gcGFja2FnZSBpbmZvcm1hdGlvbiB0byBiZSBzdG9yZWQgaW4KLQkvLyB0aGUgc2FtZSB0YWJsZSkuIFdlJ3ZlIGNob3NlbiB0aGUgbGF0dGVyIG9wdGlvbiBoZXJlIGFzIHdlIG5ldmVyIHdhbnQgdG8KLQkvLyByZXRyaWV2ZSBQYWNrYWdlSW1wb3J0cyB3aXRob3V0IHRoZWlyCi0JLy8gdmVyc2lvbiByYW5nZXMuCi0JcHJpdmF0ZSBpbnQgbG93ZXJCb3VuZE1ham9yOworICAgIC8vIHRoZXNlIG5leHQgc2hlbmFuaWdhbnMgYXJlIGJlY2F1c2UgSlBBIGNhbid0IHBlcnNpc3QgYW4gZW1iZWRkYWJsZSB0eXBlCisgICAgLy8gbmVzdGVkIGluIGFuIGVtYmVkZGFibGUgdHlwZQorICAgIC8vIHRoZXJlZm9yZSB3ZSBoYXZlIHRvIGVpdGhlciBmdWRnZSB0aGluZ3MgaW4gdGhlIGRhdGFiYXNlIChieSBzdG9yaW5nCisgICAgLy8gdmVyc2lvbiByYW5nZXMgaW4gdGhlaXIgb3duIHRhYmxlKSwgb3IKKyAgICAvLyBmdWRnZSB0aGluZ3MgaW4gdGhlIGRvbWFpbiBtb2RlbCAodG8gYWxsb3cgdmVyc2lvbiByYW5nZSBhbmQgaW1wb3J0CisgICAgLy8gcGFja2FnZSBpbmZvcm1hdGlvbiB0byBiZSBzdG9yZWQgaW4KKyAgICAvLyB0aGUgc2FtZSB0YWJsZSkuIFdlJ3ZlIGNob3NlbiB0aGUgbGF0dGVyIG9wdGlvbiBoZXJlIGFzIHdlIG5ldmVyIHdhbnQgdG8KKyAgICAvLyByZXRyaWV2ZSBQYWNrYWdlSW1wb3J0cyB3aXRob3V0IHRoZWlyCisgICAgLy8gdmVyc2lvbiByYW5nZXMuCisgICAgcHJpdmF0ZSBpbnQgbG93ZXJCb3VuZE1ham9yOwogCi0JcHJpdmF0ZSBpbnQgbG93ZXJCb3VuZE1pbm9yOworICAgIHByaXZhdGUgaW50IGxvd2VyQm91bmRNaW5vcjsKIAotCXByaXZhdGUgaW50IGxvd2VyQm91bmRTZXJ2aWNlOworICAgIHByaXZhdGUgaW50IGxvd2VyQm91bmRTZXJ2aWNlOwogCi0JcHJpdmF0ZSBTdHJpbmcgbG93ZXJCb3VuZFF1YWxpZmllcjsKKyAgICBwcml2YXRlIFN0cmluZyBsb3dlckJvdW5kUXVhbGlmaWVyOwogCi0JcHJpdmF0ZSBpbnQgdXBwZXJCb3VuZE1ham9yOworICAgIHByaXZhdGUgaW50IHVwcGVyQm91bmRNYWpvcjsKIAotCXByaXZhdGUgaW50IHVwcGVyQm91bmRNaW5vcjsKKyAgICBwcml2YXRlIGludCB1cHBlckJvdW5kTWlub3I7CiAKLQlwcml2YXRlIGludCB1cHBlckJvdW5kU2VydmljZTsKKyAgICBwcml2YXRlIGludCB1cHBlckJvdW5kU2VydmljZTsKIAotCXByaXZhdGUgU3RyaW5nIHVwcGVyQm91bmRRdWFsaWZpZXI7CisgICAgcHJpdmF0ZSBTdHJpbmcgdXBwZXJCb3VuZFF1YWxpZmllcjsKIAotCXByb3RlY3RlZCBWZXJzaW9uUmFuZ2UoKSB7Ci0JfQorICAgIHByb3RlY3RlZCBWZXJzaW9uUmFuZ2UoKSB7CisgICAgfQogCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdmVyc2lvbiByYW5nZSBmcm9tIHRoZSBTdHJpbmcgZm9ybWF0IGZvdW5kIGluIHRoZSB2ZXJzaW9uCi0JICogYXR0cmlidXRlIG9mIGFuIGltcG9ydCBwYWNrYWdlIGhlYWRlcgotCSAqIAotCSAqIEBwYXJhbSBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uIHJhbmdlIHNwZWNpZmljYXRpb24KLQkgKi8KLQlwdWJsaWMgVmVyc2lvblJhbmdlKFN0cmluZyBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uKSB7Ci0JCWlmICgob3NnaVJhbmdlU3BlY2lmaWNhdGlvbiA9PSBudWxsKSB8fCAob3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5lcXVhbHMoIiIpKSkgewotCQkJb3NnaVJhbmdlU3BlY2lmaWNhdGlvbiA9ICIwLjAuMCI7Ci0JCX0KLQkJLy8gc3RyaXAgYW55IHN1cnJvdW5kaW5nIHF1b3RlcwotCQlpZiAob3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5zdGFydHNXaXRoKCJcIiIpKSB7Ci0JCQlvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uID0gb3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5zdWJzdHJpbmcoMSwgb3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5sZW5ndGgoKSAtIDEpOwotCQl9CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgdmVyc2lvbiByYW5nZSBmcm9tIHRoZSBTdHJpbmcgZm9ybWF0IGZvdW5kIGluIHRoZSB2ZXJzaW9uIGF0dHJpYnV0ZSBvZiBhbiBpbXBvcnQgcGFja2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uIHJhbmdlIHNwZWNpZmljYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgVmVyc2lvblJhbmdlKFN0cmluZyBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uKSB7CisgICAgICAgIGlmIChvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uID09IG51bGwgfHwgb3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uID0gIjAuMC4wIjsKKyAgICAgICAgfQorICAgICAgICAvLyBzdHJpcCBhbnkgc3Vycm91bmRpbmcgcXVvdGVzCisgICAgICAgIGlmIChvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uLnN0YXJ0c1dpdGgoIlwiIikpIHsKKyAgICAgICAgICAgIG9zZ2lSYW5nZVNwZWNpZmljYXRpb24gPSBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uLnN1YnN0cmluZygxLCBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIH0KIAotCQlvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uID0gZXh0cmFjdExvd2VyQm91bmRDcml0ZXJpYShvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uKTsKKyAgICAgICAgb3NnaVJhbmdlU3BlY2lmaWNhdGlvbiA9IGV4dHJhY3RMb3dlckJvdW5kQ3JpdGVyaWEob3NnaVJhbmdlU3BlY2lmaWNhdGlvbik7CiAKLQkJb3NnaVJhbmdlU3BlY2lmaWNhdGlvbiA9IGV4dHJhY3RVcHBlckJvdW5kQ3JpdGVyaWEob3NnaVJhbmdlU3BlY2lmaWNhdGlvbik7CisgICAgICAgIG9zZ2lSYW5nZVNwZWNpZmljYXRpb24gPSBleHRyYWN0VXBwZXJCb3VuZENyaXRlcmlhKG9zZ2lSYW5nZVNwZWNpZmljYXRpb24pOwogCi0JCWJvb2xlYW4gaXNSYW5nZSA9IChvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uLmluZGV4T2YoIiwiKSAhPSAtMSk7Ci0JCWlmIChpc1JhbmdlKSB7Ci0JCQlpbnQgc3BsaXRJbmRleCA9IG9zZ2lSYW5nZVNwZWNpZmljYXRpb24uaW5kZXhPZigiLCIpOwotCQkJc2V0TG93ZXJCb3VuZChuZXcgT3NnaVZlcnNpb24ob3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5zdWJzdHJpbmcoMCwgc3BsaXRJbmRleCkpKTsKLQkJCXRyeSB7Ci0JCQkJc2V0VXBwZXJCb3VuZChuZXcgT3NnaVZlcnNpb24ob3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5zdWJzdHJpbmcoc3BsaXRJbmRleCArIDEpKSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vIGRlZmF1bHQgdG8gaW5maW5pdHkKLQkJCQlzZXRVcHBlckJvdW5kKElORklOSVRZKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXNldExvd2VyQm91bmQobmV3IE9zZ2lWZXJzaW9uKG9zZ2lSYW5nZVNwZWNpZmljYXRpb24pKTsKLQkJCXNldFVwcGVyQm91bmQoSU5GSU5JVFkpOwotCQl9Ci0JfQorICAgICAgICBib29sZWFuIGlzUmFuZ2UgPSBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uLmluZGV4T2YoIiwiKSAhPSAtMTsKKyAgICAgICAgaWYgKGlzUmFuZ2UpIHsKKyAgICAgICAgICAgIGludCBzcGxpdEluZGV4ID0gb3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5pbmRleE9mKCIsIik7CisgICAgICAgICAgICBzZXRMb3dlckJvdW5kKG5ldyBPc2dpVmVyc2lvbihvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uLnN1YnN0cmluZygwLCBzcGxpdEluZGV4KSkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXRVcHBlckJvdW5kKG5ldyBPc2dpVmVyc2lvbihvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uLnN1YnN0cmluZyhzcGxpdEluZGV4ICsgMSkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBpbmZpbml0eQorICAgICAgICAgICAgICAgIHNldFVwcGVyQm91bmQoSU5GSU5JVFkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0TG93ZXJCb3VuZChuZXcgT3NnaVZlcnNpb24ob3NnaVJhbmdlU3BlY2lmaWNhdGlvbikpOworICAgICAgICAgICAgc2V0VXBwZXJCb3VuZChJTkZJTklUWSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGUgYSB2ZXJzaW9uIHJhbmdlIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBsb3dlckJvdW5kIGxvd2VyIGJvdW5kIG9mIHJhbmdlCi0JICogQHBhcmFtIGxvd2VySW5jbHVzaXZlIHdoZXRoZXIgdGhlIGxvd2VyIGJvdW5kIGlzIGluY2x1c2l2ZSAodHJ1ZSkgb3IKLQkgKiAgICAgICAgZXhjbHVzaXZlIChmYWxzZSkKLQkgKiBAcGFyYW0gdXBwZXJCb3VuZCB1cHBlciBib3VuZCBvZiByYW5nZQotCSAqIEBwYXJhbSB1cHBlckluY2x1c2l2ZSB3aGV0aGVyIHRoZSB1cHBlciBib3VuZCBpcyBpbmNsdXNpdmUgKHRydWUpIG9yCi0JICogICAgICAgIGV4Y2x1c2l2ZSAoZmFsc2UpCi0JICovCi0JcHVibGljIFZlcnNpb25SYW5nZShPc2dpVmVyc2lvbiBsb3dlckJvdW5kLCBib29sZWFuIGxvd2VySW5jbHVzaXZlLCBPc2dpVmVyc2lvbiB1cHBlckJvdW5kLCBib29sZWFuIHVwcGVySW5jbHVzaXZlKSB7Ci0JCXNldExvd2VyQm91bmQobG93ZXJCb3VuZCk7Ci0JCXNldFVwcGVyQm91bmQodXBwZXJCb3VuZCk7Ci0JCXRoaXMuaXNJbmNsdXNpdmVMb3dlckJvdW5kID0gbG93ZXJJbmNsdXNpdmU7Ci0JCXRoaXMuaXNJbmNsdXNpdmVVcHBlckJvdW5kID0gdXBwZXJJbmNsdXNpdmU7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHZlcnNpb24gcmFuZ2Ugb2JqZWN0CisgICAgICoKKyAgICAgKiBAcGFyYW0gbG93ZXJCb3VuZCBsb3dlciBib3VuZCBvZiByYW5nZQorICAgICAqIEBwYXJhbSBsb3dlckluY2x1c2l2ZSB3aGV0aGVyIHRoZSBsb3dlciBib3VuZCBpcyBpbmNsdXNpdmUgKHRydWUpIG9yIGV4Y2x1c2l2ZSAoZmFsc2UpCisgICAgICogQHBhcmFtIHVwcGVyQm91bmQgdXBwZXIgYm91bmQgb2YgcmFuZ2UKKyAgICAgKiBAcGFyYW0gdXBwZXJJbmNsdXNpdmUgd2hldGhlciB0aGUgdXBwZXIgYm91bmQgaXMgaW5jbHVzaXZlICh0cnVlKSBvciBleGNsdXNpdmUgKGZhbHNlKQorICAgICAqLworICAgIHB1YmxpYyBWZXJzaW9uUmFuZ2UoT3NnaVZlcnNpb24gbG93ZXJCb3VuZCwgYm9vbGVhbiBsb3dlckluY2x1c2l2ZSwgT3NnaVZlcnNpb24gdXBwZXJCb3VuZCwgYm9vbGVhbiB1cHBlckluY2x1c2l2ZSkgeworICAgICAgICBzZXRMb3dlckJvdW5kKGxvd2VyQm91bmQpOworICAgICAgICBzZXRVcHBlckJvdW5kKHVwcGVyQm91bmQpOworICAgICAgICB0aGlzLmlzSW5jbHVzaXZlTG93ZXJCb3VuZCA9IGxvd2VySW5jbHVzaXZlOworICAgICAgICB0aGlzLmlzSW5jbHVzaXZlVXBwZXJCb3VuZCA9IHVwcGVySW5jbHVzaXZlOworICAgIH0KIAotCS8qIHNoZW5hbmlnYW5zIHdpdGggdmVyc2lvbiBmaWVsZHMgYXJlIGJlY2F1c2Ugb2YgSlBBIGxpbWl0YXRpb24gKi8KLQlwdWJsaWMgT3NnaVZlcnNpb24gZ2V0TG93ZXJCb3VuZCgpIHsKLQkJaWYgKHRoaXMubG93ZXJCb3VuZCA9PSBudWxsKSB7Ci0JCQl0aGlzLmxvd2VyQm91bmQgPSBuZXcgT3NnaVZlcnNpb24obG93ZXJCb3VuZE1ham9yLCBsb3dlckJvdW5kTWlub3IsIGxvd2VyQm91bmRTZXJ2aWNlLCBsb3dlckJvdW5kUXVhbGlmaWVyKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5sb3dlckJvdW5kOwotCX0KKyAgICAvKiBzaGVuYW5pZ2FucyB3aXRoIHZlcnNpb24gZmllbGRzIGFyZSBiZWNhdXNlIG9mIEpQQSBsaW1pdGF0aW9uICovCisgICAgcHVibGljIE9zZ2lWZXJzaW9uIGdldExvd2VyQm91bmQoKSB7CisgICAgICAgIGlmICh0aGlzLmxvd2VyQm91bmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5sb3dlckJvdW5kID0gbmV3IE9zZ2lWZXJzaW9uKHRoaXMubG93ZXJCb3VuZE1ham9yLCB0aGlzLmxvd2VyQm91bmRNaW5vciwgdGhpcy5sb3dlckJvdW5kU2VydmljZSwgdGhpcy5sb3dlckJvdW5kUXVhbGlmaWVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5sb3dlckJvdW5kOworICAgIH0KIAotCS8qIHNoZW5hbmlnYW5zIHdpdGggdmVyc2lvbiBmaWVsZHMgYXJlIGJlY2F1c2Ugb2YgSlBBIGxpbWl0YXRpb24gKi8KLQlwdWJsaWMgdm9pZCBzZXRMb3dlckJvdW5kKE9zZ2lWZXJzaW9uIGJvdW5kKSB7Ci0JCXRoaXMubG93ZXJCb3VuZCA9IGJvdW5kOwotCQl0aGlzLmxvd2VyQm91bmRNYWpvciA9IGJvdW5kLmdldE1ham9yKCk7Ci0JCXRoaXMubG93ZXJCb3VuZE1pbm9yID0gYm91bmQuZ2V0TWlub3IoKTsKLQkJdGhpcy5sb3dlckJvdW5kU2VydmljZSA9IGJvdW5kLmdldFNlcnZpY2UoKTsKLQkJdGhpcy5sb3dlckJvdW5kUXVhbGlmaWVyID0gYm91bmQuZ2V0UXVhbGlmaWVyKCk7Ci0JfQorICAgIC8qIHNoZW5hbmlnYW5zIHdpdGggdmVyc2lvbiBmaWVsZHMgYXJlIGJlY2F1c2Ugb2YgSlBBIGxpbWl0YXRpb24gKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb3dlckJvdW5kKE9zZ2lWZXJzaW9uIGJvdW5kKSB7CisgICAgICAgIHRoaXMubG93ZXJCb3VuZCA9IGJvdW5kOworICAgICAgICB0aGlzLmxvd2VyQm91bmRNYWpvciA9IGJvdW5kLmdldE1ham9yKCk7CisgICAgICAgIHRoaXMubG93ZXJCb3VuZE1pbm9yID0gYm91bmQuZ2V0TWlub3IoKTsKKyAgICAgICAgdGhpcy5sb3dlckJvdW5kU2VydmljZSA9IGJvdW5kLmdldFNlcnZpY2UoKTsKKyAgICAgICAgdGhpcy5sb3dlckJvdW5kUXVhbGlmaWVyID0gYm91bmQuZ2V0UXVhbGlmaWVyKCk7CisgICAgfQogCi0JLyogc2hlbmFuaWdhbnMgd2l0aCB2ZXJzaW9uIGZpZWxkcyBhcmUgYmVjYXVzZSBvZiBKUEEgbGltaXRhdGlvbiAqLwotCXB1YmxpYyBPc2dpVmVyc2lvbiBnZXRVcHBlckJvdW5kKCkgewotCQlpZiAodGhpcy51cHBlckJvdW5kID09IG51bGwpIHsKLQkJCXRoaXMudXBwZXJCb3VuZCA9IG5ldyBPc2dpVmVyc2lvbih1cHBlckJvdW5kTWFqb3IsIHVwcGVyQm91bmRNaW5vciwgdXBwZXJCb3VuZFNlcnZpY2UsIHVwcGVyQm91bmRRdWFsaWZpZXIpOwotCQl9Ci0JCXJldHVybiB0aGlzLnVwcGVyQm91bmQ7Ci0JfQorICAgIC8qIHNoZW5hbmlnYW5zIHdpdGggdmVyc2lvbiBmaWVsZHMgYXJlIGJlY2F1c2Ugb2YgSlBBIGxpbWl0YXRpb24gKi8KKyAgICBwdWJsaWMgT3NnaVZlcnNpb24gZ2V0VXBwZXJCb3VuZCgpIHsKKyAgICAgICAgaWYgKHRoaXMudXBwZXJCb3VuZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnVwcGVyQm91bmQgPSBuZXcgT3NnaVZlcnNpb24odGhpcy51cHBlckJvdW5kTWFqb3IsIHRoaXMudXBwZXJCb3VuZE1pbm9yLCB0aGlzLnVwcGVyQm91bmRTZXJ2aWNlLCB0aGlzLnVwcGVyQm91bmRRdWFsaWZpZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnVwcGVyQm91bmQ7CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gaXNVcHBlckJvdW5kSW5maW5pdHkoKSB7Ci0JCXJldHVybiBJTkZJTklUWS5lcXVhbHModGhpcy51cHBlckJvdW5kKTsKLQl9CisgICAgcHVibGljIGJvb2xlYW4gaXNVcHBlckJvdW5kSW5maW5pdHkoKSB7CisgICAgICAgIHJldHVybiBJTkZJTklUWS5lcXVhbHModGhpcy51cHBlckJvdW5kKTsKKyAgICB9CiAKLQkvKiBzaGVuYW5pZ2FucyB3aXRoIHZlcnNpb24gZmllbGRzIGFyZSBiZWNhdXNlIG9mIEpQQSBsaW1pdGF0aW9uICovCi0JcHVibGljIHZvaWQgc2V0VXBwZXJCb3VuZChPc2dpVmVyc2lvbiBib3VuZCkgewotCQl0aGlzLnVwcGVyQm91bmQgPSBib3VuZDsKLQkJdGhpcy51cHBlckJvdW5kTWFqb3IgPSBib3VuZC5nZXRNYWpvcigpOwotCQl0aGlzLnVwcGVyQm91bmRNaW5vciA9IGJvdW5kLmdldE1pbm9yKCk7Ci0JCXRoaXMudXBwZXJCb3VuZFNlcnZpY2UgPSBib3VuZC5nZXRTZXJ2aWNlKCk7Ci0JCXRoaXMudXBwZXJCb3VuZFF1YWxpZmllciA9IGJvdW5kLmdldFF1YWxpZmllcigpOwotCX0KKyAgICAvKiBzaGVuYW5pZ2FucyB3aXRoIHZlcnNpb24gZmllbGRzIGFyZSBiZWNhdXNlIG9mIEpQQSBsaW1pdGF0aW9uICovCisgICAgcHVibGljIHZvaWQgc2V0VXBwZXJCb3VuZChPc2dpVmVyc2lvbiBib3VuZCkgeworICAgICAgICB0aGlzLnVwcGVyQm91bmQgPSBib3VuZDsKKyAgICAgICAgdGhpcy51cHBlckJvdW5kTWFqb3IgPSBib3VuZC5nZXRNYWpvcigpOworICAgICAgICB0aGlzLnVwcGVyQm91bmRNaW5vciA9IGJvdW5kLmdldE1pbm9yKCk7CisgICAgICAgIHRoaXMudXBwZXJCb3VuZFNlcnZpY2UgPSBib3VuZC5nZXRTZXJ2aWNlKCk7CisgICAgICAgIHRoaXMudXBwZXJCb3VuZFF1YWxpZmllciA9IGJvdW5kLmdldFF1YWxpZmllcigpOworICAgIH0KIAotCXB1YmxpYyBib29sZWFuIGlzSW5jbHVzaXZlTG93ZXJCb3VuZCgpIHsKLQkJcmV0dXJuIGlzSW5jbHVzaXZlTG93ZXJCb3VuZDsKLQl9CisgICAgcHVibGljIGJvb2xlYW4gaXNJbmNsdXNpdmVMb3dlckJvdW5kKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pc0luY2x1c2l2ZUxvd2VyQm91bmQ7CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gaXNJbmNsdXNpdmVVcHBlckJvdW5kKCkgewotCQlyZXR1cm4gaXNJbmNsdXNpdmVVcHBlckJvdW5kOwotCX0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luY2x1c2l2ZVVwcGVyQm91bmQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmlzSW5jbHVzaXZlVXBwZXJCb3VuZDsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmVyc2lvbiBmYWxscyB3aXRoaW4gdGhpcyByYW5nZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9zZ2lWZXJzaW9uIHZlcnNpb24pIHsKLQkJLy8gY2hlY2sgbG93ZXIgYm91bmQKLQkJaW50IGxvd2VyQm91bmRDb21wYXJpc29uID0gdmVyc2lvbi5jb21wYXJlVG8oZ2V0TG93ZXJCb3VuZCgpKTsKLQkJaWYgKGxvd2VyQm91bmRDb21wYXJpc29uIDwgMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKChsb3dlckJvdW5kQ29tcGFyaXNvbiA9PSAwKSAmJiAhdGhpcy5pc0luY2x1c2l2ZUxvd2VyQm91bmQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyB3ZSd2ZSBwYXNzZWQgdGhlIGxvd2VyIGJvdW5kIHRlc3QsIGNoZWNrIHRoZSB1cHBlciBib3VuZAotCQlpbnQgdXBwZXJCb3VuZENvbXBhcmlzb24gPSB2ZXJzaW9uLmNvbXBhcmVUbyhnZXRVcHBlckJvdW5kKCkpOwotCQlpZiAodXBwZXJCb3VuZENvbXBhcmlzb24gPiAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoKHVwcGVyQm91bmRDb21wYXJpc29uID09IDApICYmICF0aGlzLmlzSW5jbHVzaXZlVXBwZXJCb3VuZCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmVyc2lvbiBmYWxscyB3aXRoaW4gdGhpcyByYW5nZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9zZ2lWZXJzaW9uIHZlcnNpb24pIHsKKyAgICAgICAgLy8gY2hlY2sgbG93ZXIgYm91bmQKKyAgICAgICAgaW50IGxvd2VyQm91bmRDb21wYXJpc29uID0gdmVyc2lvbi5jb21wYXJlVG8oZ2V0TG93ZXJCb3VuZCgpKTsKKyAgICAgICAgaWYgKGxvd2VyQm91bmRDb21wYXJpc29uIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGxvd2VyQm91bmRDb21wYXJpc29uID09IDAgJiYgIXRoaXMuaXNJbmNsdXNpdmVMb3dlckJvdW5kKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gd2UndmUgcGFzc2VkIHRoZSBsb3dlciBib3VuZCB0ZXN0LCBjaGVjayB0aGUgdXBwZXIgYm91bmQKKyAgICAgICAgaW50IHVwcGVyQm91bmRDb21wYXJpc29uID0gdmVyc2lvbi5jb21wYXJlVG8oZ2V0VXBwZXJCb3VuZCgpKTsKKyAgICAgICAgaWYgKHVwcGVyQm91bmRDb21wYXJpc29uID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKHVwcGVyQm91bmRDb21wYXJpc29uID09IDAgJiYgIXRoaXMuaXNJbmNsdXNpdmVVcHBlckJvdW5kKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZChpc0luY2x1c2l2ZUxvd2VyQm91bmQgPyAiWyIgOiAiKCIpOwotCQlzYi5hcHBlbmQoZ2V0TG93ZXJCb3VuZCgpLnRvU3RyaW5nKCkpOwotCQlzYi5hcHBlbmQoIiwgIik7Ci0JCWlmIChnZXRVcHBlckJvdW5kKCkuZXF1YWxzKElORklOSVRZKSkgewotCQkJc2IuYXBwZW5kKCJpbmZpbml0eSkiKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChnZXRVcHBlckJvdW5kKCkudG9TdHJpbmcoKSk7Ci0JCQlzYi5hcHBlbmQoaXNJbmNsdXNpdmVVcHBlckJvdW5kID8gIl0iIDogIikiKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmlzSW5jbHVzaXZlTG93ZXJCb3VuZCA/ICJbIiA6ICIoIik7CisgICAgICAgIHNiLmFwcGVuZChnZXRMb3dlckJvdW5kKCkudG9TdHJpbmcoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgaWYgKGdldFVwcGVyQm91bmQoKS5lcXVhbHMoSU5GSU5JVFkpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoImluZmluaXR5KSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2IuYXBwZW5kKGdldFVwcGVyQm91bmQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh0aGlzLmlzSW5jbHVzaXZlVXBwZXJCb3VuZCA/ICJdIiA6ICIpIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQogCi0JLyogZ2VuZXJhdGVkICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCWludCByZXN1bHQgPSAxOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIChpc0luY2x1c2l2ZUxvd2VyQm91bmQgPyAxMjMxIDogMTIzNyk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKGlzSW5jbHVzaXZlVXBwZXJCb3VuZCA/IDEyMzEgOiAxMjM3KTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBsb3dlckJvdW5kTWFqb3I7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgbG93ZXJCb3VuZE1pbm9yOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgobG93ZXJCb3VuZFF1YWxpZmllciA9PSBudWxsKSA/IDAgOiBsb3dlckJvdW5kUXVhbGlmaWVyLmhhc2hDb2RlKCkpOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGxvd2VyQm91bmRTZXJ2aWNlOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIHVwcGVyQm91bmRNYWpvcjsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB1cHBlckJvdW5kTWlub3I7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh1cHBlckJvdW5kUXVhbGlmaWVyID09IG51bGwpID8gMCA6IHVwcGVyQm91bmRRdWFsaWZpZXIuaGFzaENvZGUoKSk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgdXBwZXJCb3VuZFNlcnZpY2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgIC8qIGdlbmVyYXRlZCAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgICAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAodGhpcy5pc0luY2x1c2l2ZUxvd2VyQm91bmQgPyAxMjMxIDogMTIzNyk7CisgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKHRoaXMuaXNJbmNsdXNpdmVVcHBlckJvdW5kID8gMTIzMSA6IDEyMzcpOworICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIHRoaXMubG93ZXJCb3VuZE1ham9yOworICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIHRoaXMubG93ZXJCb3VuZE1pbm9yOworICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICh0aGlzLmxvd2VyQm91bmRRdWFsaWZpZXIgPT0gbnVsbCA/IDAgOiB0aGlzLmxvd2VyQm91bmRRdWFsaWZpZXIuaGFzaENvZGUoKSk7CisgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgdGhpcy5sb3dlckJvdW5kU2VydmljZTsKKyAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB0aGlzLnVwcGVyQm91bmRNYWpvcjsKKyAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB0aGlzLnVwcGVyQm91bmRNaW5vcjsKKyAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAodGhpcy51cHBlckJvdW5kUXVhbGlmaWVyID09IG51bGwgPyAwIDogdGhpcy51cHBlckJvdW5kUXVhbGlmaWVyLmhhc2hDb2RlKCkpOworICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIHRoaXMudXBwZXJCb3VuZFNlcnZpY2U7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCi0JLyogZ2VuZXJhdGVkICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZpbmFsIFZlcnNpb25SYW5nZSBvdGhlciA9IChWZXJzaW9uUmFuZ2UpIG9iajsKLQkJaWYgKGlzSW5jbHVzaXZlTG93ZXJCb3VuZCAhPSBvdGhlci5pc0luY2x1c2l2ZUxvd2VyQm91bmQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXNJbmNsdXNpdmVVcHBlckJvdW5kICE9IG90aGVyLmlzSW5jbHVzaXZlVXBwZXJCb3VuZCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChsb3dlckJvdW5kTWFqb3IgIT0gb3RoZXIubG93ZXJCb3VuZE1ham9yKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGxvd2VyQm91bmRNaW5vciAhPSBvdGhlci5sb3dlckJvdW5kTWlub3IpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobG93ZXJCb3VuZFF1YWxpZmllciA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIubG93ZXJCb3VuZFF1YWxpZmllciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGVsc2UgaWYgKCFsb3dlckJvdW5kUXVhbGlmaWVyLmVxdWFscyhvdGhlci5sb3dlckJvdW5kUXVhbGlmaWVyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChsb3dlckJvdW5kU2VydmljZSAhPSBvdGhlci5sb3dlckJvdW5kU2VydmljZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICh1cHBlckJvdW5kTWFqb3IgIT0gb3RoZXIudXBwZXJCb3VuZE1ham9yKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHVwcGVyQm91bmRNaW5vciAhPSBvdGhlci51cHBlckJvdW5kTWlub3IpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAodXBwZXJCb3VuZFF1YWxpZmllciA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIudXBwZXJCb3VuZFF1YWxpZmllciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGVsc2UgaWYgKCF1cHBlckJvdW5kUXVhbGlmaWVyLmVxdWFscyhvdGhlci51cHBlckJvdW5kUXVhbGlmaWVyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICh1cHBlckJvdW5kU2VydmljZSAhPSBvdGhlci51cHBlckJvdW5kU2VydmljZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICAvKiBnZW5lcmF0ZWQgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAodGhpcyA9PSBvYmopIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgVmVyc2lvblJhbmdlIG90aGVyID0gKFZlcnNpb25SYW5nZSkgb2JqOworICAgICAgICBpZiAodGhpcy5pc0luY2x1c2l2ZUxvd2VyQm91bmQgIT0gb3RoZXIuaXNJbmNsdXNpdmVMb3dlckJvdW5kKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuaXNJbmNsdXNpdmVVcHBlckJvdW5kICE9IG90aGVyLmlzSW5jbHVzaXZlVXBwZXJCb3VuZCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmxvd2VyQm91bmRNYWpvciAhPSBvdGhlci5sb3dlckJvdW5kTWFqb3IpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5sb3dlckJvdW5kTWlub3IgIT0gb3RoZXIubG93ZXJCb3VuZE1pbm9yKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMubG93ZXJCb3VuZFF1YWxpZmllciA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAob3RoZXIubG93ZXJCb3VuZFF1YWxpZmllciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmxvd2VyQm91bmRRdWFsaWZpZXIuZXF1YWxzKG90aGVyLmxvd2VyQm91bmRRdWFsaWZpZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMubG93ZXJCb3VuZFNlcnZpY2UgIT0gb3RoZXIubG93ZXJCb3VuZFNlcnZpY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy51cHBlckJvdW5kTWFqb3IgIT0gb3RoZXIudXBwZXJCb3VuZE1ham9yKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMudXBwZXJCb3VuZE1pbm9yICE9IG90aGVyLnVwcGVyQm91bmRNaW5vcikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnVwcGVyQm91bmRRdWFsaWZpZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG90aGVyLnVwcGVyQm91bmRRdWFsaWZpZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghdGhpcy51cHBlckJvdW5kUXVhbGlmaWVyLmVxdWFscyhvdGhlci51cHBlckJvdW5kUXVhbGlmaWVyKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnVwcGVyQm91bmRTZXJ2aWNlICE9IG90aGVyLnVwcGVyQm91bmRTZXJ2aWNlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JLyoqCi0JICogUGFyc2UgYW55IGluY2x1c2l2ZSAiXSIgb3IgZXhjbHVzaXZlICIpIiB1cHBlciBib3VuZCBwb3N0Zml4IGFuZCByZXR1cm4KLQkgKiB0aGUgaW5wdXQgc3RyaW5nIHdpdGggdGhlbSBzdHJpcHBlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGV4dHJhY3RVcHBlckJvdW5kQ3JpdGVyaWEoU3RyaW5nIG9zZ2lSYW5nZVNwZWNpZmljYXRpb24pIHsKLQkJLy8gcGFyc2UgYW55IGVuZGluZyBpbmNsdXNpdmUgLyBleGNsdXNpdmUgYnJhY2tldHMKLQkJaWYgKG9zZ2lSYW5nZVNwZWNpZmljYXRpb24uZW5kc1dpdGgoIikiKSkgewotCQkJdGhpcy5pc0luY2x1c2l2ZVVwcGVyQm91bmQgPSBmYWxzZTsKLQkJCW9zZ2lSYW5nZVNwZWNpZmljYXRpb24gPSBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uLnN1YnN0cmluZygwLCBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uLmxlbmd0aCgpIC0gMSk7Ci0JCX0gZWxzZSBpZiAob3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5lbmRzV2l0aCgiXSIpKSB7Ci0JCQl0aGlzLmlzSW5jbHVzaXZlVXBwZXJCb3VuZCA9IHRydWU7Ci0JCQlvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uID0gb3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5zdWJzdHJpbmcoMCwgb3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5sZW5ndGgoKSAtIDEpOwotCQl9IGVsc2UgewotCQkJdGhpcy5pc0luY2x1c2l2ZVVwcGVyQm91bmQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uOwotCX0KKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbnkgaW5jbHVzaXZlICJdIiBvciBleGNsdXNpdmUgIikiIHVwcGVyIGJvdW5kIHBvc3RmaXggYW5kIHJldHVybiB0aGUgaW5wdXQgc3RyaW5nIHdpdGggdGhlbSBzdHJpcHBlZAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RVcHBlckJvdW5kQ3JpdGVyaWEoU3RyaW5nIG9zZ2lSYW5nZVNwZWNpZmljYXRpb24pIHsKKyAgICAgICAgLy8gcGFyc2UgYW55IGVuZGluZyBpbmNsdXNpdmUgLyBleGNsdXNpdmUgYnJhY2tldHMKKyAgICAgICAgaWYgKG9zZ2lSYW5nZVNwZWNpZmljYXRpb24uZW5kc1dpdGgoIikiKSkgeworICAgICAgICAgICAgdGhpcy5pc0luY2x1c2l2ZVVwcGVyQm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIG9zZ2lSYW5nZVNwZWNpZmljYXRpb24gPSBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uLnN1YnN0cmluZygwLCBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uLmxlbmd0aCgpIC0gMSk7CisgICAgICAgIH0gZWxzZSBpZiAob3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5lbmRzV2l0aCgiXSIpKSB7CisgICAgICAgICAgICB0aGlzLmlzSW5jbHVzaXZlVXBwZXJCb3VuZCA9IHRydWU7CisgICAgICAgICAgICBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uID0gb3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5zdWJzdHJpbmcoMCwgb3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5sZW5ndGgoKSAtIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5pc0luY2x1c2l2ZVVwcGVyQm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uOworICAgIH0KIAotCS8qKgotCSAqIFBhcnNlIGFueSBpbmNsdXNpdmUgIlsiIG9yIGV4Y2x1c2l2ZSAiKCIgbG93ZXIgYm91bmQgcHJlZml4IGFuZCByZXR1cm4KLQkgKiB0aGUgaW5wdXQgc3RyaW5nIHdpdGggdGhlbSBzdHJpcHBlZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0TG93ZXJCb3VuZENyaXRlcmlhKFN0cmluZyBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uKSB7Ci0JCS8vIHBhcnNlIGFueSBvcGVuaW5nIGluY2x1c2l2ZSAvIGV4Y2x1c2l2ZSBicmFja2V0cwotCQlpZiAob3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5zdGFydHNXaXRoKCIoIikpIHsKLQkJCXRoaXMuaXNJbmNsdXNpdmVMb3dlckJvdW5kID0gZmFsc2U7Ci0JCQlvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uID0gb3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5zdWJzdHJpbmcoMSk7Ci0JCX0gZWxzZSBpZiAob3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5zdGFydHNXaXRoKCJbIikpIHsKLQkJCW9zZ2lSYW5nZVNwZWNpZmljYXRpb24gPSBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uLnN1YnN0cmluZygxKTsKLQkJCXRoaXMuaXNJbmNsdXNpdmVMb3dlckJvdW5kID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuaXNJbmNsdXNpdmVMb3dlckJvdW5kID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gb3NnaVJhbmdlU3BlY2lmaWNhdGlvbjsKLQl9CisgICAgLyoqCisgICAgICogUGFyc2UgYW55IGluY2x1c2l2ZSAiWyIgb3IgZXhjbHVzaXZlICIoIiBsb3dlciBib3VuZCBwcmVmaXggYW5kIHJldHVybiB0aGUgaW5wdXQgc3RyaW5nIHdpdGggdGhlbSBzdHJpcHBlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBleHRyYWN0TG93ZXJCb3VuZENyaXRlcmlhKFN0cmluZyBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uKSB7CisgICAgICAgIC8vIHBhcnNlIGFueSBvcGVuaW5nIGluY2x1c2l2ZSAvIGV4Y2x1c2l2ZSBicmFja2V0cworICAgICAgICBpZiAob3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5zdGFydHNXaXRoKCIoIikpIHsKKyAgICAgICAgICAgIHRoaXMuaXNJbmNsdXNpdmVMb3dlckJvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uID0gb3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0gZWxzZSBpZiAob3NnaVJhbmdlU3BlY2lmaWNhdGlvbi5zdGFydHNXaXRoKCJbIikpIHsKKyAgICAgICAgICAgIG9zZ2lSYW5nZVNwZWNpZmljYXRpb24gPSBvc2dpUmFuZ2VTcGVjaWZpY2F0aW9uLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIHRoaXMuaXNJbmNsdXNpdmVMb3dlckJvdW5kID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuaXNJbmNsdXNpdmVMb3dlckJvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3NnaVJhbmdlU3BlY2lmaWNhdGlvbjsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9pbnRlcm5hbC91dGlscy9qc29uL0pTT05DaGlsZFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ludGVybmFsL3V0aWxzL2pzb24vSlNPTkNoaWxkUGFyc2VyLmphdmEKaW5kZXggMmZmNDY2MC4uNDkzMDJhMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ludGVybmFsL3V0aWxzL2pzb24vSlNPTkNoaWxkUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ludGVybmFsL3V0aWxzL2pzb24vSlNPTkNoaWxkUGFyc2VyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLmludGVybmFsLnV0aWxzLmpzb247CiAKIGltcG9ydCBvcmcuanNvbi5KU09OQXJyYXk7CkBAIC0xNSw0OSArMTYsNDkgQEAKIGltcG9ydCBvcmcuanNvbi5KU09OT2JqZWN0OwogCiAvKioKLSAqIFByb3ZpZGVzIGEgc2ltcGxlIHBhcnNlciB0aGF0IHZpc2l0cyBjaGlsZHJlbiBvYmplY3RzIHNhZmVseSwgd2hldGhlciB0aGV5Ci0gKiBleGlzdCBhcyBzaW5nbGUgSlNPTiBvYmplY3RzLCBKU09OIGFycmF5cywgb3Igbm90IGF0IGFsbC4KLSAqIAotICogVXNhZ2U6IFNpbXBseSBnaXZlIHRoZSBwYXJzZXIgdGhlIHBhcmVudCBvYmplY3QgYW5kIGNoaWxkIGtleSwgYW5kIGltcGxlbWVudAotICoge0BsaW5rICNwYXJzZShKU09OT2JqZWN0KX0gd2l0aCB0aGUgcHJvY2Vzc2luZyB5b3UgbmVlZC4KLSAqIAotICogKFRoZSBleGlzdGluZyBKU09OIGZpbGVzIG9mdGVuIHN0b3JlIHNpbmdsZSB2YWx1ZSBlbnRpdGllcyBhcyBvYmplY3RzIG5vdCBhcwotICogYSBKU09OIEFycmF5IG9mIHNpemUgMS4pCi0gKiAKKyAqIFByb3ZpZGVzIGEgc2ltcGxlIHBhcnNlciB0aGF0IHZpc2l0cyBjaGlsZHJlbiBvYmplY3RzIHNhZmVseSwgd2hldGhlciB0aGV5IGV4aXN0IGFzIHNpbmdsZSBKU09OIG9iamVjdHMsIEpTT04gYXJyYXlzLAorICogb3Igbm90IGF0IGFsbC4KKyAqCisgKiBVc2FnZTogU2ltcGx5IGdpdmUgdGhlIHBhcnNlciB0aGUgcGFyZW50IG9iamVjdCBhbmQgY2hpbGQga2V5LCBhbmQgaW1wbGVtZW50IHtAbGluayAjcGFyc2UoSlNPTk9iamVjdCl9IHdpdGggdGhlCisgKiBwcm9jZXNzaW5nIHlvdSBuZWVkLgorICoKKyAqIChUaGUgZXhpc3RpbmcgSlNPTiBmaWxlcyBvZnRlbiBzdG9yZSBzaW5nbGUgdmFsdWUgZW50aXRpZXMgYXMgb2JqZWN0cyBub3QgYXMgYSBKU09OIEFycmF5IG9mIHNpemUgMS4pCisgKgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKLSAqIAorICoKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEpTT05DaGlsZFBhcnNlciBpbXBsZW1lbnRzIFNpbXBsZUpTT05QYXJzZXIgewotCVN0cmluZyBrZXk7Ci0JSlNPTk9iamVjdCBwYXJlbnQ7CiAKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGFuZCBleGVjdXRlcyB0aGUgcGFyc2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQgQW55IHBhcmVudCBKU09OIG9iamVjdC4KLQkgKiBAcGFyYW0ga2V5IEEga2V5IHdpdGhpbiB0aGUgcGFyZW50IHRoYXQgaWRlbnRpZmllcyBhbiBvYmplY3QsIGFuIGFycmF5LAotCSAqICAgICAgICBvciBub3RoaW5nIGF0IGFsbC4KLQkgKi8KLQlwdWJsaWMgSlNPTkNoaWxkUGFyc2VyKEpTT05PYmplY3QgcGFyZW50LCBTdHJpbmcga2V5KSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMua2V5ID0ga2V5OwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJYXBwbHkoKTsKLQl9CisgICAgU3RyaW5nIGtleTsKIAotCXByaXZhdGUgdm9pZCBhcHBseSgpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKLQkJaWYgKHBhcmVudC5oYXMoa2V5KSkgewotCQkJT2JqZWN0IHBhY2thZ2VOb2RlID0gcGFyZW50LmdldChrZXkpOwotCQkJaWYgKHBhY2thZ2VOb2RlIGluc3RhbmNlb2YgSlNPTk9iamVjdCkgewotCQkJCUpTT05PYmplY3QgcGFja2FnZU9iamVjdCA9IChKU09OT2JqZWN0KSBwYWNrYWdlTm9kZTsKLQkJCQlwYXJzZShwYWNrYWdlT2JqZWN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJSlNPTkFycmF5IHBhY2thZ2VBcnJheSA9IChKU09OQXJyYXkpIHBhY2thZ2VOb2RlOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZUFycmF5Lmxlbmd0aCgpOyBpKyspIHsKLQkJCQkJSlNPTk9iamVjdCBwYWNrYWdlT2JqZWN0ID0gKEpTT05PYmplY3QpIHBhY2thZ2VBcnJheS5nZXQoaSk7Ci0JCQkJCXBhcnNlKHBhY2thZ2VPYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICBKU09OT2JqZWN0IHBhcmVudDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW5kIGV4ZWN1dGVzIHRoZSBwYXJzZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IEFueSBwYXJlbnQgSlNPTiBvYmplY3QuCisgICAgICogQHBhcmFtIGtleSBBIGtleSB3aXRoaW4gdGhlIHBhcmVudCB0aGF0IGlkZW50aWZpZXMgYW4gb2JqZWN0LCBhbiBhcnJheSwgb3Igbm90aGluZyBhdCBhbGwuCisgICAgICovCisgICAgcHVibGljIEpTT05DaGlsZFBhcnNlcihKU09OT2JqZWN0IHBhcmVudCwgU3RyaW5nIGtleSkgdGhyb3dzIEpTT05FeGNlcHRpb24geworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIGFwcGx5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGx5KCkgdGhyb3dzIEpTT05FeGNlcHRpb24geworICAgICAgICBpZiAodGhpcy5wYXJlbnQuaGFzKHRoaXMua2V5KSkgeworICAgICAgICAgICAgT2JqZWN0IHBhY2thZ2VOb2RlID0gdGhpcy5wYXJlbnQuZ2V0KHRoaXMua2V5KTsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTm9kZSBpbnN0YW5jZW9mIEpTT05PYmplY3QpIHsKKyAgICAgICAgICAgICAgICBKU09OT2JqZWN0IHBhY2thZ2VPYmplY3QgPSAoSlNPTk9iamVjdCkgcGFja2FnZU5vZGU7CisgICAgICAgICAgICAgICAgcGFyc2UocGFja2FnZU9iamVjdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEpTT05BcnJheSBwYWNrYWdlQXJyYXkgPSAoSlNPTkFycmF5KSBwYWNrYWdlTm9kZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VBcnJheS5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIEpTT05PYmplY3QgcGFja2FnZU9iamVjdCA9IChKU09OT2JqZWN0KSBwYWNrYWdlQXJyYXkuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBwYXJzZShwYWNrYWdlT2JqZWN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ludGVybmFsL3V0aWxzL2pzb24vSlNPTkZpbGVQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9pbnRlcm5hbC91dGlscy9qc29uL0pTT05GaWxlUGFyc2VyLmphdmEKaW5kZXggZDY2MDkzMy4uNzY2Mjc2MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ludGVybmFsL3V0aWxzL2pzb24vSlNPTkZpbGVQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvaW50ZXJuYWwvdXRpbHMvanNvbi9KU09ORmlsZVBhcnNlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5pbnRlcm5hbC51dGlscy5qc29uOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMjQsMzYgKzI1LDMzIEBACiAKIC8qKgogICogU2FmZWx5IHJlYWRzIGEgSlNPTiBmaWxlLgotICogCi0gKiBVc2FnZTogSnVzdCBpbXBsZW1lbnQge0BsaW5rICNwYXJzZShKU09OT2JqZWN0KX0gd2l0aCB0aGUgcHJvY2Vzc2luZyB5b3UgbmVlZAotICogYW5kIHBhc3MgaW4gYSBmaWxlLgotICogCisgKgorICogVXNhZ2U6IEp1c3QgaW1wbGVtZW50IHtAbGluayAjcGFyc2UoSlNPTk9iamVjdCl9IHdpdGggdGhlIHByb2Nlc3NpbmcgeW91IG5lZWQgYW5kIHBhc3MgaW4gYSBmaWxlLgorICoKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCi0gKiAKKyAqCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKU09ORmlsZVBhcnNlciBpbXBsZW1lbnRzIFNpbXBsZUpTT05QYXJzZXIgewogCi0JRmlsZSBmaWxlOworICAgIEZpbGUgZmlsZTsKIAotCXB1YmxpYyBKU09ORmlsZVBhcnNlcihGaWxlIGZpbGUpIHsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJLy8gKHBlcmhhcHMgd2Ugc2hvdWxkbid0IGRvIHRoaXMgYXMgc2lkZSBlZmZlY3Qgb2YgY29uc3RydWN0aW9uLCBidXQgSSdtCi0JCS8vIGdyb3dpbmcgdGlyZWQgb2YgdmVyYm9zaXR5IGZvciBpdHMgb3duIHNha2UuKQotCQlhcHBseSgpOwotCX0KKyAgICBwdWJsaWMgSlNPTkZpbGVQYXJzZXIoRmlsZSBmaWxlKSB7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIC8vIChwZXJoYXBzIHdlIHNob3VsZG4ndCBkbyB0aGlzIGFzIHNpZGUgZWZmZWN0IG9mIGNvbnN0cnVjdGlvbiwgYnV0IEknbQorICAgICAgICAvLyBncm93aW5nIHRpcmVkIG9mIHZlcmJvc2l0eSBmb3IgaXRzIG93biBzYWtlLikKKyAgICAgICAgYXBwbHkoKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBhcHBseSgpIHsKLQkJdHJ5IHsKLQkJCUZpbGVSZWFkZXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoZmlsZSk7Ci0JCQlKU09OVG9rZW5lciBwYXJzZXIgPSBuZXcgSlNPTlRva2VuZXIocmVhZGVyKTsKLQkJCUpTT05PYmplY3Qgcm9vdE9iamVjdCA9IG5ldyBKU09OT2JqZWN0KHBhcnNlcik7Ci0JCQlwYXJzZShyb290T2JqZWN0KTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkJCQkJCQkiRXJyb3Igd2hpbGUgcmVhZGluZyBmaWxlOiAiICsgZmlsZSwgZSkpOwotCQl9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKLQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkJCQkJCQkiRXJyb3Igd2hpbGUgcGFyc2luZyBmaWxlOiAiICsgZmlsZSwgZSkpOwotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIGFwcGx5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZVJlYWRlciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcih0aGlzLmZpbGUpOworICAgICAgICAgICAgSlNPTlRva2VuZXIgcGFyc2VyID0gbmV3IEpTT05Ub2tlbmVyKHJlYWRlcik7CisgICAgICAgICAgICBKU09OT2JqZWN0IHJvb3RPYmplY3QgPSBuZXcgSlNPTk9iamVjdChwYXJzZXIpOworICAgICAgICAgICAgcGFyc2Uocm9vdE9iamVjdCk7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgIkVycm9yIHdoaWxlIHJlYWRpbmcgZmlsZTogIiArIHRoaXMuZmlsZSwgZSkpOworICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZShuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAiRXJyb3Igd2hpbGUgcGFyc2luZyBmaWxlOiAiICsgdGhpcy5maWxlLCBlKSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvaW50ZXJuYWwvdXRpbHMvanNvbi9TaW1wbGVKU09OUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvaW50ZXJuYWwvdXRpbHMvanNvbi9TaW1wbGVKU09OUGFyc2VyLmphdmEKaW5kZXggMGI0OWY3ZS4uNmZjZjFkMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ludGVybmFsL3V0aWxzL2pzb24vU2ltcGxlSlNPTlBhcnNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9pbnRlcm5hbC91dGlscy9qc29uL1NpbXBsZUpTT05QYXJzZXIuamF2YQpAQCAtOCwyMiArOCwyMyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5pbnRlcm5hbC51dGlscy5qc29uOwogCiBpbXBvcnQgb3JnLmpzb24uSlNPTkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuanNvbi5KU09OT2JqZWN0OwogCiAvKioKLSAqIEEgY29tbW9uIGludGVyZmFjZSBmb3IgdmVyeSBiYXNpYyBKU09OIHBhcnNpbmcuIEJ1dCB5b3Ugc2hvdWxkbid0IGV2ZXIgbmVlZAotICogbW9yZSB0aGFuIHRoaXMsIEpTT04ganVzdCBpc24ndCB0aGF0IGNvbXBsaWNhdGVkIQotICogCisgKiBBIGNvbW1vbiBpbnRlcmZhY2UgZm9yIHZlcnkgYmFzaWMgSlNPTiBwYXJzaW5nLiBCdXQgeW91IHNob3VsZG4ndCBldmVyIG5lZWQgbW9yZSB0aGFuIHRoaXMsIEpTT04ganVzdCBpc24ndCB0aGF0CisgKiBjb21wbGljYXRlZCEKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgotICogCisgKgogICovCiBwdWJsaWMgaW50ZXJmYWNlIFNpbXBsZUpTT05QYXJzZXIgewogCi0JLyoqCi0JICogSW1wbGVtZW50IHRvIHByb2Nlc3MgdGhlIHBhc3NlZCBvYmplY3QuCi0JICovCi0Jdm9pZCBwYXJzZShKU09OT2JqZWN0IG9iamVjdCkgdGhyb3dzIEpTT05FeGNlcHRpb247CisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRvIHByb2Nlc3MgdGhlIHBhc3NlZCBvYmplY3QuCisgICAgICovCisgICAgdm9pZCBwYXJzZShKU09OT2JqZWN0IG9iamVjdCkgdGhyb3dzIEpTT05FeGNlcHRpb247CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmFnZW1lbnQvcmVtb3RlL0J1bmRsZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmFnZW1lbnQvcmVtb3RlL0J1bmRsZS5qYXZhCmluZGV4IDRlMTU1ZDQuLjQwNmZlNjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5hZ2VtZW50L3JlbW90ZS9CdW5kbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvQnVuZGxlLmphdmEKQEAgLTksNiArOSw3IEBACiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICogICAgIFNBUCBBRyAtIG1vdmluZyB0byBFY2xpcHNlIExpYnJhIHByb2plY3QgYW5kIGVuaGFuY2VtZW50cwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlOwogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CkBAIC0yOSwxMTkgKzMwLDExOSBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlIGltcGxlbWVudHMgSUJ1bmRsZSwgU2VyaWFsaXphYmxlIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIyODY5ODMyNzQzMTYxMDQ1N0w7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjI4Njk4MzI3NDMxNjEwNDU3TDsKIAotCXByaXZhdGUgZmluYWwgU2V0PElQYWNrYWdlRXhwb3J0PiBleHBvcnRzID0gbmV3IEhhc2hTZXQ8SVBhY2thZ2VFeHBvcnQ+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVBhY2thZ2VFeHBvcnQ+IGV4cG9ydHMgPSBuZXcgSGFzaFNldDxJUGFja2FnZUV4cG9ydD4oKTsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwogCi0JcHJpdmF0ZSBmaW5hbCBTZXQ8SVBhY2thZ2VJbXBvcnQ+IGltcG9ydHMgPSBuZXcgSGFzaFNldDxJUGFja2FnZUltcG9ydD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxJUGFja2FnZUltcG9ydD4gaW1wb3J0cyA9IG5ldyBIYXNoU2V0PElQYWNrYWdlSW1wb3J0PigpOwogCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RhdGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RhdGU7CiAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzeW1ib2xpY05hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3ltYm9saWNOYW1lOwogCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmVyc2lvbjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2ZXJzaW9uOwogCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbG9jYXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbG9jYXRpb247CiAKLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAKLQlwcml2YXRlIGZpbmFsIFNldDxJU2VydmljZVJlZmVyZW5jZT4gcmVnaXN0ZXJlZFNlcnZpY2VzID0gbmV3IEhhc2hTZXQ8SVNlcnZpY2VSZWZlcmVuY2U+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SVNlcnZpY2VSZWZlcmVuY2U+IHJlZ2lzdGVyZWRTZXJ2aWNlcyA9IG5ldyBIYXNoU2V0PElTZXJ2aWNlUmVmZXJlbmNlPigpOwogCi0JcHJpdmF0ZSBmaW5hbCBTZXQ8SVNlcnZpY2VSZWZlcmVuY2U+IHNlcnZpY2VzSW5Vc2UgPSBuZXcgSGFzaFNldDxJU2VydmljZVJlZmVyZW5jZT4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxJU2VydmljZVJlZmVyZW5jZT4gc2VydmljZXNJblVzZSA9IG5ldyBIYXNoU2V0PElTZXJ2aWNlUmVmZXJlbmNlPigpOwogCi0JcHVibGljIEJ1bmRsZShTdHJpbmcgaWQsIFN0cmluZyBzeW1ib2xpY05hbWUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgc3RhdGUsIFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLnN5bWJvbGljTmFtZSA9IHN5bWJvbGljTmFtZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnN0YXRlID0gc3RhdGU7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9CisgICAgcHVibGljIEJ1bmRsZShTdHJpbmcgaWQsIFN0cmluZyBzeW1ib2xpY05hbWUsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgc3RhdGUsIFN0cmluZyBsb2NhdGlvbikgeworICAgICAgICB0aGlzLnN5bWJvbGljTmFtZSA9IHN5bWJvbGljTmFtZTsKKyAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKKyAgICB9CiAKLQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRIZWFkZXJzKCkgewotCQlyZXR1cm4gaGVhZGVyczsKLQl9CisgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0SGVhZGVycygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyczsKKyAgICB9CiAKLQlwdWJsaWMgU2V0PElQYWNrYWdlRXhwb3J0PiBnZXRQYWNrYWdlRXhwb3J0cygpIHsKLQkJcmV0dXJuIGV4cG9ydHM7Ci0JfQorICAgIHB1YmxpYyBTZXQ8SVBhY2thZ2VFeHBvcnQ+IGdldFBhY2thZ2VFeHBvcnRzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5leHBvcnRzOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaWQ7CisgICAgfQogCi0JcHVibGljIFNldDxJUGFja2FnZUltcG9ydD4gZ2V0UGFja2FnZUltcG9ydHMoKSB7Ci0JCXJldHVybiBpbXBvcnRzOwotCX0KKyAgICBwdWJsaWMgU2V0PElQYWNrYWdlSW1wb3J0PiBnZXRQYWNrYWdlSW1wb3J0cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0czsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGdldFN0YXRlKCkgewotCQlyZXR1cm4gc3RhdGU7Ci0JfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN0YXRlOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKCkgewotCQlyZXR1cm4gc3ltYm9saWNOYW1lOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN5bWJvbGljTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9saWNOYW1lOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbjsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBhZGRQYWNrYWdlRXhwb3J0KFBhY2thZ2VFeHBvcnQgcGUpIHsKLQkJdGhpcy5leHBvcnRzLmFkZChwZSk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGFkZFBhY2thZ2VFeHBvcnQoUGFja2FnZUV4cG9ydCBwZSkgeworICAgICAgICB0aGlzLmV4cG9ydHMuYWRkKHBlKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBhZGRQYWNrYWdlSW1wb3J0KFBhY2thZ2VJbXBvcnQgcGkpIHsKLQkJdGhpcy5pbXBvcnRzLmFkZChwaSk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGFkZFBhY2thZ2VJbXBvcnQoUGFja2FnZUltcG9ydCBwaSkgeworICAgICAgICB0aGlzLmltcG9ydHMuYWRkKHBpKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBhZGRSZWdpc3RlcmVkU2VydmljZShJU2VydmljZVJlZmVyZW5jZSBwaSkgewotCQl0aGlzLnJlZ2lzdGVyZWRTZXJ2aWNlcy5hZGQocGkpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBhZGRSZWdpc3RlcmVkU2VydmljZShJU2VydmljZVJlZmVyZW5jZSBwaSkgeworICAgICAgICB0aGlzLnJlZ2lzdGVyZWRTZXJ2aWNlcy5hZGQocGkpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIGFkZFVzaW5nU2VydmljZShJU2VydmljZVJlZmVyZW5jZSBwaSkgewotCQl0aGlzLnNlcnZpY2VzSW5Vc2UuYWRkKHBpKTsKLQl9CisgICAgcHVibGljIHZvaWQgYWRkVXNpbmdTZXJ2aWNlKElTZXJ2aWNlUmVmZXJlbmNlIHBpKSB7CisgICAgICAgIHRoaXMuc2VydmljZXNJblVzZS5hZGQocGkpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5oZWFkZXJzLnB1dChrZXksIHZhbHVlKTsKLQl9CisgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLmhlYWRlcnMucHV0KGtleSwgdmFsdWUpOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb247CisgICAgfQogCi0JcHVibGljIFNldDxJU2VydmljZVJlZmVyZW5jZT4gZ2V0UmVnaXN0ZXJlZFNlcnZpY2VzKCkgewotCQlyZXR1cm4gcmVnaXN0ZXJlZFNlcnZpY2VzOwotCX0KKyAgICBwdWJsaWMgU2V0PElTZXJ2aWNlUmVmZXJlbmNlPiBnZXRSZWdpc3RlcmVkU2VydmljZXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyZWRTZXJ2aWNlczsKKyAgICB9CiAKLQlwdWJsaWMgU2V0PElTZXJ2aWNlUmVmZXJlbmNlPiBnZXRTZXJ2aWNlc0luVXNlKCkgewotCQlyZXR1cm4gc2VydmljZXNJblVzZTsKLQl9CisgICAgcHVibGljIFNldDxJU2VydmljZVJlZmVyZW5jZT4gZ2V0U2VydmljZXNJblVzZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZXNJblVzZTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaGFzaENvZGUgPSAxNzsKLQkJaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgaWQuaGFzaENvZGUoKTsKLQkJaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgc3ltYm9saWNOYW1lLmhhc2hDb2RlKCk7Ci0JCXJldHVybiBoYXNoQ29kZTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2hDb2RlID0gMTc7CisgICAgICAgIGhhc2hDb2RlID0gMzEgKiBoYXNoQ29kZSArIHRoaXMuaWQuaGFzaENvZGUoKTsKKyAgICAgICAgaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgdGhpcy5zeW1ib2xpY05hbWUuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIGhhc2hDb2RlOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJaWYgKHRoaXMgPT0gb3RoZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICghKG90aGVyIGluc3RhbmNlb2YgQnVuZGxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUJ1bmRsZSB0aGF0ID0gKEJ1bmRsZSkgb3RoZXI7Ci0JCWlmICghT2JqZWN0VXRpbHMubnVsbFNhZmVFcXVhbHModGhpcy5pZCwgdGhhdC5pZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIU9iamVjdFV0aWxzLm51bGxTYWZlRXF1YWxzKHRoaXMuc3ltYm9saWNOYW1lLCB0aGF0LnN5bWJvbGljTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgICAgICBpZiAodGhpcyA9PSBvdGhlcikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBCdW5kbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQnVuZGxlIHRoYXQgPSAoQnVuZGxlKSBvdGhlcjsKKyAgICAgICAgaWYgKCFPYmplY3RVdGlscy5udWxsU2FmZUVxdWFscyh0aGlzLmlkLCB0aGF0LmlkKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghT2JqZWN0VXRpbHMubnVsbFNhZmVFcXVhbHModGhpcy5zeW1ib2xpY05hbWUsIHRoYXQuc3ltYm9saWNOYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5hZ2VtZW50L3JlbW90ZS9QYWNrYWdlRXhwb3J0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvUGFja2FnZUV4cG9ydC5qYXZhCmluZGV4IGQ4OGIxNWUuLmY5OTFjOWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5hZ2VtZW50L3JlbW90ZS9QYWNrYWdlRXhwb3J0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmFnZW1lbnQvcmVtb3RlL1BhY2thZ2VFeHBvcnQuamF2YQpAQCAtOSw2ICs5LDcgQEAKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKiAgICAgU0FQIEFHIC0gbW92aW5nIHRvIEVjbGlwc2UgTGlicmEgcHJvamVjdCBhbmQgZW5oYW5jZW1lbnRzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGU7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKQEAgLTIxLDIzICsyMiwyMyBAQAogICovCiBwdWJsaWMgY2xhc3MgUGFja2FnZUV4cG9ydCBpbXBsZW1lbnRzIElQYWNrYWdlRXhwb3J0LCBTZXJpYWxpemFibGUgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ3OTgwMTI3ODE1NDI1MjQxNTlMOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00Nzk4MDEyNzgxNTQyNTI0MTU5TDsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIHZlcnNpb247CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmVyc2lvbjsKIAotCXB1YmxpYyBQYWNrYWdlRXhwb3J0KFN0cmluZyBuYW1lLCBTdHJpbmcgdmVyc2lvbikgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KKyAgICBwdWJsaWMgUGFja2FnZUV4cG9ydChTdHJpbmcgbmFtZSwgU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uOworICAgIH0KIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5hZ2VtZW50L3JlbW90ZS9QYWNrYWdlSW1wb3J0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvUGFja2FnZUltcG9ydC5qYXZhCmluZGV4IGI0ZmQ1M2YuLjE2NzlmMGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5hZ2VtZW50L3JlbW90ZS9QYWNrYWdlSW1wb3J0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmFnZW1lbnQvcmVtb3RlL1BhY2thZ2VJbXBvcnQuamF2YQpAQCAtOSw2ICs5LDcgQEAKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKiAgICAgU0FQIEFHIC0gbW92aW5nIHRvIEVjbGlwc2UgTGlicmEgcHJvamVjdCBhbmQgZW5oYW5jZW1lbnRzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGU7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKQEAgLTIyLDYwICsyMyw2MCBAQAogICovCiBwdWJsaWMgY2xhc3MgUGFja2FnZUltcG9ydCBpbXBsZW1lbnRzIElQYWNrYWdlSW1wb3J0LCBTZXJpYWxpemFibGUgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODM3NjQ5MTAzNzkyNjQxNTE1MUw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODM3NjQ5MTAzNzkyNjQxNTE1MUw7CiAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CiAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyB2ZXJzaW9uOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZlcnNpb247CiAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzdXBwbGllcklkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHN1cHBsaWVySWQ7CiAKLQlwdWJsaWMgUGFja2FnZUltcG9ydChTdHJpbmcgbmFtZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBzdXBwbGllcklkKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMuc3VwcGxpZXJJZCA9IHN1cHBsaWVySWQ7Ci0JfQorICAgIHB1YmxpYyBQYWNrYWdlSW1wb3J0KFN0cmluZyBuYW1lLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHN1cHBsaWVySWQpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgdGhpcy5zdXBwbGllcklkID0gc3VwcGxpZXJJZDsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0U3VwcGxpZXJJZCgpIHsKLQkJcmV0dXJuIHN1cHBsaWVySWQ7Ci0JfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VwcGxpZXJJZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3VwcGxpZXJJZDsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaGFzaENvZGUgPSAxNzsKLQkJaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgbmFtZS5oYXNoQ29kZSgpOwotCQloYXNoQ29kZSA9IDMxICogaGFzaENvZGUgKyB2ZXJzaW9uLmhhc2hDb2RlKCk7Ci0JCWhhc2hDb2RlID0gMzEgKiBoYXNoQ29kZSArIHN1cHBsaWVySWQuaGFzaENvZGUoKTsKLQkJcmV0dXJuIGhhc2hDb2RlOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaENvZGUgPSAxNzsKKyAgICAgICAgaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgdGhpcy5uYW1lLmhhc2hDb2RlKCk7CisgICAgICAgIGhhc2hDb2RlID0gMzEgKiBoYXNoQ29kZSArIHRoaXMudmVyc2lvbi5oYXNoQ29kZSgpOworICAgICAgICBoYXNoQ29kZSA9IDMxICogaGFzaENvZGUgKyB0aGlzLnN1cHBsaWVySWQuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIGhhc2hDb2RlOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLQkJaWYgKHRoaXMgPT0gb3RoZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICghKG90aGVyIGluc3RhbmNlb2YgUGFja2FnZUltcG9ydCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlQYWNrYWdlSW1wb3J0IHRoYXQgPSAoUGFja2FnZUltcG9ydCkgb3RoZXI7Ci0JCWlmICghT2JqZWN0VXRpbHMubnVsbFNhZmVFcXVhbHModGhpcy5uYW1lLCB0aGF0Lm5hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCFPYmplY3RVdGlscy5udWxsU2FmZUVxdWFscyh0aGlzLnZlcnNpb24sIHRoYXQudmVyc2lvbikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIU9iamVjdFV0aWxzLm51bGxTYWZlRXF1YWxzKHRoaXMuc3VwcGxpZXJJZCwgdGhhdC5zdXBwbGllcklkKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmICh0aGlzID09IG90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFBhY2thZ2VJbXBvcnQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgUGFja2FnZUltcG9ydCB0aGF0ID0gKFBhY2thZ2VJbXBvcnQpIG90aGVyOworICAgICAgICBpZiAoIU9iamVjdFV0aWxzLm51bGxTYWZlRXF1YWxzKHRoaXMubmFtZSwgdGhhdC5uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghT2JqZWN0VXRpbHMubnVsbFNhZmVFcXVhbHModGhpcy52ZXJzaW9uLCB0aGF0LnZlcnNpb24pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFPYmplY3RVdGlscy5udWxsU2FmZUVxdWFscyh0aGlzLnN1cHBsaWVySWQsIHRoYXQuc3VwcGxpZXJJZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5hZ2VtZW50L3JlbW90ZS9TZXJ2aWNlUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvbWFuYWdlbWVudC9yZW1vdGUvU2VydmljZVJlZmVyZW5jZS5qYXZhCmluZGV4IDE0ZWIxYTkuLjAxNTFhYzAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9tYW5hZ2VtZW50L3JlbW90ZS9TZXJ2aWNlUmVmZXJlbmNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL21hbmFnZW1lbnQvcmVtb3RlL1NlcnZpY2VSZWZlcmVuY2UuamF2YQpAQCAtOSw2ICs5LDcgQEAKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKiAgICAgU0FQIEFHIC0gbW92aW5nIHRvIEVjbGlwc2UgTGlicmEgcHJvamVjdCBhbmQgZW5oYW5jZW1lbnRzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGU7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKQEAgLTI2LDkzICsyNyw5MSBAQAogICovCiBwdWJsaWMgY2xhc3MgU2VydmljZVJlZmVyZW5jZSBpbXBsZW1lbnRzIElTZXJ2aWNlUmVmZXJlbmNlLCBTZXJpYWxpemFibGUgewogCi0JLyoKLQkgKiBBbHRob3VnaCB0aGlzIGVudW0gaXMgbm93IGRlZmluZWQgaW4gdGhlIElTZXJ2aWNlUmVmZXJlbmNlIGludGVyZmFjZSwgd2UKLQkgKiBzdGlsbCBuZWVkIHRvIGtlZXAgaXQgaW4gdGhpcyBjbGFzcyBkZWZpbml0aW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0JICogd2l0aCBlYXJsaWVyIHZlcnNpb24gb2YgdGhpcyBjbGFzcy4gT3RoZXJ3aXNlLCBVbm1hcnNoYWxFeGNlcHRpb24gd2lsbCBiZQotCSAqIHRocm93bi4KLQkgKi8KLQlwdWJsaWMgZW51bSBUeXBlIHsKLQkJSU5fVVNFLCBSRUdJU1RFUkVECi0JfQorICAgIC8qCisgICAgICogQWx0aG91Z2ggdGhpcyBlbnVtIGlzIG5vdyBkZWZpbmVkIGluIHRoZSBJU2VydmljZVJlZmVyZW5jZSBpbnRlcmZhY2UsIHdlIHN0aWxsIG5lZWQgdG8ga2VlcCBpdCBpbiB0aGlzIGNsYXNzCisgICAgICogZGVmaW5pdGlvbiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGlzIGNsYXNzLiBPdGhlcndpc2UsIFVubWFyc2hhbEV4Y2VwdGlvbiB3aWxsIGJlCisgICAgICogdGhyb3duLgorICAgICAqLworICAgIHB1YmxpYyBlbnVtIFR5cGUgeworICAgICAgICBJTl9VU0UsIFJFR0lTVEVSRUQKKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDg5NjkyNDYwMDI0NjE4NzkxNEw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ4OTY5MjQ2MDAyNDYxODc5MTRMOwogCi0JcHJpdmF0ZSBmaW5hbCBMb25nIGJ1bmRsZUlkOworICAgIHByaXZhdGUgZmluYWwgTG9uZyBidW5kbGVJZDsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nW10gY2xhenplczsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGNsYXp6ZXM7CiAKLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAKLQlwcml2YXRlIGZpbmFsIFNldDxMb25nPiB1c2luZ0J1bmRsZXMgPSBuZXcgSGFzaFNldDxMb25nPigpOworICAgIHByaXZhdGUgZmluYWwgU2V0PExvbmc+IHVzaW5nQnVuZGxlcyA9IG5ldyBIYXNoU2V0PExvbmc+KCk7CiAKLQlwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKIAotCXB1YmxpYyBTZXJ2aWNlUmVmZXJlbmNlKFR5cGUgdHlwZSwgTG9uZyBidW5kbGVJZCwgU3RyaW5nW10gY2xhenplcykgewotCQl0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7Ci0JCXRoaXMuY2xhenplcyA9IGNsYXp6ZXM7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQorICAgIHB1YmxpYyBTZXJ2aWNlUmVmZXJlbmNlKFR5cGUgdHlwZSwgTG9uZyBidW5kbGVJZCwgU3RyaW5nW10gY2xhenplcykgeworICAgICAgICB0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7CisgICAgICAgIHRoaXMuY2xhenplcyA9IGNsYXp6ZXM7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQogCi0JcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXM7CisgICAgfQogCi0JcHVibGljIFN0cmluZ1tdIGdldENsYXp6ZXMoKSB7Ci0JCXJldHVybiBjbGF6emVzOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2xhenplcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY2xhenplczsKKyAgICB9CiAKLQlwdWJsaWMgU2V0PExvbmc+IGdldFVzaW5nQnVuZGxlSWRzKCkgewotCQlyZXR1cm4gdXNpbmdCdW5kbGVzOwotCX0KKyAgICBwdWJsaWMgU2V0PExvbmc+IGdldFVzaW5nQnVuZGxlSWRzKCkgeworICAgICAgICByZXR1cm4gdGhpcy51c2luZ0J1bmRsZXM7CisgICAgfQogCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMucHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIGFkZFVzaW5nQnVuZGxlKExvbmcgaWQpIHsKLQkJdGhpcy51c2luZ0J1bmRsZXMuYWRkKGlkKTsKLQl9CisgICAgcHVibGljIHZvaWQgYWRkVXNpbmdCdW5kbGUoTG9uZyBpZCkgeworICAgICAgICB0aGlzLnVzaW5nQnVuZGxlcy5hZGQoaWQpOworICAgIH0KIAotCXB1YmxpYyBMb25nIGdldEJ1bmRsZUlkKCkgewotCQlyZXR1cm4gYnVuZGxlSWQ7Ci0JfQorICAgIHB1YmxpYyBMb25nIGdldEJ1bmRsZUlkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5idW5kbGVJZDsKKyAgICB9CiAKLQkvKgotCSAqIENvbnZlcnQgU2VydmljZVJlZmVyZW5jZS5UeXBlIHJldHVybmVkIGJ5IHRoZSBKTVggTUJlYW4gaW50bwotCSAqIElTZXJ2aWNlUmVmZXJlbmNlLlR5cGUgdXNlZCBieSB0aGUgYnVuZGxlIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgSVNlcnZpY2VSZWZlcmVuY2UuVHlwZSBnZXRUeXBlKCkgewotCQlpZiAodHlwZSA9PSBUeXBlLlJFR0lTVEVSRUQpIHsKLQkJCXJldHVybiBJU2VydmljZVJlZmVyZW5jZS5UeXBlLlJFR0lTVEVSRUQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gSVNlcnZpY2VSZWZlcmVuY2UuVHlwZS5JTl9VU0U7Ci0JCX0KLQl9CisgICAgLyoKKyAgICAgKiBDb252ZXJ0IFNlcnZpY2VSZWZlcmVuY2UuVHlwZSByZXR1cm5lZCBieSB0aGUgSk1YIE1CZWFuIGludG8gSVNlcnZpY2VSZWZlcmVuY2UuVHlwZSB1c2VkIGJ5IHRoZSBidW5kbGUgZWRpdG9yLgorICAgICAqLworICAgIHB1YmxpYyBJU2VydmljZVJlZmVyZW5jZS5UeXBlIGdldFR5cGUoKSB7CisgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gVHlwZS5SRUdJU1RFUkVEKSB7CisgICAgICAgICAgICByZXR1cm4gSVNlcnZpY2VSZWZlcmVuY2UuVHlwZS5SRUdJU1RFUkVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIElTZXJ2aWNlUmVmZXJlbmNlLlR5cGUuSU5fVVNFOworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IGhhc2hDb2RlID0gMTc7Ci0JCWhhc2hDb2RlID0gMzEgKiBoYXNoQ29kZSArIGNsYXp6ZXMuaGFzaENvZGUoKTsKLQkJaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgdHlwZS5oYXNoQ29kZSgpOwotCQlyZXR1cm4gaGFzaENvZGU7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoQ29kZSA9IDE3OworICAgICAgICBoYXNoQ29kZSA9IDMxICogaGFzaENvZGUgKyB0aGlzLmNsYXp6ZXMuaGFzaENvZGUoKTsKKyAgICAgICAgaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgdGhpcy50eXBlLmhhc2hDb2RlKCk7CisgICAgICAgIHJldHVybiBoYXNoQ29kZTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0JCWlmICh0aGlzID09IG90aGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlcnZpY2VSZWZlcmVuY2UpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU2VydmljZVJlZmVyZW5jZSB0aGF0ID0gKFNlcnZpY2VSZWZlcmVuY2UpIG90aGVyOwotCQlpZiAoIU9iamVjdFV0aWxzLm51bGxTYWZlRXF1YWxzKHRoaXMuY2xhenplcywgdGhhdC5jbGF6emVzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghT2JqZWN0VXRpbHMubnVsbFNhZmVFcXVhbHModGhpcy50eXBlLCB0aGF0LnR5cGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VydmljZVJlZmVyZW5jZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTZXJ2aWNlUmVmZXJlbmNlIHRoYXQgPSAoU2VydmljZVJlZmVyZW5jZSkgb3RoZXI7CisgICAgICAgIGlmICghT2JqZWN0VXRpbHMubnVsbFNhZmVFcXVhbHModGhpcy5jbGF6emVzLCB0aGF0LmNsYXp6ZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFPYmplY3RVdGlscy5udWxsU2FmZUVxdWFscyh0aGlzLnR5cGUsIHRoYXQudHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VDb25zdGFudHMuamF2YQppbmRleCBkMTExNTYyLi5iMWYwY2Y1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnByZWZlcmVuY2VzOwogCiAvKioKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQppbmRleCA3NTFmNDE5Li44NzM0MWJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCkBAIC04LDEwICs4LDEwIEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnByZWZlcmVuY2VzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLlNlcnZlckNvcmVQbHVnaW47CiAKIC8qKgpAQCAtMTksMTQgKzE5LDE0IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciMKLQkgKiBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gU2VydmVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQorICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7CisgICAgICAgIFNlcnZlckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3ByZWZlcmVuY2VzL1ZpcmdvUHJlZmVyZW5jZVBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9wcmVmZXJlbmNlcy9WaXJnb1ByZWZlcmVuY2VQYWdlLmphdmEKaW5kZXggMjJhNmE1MS4uYzJlMThiMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3ByZWZlcmVuY2VzL1ZpcmdvUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcHJlZmVyZW5jZXMvVmlyZ29QcmVmZXJlbmNlUGFnZS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wcmVmZXJlbmNlczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwpAQCAtMjAsNTYgKzIxLDUxIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5TZXJ2ZXJDb3JlUGx1Z2luOwogCiAvKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHByZWZlcmVuY2UgcGFnZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIHRvIHRoZQotICogUHJlZmVyZW5jZXMgYW5kIFByb2plY3QgUHJvcGVydGllcyBkaWFsb2dzLiBCeSBzdWJjbGFzc2luZwotICogPHNhbXA+RmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTwvc2FtcD4sIHdlIGNhbiB1c2UgdGhlIGZpZWxkIHN1cHBvcnQgYnVpbHQKLSAqIGludG8gSkZhY2UgdGhhdCBhbGxvd3MgdXMgdG8gY3JlYXRlIGEgcGFnZSB0aGF0IGlzIHNtYWxsIGFuZCBrbm93cyBob3cgdG8KLSAqIHNhdmUsIHJlc3RvcmUgYW5kIGFwcGx5IGl0c2VsZi4KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHByZWZlcmVuY2UgcGFnZSB0aGF0IGlzIGNvbnRyaWJ1dGVkIHRvIHRoZSBQcmVmZXJlbmNlcyBhbmQgUHJvamVjdCBQcm9wZXJ0aWVzIGRpYWxvZ3MuIEJ5CisgKiBzdWJjbGFzc2luZyA8c2FtcD5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlPC9zYW1wPiwgd2UgY2FuIHVzZSB0aGUgZmllbGQgc3VwcG9ydCBidWlsdCBpbnRvIEpGYWNlIHRoYXQgYWxsb3dzIHVzIHRvCisgKiBjcmVhdGUgYSBwYWdlIHRoYXQgaXMgc21hbGwgYW5kIGtub3dzIGhvdyB0byBzYXZlLCByZXN0b3JlIGFuZCBhcHBseSBpdHNlbGYuCiAgKiA8cD4KLSAqIFRoaXMgcGFnZSBpcyB1c2VkIHRvIG1vZGlmeSBwcmVmZXJlbmNlcyBvbmx5LiBUaGV5IGFyZSBzdG9yZWQgaW4gdGhlCi0gKiBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgYmVsb25ncyB0byB0aGUgbWFpbiBwbHVnLWluIGNsYXNzLiBUaGF0IHdheSwKLSAqIHByZWZlcmVuY2VzIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSB2aWEgdGhlIHByZWZlcmVuY2Ugc3RvcmUuCisgKiBUaGlzIHBhZ2UgaXMgdXNlZCB0byBtb2RpZnkgcHJlZmVyZW5jZXMgb25seS4gVGhleSBhcmUgc3RvcmVkIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIHRoYXQgYmVsb25ncyB0byB0aGUgbWFpbgorICogcGx1Zy1pbiBjbGFzcy4gVGhhdCB3YXksIHByZWZlcmVuY2VzIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSB2aWEgdGhlIHByZWZlcmVuY2Ugc3RvcmUuCiAgKi8KIAotcHVibGljIGNsYXNzIFZpcmdvUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlLAotCQlJV29ya2JlbmNoUHJvcGVydHlQYWdlIHsKK3B1YmxpYyBjbGFzcyBWaXJnb1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgSVdvcmtiZW5jaFByb3BlcnR5UGFnZSB7CiAKLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0OyAvLyBjYW4gYmUgbnVsbAorICAgIHByaXZhdGUgSVByb2plY3QgZlByb2plY3Q7IC8vIGNhbiBiZSBudWxsCiAKLQlwdWJsaWMgVmlyZ29QcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoR1JJRCk7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShTZXJ2ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldERlc2NyaXB0aW9uKCJFeHBhbmQgdGhlIHRyZWUgdG8gZWRpdCBwcmVmZXJlbmNlcyBmb3IgdGhlIFZpcmdvIHJ1bnRpbWUgdG9vbHMuIik7Ci0JfQorICAgIHB1YmxpYyBWaXJnb1ByZWZlcmVuY2VQYWdlKCkgeworICAgICAgICBzdXBlcihHUklEKTsKKyAgICAgICAgc2V0UHJlZmVyZW5jZVN0b3JlKFNlcnZlckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKKyAgICAgICAgc2V0RGVzY3JpcHRpb24oIkV4cGFuZCB0aGUgdHJlZSB0byBlZGl0IHByZWZlcmVuY2VzIGZvciB0aGUgVmlyZ28gcnVudGltZSB0b29scy4iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmaWVsZCBlZGl0b3JzLiBGaWVsZCBlZGl0b3JzIGFyZSBhYnN0cmFjdGlvbnMgb2YgdGhlIGNvbW1vbgotCSAqIEdVSSBibG9ja3MgbmVlZGVkIHRvIG1hbmlwdWxhdGUgdmFyaW91cyB0eXBlcyBvZiBwcmVmZXJlbmNlcy4gRWFjaCBmaWVsZAotCSAqIGVkaXRvciBrbm93cyBob3cgdG8gc2F2ZSBhbmQgcmVzdG9yZSBpdHNlbGYuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBmaWVsZCBlZGl0b3JzLiBGaWVsZCBlZGl0b3JzIGFyZSBhYnN0cmFjdGlvbnMgb2YgdGhlIGNvbW1vbiBHVUkgYmxvY2tzIG5lZWRlZCB0byBtYW5pcHVsYXRlIHZhcmlvdXMKKyAgICAgKiB0eXBlcyBvZiBwcmVmZXJlbmNlcy4gRWFjaCBmaWVsZCBlZGl0b3Iga25vd3MgaG93IHRvIHNhdmUgYW5kIHJlc3RvcmUgaXRzZWxmLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKKyAgICB9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlCi0JICogb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQorICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKKyAgICB9CiAKLQlwdWJsaWMgSUFkYXB0YWJsZSBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQorICAgIHB1YmxpYyBJQWRhcHRhYmxlIGdldEVsZW1lbnQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZQcm9qZWN0OworICAgIH0KIAotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoSUFkYXB0YWJsZSBlbGVtZW50KSB7Ci0JCU9iamVjdCBvYmogPSBlbGVtZW50LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlmUHJvamVjdCA9IGZQcm9qZWN0OwotCQl9IGVsc2UgewotCQkJZlByb2plY3QgPSBudWxsOwotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnQoSUFkYXB0YWJsZSBlbGVtZW50KSB7CisgICAgICAgIE9iamVjdCBvYmogPSBlbGVtZW50LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisgICAgICAgICAgICB0aGlzLmZQcm9qZWN0ID0gdGhpcy5mUHJvamVjdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuZlByb2plY3QgPSBudWxsOworICAgICAgICB9CisgICAgfQogCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9JU2VydmVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXIuamF2YQppbmRleCAzYTA4NDZhLi42NzQ1MjNmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXIuamF2YQpAQCAtOCw5MyArOCw5NCBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCiAgKiBWaXJnbyBzcGVjaWZpYyBpbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBzZXJ2ZXIKLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBMZW8gRG9zIFNhbnRvcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlciB7CiAKLQkvKiogUHJvcGVydHkgaW5kaWNhdGluZyB0aGUgYXV0byBwdWJsaXNoIHNldHRpbmcgKi8KLQlTdHJpbmcgUFJPUEVSVFlfQVVUT19QVUJMSVNIX1RJTUUgPSAiYXV0by1wdWJsaXNoLXRpbWUiOworICAgIC8qKiBQcm9wZXJ0eSBpbmRpY2F0aW5nIHRoZSBhdXRvIHB1Ymxpc2ggc2V0dGluZyAqLworICAgIFN0cmluZyBQUk9QRVJUWV9BVVRPX1BVQkxJU0hfVElNRSA9ICJhdXRvLXB1Ymxpc2gtdGltZSI7CiAKLQkvKiogUHJvcGVydHkgaW5kaWNhdGluZyB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAqLwotCVN0cmluZyBQUk9QRVJUWV9JTlNUQU5DRV9ESVIgPSBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuaW5zdGFuY2UuZGlyIjsKKyAgICAvKiogUHJvcGVydHkgaW5kaWNhdGluZyB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAqLworICAgIFN0cmluZyBQUk9QRVJUWV9JTlNUQU5DRV9ESVIgPSBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuaW5zdGFuY2UuZGlyIjsKIAotCS8qKiBQcm9wZXJ0eSBpbmRpY2F0aW5nIHRoZSBkZXBsb3kgZGlyZWN0b3J5ICovCi0JU3RyaW5nIFBST1BFUlRZX0RFUExPWV9ESVIgPSBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCArICJkZXBsb3kuZGlyIjsKKyAgICAvKiogUHJvcGVydHkgaW5kaWNhdGluZyB0aGUgZGVwbG95IGRpcmVjdG9yeSAqLworICAgIFN0cmluZyBQUk9QRVJUWV9ERVBMT1lfRElSID0gU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiZGVwbG95LmRpciI7CiAKLQkvKiogUHJvcGVydHkgaW5kaWNhdGluZyB0aGUgZGVwbG95IHRpbWVvdXQgKi8KLQlTdHJpbmcgUFJPUEVSVFlfREVQTE9ZX1RJTUVPVVQgPSBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCArICJkZXBsb3kudGltZW91dCI7CisgICAgLyoqIFByb3BlcnR5IGluZGljYXRpbmcgdGhlIGRlcGxveSB0aW1lb3V0ICovCisgICAgU3RyaW5nIFBST1BFUlRZX0RFUExPWV9USU1FT1VUID0gU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiZGVwbG95LnRpbWVvdXQiOwogCi0JLyoqIFByb3BlcnR5IGluZGljYXRpbmcgdGhlIHVzZXJuYW1lIG9mIHRoZSBkZXBsb3llciBKTVggY29udHJvbCAqLwotCVN0cmluZyBQUk9QRVJUWV9NQkVBTl9TRVJWRVJfVVNFUk5BTUUgPSBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCArICJkZXBsb3llci51c2VybmFtZSI7CisgICAgLyoqIFByb3BlcnR5IGluZGljYXRpbmcgdGhlIHVzZXJuYW1lIG9mIHRoZSBkZXBsb3llciBKTVggY29udHJvbCAqLworICAgIFN0cmluZyBQUk9QRVJUWV9NQkVBTl9TRVJWRVJfVVNFUk5BTUUgPSBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCArICJkZXBsb3llci51c2VybmFtZSI7CiAKLQkvKiogUHJvcGVydHkgaW5kaWNhdGluZyB0aGUgcGFzc3dvcmQgb2YgdGhlIGRlcGxveWVyIEpNWCBjb250cm9sICovCi0JU3RyaW5nIFBST1BFUlRZX01CRUFOX1NFUlZFUl9QQVNTV09SRCA9IFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lEICsgImRlcGxveWVyLnBhc3N3b3JkIjsKKyAgICAvKiogUHJvcGVydHkgaW5kaWNhdGluZyB0aGUgcGFzc3dvcmQgb2YgdGhlIGRlcGxveWVyIEpNWCBjb250cm9sICovCisgICAgU3RyaW5nIFBST1BFUlRZX01CRUFOX1NFUlZFUl9QQVNTV09SRCA9IFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lEICsgImRlcGxveWVyLnBhc3N3b3JkIjsKIAotCS8qKiBQcm9wZXJ0eSBpbmRpY2F0aW5nIHRoZSBwb3J0IG9mIHRoZSBkZXBsb3llciBKTVggY29udHJvbCAqLwotCVN0cmluZyBQUk9QRVJUWV9NQkVBTl9TRVJWRVJfUE9SVCA9IFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lEICsgImRlcGxveWVyLnBvcnQiOworICAgIC8qKiBQcm9wZXJ0eSBpbmRpY2F0aW5nIHRoZSBwb3J0IG9mIHRoZSBkZXBsb3llciBKTVggY29udHJvbCAqLworICAgIFN0cmluZyBQUk9QRVJUWV9NQkVBTl9TRVJWRVJfUE9SVCA9IFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lEICsgImRlcGxveWVyLnBvcnQiOwogCi0JLyoqIFByb3BlcnR5IGluZGljYXRpbmcgdGhlIHBvcnQgb2YgdGhlIGRlcGxveWVyIEpNWCBjb250cm9sICovCi0JU3RyaW5nIFBST1BFUlRZX1NUQVRJQ19GSUxFTkFNRVMgPSBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCArICJmaWxlbmFtZXMuc3RhdGljIjsKKyAgICAvKiogUHJvcGVydHkgaW5kaWNhdGluZyB0aGUgcG9ydCBvZiB0aGUgZGVwbG95ZXIgSk1YIGNvbnRyb2wgKi8KKyAgICBTdHJpbmcgUFJPUEVSVFlfU1RBVElDX0ZJTEVOQU1FUyA9IFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lEICsgImZpbGVuYW1lcy5zdGF0aWMiOwogCi0JLyoqIFByb3BlcnR5IGlmIHRoZSBzZXJ2ZXIgc2hvdWxkIHRhaWwgbG9nIGZpbGVzICovCi0JU3RyaW5nIFBST1BFUlRZX1RBSUxfTE9HX0ZJTEVTID0gU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAidGFpbC5sb2cuZmlsZXMiOworICAgIC8qKiBQcm9wZXJ0eSBpZiB0aGUgc2VydmVyIHNob3VsZCB0YWlsIGxvZyBmaWxlcyAqLworICAgIFN0cmluZyBQUk9QRVJUWV9UQUlMX0xPR19GSUxFUyA9IFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lEICsgInRhaWwubG9nLmZpbGVzIjsKIAotCVN0cmluZyBQUk9QRVJUWV9DTEVBTl9TVEFSVFVQID0gU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiY2xlYW4uc3RhcnR1cCI7CisgICAgU3RyaW5nIFBST1BFUlRZX0NMRUFOX1NUQVJUVVAgPSBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCArICJjbGVhbi5zdGFydHVwIjsKIAotCVN0cmluZyBQUk9QRVJUWV9BUlRFRkFDVF9PUkRFUiA9IFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lEICsgImFydGVmYWN0LmRlcGxveS5vcmRlciI7CisgICAgU3RyaW5nIFBST1BFUlRZX0FSVEVGQUNUX09SREVSID0gU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiYXJ0ZWZhY3QuZGVwbG95Lm9yZGVyIjsKIAotCVN0cmluZyBQUk9QRVJUWV9NQVhfUEVSTV9TSVpFID0gU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAibWF4LnBlcm0uc2l6ZSI7CisgICAgU3RyaW5nIFBST1BFUlRZX01BWF9QRVJNX1NJWkUgPSBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCArICJtYXgucGVybS5zaXplIjsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlcGxveSBkaXJlY3RvcnkuCi0JICovCi0JU3RyaW5nIGdldERlcGxveURpcmVjdG9yeSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlcGxveSBkaXJlY3RvcnkuCisgICAgICovCisgICAgU3RyaW5nIGdldERlcGxveURpcmVjdG9yeSgpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUge0BsaW5rIElTZXJ2ZXJDb25maWd1cmF0aW9ufS4KLQkgKi8KLQlJU2VydmVyQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUge0BsaW5rIElTZXJ2ZXJDb25maWd1cmF0aW9ufS4KKyAgICAgKi8KKyAgICBJU2VydmVyQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1c2VybmFtZSBvZiB0aGUgSk1YIGRlcGxveWVyIGNvbnRyb2wKLQkgKi8KLQlTdHJpbmcgZ2V0TUJlYW5TZXJ2ZXJVc2VybmFtZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVzZXJuYW1lIG9mIHRoZSBKTVggZGVwbG95ZXIgY29udHJvbAorICAgICAqLworICAgIFN0cmluZyBnZXRNQmVhblNlcnZlclVzZXJuYW1lKCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3J0IG9mIHRoZSBKTVggZGVwbG95ZXIgY29udHJvbAotCSAqLwotCWludCBnZXRNQmVhblNlcnZlclBvcnQoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwb3J0IG9mIHRoZSBKTVggZGVwbG95ZXIgY29udHJvbAorICAgICAqLworICAgIGludCBnZXRNQmVhblNlcnZlclBvcnQoKTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpbWVvdXQgb2YgdGhlIEpNWCBkZXBsb3kgb3BlcmF0aW9uCi0JICovCi0JaW50IGdldERlcGxveVRpbWVvdXQoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0aW1lb3V0IG9mIHRoZSBKTVggZGVwbG95IG9wZXJhdGlvbgorICAgICAqLworICAgIGludCBnZXREZXBsb3lUaW1lb3V0KCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXNzd29yZCBvZiB0aGUgSk1YIGRlcGxveWVyIGNvbnRyb2wKLQkgKi8KLQlTdHJpbmcgZ2V0TUJlYW5TZXJ2ZXJQYXNzd29yZCgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHBhc3N3b3JkIG9mIHRoZSBKTVggZGVwbG95ZXIgY29udHJvbAorICAgICAqLworICAgIFN0cmluZyBnZXRNQmVhblNlcnZlclBhc3N3b3JkKCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZXJ2ZXIgc2hvdWxkIHRhaWwgbG9nIGZpbGVzCi0JICovCi0JYm9vbGVhbiBzaG91bGRUYWlsVHJhY2VGaWxlcygpOworICAgIC8qKgorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlcnZlciBzaG91bGQgdGFpbCBsb2cgZmlsZXMKKyAgICAgKi8KKyAgICBib29sZWFuIHNob3VsZFRhaWxUcmFjZUZpbGVzKCk7CiAKLQlib29sZWFuIHNob3VsZENsZWFuU3RhcnR1cCgpOworICAgIGJvb2xlYW4gc2hvdWxkQ2xlYW5TdGFydHVwKCk7CiAKLQlMaXN0PFN0cmluZz4gZ2V0QXJ0ZWZhY3RPcmRlcigpOworICAgIExpc3Q8U3RyaW5nPiBnZXRBcnRlZmFjdE9yZGVyKCk7CiAKLQlTdHJpbmcgZ2V0U3RhdGljRmlsZW5hbWVQYXR0ZXJucygpOworICAgIFN0cmluZyBnZXRTdGF0aWNGaWxlbmFtZVBhdHRlcm5zKCk7CiAKLQlTdHJpbmcgZ2V0TWF4UGVybVNpemUoKTsKKyAgICBTdHJpbmcgZ2V0TWF4UGVybVNpemUoKTsKIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9JU2VydmVyQmVoYXZpb3VyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXJCZWhhdmlvdXIuamF2YQppbmRleCBkNDQxZGIwLi5jMzdlZTlmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXJCZWhhdmlvdXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXJCZWhhdmlvdXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTIxLDQxICsyMiw0MCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JVVJMUHJvdmlkZXI7CiAKIC8qKgotICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSBpbnRlbmRlZCB0byBwcm92aWRlIGV4dHJhIGtub3dsZWRnZQotICogYWJvdXQgdGhlIHJ1bnRpbWUgYmVoYXZpb3Igb3IgYSBkbSBTZXJ2ZXIgaW5zdGFuY2UuCi0gKiAKKyAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBhcmUgaW50ZW5kZWQgdG8gcHJvdmlkZSBleHRyYSBrbm93bGVkZ2UgYWJvdXQgdGhlIHJ1bnRpbWUgYmVoYXZpb3Igb3IgYSBkbSBTZXJ2ZXIKKyAqIGluc3RhbmNlLgorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlckJlaGF2aW91ciBleHRlbmRzIElVUkxQcm92aWRlciB7CiAKLQkvKiogUHJvcGVydHkgaW5kaWNhdGluZyB0aGUgaXAgb2YgdGhlIGRlcGxveWVyIEpNWCBjb250cm9sICovCi0JU3RyaW5nIFBST1BFUlRZX01CRUFOX1NFUlZFUl9JUCA9IFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lEICsgImRlcGxveWVyLmlwIjsKKyAgICAvKiogUHJvcGVydHkgaW5kaWNhdGluZyB0aGUgaXAgb2YgdGhlIGRlcGxveWVyIEpNWCBjb250cm9sICovCisgICAgU3RyaW5nIFBST1BFUlRZX01CRUFOX1NFUlZFUl9JUCA9IFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lEICsgImRlcGxveWVyLmlwIjsKIAotCS8qKgotCSAqIENvbmZpZ3VyZSB0aGUgZ2l2ZW4ge0BsaW5rIElMYXVuY2h9IGFuZCBhZGQgYWxsIHJ1bnRpbWUgc2V0dGluZ3MgbGlrZQotCSAqIGNsYXNzIHBhdGggYW5kIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCSAqLwotCXZvaWQgc2V0dXBMYXVuY2goSUxhdW5jaCBsYXVuY2gsIFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSB0aGUgZ2l2ZW4ge0BsaW5rIElMYXVuY2h9IGFuZCBhZGQgYWxsIHJ1bnRpbWUgc2V0dGluZ3MgbGlrZSBjbGFzcyBwYXRoIGFuZCBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAgICAgKi8KKyAgICB2b2lkIHNldHVwTGF1bmNoKElMYXVuY2ggbGF1bmNoLCBTdHJpbmcgbGF1bmNoTW9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIGlwIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZWQgc2VydmVyCi0JICovCi0JU3RyaW5nIGdldE1CZWFuU2VydmVySXAoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpcCBhZGRyZXNzIG9mIHRoZSBjb250cm9sbGVkIHNlcnZlcgorICAgICAqLworICAgIFN0cmluZyBnZXRNQmVhblNlcnZlcklwKCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZXBsb3llciBjb250cm9sCi0JICovCi0JSVNlcnZlckRlcGxveWVyIGdldFNlcnZlckRlcGxveWVyKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVwbG95ZXIgY29udHJvbAorICAgICAqLworICAgIElTZXJ2ZXJEZXBsb3llciBnZXRTZXJ2ZXJEZXBsb3llcigpOwogCi0JSVNlcnZlclJ1bnRpbWVQcm92aWRlciBnZXRWZXJzaW9uSGFuZGxlcigpOworICAgIElTZXJ2ZXJSdW50aW1lUHJvdmlkZXIgZ2V0VmVyc2lvbkhhbmRsZXIoKTsKIAotCU1hcDxTdHJpbmcsIERlcGxveW1lbnRJZGVudGl0eT4gZ2V0RGVwbG95bWVudElkZW50aXRpZXMoKTsKKyAgICBNYXA8U3RyaW5nLCBEZXBsb3ltZW50SWRlbnRpdHk+IGdldERlcGxveW1lbnRJZGVudGl0aWVzKCk7CiAKLQlJUGF0aCBnZXRNb2R1bGVEZXBsb3lVcmkoSU1vZHVsZSBtb2R1bGUpOworICAgIElQYXRoIGdldE1vZHVsZURlcGxveVVyaShJTW9kdWxlIG1vZHVsZSk7CiAKLQl2b2lkIG9uTW9kdWxlU3RhdGVDaGFuZ2UoSU1vZHVsZVtdIG1vZHVsZXMsIGludCBzdGF0ZVN0b3BwZWQpOworICAgIHZvaWQgb25Nb2R1bGVTdGF0ZUNoYW5nZShJTW9kdWxlW10gbW9kdWxlcywgaW50IHN0YXRlU3RvcHBlZCk7CiAKLQl2b2lkIG9uTW9kdWxlUHVibGlzaFN0YXRlQ2hhbmdlKElNb2R1bGVbXSBtb2R1bGVzLCBpbnQgcHVibGlzaFN0YXRlTm9uZSk7CisgICAgdm9pZCBvbk1vZHVsZVB1Ymxpc2hTdGF0ZUNoYW5nZShJTW9kdWxlW10gbW9kdWxlcywgaW50IHB1Ymxpc2hTdGF0ZU5vbmUpOwogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXJDb25maWd1cmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXJDb25maWd1cmF0aW9uLmphdmEKaW5kZXggNmZiYmRkMS4uOTVkZjgwMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9JU2VydmVyQ29uZmlndXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvSVNlcnZlckNvbmZpZ3VyYXRpb24uamF2YQpAQCAtOCwyNSArOCwyNSBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCi0gKiBNYXJrZXIgaW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNvbmZpZ3VyYXRpb24gcHJvdmlkZXJzIGZvciB0aGUgZG0KLSAqIHNlcnZlciBpbnRlZ3JhdGlvbi4KLSAqIAorICogTWFya2VyIGludGVyZmFjZSB0byBiZSBpbXBsZW1lbnRlZCBieSBjb25maWd1cmF0aW9uIHByb3ZpZGVycyBmb3IgdGhlIGRtIHNlcnZlciBpbnRlZ3JhdGlvbi4KKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJDb25maWd1cmF0aW9uIHsKIAotCUxpc3Q8U3RyaW5nPiBnZXRBcnRlZmFjdE9yZGVyKCk7CisgICAgTGlzdDxTdHJpbmc+IGdldEFydGVmYWN0T3JkZXIoKTsKIAotCXZvaWQgc2V0QXJ0ZWZhY3RPcmRlcihMaXN0PFN0cmluZz4gYXJ0ZWZhY3RzKTsKKyAgICB2b2lkIHNldEFydGVmYWN0T3JkZXIoTGlzdDxTdHJpbmc+IGFydGVmYWN0cyk7CiAKLQl2b2lkIGFkZEFydGVmYWN0KFN0cmluZyBhcnRlZmFjdCk7CisgICAgdm9pZCBhZGRBcnRlZmFjdChTdHJpbmcgYXJ0ZWZhY3QpOwogCi0Jdm9pZCByZW1vdmVBcnRlZmFjdChTdHJpbmcgYXJ0ZWZhY3QpOworICAgIHZvaWQgcmVtb3ZlQXJ0ZWZhY3QoU3RyaW5nIGFydGVmYWN0KTsKIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9JU2VydmVyRGVwbG95ZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvSVNlcnZlckRlcGxveWVyLmphdmEKaW5kZXggMTlkMTUyNi4uM2UwZTQzMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9JU2VydmVyRGVwbG95ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXJEZXBsb3llci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmU7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMTcsNDcgKzE4LDQ2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlOwogCiAvKioKLSAqIEludGVyZmFjZSBmb3IgY2xpZW50cyB0aGF0IHdhbnQgdG8gY29udHJvbCB0aGUgZGVwbG95IG1lY2hhbmlzbSBhc3NvY2lhdGVkCi0gKiB3aXRoIGEge0BsaW5rIElTZXJ2ZXJSdW50aW1lUHJvdmlkZXJ9LgotICogCisgKiBJbnRlcmZhY2UgZm9yIGNsaWVudHMgdGhhdCB3YW50IHRvIGNvbnRyb2wgdGhlIGRlcGxveSBtZWNoYW5pc20gYXNzb2NpYXRlZCB3aXRoIGEge0BsaW5rIElTZXJ2ZXJSdW50aW1lUHJvdmlkZXJ9LgorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDIuMC4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlckRlcGxveWVyIHsKIAotCS8qKgotCSAqIERlcGxveXMgdGhlIGdpdmVuIHtAbGluayBJTW9kdWxlfXMgb24gdGhlIHNlcnZlci4KLQkgKi8KLQl2b2lkIGRlcGxveShJTW9kdWxlLi4uIG1vZHVsZXMpOworICAgIC8qKgorICAgICAqIERlcGxveXMgdGhlIGdpdmVuIHtAbGluayBJTW9kdWxlfXMgb24gdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICB2b2lkIGRlcGxveShJTW9kdWxlLi4uIG1vZHVsZXMpOwogCi0JLyoqCi0JICogUmVkZXBsb3lzIHRoZSBnaXZlbiB7QGxpbmsgSU1vZHVsZX0gb24gdGhlIHNlcnZlci4KLQkgKi8KLQl2b2lkIHJlZGVwbG95KElNb2R1bGUgbW9kdWxlKTsKKyAgICAvKioKKyAgICAgKiBSZWRlcGxveXMgdGhlIGdpdmVuIHtAbGluayBJTW9kdWxlfSBvbiB0aGUgc2VydmVyLgorICAgICAqLworICAgIHZvaWQgcmVkZXBsb3koSU1vZHVsZSBtb2R1bGUpOwogCi0JLyoqCi0JICogUmVmcmVzaGVzIGEgZ2l2ZW4gc3RhdGljIHJlc291cmNlIG9mIHRoZSBnaXZlbiB7QGxpbmsgSU1vZHVsZX1zLgotCSAqLwotCXZvaWQgcmVmcmVzaFN0YXRpYyhJTW9kdWxlIG1vZHVsZSwgSU1vZHVsZUZpbGUgZmlsZSk7CisgICAgLyoqCisgICAgICogUmVmcmVzaGVzIGEgZ2l2ZW4gc3RhdGljIHJlc291cmNlIG9mIHRoZSBnaXZlbiB7QGxpbmsgSU1vZHVsZX1zLgorICAgICAqLworICAgIHZvaWQgcmVmcmVzaFN0YXRpYyhJTW9kdWxlIG1vZHVsZSwgSU1vZHVsZUZpbGUgZmlsZSk7CiAKLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBnaXZlbiB7QGxpbmsgSU1vZHVsZX1zIGluc2lkZSBhIFBBUi4KLQkgKi8KLQl2b2lkIHJlZnJlc2goSU1vZHVsZSBwYXJNb2R1bGUsIElNb2R1bGUuLi4gbW9kdWxlcyk7CisgICAgLyoqCisgICAgICogUmVmcmVzaCB0aGUgZ2l2ZW4ge0BsaW5rIElNb2R1bGV9cyBpbnNpZGUgYSBQQVIuCisgICAgICovCisgICAgdm9pZCByZWZyZXNoKElNb2R1bGUgcGFyTW9kdWxlLCBJTW9kdWxlLi4uIG1vZHVsZXMpOwogCi0JLyoqCi0JICogVW5kZXBsb3lzIHRoZSBnaXZlbiB7QGxpbmsgSU1vZHVsZX1zLgotCSAqLwotCXZvaWQgdW5kZXBsb3koSU1vZHVsZS4uLiBtb2R1bGVzKTsKKyAgICAvKioKKyAgICAgKiBVbmRlcGxveXMgdGhlIGdpdmVuIHtAbGluayBJTW9kdWxlfXMuCisgICAgICovCisgICAgdm9pZCB1bmRlcGxveShJTW9kdWxlLi4uIG1vZHVsZXMpOwogCi0JLyoqCi0JICogU2h1dHMgZG93biB0aGUgc2VydmVyCi0JICovCi0Jdm9pZCBzaHV0ZG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbjsKKyAgICAvKioKKyAgICAgKiBTaHV0cyBkb3duIHRoZSBzZXJ2ZXIKKyAgICAgKi8KKyAgICB2b2lkIHNodXRkb3duKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uOwogCi0JLyoqCi0JICogUGluZ3MgdGhlIHNlcnZlciB0byBpZiBpdCBpcyBydW5uaW5nCi0JICovCi0JQm9vbGVhbiBwaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uOworICAgIC8qKgorICAgICAqIFBpbmdzIHRoZSBzZXJ2ZXIgdG8gaWYgaXQgaXMgcnVubmluZworICAgICAqLworICAgIEJvb2xlYW4gcGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbjsKIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvSVNlcnZlclJ1bnRpbWUuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvSVNlcnZlclJ1bnRpbWUuamF2YQppbmRleCAzMjgwYzgwLi5iNGU1ZDI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXJSdW50aW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9JU2VydmVyUnVudGltZS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTE3LDQ4ICsxOCw0OCBAQAogCiAvKioKICAqIEV4dGVuc2lvbiB0byB7QGxpbmsgSUphdmFSdW50aW1lfSB0aGF0IGhhcyBzcGVjaWZpYyBkbSBTZXJ2ZXIgbWV0aG9kcy4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlclJ1bnRpbWUgZXh0ZW5kcyBJSmF2YVJ1bnRpbWUgewogCi0JU3RyaW5nIFBST1BFUlRZX1ZNX0lOU1RBTExfSUQgPSAidm0taW5zdGFsbC1pZCI7CisgICAgU3RyaW5nIFBST1BFUlRZX1ZNX0lOU1RBTExfSUQgPSAidm0taW5zdGFsbC1pZCI7CiAKLQlTdHJpbmcgUFJPUEVSVFlfVk1fSU5TVEFMTF9UWVBFX0lEID0gInZtLWluc3RhbGwtdHlwZS1pZCI7CisgICAgU3RyaW5nIFBST1BFUlRZX1ZNX0lOU1RBTExfVFlQRV9JRCA9ICJ2bS1pbnN0YWxsLXR5cGUtaWQiOwogCi0JU3RyaW5nIFBST1BFUlRZX1NFUlZFUl9BRERSRVNTID0gU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlcnZlckFkZHJlc3NQcm9wZXJ0eSI7CisgICAgU3RyaW5nIFBST1BFUlRZX1NFUlZFUl9BRERSRVNTID0gU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLnNlcnZlckFkZHJlc3NQcm9wZXJ0eSI7CiAKLQlTdHJpbmcgUFJPUEVSVFlfVklSR09fVkVSU0lPTl9UWVBFX0lEID0gInZpcmdvLXZlcnNpb24tdHlwZS1pZCI7CisgICAgU3RyaW5nIFBST1BFUlRZX1ZJUkdPX1ZFUlNJT05fVFlQRV9JRCA9ICJ2aXJnby12ZXJzaW9uLXR5cGUtaWQiOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBjbGFzc3BhdGggb2YgdGhlIGRtIHNlcnZlciBydW50aW1lCi0JICovCi0JTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBnZXRSdW50aW1lQ2xhc3NwYXRoKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcnVudGltZSBjbGFzc3BhdGggb2YgdGhlIGRtIHNlcnZlciBydW50aW1lCisgICAgICovCisgICAgTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBnZXRSdW50aW1lQ2xhc3NwYXRoKCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBzZXJ2ZXIucHJvZmlsZSBmaWxlCi0JICovCi0JU3RyaW5nIGdldFByb2ZpbGVQYXRoKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgc2VydmVyLnByb2ZpbGUgZmlsZQorICAgICAqLworICAgIFN0cmluZyBnZXRQcm9maWxlUGF0aCgpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgc2VydmVyLmNvbmZpZyBmaWxlCi0JICovCi0JU3RyaW5nIGdldENvbmZpZ1BhdGgoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBzZXJ2ZXIuY29uZmlnIGZpbGUKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0Q29uZmlnUGF0aCgpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXNlciBsZXZlbCBidW5kbGUgcmVwb3NpdG9yeSBwYXRoCi0JICovCi0JU3RyaW5nIGdldFVzZXJMZXZlbEJ1bmRsZVJlcG9zaXRvcnlQYXRoKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdXNlciBsZXZlbCBidW5kbGUgcmVwb3NpdG9yeSBwYXRoCisgICAgICovCisgICAgU3RyaW5nIGdldFVzZXJMZXZlbEJ1bmRsZVJlcG9zaXRvcnlQYXRoKCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1c2VyIGxldmVsIGxpYnJhcnkgcGF0aAotCSAqLwotCVN0cmluZyBnZXRVc2VyTGV2ZWxMaWJyYXJ5UmVwb3NpdG9yeVBhdGgoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1c2VyIGxldmVsIGxpYnJhcnkgcGF0aAorICAgICAqLworICAgIFN0cmluZyBnZXRVc2VyTGV2ZWxMaWJyYXJ5UmVwb3NpdG9yeVBhdGgoKTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIG1haW4gY2xhc3MgdG8gbGF1bmNoIHRoZSBkbSBTZXJ2ZXIgd2l0aC4KLQkgKi8KLQlTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWFpbiBjbGFzcyB0byBsYXVuY2ggdGhlIGRtIFNlcnZlciB3aXRoLgorICAgICAqLworICAgIFN0cmluZyBnZXRSdW50aW1lQ2xhc3MoKTsKIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9JU2VydmVyUnVudGltZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXJSdW50aW1lUHJvdmlkZXIuamF2YQppbmRleCA0ZTNiODIyLi4wNmMxZjU0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXJSdW50aW1lUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXJSdW50aW1lUHJvdmlkZXIuamF2YQpAQCAtOSw2ICs5LDcgQEAKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKiAgICAgU0FQIEFHIC0gbW92aW5nIHRvIEVjbGlwc2UgTGlicmEgcHJvamVjdCBhbmQgZW5oYW5jZW1lbnRzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTMwLDcgKzMxLDcgQEAKIAogLyoqCiAgKiBJbnRlcmZhY2UgdGhhdCBlbmNhcHN1bGF0ZXMgc2VydmVyIHNldHRpbmdzIHN1Y2ggYXMgZm9yIHZlcnNpb25zLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAYXV0aG9yIEthbG95YW4gUmFldgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKQEAgLTM4LDE0OSArMzksMTQ3IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlclJ1bnRpbWVQcm92aWRlciB7CiAKLQkvKioKLQkgKiBDaGVjayBpZiBhIGNlcnRhaW4gZG0gc2VydmVyIGNhbiBzZXJ2ZSBhIGdpdmVuIG1vZHVsZSh0eXBlKQotCSAqLwotCUlTdGF0dXMgY2FuQWRkTW9kdWxlKElNb2R1bGUgbW9kdWxlKTsKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBhIGNlcnRhaW4gZG0gc2VydmVyIGNhbiBzZXJ2ZSBhIGdpdmVuIG1vZHVsZSh0eXBlKQorICAgICAqLworICAgIElTdGF0dXMgY2FuQWRkTW9kdWxlKElNb2R1bGUgbW9kdWxlKTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvLWJlIGV4Y2x1ZGVkIHByb2dyYW0gYXJndW1lbnRzCi0JICovCi0JU3RyaW5nW10gZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuIHN0YXJ0aW5nKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0by1iZSBleGNsdWRlZCBwcm9ncmFtIGFyZ3VtZW50cworICAgICAqLworICAgIFN0cmluZ1tdIGdldEV4Y2x1ZGVkUnVudGltZVByb2dyYW1Bcmd1bWVudHMoYm9vbGVhbiBzdGFydGluZyk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBydW50aW1lIGJhc2UgZGlyZWN0b3J5LgotCSAqLwotCUlQYXRoIGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyIHNlcnZlcik7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcnVudGltZSBiYXNlIGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBJUGF0aCBnZXRSdW50aW1lQmFzZURpcmVjdG9yeShvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlciBzZXJ2ZXIpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBjbGFzcwotCSAqLwotCVN0cmluZyBnZXRSdW50aW1lQ2xhc3MoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNsYXNzCisgICAgICovCisgICAgU3RyaW5nIGdldFJ1bnRpbWVDbGFzcygpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBjbGFzcyBwYXRoCi0JICovCi0JTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoIGluc3RhbGxQYXRoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIGNsYXNzIHBhdGgKKyAgICAgKi8KKyAgICBMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+IGdldFJ1bnRpbWVDbGFzc3BhdGgoSVBhdGggaW5zdGFsbFBhdGgpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSBwcm9ncmFtIGFyZ3VtZW50cwotCSAqLwotCVN0cmluZ1tdIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIHByb2dyYW0gYXJndW1lbnRzCisgICAgICovCisgICAgU3RyaW5nW10gZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcnVudGltZSB2bSBhcmd1bWVudHMKLQkgKi8KLQlTdHJpbmdbXSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElQYXRoIGluc3RhbGxQYXRoLCBJUGF0aCBjb25maWdQYXRoLAotCQkJSVBhdGggZGVwbG95UGF0aCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcnVudGltZSB2bSBhcmd1bWVudHMKKyAgICAgKi8KKyAgICBTdHJpbmdbXSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElQYXRoIGluc3RhbGxQYXRoLCBJUGF0aCBjb25maWdQYXRoLCBJUGF0aCBkZXBsb3lQYXRoKTsKIAotCS8qKgotCSAqIFZlcmlmaWVzIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5Ci0JICovCi0JSVN0YXR1cyB2ZXJpZnlJbnN0YWxsYXRpb24oSVJ1bnRpbWUgcnVudGltZSk7CisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBJU3RhdHVzIHZlcmlmeUluc3RhbGxhdGlvbihJUnVudGltZSBydW50aW1lKTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHNlcnZlci5jb25maWcgZmlsZQotCSAqLwotCVN0cmluZyBnZXRQcm9maWxlUGF0aChJUnVudGltZSBydW50aW1lKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBzZXJ2ZXIuY29uZmlnIGZpbGUKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0UHJvZmlsZVBhdGgoSVJ1bnRpbWUgcnVudGltZSk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBleHQgZGlyZWN0b3J5IGluIHRoZSBidW5kbGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlTdHJpbmcgZ2V0RXh0TGV2ZWxCdW5kbGVSZXBvc2l0b3J5UGF0aChJUnVudGltZSBydW50aW1lKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBleHQgZGlyZWN0b3J5IGluIHRoZSBidW5kbGUgcmVwb3NpdG9yeS4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0RXh0TGV2ZWxCdW5kbGVSZXBvc2l0b3J5UGF0aChJUnVudGltZSBydW50aW1lKTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIHVzZXIgZGlyZWN0b3J5IGluIHRoZSBidW5kbGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlTdHJpbmcgZ2V0VXNlckxldmVsQnVuZGxlUmVwb3NpdG9yeVBhdGgoSVJ1bnRpbWUgcnVudGltZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgdXNlciBkaXJlY3RvcnkgaW4gdGhlIGJ1bmRsZSByZXBvc2l0b3J5LgorICAgICAqLworICAgIFN0cmluZyBnZXRVc2VyTGV2ZWxCdW5kbGVSZXBvc2l0b3J5UGF0aChJUnVudGltZSBydW50aW1lKTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIGxpYnJhcnkgcmVwb3NpdG9yeS4KLQkgKi8KLQlTdHJpbmcgZ2V0VXNlckxldmVsTGlicmFyeVJlcG9zaXRvcnlQYXRoKElSdW50aW1lIHJ1bnRpbWUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHBhdGggdG8gdGhlIGxpYnJhcnkgcmVwb3NpdG9yeS4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0VXNlckxldmVsTGlicmFyeVJlcG9zaXRvcnlQYXRoKElSdW50aW1lIHJ1bnRpbWUpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCB0byB0aGUgc2VydmVyIGNvbmZpZy4KLQkgKi8KLQlTdHJpbmcgZ2V0Q29uZmlnUGF0aChJUnVudGltZSBydW50aW1lKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBzZXJ2ZXIgY29uZmlnLgorICAgICAqLworICAgIFN0cmluZyBnZXRDb25maWdQYXRoKElSdW50aW1lIHJ1bnRpbWUpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgRGVwbG95ZXIgTUJlYW4uCi0JICovCi0JU3RyaW5nIGdldERlcGxveWVyTUJlYW5OYW1lKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgRGVwbG95ZXIgTUJlYW4uCisgICAgICovCisgICAgU3RyaW5nIGdldERlcGxveWVyTUJlYW5OYW1lKCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBSZWNvdmVyeSBNb25pdG9yIE1CZWFuLgotCSAqLwotCVN0cmluZyBnZXRSZWNvdmVyeU1vbml0b3JNQmVhbk5hbWUoKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBSZWNvdmVyeSBNb25pdG9yIE1CZWFuLgorICAgICAqLworICAgIFN0cmluZyBnZXRSZWNvdmVyeU1vbml0b3JNQmVhbk5hbWUoKTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIFNodXRkb3duIE1CZWFuLgotCSAqLwotCVN0cmluZyBnZXRTaHV0ZG93bk1CZWFuTmFtZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFNodXRkb3duIE1CZWFuLgorICAgICAqLworICAgIFN0cmluZyBnZXRTaHV0ZG93bk1CZWFuTmFtZSgpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHBpbmcgY29tbWFuZC4KLQkgKi8KLQlJU2VydmVyQ29tbWFuZDxCb29sZWFuPiBnZXRTZXJ2ZXJQaW5nQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cik7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VydmVyIHBpbmcgY29tbWFuZC4KKyAgICAgKi8KKyAgICBJU2VydmVyQ29tbWFuZDxCb29sZWFuPiBnZXRTZXJ2ZXJQaW5nQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cik7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgc2h1dGRvd24gY29tbWFuZC4KLQkgKi8KLQlJU2VydmVyQ29tbWFuZDxWb2lkPiBnZXRTZXJ2ZXJTaHV0ZG93bkNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlcnZlciBzaHV0ZG93biBjb21tYW5kLgorICAgICAqLworICAgIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclNodXRkb3duQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cik7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgZGVwbG95ZXIgY29tbWFuZC4KLQkgKi8KLQlJU2VydmVyQ29tbWFuZDxEZXBsb3ltZW50SWRlbnRpdHk+IGdldFNlcnZlckRlcGxveUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgZGVwbG95ZXIgY29tbWFuZC4KKyAgICAgKi8KKyAgICBJU2VydmVyQ29tbWFuZDxEZXBsb3ltZW50SWRlbnRpdHk+IGdldFNlcnZlckRlcGxveUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlKTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciByZWZyZXNoIGNvbW1hbmQuCi0JICovCi0JSVNlcnZlckNvbW1hbmQ8Vm9pZD4gZ2V0U2VydmVyUmVmcmVzaENvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlLAotCQkJU3RyaW5nIGJ1bmRsZVN5bWJvbGljTmFtZSk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VydmVyIHJlZnJlc2ggY29tbWFuZC4KKyAgICAgKi8KKyAgICBJU2VydmVyQ29tbWFuZDxWb2lkPiBnZXRTZXJ2ZXJSZWZyZXNoQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBidW5kbGVTeW1ib2xpY05hbWUpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIHVwZGF0ZSBjb21tYW5kLgotCSAqLwotCUlTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclVwZGF0ZUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlLAotCQkJSU1vZHVsZUZpbGUgbW9kdWxlRmlsZSwgRGVwbG95bWVudElkZW50aXR5IGlkZW50aXR5LCBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lLCBTdHJpbmcgdGFyZ2V0UGF0aCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VydmVyIHVwZGF0ZSBjb21tYW5kLgorICAgICAqLworICAgIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclVwZGF0ZUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlLCBJTW9kdWxlRmlsZSBtb2R1bGVGaWxlLCBEZXBsb3ltZW50SWRlbnRpdHkgaWRlbnRpdHksCisgICAgICAgIFN0cmluZyBidW5kbGVTeW1ib2xpY05hbWUsIFN0cmluZyB0YXJnZXRQYXRoKTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZlciB1bmRlcGxveSBjb21tYW5kLgotCSAqLwotCUlTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclVuZGVwbG95Q29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlcnZlciB1bmRlcGxveSBjb21tYW5kLgorICAgICAqLworICAgIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclVuZGVwbG95Q29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VydmVyIGRlcGxveSBjb21tYW5kLgotCSAqLwotCUlTZXJ2ZXJDb21tYW5kPERlcGxveW1lbnRJZGVudGl0eT4gZ2V0U2VydmVyRGVwbG95Q29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cik7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VydmVyIGRlcGxveSBjb21tYW5kLgorICAgICAqLworICAgIElTZXJ2ZXJDb21tYW5kPERlcGxveW1lbnRJZGVudGl0eT4gZ2V0U2VydmVyRGVwbG95Q29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cik7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgZGVwbG95IGNvbW1hbmQuCi0JICovCi0JVVJJIGdldENvbm5lY3RvckJ1bmRsZVVyaSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlcnZlciBkZXBsb3kgY29tbWFuZC4KKyAgICAgKi8KKyAgICBVUkkgZ2V0Q29ubmVjdG9yQnVuZGxlVXJpKCk7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgYnVuZGxlIGFkbWluIGNvbW1hbmQuCi0JICovCi0JSVNlcnZlckNvbW1hbmQ8TWFwPExvbmcsIElCdW5kbGU+PiBnZXRTZXJ2ZXJCdW5kbGVBZG1pbkNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNlcnZlciBidW5kbGUgYWRtaW4gY29tbWFuZC4KKyAgICAgKi8KKyAgICBJU2VydmVyQ29tbWFuZDxNYXA8TG9uZywgSUJ1bmRsZT4+IGdldFNlcnZlckJ1bmRsZUFkbWluQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cik7CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgYnVuZGxlIGV4ZWN1dGUgY29tbWFuZC4KLQkgKi8KLQlJU2VydmVyQ29tbWFuZDxTdHJpbmc+IGdldFNlcnZlckJ1bmRsZUFkbWluRXhlY3V0ZUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIFN0cmluZyBjb21tYW5kKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIgYnVuZGxlIGV4ZWN1dGUgY29tbWFuZC4KKyAgICAgKi8KKyAgICBJU2VydmVyQ29tbWFuZDxTdHJpbmc+IGdldFNlcnZlckJ1bmRsZUFkbWluRXhlY3V0ZUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIFN0cmluZyBjb21tYW5kKTsKIAotCVN0cmluZ1tdIGdldFNlcnZlclByb3BlcnRpZXNEaXJlY3RvcmllcygpOworICAgIFN0cmluZ1tdIGdldFNlcnZlclByb3BlcnRpZXNEaXJlY3RvcmllcygpOwogCi0JU3RyaW5nW10gZ2V0U2VydmVyTG9nRGlyZWN0b3JpZXMoKTsKKyAgICBTdHJpbmdbXSBnZXRTZXJ2ZXJMb2dEaXJlY3RvcmllcygpOwogCi0JLyoqCi0JICogQ2FsbGJhY2sgbWV0aG9kIGZvciB2ZXJzaW9uIGhhbmRsZXJzIHRvIHNldHVwIHNlcnZlcnMgYmVmb3JlIHRoZSBzZXJ2ZXIgc3RhcnRzCi0JICovCi0Jdm9pZCBwcmVTdGFydHVwKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKTsKKyAgICAvKioKKyAgICAgKiBDYWxsYmFjayBtZXRob2QgZm9yIHZlcnNpb24gaGFuZGxlcnMgdG8gc2V0dXAgc2VydmVycyBiZWZvcmUgdGhlIHNlcnZlciBzdGFydHMKKyAgICAgKi8KKyAgICB2b2lkIHByZVN0YXJ0dXAoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIpOwogCi0JSURlcGVuZGVuY3lMb2NhdG9yIGNyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKElSdW50aW1lIHJ1bnRpbWUsIFN0cmluZyBzZXJ2ZXJIb21lUGF0aCwgU3RyaW5nW10gYWRkaXRpb25hbFNlYXJjaFBhdGhzLAotCQkJU3RyaW5nIGluZGV4RGlyZWN0b3J5UGF0aCwgSmF2YVZlcnNpb24gamF2YVZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICBJRGVwZW5kZW5jeUxvY2F0b3IgY3JlYXRlRGVwZW5kZW5jeUxvY2F0b3IoSVJ1bnRpbWUgcnVudGltZSwgU3RyaW5nIHNlcnZlckhvbWVQYXRoLCBTdHJpbmdbXSBhZGRpdGlvbmFsU2VhcmNoUGF0aHMsIFN0cmluZyBpbmRleERpcmVjdG9yeVBhdGgsCisgICAgICAgIEphdmFWZXJzaW9uIGphdmFWZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvSVNlcnZlclJ1bnRpbWVXb3JraW5nQ29weS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9JU2VydmVyUnVudGltZVdvcmtpbmdDb3B5LmphdmEKaW5kZXggZDFlYjEyNS4uNjg4ODQ1ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9JU2VydmVyUnVudGltZVdvcmtpbmdDb3B5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9JU2VydmVyUnVudGltZVdvcmtpbmdDb3B5LmphdmEKQEAgLTgsMjQgKzgsMjQgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JSmF2YVJ1bnRpbWU7CiAKIC8qKgotICogRXh0ZW5zaW9uIHRvIHtAbGluayBJU2VydmVyUnVudGltZX0gdGhhdCBhbGxvd3MgZm9yIHNldCBzb21lIGphdmEgcmVsYXRlZAotICogc2V0dGluZ3MuCi0gKiAKKyAqIEV4dGVuc2lvbiB0byB7QGxpbmsgSVNlcnZlclJ1bnRpbWV9IHRoYXQgYWxsb3dzIGZvciBzZXQgc29tZSBqYXZhIHJlbGF0ZWQgc2V0dGluZ3MuCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjAKICAqLwogcHVibGljIGludGVyZmFjZSBJU2VydmVyUnVudGltZVdvcmtpbmdDb3B5IGV4dGVuZHMgSVNlcnZlclJ1bnRpbWUsIElKYXZhUnVudGltZSB7CiAKLQkvKioKLQkgKiBTZXRzIHRoZSB7QGxpbmsgSVZNSW5zdGFsbH0gZm9yIHRoZSBnaXZlbiBkbSBTZXJ2ZXIgcnVudGltZQotCSAqLwotCXZvaWQgc2V0Vk1JbnN0YWxsKElWTUluc3RhbGwgdm1JbnN0YWxsKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB7QGxpbmsgSVZNSW5zdGFsbH0gZm9yIHRoZSBnaXZlbiBkbSBTZXJ2ZXIgcnVudGltZQorICAgICAqLworICAgIHZvaWQgc2V0Vk1JbnN0YWxsKElWTUluc3RhbGwgdm1JbnN0YWxsKTsKIAotCUlTZXJ2ZXJSdW50aW1lUHJvdmlkZXIgZ2V0VmlyZ29WZXJzaW9uKCk7CisgICAgSVNlcnZlclJ1bnRpbWVQcm92aWRlciBnZXRWaXJnb1ZlcnNpb24oKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvSVNlcnZlcldvcmtpbmdDb3B5LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL0lTZXJ2ZXJXb3JraW5nQ29weS5qYXZhCmluZGV4IDAxNWRmYzguLjU5ZGMzMjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvSVNlcnZlcldvcmtpbmdDb3B5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9JU2VydmVyV29ya2luZ0NvcHkuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlOwogCiBpbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwpAQCAtMTUsODUgKzE2LDg1IEBACiAKIC8qKgogICogRXh0ZW5zaW9uIHRvIHtAbGluayBJU2VydmVyfS4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBMZW8gRG9zIFNhbnRvcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlcldvcmtpbmdDb3B5IGV4dGVuZHMgSVNlcnZlciB7CiAKLQkvKiogRGVmYXVsdCBkZXBsb3kgZGlyZWN0b3J5IG5hbWUgKi8KLQlTdHJpbmcgREVGQVVMVF9ERVBMT1lESVIgPSAic3RhZ2UiOworICAgIC8qKiBEZWZhdWx0IGRlcGxveSBkaXJlY3RvcnkgbmFtZSAqLworICAgIFN0cmluZyBERUZBVUxUX0RFUExPWURJUiA9ICJzdGFnZSI7CiAKLQkvKiogRGVmYXVsdCBkZXBsb3kgdGltZW91dCAqLwotCWludCBERUZBVUxUX0RFUExPWV9USU1FT1VUID0gMzA7CisgICAgLyoqIERlZmF1bHQgZGVwbG95IHRpbWVvdXQgKi8KKyAgICBpbnQgREVGQVVMVF9ERVBMT1lfVElNRU9VVCA9IDMwOwogCi0JLyoqIERlZmF1bHQgZGVwbG95ZXIgY29udHJvbCB1c2VybmFtZSAqLwotCVN0cmluZyBERUZBVUxUX01CRUFOX1NFUlZFUl9VU0VSTkFNRSA9ICJhZG1pbiI7CisgICAgLyoqIERlZmF1bHQgZGVwbG95ZXIgY29udHJvbCB1c2VybmFtZSAqLworICAgIFN0cmluZyBERUZBVUxUX01CRUFOX1NFUlZFUl9VU0VSTkFNRSA9ICJhZG1pbiI7CiAKLQkvKiogRGVmYXVsdCBkZXBsb3llciBjb250cm9sIHBvcnQgKi8KLQlTdHJpbmcgREVGQVVMVF9NQkVBTl9TRVJWRVJfUE9SVCA9ICI5NzUzIjsKKyAgICAvKiogRGVmYXVsdCBkZXBsb3llciBjb250cm9sIHBvcnQgKi8KKyAgICBTdHJpbmcgREVGQVVMVF9NQkVBTl9TRVJWRVJfUE9SVCA9ICI5NzUzIjsKIAotCS8qKiBEZWZhdWx0IGRlcGxveWVyIGNvbnRyb2wgcGFzc3dvcmQgKi8KLQlTdHJpbmcgREVGQVVMVF9NQkVBTl9TRVJWRVJfUEFTU1dPUkQgPSAic3ByaW5nc291cmNlIjsKKyAgICAvKiogRGVmYXVsdCBkZXBsb3llciBjb250cm9sIHBhc3N3b3JkICovCisgICAgU3RyaW5nIERFRkFVTFRfTUJFQU5fU0VSVkVSX1BBU1NXT1JEID0gInNwcmluZ3NvdXJjZSI7CiAKLQkvKiogRGVmYXVsdCBmaWxlbmFtZSBwYXR0ZXJzIHRoYXQgc2hvdWxkIG5vdCB0cmlnZ2VyIGEgYnVuZGxlIHJlZnJlc2ggKi8KLQlTdHJpbmcgREVGQVVMVF9TVEFUSUNfRklMRU5BTUVTID0gIiouaHRtbCwqLnhodG1sLCouY3NzLCouanMsKi5qc3B4LCouanNwLCouZ2lmLCouanBnLCoucG5nLCouc3dmLCotZmxvdy54bWwsKi5wcm9wZXJ0aWVzLCoueG1sLCF0aWxlcy54bWwsIXdlYi54bWwiOworICAgIC8qKiBEZWZhdWx0IGZpbGVuYW1lIHBhdHRlcnMgdGhhdCBzaG91bGQgbm90IHRyaWdnZXIgYSBidW5kbGUgcmVmcmVzaCAqLworICAgIFN0cmluZyBERUZBVUxUX1NUQVRJQ19GSUxFTkFNRVMgPSAiKi5odG1sLCoueGh0bWwsKi5jc3MsKi5qcywqLmpzcHgsKi5qc3AsKi5naWYsKi5qcGcsKi5wbmcsKi5zd2YsKi1mbG93LnhtbCwqLnByb3BlcnRpZXMsKi54bWwsIXRpbGVzLnhtbCwhd2ViLnhtbCI7CiAKLQkvKiogRGVmYXVsdCAtWFg6TWF4UGVybVNpemUgdmFsdWUgYmFzZWQgb24gVmlyZ28gMy42IGRtay5zaCAqLwotCVN0cmluZyBERUZBVUxUX01BWF9QRVJNX1NJWkUgPSAiNTEybSI7CisgICAgLyoqIERlZmF1bHQgLVhYOk1heFBlcm1TaXplIHZhbHVlIGJhc2VkIG9uIFZpcmdvIDMuNiBkbWsuc2ggKi8KKyAgICBTdHJpbmcgREVGQVVMVF9NQVhfUEVSTV9TSVpFID0gIjUxMm0iOwogCi0JLyoqIERlZmF1bHQgc2V0dGluZyBpZiB0aGUgc2VydmVyIHNob3VsZCB0YWlsIHRyYWNlIGZpbGVzICovCi0JYm9vbGVhbiBERUZBVUxUX1RBSUxfTE9HX0ZJTEVTID0gZmFsc2U7CisgICAgLyoqIERlZmF1bHQgc2V0dGluZyBpZiB0aGUgc2VydmVyIHNob3VsZCB0YWlsIHRyYWNlIGZpbGVzICovCisgICAgYm9vbGVhbiBERUZBVUxUX1RBSUxfTE9HX0ZJTEVTID0gZmFsc2U7CiAKLQlib29sZWFuIERFRkFVTFRfQ0xFQU5fU1RBUlRVUCA9IGZhbHNlOworICAgIGJvb2xlYW4gREVGQVVMVF9DTEVBTl9TVEFSVFVQID0gZmFsc2U7CiAKLQkvKioKLQkgKiBTZXRzIHRoZSBkZXBsb3kgZGlyZWN0b3J5Ci0JICovCi0Jdm9pZCBzZXREZXBsb3lEaXJlY3RvcnkoU3RyaW5nIGRlcGxveURpcik7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVwbG95IGRpcmVjdG9yeQorICAgICAqLworICAgIHZvaWQgc2V0RGVwbG95RGlyZWN0b3J5KFN0cmluZyBkZXBsb3lEaXIpOwogCi0JLyoqCi0JICogQWRkcyBhIHtAbGluayBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfSB0byB0aGUgY29uZmlndXJhdGlvbiBiYWNraW5nIHRoZSBzZXJ2ZXIuCi0JICovCi0Jdm9pZCBhZGRDb25maWd1cmF0aW9uQ2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisgICAgLyoqCisgICAgICogQWRkcyBhIHtAbGluayBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfSB0byB0aGUgY29uZmlndXJhdGlvbiBiYWNraW5nIHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgdm9pZCBhZGRDb25maWd1cmF0aW9uQ2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CiAKLQkvKioKLQkgKiBSZW1vdmVzIGFuIGluc3RhbGxlZCB7QGxpbmsgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcn0uCi0JICovCi0Jdm9pZCByZW1vdmVDb25maWd1cmF0aW9uQ2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7CisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbiBpbnN0YWxsZWQge0BsaW5rIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJ9LgorICAgICAqLworICAgIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwogCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlcm5hbWUgb2YgdGhlIEpNWCBkZXBsb3llciBjb250cm9sCi0JICovCi0Jdm9pZCBzZXRNQmVhblNlcnZlclVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdXNlcm5hbWUgb2YgdGhlIEpNWCBkZXBsb3llciBjb250cm9sCisgICAgICovCisgICAgdm9pZCBzZXRNQmVhblNlcnZlclVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSk7CiAKLQkvKioKLQkgKiBTZXRzIHRoZSBwb3J0IG9mIHRoZSBKTVggZGVwbG95ZXIgY29udHJvbAotCSAqLwotCXZvaWQgc2V0TUJlYW5TZXJ2ZXJQb3J0KGludCBwb3J0KTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwb3J0IG9mIHRoZSBKTVggZGVwbG95ZXIgY29udHJvbAorICAgICAqLworICAgIHZvaWQgc2V0TUJlYW5TZXJ2ZXJQb3J0KGludCBwb3J0KTsKIAotCS8qKgotCSAqIFNldHMgdGhlIHRpbWVvdXQgb2YgdGhlIEpNWCBkZXBsb3kgY29tbWFuZAotCSAqLwotCXZvaWQgc2V0RGVwbG95VGltZW91dChpbnQgdGltZW91dCk7CisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGltZW91dCBvZiB0aGUgSk1YIGRlcGxveSBjb21tYW5kCisgICAgICovCisgICAgdm9pZCBzZXREZXBsb3lUaW1lb3V0KGludCB0aW1lb3V0KTsKIAotCS8qKgotCSAqIFNldHMgdGhlIHBhc3N3b3JkIG9mIHRoZSBKTVggZGVwbG95ZXIgY29udHJvbAotCSAqLwotCXZvaWQgc2V0TUJlYW5TZXJ2ZXJQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpOworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBhc3N3b3JkIG9mIHRoZSBKTVggZGVwbG95ZXIgY29udHJvbAorICAgICAqLworICAgIHZvaWQgc2V0TUJlYW5TZXJ2ZXJQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpOwogCi0JLyoqCi0JICogU2V0cyB0aGUgZmxhZyB0byB0YWlsIGFwcGxpY2F0aW9uIHRyYWNlIGZpbGVzCi0JICovCi0Jdm9pZCBzaG91bGRUYWlsVHJhY2VGaWxlcyhib29sZWFuIHNob3VsZFRhaWxUcmFjZUZpbGVzKTsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmbGFnIHRvIHRhaWwgYXBwbGljYXRpb24gdHJhY2UgZmlsZXMKKyAgICAgKi8KKyAgICB2b2lkIHNob3VsZFRhaWxUcmFjZUZpbGVzKGJvb2xlYW4gc2hvdWxkVGFpbFRyYWNlRmlsZXMpOwogCi0Jdm9pZCBzaG91bGRDbGVhblN0YXJ0dXAoYm9vbGVhbiBzaG91bGRDbGVhblN0YXJ0dXApOworICAgIHZvaWQgc2hvdWxkQ2xlYW5TdGFydHVwKGJvb2xlYW4gc2hvdWxkQ2xlYW5TdGFydHVwKTsKIAotCXZvaWQgc2V0QXJ0ZWZhY3RPcmRlcihMaXN0PFN0cmluZz4gYXJ0ZWZhY3RPcmRlcik7CisgICAgdm9pZCBzZXRBcnRlZmFjdE9yZGVyKExpc3Q8U3RyaW5nPiBhcnRlZmFjdE9yZGVyKTsKIAotCXZvaWQgc2V0U3RhdGljRmlsZW5hbWVQYXR0ZXJucyhTdHJpbmcgZmlsZW5hbWVQYXR0ZXJucyk7CisgICAgdm9pZCBzZXRTdGF0aWNGaWxlbmFtZVBhdHRlcm5zKFN0cmluZyBmaWxlbmFtZVBhdHRlcm5zKTsKIAotCXZvaWQgc2V0TWF4UGVybVNpemUoU3RyaW5nIG1heFBlcm1TaXplKTsKKyAgICB2b2lkIHNldE1heFBlcm1TaXplKFN0cmluZyBtYXhQZXJtU2l6ZSk7CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvU2VydmVyQ29yZVBsdWdpbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9TZXJ2ZXJDb3JlUGx1Z2luLmphdmEKaW5kZXggNzk4YmMzYi4uOWY3NTYzMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9TZXJ2ZXJDb3JlUGx1Z2luLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9TZXJ2ZXJDb3JlUGx1Z2luLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yNyw4NSArMjgsODMgQEAKIAogLyoqCiAgKiBCdW5kbGUgQWN0aXZhdG9yIGZvciB0aGUgc2VydmVyLmNvcmUgcGx1Z2luLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjAKICAqLwogcHVibGljIGNsYXNzIFNlcnZlckNvcmVQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKIAotCS8qKiBUaGUgYnVuZGxlIHN5bWJvbGljIG5hbWUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZSI7CisgICAgLyoqIFRoZSBidW5kbGUgc3ltYm9saWMgbmFtZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlIjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTE9BRF9DTEFTU0VTX0tFWSA9IFBMVUdJTl9JRCArICIubG9hZC5jbGFzc2VzLmZyb20uaW5kZXgiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTE9BRF9DTEFTU0VTX0tFWSA9IFBMVUdJTl9JRCArICIubG9hZC5jbGFzc2VzLmZyb20uaW5kZXgiOwogCi0JLyoqIFRoZSBzaGFyZWQgYnVuZGxlIGluc3RhbmNlICovCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmVyQ29yZVBsdWdpbiBwbHVnaW47CisgICAgLyoqIFRoZSBzaGFyZWQgYnVuZGxlIGluc3RhbmNlICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU2VydmVyQ29yZVBsdWdpbiBwbHVnaW47CiAKLQkvKiogSW50ZXJuYWwgYXJ0ZWZhY3QgcmVwb3NpdG9yeSBtYW5hZ2VyICovCi0JcHJpdmF0ZSBBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIGFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXI7CisgICAgLyoqIEludGVybmFsIGFydGVmYWN0IHJlcG9zaXRvcnkgbWFuYWdlciAqLworICAgIHByaXZhdGUgQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlciBhcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwogCi0JcHVibGljIHN0YXRpYyBFeGVjdXRvclNlcnZpY2UgRVhFQ1VUT1IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCgpOworICAgIHB1YmxpYyBzdGF0aWMgRXhlY3V0b3JTZXJ2aWNlIEVYRUNVVE9SID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woKTsKIAotCXByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OworICAgIHByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSR09fU0VSVkVSX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLnNlcnZlci52aXJnbyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSR09fU0VSVkVSX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLnNlcnZlci52aXJnbyI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJHT19TRVJWRVJfUFJPSkVDVF9OQVRVUkUgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUubWFuYWdlZFByb2plY3QiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUkdPX1NFUlZFUl9QUk9KRUNUX05BVFVSRSA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5tYW5hZ2VkUHJvamVjdCI7CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQkJU2VydmVyVXRpbHMuY2xlYXJDYWNoZURpcmVjdG9yeSgpOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOworICAgICAgICBwbHVnaW4gPSB0aGlzOworICAgICAgICBTZXJ2ZXJVdGlscy5jbGVhckNhY2hlRGlyZWN0b3J5KCk7CiAKLQkJcGx1Z2luLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldERlZmF1bHQoUFJFRl9MT0FEX0NMQVNTRVNfS0VZLCBmYWxzZSk7CisgICAgICAgIHBsdWdpbi5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXREZWZhdWx0KFBSRUZfTE9BRF9DTEFTU0VTX0tFWSwgZmFsc2UpOwogCi0JCWFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIgPSBuZXcgQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpOwotCX0KKyAgICAgICAgdGhpcy5hcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyID0gbmV3IEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcnZlclV0aWxzLmNsZWFyQ2FjaGVEaXJlY3RvcnkoKTsKLQkJYXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlci5zdG9wKCk7Ci0JCWFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIgPSBudWxsOwotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNlcnZlclV0aWxzLmNsZWFyQ2FjaGVEaXJlY3RvcnkoKTsKKyAgICAgICAgdGhpcy5hcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLnN0b3AoKTsKKyAgICAgICAgdGhpcy5hcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyID0gbnVsbDsKKyAgICAgICAgcGx1Z2luID0gbnVsbDsKKyAgICAgICAgc3VwZXIuc3RvcChjb250ZXh0KTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIFNlcnZlckNvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9CisgICAgcHVibGljIHN0YXRpYyBTZXJ2ZXJDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7CisgICAgICAgIHJldHVybiBwbHVnaW47CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhpZCk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZWZlcmVuY2UoU3RyaW5nIGlkKSB7CisgICAgICAgIHJldHVybiBnZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoaWQpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcmVmZXJlbmNlKFN0cmluZyBpZCwgU3RyaW5nIHZhbHVlKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKGlkLCB2YWx1ZSk7Ci0JCWdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFByZWZlcmVuY2UoU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoaWQsIHZhbHVlKTsKKyAgICAgICAgZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlciBnZXRBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXI7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlciBnZXRBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdCgpLmFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXI7CisgICAgfQogCi0JcHVibGljIFVSSSBnZXRCdW5kbGVVcmkoU3RyaW5nIGJ1bmRsZU5hbWUpIHsKLQkJVVJMIHVybDsKLQkJdHJ5IHsKLQkJCXVybCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChjb250ZXh0LmdldEJ1bmRsZSgpLmdldEVudHJ5KGJ1bmRsZU5hbWUpKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCVVSSSB1cmkgPSBuZXcgVVJJKCJmaWxlIiwgdXJsLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDUpLCBudWxsKTsKLQkJCQlyZXR1cm4gdXJpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoCi0JCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAiUHJvYmxlbSBvY2N1cnJlZCB3aGlsZSBnZXR0aW5nIGJ1bmRsZToiICsgYnVuZGxlTmFtZSwgZSkpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgIlByb2JsZW0gb2NjdXJyZWQgd2hpbGUgZ2V0dGluZyBidW5kbGU6IiArIGJ1bmRsZU5hbWUsIGUpKTsKLQkJfQotCQlTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsICJDb3VsZG4ndCBsb2NhdGUgYnVuZGxlOiIgKyBidW5kbGVOYW1lKSk7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwdWJsaWMgVVJJIGdldEJ1bmRsZVVyaShTdHJpbmcgYnVuZGxlTmFtZSkgeworICAgICAgICBVUkwgdXJsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXJsID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKHRoaXMuY29udGV4dC5nZXRCdW5kbGUoKS5nZXRFbnRyeShidW5kbGVOYW1lKSk7CisgICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBVUkkgdXJpID0gbmV3IFVSSSgiZmlsZSIsIHVybC50b1N0cmluZygpLnN1YnN0cmluZyg1KSwgbnVsbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVyaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAiUHJvYmxlbSBvY2N1cnJlZCB3aGlsZSBnZXR0aW5nIGJ1bmRsZToiICsgYnVuZGxlTmFtZSwgZSkpOworICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAiUHJvYmxlbSBvY2N1cnJlZCB3aGlsZSBnZXR0aW5nIGJ1bmRsZToiICsgYnVuZGxlTmFtZSwgZSkpOworICAgICAgICB9CisgICAgICAgIFN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZShuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgIkNvdWxkbid0IGxvY2F0ZSBidW5kbGU6IiArIGJ1bmRsZU5hbWUpKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9TZXJ2ZXJVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9TZXJ2ZXJVdGlscy5qYXZhCmluZGV4IGVhMjU2NmQuLjkxZWUwMjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvU2VydmVyVXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL1NlcnZlclV0aWxzLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTU1LDI1MCArNTYsMjM1IEBACiBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQogcHVibGljIGNsYXNzIFNlcnZlclV0aWxzIHsKIAotCS8qKiBQYXRoIG9mIHRoZSBKUkUgY29udGFpbmVyICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpSRV9DT05UQUlORVJfU1RSSU5HID0gIm9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI7CisgICAgLyoqIFBhdGggb2YgdGhlIEpSRSBjb250YWluZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlJFX0NPTlRBSU5FUl9TVFJJTkcgPSAib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIjsKIAotCS8qKiB7QGxpbmsgUGF0aH0gb2YgdGhlIEpSRSBjbGFzc3BhdGggY29udGFpbmVyICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0aCBKUkVfQ09OVEFJTkVSX1BBVEggPSBuZXcgUGF0aChKUkVfQ09OVEFJTkVSX1NUUklORyk7CisgICAgLyoqIHtAbGluayBQYXRofSBvZiB0aGUgSlJFIGNsYXNzcGF0aCBjb250YWluZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXRoIEpSRV9DT05UQUlORVJfUEFUSCA9IG5ldyBQYXRoKEpSRV9DT05UQUlORVJfU1RSSU5HKTsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5PX0FERElUSU9OQUxfU0VBUkNIX1BBVEhTID0gbmV3IFN0cmluZ1swXTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBOT19BRERJVElPTkFMX1NFQVJDSF9QQVRIUyA9IG5ldyBTdHJpbmdbMF07CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9MT0NBVElPTl9QUkVGSVggPSAicmVwb3NpdG9yeS1jYWNoZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfTE9DQVRJT05fUFJFRklYID0gInJlcG9zaXRvcnktY2FjaGUiOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9ET1dOTE9BRFNfUFJFRklYID0gInJlcG9zaXRvcnktZG93bmxvYWRzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPU0lUT1JZX0RPV05MT0FEU19QUkVGSVggPSAicmVwb3NpdG9yeS1kb3dubG9hZHMiOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljTG9uZyBSRVBPU0lUT1JZX0NPVU5URVIgPSBuZXcgQXRvbWljTG9uZygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0xvbmcgUkVQT1NJVE9SWV9DT1VOVEVSID0gbmV3IEF0b21pY0xvbmcoKTsKIAotCS8qKgotCSAqIExvY2F0aW9uIG9mIHRoZSBidW5kbGUgcmVzb2x1dGlvbiBjYWNoZSB1c2VkIGJ5IHRoZSB7QGxpbmsgRGVwZW5kZW5jeUxvY2F0b3J9Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfTE9DQVRJT04gPSBTZXJ2ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9GaWxlKCkgKyAiLyIKLQkJCSsgQ0FDSEVfTE9DQVRJT05fUFJFRklYICsgIi0iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgLyoqCisgICAgICogTG9jYXRpb24gb2YgdGhlIGJ1bmRsZSByZXNvbHV0aW9uIGNhY2hlIHVzZWQgYnkgdGhlIHtAbGluayBEZXBlbmRlbmN5TG9jYXRvcn0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9MT0NBVElPTiA9IFNlcnZlckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS50b0ZpbGUoKSArICIvIiArIENBQ0hFX0xPQ0FUSU9OX1BSRUZJWCArICItIgorICAgICAgICArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCi0JLyoqIFNvdXJjZSBqYXIgZmlsZSBzdWZmaXggKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFU19TVUZGSVggPSAiLXNvdXJjZXMiOworICAgIC8qKiBTb3VyY2UgamFyIGZpbGUgc3VmZml4ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRVNfU1VGRklYID0gIi1zb3VyY2VzIjsKIAotCS8qKiBNYXBwaW5nIG9mIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBpZHMgdG8ge0BsaW5rIEphdmFWZXJzaW9ufSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIEphdmFWZXJzaW9uPiBKQVZBX1ZFUlNJT05fTUFQUElORzsKKyAgICAvKiogTWFwcGluZyBvZiBleGVjdXRpb24gZW52aXJvbm1lbnQgaWRzIHRvIHtAbGluayBKYXZhVmVyc2lvbn0gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBKYXZhVmVyc2lvbj4gSkFWQV9WRVJTSU9OX01BUFBJTkc7CiAKLQlzdGF0aWMgewotCQlKQVZBX1ZFUlNJT05fTUFQUElORyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSmF2YVZlcnNpb24+KCk7Ci0JCUpBVkFfVkVSU0lPTl9NQVBQSU5HLnB1dCgiSjJTRS0xLjUiLCBKYXZhVmVyc2lvbi5KYXZhNSk7Ci0JCUpBVkFfVkVSU0lPTl9NQVBQSU5HLnB1dCgiSmF2YVNFLTEuNiIsIEphdmFWZXJzaW9uLkphdmE2KTsKLQl9CisgICAgc3RhdGljIHsKKyAgICAgICAgSkFWQV9WRVJTSU9OX01BUFBJTkcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEphdmFWZXJzaW9uPigpOworICAgICAgICBKQVZBX1ZFUlNJT05fTUFQUElORy5wdXQoIkoyU0UtMS41IiwgSmF2YVZlcnNpb24uSmF2YTUpOworICAgICAgICBKQVZBX1ZFUlNJT05fTUFQUElORy5wdXQoIkphdmFTRS0xLjYiLCBKYXZhVmVyc2lvbi5KYXZhNik7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0ZWRTZXJ2ZXJSdW50aW1lcwotCSAqICAgICAgICAgICAgdGhlIHRhcmdldGVkIHNlcnZlcnMgb2YgdGhpcyBwcm9qZWN0Ci0JICogQHJldHVybiBwYXRoIHRvIHNlcnZlci5wcm9maWxlIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2ZXJIb21lKElSdW50aW1lLi4uIHRhcmdldGVkU2VydmVyUnVudGltZXMpIHsKLQkJZm9yIChvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWUgc2VydmVyUnVudGltZSA6IHRhcmdldGVkU2VydmVyUnVudGltZXMpIHsKLQkJCVZpcmdvU2VydmVyUnVudGltZSBzUnVudGltZSA9IChWaXJnb1NlcnZlclJ1bnRpbWUpIHNlcnZlclJ1bnRpbWUubG9hZEFkYXB0ZXIoVmlyZ29TZXJ2ZXJSdW50aW1lLmNsYXNzLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWlmIChzUnVudGltZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHNlcnZlclJ1bnRpbWUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSByb290IG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldGVkU2VydmVyUnVudGltZXMgdGhlIHRhcmdldGVkIHNlcnZlcnMgb2YgdGhpcyBwcm9qZWN0CisgICAgICogQHJldHVybiBwYXRoIHRvIHNlcnZlci5wcm9maWxlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXJ2ZXJIb21lKElSdW50aW1lLi4uIHRhcmdldGVkU2VydmVyUnVudGltZXMpIHsKKyAgICAgICAgZm9yIChvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWUgc2VydmVyUnVudGltZSA6IHRhcmdldGVkU2VydmVyUnVudGltZXMpIHsKKyAgICAgICAgICAgIFZpcmdvU2VydmVyUnVudGltZSBzUnVudGltZSA9IChWaXJnb1NlcnZlclJ1bnRpbWUpIHNlcnZlclJ1bnRpbWUubG9hZEFkYXB0ZXIoVmlyZ29TZXJ2ZXJSdW50aW1lLmNsYXNzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKyAgICAgICAgICAgIGlmIChzUnVudGltZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlclJ1bnRpbWUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhcmdldGVkIHJ1bnRpbWVzIG9mIHRoZSBnaXZlbiBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRvIHJldHVybiB0aGUgdGFyZ2V0IHJ1bnRpbWVzIGZvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVbXSBnZXRUYXJnZXR0ZWRSdW50aW1lcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZpbmFsIFNldDxvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU+IHRhcmdldGVkU2VydmVyUnVudGltZXMgPSBuZXcgTGlua2VkSGFzaFNldDxvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU+KCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0ZWQgcnVudGltZXMgb2YgdGhlIGdpdmVuIHByb2plY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIHJldHVybiB0aGUgdGFyZ2V0IHJ1bnRpbWVzIGZvcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSVJ1bnRpbWVbXSBnZXRUYXJnZXR0ZWRSdW50aW1lcyhJUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIGZpbmFsIFNldDxvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU+IHRhcmdldGVkU2VydmVyUnVudGltZXMgPSBuZXcgTGlua2VkSGFzaFNldDxvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU+KCk7CiAKLQkJU2VydmVyUnVudGltZVV0aWxzLmV4ZWN1dGUocHJvamVjdCwgbmV3IFNlcnZlclJ1bnRpbWVVdGlscy5TZXJ2ZXJSdW50aW1lQ2FsbGJhY2soKSB7CisgICAgICAgIFNlcnZlclJ1bnRpbWVVdGlscy5leGVjdXRlKHByb2plY3QsIG5ldyBTZXJ2ZXJSdW50aW1lVXRpbHMuU2VydmVyUnVudGltZUNhbGxiYWNrKCkgewogCi0JCQlwdWJsaWMgYm9vbGVhbiBkb1dpdGhSdW50aW1lKFZpcmdvU2VydmVyUnVudGltZSBydW50aW1lKSB7Ci0JCQkJdGFyZ2V0ZWRTZXJ2ZXJSdW50aW1lcy5hZGQocnVudGltZS5nZXRSdW50aW1lKCkpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9KTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRvV2l0aFJ1bnRpbWUoVmlyZ29TZXJ2ZXJSdW50aW1lIHJ1bnRpbWUpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXRlZFNlcnZlclJ1bnRpbWVzLmFkZChydW50aW1lLmdldFJ1bnRpbWUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCXJldHVybiB0YXJnZXRlZFNlcnZlclJ1bnRpbWVzLnRvQXJyYXkobmV3IElSdW50aW1lW3RhcmdldGVkU2VydmVyUnVudGltZXMuc2l6ZSgpXSk7Ci0JfQorICAgICAgICByZXR1cm4gdGFyZ2V0ZWRTZXJ2ZXJSdW50aW1lcy50b0FycmF5KG5ldyBJUnVudGltZVt0YXJnZXRlZFNlcnZlclJ1bnRpbWVzLnNpemUoKV0pOworICAgIH0KIAotCS8qKgotCSAqIENyZWF0ZXMgYSB7QGxpbmsgRGVwZW5kZW5jeUxvY2F0b3J9IGluc3RhbmNlIHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QKLQkgKiBAcGFyYW0gYWRkaXRpb25hbFNlYXJjaFBhdGhzCi0JICogICAgICAgICAgICBhbnkgYWRkaXRpb25hbCBzZWFyY2ggcGF0aHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRGVwZW5kZW5jeUxvY2F0b3IgY3JlYXRlRGVwZW5kZW5jeUxvY2F0b3IoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gYWRkaXRpb25hbFNlYXJjaFBhdGhzKSB7Ci0JCXRyeSB7Ci0JCQlJUnVudGltZVtdIHNlcnZlclJ1bnRpbWVzID0gZ2V0VGFyZ2V0dGVkUnVudGltZXMocHJvamVjdCk7Ci0JCQlpZiAoc2VydmVyUnVudGltZXMgPT0gbnVsbCB8fCBzZXJ2ZXJSdW50aW1lcy5sZW5ndGggPT0gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIGNyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKHNlcnZlclJ1bnRpbWVzWzBdLCBnZXRTZXJ2ZXJIb21lKHNlcnZlclJ1bnRpbWVzKSwgYWRkaXRpb25hbFNlYXJjaFBhdGhzLAotCQkJCQlnZXRDYWNoZURpcmVjdG9yeVBhdGgoKSwgZ2V0SmF2YVZlcnNpb24ocHJvamVjdCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdGF0dXNVdGlsLmVycm9yKCJBbiBJTyBFeGNlcHRpb24gb2NjdXJyZWQuIiwgZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgRGVwZW5kZW5jeUxvY2F0b3J9IGluc3RhbmNlIHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0CisgICAgICogQHBhcmFtIGFkZGl0aW9uYWxTZWFyY2hQYXRocyBhbnkgYWRkaXRpb25hbCBzZWFyY2ggcGF0aHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJRGVwZW5kZW5jeUxvY2F0b3IgY3JlYXRlRGVwZW5kZW5jeUxvY2F0b3IoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gYWRkaXRpb25hbFNlYXJjaFBhdGhzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJUnVudGltZVtdIHNlcnZlclJ1bnRpbWVzID0gZ2V0VGFyZ2V0dGVkUnVudGltZXMocHJvamVjdCk7CisgICAgICAgICAgICBpZiAoc2VydmVyUnVudGltZXMgPT0gbnVsbCB8fCBzZXJ2ZXJSdW50aW1lcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKHNlcnZlclJ1bnRpbWVzWzBdLCBnZXRTZXJ2ZXJIb21lKHNlcnZlclJ1bnRpbWVzKSwgYWRkaXRpb25hbFNlYXJjaFBhdGhzLCBnZXRDYWNoZURpcmVjdG9yeVBhdGgoKSwKKyAgICAgICAgICAgICAgICBnZXRKYXZhVmVyc2lvbihwcm9qZWN0KSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0YXR1c1V0aWwuZXJyb3IoIkFuIElPIEV4Y2VwdGlvbiBvY2N1cnJlZC4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEge0BsaW5rIERlcGVuZGVuY3lMb2NhdG9yfSBpbnN0YW5jZSBzdWl0YWJsZSBmb3IgdGhlIGdpdmVuIHJ1bnRpbWUuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0Ci0JICogQHBhcmFtIGFkZGl0aW9uYWxTZWFyY2hQYXRocwotCSAqICAgICAgICAgICAgYW55IGFkZGl0aW9uYWwgc2VhcmNoIHBhdGhzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSURlcGVuZGVuY3lMb2NhdG9yIGNyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKElSdW50aW1lIHNlcnZlclJ1bnRpbWUpIHsKLQkJaWYgKHNlcnZlclJ1bnRpbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCS8vIENyZWF0ZSBEZXBlbmRlbmN5TG9jYXRvciB3aXRoIHBhdGggdG8gc2VydmVyLmNvbmZpZyBhbmQKLQkJCS8vIHNlcnZlci5wcm9maWxlCi0JCQlyZXR1cm4gY3JlYXRlRGVwZW5kZW5jeUxvY2F0b3Ioc2VydmVyUnVudGltZSwgZ2V0U2VydmVySG9tZShzZXJ2ZXJSdW50aW1lKSwgTk9fQURESVRJT05BTF9TRUFSQ0hfUEFUSFMsCi0JCQkJCWdldENhY2hlRGlyZWN0b3J5UGF0aCgpLCBudWxsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3RhdHVzVXRpbC5lcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBEZXBlbmRlbmN5TG9jYXRvcn0gaW5zdGFuY2Ugc3VpdGFibGUgZm9yIHRoZSBnaXZlbiBydW50aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QKKyAgICAgKiBAcGFyYW0gYWRkaXRpb25hbFNlYXJjaFBhdGhzIGFueSBhZGRpdGlvbmFsIHNlYXJjaCBwYXRocy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIElEZXBlbmRlbmN5TG9jYXRvciBjcmVhdGVEZXBlbmRlbmN5TG9jYXRvcihJUnVudGltZSBzZXJ2ZXJSdW50aW1lKSB7CisgICAgICAgIGlmIChzZXJ2ZXJSdW50aW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgRGVwZW5kZW5jeUxvY2F0b3Igd2l0aCBwYXRoIHRvIHNlcnZlci5jb25maWcgYW5kCisgICAgICAgICAgICAvLyBzZXJ2ZXIucHJvZmlsZQorICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKHNlcnZlclJ1bnRpbWUsIGdldFNlcnZlckhvbWUoc2VydmVyUnVudGltZSksIE5PX0FERElUSU9OQUxfU0VBUkNIX1BBVEhTLCBnZXRDYWNoZURpcmVjdG9yeVBhdGgoKSwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0YXR1c1V0aWwuZXJyb3IoZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgSURlcGVuZGVuY3lMb2NhdG9yIGNyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKElSdW50aW1lIHJ1bnRpbWUsIFN0cmluZyBzZXJ2ZXJIb21lUGF0aCwKLQkJCVN0cmluZ1tdIGFkZGl0aW9uYWxTZWFyY2hQYXRocywgU3RyaW5nIGluZGV4RGlyZWN0b3J5UGF0aCwgSmF2YVZlcnNpb24gamF2YVZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlTZXJ2ZXJSdW50aW1lV29ya2luZ0NvcHkgc2VydmVyUnVudGltZSA9IChJU2VydmVyUnVudGltZVdvcmtpbmdDb3B5KSBydW50aW1lLmxvYWRBZGFwdGVyKAotCQkJCUlTZXJ2ZXJSdW50aW1lV29ya2luZ0NvcHkuY2xhc3MsIG51bGwpOwotCQlpZiAoc2VydmVyUnVudGltZSAhPSBudWxsKSB7Ci0JCQlJU2VydmVyUnVudGltZVByb3ZpZGVyIHZlcnNpb25IYW5kbGVyID0gc2VydmVyUnVudGltZS5nZXRWaXJnb1ZlcnNpb24oKTsKLQkJCWlmICh2ZXJzaW9uSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHZlcnNpb25IYW5kbGVyLmNyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKHJ1bnRpbWUsIHNlcnZlckhvbWVQYXRoLCBhZGRpdGlvbmFsU2VhcmNoUGF0aHMsCi0JCQkJCQlpbmRleERpcmVjdG9yeVBhdGgsIGphdmFWZXJzaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgcHJpdmF0ZSBzdGF0aWMgSURlcGVuZGVuY3lMb2NhdG9yIGNyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKElSdW50aW1lIHJ1bnRpbWUsIFN0cmluZyBzZXJ2ZXJIb21lUGF0aCwgU3RyaW5nW10gYWRkaXRpb25hbFNlYXJjaFBhdGhzLAorICAgICAgICBTdHJpbmcgaW5kZXhEaXJlY3RvcnlQYXRoLCBKYXZhVmVyc2lvbiBqYXZhVmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSVNlcnZlclJ1bnRpbWVXb3JraW5nQ29weSBzZXJ2ZXJSdW50aW1lID0gKElTZXJ2ZXJSdW50aW1lV29ya2luZ0NvcHkpIHJ1bnRpbWUubG9hZEFkYXB0ZXIoSVNlcnZlclJ1bnRpbWVXb3JraW5nQ29weS5jbGFzcywgbnVsbCk7CisgICAgICAgIGlmIChzZXJ2ZXJSdW50aW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIElTZXJ2ZXJSdW50aW1lUHJvdmlkZXIgdmVyc2lvbkhhbmRsZXIgPSBzZXJ2ZXJSdW50aW1lLmdldFZpcmdvVmVyc2lvbigpOworICAgICAgICAgICAgaWYgKHZlcnNpb25IYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmVyc2lvbkhhbmRsZXIuY3JlYXRlRGVwZW5kZW5jeUxvY2F0b3IocnVudGltZSwgc2VydmVySG9tZVBhdGgsIGFkZGl0aW9uYWxTZWFyY2hQYXRocywgaW5kZXhEaXJlY3RvcnlQYXRoLCBqYXZhVmVyc2lvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2FjaGUgZGlyZWN0b3J5IHRvIGJlIHVzZWQgYnkgdGhlIHtAbGluayBEZXBlbmRlbmN5TG9jYXRvcn0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2FjaGVEaXJlY3RvcnlQYXRoKCkgewotCQkvLyB0cnlpbmcgdG8gZ2VuZXJhdGVkIGEgdGhyZWFkIHVuaXF1ZSBkaXJlY3RvcnkgbmFtZQotCQlGaWxlIGNhY2hlRGlyZWN0b3J5UGF0aCA9IG5ldyBGaWxlKG5ldyBTdHJpbmdCdWlsZGVyKENBQ0hFX0xPQ0FUSU9OKS5hcHBlbmQoIi0iKQotCQkJCS5hcHBlbmQoUkVQT1NJVE9SWV9DT1VOVEVSLmdldEFuZEluY3JlbWVudCgpKQotCQkJCS50b1N0cmluZygpKTsKLQkJaWYgKCFjYWNoZURpcmVjdG9yeVBhdGguZXhpc3RzKCkpIHsKLQkJCWNhY2hlRGlyZWN0b3J5UGF0aC5ta2RpcnMoKTsKLQkJfQotCQlyZXR1cm4gY2FjaGVEaXJlY3RvcnlQYXRoLnRvU3RyaW5nKCk7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNhY2hlIGRpcmVjdG9yeSB0byBiZSB1c2VkIGJ5IHRoZSB7QGxpbmsgRGVwZW5kZW5jeUxvY2F0b3J9CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENhY2hlRGlyZWN0b3J5UGF0aCgpIHsKKyAgICAgICAgLy8gdHJ5aW5nIHRvIGdlbmVyYXRlZCBhIHRocmVhZCB1bmlxdWUgZGlyZWN0b3J5IG5hbWUKKyAgICAgICAgRmlsZSBjYWNoZURpcmVjdG9yeVBhdGggPSBuZXcgRmlsZShuZXcgU3RyaW5nQnVpbGRlcihDQUNIRV9MT0NBVElPTikuYXBwZW5kKCItIikuYXBwZW5kKFJFUE9TSVRPUllfQ09VTlRFUi5nZXRBbmRJbmNyZW1lbnQoKSkudG9TdHJpbmcoKSk7CisgICAgICAgIGlmICghY2FjaGVEaXJlY3RvcnlQYXRoLmV4aXN0cygpKSB7CisgICAgICAgICAgICBjYWNoZURpcmVjdG9yeVBhdGgubWtkaXJzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNhY2hlRGlyZWN0b3J5UGF0aC50b1N0cmluZygpOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBqYXIgZm9sbG93aW5nIHRoZSBCUklUUyBjb252ZW50aW9ucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRTb3VyY2VGaWxlKFVSSSB1cmkpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJpKTsKLQkJU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoZmlsZS5nZXROYW1lKCkpOwotCQlpbnQgaXggPSBidWlsZGVyLmxhc3RJbmRleE9mKCItIik7Ci0JCWlmIChpeCA+IDApIHsKLQkJCWJ1aWxkZXIuaW5zZXJ0KGl4LCBTT1VSQ0VTX1NVRkZJWCk7Ci0JCQlGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZShmaWxlLmdldFBhcmVudEZpbGUoKSwgYnVpbGRlci50b1N0cmluZygpKTsKLQkJCXJldHVybiBzb3VyY2VGaWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgamFyIGZvbGxvd2luZyB0aGUgQlJJVFMgY29udmVudGlvbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0U291cmNlRmlsZShVUkkgdXJpKSB7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgaW50IGl4ID0gYnVpbGRlci5sYXN0SW5kZXhPZigiLSIpOworICAgICAgICBpZiAoaXggPiAwKSB7CisgICAgICAgICAgICBidWlsZGVyLmluc2VydChpeCwgU09VUkNFU19TVUZGSVgpOworICAgICAgICAgICAgRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoZmlsZS5nZXRQYXJlbnRGaWxlKCksIGJ1aWxkZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gc291cmNlRmlsZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJDYWNoZURpcmVjdG9yeSgpIHsKLQkJRmlsZSBzdGF0ZUxvY2F0aW9uID0gU2VydmVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLnRvRmlsZSgpOworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckNhY2hlRGlyZWN0b3J5KCkgeworICAgICAgICBGaWxlIHN0YXRlTG9jYXRpb24gPSBTZXJ2ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9GaWxlKCk7CiAKLQkJZm9yIChGaWxlIGZvbGRlciA6IHN0YXRlTG9jYXRpb24ubGlzdEZpbGVzKG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLQkJCQlyZXR1cm4gbmFtZS5zdGFydHNXaXRoKENBQ0hFX0xPQ0FUSU9OX1BSRUZJWCkgfHwgbmFtZS5zdGFydHNXaXRoKFJFUE9TSVRPUllfRE9XTkxPQURTX1BSRUZJWCk7Ci0JCQl9Ci0JCX0pKSB7Ci0JCQlQdWJsaXNoVXRpbC5kZWxldGVEaXJlY3RvcnkoZm9sZGVyLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQorICAgICAgICBmb3IgKEZpbGUgZm9sZGVyIDogc3RhdGVMb2NhdGlvbi5saXN0RmlsZXMobmV3IEZpbGVuYW1lRmlsdGVyKCkgewogCi0JfQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLnN0YXJ0c1dpdGgoQ0FDSEVfTE9DQVRJT05fUFJFRklYKSB8fCBuYW1lLnN0YXJ0c1dpdGgoUkVQT1NJVE9SWV9ET1dOTE9BRFNfUFJFRklYKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkpIHsKKyAgICAgICAgICAgIFB1Ymxpc2hVdGlsLmRlbGV0ZURpcmVjdG9yeShmb2xkZXIsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSmF2YVZlcnNpb259IG9mIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFQcm9qZWN0fQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVZlcnNpb24gZ2V0SmF2YVZlcnNpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7CisgICAgfQogCi0JCQkvLyBmaXJzdCBjaGVjayB0aGUgbWFuaWZlc3QgZm9yIHRoYXQKLQkJCS8vIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50Ci0JCQlCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5nZXRCdW5kbGVNYW5pZmVzdE1hbmFnZXIoKS5nZXRCdW5kbGVNYW5pZmVzdCgKLQkJCQkJamF2YVByb2plY3QpOwotCQkJRGljdGlvbmFyeTxTdHJpbmcsIFN0cmluZz4gbWFuaWZlc3QgPSBidW5kbGVNYW5pZmVzdC50b0RpY3Rpb25hcnkoKTsKLQkJCWlmIChtYW5pZmVzdCAhPSBudWxsICYmIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1JFUVVJUkVERVhFQ1VUSU9ORU5WSVJPTk1FTlQpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgamF2YVZlcnNpb24gPSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5UKTsKLQkJCQlyZXR1cm4gSkFWQV9WRVJTSU9OX01BUFBJTkcuZ2V0KGphdmFWZXJzaW9uKTsKLQkJCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSmF2YVZlcnNpb259IG9mIHRoZSBnaXZlbiB7QGxpbmsgSUphdmFQcm9qZWN0fQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSmF2YVZlcnNpb24gZ2V0SmF2YVZlcnNpb24oSVByb2plY3QgcHJvamVjdCkgeworICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CisgICAgICAgIGlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7CiAKLQkJCS8vIHNlY29uZCBjaGVjayB0aGUgcHJvamVjdCBmb3IgYSBtYXRjaGluZyBqdm0KLQkJCXRyeSB7Ci0JCQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoSlJFX0NPTlRBSU5FUl9QQVRILCBqYXZhUHJvamVjdCk7Ci0JCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmIGNvbnRhaW5lciBpbnN0YW5jZW9mIEpSRUNvbnRhaW5lcikgewotCQkJCQkvLyByZWZsZWN0aW9uIGhhY2sgdG8gZ2V0IHRoZSBpbnRlcm5hbCBqdm0gaW5zdGFsbAotCQkJCQlGaWVsZCBmaWVsZCA9IEpSRUNvbnRhaW5lci5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJmVk1JbnN0YWxsIik7Ci0JCQkJCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCQkJCUlWTUluc3RhbGwgdm0gPSAoSVZNSW5zdGFsbCkgZmllbGQuZ2V0KGNvbnRhaW5lcik7CisgICAgICAgICAgICAvLyBmaXJzdCBjaGVjayB0aGUgbWFuaWZlc3QgZm9yIHRoYXQKKyAgICAgICAgICAgIC8vIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50CisgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5nZXRCdW5kbGVNYW5pZmVzdE1hbmFnZXIoKS5nZXRCdW5kbGVNYW5pZmVzdChqYXZhUHJvamVjdCk7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PFN0cmluZywgU3RyaW5nPiBtYW5pZmVzdCA9IGJ1bmRsZU1hbmlmZXN0LnRvRGljdGlvbmFyeSgpOworICAgICAgICAgICAgaWYgKG1hbmlmZXN0ICE9IG51bGwgJiYgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfUkVRVUlSRURFWEVDVVRJT05FTlZJUk9OTUVOVCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBqYXZhVmVyc2lvbiA9IG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1JFUVVJUkVERVhFQ1VUSU9ORU5WSVJPTk1FTlQpOworICAgICAgICAgICAgICAgIHJldHVybiBKQVZBX1ZFUlNJT05fTUFQUElORy5nZXQoamF2YVZlcnNpb24pOworICAgICAgICAgICAgfQogCi0JCQkJCUlFeGVjdXRpb25FbnZpcm9ubWVudHNNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhUnVudGltZS5nZXRFeGVjdXRpb25FbnZpcm9ubWVudHNNYW5hZ2VyKCk7Ci0JCQkJCS8vIGNoZWNrIGZvciBzdHJpY3QgbWF0Y2gKLQkJCQkJZm9yIChJRXhlY3V0aW9uRW52aXJvbm1lbnQgZXhlY3V0aW9uRW52aXJvbm1lbnQgOiBtYW5hZ2VyLmdldEV4ZWN1dGlvbkVudmlyb25tZW50cygpKSB7Ci0JCQkJCQlpZiAoZXhlY3V0aW9uRW52aXJvbm1lbnQuaXNTdHJpY3RseUNvbXBhdGlibGUodm0pKSB7Ci0JCQkJCQkJcmV0dXJuIEpBVkFfVkVSU0lPTl9NQVBQSU5HLmdldChleGVjdXRpb25FbnZpcm9ubWVudC5nZXRJZCgpKTsKLQkJCQkJCX0KLQkJCQkJfQorICAgICAgICAgICAgLy8gc2Vjb25kIGNoZWNrIHRoZSBwcm9qZWN0IGZvciBhIG1hdGNoaW5nIGp2bQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihKUkVfQ09OVEFJTkVSX1BBVEgsIGphdmFQcm9qZWN0KTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwgJiYgY29udGFpbmVyIGluc3RhbmNlb2YgSlJFQ29udGFpbmVyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlZmxlY3Rpb24gaGFjayB0byBnZXQgdGhlIGludGVybmFsIGp2bSBpbnN0YWxsCisgICAgICAgICAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gSlJFQ29udGFpbmVyLmNsYXNzLmdldERlY2xhcmVkRmllbGQoImZWTUluc3RhbGwiKTsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgSVZNSW5zdGFsbCB2bSA9IChJVk1JbnN0YWxsKSBmaWVsZC5nZXQoY29udGFpbmVyKTsKIAotCQkJCQkvLyBjaGVjayBmb3IgZGVmYXVsdAotCQkJCQlmb3IgKElFeGVjdXRpb25FbnZpcm9ubWVudCBleGVjdXRpb25FbnZpcm9ubWVudCA6IG1hbmFnZXIuZ2V0RXhlY3V0aW9uRW52aXJvbm1lbnRzKCkpIHsKLQkJCQkJCWlmIChleGVjdXRpb25FbnZpcm9ubWVudC5nZXREZWZhdWx0Vk0oKSAhPSBudWxsCi0JCQkJCQkJCSYmIGV4ZWN1dGlvbkVudmlyb25tZW50LmdldERlZmF1bHRWTSgpLmVxdWFscyh2bSkpIHsKLQkJCQkJCQlyZXR1cm4gSkFWQV9WRVJTSU9OX01BUFBJTkcuZ2V0KGV4ZWN1dGlvbkVudmlyb25tZW50LmdldElkKCkpOwotCQkJCQkJfQotCQkJCQl9CisgICAgICAgICAgICAgICAgICAgIElFeGVjdXRpb25FbnZpcm9ubWVudHNNYW5hZ2VyIG1hbmFnZXIgPSBKYXZhUnVudGltZS5nZXRFeGVjdXRpb25FbnZpcm9ubWVudHNNYW5hZ2VyKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBzdHJpY3QgbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJRXhlY3V0aW9uRW52aXJvbm1lbnQgZXhlY3V0aW9uRW52aXJvbm1lbnQgOiBtYW5hZ2VyLmdldEV4ZWN1dGlvbkVudmlyb25tZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uRW52aXJvbm1lbnQuaXNTdHJpY3RseUNvbXBhdGlibGUodm0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpBVkFfVkVSU0lPTl9NQVBQSU5HLmdldChleGVjdXRpb25FbnZpcm9ubWVudC5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCS8vIGNoZWNrIGZvciBjb21wYXRpYmlsaXR5Ci0JCQkJCWZvciAoSUV4ZWN1dGlvbkVudmlyb25tZW50IGV4ZWN1dGlvbkVudmlyb25tZW50IDogbWFuYWdlci5nZXRFeGVjdXRpb25FbnZpcm9ubWVudHMoKSkgewotCQkJCQkJaWYgKEFycmF5cy5hc0xpc3QoZXhlY3V0aW9uRW52aXJvbm1lbnQuZ2V0Q29tcGF0aWJsZVZNcygpKS5jb250YWlucyh2bSkpIHsKLQkJCQkJCQlyZXR1cm4gSkFWQV9WRVJTSU9OX01BUFBJTkcuZ2V0KGV4ZWN1dGlvbkVudmlyb25tZW50LmdldElkKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTdGF0dXNVdGlsLmVycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJRXhlY3V0aW9uRW52aXJvbm1lbnQgZXhlY3V0aW9uRW52aXJvbm1lbnQgOiBtYW5hZ2VyLmdldEV4ZWN1dGlvbkVudmlyb25tZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uRW52aXJvbm1lbnQuZ2V0RGVmYXVsdFZNKCkgIT0gbnVsbCAmJiBleGVjdXRpb25FbnZpcm9ubWVudC5nZXREZWZhdWx0Vk0oKS5lcXVhbHModm0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpBVkFfVkVSU0lPTl9NQVBQSU5HLmdldChleGVjdXRpb25FbnZpcm9ubWVudC5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXIgZ2V0U2VydmVyKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyKSB7Ci0JCWlmIChzZXJ2ZXIgaW5zdGFuY2VvZiBTZXJ2ZXJCZWhhdmlvdXIpIHsKLQkJCXJldHVybiAoU2VydmVyKSAoKFNlcnZlckJlaGF2aW91cikgc2VydmVyKS5nZXRTZXJ2ZXIoKS5sb2FkQWRhcHRlcihTZXJ2ZXIuY2xhc3MsIG51bGwpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJRXhlY3V0aW9uRW52aXJvbm1lbnQgZXhlY3V0aW9uRW52aXJvbm1lbnQgOiBtYW5hZ2VyLmdldEV4ZWN1dGlvbkVudmlyb25tZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXlzLmFzTGlzdChleGVjdXRpb25FbnZpcm9ubWVudC5nZXRDb21wYXRpYmxlVk1zKCkpLmNvbnRhaW5zKHZtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKQVZBX1ZFUlNJT05fTUFQUElORy5nZXQoZXhlY3V0aW9uRW52aXJvbm1lbnQuZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN0YXR1c1V0aWwuZXJyb3IoZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBWaXJnb1NlcnZlclJ1bnRpbWUgZ2V0U2VydmVyUnVudGltZShJU2VydmVyQmVoYXZpb3VyIHNlcnZlcikgewotCQlpZiAoc2VydmVyIGluc3RhbmNlb2YgU2VydmVyQmVoYXZpb3VyKSB7Ci0JCQlpZiAoKChTZXJ2ZXJCZWhhdmlvdXIpIHNlcnZlcikuZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiAoVmlyZ29TZXJ2ZXJSdW50aW1lKSAoKFNlcnZlckJlaGF2aW91cikgc2VydmVyKS5nZXRTZXJ2ZXIoKQotCQkJCQkuZ2V0UnVudGltZSgpCi0JCQkJCS5sb2FkQWRhcHRlcihWaXJnb1NlcnZlclJ1bnRpbWUuY2xhc3MsIG51bGwpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZlciBnZXRTZXJ2ZXIoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXIpIHsKKyAgICAgICAgaWYgKHNlcnZlciBpbnN0YW5jZW9mIFNlcnZlckJlaGF2aW91cikgeworICAgICAgICAgICAgcmV0dXJuIChTZXJ2ZXIpICgoU2VydmVyQmVoYXZpb3VyKSBzZXJ2ZXIpLmdldFNlcnZlcigpLmxvYWRBZGFwdGVyKFNlcnZlci5jbGFzcywgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBWaXJnb1NlcnZlclJ1bnRpbWUgZ2V0U2VydmVyUnVudGltZShJU2VydmVyQmVoYXZpb3VyIHNlcnZlcikgeworICAgICAgICBpZiAoc2VydmVyIGluc3RhbmNlb2YgU2VydmVyQmVoYXZpb3VyKSB7CisgICAgICAgICAgICBpZiAoKChTZXJ2ZXJCZWhhdmlvdXIpIHNlcnZlcikuZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoVmlyZ29TZXJ2ZXJSdW50aW1lKSAoKFNlcnZlckJlaGF2aW91cikgc2VydmVyKS5nZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoVmlyZ29TZXJ2ZXJSdW50aW1lLmNsYXNzLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0FydGVmYWN0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9BcnRlZmFjdC5qYXZhCmluZGV4IGI5MWE5N2MuLjkwOGU1ZjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0FydGVmYWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvQXJ0ZWZhY3QuamF2YQpAQCAtNCwxNjQgKzQsMTU5IEBACiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCisgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uT3NnaVZlcnNpb247CiAKIC8qKgogICogUmVwcmVzZW50cyBhbiBhcnRlZmFjdCBpbiB0aGUgcmVwb3NpdG9yeSA6LSBidW5kbGUgb3IgbGlicmFyeQotICogCisgKgogICogQGF1dGhvciBhZHJpYW5jb2x5ZXIKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEFydGVmYWN0IGltcGxlbWVudHMgSUFydGVmYWN0IHsKIAotCXByaXZhdGUgYnl0ZVtdIG5hbWU7IC8vIGh1bWFuIHJlYWRhYmxlIG5hbWUgb2YgdGhlIGFydGVmYWN0CisgICAgcHJpdmF0ZSBieXRlW10gbmFtZTsgLy8gaHVtYW4gcmVhZGFibGUgbmFtZSBvZiB0aGUgYXJ0ZWZhY3QKIAotCXByaXZhdGUgYnl0ZVtdIHN5bWJvbGljTmFtZTsgLy8gaWRlbnRpZnlpbmcgbmFtZQorICAgIHByaXZhdGUgYnl0ZVtdIHN5bWJvbGljTmFtZTsgLy8gaWRlbnRpZnlpbmcgbmFtZQogCi0JcHJpdmF0ZSBPc2dpVmVyc2lvbiB2ZXJzaW9uOyAvLyBhcnRlZmFjdCB2ZXJzaW9uCisgICAgcHJpdmF0ZSBPc2dpVmVyc2lvbiB2ZXJzaW9uOyAvLyBhcnRlZmFjdCB2ZXJzaW9uCiAKLQlwcml2YXRlIGJ5dGVbXSBvcmdhbmlzYXRpb25OYW1lOyAvLyBvcmdhbmlzYXRpb24gbmFtZSBhcyBkZWZpbmVkIGluIGl2eS54bWwKLQkJCQkJCQkJCQkvLyBhbmQgdXNlZCBpbiBhcnRlZmFjdCBwYXRoCisgICAgcHJpdmF0ZSBieXRlW10gb3JnYW5pc2F0aW9uTmFtZTsgLy8gb3JnYW5pc2F0aW9uIG5hbWUgYXMgZGVmaW5lZCBpbiBpdnkueG1sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHVzZWQgaW4gYXJ0ZWZhY3QgcGF0aAogCi0JcHJpdmF0ZSBieXRlW10gbW9kdWxlTmFtZTsgLy8gbW9kdWxlIG5hbWUgYXMgZGVmaW5lZCBpbiBpdnkueG1sIGFuZCB1c2VkIGluCi0JCQkJCQkJCS8vIGFydGVmYWN0IHBhdGgKKyAgICBwcml2YXRlIGJ5dGVbXSBtb2R1bGVOYW1lOyAvLyBtb2R1bGUgbmFtZSBhcyBkZWZpbmVkIGluIGl2eS54bWwgYW5kIHVzZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcnRlZmFjdCBwYXRoCiAKLQlwcml2YXRlIGJvb2xlYW4gc291cmNlQXZhaWxhYmxlID0gZmFsc2U7IC8vIGluZGljYXRlcyBpZiBzb3VyY2UgY29kZSBpcwotCQkJCQkJCQkJCQkJLy8gYXZhaWxhYmxlCisgICAgcHJpdmF0ZSBib29sZWFuIHNvdXJjZUF2YWlsYWJsZSA9IGZhbHNlOyAvLyBpbmRpY2F0ZXMgaWYgc291cmNlIGNvZGUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF2YWlsYWJsZQogCi0JcHJpdmF0ZSBBcnRlZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeTsKKyAgICBwcml2YXRlIEFydGVmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5OwogCi0JcHJpdmF0ZSBBcnRlZmFjdFNldCBzZXQ7CisgICAgcHJpdmF0ZSBBcnRlZmFjdFNldCBzZXQ7CiAKLQkvKiogZm9yIHBlcnNpc3RlbmNlIHVzZSBvbmx5ICovCi0JcHJvdGVjdGVkIEFydGVmYWN0KCkgewotCX0KKyAgICAvKiogZm9yIHBlcnNpc3RlbmNlIHVzZSBvbmx5ICovCisgICAgcHJvdGVjdGVkIEFydGVmYWN0KCkgeworICAgIH0KIAotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBhcnRlZmFjdAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBodW1hbiByZWFkYWJsZSBhcnRlZmFjdCBuYW1lIChlLmcuICJTcHJpbmcgRnJhbWV3b3JrIikKLQkgKiBAcGFyYW0gc3ltYm9saWNOYW1lCi0JICogICAgICAgICAgICB1bmlxdWVseSBpZGVudGlmeWluZyBuYW1lIChlLmcuICJvcmcuc3ByaW5nZnJhbWV3b3JrIikKLQkgKiBAcGFyYW0gdmVyc2lvbgotCSAqICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgYXJ0ZWZhY3QsIGZvbGxvd2luZyBPU0dpIFZlcnNpb24gc2VtYW50aWNzCi0JICogQHBhcmFtIG9yZ2FuaXNhdGlvbk5hbWUKLQkgKiAgICAgICAgICAgIG9yZ2FuaXNhdGlvbiBuYW1lIGFzIGRlZmluZWQgaW4gaXZ5LnhtbAotCSAqIEBwYXJhbSBtb2R1bGVOYW1lCi0JICogICAgICAgICAgICBtb2R1bGUgbmFtZSBhcyBkZWZpbmVkIGluIGl2eS54bWwKLQkgKi8KLQlwdWJsaWMgQXJ0ZWZhY3QoU3RyaW5nIG5hbWUsIFN0cmluZyBzeW1ib2xpY05hbWUsIE9zZ2lWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBvcmdhbmlzYXRpb25OYW1lLCBTdHJpbmcgbW9kdWxlTmFtZSkgewotCQl0aGlzLm5hbWUgPSBBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNvbnZlcnQobmFtZSk7Ci0JCXRoaXMuc3ltYm9saWNOYW1lID0gQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jb252ZXJ0KHN5bWJvbGljTmFtZSk7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMub3JnYW5pc2F0aW9uTmFtZSA9IEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY29udmVydChvcmdhbmlzYXRpb25OYW1lKTsKLQkJdGhpcy5tb2R1bGVOYW1lID0gQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jb252ZXJ0KG1vZHVsZU5hbWUpOwotCX0KKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgYXJ0ZWZhY3QKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIGh1bWFuIHJlYWRhYmxlIGFydGVmYWN0IG5hbWUgKGUuZy4gIlNwcmluZyBGcmFtZXdvcmsiKQorICAgICAqIEBwYXJhbSBzeW1ib2xpY05hbWUgdW5pcXVlbHkgaWRlbnRpZnlpbmcgbmFtZSAoZS5nLiAib3JnLnNwcmluZ2ZyYW1ld29yayIpCisgICAgICogQHBhcmFtIHZlcnNpb24gdmVyc2lvbiBvZiB0aGUgYXJ0ZWZhY3QsIGZvbGxvd2luZyBPU0dpIFZlcnNpb24gc2VtYW50aWNzCisgICAgICogQHBhcmFtIG9yZ2FuaXNhdGlvbk5hbWUgb3JnYW5pc2F0aW9uIG5hbWUgYXMgZGVmaW5lZCBpbiBpdnkueG1sCisgICAgICogQHBhcmFtIG1vZHVsZU5hbWUgbW9kdWxlIG5hbWUgYXMgZGVmaW5lZCBpbiBpdnkueG1sCisgICAgICovCisgICAgcHVibGljIEFydGVmYWN0KFN0cmluZyBuYW1lLCBTdHJpbmcgc3ltYm9saWNOYW1lLCBPc2dpVmVyc2lvbiB2ZXJzaW9uLCBTdHJpbmcgb3JnYW5pc2F0aW9uTmFtZSwgU3RyaW5nIG1vZHVsZU5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jb252ZXJ0KG5hbWUpOworICAgICAgICB0aGlzLnN5bWJvbGljTmFtZSA9IEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY29udmVydChzeW1ib2xpY05hbWUpOworICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICB0aGlzLm9yZ2FuaXNhdGlvbk5hbWUgPSBBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNvbnZlcnQob3JnYW5pc2F0aW9uTmFtZSk7CisgICAgICAgIHRoaXMubW9kdWxlTmFtZSA9IEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY29udmVydChtb2R1bGVOYW1lKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzLklBcnRlZmFjdCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAobmFtZSAhPSBudWxsID8gbmV3IFN0cmluZyhuYW1lKSA6IG51bGwpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzLklBcnRlZmFjdCNnZXROYW1lKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWUgIT0gbnVsbCA/IG5ldyBTdHJpbmcodGhpcy5uYW1lKSA6IG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLmFydGVmYWN0cy5JQXJ0ZWZhY3QjZ2V0U3ltYm9saWNOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5bWJvbGljTmFtZSgpIHsKLQkJcmV0dXJuIChzeW1ib2xpY05hbWUgIT0gbnVsbCA/IG5ldyBTdHJpbmcoc3ltYm9saWNOYW1lKSA6IG51bGwpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzLklBcnRlZmFjdCNnZXRTeW1ib2xpY05hbWUoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xpY05hbWUgIT0gbnVsbCA/IG5ldyBTdHJpbmcodGhpcy5zeW1ib2xpY05hbWUpIDogbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzLklBcnRlZmFjdCNnZXRWZXJzaW9uKCkKLQkgKi8KLQlwdWJsaWMgT3NnaVZlcnNpb24gZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHMuSUFydGVmYWN0I2dldFZlcnNpb24oKQorICAgICAqLworICAgIHB1YmxpYyBPc2dpVmVyc2lvbiBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHMuSUFydGVmYWN0I2dldE9yZ2FuaXNhdGlvbk5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3JnYW5pc2F0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIChvcmdhbmlzYXRpb25OYW1lICE9IG51bGwgPyBuZXcgU3RyaW5nKG9yZ2FuaXNhdGlvbk5hbWUpIDogbnVsbCk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHMuSUFydGVmYWN0I2dldE9yZ2FuaXNhdGlvbk5hbWUoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3JnYW5pc2F0aW9uTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMub3JnYW5pc2F0aW9uTmFtZSAhPSBudWxsID8gbmV3IFN0cmluZyh0aGlzLm9yZ2FuaXNhdGlvbk5hbWUpIDogbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzLklBcnRlZmFjdCNnZXRNb2R1bGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1vZHVsZU5hbWUoKSB7Ci0JCXJldHVybiAobW9kdWxlTmFtZSAhPSBudWxsID8gbmV3IFN0cmluZyhtb2R1bGVOYW1lKSA6IG51bGwpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzLklBcnRlZmFjdCNnZXRNb2R1bGVOYW1lKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1vZHVsZU5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1vZHVsZU5hbWUgIT0gbnVsbCA/IG5ldyBTdHJpbmcodGhpcy5tb2R1bGVOYW1lKSA6IG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLmFydGVmYWN0cy5JQXJ0ZWZhY3QjaXNTb3VyY2VBdmFpbGFibGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU291cmNlQXZhaWxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zb3VyY2VBdmFpbGFibGU7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHMuSUFydGVmYWN0I2lzU291cmNlQXZhaWxhYmxlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NvdXJjZUF2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlQXZhaWxhYmxlOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHMuSUFydGVmYWN0I3NldFNvdXJjZUF2YWlsYWJsZShib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUF2YWlsYWJsZShib29sZWFuIHNvdXJjZUF2YWlsYWJsZSkgewotCQl0aGlzLnNvdXJjZUF2YWlsYWJsZSA9IHNvdXJjZUF2YWlsYWJsZTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLmFydGVmYWN0cy5JQXJ0ZWZhY3Qjc2V0U291cmNlQXZhaWxhYmxlKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlQXZhaWxhYmxlKGJvb2xlYW4gc291cmNlQXZhaWxhYmxlKSB7CisgICAgICAgIHRoaXMuc291cmNlQXZhaWxhYmxlID0gc291cmNlQXZhaWxhYmxlOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHMuSUFydGVmYWN0I2dldFJlbGF0aXZlVXJsUGF0aCgpCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRSZWxhdGl2ZVVybFBhdGgoKTsKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzLklBcnRlZmFjdCNnZXRSZWxhdGl2ZVVybFBhdGgoKQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVsYXRpdmVVcmxQYXRoKCk7CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzLklBcnRlZmFjdCNnZXRSZWxhdGl2ZUxpY2Vuc2VVcmxQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlTGljZW5zZVVybFBhdGgoKSB7Ci0JCXJldHVybiAiLyIgKyBnZXRPcmdhbmlzYXRpb25OYW1lKCkgKyAiLyIgKyBnZXRNb2R1bGVOYW1lKCkgKyAiLyIgKyBnZXRWZXJzaW9uKCkgKyAiL2xpY2Vuc2UtIiArIGdldFZlcnNpb24oKQotCQkJCSsgIi50eHQiOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzLklBcnRlZmFjdCNnZXRSZWxhdGl2ZUxpY2Vuc2VVcmxQYXRoKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlTGljZW5zZVVybFBhdGgoKSB7CisgICAgICAgIHJldHVybiAiLyIgKyBnZXRPcmdhbmlzYXRpb25OYW1lKCkgKyAiLyIgKyBnZXRNb2R1bGVOYW1lKCkgKyAiLyIgKyBnZXRWZXJzaW9uKCkgKyAiL2xpY2Vuc2UtIiArIGdldFZlcnNpb24oKSArICIudHh0IjsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKLQkJcmV0dXJuIGdldFN5bWJvbGljTmFtZSgpICsgIjsiICsgZ2V0VmVyc2lvbigpICsgIjsiICsgZ2V0QXJ0ZWZhY3RUeXBlKCkuZ2V0TGFiZWwoKTsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRTaWduYXR1cmUoKSB7CisgICAgICAgIHJldHVybiBnZXRTeW1ib2xpY05hbWUoKSArICI7IiArIGdldFZlcnNpb24oKSArICI7IiArIGdldEFydGVmYWN0VHlwZSgpLmdldExhYmVsKCk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLmFydGVmYWN0cy5JQXJ0ZWZhY3QjaXNNYXRjaChvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLmFydGVmYWN0cy5JQXJ0ZWZhY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYXRjaChJQXJ0ZWZhY3QgYXJ0ZWZhY3QpIHsKLQkJcmV0dXJuIGdldFNpZ25hdHVyZSgpLmVxdWFscyhhcnRlZmFjdC5nZXRTaWduYXR1cmUoKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHMuSUFydGVmYWN0I2lzTWF0Y2gob3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHMuSUFydGVmYWN0KQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTWF0Y2goSUFydGVmYWN0IGFydGVmYWN0KSB7CisgICAgICAgIHJldHVybiBnZXRTaWduYXR1cmUoKS5lcXVhbHMoYXJ0ZWZhY3QuZ2V0U2lnbmF0dXJlKCkpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0JCWlmIChvdGhlciBpbnN0YW5jZW9mIEFydGVmYWN0KSB7Ci0JCQlBcnRlZmFjdCBhcnRlZmFjdCA9IChBcnRlZmFjdCkgb3RoZXI7Ci0JCQlyZXR1cm4gaXNNYXRjaChhcnRlZmFjdCkgJiYgc291cmNlQXZhaWxhYmxlID09IGFydGVmYWN0LnNvdXJjZUF2YWlsYWJsZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIEFydGVmYWN0KSB7CisgICAgICAgICAgICBBcnRlZmFjdCBhcnRlZmFjdCA9IChBcnRlZmFjdCkgb3RoZXI7CisgICAgICAgICAgICByZXR1cm4gaXNNYXRjaChhcnRlZmFjdCkgJiYgdGhpcy5zb3VyY2VBdmFpbGFibGUgPT0gYXJ0ZWZhY3Quc291cmNlQXZhaWxhYmxlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLQlwdWJsaWMgQXJ0ZWZhY3RSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKSB7Ci0JCXJldHVybiByZXBvc2l0b3J5OwotCX0KKyAgICBwdWJsaWMgQXJ0ZWZhY3RSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlcG9zaXRvcnk7CisgICAgfQogCi0JcHVibGljIHZvaWQgc2V0UmVwb3NpdG9yeShBcnRlZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQl0aGlzLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwotCX0KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBvc2l0b3J5KEFydGVmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7CisgICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7CisgICAgfQogCi0JcHVibGljIEFydGVmYWN0U2V0IGdldFNldCgpIHsKLQkJcmV0dXJuIHNldDsKLQl9CisgICAgcHVibGljIEFydGVmYWN0U2V0IGdldFNldCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2V0OworICAgIH0KIAotCXB1YmxpYyB2b2lkIHNldFNldChBcnRlZmFjdFNldCBzZXQpIHsKLQkJdGhpcy5zZXQgPSBzZXQ7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNldFNldChBcnRlZmFjdFNldCBzZXQpIHsKKyAgICAgICAgdGhpcy5zZXQgPSBzZXQ7CisgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0FydGVmYWN0UmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvQXJ0ZWZhY3RSZXBvc2l0b3J5LmphdmEKaW5kZXggOWE0ZmE0Yy4uZGJkMzQ1ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvQXJ0ZWZhY3RSZXBvc2l0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvQXJ0ZWZhY3RSZXBvc2l0b3J5LmphdmEKQEAgLTQsMTAgKzQsMTEgQEAKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLmFydGVmYWN0czsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0yMiwxMDggKzIzLDEwOSBAQAogICovCiBwdWJsaWMgY2xhc3MgQXJ0ZWZhY3RSZXBvc2l0b3J5IHsKIAotCUFydGVmYWN0U2V0IGJ1bmRsZXM7CisgICAgQXJ0ZWZhY3RTZXQgYnVuZGxlczsKIAotCUFydGVmYWN0U2V0IGxpYnJhcmllczsKKyAgICBBcnRlZmFjdFNldCBsaWJyYXJpZXM7CiAKLQlBcnRlZmFjdFNldCBhbGxBcnRlZmFjdHM7CisgICAgQXJ0ZWZhY3RTZXQgYWxsQXJ0ZWZhY3RzOwogCi0JTGlzdDxBcnRlZmFjdFNldD4gYWxsU2V0czsKKyAgICBMaXN0PEFydGVmYWN0U2V0PiBhbGxTZXRzOwogCi0JSVNlcnZlciBzZXJ2ZXI7CisgICAgSVNlcnZlciBzZXJ2ZXI7CiAKLQlwdWJsaWMgQXJ0ZWZhY3RSZXBvc2l0b3J5KCkgewotCQlidW5kbGVzID0gY3JlYXRlQXJ0ZWZhY3RTZXQoQXJ0ZWZhY3RUeXBlLkJVTkRMRSk7Ci0JCWxpYnJhcmllcyA9IGNyZWF0ZUFydGVmYWN0U2V0KEFydGVmYWN0VHlwZS5MSUJSQVJZKTsKLQkJYWxsQXJ0ZWZhY3RzID0gbmV3IEFydGVmYWN0U2V0KHRoaXMsIEFydGVmYWN0VHlwZS5DT01CSU5FRCk7Ci0JCWFsbFNldHMgPSBuZXcgQXJyYXlMaXN0PEFydGVmYWN0U2V0PigpOwotCQlhbGxTZXRzLmFkZChidW5kbGVzKTsKLQkJYWxsU2V0cy5hZGQobGlicmFyaWVzKTsKLQl9CisgICAgcHVibGljIEFydGVmYWN0UmVwb3NpdG9yeSgpIHsKKyAgICAgICAgdGhpcy5idW5kbGVzID0gY3JlYXRlQXJ0ZWZhY3RTZXQoQXJ0ZWZhY3RUeXBlLkJVTkRMRSk7CisgICAgICAgIHRoaXMubGlicmFyaWVzID0gY3JlYXRlQXJ0ZWZhY3RTZXQoQXJ0ZWZhY3RUeXBlLkxJQlJBUlkpOworICAgICAgICB0aGlzLmFsbEFydGVmYWN0cyA9IG5ldyBBcnRlZmFjdFNldCh0aGlzLCBBcnRlZmFjdFR5cGUuQ09NQklORUQpOworICAgICAgICB0aGlzLmFsbFNldHMgPSBuZXcgQXJyYXlMaXN0PEFydGVmYWN0U2V0PigpOworICAgICAgICB0aGlzLmFsbFNldHMuYWRkKHRoaXMuYnVuZGxlcyk7CisgICAgICAgIHRoaXMuYWxsU2V0cy5hZGQodGhpcy5saWJyYXJpZXMpOworICAgIH0KIAotCXByb3RlY3RlZCBBcnRlZmFjdFNldCBjcmVhdGVBcnRlZmFjdFNldChBcnRlZmFjdFR5cGUgdHlwZSkgewotCQlyZXR1cm4gbmV3IEFydGVmYWN0U2V0KHRoaXMsIHR5cGUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gYWRkKElBcnRlZmFjdCBhcnRlZmFjdCkgewotCQkJCXJldHVybiBzdXBlci5hZGQoYXJ0ZWZhY3QpICYmIGFsbEFydGVmYWN0cy5hZGQoYXJ0ZWZhY3QpOwotCQkJfQotCQl9OwotCX0KKyAgICBwcm90ZWN0ZWQgQXJ0ZWZhY3RTZXQgY3JlYXRlQXJ0ZWZhY3RTZXQoQXJ0ZWZhY3RUeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnRlZmFjdFNldCh0aGlzLCB0eXBlKSB7CiAKLQlwdWJsaWMgSXRlcmFibGU8SUFydGVmYWN0PiBnZXRCdW5kbGVzKCkgewotCQlyZXR1cm4gYnVuZGxlcy5nZXRBcnRlZmFjdHMoKTsKLQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChJQXJ0ZWZhY3QgYXJ0ZWZhY3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuYWRkKGFydGVmYWN0KSAmJiBBcnRlZmFjdFJlcG9zaXRvcnkudGhpcy5hbGxBcnRlZmFjdHMuYWRkKGFydGVmYWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CiAKLQlwdWJsaWMgQXJ0ZWZhY3RTZXQgZ2V0QXJ0ZWZhY3RTZXQoQXJ0ZWZhY3RUeXBlIGFydGVmYWN0VHlwZSkgewotCQlpZiAoYXJ0ZWZhY3RUeXBlID09IEFydGVmYWN0VHlwZS5CVU5ETEUpIHsKLQkJCXJldHVybiBidW5kbGVzOwotCQl9IGVsc2UgaWYgKGFydGVmYWN0VHlwZSA9PSBBcnRlZmFjdFR5cGUuTElCUkFSWSkgewotCQkJcmV0dXJuIGxpYnJhcmllczsKLQkJfQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IsIGJhZCBhcnRpZmFjdCB0eXBlOiAiICsgYXJ0ZWZhY3RUeXBlKTsKLQl9CisgICAgcHVibGljIEl0ZXJhYmxlPElBcnRlZmFjdD4gZ2V0QnVuZGxlcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYnVuZGxlcy5nZXRBcnRlZmFjdHMoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBzZXQgZm9yIHRoZSBhcnRlZmFjdC4gVGhpcyBzZXQgbWF5IG9yIG1heSBub3QgYWN0dWFsbHkgY29udGFpbiB0aGUgc3VwcGxpZWQgYXJ0ZWZhY3QuCi0JICovCi0JcHVibGljIEFydGVmYWN0U2V0IGdldE1hdGNoaW5nQXJ0ZWZhY3RTZXQoSUFydGVmYWN0VHlwZWQgYXJ0ZWZhY3QpIHsKLQkJcmV0dXJuIGdldEFydGVmYWN0U2V0KGFydGVmYWN0LmdldEFydGVmYWN0VHlwZSgpKTsKLQl9CisgICAgcHVibGljIEFydGVmYWN0U2V0IGdldEFydGVmYWN0U2V0KEFydGVmYWN0VHlwZSBhcnRlZmFjdFR5cGUpIHsKKyAgICAgICAgaWYgKGFydGVmYWN0VHlwZSA9PSBBcnRlZmFjdFR5cGUuQlVORExFKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5idW5kbGVzOworICAgICAgICB9IGVsc2UgaWYgKGFydGVmYWN0VHlwZSA9PSBBcnRlZmFjdFR5cGUuTElCUkFSWSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMubGlicmFyaWVzOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvciwgYmFkIGFydGlmYWN0IHR5cGU6ICIgKyBhcnRlZmFjdFR5cGUpOworICAgIH0KIAotCS8qKgotCSAqIEFkZHMgdGhlIGFydGVmYWN0IHRvIHRoZSBhcHByb3ByaWF0ZSBhbmQgY29tbW9uIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoSUFydGVmYWN0IGFydGVmYWN0KSB7Ci0JCWdldE1hdGNoaW5nQXJ0ZWZhY3RTZXQoYXJ0ZWZhY3QpLmFkZChhcnRlZmFjdCk7Ci0JCWFydGVmYWN0LnNldFJlcG9zaXRvcnkodGhpcyk7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHNldCBmb3IgdGhlIGFydGVmYWN0LiBUaGlzIHNldCBtYXkgb3IgbWF5IG5vdCBhY3R1YWxseSBjb250YWluIHRoZSBzdXBwbGllZCBhcnRlZmFjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXJ0ZWZhY3RTZXQgZ2V0TWF0Y2hpbmdBcnRlZmFjdFNldChJQXJ0ZWZhY3RUeXBlZCBhcnRlZmFjdCkgeworICAgICAgICByZXR1cm4gZ2V0QXJ0ZWZhY3RTZXQoYXJ0ZWZhY3QuZ2V0QXJ0ZWZhY3RUeXBlKCkpOworICAgIH0KIAotCXB1YmxpYyBBcnRlZmFjdFNldCBnZXRMaWJyYXJ5U2V0KCkgewotCQlyZXR1cm4gbGlicmFyaWVzOwotCX0KKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSBhcnRlZmFjdCB0byB0aGUgYXBwcm9wcmlhdGUgYW5kIGNvbW1vbiBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkKElBcnRlZmFjdCBhcnRlZmFjdCkgeworICAgICAgICBnZXRNYXRjaGluZ0FydGVmYWN0U2V0KGFydGVmYWN0KS5hZGQoYXJ0ZWZhY3QpOworICAgICAgICBhcnRlZmFjdC5zZXRSZXBvc2l0b3J5KHRoaXMpOworICAgIH0KIAotCXB1YmxpYyBBcnRlZmFjdFNldCBnZXRCdW5kbGVTZXQoKSB7Ci0JCXJldHVybiBidW5kbGVzOwotCX0KKyAgICBwdWJsaWMgQXJ0ZWZhY3RTZXQgZ2V0TGlicmFyeVNldCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGlicmFyaWVzOworICAgIH0KIAotCXB1YmxpYyB2b2lkIGFkZEJ1bmRsZShCdW5kbGVBcnRlZmFjdCBidW5kbGUpIHsKLQkJLy8gQWRkIHRvIGFsbCBoYW5kbGVkIHRocm91Z2ggc2V0Ci0JCXRoaXMuYnVuZGxlcy5hZGQoYnVuZGxlKTsKLQkJYnVuZGxlLnNldFJlcG9zaXRvcnkodGhpcyk7Ci0JfQorICAgIHB1YmxpYyBBcnRlZmFjdFNldCBnZXRCdW5kbGVTZXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJ1bmRsZXM7CisgICAgfQogCi0JcHVibGljIEl0ZXJhYmxlPElBcnRlZmFjdD4gZ2V0TGlicmFyaWVzKCkgewotCQkvLyBBZGQgdG8gYWxsIGhhbmRsZWQgdGhyb3VnaCBzZXQKLQkJcmV0dXJuIGxpYnJhcmllcy5nZXRBcnRlZmFjdHMoKTsKLQl9CisgICAgcHVibGljIHZvaWQgYWRkQnVuZGxlKEJ1bmRsZUFydGVmYWN0IGJ1bmRsZSkgeworICAgICAgICAvLyBBZGQgdG8gYWxsIGhhbmRsZWQgdGhyb3VnaCBzZXQKKyAgICAgICAgdGhpcy5idW5kbGVzLmFkZChidW5kbGUpOworICAgICAgICBidW5kbGUuc2V0UmVwb3NpdG9yeSh0aGlzKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBhZGRMaWJyYXJ5KExpYnJhcnlBcnRlZmFjdCBsaWJyYXJ5KSB7Ci0JCXRoaXMubGlicmFyaWVzLmFkZChsaWJyYXJ5KTsKLQkJbGlicmFyeS5zZXRSZXBvc2l0b3J5KHRoaXMpOwotCX0KKyAgICBwdWJsaWMgSXRlcmFibGU8SUFydGVmYWN0PiBnZXRMaWJyYXJpZXMoKSB7CisgICAgICAgIC8vIEFkZCB0byBhbGwgaGFuZGxlZCB0aHJvdWdoIHNldAorICAgICAgICByZXR1cm4gdGhpcy5saWJyYXJpZXMuZ2V0QXJ0ZWZhY3RzKCk7CisgICAgfQogCi0JcHVibGljIEFydGVmYWN0U2V0IGdldEFsbEFydGVmYWN0cygpIHsKLQkJcmV0dXJuIGFsbEFydGVmYWN0czsKLQl9CisgICAgcHVibGljIHZvaWQgYWRkTGlicmFyeShMaWJyYXJ5QXJ0ZWZhY3QgbGlicmFyeSkgeworICAgICAgICB0aGlzLmxpYnJhcmllcy5hZGQobGlicmFyeSk7CisgICAgICAgIGxpYnJhcnkuc2V0UmVwb3NpdG9yeSh0aGlzKTsKKyAgICB9CiAKLQlwdWJsaWMgTGlzdDxBcnRlZmFjdFNldD4gZ2V0QWxsU2V0cygpIHsKLQkJcmV0dXJuIGFsbFNldHM7Ci0JfQorICAgIHB1YmxpYyBBcnRlZmFjdFNldCBnZXRBbGxBcnRlZmFjdHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFsbEFydGVmYWN0czsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJQXJ0ZWZhY3QgYXJ0ZWZhY3QpIHsKLQkJZm9yIChJQXJ0ZWZhY3QgcmVwb3NpdG9yeUFydGVmYWN0IDogZ2V0TWF0Y2hpbmdBcnRlZmFjdFNldChhcnRlZmFjdCkuZ2V0QXJ0ZWZhY3RzKCkpIHsKLQkJCWlmIChhcnRlZmFjdC5pc01hdGNoKHJlcG9zaXRvcnlBcnRlZmFjdCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIHB1YmxpYyBMaXN0PEFydGVmYWN0U2V0PiBnZXRBbGxTZXRzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hbGxTZXRzOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHNldFNlcnZlcihJU2VydmVyIHNlcnZlcikgewotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQl9CisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoSUFydGVmYWN0IGFydGVmYWN0KSB7CisgICAgICAgIGZvciAoSUFydGVmYWN0IHJlcG9zaXRvcnlBcnRlZmFjdCA6IGdldE1hdGNoaW5nQXJ0ZWZhY3RTZXQoYXJ0ZWZhY3QpLmdldEFydGVmYWN0cygpKSB7CisgICAgICAgICAgICBpZiAoYXJ0ZWZhY3QuaXNNYXRjaChyZXBvc2l0b3J5QXJ0ZWZhY3QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHNlcnZlcjsKLQl9CisgICAgcHVibGljIHZvaWQgc2V0U2VydmVyKElTZXJ2ZXIgc2VydmVyKSB7CisgICAgICAgIHRoaXMuc2VydmVyID0gc2VydmVyOworICAgIH0KKworICAgIHB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VydmVyOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0FydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0FydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIuamF2YQppbmRleCA2YTE0ZDUxLi5mN2U3NWVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9BcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtNzEsNTgzICs3Miw1NzcgQEAKICAqIE1hbmFnZXMgaW5zdGFuY2VzIG9mIHtAbGluayBBcnRlZmFjdFJlcG9zaXRvcnl9IHRvIHJlcHJlc2VudCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgU3ByaW5nU291cmNlIEVudGVycHJpc2UKICAqIEJ1bmRsZSBSZXBvc2l0b3J5IGFuZCB7QGxpbmsgQnVuZGxlUmVwb3NpdG9yeX1zIGluZGV4ZWQgYnkge0BsaW5rIElSdW50aW1lfSByZXByZXNlbnRpbmcgbG9jYWwgYnVuZGxlIGFuZCBsaWJyYXJ5CiAgKiByZXBvc2l0b3JpZXMgaW4gYSBWaXJnbyBTZXJ2ZXIgaW5zdGFuY2UuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlciB7CiAKLQlwcml2YXRlIEFydGVmYWN0UmVwb3NpdG9yeSBhcnRlZmFjdFJlcG9zaXRvcnkgPSBuZXcgQXJ0ZWZhY3RSZXBvc2l0b3J5KCk7CisgICAgcHJpdmF0ZSBBcnRlZmFjdFJlcG9zaXRvcnkgYXJ0ZWZhY3RSZXBvc2l0b3J5ID0gbmV3IEFydGVmYWN0UmVwb3NpdG9yeSgpOwogCi0JcHJpdmF0ZSBmaW5hbCBNYXA8SVJ1bnRpbWUsIEJ1bmRsZVJlcG9zaXRvcnk+IGJ1bmRsZVJlcG9zaXRvcmllcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJUnVudGltZSwgQnVuZGxlUmVwb3NpdG9yeT4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxJUnVudGltZSwgQnVuZGxlUmVwb3NpdG9yeT4gYnVuZGxlUmVwb3NpdG9yaWVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPElSdW50aW1lLCBCdW5kbGVSZXBvc2l0b3J5PigpOwogCi0JcHJpdmF0ZSBEYXRlIHJlcG9zaXRvcnlEYXRlID0gbmV3IERhdGUoKTsKKyAgICBwcml2YXRlIERhdGUgcmVwb3NpdG9yeURhdGUgPSBuZXcgRGF0ZSgpOwogCi0JcHJpdmF0ZSBmaW5hbCBTcHJpbmdTb3VyY2VBcHBsaWNhdGlvblBsYXRmb3JtIGFwcGxpY2F0aW9uUGxhdGZvcm0gPSBuZXcgU3ByaW5nU291cmNlQXBwbGljYXRpb25QbGF0Zm9ybSgpOworICAgIHByaXZhdGUgZmluYWwgU3ByaW5nU291cmNlQXBwbGljYXRpb25QbGF0Zm9ybSBhcHBsaWNhdGlvblBsYXRmb3JtID0gbmV3IFNwcmluZ1NvdXJjZUFwcGxpY2F0aW9uUGxhdGZvcm0oKTsKIAotCXByaXZhdGUgZmluYWwgU2V0PElCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldChuZXcgSGFzaFNldDxJQnVuZGxlUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyPigpKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxJQnVuZGxlUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQobmV3IEhhc2hTZXQ8SUJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lcj4oKSk7CiAKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKIAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayByd2wgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayByd2wgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOwogCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2NrIHIgPSByd2wucmVhZExvY2soKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvY2sgciA9IHJ3bC5yZWFkTG9jaygpOwogCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2NrIHcgPSByd2wud3JpdGVMb2NrKCk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2NrIHcgPSByd2wud3JpdGVMb2NrKCk7CiAKLQlwcml2YXRlIExpc3Q8T3NnaVZlcnNpb24+IGZpbmRCdW5kbGVWZXJzaW9ucyhTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCUxpc3Q8T3NnaVZlcnNpb24+IHZlcnNpb25zID0gbmV3IEFycmF5TGlzdDxPc2dpVmVyc2lvbj4oKTsKLQkJdHJ5IHsKLQkJCXIubG9jaygpOwotCQkJZm9yIChJQXJ0ZWZhY3QgYnVuZGxlIDogYXJ0ZWZhY3RSZXBvc2l0b3J5LmdldEJ1bmRsZXMoKSkgewotCQkJCWlmIChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzKHN5bWJvbGljTmFtZSkpIHsKLQkJCQkJdmVyc2lvbnMuYWRkKGJ1bmRsZS5nZXRWZXJzaW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXIudW5sb2NrKCk7Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb25zOwotCX0KKyAgICBwcml2YXRlIExpc3Q8T3NnaVZlcnNpb24+IGZpbmRCdW5kbGVWZXJzaW9ucyhTdHJpbmcgc3ltYm9saWNOYW1lKSB7CisgICAgICAgIExpc3Q8T3NnaVZlcnNpb24+IHZlcnNpb25zID0gbmV3IEFycmF5TGlzdDxPc2dpVmVyc2lvbj4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHIubG9jaygpOworICAgICAgICAgICAgZm9yIChJQXJ0ZWZhY3QgYnVuZGxlIDogdGhpcy5hcnRlZmFjdFJlcG9zaXRvcnkuZ2V0QnVuZGxlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMoc3ltYm9saWNOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucy5hZGQoYnVuZGxlLmdldFZlcnNpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgci51bmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmVyc2lvbnM7CisgICAgfQogCi0JcHVibGljIEJ1bmRsZVJlcG9zaXRvcnkgZ2V0QnVuZGxlUmVwb3NpdG9yeShJUnVudGltZSBydW50aW1lKSB7Ci0JCXRyeSB7Ci0JCQlyLmxvY2soKTsKLQkJCWlmIChidW5kbGVSZXBvc2l0b3JpZXMuY29udGFpbnNLZXkocnVudGltZSkpIHsKLQkJCQlyZXR1cm4gYnVuZGxlUmVwb3NpdG9yaWVzLmdldChydW50aW1lKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXIudW5sb2NrKCk7Ci0JCX0KLQkJSURlcGVuZGVuY3lMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotCQl0cnkgewotCQkJdy5sb2NrKCk7Ci0JCQlpZiAoYnVuZGxlUmVwb3NpdG9yaWVzLmNvbnRhaW5zS2V5KHJ1bnRpbWUpKSB7Ci0JCQkJcmV0dXJuIGJ1bmRsZVJlcG9zaXRvcmllcy5nZXQocnVudGltZSk7Ci0JCQl9CisgICAgcHVibGljIEJ1bmRsZVJlcG9zaXRvcnkgZ2V0QnVuZGxlUmVwb3NpdG9yeShJUnVudGltZSBydW50aW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByLmxvY2soKTsKKyAgICAgICAgICAgIGlmICh0aGlzLmJ1bmRsZVJlcG9zaXRvcmllcy5jb250YWluc0tleShydW50aW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1bmRsZVJlcG9zaXRvcmllcy5nZXQocnVudGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByLnVubG9jaygpOworICAgICAgICB9CisgICAgICAgIElEZXBlbmRlbmN5TG9jYXRvciBsb2NhdG9yID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHcubG9jaygpOworICAgICAgICAgICAgaWYgKHRoaXMuYnVuZGxlUmVwb3NpdG9yaWVzLmNvbnRhaW5zS2V5KHJ1bnRpbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVuZGxlUmVwb3NpdG9yaWVzLmdldChydW50aW1lKTsKKyAgICAgICAgICAgIH0KIAotCQkJbG9jYXRvciA9IFNlcnZlclV0aWxzLmNyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKHJ1bnRpbWUpOwotCQkJU2V0PEJ1bmRsZURlZmluaXRpb24+IGJ1bmRsZXMgPSBuZXcgSGFzaFNldDxCdW5kbGVEZWZpbml0aW9uPigpOworICAgICAgICAgICAgbG9jYXRvciA9IFNlcnZlclV0aWxzLmNyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKHJ1bnRpbWUpOworICAgICAgICAgICAgU2V0PEJ1bmRsZURlZmluaXRpb24+IGJ1bmRsZXMgPSBuZXcgSGFzaFNldDxCdW5kbGVEZWZpbml0aW9uPigpOwogCi0JCQlmb3IgKEJ1bmRsZURlZmluaXRpb24gYnVuZGxlIDogbG9jYXRvci5nZXRCdW5kbGVzKCkpIHsKLQkJCQlpZiAoYnVuZGxlLmdldE1hbmlmZXN0KCkgIT0gbnVsbCkgewotCQkJCQlidW5kbGVzLmFkZChuZXcgSW5pdGlhbGl6ZWRCdW5kbGVEZWZpbml0aW9uKGJ1bmRsZS5nZXRNYW5pZmVzdCgpLCBidW5kbGUuZ2V0TG9jYXRpb24oKSkpOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIGZvciAoQnVuZGxlRGVmaW5pdGlvbiBidW5kbGUgOiBsb2NhdG9yLmdldEJ1bmRsZXMoKSkgeworICAgICAgICAgICAgICAgIGlmIChidW5kbGUuZ2V0TWFuaWZlc3QoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZXMuYWRkKG5ldyBJbml0aWFsaXplZEJ1bmRsZURlZmluaXRpb24oYnVuZGxlLmdldE1hbmlmZXN0KCksIGJ1bmRsZS5nZXRMb2NhdGlvbigpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlCdW5kbGVSZXBvc2l0b3J5IGluaXRpYWxpemVkQnVuZGxlUmVwb3NpdG9yeSA9IG5ldyBJbml0aWFsaXplZEJ1bmRsZVJlcG9zaXRvcnkoYnVuZGxlcywKLQkJCQkJbmV3IEhhc2hTZXQ8TGlicmFyeURlZmluaXRpb24+KGxvY2F0b3IuZ2V0TGlicmFyaWVzKCkpKTsKLQkJCWJ1bmRsZVJlcG9zaXRvcmllcy5wdXQocnVudGltZSwgaW5pdGlhbGl6ZWRCdW5kbGVSZXBvc2l0b3J5KTsKLQkJCXJldHVybiBpbml0aWFsaXplZEJ1bmRsZVJlcG9zaXRvcnk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBTaHV0ZG93biBEZXBlbmRlbmN5TG9jYXRvcgotCQkJaWYgKGxvY2F0b3IgIT0gbnVsbCkgewotCQkJCWxvY2F0b3Iuc2h1dGRvd24oKTsKLQkJCX0KKyAgICAgICAgICAgIEJ1bmRsZVJlcG9zaXRvcnkgaW5pdGlhbGl6ZWRCdW5kbGVSZXBvc2l0b3J5ID0gbmV3IEluaXRpYWxpemVkQnVuZGxlUmVwb3NpdG9yeShidW5kbGVzLAorICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PExpYnJhcnlEZWZpbml0aW9uPihsb2NhdG9yLmdldExpYnJhcmllcygpKSk7CisgICAgICAgICAgICB0aGlzLmJ1bmRsZVJlcG9zaXRvcmllcy5wdXQocnVudGltZSwgaW5pdGlhbGl6ZWRCdW5kbGVSZXBvc2l0b3J5KTsKKyAgICAgICAgICAgIHJldHVybiBpbml0aWFsaXplZEJ1bmRsZVJlcG9zaXRvcnk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBTaHV0ZG93biBEZXBlbmRlbmN5TG9jYXRvcgorICAgICAgICAgICAgaWYgKGxvY2F0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvY2F0b3Iuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIH0KIAotCQkJdy51bmxvY2soKTsKLQkJfQotCX0KKyAgICAgICAgICAgIHcudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgQnVuZGxlUmVwb3NpdG9yeSByZWZyZXNoQnVuZGxlUmVwb3NpdG9yeShJUnVudGltZSBydW50aW1lKSB7Ci0JCXRyeSB7Ci0JCQl3LmxvY2soKTsKLQkJCWJ1bmRsZVJlcG9zaXRvcmllcy5yZW1vdmUocnVudGltZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl3LnVubG9jaygpOwotCQl9CisgICAgcHVibGljIEJ1bmRsZVJlcG9zaXRvcnkgcmVmcmVzaEJ1bmRsZVJlcG9zaXRvcnkoSVJ1bnRpbWUgcnVudGltZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdy5sb2NrKCk7CisgICAgICAgICAgICB0aGlzLmJ1bmRsZVJlcG9zaXRvcmllcy5yZW1vdmUocnVudGltZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB3LnVubG9jaygpOworICAgICAgICB9CiAKLQkJQnVuZGxlUmVwb3NpdG9yeSBidW5kbGVSZXBvc2l0b3J5ID0gZ2V0QnVuZGxlUmVwb3NpdG9yeShydW50aW1lKTsKLQkJZmlyZUJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VkKHJ1bnRpbWUpOwotCQlyZXR1cm4gYnVuZGxlUmVwb3NpdG9yeTsKLQl9CisgICAgICAgIEJ1bmRsZVJlcG9zaXRvcnkgYnVuZGxlUmVwb3NpdG9yeSA9IGdldEJ1bmRsZVJlcG9zaXRvcnkocnVudGltZSk7CisgICAgICAgIGZpcmVCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlZChydW50aW1lKTsKKyAgICAgICAgcmV0dXJuIGJ1bmRsZVJlcG9zaXRvcnk7CisgICAgfQogCi0JcHVibGljIExpc3Q8QnVuZGxlQXJ0ZWZhY3Q+IGZpbmRMaWJyYXJ5RGVwZW5kZW5jaWVzKExpYnJhcnlBcnRlZmFjdCBsaWJyYXJ5LCBib29sZWFuIGluY2x1ZGVPcHRpb25hbCkgewotCQl0cnkgewotCQkJci5sb2NrKCk7Ci0JCQlMaXN0PEJ1bmRsZUFydGVmYWN0PiByZXF1aXJlZCA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlQXJ0ZWZhY3Q+KCk7Ci0JCQlMaXN0PEJ1bmRsZUltcG9ydD4gdW5zYXRpc2ZpZWRCdW5kbGVJbXBvcnRzID0gbmV3IEFycmF5TGlzdDxCdW5kbGVJbXBvcnQ+KCk7Ci0JCQlMaXN0PEJ1bmRsZUltcG9ydD4gYnVuZGxlSW1wb3J0cyA9IGxpYnJhcnkuZ2V0QnVuZGxlSW1wb3J0cygpOwotCQkJTGlzdDxCdW5kbGVBcnRlZmFjdD4gYnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlQXJ0ZWZhY3Q+KCk7Ci0JCQlmb3IgKEJ1bmRsZUltcG9ydCBpbXAgOiBidW5kbGVJbXBvcnRzKSB7Ci0JCQkJTGlzdDxPc2dpVmVyc2lvbj4gY2FuZGlkYXRlcyA9IGZpbmRCdW5kbGVWZXJzaW9ucyhpbXAuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJCU9zZ2lWZXJzaW9uIGhpZ2hlc3RBdmFpbGFibGUgPSBuZXcgT3NnaVZlcnNpb24oIjAuMC4wIik7Ci0JCQkJYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0JCQkJZm9yIChPc2dpVmVyc2lvbiBmb3VuZFZlcnNpb24gOiBjYW5kaWRhdGVzKSB7Ci0JCQkJCWlmIChpbXAuZ2V0VmVyc2lvblJhbmdlKCkuY29udGFpbnMoZm91bmRWZXJzaW9uKSkgewotCQkJCQkJaWYgKGZvdW5kVmVyc2lvbi5jb21wYXJlVG8oaGlnaGVzdEF2YWlsYWJsZSkgPiAwKSB7Ci0JCQkJCQkJaGlnaGVzdEF2YWlsYWJsZSA9IGZvdW5kVmVyc2lvbjsKLQkJCQkJCQlmb3VuZE1hdGNoID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZm91bmRNYXRjaCkgewotCQkJCQlidW5kbGVzLmFkZChnZXRCdW5kbGUoaW1wLmdldFN5bWJvbGljTmFtZSgpLCBoaWdoZXN0QXZhaWxhYmxlKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdW5zYXRpc2ZpZWRCdW5kbGVJbXBvcnRzLmFkZChpbXApOwotCQkJCX0KLQkJCX0KLQkJCXJlcXVpcmVkLmFkZEFsbChidW5kbGVzKTsKLQkJCUxpc3Q8UGFja2FnZUltcG9ydD4gdW5zYXRpc2ZpZWRJbXBvcnRzID0gbmV3IEFycmF5TGlzdDxQYWNrYWdlSW1wb3J0PigpOwotCQkJTGlzdDxQYWNrYWdlSW1wb3J0PiBpbXBvcnRzID0gbmV3IEFycmF5TGlzdDxQYWNrYWdlSW1wb3J0PigpOwotCQkJZm9yIChCdW5kbGVBcnRlZmFjdCBidW5kbGUgOiBidW5kbGVzKSB7Ci0JCQkJaW1wb3J0cy5hZGRBbGwoYnVuZGxlLmdldEltcG9ydHMoKSk7Ci0JCQl9Ci0JCQljb2xsZWN0RXhwb3J0ZXJzKHJlcXVpcmVkLCBpbmNsdWRlT3B0aW9uYWwsIGltcG9ydHMsIHVuc2F0aXNmaWVkSW1wb3J0cyk7Ci0JCQlyZXR1cm4gcmVxdWlyZWQ7Ci0JCX0gZmluYWxseSB7Ci0JCQlyLnVubG9jaygpOwotCQl9Ci0JfQorICAgIHB1YmxpYyBMaXN0PEJ1bmRsZUFydGVmYWN0PiBmaW5kTGlicmFyeURlcGVuZGVuY2llcyhMaWJyYXJ5QXJ0ZWZhY3QgbGlicmFyeSwgYm9vbGVhbiBpbmNsdWRlT3B0aW9uYWwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHIubG9jaygpOworICAgICAgICAgICAgTGlzdDxCdW5kbGVBcnRlZmFjdD4gcmVxdWlyZWQgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZUFydGVmYWN0PigpOworICAgICAgICAgICAgTGlzdDxCdW5kbGVJbXBvcnQ+IHVuc2F0aXNmaWVkQnVuZGxlSW1wb3J0cyA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlSW1wb3J0PigpOworICAgICAgICAgICAgTGlzdDxCdW5kbGVJbXBvcnQ+IGJ1bmRsZUltcG9ydHMgPSBsaWJyYXJ5LmdldEJ1bmRsZUltcG9ydHMoKTsKKyAgICAgICAgICAgIExpc3Q8QnVuZGxlQXJ0ZWZhY3Q+IGJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZUFydGVmYWN0PigpOworICAgICAgICAgICAgZm9yIChCdW5kbGVJbXBvcnQgaW1wIDogYnVuZGxlSW1wb3J0cykgeworICAgICAgICAgICAgICAgIExpc3Q8T3NnaVZlcnNpb24+IGNhbmRpZGF0ZXMgPSBmaW5kQnVuZGxlVmVyc2lvbnMoaW1wLmdldFN5bWJvbGljTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBPc2dpVmVyc2lvbiBoaWdoZXN0QXZhaWxhYmxlID0gbmV3IE9zZ2lWZXJzaW9uKCIwLjAuMCIpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoT3NnaVZlcnNpb24gZm91bmRWZXJzaW9uIDogY2FuZGlkYXRlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW1wLmdldFZlcnNpb25SYW5nZSgpLmNvbnRhaW5zKGZvdW5kVmVyc2lvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZFZlcnNpb24uY29tcGFyZVRvKGhpZ2hlc3RBdmFpbGFibGUpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlc3RBdmFpbGFibGUgPSBmb3VuZFZlcnNpb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kTWF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlcy5hZGQoZ2V0QnVuZGxlKGltcC5nZXRTeW1ib2xpY05hbWUoKSwgaGlnaGVzdEF2YWlsYWJsZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVuc2F0aXNmaWVkQnVuZGxlSW1wb3J0cy5hZGQoaW1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXF1aXJlZC5hZGRBbGwoYnVuZGxlcyk7CisgICAgICAgICAgICBMaXN0PFBhY2thZ2VJbXBvcnQ+IHVuc2F0aXNmaWVkSW1wb3J0cyA9IG5ldyBBcnJheUxpc3Q8UGFja2FnZUltcG9ydD4oKTsKKyAgICAgICAgICAgIExpc3Q8UGFja2FnZUltcG9ydD4gaW1wb3J0cyA9IG5ldyBBcnJheUxpc3Q8UGFja2FnZUltcG9ydD4oKTsKKyAgICAgICAgICAgIGZvciAoQnVuZGxlQXJ0ZWZhY3QgYnVuZGxlIDogYnVuZGxlcykgeworICAgICAgICAgICAgICAgIGltcG9ydHMuYWRkQWxsKGJ1bmRsZS5nZXRJbXBvcnRzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29sbGVjdEV4cG9ydGVycyhyZXF1aXJlZCwgaW5jbHVkZU9wdGlvbmFsLCBpbXBvcnRzLCB1bnNhdGlzZmllZEltcG9ydHMpOworICAgICAgICAgICAgcmV0dXJuIHJlcXVpcmVkOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgci51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyBBcnRlZmFjdFJlcG9zaXRvcnkgZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5KCkgewotCQl0cnkgewotCQkJci5sb2NrKCk7Ci0JCQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCQkJc3RhcnQoKTsKLQkJCX0KLQkJCXJldHVybiBhcnRlZmFjdFJlcG9zaXRvcnk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyLnVubG9jaygpOwotCQl9Ci0JfQorICAgIHB1YmxpYyBBcnRlZmFjdFJlcG9zaXRvcnkgZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgci5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBzdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJ0ZWZhY3RSZXBvc2l0b3J5OworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgci51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyBEYXRlIGdldEFydGVmYWN0UmVwb3NpdG9yeURhdGUoKSB7Ci0JCXRyeSB7Ci0JCQlyLmxvY2soKTsKLQkJCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJCQlzdGFydCgpOwotCQkJfQotCQkJcmV0dXJuIHJlcG9zaXRvcnlEYXRlOwotCQl9IGZpbmFsbHkgewotCQkJci51bmxvY2soKTsKLQkJfQotCX0KKyAgICBwdWJsaWMgRGF0ZSBnZXRBcnRlZmFjdFJlcG9zaXRvcnlEYXRlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgci5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBzdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVwb3NpdG9yeURhdGU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByLnVubG9jaygpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gaXNBcnRlZmFjdFJlcG9zaXRvcnlJbml0aWFsaXplZCgpIHsKLQkJcmV0dXJuIGluaXRpYWxpemVkOwotCX0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FydGVmYWN0UmVwb3NpdG9yeUluaXRpYWxpemVkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsaXplZDsKKyAgICB9CiAKLQlwcml2YXRlIEJ1bmRsZUFydGVmYWN0IGdldEJ1bmRsZShTdHJpbmcgc3ltYm9saWNOYW1lLCBPc2dpVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCXRyeSB7Ci0JCQlyLmxvY2soKTsKLQkJCWZvciAoSUFydGVmYWN0IGJ1bmRsZSA6IGFydGVmYWN0UmVwb3NpdG9yeS5nZXRCdW5kbGVzKCkpIHsKLQkJCQlpZiAoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLmVxdWFscyhzeW1ib2xpY05hbWUpICYmIGJ1bmRsZS5nZXRWZXJzaW9uKCkuZXF1YWxzKHZlcnNpb24pKSB7Ci0JCQkJCXJldHVybiAoQnVuZGxlQXJ0ZWZhY3QpIGJ1bmRsZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXIudW5sb2NrKCk7Ci0JCX0KLQl9CisgICAgcHJpdmF0ZSBCdW5kbGVBcnRlZmFjdCBnZXRCdW5kbGUoU3RyaW5nIHN5bWJvbGljTmFtZSwgT3NnaVZlcnNpb24gdmVyc2lvbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgci5sb2NrKCk7CisgICAgICAgICAgICBmb3IgKElBcnRlZmFjdCBidW5kbGUgOiB0aGlzLmFydGVmYWN0UmVwb3NpdG9yeS5nZXRCdW5kbGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLmVxdWFscyhzeW1ib2xpY05hbWUpICYmIGJ1bmRsZS5nZXRWZXJzaW9uKCkuZXF1YWxzKHZlcnNpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQnVuZGxlQXJ0ZWZhY3QpIGJ1bmRsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHIudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgc3RhcnQoKSB7Ci0JCUFydGVmYWN0UmVwb3NpdG9yeVN0YXJ0Sm9iIHN0YXJ0Sm9iID0gbmV3IEFydGVmYWN0UmVwb3NpdG9yeVN0YXJ0Sm9iKCk7Ci0JCXN0YXJ0Sm9iLnNldFByaW9yaXR5KEpvYi5JTlRFUkFDVElWRSk7Ci0JCXN0YXJ0Sm9iLnNjaGVkdWxlKCk7Ci0JfQorICAgIHByaXZhdGUgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgQXJ0ZWZhY3RSZXBvc2l0b3J5U3RhcnRKb2Igc3RhcnRKb2IgPSBuZXcgQXJ0ZWZhY3RSZXBvc2l0b3J5U3RhcnRKb2IoKTsKKyAgICAgICAgc3RhcnRKb2Iuc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKKyAgICAgICAgc3RhcnRKb2Iuc2NoZWR1bGUoKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQlhcnRlZmFjdFJlcG9zaXRvcnkgPSBudWxsOwotCX0KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICB0aGlzLmFydGVmYWN0UmVwb3NpdG9yeSA9IG51bGw7CisgICAgfQogCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlBcnRlZmFjdFJlcG9zaXRvcnlVcGRhdGVKb2IgdXBkYXRlSm9iID0gbmV3IEFydGVmYWN0UmVwb3NpdG9yeVVwZGF0ZUpvYigpOwotCQl1cGRhdGVKb2Iuc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJdXBkYXRlSm9iLnNjaGVkdWxlKCk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKyAgICAgICAgQXJ0ZWZhY3RSZXBvc2l0b3J5VXBkYXRlSm9iIHVwZGF0ZUpvYiA9IG5ldyBBcnRlZmFjdFJlcG9zaXRvcnlVcGRhdGVKb2IoKTsKKyAgICAgICAgdXBkYXRlSm9iLnNldFByaW9yaXR5KEpvYi5JTlRFUkFDVElWRSk7CisgICAgICAgIHVwZGF0ZUpvYi5zY2hlZHVsZSgpOworICAgIH0KIAotCXByaXZhdGUgYm9vbGVhbiBhbHJlYWR5SW5CdW5kbGVMaXN0KExpc3Q8QnVuZGxlQXJ0ZWZhY3Q+IHJlcXVpcmVkLCBCdW5kbGVBcnRlZmFjdCBleHBvcnRlcikgewotCQlmb3IgKEJ1bmRsZUFydGVmYWN0IGIgOiByZXF1aXJlZCkgewotCQkJaWYgKGIuZ2V0TmFtZSgpLmVxdWFscyhleHBvcnRlci5nZXROYW1lKCkpKSB7Ci0JCQkJaWYgKGIuZ2V0VmVyc2lvbigpLmVxdWFscyhleHBvcnRlci5nZXRWZXJzaW9uKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIHByaXZhdGUgYm9vbGVhbiBhbHJlYWR5SW5CdW5kbGVMaXN0KExpc3Q8QnVuZGxlQXJ0ZWZhY3Q+IHJlcXVpcmVkLCBCdW5kbGVBcnRlZmFjdCBleHBvcnRlcikgeworICAgICAgICBmb3IgKEJ1bmRsZUFydGVmYWN0IGIgOiByZXF1aXJlZCkgeworICAgICAgICAgICAgaWYgKGIuZ2V0TmFtZSgpLmVxdWFscyhleHBvcnRlci5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGIuZ2V0VmVyc2lvbigpLmVxdWFscyhleHBvcnRlci5nZXRWZXJzaW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RFeHBvcnRlcnMoTGlzdDxCdW5kbGVBcnRlZmFjdD4gcmVxdWlyZWQsIGJvb2xlYW4gaW5jbHVkZU9wdGlvbmFsLCBMaXN0PFBhY2thZ2VJbXBvcnQ+IGltcG9ydHMsCi0JCQlMaXN0PFBhY2thZ2VJbXBvcnQ+IHVuc2F0aXNmaWVkKSB7Ci0JCWZvciAoUGFja2FnZUltcG9ydCBpbXAgOiBpbXBvcnRzKSB7Ci0JCQlpZiAoaW5jbHVkZU9wdGlvbmFsIHx8ICFpbXAuaXNPcHRpb25hbCgpKSB7Ci0JCQkJaWYgKCFhcHBsaWNhdGlvblBsYXRmb3JtLmlzU2F0aXNmaWVkVmlhU3lzdGVtQnVuZGxlKGltcCkpIHsKLQkJCQkJLy8gKGhldXJpc3RpYzogd2UgYWx3YXlzIHByZWZlciB0byBnZXQgdmlhIHN5c3RlbSBpZiB3ZSBjYW4pCi0JCQkJCUJ1bmRsZUFydGVmYWN0IGV4cG9ydGVyID0gZmluZEJlc3RFeHBvcnRlcihpbXApOwotCQkJCQlpZiAoZXhwb3J0ZXIgPT0gbnVsbCkgewotCQkJCQkJdW5zYXRpc2ZpZWQuYWRkKGltcCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoIWFscmVhZHlJbkJ1bmRsZUxpc3QocmVxdWlyZWQsIGV4cG9ydGVyKSkgewotCQkJCQkJCXJlcXVpcmVkLmFkZChleHBvcnRlcik7Ci0JCQkJCQkJY29sbGVjdEV4cG9ydGVycyhyZXF1aXJlZCwgaW5jbHVkZU9wdGlvbmFsLCBleHBvcnRlci5nZXRJbXBvcnRzKCksIHVuc2F0aXNmaWVkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICBwcml2YXRlIHZvaWQgY29sbGVjdEV4cG9ydGVycyhMaXN0PEJ1bmRsZUFydGVmYWN0PiByZXF1aXJlZCwgYm9vbGVhbiBpbmNsdWRlT3B0aW9uYWwsIExpc3Q8UGFja2FnZUltcG9ydD4gaW1wb3J0cywKKyAgICAgICAgTGlzdDxQYWNrYWdlSW1wb3J0PiB1bnNhdGlzZmllZCkgeworICAgICAgICBmb3IgKFBhY2thZ2VJbXBvcnQgaW1wIDogaW1wb3J0cykgeworICAgICAgICAgICAgaWYgKGluY2x1ZGVPcHRpb25hbCB8fCAhaW1wLmlzT3B0aW9uYWwoKSkgeworICAgICAgICAgICAgICAgIGlmICghdGhpcy5hcHBsaWNhdGlvblBsYXRmb3JtLmlzU2F0aXNmaWVkVmlhU3lzdGVtQnVuZGxlKGltcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gKGhldXJpc3RpYzogd2UgYWx3YXlzIHByZWZlciB0byBnZXQgdmlhIHN5c3RlbSBpZiB3ZSBjYW4pCisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZUFydGVmYWN0IGV4cG9ydGVyID0gZmluZEJlc3RFeHBvcnRlcihpbXApOworICAgICAgICAgICAgICAgICAgICBpZiAoZXhwb3J0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5zYXRpc2ZpZWQuYWRkKGltcCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFscmVhZHlJbkJ1bmRsZUxpc3QocmVxdWlyZWQsIGV4cG9ydGVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkLmFkZChleHBvcnRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdEV4cG9ydGVycyhyZXF1aXJlZCwgaW5jbHVkZU9wdGlvbmFsLCBleHBvcnRlci5nZXRJbXBvcnRzKCksIHVuc2F0aXNmaWVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgQnVuZGxlQXJ0ZWZhY3QgZmluZEJlc3RFeHBvcnRlcihQYWNrYWdlSW1wb3J0IGltcCkgewotCQlMaXN0PFBhY2thZ2VFeHBvcnQ+IGNhbmRpZGF0ZXMgPSBmaW5kUGFja2FnZXNXaXRoRXhhY3ROYW1lKGltcC5nZXROYW1lKCkpOwotCQlMaXN0PFBhY2thZ2VFeHBvcnQ+IHZlcnNpb25NYXRjaGVkQ2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3Q8UGFja2FnZUV4cG9ydD4oKTsKLQkJZm9yIChQYWNrYWdlRXhwb3J0IGV4cCA6IGNhbmRpZGF0ZXMpIHsKLQkJCWlmIChpbXAuaXNTYXRpc2ZpZWRCeShleHApKSB7Ci0JCQkJdmVyc2lvbk1hdGNoZWRDYW5kaWRhdGVzLmFkZChleHApOwotCQkJfQotCQl9Ci0JCWlmICh2ZXJzaW9uTWF0Y2hlZENhbmRpZGF0ZXMuc2l6ZSgpID4gMCkgewotCQkJUGFja2FnZUV4cG9ydCB3aXRoSGlnaGVzdFZlcnNpb24gPSBudWxsOwotCQkJZm9yIChQYWNrYWdlRXhwb3J0IHZlcnNpb25NYXRjaGVkRXhwb3J0IDogdmVyc2lvbk1hdGNoZWRDYW5kaWRhdGVzKSB7Ci0JCQkJaWYgKHdpdGhIaWdoZXN0VmVyc2lvbiA9PSBudWxsKSB7Ci0JCQkJCXdpdGhIaWdoZXN0VmVyc2lvbiA9IHZlcnNpb25NYXRjaGVkRXhwb3J0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICh3aXRoSGlnaGVzdFZlcnNpb24uZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyh2ZXJzaW9uTWF0Y2hlZEV4cG9ydC5nZXRWZXJzaW9uKCkpIDwgMCkgewotCQkJCQkJd2l0aEhpZ2hlc3RWZXJzaW9uID0gdmVyc2lvbk1hdGNoZWRFeHBvcnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gd2l0aEhpZ2hlc3RWZXJzaW9uLmdldEJ1bmRsZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwcml2YXRlIEJ1bmRsZUFydGVmYWN0IGZpbmRCZXN0RXhwb3J0ZXIoUGFja2FnZUltcG9ydCBpbXApIHsKKyAgICAgICAgTGlzdDxQYWNrYWdlRXhwb3J0PiBjYW5kaWRhdGVzID0gZmluZFBhY2thZ2VzV2l0aEV4YWN0TmFtZShpbXAuZ2V0TmFtZSgpKTsKKyAgICAgICAgTGlzdDxQYWNrYWdlRXhwb3J0PiB2ZXJzaW9uTWF0Y2hlZENhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0PFBhY2thZ2VFeHBvcnQ+KCk7CisgICAgICAgIGZvciAoUGFja2FnZUV4cG9ydCBleHAgOiBjYW5kaWRhdGVzKSB7CisgICAgICAgICAgICBpZiAoaW1wLmlzU2F0aXNmaWVkQnkoZXhwKSkgeworICAgICAgICAgICAgICAgIHZlcnNpb25NYXRjaGVkQ2FuZGlkYXRlcy5hZGQoZXhwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodmVyc2lvbk1hdGNoZWRDYW5kaWRhdGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIFBhY2thZ2VFeHBvcnQgd2l0aEhpZ2hlc3RWZXJzaW9uID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoUGFja2FnZUV4cG9ydCB2ZXJzaW9uTWF0Y2hlZEV4cG9ydCA6IHZlcnNpb25NYXRjaGVkQ2FuZGlkYXRlcykgeworICAgICAgICAgICAgICAgIGlmICh3aXRoSGlnaGVzdFZlcnNpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB3aXRoSGlnaGVzdFZlcnNpb24gPSB2ZXJzaW9uTWF0Y2hlZEV4cG9ydDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAod2l0aEhpZ2hlc3RWZXJzaW9uLmdldFZlcnNpb24oKS5jb21wYXJlVG8odmVyc2lvbk1hdGNoZWRFeHBvcnQuZ2V0VmVyc2lvbigpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhIaWdoZXN0VmVyc2lvbiA9IHZlcnNpb25NYXRjaGVkRXhwb3J0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHdpdGhIaWdoZXN0VmVyc2lvbi5nZXRCdW5kbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlwcml2YXRlIExpc3Q8UGFja2FnZUV4cG9ydD4gZmluZFBhY2thZ2VzV2l0aEV4YWN0TmFtZShTdHJpbmcgbmFtZSkgewotCQlMaXN0PFBhY2thZ2VFeHBvcnQ+IGV4cG9ydHMgPSBuZXcgQXJyYXlMaXN0PFBhY2thZ2VFeHBvcnQ+KCk7Ci0JCWZvciAoSUFydGVmYWN0VHlwZWQgYnVuZGxlIDogYXJ0ZWZhY3RSZXBvc2l0b3J5LmdldEJ1bmRsZXMoKSkgewotCQkJZm9yIChQYWNrYWdlRXhwb3J0IGUgOiAoKEJ1bmRsZUFydGVmYWN0KSBidW5kbGUpLmdldEV4cG9ydHMoKSkgewotCQkJCWlmIChlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJZXhwb3J0cy5hZGQoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBleHBvcnRzOwotCX0KKyAgICBwcml2YXRlIExpc3Q8UGFja2FnZUV4cG9ydD4gZmluZFBhY2thZ2VzV2l0aEV4YWN0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBMaXN0PFBhY2thZ2VFeHBvcnQ+IGV4cG9ydHMgPSBuZXcgQXJyYXlMaXN0PFBhY2thZ2VFeHBvcnQ+KCk7CisgICAgICAgIGZvciAoSUFydGVmYWN0VHlwZWQgYnVuZGxlIDogdGhpcy5hcnRlZmFjdFJlcG9zaXRvcnkuZ2V0QnVuZGxlcygpKSB7CisgICAgICAgICAgICBmb3IgKFBhY2thZ2VFeHBvcnQgZSA6ICgoQnVuZGxlQXJ0ZWZhY3QpIGJ1bmRsZSkuZ2V0RXhwb3J0cygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBleHBvcnRzLmFkZChlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4cG9ydHM7CisgICAgfQogCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyKElCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIpIHsKLQkJdGhpcy5jaGFuZ2VMaXN0ZW5lcnMuYWRkKGNoYW5nZUxpc3RlbmVyKTsKLQl9CisgICAgcHVibGljIHZvaWQgYWRkQnVuZGxlUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyKElCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIpIHsKKyAgICAgICAgdGhpcy5jaGFuZ2VMaXN0ZW5lcnMuYWRkKGNoYW5nZUxpc3RlbmVyKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCByZW1vdmVCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIoSUJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lcikgewotCQl0aGlzLmNoYW5nZUxpc3RlbmVycy5yZW1vdmUoY2hhbmdlTGlzdGVuZXIpOwotCX0KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIoSUJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lcikgeworICAgICAgICB0aGlzLmNoYW5nZUxpc3RlbmVycy5yZW1vdmUoY2hhbmdlTGlzdGVuZXIpOworICAgIH0KIAotCXByaXZhdGUgdm9pZCBmaXJlQnVuZGxlUmVwb3NpdG9yeUNoYW5nZWQoSVJ1bnRpbWUgcnVudGltZSkgewotCQlmb3IgKElCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCWNoYW5nZUxpc3RlbmVyLmJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VkKHJ1bnRpbWUpOwotCQl9Ci0JfQorICAgIHByaXZhdGUgdm9pZCBmaXJlQnVuZGxlUmVwb3NpdG9yeUNoYW5nZWQoSVJ1bnRpbWUgcnVudGltZSkgeworICAgICAgICBmb3IgKElCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiB0aGlzLmNoYW5nZUxpc3RlbmVycykgeworICAgICAgICAgICAgY2hhbmdlTGlzdGVuZXIuYnVuZGxlUmVwb3NpdG9yeUNoYW5nZWQocnVudGltZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlzdGF0aWMgY2xhc3MgSW5pdGlhbGl6ZWRCdW5kbGVEZWZpbml0aW9uIGltcGxlbWVudHMgQnVuZGxlRGVmaW5pdGlvbiB7CisgICAgc3RhdGljIGNsYXNzIEluaXRpYWxpemVkQnVuZGxlRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEJ1bmRsZURlZmluaXRpb24gewogCi0JCXByaXZhdGUgZmluYWwgVVJJIGZpbGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgVVJJIGZpbGU7CiAKLQkJcHJpdmF0ZSBmaW5hbCBCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdDsKIAotCQlwdWJsaWMgSW5pdGlhbGl6ZWRCdW5kbGVEZWZpbml0aW9uKEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0LCBVUkkgZmlsZSkgewotCQkJdGhpcy5maWxlID0gZmlsZTsKLQkJCXRoaXMubWFuaWZlc3QgPSBtYW5pZmVzdDsKLQkJfQorICAgICAgICBwdWJsaWMgSW5pdGlhbGl6ZWRCdW5kbGVEZWZpbml0aW9uKEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0LCBVUkkgZmlsZSkgeworICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgICAgIHRoaXMubWFuaWZlc3QgPSBtYW5pZmVzdDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBCdW5kbGVNYW5pZmVzdCBnZXRNYW5pZmVzdCgpIHsKLQkJCXJldHVybiBtYW5pZmVzdDsKLQkJfQorICAgICAgICBwdWJsaWMgQnVuZGxlTWFuaWZlc3QgZ2V0TWFuaWZlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5tYW5pZmVzdDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBVUkkgZ2V0TG9jYXRpb24oKSB7Ci0JCQlyZXR1cm4gZmlsZTsKLQkJfQorICAgICAgICBwdWJsaWMgVVJJIGdldExvY2F0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZTsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXN0YXRpYyBjbGFzcyBJbml0aWFsaXplZEJ1bmRsZVJlcG9zaXRvcnkgaW1wbGVtZW50cyBCdW5kbGVSZXBvc2l0b3J5IHsKKyAgICBzdGF0aWMgY2xhc3MgSW5pdGlhbGl6ZWRCdW5kbGVSZXBvc2l0b3J5IGltcGxlbWVudHMgQnVuZGxlUmVwb3NpdG9yeSB7CiAKLQkJcHJpdmF0ZSBmaW5hbCBTZXQ8QnVuZGxlRGVmaW5pdGlvbj4gYnVuZGxlczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8QnVuZGxlRGVmaW5pdGlvbj4gYnVuZGxlczsKIAotCQlwcml2YXRlIGZpbmFsIFNldDxMaWJyYXJ5RGVmaW5pdGlvbj4gbGlicmFyaWVzOworICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxMaWJyYXJ5RGVmaW5pdGlvbj4gbGlicmFyaWVzOwogCi0JCXB1YmxpYyBJbml0aWFsaXplZEJ1bmRsZVJlcG9zaXRvcnkoU2V0PEJ1bmRsZURlZmluaXRpb24+IGJ1bmRsZXMsIFNldDxMaWJyYXJ5RGVmaW5pdGlvbj4gbGlicmFyaWVzKSB7Ci0JCQl0aGlzLmJ1bmRsZXMgPSBidW5kbGVzOwotCQkJdGhpcy5saWJyYXJpZXMgPSBsaWJyYXJpZXM7Ci0JCX0KKyAgICAgICAgcHVibGljIEluaXRpYWxpemVkQnVuZGxlUmVwb3NpdG9yeShTZXQ8QnVuZGxlRGVmaW5pdGlvbj4gYnVuZGxlcywgU2V0PExpYnJhcnlEZWZpbml0aW9uPiBsaWJyYXJpZXMpIHsKKyAgICAgICAgICAgIHRoaXMuYnVuZGxlcyA9IGJ1bmRsZXM7CisgICAgICAgICAgICB0aGlzLmxpYnJhcmllcyA9IGxpYnJhcmllczsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBTZXQ8PyBleHRlbmRzIEJ1bmRsZURlZmluaXRpb24+IGZpbmRCeUV4cG9ydGVkUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIFZlcnNpb25SYW5nZSB2ZXJzaW9uUmFuZ2UpIHsKLQkJCVNldDxCdW5kbGVEZWZpbml0aW9uPiBtYXRjaGluZ0J1bmRsZXMgPSBuZXcgSGFzaFNldDxCdW5kbGVEZWZpbml0aW9uPigpOwotCQkJZm9yIChCdW5kbGVEZWZpbml0aW9uIGJ1bmRsZSA6IGJ1bmRsZXMpIHsKLQkJCQlpZiAoYnVuZGxlLmdldE1hbmlmZXN0KCkgIT0gbnVsbCAmJiBidW5kbGUuZ2V0TWFuaWZlc3QoKS5nZXRFeHBvcnRQYWNrYWdlKCkgIT0gbnVsbCkgewotCQkJCQlmb3IgKEV4cG9ydGVkUGFja2FnZSBoZWFkZXIgOiBidW5kbGUuZ2V0TWFuaWZlc3QoKS5nZXRFeHBvcnRQYWNrYWdlKCkuZ2V0RXhwb3J0ZWRQYWNrYWdlcygpKSB7Ci0JCQkJCQlpZiAodmVyc2lvblJhbmdlLmluY2x1ZGVzKGhlYWRlci5nZXRWZXJzaW9uKCkpKSB7Ci0JCQkJCQkJaWYgKHBhY2thZ2VOYW1lLmVxdWFscyhoZWFkZXIuZ2V0UGFja2FnZU5hbWUoKSkpIHsKLQkJCQkJCQkJbWF0Y2hpbmdCdW5kbGVzLmFkZChidW5kbGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtYXRjaGluZ0J1bmRsZXM7Ci0JCX0KKyAgICAgICAgcHVibGljIFNldDw/IGV4dGVuZHMgQnVuZGxlRGVmaW5pdGlvbj4gZmluZEJ5RXhwb3J0ZWRQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSwgVmVyc2lvblJhbmdlIHZlcnNpb25SYW5nZSkgeworICAgICAgICAgICAgU2V0PEJ1bmRsZURlZmluaXRpb24+IG1hdGNoaW5nQnVuZGxlcyA9IG5ldyBIYXNoU2V0PEJ1bmRsZURlZmluaXRpb24+KCk7CisgICAgICAgICAgICBmb3IgKEJ1bmRsZURlZmluaXRpb24gYnVuZGxlIDogdGhpcy5idW5kbGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZS5nZXRNYW5pZmVzdCgpICE9IG51bGwgJiYgYnVuZGxlLmdldE1hbmlmZXN0KCkuZ2V0RXhwb3J0UGFja2FnZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChFeHBvcnRlZFBhY2thZ2UgaGVhZGVyIDogYnVuZGxlLmdldE1hbmlmZXN0KCkuZ2V0RXhwb3J0UGFja2FnZSgpLmdldEV4cG9ydGVkUGFja2FnZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb25SYW5nZS5pbmNsdWRlcyhoZWFkZXIuZ2V0VmVyc2lvbigpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMoaGVhZGVyLmdldFBhY2thZ2VOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nQnVuZGxlcy5hZGQoYnVuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hpbmdCdW5kbGVzOworICAgICAgICB9CiAKLQkJcHVibGljIFNldDw/IGV4dGVuZHMgQnVuZGxlRGVmaW5pdGlvbj4gZmluZEJ5RnJhZ21lbnRIb3N0KFN0cmluZyBidW5kbGVTeW1ib2xpY05hbWUsIFZlcnNpb24gdmVyc2lvbikgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCX0KKyAgICAgICAgcHVibGljIFNldDw/IGV4dGVuZHMgQnVuZGxlRGVmaW5pdGlvbj4gZmluZEJ5RnJhZ21lbnRIb3N0KFN0cmluZyBidW5kbGVTeW1ib2xpY05hbWUsIFZlcnNpb24gdmVyc2lvbikgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgQnVuZGxlRGVmaW5pdGlvbiBmaW5kQnlTeW1ib2xpY05hbWUoU3RyaW5nIHN5bWJvbGljTmFtZSwgVmVyc2lvblJhbmdlIHZlcnNpb25SYW5nZSkgewotCQkJZm9yIChCdW5kbGVEZWZpbml0aW9uIGJ1bmRsZSA6IGJ1bmRsZXMpIHsKLQkJCQlpZiAoYnVuZGxlLmdldE1hbmlmZXN0KCkgIT0gbnVsbCAmJiBidW5kbGUuZ2V0TWFuaWZlc3QoKS5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSAhPSBudWxsCi0JCQkJCQkmJiBidW5kbGUuZ2V0TWFuaWZlc3QoKS5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKS5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMoc3ltYm9saWNOYW1lKSkgewotCQkJCQlWZXJzaW9uIHZlcnNpb24gPSBidW5kbGUuZ2V0TWFuaWZlc3QoKS5nZXRCdW5kbGVWZXJzaW9uKCk7Ci0JCQkJCWlmICh2ZXJzaW9uUmFuZ2UuaW5jbHVkZXModmVyc2lvbikpIHsKLQkJCQkJCXJldHVybiBidW5kbGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgICAgICBwdWJsaWMgQnVuZGxlRGVmaW5pdGlvbiBmaW5kQnlTeW1ib2xpY05hbWUoU3RyaW5nIHN5bWJvbGljTmFtZSwgVmVyc2lvblJhbmdlIHZlcnNpb25SYW5nZSkgeworICAgICAgICAgICAgZm9yIChCdW5kbGVEZWZpbml0aW9uIGJ1bmRsZSA6IHRoaXMuYnVuZGxlcykgeworICAgICAgICAgICAgICAgIGlmIChidW5kbGUuZ2V0TWFuaWZlc3QoKSAhPSBudWxsICYmIGJ1bmRsZS5nZXRNYW5pZmVzdCgpLmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgYnVuZGxlLmdldE1hbmlmZXN0KCkuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkuZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzKHN5bWJvbGljTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gYnVuZGxlLmdldE1hbmlmZXN0KCkuZ2V0QnVuZGxlVmVyc2lvbigpOworICAgICAgICAgICAgICAgICAgICBpZiAodmVyc2lvblJhbmdlLmluY2x1ZGVzKHZlcnNpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVuZGxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQlwdWJsaWMgTGlicmFyeURlZmluaXRpb24gZmluZExpYnJhcnkoU3RyaW5nIGxpYnJhcnlOYW1lLCBWZXJzaW9uUmFuZ2UgdmVyc2lvblJhbmdlKSB7Ci0JCQlmb3IgKExpYnJhcnlEZWZpbml0aW9uIGJ1bmRsZSA6IGxpYnJhcmllcykgewotCQkJCWlmIChidW5kbGUuZ2V0TmFtZSgpICE9IG51bGwgJiYgYnVuZGxlLmdldE5hbWUoKS5lcXVhbHMobGlicmFyeU5hbWUpKSB7Ci0JCQkJCWlmICh2ZXJzaW9uUmFuZ2UuaW5jbHVkZXMoYnVuZGxlLmdldFZlcnNpb24oKSkpIHsKLQkJCQkJCXJldHVybiBidW5kbGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgICAgICBwdWJsaWMgTGlicmFyeURlZmluaXRpb24gZmluZExpYnJhcnkoU3RyaW5nIGxpYnJhcnlOYW1lLCBWZXJzaW9uUmFuZ2UgdmVyc2lvblJhbmdlKSB7CisgICAgICAgICAgICBmb3IgKExpYnJhcnlEZWZpbml0aW9uIGJ1bmRsZSA6IHRoaXMubGlicmFyaWVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZS5nZXROYW1lKCkgIT0gbnVsbCAmJiBidW5kbGUuZ2V0TmFtZSgpLmVxdWFscyhsaWJyYXJ5TmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb25SYW5nZS5pbmNsdWRlcyhidW5kbGUuZ2V0VmVyc2lvbigpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJcHVibGljIFNldDw/IGV4dGVuZHMgQnVuZGxlRGVmaW5pdGlvbj4gZ2V0QnVuZGxlcygpIHsKLQkJCXJldHVybiBidW5kbGVzOwotCQl9CisgICAgICAgIHB1YmxpYyBTZXQ8PyBleHRlbmRzIEJ1bmRsZURlZmluaXRpb24+IGdldEJ1bmRsZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5idW5kbGVzOworICAgICAgICB9CiAKLQkJcHVibGljIFNldDw/IGV4dGVuZHMgTGlicmFyeURlZmluaXRpb24+IGdldExpYnJhcmllcygpIHsKLQkJCXJldHVybiBsaWJyYXJpZXM7Ci0JCX0KKyAgICAgICAgcHVibGljIFNldDw/IGV4dGVuZHMgTGlicmFyeURlZmluaXRpb24+IGdldExpYnJhcmllcygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmxpYnJhcmllczsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCX0KKyAgICAgICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBBcnRpZmFjdERlc2NyaXB0b3IgZmluZFN1YnN5c3RlbShTdHJpbmcgYXJnMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgcHVibGljIEFydGlmYWN0RGVzY3JpcHRvciBmaW5kU3Vic3lzdGVtKFN0cmluZyBhcmcwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCWNsYXNzIEFydGVmYWN0UmVwb3NpdG9yeVN0YXJ0Sm9iIGV4dGVuZHMgSm9iIHsKKyAgICBjbGFzcyBBcnRlZmFjdFJlcG9zaXRvcnlTdGFydEpvYiBleHRlbmRzIEpvYiB7CiAKLQkJcHJpdmF0ZSBmaW5hbCBCdW5kbGUgYnVuZGxlID0gU2VydmVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIGJ1bmRsZSA9IFNlcnZlckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpOwogCi0JCXB1YmxpYyBBcnRlZmFjdFJlcG9zaXRvcnlTdGFydEpvYigpIHsKLQkJCXN1cGVyKCJJbml0aWFsaXppbmcgQnVuZGxlIFJlcG9zaXRvcnkgSW5kZXgiKTsKLQkJfQorICAgICAgICBwdWJsaWMgQXJ0ZWZhY3RSZXBvc2l0b3J5U3RhcnRKb2IoKSB7CisgICAgICAgICAgICBzdXBlcigiSW5pdGlhbGl6aW5nIEJ1bmRsZSBSZXBvc2l0b3J5IEluZGV4Iik7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgY3JlYXRlQXJ0ZWZhY3REZXNjcmlwdG9yRnJvbUN1cnJlbnRaaXBFbnRyeShaaXBJbnB1dFN0cmVhbSB6aXBJbnB1dFN0cmVhbSwKLQkJCQlTdHJpbmcgbmV3QXJ0ZWZhY3REZXNjcmlwdG9yUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQkJRmlsZSBhcnRlZmFjdERlc2NyaXB0b3IgPSBuZXcgRmlsZShuZXdBcnRlZmFjdERlc2NyaXB0b3JQYXRoKTsKLQkJCWlmICghYXJ0ZWZhY3REZXNjcmlwdG9yLmV4aXN0cygpKSB7Ci0JCQkJYXJ0ZWZhY3REZXNjcmlwdG9yLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQlGaWxlT3V0cHV0U3RyZWFtIGZpbGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShhcnRlZmFjdERlc2NyaXB0b3IpOwotCQkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJCQlpbnQgbGVuOwotCQkJCXdoaWxlICgobGVuID0gemlwSW5wdXRTdHJlYW0ucmVhZChidWYpKSA+IDApIHsKLQkJCQkJZmlsZU91dHB1dFN0cmVhbS53cml0ZShidWYsIDAsIGxlbik7Ci0JCQkJfQotCQkJCWZpbGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlQXJ0ZWZhY3REZXNjcmlwdG9yRnJvbUN1cnJlbnRaaXBFbnRyeShaaXBJbnB1dFN0cmVhbSB6aXBJbnB1dFN0cmVhbSwgU3RyaW5nIG5ld0FydGVmYWN0RGVzY3JpcHRvclBhdGgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBGaWxlIGFydGVmYWN0RGVzY3JpcHRvciA9IG5ldyBGaWxlKG5ld0FydGVmYWN0RGVzY3JpcHRvclBhdGgpOworICAgICAgICAgICAgaWYgKCFhcnRlZmFjdERlc2NyaXB0b3IuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBhcnRlZmFjdERlc2NyaXB0b3IuY3JlYXRlTmV3RmlsZSgpOworICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZmlsZU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGFydGVmYWN0RGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgd2hpbGUgKChsZW4gPSB6aXBJbnB1dFN0cmVhbS5yZWFkKGJ1ZikpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBmaWxlT3V0cHV0U3RyZWFtLndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlsZU91dHB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUxvY2FsRm9sZGVyU3RydWN0dXJlKCkgewotCQkJRmlsZSBsb2NhbERpcmVjdG9yeSA9IGdldExvY2FsRGlyZWN0b3J5KCk7Ci0JCQlQdWJsaXNoVXRpbC5kZWxldGVEaXJlY3RvcnkobG9jYWxEaXJlY3RvcnksIG51bGwpOwotCQkJaWYgKCFsb2NhbERpcmVjdG9yeS5leGlzdHMoKSkgewotCQkJCWxvY2FsRGlyZWN0b3J5Lm1rZGlyKCk7Ci0JCQkJbmV3IEZpbGUobG9jYWxEaXJlY3RvcnksICJidW5kbGVzIikubWtkaXJzKCk7Ci0JCQkJbmV3IEZpbGUobG9jYWxEaXJlY3RvcnksICJsaWJyYXJpZXMiKS5ta2RpcnMoKTsKLQkJCX0KLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlTG9jYWxGb2xkZXJTdHJ1Y3R1cmUoKSB7CisgICAgICAgICAgICBGaWxlIGxvY2FsRGlyZWN0b3J5ID0gZ2V0TG9jYWxEaXJlY3RvcnkoKTsKKyAgICAgICAgICAgIFB1Ymxpc2hVdGlsLmRlbGV0ZURpcmVjdG9yeShsb2NhbERpcmVjdG9yeSwgbnVsbCk7CisgICAgICAgICAgICBpZiAoIWxvY2FsRGlyZWN0b3J5LmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgbG9jYWxEaXJlY3RvcnkubWtkaXIoKTsKKyAgICAgICAgICAgICAgICBuZXcgRmlsZShsb2NhbERpcmVjdG9yeSwgImJ1bmRsZXMiKS5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICBuZXcgRmlsZShsb2NhbERpcmVjdG9yeSwgImxpYnJhcmllcyIpLm1rZGlycygpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIEZpbGUgZ2V0TG9jYWxEaXJlY3RvcnkoKSB7Ci0JCQlJUGF0aCBwYXRoID0gUGxhdGZvcm0uZ2V0U3RhdGVMb2NhdGlvbihidW5kbGUpOwotCQkJcmV0dXJuIG5ldyBGaWxlKHBhdGgudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgInJlcG9zaXRvcnkiKTsKLQkJfQorICAgICAgICBwcm90ZWN0ZWQgRmlsZSBnZXRMb2NhbERpcmVjdG9yeSgpIHsKKyAgICAgICAgICAgIElQYXRoIHBhdGggPSBQbGF0Zm9ybS5nZXRTdGF0ZUxvY2F0aW9uKHRoaXMuYnVuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShwYXRoLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArICJyZXBvc2l0b3J5Iik7CisgICAgICAgIH0KIAotCQlwcml2YXRlIEZpbGUgZ2V0UmVwb3NpdG9yeUluZGV4RmlsZSgpIHsKLQkJCXJldHVybiBuZXcgRmlsZShnZXRMb2NhbERpcmVjdG9yeSgpLCAiLmluZGV4Iik7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBGaWxlIGdldFJlcG9zaXRvcnlJbmRleEZpbGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoZ2V0TG9jYWxEaXJlY3RvcnkoKSwgIi5pbmRleCIpOworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVBcmNoaXZlQ29udGVudHNUb0xvY2FsUmVzcG9zaXRvcnlEaXJlY3RvcnkoSW5wdXRTdHJlYW0gemlwRmlsZUlucHV0U3RyZWFtKQotCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCS8vIGNsZWFuIGZvbGRlcgotCQkJY3JlYXRlTG9jYWxGb2xkZXJTdHJ1Y3R1cmUoKTsKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVBcmNoaXZlQ29udGVudHNUb0xvY2FsUmVzcG9zaXRvcnlEaXJlY3RvcnkoSW5wdXRTdHJlYW0gemlwRmlsZUlucHV0U3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBjbGVhbiBmb2xkZXIKKyAgICAgICAgICAgIGNyZWF0ZUxvY2FsRm9sZGVyU3RydWN0dXJlKCk7CiAKLQkJCVppcElucHV0U3RyZWFtIHppcElucHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJemlwSW5wdXRTdHJlYW0gPSBuZXcgWmlwSW5wdXRTdHJlYW0oemlwRmlsZUlucHV0U3RyZWFtKTsKLQkJCQlaaXBFbnRyeSBjdXJyZW50WmlwRW50cnkgPSB6aXBJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKTsKKyAgICAgICAgICAgIFppcElucHV0U3RyZWFtIHppcElucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgemlwSW5wdXRTdHJlYW0gPSBuZXcgWmlwSW5wdXRTdHJlYW0oemlwRmlsZUlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICBaaXBFbnRyeSBjdXJyZW50WmlwRW50cnkgPSB6aXBJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKTsKIAotCQkJCXdoaWxlIChjdXJyZW50WmlwRW50cnkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZmlsZVBhdGggPSBnZXRMb2NhbERpcmVjdG9yeSgpLmdldFBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgY3VycmVudFppcEVudHJ5LmdldE5hbWUoKTsKLQkJCQkJY3JlYXRlQXJ0ZWZhY3REZXNjcmlwdG9yRnJvbUN1cnJlbnRaaXBFbnRyeSh6aXBJbnB1dFN0cmVhbSwgZmlsZVBhdGgpOwotCQkJCQljdXJyZW50WmlwRW50cnkgPSB6aXBJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKTsKLQkJCQl9CisgICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRaaXBFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IGdldExvY2FsRGlyZWN0b3J5KCkuZ2V0UGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBjdXJyZW50WmlwRW50cnkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBjcmVhdGVBcnRlZmFjdERlc2NyaXB0b3JGcm9tQ3VycmVudFppcEVudHJ5KHppcElucHV0U3RyZWFtLCBmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRaaXBFbnRyeSA9IHppcElucHV0U3RyZWFtLmdldE5leHRFbnRyeSgpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCXppcElucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RhdHVzVXRpbC5lcnJvcihlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHppcElucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQkJCXppcElucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN0YXR1c1V0aWwuZXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgemlwSW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNVdGlsLmVycm9yKGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoemlwSW5wdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgemlwSW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzVXRpbC5lcnJvcihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwcm90ZWN0ZWQgSUFydGVmYWN0UmVwb3NpdG9yeUxvYWRlciBjcmVhdGVBcnRlZmFjdFJlc3Bvc2l0b3J5TG9hZGVyKCkgewotCQkJcmV0dXJuIG5ldyBKc29uQXJ0ZWZhY3RSZXBvc2l0b3J5TG9hZGVyKCk7Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIElBcnRlZmFjdFJlcG9zaXRvcnlMb2FkZXIgY3JlYXRlQXJ0ZWZhY3RSZXNwb3NpdG9yeUxvYWRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSnNvbkFydGVmYWN0UmVwb3NpdG9yeUxvYWRlcigpOworICAgICAgICB9CiAKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQl0cnkgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKyAgICAgICAgICAgIHRyeSB7CiAKLQkJCQkvLyBmaXJzdGx5IG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgdGhlIHJlcG9zaXRvcnkgaW4gdGhlIGluIHRoZQotCQkJCS8vIHdvcmtzcGFjZQotCQkJCUVudW1lcmF0aW9uPFVSTD4gdXJscyA9IGJ1bmRsZS5maW5kRW50cmllcygiL2luZGV4IiwgInJlcG9zaXRvcnktKi56aXAiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgLy8gZmlyc3RseSBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHRoZSByZXBvc2l0b3J5IGluIHRoZSBpbiB0aGUKKyAgICAgICAgICAgICAgICAvLyB3b3Jrc3BhY2UKKyAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbjxVUkw+IHVybHMgPSB0aGlzLmJ1bmRsZS5maW5kRW50cmllcygiL2luZGV4IiwgInJlcG9zaXRvcnktKi56aXAiLCBmYWxzZSk7CiAKLQkJCQkvLyB3ZSB3aWxsIG9ubHkgYnVuZGxlIG9uZSByZXBvc2l0b3J5IHppcCBpbiB0aGUgcGx1Z2luIHNvIGl0IGlzCi0JCQkJLy8gc2FmZSB0byB0YWtlIHRoZQotCQkJCS8vIGZpcnN0IGVsZW1lbnQKLQkJCQlpZiAodXJscy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQlVUkwgdXJsID0gdXJscy5uZXh0RWxlbWVudCgpOwotCQkJCQlpZiAoIWdldFJlcG9zaXRvcnlJbmRleEZpbGUoKS5leGlzdHMoKSkgewotCQkJCQkJd3JpdGVBcmNoaXZlQ29udGVudHNUb0xvY2FsUmVzcG9zaXRvcnlEaXJlY3RvcnkodXJsLm9wZW5TdHJlYW0oKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBDaGVjayBpZiB0aGUgdGltZXN0YW1wIG9uIHRoZSBidW5kbGVkIHJlcG9zaXRvcnkgaXMKLQkJCQkJCS8vIG5ld2VyIHRoYW4gdGhlCi0JCQkJCQkvLyBleHRyYWN0ZWQKLQkJCQkJCVN0cmluZyBwYXRoID0gdXJsLmdldEZpbGUoKTsKLQkJCQkJCWludCBpeCA9IHBhdGgubGFzdEluZGV4T2YoInJlcG9zaXRvcnktIik7Ci0JCQkJCQlMb25nIHRpbWVzdGFtcCA9IExvbmcudmFsdWVPZihwYXRoLnN1YnN0cmluZyhpeCArIDExLCBwYXRoLmxlbmd0aCgpIC0gNCkpOwotCQkJCQkJTG9uZyBsb2NhbFRpbWVzdGFtcCA9IGdldExvY2FsUmVwb3NpdG9yeVRpbWVzdGFtcCgpOwotCQkJCQkJaWYgKHRpbWVzdGFtcC5jb21wYXJlVG8obG9jYWxUaW1lc3RhbXApID09IDEpIHsKLQkJCQkJCQl3cml0ZUFyY2hpdmVDb250ZW50c1RvTG9jYWxSZXNwb3NpdG9yeURpcmVjdG9yeSh1cmwub3BlblN0cmVhbSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KKyAgICAgICAgICAgICAgICAvLyB3ZSB3aWxsIG9ubHkgYnVuZGxlIG9uZSByZXBvc2l0b3J5IHppcCBpbiB0aGUgcGx1Z2luIHNvIGl0IGlzCisgICAgICAgICAgICAgICAgLy8gc2FmZSB0byB0YWtlIHRoZQorICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVsZW1lbnQKKyAgICAgICAgICAgICAgICBpZiAodXJscy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBVUkwgdXJsID0gdXJscy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWdldFJlcG9zaXRvcnlJbmRleEZpbGUoKS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVBcmNoaXZlQ29udGVudHNUb0xvY2FsUmVzcG9zaXRvcnlEaXJlY3RvcnkodXJsLm9wZW5TdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdGltZXN0YW1wIG9uIHRoZSBidW5kbGVkIHJlcG9zaXRvcnkgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld2VyIHRoYW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRyYWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gdXJsLmdldEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpeCA9IHBhdGgubGFzdEluZGV4T2YoInJlcG9zaXRvcnktIik7CisgICAgICAgICAgICAgICAgICAgICAgICBMb25nIHRpbWVzdGFtcCA9IExvbmcudmFsdWVPZihwYXRoLnN1YnN0cmluZyhpeCArIDExLCBwYXRoLmxlbmd0aCgpIC0gNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgTG9uZyBsb2NhbFRpbWVzdGFtcCA9IGdldExvY2FsUmVwb3NpdG9yeVRpbWVzdGFtcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcC5jb21wYXJlVG8obG9jYWxUaW1lc3RhbXApID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUFyY2hpdmVDb250ZW50c1RvTG9jYWxSZXNwb3NpdG9yeURpcmVjdG9yeSh1cmwub3BlblN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KIAotCQkJCWluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLnRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlOwogCi0JCQkJLy8gc2Vjb25kbHkgbG9hZCB0aGUgcmVwb3NpdG9yeSBpbiBtZW1vcnkKLQkJCQlBcnRlZmFjdFJlcG9zaXRvcnkgbmV3QXJ0ZWZhY3RSZXBvc2l0b3J5ID0gY3JlYXRlQXJ0ZWZhY3RSZXNwb3NpdG9yeUxvYWRlcigpLmxvYWRBcnRlZmFjdFJlcG9zaXRvcnkoCi0JCQkJCQlnZXRMb2NhbERpcmVjdG9yeSgpKTsKLQkJCQl0cnkgewotCQkJCQl3LmxvY2soKTsKLQkJCQkJYXJ0ZWZhY3RSZXBvc2l0b3J5ID0gbmV3QXJ0ZWZhY3RSZXBvc2l0b3J5OwotCQkJCQlyZXBvc2l0b3J5RGF0ZSA9IG5ldyBEYXRlKGdldExvY2FsUmVwb3NpdG9yeVRpbWVzdGFtcCgpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl3LnVubG9jaygpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RhdHVzVXRpbC5lcnJvcihlKTsKLQkJCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCQkJYXJ0ZWZhY3RSZXBvc2l0b3J5ID0gbmV3IEFydGVmYWN0UmVwb3NpdG9yeSgpOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KKyAgICAgICAgICAgICAgICAvLyBzZWNvbmRseSBsb2FkIHRoZSByZXBvc2l0b3J5IGluIG1lbW9yeQorICAgICAgICAgICAgICAgIEFydGVmYWN0UmVwb3NpdG9yeSBuZXdBcnRlZmFjdFJlcG9zaXRvcnkgPSBjcmVhdGVBcnRlZmFjdFJlc3Bvc2l0b3J5TG9hZGVyKCkubG9hZEFydGVmYWN0UmVwb3NpdG9yeShnZXRMb2NhbERpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3LmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlci50aGlzLmFydGVmYWN0UmVwb3NpdG9yeSA9IG5ld0FydGVmYWN0UmVwb3NpdG9yeTsKKyAgICAgICAgICAgICAgICAgICAgQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlci50aGlzLnJlcG9zaXRvcnlEYXRlID0gbmV3IERhdGUoZ2V0TG9jYWxSZXBvc2l0b3J5VGltZXN0YW1wKCkpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHcudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNVdGlsLmVycm9yKGUpOworICAgICAgICAgICAgICAgIEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIudGhpcy5pbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICAgICAgQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlci50aGlzLmFydGVmYWN0UmVwb3NpdG9yeSA9IG5ldyBBcnRlZmFjdFJlcG9zaXRvcnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgICAgICB9CiAKLQkJcHJvdGVjdGVkIExvbmcgZ2V0TG9jYWxSZXBvc2l0b3J5VGltZXN0YW1wKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotCQkJRmlsZUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGdldFJlcG9zaXRvcnlJbmRleEZpbGUoKSk7Ci0JCQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQlwcm9wZXJ0aWVzLmxvYWQoaXMpOwotCQkJCUxvbmcgbG9jYWxUaW1lc3RhbXAgPSBMb25nLnZhbHVlT2YocHJvcGVydGllcy5nZXRQcm9wZXJ0eSgiY3JlYXRpb24udGltZXN0YW1wIikpOwotCQkJCXJldHVybiBsb2NhbFRpbWVzdGFtcDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIExvbmcgZ2V0TG9jYWxSZXBvc2l0b3J5VGltZXN0YW1wKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlzID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGdldFJlcG9zaXRvcnlJbmRleEZpbGUoKSk7CisgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmxvYWQoaXMpOworICAgICAgICAgICAgICAgIExvbmcgbG9jYWxUaW1lc3RhbXAgPSBMb25nLnZhbHVlT2YocHJvcGVydGllcy5nZXRQcm9wZXJ0eSgiY3JlYXRpb24udGltZXN0YW1wIikpOworICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFRpbWVzdGFtcDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgY2xhc3MgQXJ0ZWZhY3RSZXBvc2l0b3J5VXBkYXRlSm9iIGV4dGVuZHMgQXJ0ZWZhY3RSZXBvc2l0b3J5U3RhcnRKb2IgeworICAgIHB1YmxpYyBjbGFzcyBBcnRlZmFjdFJlcG9zaXRvcnlVcGRhdGVKb2IgZXh0ZW5kcyBBcnRlZmFjdFJlcG9zaXRvcnlTdGFydEpvYiB7CiAKLQkJLyoqCi0JCSAqIFRoZSB1cmwgdW5kZXIgd2hpY2ggdGhlIG5ld2VzdCB2ZXJzaW9uIG9mIHRoZSByZXBvc2l0b3J5IGluZGV4IHdpbGwgYmUgcHVibGlzaGVkCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9JTkRFWF9VUkwgPSAiaHR0cDovL3N0YXRpYy5zcHJpbmdzb3VyY2UuY29tL3Byb2plY3RzL3N0cy1kbS1zZXJ2ZXIvaW5kZXgvcmVwb3NpdG9yeS56aXAiOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVybCB1bmRlciB3aGljaCB0aGUgbmV3ZXN0IHZlcnNpb24gb2YgdGhlIHJlcG9zaXRvcnkgaW5kZXggd2lsbCBiZSBwdWJsaXNoZWQKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPU0lUT1JZX0lOREVYX1VSTCA9ICJodHRwOi8vc3RhdGljLnNwcmluZ3NvdXJjZS5jb20vcHJvamVjdHMvc3RzLWRtLXNlcnZlci9pbmRleC9yZXBvc2l0b3J5LnppcCI7CiAKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAotCQkJdHJ5IHsKLQkJCQkvLyBmaXJzdCBkb3dubG9hZCBmaWxlIGZyb20gdGhlIG9ubGluZSByZXBvc2l0b3J5Ci0JCQkJRGF0ZSBsYXN0TW9kaWZpZWREYXRlID0gV2ViRG93bmxvYWRVdGlscy5nZXRMYXN0TW9kaWZpZWREYXRlKFJFUE9TSVRPUllfSU5ERVhfVVJMLCBtb25pdG9yKTsKLQkJCQlpZiAobGFzdE1vZGlmaWVkRGF0ZSAhPSBudWxsCi0JCQkJCQkmJiBMb25nLnZhbHVlT2YobGFzdE1vZGlmaWVkRGF0ZS5nZXRUaW1lKCkpLmNvbXBhcmVUbyhnZXRMb2NhbFJlcG9zaXRvcnlUaW1lc3RhbXAoKSkgPT0gMSkgewotCQkJCQlGaWxlIHJlcG9zaXRvcnlBcmNoaXZlID0gV2ViRG93bmxvYWRVdGlscy5kb3dubG9hZEZpbGUoUkVQT1NJVE9SWV9JTkRFWF9VUkwsCi0JCQkJCQkJZ2V0TG9jYWxEaXJlY3RvcnkoKS5nZXRQYXJlbnRGaWxlKCksIG1vbml0b3IpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBmaXJzdCBkb3dubG9hZCBmaWxlIGZyb20gdGhlIG9ubGluZSByZXBvc2l0b3J5CisgICAgICAgICAgICAgICAgRGF0ZSBsYXN0TW9kaWZpZWREYXRlID0gV2ViRG93bmxvYWRVdGlscy5nZXRMYXN0TW9kaWZpZWREYXRlKFJFUE9TSVRPUllfSU5ERVhfVVJMLCBtb25pdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdE1vZGlmaWVkRGF0ZSAhPSBudWxsICYmIExvbmcudmFsdWVPZihsYXN0TW9kaWZpZWREYXRlLmdldFRpbWUoKSkuY29tcGFyZVRvKGdldExvY2FsUmVwb3NpdG9yeVRpbWVzdGFtcCgpKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgcmVwb3NpdG9yeUFyY2hpdmUgPSBXZWJEb3dubG9hZFV0aWxzLmRvd25sb2FkRmlsZShSRVBPU0lUT1JZX0lOREVYX1VSTCwgZ2V0TG9jYWxEaXJlY3RvcnkoKS5nZXRQYXJlbnRGaWxlKCksIG1vbml0b3IpOwogCi0JCQkJCWlmIChyZXBvc2l0b3J5QXJjaGl2ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5QXJjaGl2ZSAhPSBudWxsKSB7CiAKLQkJCQkJCS8vIHNlY29uZGx5IGV4dHJhY3QgaXQgdG8gdGhlIGxvY2FsIHJlcG9zaXRvcnkgbG9jYXRpb24KLQkJCQkJCWlmIChyZXBvc2l0b3J5QXJjaGl2ZS5leGlzdHMoKSAmJiByZXBvc2l0b3J5QXJjaGl2ZS5jYW5SZWFkKCkpIHsKLQkJCQkJCQlGaWxlSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyZXBvc2l0b3J5QXJjaGl2ZSk7Ci0JCQkJCQkJCXdyaXRlQXJjaGl2ZUNvbnRlbnRzVG9Mb2NhbFJlc3Bvc2l0b3J5RGlyZWN0b3J5KGlzKTsKLQkJCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlpcy5jbG9zZSgpOwotCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBpZ25vcmUKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlY29uZGx5IGV4dHJhY3QgaXQgdG8gdGhlIGxvY2FsIHJlcG9zaXRvcnkgbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5QXJjaGl2ZS5leGlzdHMoKSAmJiByZXBvc2l0b3J5QXJjaGl2ZS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaXMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShyZXBvc2l0b3J5QXJjaGl2ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQXJjaGl2ZUNvbnRlbnRzVG9Mb2NhbFJlc3Bvc2l0b3J5RGlyZWN0b3J5KGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJCQkJLy8gdGhpcmRseSBsb2FkIHRoZSByZXBvc2l0b3J5IGluIG1lbW9yeQotCQkJCQkJQXJ0ZWZhY3RSZXBvc2l0b3J5IG5ld0FydGVmYWN0UmVwb3NpdG9yeSA9IGNyZWF0ZUFydGVmYWN0UmVzcG9zaXRvcnlMb2FkZXIoKS5sb2FkQXJ0ZWZhY3RSZXBvc2l0b3J5KAotCQkJCQkJCQlnZXRMb2NhbERpcmVjdG9yeSgpKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdy5sb2NrKCk7Ci0JCQkJCQkJYXJ0ZWZhY3RSZXBvc2l0b3J5ID0gbmV3QXJ0ZWZhY3RSZXBvc2l0b3J5OwotCQkJCQkJCXJlcG9zaXRvcnlEYXRlID0gbmV3IERhdGUoZ2V0TG9jYWxSZXBvc2l0b3J5VGltZXN0YW1wKCkpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQl3LnVubG9jaygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlTdGF0dXNVdGlsLmVycm9yKGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVN0YXR1c1V0aWwuZXJyb3IoZSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlTdGF0dXNVdGlsLmVycm9yKGUpOwotCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcmRseSBsb2FkIHRoZSByZXBvc2l0b3J5IGluIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgQXJ0ZWZhY3RSZXBvc2l0b3J5IG5ld0FydGVmYWN0UmVwb3NpdG9yeSA9IGNyZWF0ZUFydGVmYWN0UmVzcG9zaXRvcnlMb2FkZXIoKS5sb2FkQXJ0ZWZhY3RSZXBvc2l0b3J5KGdldExvY2FsRGlyZWN0b3J5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLnRoaXMuYXJ0ZWZhY3RSZXBvc2l0b3J5ID0gbmV3QXJ0ZWZhY3RSZXBvc2l0b3J5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIudGhpcy5yZXBvc2l0b3J5RGF0ZSA9IG5ldyBEYXRlKGdldExvY2FsUmVwb3NpdG9yeVRpbWVzdGFtcCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzVXRpbC5lcnJvcihlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNVdGlsLmVycm9yKGUpOworICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzVXRpbC5lcnJvcihlKTsKKyAgICAgICAgICAgIH0KIAotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICAgICAgfQorICAgIH0KIAotCS8vVE9ETyB3aHkgaXMgdGhpcyBoZXJlPwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGNvbnZlcnQoU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBuZXdTdHJpbmcgPSBuZXcgU3RyaW5nKHN0cmluZyk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3U3RyaW5nLmdldEJ5dGVzKCJVVEYtOCIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKLQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAiQ291bGRuJ3QgY29udmVydCBzdHJpbmcuIiwgZSkpOwotCQkJcmV0dXJuIHN0cmluZy5nZXRCeXRlcygpOwotCQl9Ci0JfQorICAgIC8vIFRPRE8gd2h5IGlzIHRoaXMgaGVyZT8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBjb252ZXJ0KFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgaWYgKHN0cmluZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbmV3U3RyaW5nID0gbmV3IFN0cmluZyhzdHJpbmcpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ld1N0cmluZy5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAiQ291bGRuJ3QgY29udmVydCBzdHJpbmcuIiwgZSkpOworICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5nZXRCeXRlcygpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvQXJ0ZWZhY3RTZXQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0FydGVmYWN0U2V0LmphdmEKaW5kZXggNDM0ZTcyZC4uNDM2Nzc5ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvQXJ0ZWZhY3RTZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9BcnRlZmFjdFNldC5qYXZhCkBAIC0xOSw2NyArMTksNjYgQEAKIAogLyoqCiAgKiBTYWZlbHkgZW5jYXBzdWxhdGVzIGFydGVmYWN0IGludGVyYWN0aW9ucy4KLSAqIAorICoKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCiAgKi8KIHB1YmxpYyBjbGFzcyBBcnRlZmFjdFNldCBpbXBsZW1lbnRzIElBcnRlZmFjdFR5cGVkIHsKIAotCXByaXZhdGUgZmluYWwgQXJ0ZWZhY3RUeXBlIGFydGVmYWN0VHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIEFydGVmYWN0VHlwZSBhcnRlZmFjdFR5cGU7CiAKLQlwcml2YXRlIGZpbmFsIFNldDxJQXJ0ZWZhY3Q+IGFydGVmYWN0cyA9IG5ldyBIYXNoU2V0PElBcnRlZmFjdD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxJQXJ0ZWZhY3Q+IGFydGVmYWN0cyA9IG5ldyBIYXNoU2V0PElBcnRlZmFjdD4oKTsKIAotCXByaXZhdGUgZmluYWwgQXJ0ZWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBBcnRlZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeTsKIAotCXB1YmxpYyBBcnRlZmFjdFNldChBcnRlZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgQXJ0ZWZhY3RUeXBlIGFydGVmYWN0VHlwZSkgewotCQl0aGlzLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwotCQl0aGlzLmFydGVmYWN0VHlwZSA9IGFydGVmYWN0VHlwZTsKLQl9CisgICAgcHVibGljIEFydGVmYWN0U2V0KEFydGVmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5LCBBcnRlZmFjdFR5cGUgYXJ0ZWZhY3RUeXBlKSB7CisgICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7CisgICAgICAgIHRoaXMuYXJ0ZWZhY3RUeXBlID0gYXJ0ZWZhY3RUeXBlOworICAgIH0KIAotCXB1YmxpYyBJdGVyYWJsZTxJQXJ0ZWZhY3Q+IGdldEFydGVmYWN0cygpIHsKLQkJcmV0dXJuIGFydGVmYWN0czsKLQl9CisgICAgcHVibGljIEl0ZXJhYmxlPElBcnRlZmFjdD4gZ2V0QXJ0ZWZhY3RzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hcnRlZmFjdHM7CisgICAgfQogCi0JcHVibGljIElBcnRlZmFjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiBhcnRlZmFjdHMudG9BcnJheShuZXcgSUFydGVmYWN0W10ge30pOwotCX0KKyAgICBwdWJsaWMgSUFydGVmYWN0W10gdG9BcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYXJ0ZWZhY3RzLnRvQXJyYXkobmV3IElBcnRlZmFjdFtdIHt9KTsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBhZGQoSUFydGVmYWN0IGFydGVmYWN0KSB7Ci0JCUFzc2VydC5pc05vdE51bGwoYXJ0ZWZhY3QsICJUcmllZCB0byBhZGQgbnVsbCBhcnRlZmFjdC4iKTsKLQkJaWYgKGFydGVmYWN0LmdldEFydGVmYWN0VHlwZSgpID09IGFydGVmYWN0VHlwZSB8fCBhcnRlZmFjdFR5cGUgPT0gQXJ0ZWZhY3RUeXBlLkNPTUJJTkVEKSB7Ci0JCQlhcnRlZmFjdC5zZXRTZXQodGhpcyk7Ci0JCQlyZXR1cm4gYXJ0ZWZhY3RzLmFkZChhcnRlZmFjdCk7Ci0JCX0KLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRyaWVkIHRvIGFkZCBub24tbWF0Y2hpbmcgYXJ0ZWZhY3QgdG8gIiArIGFydGVmYWN0VHlwZS5uYW1lKCkgKyAiOiAiICsgYXJ0ZWZhY3QpOwotCX0KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGQoSUFydGVmYWN0IGFydGVmYWN0KSB7CisgICAgICAgIEFzc2VydC5pc05vdE51bGwoYXJ0ZWZhY3QsICJUcmllZCB0byBhZGQgbnVsbCBhcnRlZmFjdC4iKTsKKyAgICAgICAgaWYgKGFydGVmYWN0LmdldEFydGVmYWN0VHlwZSgpID09IHRoaXMuYXJ0ZWZhY3RUeXBlIHx8IHRoaXMuYXJ0ZWZhY3RUeXBlID09IEFydGVmYWN0VHlwZS5DT01CSU5FRCkgeworICAgICAgICAgICAgYXJ0ZWZhY3Quc2V0U2V0KHRoaXMpOworICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJ0ZWZhY3RzLmFkZChhcnRlZmFjdCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRyaWVkIHRvIGFkZCBub24tbWF0Y2hpbmcgYXJ0ZWZhY3QgdG8gIiArIHRoaXMuYXJ0ZWZhY3RUeXBlLm5hbWUoKSArICI6ICIgKyBhcnRlZmFjdCk7CisgICAgfQogCi0JcHVibGljIEFydGVmYWN0VHlwZSBnZXRBcnRlZmFjdFR5cGUoKSB7Ci0JCXJldHVybiBhcnRlZmFjdFR5cGU7Ci0JfQorICAgIHB1YmxpYyBBcnRlZmFjdFR5cGUgZ2V0QXJ0ZWZhY3RUeXBlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hcnRlZmFjdFR5cGU7CisgICAgfQogCi0JcHVibGljIEFydGVmYWN0UmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgewotCQlyZXR1cm4gcmVwb3NpdG9yeTsKLQl9CisgICAgcHVibGljIEFydGVmYWN0UmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZXBvc2l0b3J5OworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGFydGVmYWN0VHlwZS5nZXRQbHVyYWxMYWJlbCgpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFydGVmYWN0VHlwZS5nZXRQbHVyYWxMYWJlbCgpOworICAgIH0KIAotCS8qKgotCSAqIEFzc3VtZXMgdGhhdCB0aGVyZSBpcyBvbmUgYW5kIG9ubHkgb25lIGFydGVmYWN0IHNldCBvZiBhIGdpdmVuIHR5cGUgZm9yIGVhY2ggc2V0LgotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0ZWZhY3RTZXQpIHsKLQkJCUFydGVmYWN0U2V0IHNldCA9IChBcnRlZmFjdFNldCkgb2JqOwotCQkJcmV0dXJuIChnZXRBcnRlZmFjdFR5cGUoKSA9PSBzZXQuZ2V0QXJ0ZWZhY3RUeXBlKCkgJiYgT2JqZWN0VXRpbHMuZXF1YWxzKGdldFJlcG9zaXRvcnkoKSwKLQkJCQkJc2V0LmdldFJlcG9zaXRvcnkoKSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lcXVhbHMob2JqKTsKLQl9CisgICAgLyoqCisgICAgICogQXNzdW1lcyB0aGF0IHRoZXJlIGlzIG9uZSBhbmQgb25seSBvbmUgYXJ0ZWZhY3Qgc2V0IG9mIGEgZ2l2ZW4gdHlwZSBmb3IgZWFjaCBzZXQuCisgICAgICoKKyAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEFydGVmYWN0U2V0KSB7CisgICAgICAgICAgICBBcnRlZmFjdFNldCBzZXQgPSAoQXJ0ZWZhY3RTZXQpIG9iajsKKyAgICAgICAgICAgIHJldHVybiBnZXRBcnRlZmFjdFR5cGUoKSA9PSBzZXQuZ2V0QXJ0ZWZhY3RUeXBlKCkgJiYgT2JqZWN0VXRpbHMuZXF1YWxzKGdldFJlcG9zaXRvcnkoKSwgc2V0LmdldFJlcG9zaXRvcnkoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0FydGVmYWN0VHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvQXJ0ZWZhY3RUeXBlLmphdmEKaW5kZXggNzg0ZWVhMS4uNjExNmY1YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvQXJ0ZWZhY3RUeXBlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvQXJ0ZWZhY3RUeXBlLmphdmEKQEAgLTEzLDMzICsxMywzNCBAQAogCiAvKioKICAqIFR5cGVzIG9mIGFydGVmYWN0cyB0aGF0IG1pZ2h0IGV4aXN0IHdpdGhpbiBhIHJlcG9zaXRvcnkuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgotICogCisgKgogICovCiBwdWJsaWMgZW51bSBBcnRlZmFjdFR5cGUgewotCUJVTkRMRSgiQnVuZGxlIiwgIkJ1bmRsZXMiLCAyKSwgTElCUkFSWSgiTGlicmFyeSIsICJMaWJyYXJpZXMiLCAzKSwgQ09NQklORUQoIkxpYnJhcnkgT3IgQnVuZGxlIiwKLQkJCSJMaWJyYXJpZXMgYW5kIEJ1bmRsZXMiLCAxKTsKKyAgICBCVU5ETEUoIkJ1bmRsZSIsICJCdW5kbGVzIiwgMiksIExJQlJBUlkoIkxpYnJhcnkiLCAiTGlicmFyaWVzIiwgMyksIENPTUJJTkVEKCJMaWJyYXJ5IE9yIEJ1bmRsZSIsICJMaWJyYXJpZXMgYW5kIEJ1bmRsZXMiLCAxKTsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgZmluYWwgaW50IG9yZGVyaW5nOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHBsdXJhbExhYmVsOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxhYmVsOwogCi0JQXJ0ZWZhY3RUeXBlKFN0cmluZyBsYWJlbCwgU3RyaW5nIHBsdXJhbExhYmVsLCBpbnQgb3JkZXJpbmcpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLnBsdXJhbExhYmVsID0gcGx1cmFsTGFiZWw7Ci0JCXRoaXMub3JkZXJpbmcgPSBvcmRlcmluZzsKLQl9CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgb3JkZXJpbmc7CiAKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBsdXJhbExhYmVsOwogCi0JcHVibGljIFN0cmluZyBnZXRQbHVyYWxMYWJlbCgpIHsKLQkJcmV0dXJuIHBsdXJhbExhYmVsOwotCX0KKyAgICBBcnRlZmFjdFR5cGUoU3RyaW5nIGxhYmVsLCBTdHJpbmcgcGx1cmFsTGFiZWwsIGludCBvcmRlcmluZykgeworICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7CisgICAgICAgIHRoaXMucGx1cmFsTGFiZWwgPSBwbHVyYWxMYWJlbDsKKyAgICAgICAgdGhpcy5vcmRlcmluZyA9IG9yZGVyaW5nOworICAgIH0KIAotCXB1YmxpYyBpbnQgZ2V0T3JkZXJpbmcoKSB7Ci0JCXJldHVybiBvcmRlcmluZzsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGFiZWw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQbHVyYWxMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGx1cmFsTGFiZWw7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRPcmRlcmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMub3JkZXJpbmc7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvQnVuZGxlQXJ0ZWZhY3QuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0J1bmRsZUFydGVmYWN0LmphdmEKaW5kZXggZmIyNmI1OS4uZDNiM2FkZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvQnVuZGxlQXJ0ZWZhY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9CdW5kbGVBcnRlZmFjdC5qYXZhCkBAIC00LDEwICs0LDExIEBACiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCisgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMTksMTM3ICsyMCwxMzEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uUGFja2FnZUltcG9ydDsKIAogLyoqCi0gKiBDZW50cmFsIGVsZW1lbnQgaW4gdGhlIGRvbWFpbiBtb2RlbCAtIGNhcHR1cmVzIGV2ZXJ5dGhpbmcgd2Uga25vdyBhYm91dCBhCi0gKiBidW5kbGUuIFRoaXMgaW5jbHVkZXMgbWV0YS1kYXRhIGRpcmVjdGx5IGF2YWlsYWJsZSBpbiB0aGUgYnVuZGxlLCBhcyB3ZWxsIGFzCi0gKiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIGxpY2Vuc2UgYW5kIGFueSBub3RlcyB3ZSB3YW50IHRvIGRpc3BsYXkKLSAqIGluIHRoZSBCUklUUyB3ZWIgYXBwbGljYXRpb24KLSAqIAorICogQ2VudHJhbCBlbGVtZW50IGluIHRoZSBkb21haW4gbW9kZWwgLSBjYXB0dXJlcyBldmVyeXRoaW5nIHdlIGtub3cgYWJvdXQgYSBidW5kbGUuIFRoaXMgaW5jbHVkZXMgbWV0YS1kYXRhIGRpcmVjdGx5CisgKiBhdmFpbGFibGUgaW4gdGhlIGJ1bmRsZSwgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIGxpY2Vuc2UgYW5kIGFueSBub3RlcyB3ZSB3YW50IHRvIGRpc3BsYXkgaW4KKyAqIHRoZSBCUklUUyB3ZWIgYXBwbGljYXRpb24KKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVBcnRlZmFjdCBleHRlbmRzIEFydGVmYWN0IHsKIAotCS8qKgotCSAqIFRoZSBwYWNrYWdlcyBleHBvcnRlZCBieSB0aGUgYnVuZGxlCi0JICovCi0JcHJpdmF0ZSBMaXN0PFBhY2thZ2VFeHBvcnQ+IGV4cG9ydHMgPSBuZXcgQXJyYXlMaXN0PFBhY2thZ2VFeHBvcnQ+KCk7CisgICAgLyoqCisgICAgICogVGhlIHBhY2thZ2VzIGV4cG9ydGVkIGJ5IHRoZSBidW5kbGUKKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Q8UGFja2FnZUV4cG9ydD4gZXhwb3J0cyA9IG5ldyBBcnJheUxpc3Q8UGFja2FnZUV4cG9ydD4oKTsKIAotCS8qKgotCSAqIFRoZSBpbXBvcnRzIGRlY2xhcmVkIGJ5IHRoZSBidW5kbGUKLQkgKi8KLQlwcml2YXRlIExpc3Q8UGFja2FnZUltcG9ydD4gaW1wb3J0cyA9IG5ldyBBcnJheUxpc3Q8UGFja2FnZUltcG9ydD4oKTsKKyAgICAvKioKKyAgICAgKiBUaGUgaW1wb3J0cyBkZWNsYXJlZCBieSB0aGUgYnVuZGxlCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PFBhY2thZ2VJbXBvcnQ+IGltcG9ydHMgPSBuZXcgQXJyYXlMaXN0PFBhY2thZ2VJbXBvcnQ+KCk7CiAKLQkvKiogZm9yIHBlcnNpc3RlbmNlIHVzZSBvbmx5ICovCi0JcHJvdGVjdGVkIEJ1bmRsZUFydGVmYWN0KCkgewotCX0KKyAgICAvKiogZm9yIHBlcnNpc3RlbmNlIHVzZSBvbmx5ICovCisgICAgcHJvdGVjdGVkIEJ1bmRsZUFydGVmYWN0KCkgeworICAgIH0KIAotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBCdW5kbGVBcnRlZmFjdCwgZm9yIHBhcmFtZXRlciBkZXNjcmlwdGlvbnMgc2VlIEFydGVmYWN0Ci0JICogY29uc3RydWN0b3IgamF2YWRvYwotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHN5bWJvbGljTmFtZQotCSAqIEBwYXJhbSB2ZXJzaW9uCi0JICogQHBhcmFtIG9yZ2FuaXNhdGlvbk5hbWUKLQkgKiBAcGFyYW0gbW9kdWxlTmFtZQotCSAqIEBzZWUgQXJ0ZWZhY3QKLQkgKi8KLQlwdWJsaWMgQnVuZGxlQXJ0ZWZhY3QoU3RyaW5nIG5hbWUsIFN0cmluZyBzeW1ib2xpY05hbWUsIE9zZ2lWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBvcmdhbmlzYXRpb25OYW1lLAotCQlTdHJpbmcgbW9kdWxlTmFtZSkgewotCQlzdXBlcihuYW1lLCBzeW1ib2xpY05hbWUsIHZlcnNpb24sIG9yZ2FuaXNhdGlvbk5hbWUsIG1vZHVsZU5hbWUpOwotCX0KKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQnVuZGxlQXJ0ZWZhY3QsIGZvciBwYXJhbWV0ZXIgZGVzY3JpcHRpb25zIHNlZSBBcnRlZmFjdCBjb25zdHJ1Y3RvciBqYXZhZG9jCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqIEBwYXJhbSBzeW1ib2xpY05hbWUKKyAgICAgKiBAcGFyYW0gdmVyc2lvbgorICAgICAqIEBwYXJhbSBvcmdhbmlzYXRpb25OYW1lCisgICAgICogQHBhcmFtIG1vZHVsZU5hbWUKKyAgICAgKiBAc2VlIEFydGVmYWN0CisgICAgICovCisgICAgcHVibGljIEJ1bmRsZUFydGVmYWN0KFN0cmluZyBuYW1lLCBTdHJpbmcgc3ltYm9saWNOYW1lLCBPc2dpVmVyc2lvbiB2ZXJzaW9uLCBTdHJpbmcgb3JnYW5pc2F0aW9uTmFtZSwgU3RyaW5nIG1vZHVsZU5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgc3ltYm9saWNOYW1lLCB2ZXJzaW9uLCBvcmdhbmlzYXRpb25OYW1lLCBtb2R1bGVOYW1lKTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgcGFja2FnZXMgZXhwb3J0ZWQgYnkgdGhpcyBidW5kbGUKLQkgKi8KLQlwdWJsaWMgTGlzdDxQYWNrYWdlRXhwb3J0PiBnZXRFeHBvcnRzKCkgewotCQlyZXR1cm4gZXhwb3J0czsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsaXN0IG9mIHBhY2thZ2VzIGV4cG9ydGVkIGJ5IHRoaXMgYnVuZGxlCisgICAgICovCisgICAgcHVibGljIExpc3Q8UGFja2FnZUV4cG9ydD4gZ2V0RXhwb3J0cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZXhwb3J0czsKKyAgICB9CiAKLQkvKioKLQkgKiBBZGQgYW4gZXhwb3J0IHRvIHRoZSBzZXQgb2YgcGFja2FnZXMgZXhwb3J0ZWQgYnkgdGhpcyBidW5kbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeHBvcnQoUGFja2FnZUV4cG9ydCBleHBvcnQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChleHBvcnQsICJUcmllZCB0byBhZGQgbnVsbCBleHBvcnQiKTsKLQkJZXhwb3J0cy5hZGQoZXhwb3J0KTsKLQl9CisgICAgLyoqCisgICAgICogQWRkIGFuIGV4cG9ydCB0byB0aGUgc2V0IG9mIHBhY2thZ2VzIGV4cG9ydGVkIGJ5IHRoaXMgYnVuZGxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRXhwb3J0KFBhY2thZ2VFeHBvcnQgZXhwb3J0KSB7CisgICAgICAgIEFzc2VydC5pc05vdE51bGwoZXhwb3J0LCAiVHJpZWQgdG8gYWRkIG51bGwgZXhwb3J0Iik7CisgICAgICAgIHRoaXMuZXhwb3J0cy5hZGQoZXhwb3J0KTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZXQgdGhlIGxpc3Qgb2YgcGFja2FnZXMgZXhwb3J0ZWQgYnkgdGhpcyBidW5kbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBvcnRzKExpc3Q8UGFja2FnZUV4cG9ydD4gZXhwb3J0cykgewotCQl0aGlzLmV4cG9ydHMgPSBleHBvcnRzOwotCX0KKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxpc3Qgb2YgcGFja2FnZXMgZXhwb3J0ZWQgYnkgdGhpcyBidW5kbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFeHBvcnRzKExpc3Q8UGFja2FnZUV4cG9ydD4gZXhwb3J0cykgeworICAgICAgICB0aGlzLmV4cG9ydHMgPSBleHBvcnRzOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBvZiBpbXBvcnRzIGRlY2xhcmVkIGJ5IHRoaXMgYnVuZGxlCi0JICovCi0JcHVibGljIExpc3Q8UGFja2FnZUltcG9ydD4gZ2V0SW1wb3J0cygpIHsKLQkJcmV0dXJuIGltcG9ydHM7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbGlzdCBvZiBpbXBvcnRzIGRlY2xhcmVkIGJ5IHRoaXMgYnVuZGxlCisgICAgICovCisgICAgcHVibGljIExpc3Q8UGFja2FnZUltcG9ydD4gZ2V0SW1wb3J0cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW1wb3J0czsKKyAgICB9CiAKLQkvKioKLQkgKiBBZGQgYW4gaW1wb3J0IHRvIHRoZSBzZXQgb2YgaW1wb3J0IGRlY2xhcmF0aW9uIGZvciB0aGlzIGJ1bmRsZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEltcG9ydChQYWNrYWdlSW1wb3J0IGltcCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGltcCwgIlRyaWVkIHRvIGFkZCBudWxsIGltcG9ydCIpOwotCQlpbXBvcnRzLmFkZChpbXApOwotCX0KKyAgICAvKioKKyAgICAgKiBBZGQgYW4gaW1wb3J0IHRvIHRoZSBzZXQgb2YgaW1wb3J0IGRlY2xhcmF0aW9uIGZvciB0aGlzIGJ1bmRsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEltcG9ydChQYWNrYWdlSW1wb3J0IGltcCkgeworICAgICAgICBBc3NlcnQuaXNOb3ROdWxsKGltcCwgIlRyaWVkIHRvIGFkZCBudWxsIGltcG9ydCIpOworICAgICAgICB0aGlzLmltcG9ydHMuYWRkKGltcCk7CisgICAgfQogCi0JLyoqCi0JICogU2V0IHRoZSBsaXN0IG9mIHBhY2thZ2VzIGltcG9ydGVkIGJ5IHRoaXMgYnVuZGxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1wb3J0cyhMaXN0PFBhY2thZ2VJbXBvcnQ+IGltcG9ydHMpIHsKLQkJdGhpcy5pbXBvcnRzID0gaW1wb3J0czsKLQl9CisgICAgLyoqCisgICAgICogU2V0IHRoZSBsaXN0IG9mIHBhY2thZ2VzIGltcG9ydGVkIGJ5IHRoaXMgYnVuZGxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW1wb3J0cyhMaXN0PFBhY2thZ2VJbXBvcnQ+IGltcG9ydHMpIHsKKyAgICAgICAgdGhpcy5pbXBvcnRzID0gaW1wb3J0czsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbGF0aXZlIFVSTCBwYXRoIGZvciBkb3dubG9hZGluZyB0aGlzIGJ1bmRsZSBmcm9tIFMzCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVVybFBhdGgoKSB7Ci0JCXJldHVybiAoIi8iICsgZ2V0T3JnYW5pc2F0aW9uTmFtZSgpICsgIi8iICsgZ2V0TW9kdWxlTmFtZSgpICsgIi8iICsgZ2V0VmVyc2lvbigpICsgIi8iICsgZ2V0TW9kdWxlTmFtZSgpICsgIi0iCi0JCQkrIGdldFZlcnNpb24oKSArICIuamFyIik7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcmVsYXRpdmUgVVJMIHBhdGggZm9yIGRvd25sb2FkaW5nIHRoaXMgYnVuZGxlIGZyb20gUzMKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlVXJsUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICIvIiArIGdldE9yZ2FuaXNhdGlvbk5hbWUoKSArICIvIiArIGdldE1vZHVsZU5hbWUoKSArICIvIiArIGdldFZlcnNpb24oKSArICIvIiArIGdldE1vZHVsZU5hbWUoKSArICItIiArIGdldFZlcnNpb24oKSArICIuamFyIjsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbGF0aXZlIFVSTCBwYXRoIGZvciBkb3dubG9hZGluZyB0aGUgc291cmNlIGZvciB0aGlzIGJ1bmRsZQotCSAqIGZyb20gUzMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlU291cmNlVXJsUGF0aCgpIHsKLQkJcmV0dXJuICgiLyIgKyBnZXRPcmdhbmlzYXRpb25OYW1lKCkgKyAiLyIgKyBnZXRNb2R1bGVOYW1lKCkgKyAiLyIgKyBnZXRWZXJzaW9uKCkgKyAiLyIgKyBnZXRNb2R1bGVOYW1lKCkKLQkJCSsgIi1zb3VyY2VzLSIgKyBnZXRWZXJzaW9uKCkgKyAiLmphciIpOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlbGF0aXZlIFVSTCBwYXRoIGZvciBkb3dubG9hZGluZyB0aGUgc291cmNlIGZvciB0aGlzIGJ1bmRsZSBmcm9tIFMzCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVNvdXJjZVVybFBhdGgoKSB7CisgICAgICAgIHJldHVybiAiLyIgKyBnZXRPcmdhbmlzYXRpb25OYW1lKCkgKyAiLyIgKyBnZXRNb2R1bGVOYW1lKCkgKyAiLyIgKyBnZXRWZXJzaW9uKCkgKyAiLyIgKyBnZXRNb2R1bGVOYW1lKCkgKyAiLXNvdXJjZXMtIiArIGdldFZlcnNpb24oKSArICIuamFyIjsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlidWlsZGVyLmFwcGVuZCgiQnVuZGxlLU5hbWU6ICIpOwotCQlidWlsZGVyLmFwcGVuZChnZXROYW1lKCkpOwotCQlidWlsZGVyLmFwcGVuZCgiXG4iKTsKLQkJYnVpbGRlci5hcHBlbmQoIkJ1bmRsZS1TeW1ib2xpY05hbWU6ICIpOwotCQlidWlsZGVyLmFwcGVuZChnZXRTeW1ib2xpY05hbWUoKSk7Ci0JCWJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotCQlidWlsZGVyLmFwcGVuZCgiQnVuZGxlLVZlcnNpb246ICIpOwotCQlidWlsZGVyLmFwcGVuZChnZXRWZXJzaW9uKCkpOwotCQlidWlsZGVyLmFwcGVuZCgiXG4iKTsKLQkJLy8gaW5jbHVkaW5nIGV4cG9ydHMgY2FuIGNhdXNlIGEgSGliZXJuYXRlIGxhenktbG9hZCBleGNlcHRpb24KLQkJLy8gYnVpbGRlci5hcHBlbmQoIkV4cG9ydC1QYWNrYWdlOiAiKTsKLQkJLy8gYnVpbGRlci5hcHBlbmQoIlxuIik7Ci0JCS8vIGZvciAoUGFja2FnZUV4cG9ydCBleHBvcnQgOiB0aGlzLmV4cG9ydHMpIHsKLQkJLy8gYnVpbGRlci5hcHBlbmQoIiAgIik7Ci0JCS8vIGJ1aWxkZXIuYXBwZW5kKGV4cG9ydCk7Ci0JCS8vIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotCQkvLyB9Ci0JCXJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJCdW5kbGUtTmFtZTogIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldE5hbWUoKSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiQnVuZGxlLVN5bWJvbGljTmFtZTogIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldFN5bWJvbGljTmFtZSgpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJCdW5kbGUtVmVyc2lvbjogIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldFZlcnNpb24oKSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOworICAgICAgICAvLyBpbmNsdWRpbmcgZXhwb3J0cyBjYW4gY2F1c2UgYSBIaWJlcm5hdGUgbGF6eS1sb2FkIGV4Y2VwdGlvbgorICAgICAgICAvLyBidWlsZGVyLmFwcGVuZCgiRXhwb3J0LVBhY2thZ2U6ICIpOworICAgICAgICAvLyBidWlsZGVyLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgLy8gZm9yIChQYWNrYWdlRXhwb3J0IGV4cG9ydCA6IHRoaXMuZXhwb3J0cykgeworICAgICAgICAvLyBidWlsZGVyLmFwcGVuZCgiICIpOworICAgICAgICAvLyBidWlsZGVyLmFwcGVuZChleHBvcnQpOworICAgICAgICAvLyBidWlsZGVyLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgLy8gfQorICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgQlVORExFOwotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHMuSUFydGVmYWN0I2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBBcnRlZmFjdFR5cGUgZ2V0QXJ0ZWZhY3RUeXBlKCkgewotCQlyZXR1cm4gQXJ0ZWZhY3RUeXBlLkJVTkRMRTsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyBCVU5ETEU7CisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzLklBcnRlZmFjdCNnZXRUeXBlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQXJ0ZWZhY3RUeXBlIGdldEFydGVmYWN0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIEFydGVmYWN0VHlwZS5CVU5ETEU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvSUFydGVmYWN0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9JQXJ0ZWZhY3QuamF2YQppbmRleCBkNWJlODE3Li45ZmQ0ZTYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9JQXJ0ZWZhY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9JQXJ0ZWZhY3QuamF2YQpAQCAtMTUsNzcgKzE1LDc0IEBACiAKIC8qKgogICogUmVwcmVzZW50cyBhbiBhcnRlZmFjdCBpbiB0aGUgcmVwb3NpdG9yeSA6LSBidW5kbGUgb3IgbGlicmFyeQotICogCisgKgogICogQGF1dGhvciBhZHJpYW5jb2x5ZXIKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCi0gKiAKKyAqCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUFydGVmYWN0IGV4dGVuZHMgSUFydGVmYWN0VHlwZWQgewogCi0JLyoqCi0JICogVGhlIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGFydGVmYWN0Ci0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKKyAgICAvKioKKyAgICAgKiBUaGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgYXJ0ZWZhY3QKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0TmFtZSgpOwogCi0JLyoqCi0JICogVGhlIHN5bWJvbGljIG5hbWUgb2YgdGhlIGFydGVmYWN0Ci0JICovCi0JU3RyaW5nIGdldFN5bWJvbGljTmFtZSgpOworICAgIC8qKgorICAgICAqIFRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoZSBhcnRlZmFjdAorICAgICAqLworICAgIFN0cmluZyBnZXRTeW1ib2xpY05hbWUoKTsKIAotCS8qKgotCSAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBhcnRlZmFjdAotCSAqLwotCU9zZ2lWZXJzaW9uIGdldFZlcnNpb24oKTsKKyAgICAvKioKKyAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgYXJ0ZWZhY3QKKyAgICAgKi8KKyAgICBPc2dpVmVyc2lvbiBnZXRWZXJzaW9uKCk7CiAKLQkvKioKLQkgKiBUaGUgb3JnYW5pc2F0aW9uIG5hbWUgYXMgdXNlZCBpbiBpdnkueG1sIChncm91cElkIG5hbWUgZm9yIG1hdmVuKQotCSAqLwotCVN0cmluZyBnZXRPcmdhbmlzYXRpb25OYW1lKCk7CisgICAgLyoqCisgICAgICogVGhlIG9yZ2FuaXNhdGlvbiBuYW1lIGFzIHVzZWQgaW4gaXZ5LnhtbCAoZ3JvdXBJZCBuYW1lIGZvciBtYXZlbikKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0T3JnYW5pc2F0aW9uTmFtZSgpOwogCi0JLyoqCi0JICogVGhlIG1vZHVsZSBuYW1lIGFzIHVzZWQgaW4gaXZ5LnhtbCAoYXJ0ZWZhY3RJZCBmb3IgbWF2ZW4pCi0JICovCi0JU3RyaW5nIGdldE1vZHVsZU5hbWUoKTsKKyAgICAvKioKKyAgICAgKiBUaGUgbW9kdWxlIG5hbWUgYXMgdXNlZCBpbiBpdnkueG1sIChhcnRlZmFjdElkIGZvciBtYXZlbikKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0TW9kdWxlTmFtZSgpOwogCi0JLyoqCi0JICogSXMgc291cmNlIGNvZGUgYXZhaWxhYmxlIGZvciB0aGlzIGFydGVmYWN0PwotCSAqLwotCWJvb2xlYW4gaXNTb3VyY2VBdmFpbGFibGUoKTsKKyAgICAvKioKKyAgICAgKiBJcyBzb3VyY2UgY29kZSBhdmFpbGFibGUgZm9yIHRoaXMgYXJ0ZWZhY3Q/CisgICAgICovCisgICAgYm9vbGVhbiBpc1NvdXJjZUF2YWlsYWJsZSgpOwogCi0JLyoqCi0JICogU2V0IGlmIHNvdXJjZSBjb2RlIGlzIGF2YWlsYWJsZQotCSAqLwotCXZvaWQgc2V0U291cmNlQXZhaWxhYmxlKGJvb2xlYW4gc291cmNlQXZhaWxhYmxlKTsKKyAgICAvKioKKyAgICAgKiBTZXQgaWYgc291cmNlIGNvZGUgaXMgYXZhaWxhYmxlCisgICAgICovCisgICAgdm9pZCBzZXRTb3VyY2VBdmFpbGFibGUoYm9vbGVhbiBzb3VyY2VBdmFpbGFibGUpOwogCi0JLyoqCi0JICogR2V0IHRoZSByZWxhdGl2ZSBVUkwgcGF0aCBmb3IgZG93bmxvYWRpbmcgdGhpcyBhcnRlZmFjdCBmcm9tIFMzCi0JICovCi0JU3RyaW5nIGdldFJlbGF0aXZlVXJsUGF0aCgpOworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVsYXRpdmUgVVJMIHBhdGggZm9yIGRvd25sb2FkaW5nIHRoaXMgYXJ0ZWZhY3QgZnJvbSBTMworICAgICAqLworICAgIFN0cmluZyBnZXRSZWxhdGl2ZVVybFBhdGgoKTsKIAotCS8qKgotCSAqIEdldCB0aGUgcmVsYXRpdmUgVVJMIHBhdGggZm9yIGRpc3BsYXlpbmcgdGhlIGxpY2Vuc2UgZmlsZSBmb3IgdGhpcwotCSAqIGFydGVmYWN0Ci0JICovCi0JU3RyaW5nIGdldFJlbGF0aXZlTGljZW5zZVVybFBhdGgoKTsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlbGF0aXZlIFVSTCBwYXRoIGZvciBkaXNwbGF5aW5nIHRoZSBsaWNlbnNlIGZpbGUgZm9yIHRoaXMgYXJ0ZWZhY3QKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0UmVsYXRpdmVMaWNlbnNlVXJsUGF0aCgpOwogCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhpcyBhcnRlZmFjdCBhcyBjb21wbGV0ZWx5IG1hdGNoaW5nIGEKLQkgKiBnaXZlbiByZXF1aXJlbWVudC4gQXQgbWluaW11bSwgdGhpcyBzaG91bGQgdXNlIG5hbWUsIHZlcnNpb24gYW5kIGFydGVmYWN0Ci0JICogdHlwZS4KLQkgKi8KLQlTdHJpbmcgZ2V0U2lnbmF0dXJlKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhpcyBhcnRlZmFjdCBhcyBjb21wbGV0ZWx5IG1hdGNoaW5nIGEgZ2l2ZW4gcmVxdWlyZW1lbnQuIEF0IG1pbmltdW0sIHRoaXMKKyAgICAgKiBzaG91bGQgdXNlIG5hbWUsIHZlcnNpb24gYW5kIGFydGVmYWN0IHR5cGUuCisgICAgICovCisgICAgU3RyaW5nIGdldFNpZ25hdHVyZSgpOwogCi0JLyoqCi0JICogRG9lcyB0aGUgYXJ0ZWZhY3QgbWF0Y2ggdGhlIHN1cHBsaWVkIGFydGVmYWN0PyBNYXRjaGluZyBhcnRlZmFjdHMgYXJlCi0JICogZXhwZWN0ZWQgdG8gc2hhcmUgdGhlIHNhbWUgc2lnbmF0dXJlLgotCSAqLwotCWJvb2xlYW4gaXNNYXRjaChJQXJ0ZWZhY3QgYXJ0ZWZhY3QpOworICAgIC8qKgorICAgICAqIERvZXMgdGhlIGFydGVmYWN0IG1hdGNoIHRoZSBzdXBwbGllZCBhcnRlZmFjdD8gTWF0Y2hpbmcgYXJ0ZWZhY3RzIGFyZSBleHBlY3RlZCB0byBzaGFyZSB0aGUgc2FtZSBzaWduYXR1cmUuCisgICAgICovCisgICAgYm9vbGVhbiBpc01hdGNoKElBcnRlZmFjdCBhcnRlZmFjdCk7CiAKLQl2b2lkIHNldFNldChBcnRlZmFjdFNldCBzZXQpOworICAgIHZvaWQgc2V0U2V0KEFydGVmYWN0U2V0IHNldCk7CiAKLQlBcnRlZmFjdFNldCBnZXRTZXQoKTsKKyAgICBBcnRlZmFjdFNldCBnZXRTZXQoKTsKIAotCXZvaWQgc2V0UmVwb3NpdG9yeShBcnRlZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSk7CisgICAgdm9pZCBzZXRSZXBvc2l0b3J5KEFydGVmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5KTsKIAotCUFydGVmYWN0UmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCk7CisgICAgQXJ0ZWZhY3RSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9JQXJ0ZWZhY3RUeXBlZC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvSUFydGVmYWN0VHlwZWQuamF2YQppbmRleCBiY2ZjNzcxLi5lMTIxZWQ2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9JQXJ0ZWZhY3RUeXBlZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0lBcnRlZmFjdFR5cGVkLmphdmEKQEAgLTEyLDE1ICsxMiwxNSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLmFydGVmYWN0czsKIAogLyoqCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgotICogCisgKgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElBcnRlZmFjdFR5cGVkIHsKIAotCS8qKgotCSAqIFdoYXQgdHlwZSBvZiBhcnRlZmFjdCBpcyB0aGlzPwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBBcnRlZmFjdFR5cGUgZ2V0QXJ0ZWZhY3RUeXBlKCk7CisgICAgLyoqCisgICAgICogV2hhdCB0eXBlIG9mIGFydGVmYWN0IGlzIHRoaXM/CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEFydGVmYWN0VHlwZSBnZXRBcnRlZmFjdFR5cGUoKTsKIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0lMb2NhbEFydGVmYWN0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9JTG9jYWxBcnRlZmFjdC5qYXZhCmluZGV4IDliZDE3ZGMuLjVmMDQ2NjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0lMb2NhbEFydGVmYWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvSUxvY2FsQXJ0ZWZhY3QuamF2YQpAQCAtMTMsOSArMTMsOSBAQAogCiAvKioKICAqIEFuIGFydGVmYWN0IHRoYXQgaGFzIGEgY29ycmVzcG9uZGluZyBmaWxlIHN5c3RlbSBlbnRpdHkuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgotICogCisgKgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElMb2NhbEFydGVmYWN0IGV4dGVuZHMgSUFydGVmYWN0LCBJTG9jYWxFbnRpdHkgewogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9JTG9jYWxFbnRpdHkuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0lMb2NhbEVudGl0eS5qYXZhCmluZGV4IGI1MzAxOTkuLjIyM2M4YTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0lMb2NhbEVudGl0eS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0lMb2NhbEVudGl0eS5qYXZhCkBAIC0xNSwxMSArMTUsMTEgQEAKIAogLyoqCiAgKiBBbnkgZW50aXR5IHRoYXQgaGFzIGEgY29ycmVzcG9uZGluZyBmaWxlIHN5c3RlbSBlbnRpdHkuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgotICogCisgKgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElMb2NhbEVudGl0eSB7CiAKLQlGaWxlIGdldEZpbGUoKTsKKyAgICBGaWxlIGdldEZpbGUoKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0xpYnJhcnlBcnRlZmFjdC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvTGlicmFyeUFydGVmYWN0LmphdmEKaW5kZXggYmM4NzJhNC4uZTE2MjYxYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvTGlicmFyeUFydGVmYWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvTGlicmFyeUFydGVmYWN0LmphdmEKQEAgLTQsMTAgKzQsMTEgQEAKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLmFydGVmYWN0czsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0xNywxMTkgKzE4LDExMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbGVyZXBvc2l0b3J5LmRvbWFpbi5Pc2dpVmVyc2lvbjsKIAogLyoqCi0gKiBBIGxpYnJhcnkgc3RvcmVkIGluIEJSSVRTLiBBIGxpYnJhcnkgaXMgYSBjb2xsZWN0aW9uIG9mIGJ1bmRsZXMgZ3JvdXBlZCB1bmRlcgotICogYSBjb21tb24gbmFtZSwgaWQsIGFuZCB2ZXJzaW9uLgotICogCisgKiBBIGxpYnJhcnkgc3RvcmVkIGluIEJSSVRTLiBBIGxpYnJhcnkgaXMgYSBjb2xsZWN0aW9uIG9mIGJ1bmRsZXMgZ3JvdXBlZCB1bmRlciBhIGNvbW1vbiBuYW1lLCBpZCwgYW5kIHZlcnNpb24uCisgKgogICogQGF1dGhvciBhY29seWVyCiAgKi8KIHB1YmxpYyBjbGFzcyBMaWJyYXJ5QXJ0ZWZhY3QgZXh0ZW5kcyBBcnRlZmFjdCBpbXBsZW1lbnRzIENvbXBhcmFibGU8TGlicmFyeUFydGVmYWN0PiB7CiAKLQkvKioKLQkgKiBUaGUgYnVuZGxlIGltcG9ydHMgZGVjbGFyZWQgYnkgdGhlIGxpYnJhcnkKLQkgKi8KLQlwcml2YXRlIExpc3Q8QnVuZGxlSW1wb3J0PiBidW5kbGVJbXBvcnRzOworICAgIC8qKgorICAgICAqIFRoZSBidW5kbGUgaW1wb3J0cyBkZWNsYXJlZCBieSB0aGUgbGlicmFyeQorICAgICAqLworICAgIHByaXZhdGUgTGlzdDxCdW5kbGVJbXBvcnQ+IGJ1bmRsZUltcG9ydHM7CiAKLQkvKiogZm9yIHBlcnNpc3RlbmNlIHVzZSBvbmx5ICovCi0JcHJvdGVjdGVkIExpYnJhcnlBcnRlZmFjdCgpIHsKLQl9CisgICAgLyoqIGZvciBwZXJzaXN0ZW5jZSB1c2Ugb25seSAqLworICAgIHByb3RlY3RlZCBMaWJyYXJ5QXJ0ZWZhY3QoKSB7CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IExpYnJhcnlBcnRlZmFjdC4gVGhpcyB3aWxsICpub3QqIGJlIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UKLQkgKiB1bmxlc3MgZXhwbGljaXRseSBzdG9yZWQgdXNpbmcgdGhlIEFydGVmYWN0UmVwb3NpdG9yeS4gU3RvcmluZyBhIGxpYnJhcnkKLQkgKiBhcnRlZmFjdCBkb2VzICpub3QqIHRoZSBidW5kbGVzIGl0IGNvbnRhaW5zIC0gdGhlc2UgbXVzdCBiZSBzdG9yZWQgaW4gdGhlCi0JICogZGF0YWJhc2UgaW5kZXBlbmRlbnRseSBmaXJzdC4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBodW1hbiByZWFkYWJsZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IChlLmcuICJTcHJpbmcgRnJhbWV3b3JrIikKLQkgKiBAcGFyYW0gc3ltYm9saWNOYW1lIGlkZW50aWZ5aW5nIG5hbWUgb2YgdGhlIGxpYnJhcnkgKGUuZy4KLQkgKiAgICAgICAgIm9yZy5zcHJpbmdmcmFtZXdvcmsiKQotCSAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBsaWJyYXJ5IHZlcnNpb24sIGZvbGxvd2luZyBub3JtYWwgT1NHaSBjb252ZW50aW9ucwotCSAqIEBwYXJhbSBvcmdhbmlzYXRpb25OYW1lIHRoZSBvcmdhbmlzYXRpb24gbmFtZSBhcyBmb3VuZCBpbiBpdnkueG1sCi0JICogQHBhcmFtIG1vZHVsZU5hbWUgdGhlIG1vZHVsZSBuYW1lIGFzIGZvdW5kIGluIGl2eS54bWwKLQkgKiBAcGFyYW0gYnVuZGxlcyB0aGUgYnVuZGxlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgbGlicmFyeQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5QXJ0ZWZhY3QoU3RyaW5nIG5hbWUsIFN0cmluZyBzeW1ib2xpY05hbWUsIE9zZ2lWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBvcmdhbmlzYXRpb25OYW1lLAotCQlTdHJpbmcgbW9kdWxlTmFtZSkgewotCQlzdXBlcihuYW1lLCBzeW1ib2xpY05hbWUsIHZlcnNpb24sIG9yZ2FuaXNhdGlvbk5hbWUsIG1vZHVsZU5hbWUpOwotCQl0aGlzLmJ1bmRsZUltcG9ydHMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZUltcG9ydD4oKTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IExpYnJhcnlBcnRlZmFjdC4gVGhpcyB3aWxsICpub3QqIGJlIHN0b3JlZCBpbiB0aGUgZGF0YWJhc2UgdW5sZXNzIGV4cGxpY2l0bHkgc3RvcmVkIHVzaW5nIHRoZQorICAgICAqIEFydGVmYWN0UmVwb3NpdG9yeS4gU3RvcmluZyBhIGxpYnJhcnkgYXJ0ZWZhY3QgZG9lcyAqbm90KiB0aGUgYnVuZGxlcyBpdCBjb250YWlucyAtIHRoZXNlIG11c3QgYmUgc3RvcmVkIGluIHRoZQorICAgICAqIGRhdGFiYXNlIGluZGVwZW5kZW50bHkgZmlyc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBodW1hbiByZWFkYWJsZSBuYW1lIG9mIHRoZSBsaWJyYXJ5IChlLmcuICJTcHJpbmcgRnJhbWV3b3JrIikKKyAgICAgKiBAcGFyYW0gc3ltYm9saWNOYW1lIGlkZW50aWZ5aW5nIG5hbWUgb2YgdGhlIGxpYnJhcnkgKGUuZy4gIm9yZy5zcHJpbmdmcmFtZXdvcmsiKQorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBsaWJyYXJ5IHZlcnNpb24sIGZvbGxvd2luZyBub3JtYWwgT1NHaSBjb252ZW50aW9ucworICAgICAqIEBwYXJhbSBvcmdhbmlzYXRpb25OYW1lIHRoZSBvcmdhbmlzYXRpb24gbmFtZSBhcyBmb3VuZCBpbiBpdnkueG1sCisgICAgICogQHBhcmFtIG1vZHVsZU5hbWUgdGhlIG1vZHVsZSBuYW1lIGFzIGZvdW5kIGluIGl2eS54bWwKKyAgICAgKiBAcGFyYW0gYnVuZGxlcyB0aGUgYnVuZGxlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgbGlicmFyeQorICAgICAqLworICAgIHB1YmxpYyBMaWJyYXJ5QXJ0ZWZhY3QoU3RyaW5nIG5hbWUsIFN0cmluZyBzeW1ib2xpY05hbWUsIE9zZ2lWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBvcmdhbmlzYXRpb25OYW1lLCBTdHJpbmcgbW9kdWxlTmFtZSkgeworICAgICAgICBzdXBlcihuYW1lLCBzeW1ib2xpY05hbWUsIHZlcnNpb24sIG9yZ2FuaXNhdGlvbk5hbWUsIG1vZHVsZU5hbWUpOworICAgICAgICB0aGlzLmJ1bmRsZUltcG9ydHMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZUltcG9ydD4oKTsKKyAgICB9CiAKLQkvKioKLQkgKiBBZGQgYSBuZXcgaW1wb3J0IHRvIHRoaXMgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBpbXAgdGhlIGltcG9ydCB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCdW5kbGVJbXBvcnQoQnVuZGxlSW1wb3J0IGltcCkgewotCQl0aGlzLmJ1bmRsZUltcG9ydHMuYWRkKGltcCk7Ci0JfQorICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBpbXBvcnQgdG8gdGhpcyBsaWJyYXJ5CisgICAgICoKKyAgICAgKiBAcGFyYW0gaW1wIHRoZSBpbXBvcnQgdG8gYWRkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQnVuZGxlSW1wb3J0KEJ1bmRsZUltcG9ydCBpbXApIHsKKyAgICAgICAgdGhpcy5idW5kbGVJbXBvcnRzLmFkZChpbXApOworICAgIH0KIAotCS8qKgotCSAqIFRoZSBzZXQgb2YgYnVuZGxlcyBjb250YWluZWQgaW4gdGhpcyBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBMaXN0PEJ1bmRsZUltcG9ydD4gZ2V0QnVuZGxlSW1wb3J0cygpIHsKLQkJcmV0dXJuIHRoaXMuYnVuZGxlSW1wb3J0czsKLQl9CisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiBidW5kbGVzIGNvbnRhaW5lZCBpbiB0aGlzIGxpYnJhcnkuCisgICAgICovCisgICAgcHVibGljIExpc3Q8QnVuZGxlSW1wb3J0PiBnZXRCdW5kbGVJbXBvcnRzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5idW5kbGVJbXBvcnRzOworICAgIH0KIAotCS8qKgotCSAqIFRoZSByZWxhdGl2ZSBVUkwgbmVlZGVkIHRvIGRvd25sb2FkIHRoaXMgbGlicmFyeSBmcm9tIFMzCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVVybFBhdGgoKSB7Ci0JCXJldHVybiAoIi8iICsgZ2V0T3JnYW5pc2F0aW9uTmFtZSgpICsgIi8iICsgZ2V0TW9kdWxlTmFtZSgpICsgIi8iICsgZ2V0VmVyc2lvbigpICsgIi8iICsgZ2V0TW9kdWxlTmFtZSgpICsgIi0iCi0JCQkrIGdldFZlcnNpb24oKSArICIubGliZCIpOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGUgcmVsYXRpdmUgVVJMIG5lZWRlZCB0byBkb3dubG9hZCB0aGlzIGxpYnJhcnkgZnJvbSBTMworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsYXRpdmVVcmxQYXRoKCkgeworICAgICAgICByZXR1cm4gIi8iICsgZ2V0T3JnYW5pc2F0aW9uTmFtZSgpICsgIi8iICsgZ2V0TW9kdWxlTmFtZSgpICsgIi8iICsgZ2V0VmVyc2lvbigpICsgIi8iICsgZ2V0TW9kdWxlTmFtZSgpICsgIi0iICsgZ2V0VmVyc2lvbigpICsgIi5saWJkIjsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlidWlsZGVyLmFwcGVuZCgiTGlicmFyeS1OYW1lOiAiKTsKLQkJYnVpbGRlci5hcHBlbmQodGhpcy5nZXROYW1lKCkpOwotCQlidWlsZGVyLmFwcGVuZCgiXG4iKTsKLQkJYnVpbGRlci5hcHBlbmQoIkxpYnJhcnktU3ltYm9saWNOYW1lOiAiKTsKLQkJYnVpbGRlci5hcHBlbmQodGhpcy5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCWJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotCQlidWlsZGVyLmFwcGVuZCgiTGlicmFyeS1WZXJzaW9uOiAiKTsKLQkJYnVpbGRlci5hcHBlbmQodGhpcy5nZXRWZXJzaW9uKCkpOwotCQlidWlsZGVyLmFwcGVuZCgiXG4iKTsKLQkJYnVpbGRlci5hcHBlbmQoIkxpYnJhcnkgYnVuZGxlczogXG4iKTsKLQkJaWYgKHRoaXMuYnVuZGxlSW1wb3J0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKEJ1bmRsZUltcG9ydCBiIDogdGhpcy5idW5kbGVJbXBvcnRzKSB7Ci0JCQkJYnVpbGRlci5hcHBlbmQoIiAgIik7Ci0JCQkJYnVpbGRlci5hcHBlbmQoYi5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQkJYnVpbGRlci5hcHBlbmQoIiB2LiIpOwotCQkJCWJ1aWxkZXIuYXBwZW5kKGIuZ2V0VmVyc2lvblJhbmdlKCkpOwotCQkJCWJ1aWxkZXIuYXBwZW5kKCJcbiIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJMaWJyYXJ5LU5hbWU6ICIpOworICAgICAgICBidWlsZGVyLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiTGlicmFyeS1TeW1ib2xpY05hbWU6ICIpOworICAgICAgICBidWlsZGVyLmFwcGVuZCh0aGlzLmdldFN5bWJvbGljTmFtZSgpKTsKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJMaWJyYXJ5LVZlcnNpb246ICIpOworICAgICAgICBidWlsZGVyLmFwcGVuZCh0aGlzLmdldFZlcnNpb24oKSk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcbiIpOworICAgICAgICBidWlsZGVyLmFwcGVuZCgiTGlicmFyeSBidW5kbGVzOiBcbiIpOworICAgICAgICBpZiAodGhpcy5idW5kbGVJbXBvcnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoQnVuZGxlSW1wb3J0IGIgOiB0aGlzLmJ1bmRsZUltcG9ydHMpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChiLmdldFN5bWJvbGljTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIHYuIik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoYi5nZXRWZXJzaW9uUmFuZ2UoKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTb3J0IGJ5IHN5bWJvbGljIG5hbWUsIGFuZCB0aGVuIHJldmVyc2UgdmVyc2lvbi4gU2VlIHRoZSBqYXZhZG9jIGZvciB0aGUKLQkgKiBUcmVlU2V0IGNsYXNzIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIHdydC4gU2V0IHNlbWFudGljcy4KLQkgKiBTaW5jZSBlcXVhbGl0eSBpcyBiYXNlZCBvbiBpZCwgYW5kIGNvbXBhcmVUbyBpcyBiYXNlZCBvbiBzeW1ib2xpY05hbWUgYW5kCi0JICogdmVyc2lvbiwgZnVsbCBTZXQgc2VtYW50aWNzIHdoZW4gdXNpbmcgTGlicmFyeUFydGVmYWN0cyBpbiBhIFRyZWVTZXQgYXJlCi0JICogbm90IGd1YXJhbnRlZWQuCi0JICovCi0JcHVibGljIGludCBjb21wYXJlVG8oTGlicmFyeUFydGVmYWN0IG90aGVyKSB7Ci0JCWlmICh0aGlzID09IG90aGVyKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAob3RoZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzKG90aGVyLmdldFN5bWJvbGljTmFtZSgpKSkgewotCQkJcmV0dXJuIG90aGVyLmdldFZlcnNpb24oKS5jb21wYXJlVG8odGhpcy5nZXRWZXJzaW9uKCkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRoaXMuZ2V0U3ltYm9saWNOYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBTb3J0IGJ5IHN5bWJvbGljIG5hbWUsIGFuZCB0aGVuIHJldmVyc2UgdmVyc2lvbi4gU2VlIHRoZSBqYXZhZG9jIGZvciB0aGUgVHJlZVNldCBjbGFzcyB0byB1bmRlcnN0YW5kIHRoZQorICAgICAqIGltcGxpY2F0aW9ucyBvZiB0aGlzIHdydC4gU2V0IHNlbWFudGljcy4gU2luY2UgZXF1YWxpdHkgaXMgYmFzZWQgb24gaWQsIGFuZCBjb21wYXJlVG8gaXMgYmFzZWQgb24gc3ltYm9saWNOYW1lCisgICAgICogYW5kIHZlcnNpb24sIGZ1bGwgU2V0IHNlbWFudGljcyB3aGVuIHVzaW5nIExpYnJhcnlBcnRlZmFjdHMgaW4gYSBUcmVlU2V0IGFyZSBub3QgZ3VhcmFudGVlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhMaWJyYXJ5QXJ0ZWZhY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMob3RoZXIuZ2V0U3ltYm9saWNOYW1lKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gb3RoZXIuZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyh0aGlzLmdldFZlcnNpb24oKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTeW1ib2xpY05hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0U3ltYm9saWNOYW1lKCkpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyBMSUJSQVJZOwotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHMuSUFydGVmYWN0I2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBBcnRlZmFjdFR5cGUgZ2V0QXJ0ZWZhY3RUeXBlKCkgewotCQlyZXR1cm4gQXJ0ZWZhY3RUeXBlLkxJQlJBUlk7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgTElCUkFSWTsKKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHMuSUFydGVmYWN0I2dldFR5cGUoKQorICAgICAqLworICAgIHB1YmxpYyBBcnRlZmFjdFR5cGUgZ2V0QXJ0ZWZhY3RUeXBlKCkgeworICAgICAgICByZXR1cm4gQXJ0ZWZhY3RUeXBlLkxJQlJBUlk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvTG9jYWxBcnRlZmFjdFJlcG9zaXRvcnkuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0xvY2FsQXJ0ZWZhY3RSZXBvc2l0b3J5LmphdmEKaW5kZXggOGNmNzdlMS4uOTJhMjhkNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvTG9jYWxBcnRlZmFjdFJlcG9zaXRvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9Mb2NhbEFydGVmYWN0UmVwb3NpdG9yeS5qYXZhCkBAIC0xNiw0NyArMTYsNDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5PYmplY3RVdGlsczsKIAogLyoqCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgotICogCisgKgogICovCiBwdWJsaWMgY2xhc3MgTG9jYWxBcnRlZmFjdFJlcG9zaXRvcnkgZXh0ZW5kcyBBcnRlZmFjdFJlcG9zaXRvcnkgaW1wbGVtZW50cyBJTG9jYWxFbnRpdHkgewogCi0JcHJpdmF0ZSBmaW5hbCBGaWxlIGZpbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGZpbGU7CiAKLQlwdWJsaWMgTG9jYWxBcnRlZmFjdFJlcG9zaXRvcnkoRmlsZSBmaWxlKSB7Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCWJ1bmRsZXMgPSBjcmVhdGVBcnRlZmFjdFNldChBcnRlZmFjdFR5cGUuQlVORExFLCBmaWxlKTsKLQkJbGlicmFyaWVzID0gY3JlYXRlQXJ0ZWZhY3RTZXQoQXJ0ZWZhY3RUeXBlLkxJQlJBUlksIGZpbGUpOwotCQlhbGxBcnRlZmFjdHMgPSBuZXcgTG9jYWxBcnRlZmFjdFNldCh0aGlzLCBBcnRlZmFjdFR5cGUuQ09NQklORUQsIGZpbGUpOwotCX0KKyAgICBwdWJsaWMgTG9jYWxBcnRlZmFjdFJlcG9zaXRvcnkoRmlsZSBmaWxlKSB7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIHRoaXMuYnVuZGxlcyA9IGNyZWF0ZUFydGVmYWN0U2V0KEFydGVmYWN0VHlwZS5CVU5ETEUsIGZpbGUpOworICAgICAgICB0aGlzLmxpYnJhcmllcyA9IGNyZWF0ZUFydGVmYWN0U2V0KEFydGVmYWN0VHlwZS5MSUJSQVJZLCBmaWxlKTsKKyAgICAgICAgdGhpcy5hbGxBcnRlZmFjdHMgPSBuZXcgTG9jYWxBcnRlZmFjdFNldCh0aGlzLCBBcnRlZmFjdFR5cGUuQ09NQklORUQsIGZpbGUpOworICAgIH0KIAotCXByb3RlY3RlZCBBcnRlZmFjdFNldCBjcmVhdGVBcnRlZmFjdFNldChBcnRlZmFjdFR5cGUgdHlwZSwgRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxBcnRlZmFjdFNldCh0aGlzLCB0eXBlLCBmaWxlKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGFkZChJQXJ0ZWZhY3QgYXJ0ZWZhY3QpIHsKLQkJCQlyZXR1cm4gc3VwZXIuYWRkKGFydGVmYWN0KSAmJiBhbGxBcnRlZmFjdHMuYWRkKGFydGVmYWN0KTsKLQkJCX0KLQkJfTsKLQl9CisgICAgcHJvdGVjdGVkIEFydGVmYWN0U2V0IGNyZWF0ZUFydGVmYWN0U2V0KEFydGVmYWN0VHlwZSB0eXBlLCBGaWxlIGZpbGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMb2NhbEFydGVmYWN0U2V0KHRoaXMsIHR5cGUsIGZpbGUpIHsKIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHMuSUxvY2FsRW50aXR5I2dldEZpbGUoKQotCSAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBmaWxlOwotCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkKElBcnRlZmFjdCBhcnRlZmFjdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5hZGQoYXJ0ZWZhY3QpICYmIExvY2FsQXJ0ZWZhY3RSZXBvc2l0b3J5LnRoaXMuYWxsQXJ0ZWZhY3RzLmFkZChhcnRlZmFjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQogCi0JLyoqCi0JICogQXNzdW1lcyBvbmUgYW5kIG9ubHkgb25lIHJlcG9zaXRvcnkgYXQgZWFjaCBmaWxlLgotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0JCWlmIChvdGhlciBpbnN0YW5jZW9mIExvY2FsQXJ0ZWZhY3RSZXBvc2l0b3J5KSB7Ci0JCQlMb2NhbEFydGVmYWN0UmVwb3NpdG9yeSBvdGhlclJlcG9zID0gKExvY2FsQXJ0ZWZhY3RSZXBvc2l0b3J5KSBvdGhlcjsKLQkJCXJldHVybiBPYmplY3RVdGlscy5lcXVhbHMoZmlsZSwgb3RoZXJSZXBvcy5maWxlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHMuSUxvY2FsRW50aXR5I2dldEZpbGUoKQorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzdW1lcyBvbmUgYW5kIG9ubHkgb25lIHJlcG9zaXRvcnkgYXQgZWFjaCBmaWxlLgorICAgICAqCisgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgTG9jYWxBcnRlZmFjdFJlcG9zaXRvcnkpIHsKKyAgICAgICAgICAgIExvY2FsQXJ0ZWZhY3RSZXBvc2l0b3J5IG90aGVyUmVwb3MgPSAoTG9jYWxBcnRlZmFjdFJlcG9zaXRvcnkpIG90aGVyOworICAgICAgICAgICAgcmV0dXJuIE9iamVjdFV0aWxzLmVxdWFscyh0aGlzLmZpbGUsIG90aGVyUmVwb3MuZmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0xvY2FsQXJ0ZWZhY3RTZXQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0xvY2FsQXJ0ZWZhY3RTZXQuamF2YQppbmRleCA1NDExNmI2Li5mYTZmOTAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9Mb2NhbEFydGVmYWN0U2V0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvTG9jYWxBcnRlZmFjdFNldC5qYXZhCkBAIC0yMSwzOCArMjEsMzggQEAKICAqLwogcHVibGljIGNsYXNzIExvY2FsQXJ0ZWZhY3RTZXQgZXh0ZW5kcyBBcnRlZmFjdFNldCBpbXBsZW1lbnRzIElMb2NhbEVudGl0eSB7CiAKLQlmaW5hbCBGaWxlIGxvY2F0aW9uOworICAgIGZpbmFsIEZpbGUgbG9jYXRpb247CiAKLQlwdWJsaWMgTG9jYWxBcnRlZmFjdFNldChBcnRlZmFjdFJlcG9zaXRvcnkgYXJ0ZWZhY3RSZXBvc2l0b3J5LCBBcnRlZmFjdFR5cGUgYXJ0ZWZhY3RUeXBlLCBGaWxlIGxvY2F0aW9uKSB7Ci0JCXN1cGVyKGFydGVmYWN0UmVwb3NpdG9yeSwgYXJ0ZWZhY3RUeXBlKTsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KKyAgICBwdWJsaWMgTG9jYWxBcnRlZmFjdFNldChBcnRlZmFjdFJlcG9zaXRvcnkgYXJ0ZWZhY3RSZXBvc2l0b3J5LCBBcnRlZmFjdFR5cGUgYXJ0ZWZhY3RUeXBlLCBGaWxlIGxvY2F0aW9uKSB7CisgICAgICAgIHN1cGVyKGFydGVmYWN0UmVwb3NpdG9yeSwgYXJ0ZWZhY3RUeXBlKTsKKyAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOworICAgIH0KIAotCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9CisgICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb247CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoKSB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGUoKS50b1N0cmluZygpOwotCQlJU2VydmVyIHNlcnZlciA9IGdldFJlcG9zaXRvcnkoKS5nZXRTZXJ2ZXIoKTsKLQkJaWYgKHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRSdW50aW1lKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGhvbWUgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJIb21lKHNlcnZlci5nZXRSdW50aW1lKCkpOwotCQkJaWYgKGZpbGVOYW1lLnN0YXJ0c1dpdGgoaG9tZSkpIHsKLQkJCQlmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZyhob21lLmxlbmd0aCgpICsgMSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGVOYW1lOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZSgpLnRvU3RyaW5nKCk7CisgICAgICAgIElTZXJ2ZXIgc2VydmVyID0gZ2V0UmVwb3NpdG9yeSgpLmdldFNlcnZlcigpOworICAgICAgICBpZiAoc2VydmVyICE9IG51bGwgJiYgc2VydmVyLmdldFJ1bnRpbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgaG9tZSA9IFNlcnZlclV0aWxzLmdldFNlcnZlckhvbWUoc2VydmVyLmdldFJ1bnRpbWUoKSk7CisgICAgICAgICAgICBpZiAoZmlsZU5hbWUuc3RhcnRzV2l0aChob21lKSkgeworICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKGhvbWUubGVuZ3RoKCkgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlsZU5hbWU7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydExhYmVsKCkgewotCQlyZXR1cm4gZ2V0UmVsYXRpdmVQYXRoKCkgKyAiIFsiICsgZ2V0QXJ0ZWZhY3RUeXBlKCkuZ2V0UGx1cmFsTGFiZWwoKSArICJdIjsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRTaG9ydExhYmVsKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVsYXRpdmVQYXRoKCkgKyAiIFsiICsgZ2V0QXJ0ZWZhY3RUeXBlKCkuZ2V0UGx1cmFsTGFiZWwoKSArICJdIjsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzLkFydGVmYWN0U2V0I3RvU3RyaW5nKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbG9jYXRpb24gKyAiIFsiICsgc3VwZXIudG9TdHJpbmcoKSArICJdIjsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLmFydGVmYWN0cy5BcnRlZmFjdFNldCN0b1N0cmluZygpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb24gKyAiIFsiICsgc3VwZXIudG9TdHJpbmcoKSArICJdIjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9Mb2NhbEJ1bmRsZUFydGVmYWN0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9Mb2NhbEJ1bmRsZUFydGVmYWN0LmphdmEKaW5kZXggZjc5NTgyMC4uZTZhMWY5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvTG9jYWxCdW5kbGVBcnRlZmFjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0xvY2FsQnVuZGxlQXJ0ZWZhY3QuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLmFydGVmYWN0czsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTE3LDM4ICsxOCwzNyBAQAogCiAvKioKICAqIEFuIGV4dGVuc2lvbiB0byB7QGxpbmsgQnVuZGxlQXJ0ZWZhY3R9IHRvIHRha2Ugc29tZSBtb3JlIGluZm9ybWF0aW9uIG9mIGxvY2FsIGJ1bmRsZXMuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgTG9jYWxCdW5kbGVBcnRlZmFjdCBleHRlbmRzIEJ1bmRsZUFydGVmYWN0IGltcGxlbWVudHMgSUxvY2FsQXJ0ZWZhY3QgewogCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc0Rvd25sb2FkZWRTb3VyY2VzOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNEb3dubG9hZGVkU291cmNlczsKIAotCXByaXZhdGUgZmluYWwgRmlsZSBmaWxlOworICAgIHByaXZhdGUgZmluYWwgRmlsZSBmaWxlOwogCi0JcHVibGljIExvY2FsQnVuZGxlQXJ0ZWZhY3QoU3RyaW5nIG5hbWUsIFN0cmluZyBzeW1ib2xpY05hbWUsIE9zZ2lWZXJzaW9uIHZlcnNpb24sIGJvb2xlYW4gaGFzRG93bmxvYWRlZFNvdXJjZXMsCi0JCQlVUkkgZmlsZVVSSSkgewotCQlzdXBlcihuYW1lLCBzeW1ib2xpY05hbWUsIHZlcnNpb24sIHN5bWJvbGljTmFtZSwgc3ltYm9saWNOYW1lKTsKLQkJdGhpcy5oYXNEb3dubG9hZGVkU291cmNlcyA9IGhhc0Rvd25sb2FkZWRTb3VyY2VzOwotCQl0aGlzLmZpbGUgPSAoZmlsZVVSSSAhPSBudWxsID8gbmV3IEZpbGUoZmlsZVVSSSkgOiBudWxsKTsKLQl9CisgICAgcHVibGljIExvY2FsQnVuZGxlQXJ0ZWZhY3QoU3RyaW5nIG5hbWUsIFN0cmluZyBzeW1ib2xpY05hbWUsIE9zZ2lWZXJzaW9uIHZlcnNpb24sIGJvb2xlYW4gaGFzRG93bmxvYWRlZFNvdXJjZXMsIFVSSSBmaWxlVVJJKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIHN5bWJvbGljTmFtZSwgdmVyc2lvbiwgc3ltYm9saWNOYW1lLCBzeW1ib2xpY05hbWUpOworICAgICAgICB0aGlzLmhhc0Rvd25sb2FkZWRTb3VyY2VzID0gaGFzRG93bmxvYWRlZFNvdXJjZXM7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGVVUkkgIT0gbnVsbCA/IG5ldyBGaWxlKGZpbGVVUkkpIDogbnVsbDsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBpc1NvdXJjZURvd25sb2FkZWQoKSB7Ci0JCXJldHVybiBoYXNEb3dubG9hZGVkU291cmNlczsKLQl9CisgICAgcHVibGljIGJvb2xlYW4gaXNTb3VyY2VEb3dubG9hZGVkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5oYXNEb3dubG9hZGVkU291cmNlczsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFNpZ25hdHVyZSgpIHsKLQkJU3RyaW5nIHNpZ25hdHVyZSA9IHN1cGVyLmdldFNpZ25hdHVyZSgpOwotCQlpZiAoaGFzRG93bmxvYWRlZFNvdXJjZXMpIHsKLQkJCXNpZ25hdHVyZSArPSAiK1NvdXJjZSI7Ci0JCX0KLQkJcmV0dXJuIHNpZ25hdHVyZTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRTaWduYXR1cmUoKSB7CisgICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSBzdXBlci5nZXRTaWduYXR1cmUoKTsKKyAgICAgICAgaWYgKHRoaXMuaGFzRG93bmxvYWRlZFNvdXJjZXMpIHsKKyAgICAgICAgICAgIHNpZ25hdHVyZSArPSAiK1NvdXJjZSI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNpZ25hdHVyZTsKKyAgICB9CiAKLQlwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gZmlsZTsKLQl9CisgICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmlsZTsKKyAgICB9CiAKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9Mb2NhbExpYnJhcnlBcnRlZmFjdC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9hcnRlZmFjdHMvTG9jYWxMaWJyYXJ5QXJ0ZWZhY3QuamF2YQppbmRleCBjZTY1YTQwLi42YTIyMzkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL2FydGVmYWN0cy9Mb2NhbExpYnJhcnlBcnRlZmFjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvYXJ0ZWZhY3RzL0xvY2FsTGlicmFyeUFydGVmYWN0LmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5hcnRlZmFjdHM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0xNiwyNSArMTcsMjIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uT3NnaVZlcnNpb247CiAKIC8qKgotICogQW4gZXh0ZW5zaW9uIHRvIHtAbGluayBCdW5kbGVBcnRlZmFjdH0gdG8gdGFrZSBzb21lIG1vcmUgaW5mb3JtYXRpb24gb2YgbG9jYWwKLSAqIGJ1bmRsZXMuCi0gKiAKKyAqIEFuIGV4dGVuc2lvbiB0byB7QGxpbmsgQnVuZGxlQXJ0ZWZhY3R9IHRvIHRha2Ugc29tZSBtb3JlIGluZm9ybWF0aW9uIG9mIGxvY2FsIGJ1bmRsZXMuCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjAKICAqLwogcHVibGljIGNsYXNzIExvY2FsTGlicmFyeUFydGVmYWN0IGV4dGVuZHMgTGlicmFyeUFydGVmYWN0IGltcGxlbWVudHMgSUxvY2FsQXJ0ZWZhY3QgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjc1MjI3OTcxNDUyNTMwNDM3NEw7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGZpbGU7CiAKLQlwcml2YXRlIGZpbmFsIEZpbGUgZmlsZTsKKyAgICBwdWJsaWMgTG9jYWxMaWJyYXJ5QXJ0ZWZhY3QoU3RyaW5nIG5hbWUsIFN0cmluZyBzeW1ib2xpY05hbWUsIE9zZ2lWZXJzaW9uIHZlcnNpb24sIFVSSSBmaWxlKSB7CisgICAgICAgIHN1cGVyKG5hbWUsIHN5bWJvbGljTmFtZSwgdmVyc2lvbiwgc3ltYm9saWNOYW1lLCBzeW1ib2xpY05hbWUpOworICAgICAgICB0aGlzLmZpbGUgPSBuZXcgRmlsZShmaWxlKTsKKyAgICB9CiAKLQlwdWJsaWMgTG9jYWxMaWJyYXJ5QXJ0ZWZhY3QoU3RyaW5nIG5hbWUsIFN0cmluZyBzeW1ib2xpY05hbWUsIE9zZ2lWZXJzaW9uIHZlcnNpb24sIFVSSSBmaWxlKSB7Ci0JCXN1cGVyKG5hbWUsIHN5bWJvbGljTmFtZSwgdmVyc2lvbiwgc3ltYm9saWNOYW1lLCBzeW1ib2xpY05hbWUpOwotCQl0aGlzLmZpbGUgPSBuZXcgRmlsZShmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gZmlsZTsKLQl9CisgICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmlsZTsKKyAgICB9CiAKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL3Byb3Zpc2lvbmluZy9JQnVuZGxlUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL3Byb3Zpc2lvbmluZy9JQnVuZGxlUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyLmphdmEKaW5kZXggNDI5Y2MyYi4uNjQwYWY2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9wcm92aXNpb25pbmcvSUJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvcHJvdmlzaW9uaW5nL0lCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnByb3Zpc2lvbmluZzsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzLkFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXI7CkBAIC0xNSw5ICsxNiw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwogCiAvKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIGdldCBub3RpZmllZCBpZiBhIHtAbGluayBCdW5kbGVSZXBvc2l0b3J5fQotICogc3RvcmVkIGluIHRoZSB7QGxpbmsgQXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcn0gaXMgY2hhbmdlZC4KLSAqIAorICogSW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UgZ2V0IG5vdGlmaWVkIGlmIGEge0BsaW5rIEJ1bmRsZVJlcG9zaXRvcnl9IHN0b3JlZCBpbiB0aGUKKyAqIHtAbGluayBBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyfSBpcyBjaGFuZ2VkLgorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4xCiAgKiBAc2VlIEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIjYWRkQnVuZGxlUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyKElCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIpCkBAIC0yNSwxMyArMjYsMTEgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBJQnVuZGxlUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyIHsKIAotCS8qKgotCSAqIE5vdGlmaWVzIGNoYW5nZXMgdG8gdGhlIHtAbGluayBCdW5kbGVSZXBvc2l0b3J5fSBvZiB0aGUgc3VwcGxpZWQKLQkgKiB7QGxpbmsgSVJ1bnRpbWV9LgotCSAqIAotCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lIGluc3RhbmNlIHdoaWNoIHtAbGluayBCdW5kbGVSZXBvc2l0b3J5fSBoYXMKLQkgKiAgICAgICAgY2hhbmdlZAotCSAqLwotCXZvaWQgYnVuZGxlUmVwb3NpdG9yeUNoYW5nZWQoSVJ1bnRpbWUgcnVudGltZSk7CisgICAgLyoqCisgICAgICogTm90aWZpZXMgY2hhbmdlcyB0byB0aGUge0BsaW5rIEJ1bmRsZVJlcG9zaXRvcnl9IG9mIHRoZSBzdXBwbGllZCB7QGxpbmsgSVJ1bnRpbWV9LgorICAgICAqCisgICAgICogQHBhcmFtIHJ1bnRpbWUgdGhlIHJ1bnRpbWUgaW5zdGFuY2Ugd2hpY2gge0BsaW5rIEJ1bmRsZVJlcG9zaXRvcnl9IGhhcyBjaGFuZ2VkCisgICAgICovCisgICAgdm9pZCBidW5kbGVSZXBvc2l0b3J5Q2hhbmdlZChJUnVudGltZSBydW50aW1lKTsKIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9wcm92aXNpb25pbmcvUmVwb3NpdG9yeVByb3Zpc2lvbmluZ0pvYi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9wcm92aXNpb25pbmcvUmVwb3NpdG9yeVByb3Zpc2lvbmluZ0pvYi5qYXZhCmluZGV4IDM1ZjliM2UuLmVjYTUyMjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvcHJvdmlzaW9uaW5nL1JlcG9zaXRvcnlQcm92aXNpb25pbmdKb2IuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL3Byb3Zpc2lvbmluZy9SZXBvc2l0b3J5UHJvdmlzaW9uaW5nSm9iLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5wcm92aXNpb25pbmc7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0zMSwxNDMgKzMyLDEzNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKIAogLyoqCi0gKiBFY2xpcHNlIGJhY2tncm91bmQgam9iIHRoYXQgZG93bmxvYWRzIHNlbGVjdGVkIGJ1bmRsZXMgYW5kIGxpYnJhcmllcyBmcm9tIHRoZQotICogcmVtb3RlIGVudGVycHJpc2UgYnVuZGxlIHJlcG9zaXRvcnkuCi0gKiAKKyAqIEVjbGlwc2UgYmFja2dyb3VuZCBqb2IgdGhhdCBkb3dubG9hZHMgc2VsZWN0ZWQgYnVuZGxlcyBhbmQgbGlicmFyaWVzIGZyb20gdGhlIHJlbW90ZSBlbnRlcnByaXNlIGJ1bmRsZSByZXBvc2l0b3J5LgorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5UHJvdmlzaW9uaW5nSm9iIGV4dGVuZHMgSm9iIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBDT05URU5UX0ZBTUlMWSA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgQ09OVEVOVF9GQU1JTFkgPSBuZXcgT2JqZWN0KCk7CiAKLQlwcml2YXRlIFNldDxBcnRlZmFjdD4gYXJ0aWZhY3RzVG9Eb3dubG9hZDsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxBcnRlZmFjdD4gYXJ0aWZhY3RzVG9Eb3dubG9hZDsKIAotCXByaXZhdGUgYm9vbGVhbiBkb3dubG9hZFNvdXJjZXMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZG93bmxvYWRTb3VyY2VzID0gZmFsc2U7CiAKLQlwcml2YXRlIGJvb2xlYW4gZG93bmxvYWRCaW5hcnkgPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBkb3dubG9hZEJpbmFyeSA9IHRydWU7CiAKLQlwcm90ZWN0ZWQgU2V0PElSdW50aW1lPiBydW50aW1lczsKKyAgICBwcm90ZWN0ZWQgU2V0PElSdW50aW1lPiBydW50aW1lczsKIAotCXB1YmxpYyBSZXBvc2l0b3J5UHJvdmlzaW9uaW5nSm9iKFNldDxJUnVudGltZT4gcnVudGltZXMsIFNldDxBcnRlZmFjdD4gYXJ0aWZhY3RzVG9Eb3dubG9hZCwgYm9vbGVhbiBkb3dubG9hZFNvdXJjZXMpIHsKLQkJdGhpcyhydW50aW1lcywgYXJ0aWZhY3RzVG9Eb3dubG9hZCwgdHJ1ZSwgZG93bmxvYWRTb3VyY2VzKTsKLQl9CisgICAgcHVibGljIFJlcG9zaXRvcnlQcm92aXNpb25pbmdKb2IoU2V0PElSdW50aW1lPiBydW50aW1lcywgU2V0PEFydGVmYWN0PiBhcnRpZmFjdHNUb0Rvd25sb2FkLCBib29sZWFuIGRvd25sb2FkU291cmNlcykgeworICAgICAgICB0aGlzKHJ1bnRpbWVzLCBhcnRpZmFjdHNUb0Rvd25sb2FkLCB0cnVlLCBkb3dubG9hZFNvdXJjZXMpOworICAgIH0KIAotCXB1YmxpYyBSZXBvc2l0b3J5UHJvdmlzaW9uaW5nSm9iKFNldDxJUnVudGltZT4gcnVudGltZXMsIFNldDxBcnRlZmFjdD4gYXJ0aWZhY3RzVG9Eb3dubG9hZCwgYm9vbGVhbiBkb3dubG9hZEJpbmFyeSwKLQkJYm9vbGVhbiBkb3dubG9hZFNvdXJjZXMpIHsKLQkJc3VwZXIoIkRvd25sb2FkaW5nIGJ1bmRsZXMgYW5kIGxpYnJhcmllcyBmcm9tIEVudGVycHJpc2UgQnVuZGxlIFJlcG9zaXRvcnkiKTsKLQkJdGhpcy5ydW50aW1lcyA9IHJ1bnRpbWVzOwotCQl0aGlzLmFydGlmYWN0c1RvRG93bmxvYWQgPSBhcnRpZmFjdHNUb0Rvd25sb2FkOwotCQl0aGlzLmRvd25sb2FkU291cmNlcyA9IGRvd25sb2FkU291cmNlczsKLQkJdGhpcy5kb3dubG9hZEJpbmFyeSA9IGRvd25sb2FkQmluYXJ5OwotCQlzZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JfQorICAgIHB1YmxpYyBSZXBvc2l0b3J5UHJvdmlzaW9uaW5nSm9iKFNldDxJUnVudGltZT4gcnVudGltZXMsIFNldDxBcnRlZmFjdD4gYXJ0aWZhY3RzVG9Eb3dubG9hZCwgYm9vbGVhbiBkb3dubG9hZEJpbmFyeSwgYm9vbGVhbiBkb3dubG9hZFNvdXJjZXMpIHsKKyAgICAgICAgc3VwZXIoIkRvd25sb2FkaW5nIGJ1bmRsZXMgYW5kIGxpYnJhcmllcyBmcm9tIEVudGVycHJpc2UgQnVuZGxlIFJlcG9zaXRvcnkiKTsKKyAgICAgICAgdGhpcy5ydW50aW1lcyA9IHJ1bnRpbWVzOworICAgICAgICB0aGlzLmFydGlmYWN0c1RvRG93bmxvYWQgPSBhcnRpZmFjdHNUb0Rvd25sb2FkOworICAgICAgICB0aGlzLmRvd25sb2FkU291cmNlcyA9IGRvd25sb2FkU291cmNlczsKKyAgICAgICAgdGhpcy5kb3dubG9hZEJpbmFyeSA9IGRvd25sb2FkQmluYXJ5OworICAgICAgICBzZXRQcmlvcml0eShKb2IuTE9ORyk7CisgICAgfQogCi0JcHVibGljIFNldDxJUnVudGltZT4gZ2V0UnVudGltZXMoKSB7Ci0JCXJldHVybiBydW50aW1lczsKLQl9CisgICAgcHVibGljIFNldDxJUnVudGltZT4gZ2V0UnVudGltZXMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJ1bnRpbWVzOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQlyZXR1cm4gQ09OVEVOVF9GQU1JTFkgPT0gZmFtaWx5OwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKKyAgICAgICAgcmV0dXJuIENPTlRFTlRfRkFNSUxZID09IGZhbWlseTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBjb3B5RGlyZWN0b3J5Q29udGVudChGaWxlIGZyb20sIEZpbGUgdG8pIHsKLQkJZm9yIChGaWxlIGZpbGUgOiBmcm9tLmxpc3RGaWxlcygpKSB7Ci0JCQlpZiAoZmlsZS5pc0ZpbGUoKSkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQkJCUZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKHRvLCBmaWxlTmFtZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJbmV3RmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJCUZpbGVDb3B5VXRpbHMuY29weShmaWxlLCBuZXdGaWxlKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIGNvcHlEaXJlY3RvcnlDb250ZW50KEZpbGUgZnJvbSwgRmlsZSB0bykgeworICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IGZyb20ubGlzdEZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUodG8sIGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBuZXdGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZUNvcHlVdGlscy5jb3B5KGZpbGUsIG5ld0ZpbGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBjb3B5RG93bmxvYWRlZEFydGlmYWN0c0ludG9TZXJ2ZXIoRmlsZSBidW5kbGVzRmlsZSwgRmlsZSBsaWJyYXJ5RmlsZSkgewotCQlmb3IgKElSdW50aW1lIHJ1bnRpbWUgOiBydW50aW1lcykgewotCQkJVmlyZ29TZXJ2ZXJSdW50aW1lIHNlcnZlclJ1bnRpbWUgPSAoVmlyZ29TZXJ2ZXJSdW50aW1lKSBydW50aW1lLmxvYWRBZGFwdGVyKFZpcmdvU2VydmVyUnVudGltZS5jbGFzcywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWNvcHlEaXJlY3RvcnlDb250ZW50KGJ1bmRsZXNGaWxlLCBuZXcgRmlsZShzZXJ2ZXJSdW50aW1lLmdldFVzZXJMZXZlbEJ1bmRsZVJlcG9zaXRvcnlQYXRoKCkpKTsKLQkJCWNvcHlEaXJlY3RvcnlDb250ZW50KGxpYnJhcnlGaWxlLCBuZXcgRmlsZShzZXJ2ZXJSdW50aW1lLmdldFVzZXJMZXZlbExpYnJhcnlSZXBvc2l0b3J5UGF0aCgpKSk7Ci0JCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5RG93bmxvYWRlZEFydGlmYWN0c0ludG9TZXJ2ZXIoRmlsZSBidW5kbGVzRmlsZSwgRmlsZSBsaWJyYXJ5RmlsZSkgeworICAgICAgICBmb3IgKElSdW50aW1lIHJ1bnRpbWUgOiB0aGlzLnJ1bnRpbWVzKSB7CisgICAgICAgICAgICBWaXJnb1NlcnZlclJ1bnRpbWUgc2VydmVyUnVudGltZSA9IChWaXJnb1NlcnZlclJ1bnRpbWUpIHJ1bnRpbWUubG9hZEFkYXB0ZXIoVmlyZ29TZXJ2ZXJSdW50aW1lLmNsYXNzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKyAgICAgICAgICAgIGNvcHlEaXJlY3RvcnlDb250ZW50KGJ1bmRsZXNGaWxlLCBuZXcgRmlsZShzZXJ2ZXJSdW50aW1lLmdldFVzZXJMZXZlbEJ1bmRsZVJlcG9zaXRvcnlQYXRoKCkpKTsKKyAgICAgICAgICAgIGNvcHlEaXJlY3RvcnlDb250ZW50KGxpYnJhcnlGaWxlLCBuZXcgRmlsZShzZXJ2ZXJSdW50aW1lLmdldFVzZXJMZXZlbExpYnJhcnlSZXBvc2l0b3J5UGF0aCgpKSk7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCi0JCWlmIChkb3dubG9hZFNvdXJjZXMpIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCJEb3dubG9hZGluZyBzZWxlY3RlZCBidW5kbGVzIGFuZCBsaWJyYXJpZXMiLCAoYXJ0aWZhY3RzVG9Eb3dubG9hZC5zaXplKCkgKiAyKSk7Ci0JCX0gZWxzZSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiRG93bmxvYWRpbmcgc2VsZWN0ZWQgYnVuZGxlcyBhbmQgbGlicmFyaWVzIiwgYXJ0aWZhY3RzVG9Eb3dubG9hZC5zaXplKCkpOwotCQl9CisgICAgICAgIGlmICh0aGlzLmRvd25sb2FkU291cmNlcykgeworICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIkRvd25sb2FkaW5nIHNlbGVjdGVkIGJ1bmRsZXMgYW5kIGxpYnJhcmllcyIsIHRoaXMuYXJ0aWZhY3RzVG9Eb3dubG9hZC5zaXplKCkgKiAyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCJEb3dubG9hZGluZyBzZWxlY3RlZCBidW5kbGVzIGFuZCBsaWJyYXJpZXMiLCB0aGlzLmFydGlmYWN0c1RvRG93bmxvYWQuc2l6ZSgpKTsKKyAgICAgICAgfQogCi0JCUlQYXRoIG91dHB1dFBhdGggPSBTZXJ2ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkuYXBwZW5kKCJyZXBvc2l0b3J5LWRvd25sb2Fkcy0iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlGaWxlIGJ1bmRsZXNGaWxlID0gb3V0cHV0UGF0aC5hcHBlbmQoImJ1bmRsZXMiKS50b0ZpbGUoKTsKLQkJaWYgKCFidW5kbGVzRmlsZS5leGlzdHMoKSkgewotCQkJYnVuZGxlc0ZpbGUubWtkaXJzKCk7Ci0JCX0KLQkJRmlsZSBsaWJyYXJ5RmlsZSA9IG91dHB1dFBhdGguYXBwZW5kKCJsaWJyYXJpZXMiKS50b0ZpbGUoKTsKLQkJaWYgKCFsaWJyYXJ5RmlsZS5leGlzdHMoKSkgewotCQkJbGlicmFyeUZpbGUubWtkaXJzKCk7Ci0JCX0KKyAgICAgICAgSVBhdGggb3V0cHV0UGF0aCA9IFNlcnZlckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoInJlcG9zaXRvcnktZG93bmxvYWRzLSIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIEZpbGUgYnVuZGxlc0ZpbGUgPSBvdXRwdXRQYXRoLmFwcGVuZCgiYnVuZGxlcyIpLnRvRmlsZSgpOworICAgICAgICBpZiAoIWJ1bmRsZXNGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBidW5kbGVzRmlsZS5ta2RpcnMoKTsKKyAgICAgICAgfQorICAgICAgICBGaWxlIGxpYnJhcnlGaWxlID0gb3V0cHV0UGF0aC5hcHBlbmQoImxpYnJhcmllcyIpLnRvRmlsZSgpOworICAgICAgICBpZiAoIWxpYnJhcnlGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBsaWJyYXJ5RmlsZS5ta2RpcnMoKTsKKyAgICAgICAgfQogCi0JCWZvciAoQXJ0ZWZhY3QgYXJ0aWZhY3QgOiB0aGlzLmFydGlmYWN0c1RvRG93bmxvYWQpIHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGRvd25sb2FkQmluYXJ5KSB7Ci0JCQkJZG93bmxvYWRCaW5hcnkobW9uaXRvciwgYnVuZGxlc0ZpbGUsIGxpYnJhcnlGaWxlLCBhcnRpZmFjdCk7Ci0JCQl9Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCWlmIChkb3dubG9hZFNvdXJjZXMpIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQorICAgICAgICBmb3IgKEFydGVmYWN0IGFydGlmYWN0IDogdGhpcy5hcnRpZmFjdHNUb0Rvd25sb2FkKSB7CisgICAgICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLmRvd25sb2FkQmluYXJ5KSB7CisgICAgICAgICAgICAgICAgZG93bmxvYWRCaW5hcnkobW9uaXRvciwgYnVuZGxlc0ZpbGUsIGxpYnJhcnlGaWxlLCBhcnRpZmFjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKKyAgICAgICAgICAgIGlmICh0aGlzLmRvd25sb2FkU291cmNlcykgeworICAgICAgICAgICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlkb3dubG9hZFNvdXJjZShtb25pdG9yLCBidW5kbGVzRmlsZSwgYXJ0aWZhY3QpOwotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgZG93bmxvYWRTb3VyY2UobW9uaXRvciwgYnVuZGxlc0ZpbGUsIGFydGlmYWN0KTsKKyAgICAgICAgICAgICAgICBtb25pdG9yLndvcmtlZCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJY29weURvd25sb2FkZWRBcnRpZmFjdHNJbnRvU2VydmVyKGJ1bmRsZXNGaWxlLCBsaWJyYXJ5RmlsZSk7CisgICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisgICAgICAgIH0KKyAgICAgICAgY29weURvd25sb2FkZWRBcnRpZmFjdHNJbnRvU2VydmVyKGJ1bmRsZXNGaWxlLCBsaWJyYXJ5RmlsZSk7CiAKLQkJLy8gcmVmcmVzaCB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gY2FjaGUgb2YgYnVuZGxlcyBhbmQgbGlicmFyaWVzCi0JCWZvciAoSVJ1bnRpbWUgcnVudGltZSA6IHJ1bnRpbWVzKSB7Ci0JCQlTZXJ2ZXJDb3JlUGx1Z2luLmdldEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKS5yZWZyZXNoQnVuZGxlUmVwb3NpdG9yeShydW50aW1lKTsKLQkJfQorICAgICAgICAvLyByZWZyZXNoIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBjYWNoZSBvZiBidW5kbGVzIGFuZCBsaWJyYXJpZXMKKyAgICAgICAgZm9yIChJUnVudGltZSBydW50aW1lIDogdGhpcy5ydW50aW1lcykgeworICAgICAgICAgICAgU2VydmVyQ29yZVBsdWdpbi5nZXRBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCkucmVmcmVzaEJ1bmRsZVJlcG9zaXRvcnkocnVudGltZSk7CisgICAgICAgIH0KIAotCQltb25pdG9yLmRvbmUoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQorICAgICAgICBtb25pdG9yLmRvbmUoKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgZG93bmxvYWRCaW5hcnkoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBGaWxlIGJ1bmRsZXNGaWxlLCBGaWxlIGxpYnJhcnlGaWxlLCBJQXJ0ZWZhY3RUeXBlZCBhcnRpZmFjdCkgewotCQlpZiAoYXJ0aWZhY3QgaW5zdGFuY2VvZiBCdW5kbGVBcnRlZmFjdCkgewotCQkJV2ViRG93bmxvYWRVdGlscy5kb3dubG9hZEZpbGUoCVJlcG9zaXRvcnlVdGlscy5nZXRSZXNvdXJjZVVybCgJKEJ1bmRsZUFydGVmYWN0KSBhcnRpZmFjdCwKLQkJCQkJCQkJCQkJCQkJCQkJCQlSZXBvc2l0b3J5VXRpbHMuRE9XTkxPQURfVFlQRV9CSU5BUlkpLAotCQkJCQkJCQkJCQlidW5kbGVzRmlsZSwgbW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQlXZWJEb3dubG9hZFV0aWxzLmRvd25sb2FkRmlsZSgJUmVwb3NpdG9yeVV0aWxzLmdldFJlc291cmNlVXJsKAkoTGlicmFyeUFydGVmYWN0KSBhcnRpZmFjdCwKLQkJCQkJCQkJCQkJCQkJCQkJCQlSZXBvc2l0b3J5VXRpbHMuRE9XTkxPQURfVFlQRV9MSUJSQVJZKSwKLQkJCQkJCQkJCQkJbGlicmFyeUZpbGUsIG1vbml0b3IpOwotCQl9Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIGRvd25sb2FkQmluYXJ5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgRmlsZSBidW5kbGVzRmlsZSwgRmlsZSBsaWJyYXJ5RmlsZSwgSUFydGVmYWN0VHlwZWQgYXJ0aWZhY3QpIHsKKyAgICAgICAgaWYgKGFydGlmYWN0IGluc3RhbmNlb2YgQnVuZGxlQXJ0ZWZhY3QpIHsKKyAgICAgICAgICAgIFdlYkRvd25sb2FkVXRpbHMuZG93bmxvYWRGaWxlKFJlcG9zaXRvcnlVdGlscy5nZXRSZXNvdXJjZVVybCgoQnVuZGxlQXJ0ZWZhY3QpIGFydGlmYWN0LCBSZXBvc2l0b3J5VXRpbHMuRE9XTkxPQURfVFlQRV9CSU5BUlkpLAorICAgICAgICAgICAgICAgIGJ1bmRsZXNGaWxlLCBtb25pdG9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFdlYkRvd25sb2FkVXRpbHMuZG93bmxvYWRGaWxlKFJlcG9zaXRvcnlVdGlscy5nZXRSZXNvdXJjZVVybCgoTGlicmFyeUFydGVmYWN0KSBhcnRpZmFjdCwgUmVwb3NpdG9yeVV0aWxzLkRPV05MT0FEX1RZUEVfTElCUkFSWSksCisgICAgICAgICAgICAgICAgbGlicmFyeUZpbGUsIG1vbml0b3IpOworICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgZG93bmxvYWRTb3VyY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBGaWxlIGJ1bmRsZXNGaWxlLCBBcnRlZmFjdCBhcnRpZmFjdCkgewotCQlpZiAoYXJ0aWZhY3QgaW5zdGFuY2VvZiBCdW5kbGVBcnRlZmFjdCAmJiBhcnRpZmFjdC5pc1NvdXJjZUF2YWlsYWJsZSgpKSB7Ci0JCQlXZWJEb3dubG9hZFV0aWxzLmRvd25sb2FkRmlsZSgJUmVwb3NpdG9yeVV0aWxzLmdldFJlc291cmNlVXJsKAkoQnVuZGxlQXJ0ZWZhY3QpIGFydGlmYWN0LAotCQkJCQkJCQkJCQkJCQkJCQkJCVJlcG9zaXRvcnlVdGlscy5ET1dOTE9BRF9UWVBFX1NPVVJDRSksCi0JCQkJCQkJCQkJCWJ1bmRsZXNGaWxlLCBtb25pdG9yKTsKLQkJfQotCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb3dubG9hZFNvdXJjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIEZpbGUgYnVuZGxlc0ZpbGUsIEFydGVmYWN0IGFydGlmYWN0KSB7CisgICAgICAgIGlmIChhcnRpZmFjdCBpbnN0YW5jZW9mIEJ1bmRsZUFydGVmYWN0ICYmIGFydGlmYWN0LmlzU291cmNlQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgIFdlYkRvd25sb2FkVXRpbHMuZG93bmxvYWRGaWxlKFJlcG9zaXRvcnlVdGlscy5nZXRSZXNvdXJjZVVybCgoQnVuZGxlQXJ0ZWZhY3QpIGFydGlmYWN0LCBSZXBvc2l0b3J5VXRpbHMuRE9XTkxPQURfVFlQRV9TT1VSQ0UpLAorICAgICAgICAgICAgICAgIGJ1bmRsZXNGaWxlLCBtb25pdG9yKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvcHJvdmlzaW9uaW5nL1JlcG9zaXRvcnlTb3VyY2VQcm92aXNpb25nSm9iLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL3Byb3Zpc2lvbmluZy9SZXBvc2l0b3J5U291cmNlUHJvdmlzaW9uZ0pvYi5qYXZhCmluZGV4IDNhMDU5YWYuLmU4NzA0ZGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2NvcmUvcHJvdmlzaW9uaW5nL1JlcG9zaXRvcnlTb3VyY2VQcm92aXNpb25nSm9iLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9wcm92aXNpb25pbmcvUmVwb3NpdG9yeVNvdXJjZVByb3Zpc2lvbmdKb2IuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnByb3Zpc2lvbmluZzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTI1LDQ3ICsyNiw0NCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKIAogLyoqCi0gKiB7QGxpbmsgSm9ifSB0aGF0IHByb3Zpc2lvbnMgdGhlIG1pc3Npbmcgc291cmNlIGphcnMgb2YgdGhlIGluc3RhbGxlZCBidW5kbGVzCi0gKiBpbiB0aGUgZG0gU2VydmVyJ3MgcmVwb3NpdG9yeS4KLSAqIAorICoge0BsaW5rIEpvYn0gdGhhdCBwcm92aXNpb25zIHRoZSBtaXNzaW5nIHNvdXJjZSBqYXJzIG9mIHRoZSBpbnN0YWxsZWQgYnVuZGxlcyBpbiB0aGUgZG0gU2VydmVyJ3MgcmVwb3NpdG9yeS4KKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgUmVwb3NpdG9yeVNvdXJjZVByb3Zpc2lvbmdKb2IgZXh0ZW5kcyBSZXBvc2l0b3J5UHJvdmlzaW9uaW5nSm9iIHsKIAotCXByaXZhdGUgTWFwPEFydGVmYWN0LCBGaWxlPiBvdXRwdXRGaWxlTWFwcGluZyA9IG5ldyBIYXNoTWFwPEFydGVmYWN0LCBGaWxlPigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPEFydGVmYWN0LCBGaWxlPiBvdXRwdXRGaWxlTWFwcGluZyA9IG5ldyBIYXNoTWFwPEFydGVmYWN0LCBGaWxlPigpOwogCi0JcHVibGljIFJlcG9zaXRvcnlTb3VyY2VQcm92aXNpb25nSm9iKFNldDxJUnVudGltZT4gcnVudGltZXMsIFNldDxBcnRlZmFjdD4gYXJ0aWZhY3RzVG9Eb3dubG9hZCkgewotCQlzdXBlcihydW50aW1lcywgYXJ0aWZhY3RzVG9Eb3dubG9hZCwgZmFsc2UsIHRydWUpOwotCX0KKyAgICBwdWJsaWMgUmVwb3NpdG9yeVNvdXJjZVByb3Zpc2lvbmdKb2IoU2V0PElSdW50aW1lPiBydW50aW1lcywgU2V0PEFydGVmYWN0PiBhcnRpZmFjdHNUb0Rvd25sb2FkKSB7CisgICAgICAgIHN1cGVyKHJ1bnRpbWVzLCBhcnRpZmFjdHNUb0Rvd25sb2FkLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG93bmxvYWRTb3VyY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBGaWxlIGJ1bmRsZXNGaWxlLCBBcnRlZmFjdCBhcnRpZmFjdCkgewotCQlpZiAoYXJ0aWZhY3QgaW5zdGFuY2VvZiBMb2NhbEJ1bmRsZUFydGVmYWN0KSB7Ci0JCQlMb2NhbEJ1bmRsZUFydGVmYWN0IGJ1bmRsZSA9IChMb2NhbEJ1bmRsZUFydGVmYWN0KSBhcnRpZmFjdDsKLQkJCVN0cmluZyB1cmwgPSBuZXcgU3RyaW5nQnVpbGRlcigpCi0JCQkJCS5hcHBlbmQoImh0dHA6Ly93d3cuc3ByaW5nc291cmNlLmNvbS9yZXBvc2l0b3J5L2FwcC9idW5kbGUvdmVyc2lvbi9kb3dubG9hZD9uYW1lPSIpCi0JCQkJCS5hcHBlbmQoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKS5hcHBlbmQoIiZ2ZXJzaW9uPSIpLmFwcGVuZChidW5kbGUuZ2V0VmVyc2lvbigpKQotCQkJCQkuYXBwZW5kKCImdHlwZT1zb3VyY2UiKS50b1N0cmluZygpOwotCQkJRmlsZSBvdXRwdXRGaWxlID0gV2ViRG93bmxvYWRVdGlscy5kb3dubG9hZEZpbGUodXJsLCBidW5kbGVzRmlsZSwgbW9uaXRvcik7Ci0JCQlpZiAob3V0cHV0RmlsZSAhPSBudWxsKSB7Ci0JCQkJb3V0cHV0RmlsZU1hcHBpbmcucHV0KGFydGlmYWN0LCBvdXRwdXRGaWxlKTsKLQkJCX0KLQkJfQotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb3dubG9hZFNvdXJjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIEZpbGUgYnVuZGxlc0ZpbGUsIEFydGVmYWN0IGFydGlmYWN0KSB7CisgICAgICAgIGlmIChhcnRpZmFjdCBpbnN0YW5jZW9mIExvY2FsQnVuZGxlQXJ0ZWZhY3QpIHsKKyAgICAgICAgICAgIExvY2FsQnVuZGxlQXJ0ZWZhY3QgYnVuZGxlID0gKExvY2FsQnVuZGxlQXJ0ZWZhY3QpIGFydGlmYWN0OworICAgICAgICAgICAgU3RyaW5nIHVybCA9IG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKCJodHRwOi8vd3d3LnNwcmluZ3NvdXJjZS5jb20vcmVwb3NpdG9yeS9hcHAvYnVuZGxlL3ZlcnNpb24vZG93bmxvYWQ/bmFtZT0iKS5hcHBlbmQoCisgICAgICAgICAgICAgICAgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKS5hcHBlbmQoIiZ2ZXJzaW9uPSIpLmFwcGVuZChidW5kbGUuZ2V0VmVyc2lvbigpKS5hcHBlbmQoIiZ0eXBlPXNvdXJjZSIpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBXZWJEb3dubG9hZFV0aWxzLmRvd25sb2FkRmlsZSh1cmwsIGJ1bmRsZXNGaWxlLCBtb25pdG9yKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm91dHB1dEZpbGVNYXBwaW5nLnB1dChhcnRpZmFjdCwgb3V0cHV0RmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb3B5RG93bmxvYWRlZEFydGlmYWN0c0ludG9TZXJ2ZXIoRmlsZSBidW5kbGVzRmlsZSwgRmlsZSBsaWJyYXJ5RmlsZSkgewotCQlmb3IgKE1hcC5FbnRyeTxBcnRlZmFjdCwgRmlsZT4gZW50cnkgOiBvdXRwdXRGaWxlTWFwcGluZy5lbnRyeVNldCgpKSB7Ci0JCQlpZiAoZW50cnkuZ2V0S2V5KCkgaW5zdGFuY2VvZiBMb2NhbEJ1bmRsZUFydGVmYWN0KSB7Ci0JCQkJRmlsZSBmb2xkZXIgPSAoKExvY2FsQnVuZGxlQXJ0ZWZhY3QpIGVudHJ5LmdldEtleSgpKS5nZXRGaWxlKCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCUZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKGZvbGRlciwgZW50cnkuZ2V0VmFsdWUoKS5nZXROYW1lKCkpOwotCQkJCXRyeSB7Ci0JCQkJCW91dHB1dEZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJCQlGaWxlQ29weVV0aWxzLmNvcHkoZW50cnkuZ2V0VmFsdWUoKSwgb3V0cHV0RmlsZSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5RG93bmxvYWRlZEFydGlmYWN0c0ludG9TZXJ2ZXIoRmlsZSBidW5kbGVzRmlsZSwgRmlsZSBsaWJyYXJ5RmlsZSkgeworICAgICAgICBmb3IgKE1hcC5FbnRyeTxBcnRlZmFjdCwgRmlsZT4gZW50cnkgOiB0aGlzLm91dHB1dEZpbGVNYXBwaW5nLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKSBpbnN0YW5jZW9mIExvY2FsQnVuZGxlQXJ0ZWZhY3QpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGZvbGRlciA9ICgoTG9jYWxCdW5kbGVBcnRlZmFjdCkgZW50cnkuZ2V0S2V5KCkpLmdldEZpbGUoKS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgICAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoZm9sZGVyLCBlbnRyeS5nZXRWYWx1ZSgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZS5jcmVhdGVOZXdGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgIEZpbGVDb3B5VXRpbHMuY29weShlbnRyeS5nZXRWYWx1ZSgpLCBvdXRwdXRGaWxlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvY29yZS9wcm92aXNpb25pbmcvUmVwb3NpdG9yeVV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL3Byb3Zpc2lvbmluZy9SZXBvc2l0b3J5VXRpbHMuamF2YQppbmRleCAzY2NjYzc1Li45MjBlZjA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL3Byb3Zpc2lvbmluZy9SZXBvc2l0b3J5VXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9jb3JlL3Byb3Zpc2lvbmluZy9SZXBvc2l0b3J5VXRpbHMuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnByb3Zpc2lvbmluZzsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CkBAIC01OSw3ICs2MCw3IEBACiAvKioKICAqIFV0aWxpdHkgY2xhc3MgdGhhdCBpcyBhYmxlIHRvIGNyZWF0ZSB7QGxpbmsgUmVwb3NpdG9yeX0gaW5zdGFuY2VzIGZyb20gZWl0aGVyIHRoZSByZW1vdGUgZW50ZXJwcmlzZSBidW5kbGUgcmVwb3NpdG9yeQogICogb3IgZnJvbSBhIGxvY2FsIGluc3RhbGxlZCBWaXJnbyBpbnN0YW5jZS4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBMZW8gRG9zIFNhbnRvcwogICogQHNpbmNlIDEuMC4wCkBAIC02Nyw1MDUgKzY4LDQ4MSBAQAogQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKIHB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5VXRpbHMgewogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9XTkxPQURfVFlQRV9CSU5BUlkgPSAiYmluYXJ5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1dOTE9BRF9UWVBFX0JJTkFSWSA9ICJiaW5hcnkiOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9XTkxPQURfVFlQRV9CSU5BUllfSEFTSCA9ICJiaW5hcnktaGFzaCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9XTkxPQURfVFlQRV9CSU5BUllfSEFTSCA9ICJiaW5hcnktaGFzaCI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1dOTE9BRF9UWVBFX0xJQlJBUlkgPSAibGlicmFyeSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9XTkxPQURfVFlQRV9MSUJSQVJZID0gImxpYnJhcnkiOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9XTkxPQURfVFlQRV9MSUJSQVJZX0hBU0ggPSAibGlicmFyeS1oYXNoIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1dOTE9BRF9UWVBFX0xJQlJBUllfSEFTSCA9ICJsaWJyYXJ5LWhhc2giOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9XTkxPQURfVFlQRV9MSUNFTlNFID0gImxpY2Vuc2UiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPV05MT0FEX1RZUEVfTElDRU5TRSA9ICJsaWNlbnNlIjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPV05MT0FEX1RZUEVfU09VUkNFID0gInNvdXJjZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9XTkxPQURfVFlQRV9TT1VSQ0UgPSAic291cmNlIjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPV05MT0FEX1RZUEVfU09VUkNFX0hBU0ggPSAic291cmNlLWhhc2giOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPV05MT0FEX1RZUEVfU09VUkNFX0hBU0ggPSAic291cmNlLWhhc2giOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSVRTX0JBU0UgPSAiaHR0cDovL3d3dy5zcHJpbmdzb3VyY2UuY29tL3JlcG9zaXRvcnkvYXBwIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJVFNfQkFTRSA9ICJodHRwOi8vd3d3LnNwcmluZ3NvdXJjZS5jb20vcmVwb3NpdG9yeS9hcHAiOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPV05MT0FEX0JBU0UgPSAiaHR0cDovL3JlcG9zaXRvcnkuc3ByaW5nc291cmNlLmNvbS9pdnkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET1dOTE9BRF9CQVNFID0gImh0dHA6Ly9yZXBvc2l0b3J5LnNwcmluZ3NvdXJjZS5jb20vaXZ5IjsKIAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb2VzUnVudGltZVN1cHBvcnRSZXBvc2l0b3JpZXMoSVJ1bnRpbWUgcnVudGltZSkgewotCQlJU2VydmVyUnVudGltZVByb3ZpZGVyIHByb3ZpZGVyID0gUnVudGltZVByb3ZpZGVycy5nZXRSdW50aW1lUHJvdmlkZXIocnVudGltZSk7Ci0JCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIFZpcmdvUnVudGltZVByb3ZpZGVyKSB7Ci0JCQlWaXJnb1J1bnRpbWVQcm92aWRlciB2aXJnb1Byb3ZpZGVyID0gKFZpcmdvUnVudGltZVByb3ZpZGVyKSBwcm92aWRlcjsKLQkJCUluc3RhbGxhdGlvblR5cGUgaW5zdGFsbCA9IHZpcmdvUHJvdmlkZXIuZ2V0SW5zdGFsbGF0aW9uVHlwZShydW50aW1lKTsKLQkJCWlmIChJbnN0YWxsYXRpb25UeXBlLk5BTk8uZXF1YWxzKGluc3RhbGwpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb2VzUnVudGltZVN1cHBvcnRSZXBvc2l0b3JpZXMoSVJ1bnRpbWUgcnVudGltZSkgeworICAgICAgICBJU2VydmVyUnVudGltZVByb3ZpZGVyIHByb3ZpZGVyID0gUnVudGltZVByb3ZpZGVycy5nZXRSdW50aW1lUHJvdmlkZXIocnVudGltZSk7CisgICAgICAgIGlmIChwcm92aWRlciBpbnN0YW5jZW9mIFZpcmdvUnVudGltZVByb3ZpZGVyKSB7CisgICAgICAgICAgICBWaXJnb1J1bnRpbWVQcm92aWRlciB2aXJnb1Byb3ZpZGVyID0gKFZpcmdvUnVudGltZVByb3ZpZGVyKSBwcm92aWRlcjsKKyAgICAgICAgICAgIEluc3RhbGxhdGlvblR5cGUgaW5zdGFsbCA9IHZpcmdvUHJvdmlkZXIuZ2V0SW5zdGFsbGF0aW9uVHlwZShydW50aW1lKTsKKyAgICAgICAgICAgIGlmIChJbnN0YWxsYXRpb25UeXBlLk5BTk8uZXF1YWxzKGluc3RhbGwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0JLyoqCi0JICogRG93bmxvYWRzIHRoZSBnaXZlbiA8Y29kZT5hcnRpZmFjdHM8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkb3dubG9hZEFyaWZhY3RzKGZpbmFsIFNldDxBcnRlZmFjdD4gYXJ0aWZhY3RzLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBTaGVsbCBzaGVsbCwKLQkJCWJvb2xlYW4gcmVzb2x2ZURlcGVuZGVuY2llcykgeworICAgIC8qKgorICAgICAqIERvd25sb2FkcyB0aGUgZ2l2ZW4gPGNvZGU+YXJ0aWZhY3RzPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZG93bmxvYWRBcmlmYWN0cyhmaW5hbCBTZXQ8QXJ0ZWZhY3Q+IGFydGlmYWN0cywgZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgU2hlbGwgc2hlbGwsIGJvb2xlYW4gcmVzb2x2ZURlcGVuZGVuY2llcykgewogCi0JCWlmIChyZXNvbHZlRGVwZW5kZW5jaWVzKSB7Ci0JCQlhcnRpZmFjdHMuYWRkQWxsKHJlc29sdmVEZXBlbmRlbmNpZXMoYXJ0aWZhY3RzLCBmYWxzZSkpOwotCQl9CisgICAgICAgIGlmIChyZXNvbHZlRGVwZW5kZW5jaWVzKSB7CisgICAgICAgICAgICBhcnRpZmFjdHMuYWRkQWxsKHJlc29sdmVEZXBlbmRlbmNpZXMoYXJ0aWZhY3RzLCBmYWxzZSkpOworICAgICAgICB9CiAKLQkJZmluYWwgU2V0PElSdW50aW1lPiBydW50aW1lcyA9IG5ldyBIYXNoU2V0PElSdW50aW1lPigpOworICAgICAgICBmaW5hbCBTZXQ8SVJ1bnRpbWU+IHJ1bnRpbWVzID0gbmV3IEhhc2hTZXQ8SVJ1bnRpbWU+KCk7CiAKLQkJU2VydmVyUnVudGltZVV0aWxzLmV4ZWN1dGUocHJvamVjdCwgbmV3IFNlcnZlclJ1bnRpbWVVdGlscy5TZXJ2ZXJSdW50aW1lQ2FsbGJhY2soKSB7CisgICAgICAgIFNlcnZlclJ1bnRpbWVVdGlscy5leGVjdXRlKHByb2plY3QsIG5ldyBTZXJ2ZXJSdW50aW1lVXRpbHMuU2VydmVyUnVudGltZUNhbGxiYWNrKCkgewogCi0JCQlwdWJsaWMgYm9vbGVhbiBkb1dpdGhSdW50aW1lKFZpcmdvU2VydmVyUnVudGltZSBydW50aW1lKSB7Ci0JCQkJcnVudGltZXMuYWRkKHJ1bnRpbWUuZ2V0UnVudGltZSgpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkb1dpdGhSdW50aW1lKFZpcmdvU2VydmVyUnVudGltZSBydW50aW1lKSB7CisgICAgICAgICAgICAgICAgcnVudGltZXMuYWRkKHJ1bnRpbWUuZ2V0UnVudGltZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQkJaWYgKHJ1bnRpbWVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgaWYgKHJ1bnRpbWVzLnNpemUoKSA+IDApIHsKIAotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKKyAgICAgICAgICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7CiAKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQlSZXBvc2l0b3J5UHJvdmlzaW9uaW5nSm9iIGpvYiA9IG5ldyBSZXBvc2l0b3J5UHJvdmlzaW9uaW5nSm9iKHJ1bnRpbWVzLCBhcnRpZmFjdHMsIHRydWUpOwotCQkJCQlqb2IucnVuKG1vbml0b3IpOwotCQkJCX0KLQkJCX07CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgUmVwb3NpdG9yeVByb3Zpc2lvbmluZ0pvYiBqb2IgPSBuZXcgUmVwb3NpdG9yeVByb3Zpc2lvbmluZ0pvYihydW50aW1lcywgYXJ0aWZhY3RzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgam9iLnJ1bihtb25pdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OwogCi0JCQl0cnkgewotCQkJCUlSdW5uYWJsZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwotCQkJCWNvbnRleHQucnVuKHRydWUsIHRydWUsIHJ1bm5hYmxlKTsKLQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTEpIHsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUyKSB7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIElSdW5uYWJsZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOworICAgICAgICAgICAgICAgIGNvbnRleHQucnVuKHRydWUsIHRydWUsIHJ1bm5hYmxlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIGEgQnVuZGxlRGVmaW5pdGlvbiBmb3IgdGhlIGdpdmVuIGJ1bmRsZSBzeW1ib2xpYyBuYW1lIGFuZCB2ZXJzaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS52aXJnby5rZXJuZWwucmVwb3NpdG9yeS5CdW5kbGVEZWZpbml0aW9uIGdldEJ1bmRsZURlZmluaXRpb24oZmluYWwgU3RyaW5nIGJ1bmRsZSwKLQkJCWZpbmFsIFN0cmluZyB2ZXJzaW9uLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZpbmFsIExpc3Q8b3JnLmVjbGlwc2UudmlyZ28ua2VybmVsLnJlcG9zaXRvcnkuQnVuZGxlRGVmaW5pdGlvbj4gYnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8b3JnLmVjbGlwc2UudmlyZ28ua2VybmVsLnJlcG9zaXRvcnkuQnVuZGxlRGVmaW5pdGlvbj4oKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgQnVuZGxlRGVmaW5pdGlvbiBmb3IgdGhlIGdpdmVuIGJ1bmRsZSBzeW1ib2xpYyBuYW1lIGFuZCB2ZXJzaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS52aXJnby5rZXJuZWwucmVwb3NpdG9yeS5CdW5kbGVEZWZpbml0aW9uIGdldEJ1bmRsZURlZmluaXRpb24oZmluYWwgU3RyaW5nIGJ1bmRsZSwgZmluYWwgU3RyaW5nIHZlcnNpb24sCisgICAgICAgIElQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgZmluYWwgTGlzdDxvcmcuZWNsaXBzZS52aXJnby5rZXJuZWwucmVwb3NpdG9yeS5CdW5kbGVEZWZpbml0aW9uPiBidW5kbGVzID0gbmV3IEFycmF5TGlzdDxvcmcuZWNsaXBzZS52aXJnby5rZXJuZWwucmVwb3NpdG9yeS5CdW5kbGVEZWZpbml0aW9uPigpOwogCi0JCVNlcnZlclJ1bnRpbWVVdGlscy5leGVjdXRlKHByb2plY3QsIG5ldyBTZXJ2ZXJSdW50aW1lVXRpbHMuU2VydmVyUnVudGltZUNhbGxiYWNrKCkgeworICAgICAgICBTZXJ2ZXJSdW50aW1lVXRpbHMuZXhlY3V0ZShwcm9qZWN0LCBuZXcgU2VydmVyUnVudGltZVV0aWxzLlNlcnZlclJ1bnRpbWVDYWxsYmFjaygpIHsKIAotCQkJcHVibGljIGJvb2xlYW4gZG9XaXRoUnVudGltZShWaXJnb1NlcnZlclJ1bnRpbWUgcnVudGltZSkgewotCQkJCXRyeSB7Ci0JCQkJCUJ1bmRsZVJlcG9zaXRvcnkgYnVuZGxlUmVwb3NpdG9yeSA9IFNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpCi0JCQkJCQkJLmdldEJ1bmRsZVJlcG9zaXRvcnkocnVudGltZS5nZXRSdW50aW1lKCkpOwotCQkJCQlvcmcuZWNsaXBzZS52aXJnby5rZXJuZWwucmVwb3NpdG9yeS5CdW5kbGVEZWZpbml0aW9uIGJ1bmRsZURlZmluaXRpb24gPSBidW5kbGVSZXBvc2l0b3J5LmZpbmRCeVN5bWJvbGljTmFtZSgKLQkJCQkJCQlidW5kbGUsIG5ldyBvcmcuZWNsaXBzZS52aXJnby51dGlsLm9zZ2kubWFuaWZlc3QuVmVyc2lvblJhbmdlKHZlcnNpb24pKTsKLQkJCQkJaWYgKGJ1bmRsZURlZmluaXRpb24gIT0gbnVsbCkgewotCQkJCQkJYnVuZGxlcy5hZGQoYnVuZGxlRGVmaW5pdGlvbik7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZG9XaXRoUnVudGltZShWaXJnb1NlcnZlclJ1bnRpbWUgcnVudGltZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZVJlcG9zaXRvcnkgYnVuZGxlUmVwb3NpdG9yeSA9IFNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmdldEJ1bmRsZVJlcG9zaXRvcnkocnVudGltZS5nZXRSdW50aW1lKCkpOworICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS52aXJnby5rZXJuZWwucmVwb3NpdG9yeS5CdW5kbGVEZWZpbml0aW9uIGJ1bmRsZURlZmluaXRpb24gPSBidW5kbGVSZXBvc2l0b3J5LmZpbmRCeVN5bWJvbGljTmFtZShidW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmVjbGlwc2UudmlyZ28udXRpbC5vc2dpLm1hbmlmZXN0LlZlcnNpb25SYW5nZSh2ZXJzaW9uKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGVEZWZpbml0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZXMuYWRkKGJ1bmRsZURlZmluaXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKIAotCQlpZiAoYnVuZGxlcy5zaXplKCkgPiAwKSB7Ci0JCQlyZXR1cm4gYnVuZGxlcy5nZXQoMCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgICAgICBpZiAoYnVuZGxlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gYnVuZGxlcy5nZXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB7QGxpbmsgQnVuZGxlQXJ0ZWZhY3R9cyB3aGljaCBidW5kbGUgc3ltYm9saWMgbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiA8Y29kZT52YWx1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXQ8QXJ0ZWZhY3Q+IGdldEltcG9ydEJ1bmRsZVByb3Bvc2FscyhmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBTdHJpbmcgdmFsdWUpIHsKLQkJZmluYWwgU2V0PEFydGVmYWN0PiBwYWNrYWdlcyA9IG5ldyBUcmVlU2V0PEFydGVmYWN0PihuZXcgQ29tcGFyYXRvcjxBcnRlZmFjdD4oKSB7CisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGxpbmsgQnVuZGxlQXJ0ZWZhY3R9cyB3aGljaCBidW5kbGUgc3ltYm9saWMgbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiA8Y29kZT52YWx1ZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXQ8QXJ0ZWZhY3Q+IGdldEltcG9ydEJ1bmRsZVByb3Bvc2FscyhmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgZmluYWwgU2V0PEFydGVmYWN0PiBwYWNrYWdlcyA9IG5ldyBUcmVlU2V0PEFydGVmYWN0PihuZXcgQ29tcGFyYXRvcjxBcnRlZmFjdD4oKSB7CiAKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShBcnRlZmFjdCBvMSwgQXJ0ZWZhY3QgbzIpIHsKLQkJCQlpZiAobzEuZ2V0TmFtZSgpICE9IG51bGwgJiYgbzEuZ2V0TmFtZSgpLmVxdWFscyhvMi5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiBvMS5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKG8yLmdldFZlcnNpb24oKSk7Ci0JCQkJfSBlbHNlIGlmIChvMS5nZXROYW1lKCkgIT0gbnVsbCAmJiBvMi5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbzEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvMi5nZXROYW1lKCkpOwotCQkJCX0gZWxzZSBpZiAobzEuZ2V0U3ltYm9saWNOYW1lKCkgIT0gbnVsbCAmJiBvMS5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMobzIuZ2V0U3ltYm9saWNOYW1lKCkpKSB7Ci0JCQkJCXJldHVybiBvMS5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKG8yLmdldFZlcnNpb24oKSk7Ci0JCQkJfSBlbHNlIGlmIChvMS5nZXRTeW1ib2xpY05hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBvMS5nZXRTeW1ib2xpY05hbWUoKS5jb21wYXJlVG8obzIuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfSk7CisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoQXJ0ZWZhY3QgbzEsIEFydGVmYWN0IG8yKSB7CisgICAgICAgICAgICAgICAgaWYgKG8xLmdldE5hbWUoKSAhPSBudWxsICYmIG8xLmdldE5hbWUoKS5lcXVhbHMobzIuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzEuZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyhvMi5nZXRWZXJzaW9uKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobzEuZ2V0TmFtZSgpICE9IG51bGwgJiYgbzIuZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8xLmdldE5hbWUoKS5jb21wYXJlVG8obzIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG8xLmdldFN5bWJvbGljTmFtZSgpICE9IG51bGwgJiYgbzEuZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzKG8yLmdldFN5bWJvbGljTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzEuZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyhvMi5nZXRWZXJzaW9uKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobzEuZ2V0U3ltYm9saWNOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzEuZ2V0U3ltYm9saWNOYW1lKCkuY29tcGFyZVRvKG8yLmdldFN5bWJvbGljTmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCVNlcnZlclJ1bnRpbWVVdGlscy5leGVjdXRlKHByb2plY3QsIG5ldyBTZXJ2ZXJSdW50aW1lVXRpbHMuU2VydmVyUnVudGltZUNhbGxiYWNrKCkgeworICAgICAgICBTZXJ2ZXJSdW50aW1lVXRpbHMuZXhlY3V0ZShwcm9qZWN0LCBuZXcgU2VydmVyUnVudGltZVV0aWxzLlNlcnZlclJ1bnRpbWVDYWxsYmFjaygpIHsKIAotCQkJcHVibGljIGJvb2xlYW4gZG9XaXRoUnVudGltZShWaXJnb1NlcnZlclJ1bnRpbWUgcnVudGltZSkgewotCQkJCXBhY2thZ2VzLmFkZEFsbChnZXRJbXBvcnRCdW5kbGVQcm9wb3NhbHNGb3JSdW50aW1lKHJ1bnRpbWUsIHByb2plY3QsIHZhbHVlKSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZG9XaXRoUnVudGltZShWaXJnb1NlcnZlclJ1bnRpbWUgcnVudGltZSkgeworICAgICAgICAgICAgICAgIHBhY2thZ2VzLmFkZEFsbChnZXRJbXBvcnRCdW5kbGVQcm9wb3NhbHNGb3JSdW50aW1lKHJ1bnRpbWUsIHByb2plY3QsIHZhbHVlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCXJldHVybiBwYWNrYWdlczsKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VzOwogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMge0BsaW5rIExpYnJhcnlBcnRlZmFjdH1zIHdoaWNoIGxpYnJhcnkgc3ltYm9saWMgbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiA8Y29kZT52YWx1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXQ8QXJ0ZWZhY3Q+IGdldEltcG9ydExpYnJhcnlQcm9wb3NhbHMoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0JCWZpbmFsIFNldDxBcnRlZmFjdD4gcGFja2FnZXMgPSBuZXcgVHJlZVNldDxBcnRlZmFjdD4obmV3IENvbXBhcmF0b3I8QXJ0ZWZhY3Q+KCkgeworICAgIC8qKgorICAgICAqIFJldHVybnMge0BsaW5rIExpYnJhcnlBcnRlZmFjdH1zIHdoaWNoIGxpYnJhcnkgc3ltYm9saWMgbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiA8Y29kZT52YWx1ZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXQ8QXJ0ZWZhY3Q+IGdldEltcG9ydExpYnJhcnlQcm9wb3NhbHMoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGZpbmFsIFNldDxBcnRlZmFjdD4gcGFja2FnZXMgPSBuZXcgVHJlZVNldDxBcnRlZmFjdD4obmV3IENvbXBhcmF0b3I8QXJ0ZWZhY3Q+KCkgewogCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoQXJ0ZWZhY3QgbzEsIEFydGVmYWN0IG8yKSB7Ci0JCQkJaWYgKG8xLmdldE5hbWUoKSAhPSBudWxsICYmIG8xLmdldE5hbWUoKS5lcXVhbHMobzIuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gbzEuZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyhvMi5nZXRWZXJzaW9uKCkpOwotCQkJCX0gZWxzZSBpZiAobzEuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG8xLmdldE5hbWUoKS5jb21wYXJlVG8obzIuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0pOworICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKEFydGVmYWN0IG8xLCBBcnRlZmFjdCBvMikgeworICAgICAgICAgICAgICAgIGlmIChvMS5nZXROYW1lKCkgIT0gbnVsbCAmJiBvMS5nZXROYW1lKCkuZXF1YWxzKG8yLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8xLmdldFZlcnNpb24oKS5jb21wYXJlVG8obzIuZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG8xLmdldE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvMS5nZXROYW1lKCkuY29tcGFyZVRvKG8yLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKIAotCQlTZXJ2ZXJSdW50aW1lVXRpbHMuZXhlY3V0ZShwcm9qZWN0LCBuZXcgU2VydmVyUnVudGltZVV0aWxzLlNlcnZlclJ1bnRpbWVDYWxsYmFjaygpIHsKKyAgICAgICAgU2VydmVyUnVudGltZVV0aWxzLmV4ZWN1dGUocHJvamVjdCwgbmV3IFNlcnZlclJ1bnRpbWVVdGlscy5TZXJ2ZXJSdW50aW1lQ2FsbGJhY2soKSB7CiAKLQkJCXB1YmxpYyBib29sZWFuIGRvV2l0aFJ1bnRpbWUoVmlyZ29TZXJ2ZXJSdW50aW1lIHJ1bnRpbWUpIHsKLQkJCQlwYWNrYWdlcy5hZGRBbGwoZ2V0SW1wb3J0TGlicmFyeVByb3Bvc2Fsc0ZvclJ1bnRpbWUocnVudGltZSwgcHJvamVjdCwgdmFsdWUpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkb1dpdGhSdW50aW1lKFZpcmdvU2VydmVyUnVudGltZSBydW50aW1lKSB7CisgICAgICAgICAgICAgICAgcGFja2FnZXMuYWRkQWxsKGdldEltcG9ydExpYnJhcnlQcm9wb3NhbHNGb3JSdW50aW1lKHJ1bnRpbWUsIHByb2plY3QsIHZhbHVlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCXJldHVybiBwYWNrYWdlczsKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VzOwogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMge0BsaW5rIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbGVyZXBvc2l0b3J5LmRvbWFpbi5QYWNrYWdlRXhwb3J0fXMgd2hpY2ggbmFtZSBtYXRjaGVzIHRoZSBnaXZlbgotCSAqIDxjb2RlPnZhbHVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNldDxvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uUGFja2FnZUV4cG9ydD4gZ2V0SW1wb3J0UGFja2FnZVByb3Bvc2FscygKLQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIFN0cmluZyB2YWx1ZSkgewotCQlmaW5hbCBTZXQ8b3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsZXJlcG9zaXRvcnkuZG9tYWluLlBhY2thZ2VFeHBvcnQ+IHBhY2thZ2VzID0gbmV3IFRyZWVTZXQ8b3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsZXJlcG9zaXRvcnkuZG9tYWluLlBhY2thZ2VFeHBvcnQ+KAotCQkJCW5ldyBDb21wYXJhdG9yPG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbGVyZXBvc2l0b3J5LmRvbWFpbi5QYWNrYWdlRXhwb3J0PigpIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAbGluayBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uUGFja2FnZUV4cG9ydH1zIHdoaWNoIG5hbWUgbWF0Y2hlcyB0aGUgZ2l2ZW4KKyAgICAgKiA8Y29kZT52YWx1ZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXQ8b3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsZXJlcG9zaXRvcnkuZG9tYWluLlBhY2thZ2VFeHBvcnQ+IGdldEltcG9ydFBhY2thZ2VQcm9wb3NhbHMoZmluYWwgSVByb2plY3QgcHJvamVjdCwKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGZpbmFsIFNldDxvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uUGFja2FnZUV4cG9ydD4gcGFja2FnZXMgPSBuZXcgVHJlZVNldDxvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uUGFja2FnZUV4cG9ydD4oCisgICAgICAgICAgICBuZXcgQ29tcGFyYXRvcjxvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uUGFja2FnZUV4cG9ydD4oKSB7CiAKLQkJCQkJcHVibGljIGludCBjb21wYXJlKG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbGVyZXBvc2l0b3J5LmRvbWFpbi5QYWNrYWdlRXhwb3J0IG8xLAotCQkJCQkJCW9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbGVyZXBvc2l0b3J5LmRvbWFpbi5QYWNrYWdlRXhwb3J0IG8yKSB7Ci0JCQkJCQlpZiAobzEuZ2V0TmFtZSgpLmVxdWFscyhvMi5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJcmV0dXJuIG8xLmdldFZlcnNpb24oKS5jb21wYXJlVG8obzIuZ2V0VmVyc2lvbigpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBvMS5nZXROYW1lKCkuY29tcGFyZVRvKG8yLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUob3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsZXJlcG9zaXRvcnkuZG9tYWluLlBhY2thZ2VFeHBvcnQgbzEsCisgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbGVyZXBvc2l0b3J5LmRvbWFpbi5QYWNrYWdlRXhwb3J0IG8yKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvMS5nZXROYW1lKCkuZXF1YWxzKG8yLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvMS5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKG8yLmdldFZlcnNpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8xLmdldE5hbWUoKS5jb21wYXJlVG8obzIuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKIAotCQlTZXJ2ZXJSdW50aW1lVXRpbHMuZXhlY3V0ZShwcm9qZWN0LCBuZXcgU2VydmVyUnVudGltZVV0aWxzLlNlcnZlclJ1bnRpbWVDYWxsYmFjaygpIHsKKyAgICAgICAgU2VydmVyUnVudGltZVV0aWxzLmV4ZWN1dGUocHJvamVjdCwgbmV3IFNlcnZlclJ1bnRpbWVVdGlscy5TZXJ2ZXJSdW50aW1lQ2FsbGJhY2soKSB7CiAKLQkJCXB1YmxpYyBib29sZWFuIGRvV2l0aFJ1bnRpbWUoVmlyZ29TZXJ2ZXJSdW50aW1lIHJ1bnRpbWUpIHsKLQkJCQlwYWNrYWdlcy5hZGRBbGwoZ2V0SW1wb3J0UGFja2FnZVByb3Bvc2Fsc0ZvclJ1bnRpbWUocnVudGltZSwgcHJvamVjdCwgdmFsdWUpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkb1dpdGhSdW50aW1lKFZpcmdvU2VydmVyUnVudGltZSBydW50aW1lKSB7CisgICAgICAgICAgICAgICAgcGFja2FnZXMuYWRkQWxsKGdldEltcG9ydFBhY2thZ2VQcm9wb3NhbHNGb3JSdW50aW1lKHJ1bnRpbWUsIHByb2plY3QsIHZhbHVlKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCXJldHVybiBwYWNrYWdlczsKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VzOwogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIENyZWF0ZXMgYSB7QGxpbmsgUmVwb3NpdG9yeX0gaW52ZW50b3J5IGZyb20gdGhlIGdpdmVuIHJ1bnRpbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBBcnRlZmFjdFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeUNvbnRlbnRzKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJQXJ0ZWZhY3RSZXBvc2l0b3J5IGFydGlmYWN0cyA9IG5ldyBBcnRlZmFjdFJlcG9zaXRvcnkoKTsKLQkJaWYgKGRvZXNSdW50aW1lU3VwcG9ydFJlcG9zaXRvcmllcyhydW50aW1lKSkgewotCQkJQnVuZGxlUmVwb3NpdG9yeSBidW5kbGVSZXBvc2l0b3J5ID0gU2VydmVyQ29yZVBsdWdpbi5nZXRBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCkuZ2V0QnVuZGxlUmVwb3NpdG9yeSgKLQkJCQkJcnVudGltZSk7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBSZXBvc2l0b3J5fSBpbnZlbnRvcnkgZnJvbSB0aGUgZ2l2ZW4gcnVudGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFydGVmYWN0UmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5Q29udGVudHMoSVJ1bnRpbWUgcnVudGltZSkgeworICAgICAgICBBcnRlZmFjdFJlcG9zaXRvcnkgYXJ0aWZhY3RzID0gbmV3IEFydGVmYWN0UmVwb3NpdG9yeSgpOworICAgICAgICBpZiAoZG9lc1J1bnRpbWVTdXBwb3J0UmVwb3NpdG9yaWVzKHJ1bnRpbWUpKSB7CisgICAgICAgICAgICBCdW5kbGVSZXBvc2l0b3J5IGJ1bmRsZVJlcG9zaXRvcnkgPSBTZXJ2ZXJDb3JlUGx1Z2luLmdldEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKS5nZXRCdW5kbGVSZXBvc2l0b3J5KHJ1bnRpbWUpOwogCi0JCQlmb3IgKG9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbC5yZXBvc2l0b3J5LkJ1bmRsZURlZmluaXRpb24gYnVuZGxlRGVmaW5pdGlvbiA6IGJ1bmRsZVJlcG9zaXRvcnkuZ2V0QnVuZGxlcygpKSB7Ci0JCQkJaWYgKGJ1bmRsZURlZmluaXRpb24uZ2V0TWFuaWZlc3QoKSAhPSBudWxsCi0JCQkJCQkmJiBidW5kbGVEZWZpbml0aW9uLmdldE1hbmlmZXN0KCkuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkgIT0gbnVsbAotCQkJCQkJJiYgYnVuZGxlRGVmaW5pdGlvbi5nZXRNYW5pZmVzdCgpLmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpLmdldFN5bWJvbGljTmFtZSgpICE9IG51bGwpIHsKLQkJCQkJQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBidW5kbGVEZWZpbml0aW9uLmdldE1hbmlmZXN0KCk7Ci0JCQkJCWJvb2xlYW4gc291cmNlZmlsZUV4aXN0cyA9IChTZXJ2ZXJVdGlscy5nZXRTb3VyY2VGaWxlKGJ1bmRsZURlZmluaXRpb24uZ2V0TG9jYXRpb24oKSkgIT0gbnVsbCAmJiBTZXJ2ZXJVdGlscy5nZXRTb3VyY2VGaWxlKAotCQkJCQkJCWJ1bmRsZURlZmluaXRpb24uZ2V0TG9jYXRpb24oKSkKLQkJCQkJCQkuZXhpc3RzKCkpOwotCQkJCQlPc2dpVmVyc2lvbiB2ZXJzaW9uID0gbnVsbDsKLQkJCQkJaWYgKG1hbmlmZXN0LmdldEJ1bmRsZVZlcnNpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQl2ZXJzaW9uID0gbmV3IE9zZ2lWZXJzaW9uKG1hbmlmZXN0LmdldEJ1bmRsZVZlcnNpb24oKSk7Ci0JCQkJCX0KLQkJCQkJYXJ0aWZhY3RzLmFkZEJ1bmRsZShuZXcgTG9jYWxCdW5kbGVBcnRlZmFjdChtYW5pZmVzdC5nZXRCdW5kbGVOYW1lKCksCi0JCQkJCQkJbWFuaWZlc3QuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkuZ2V0U3ltYm9saWNOYW1lKCksIHZlcnNpb24sIHNvdXJjZWZpbGVFeGlzdHMsCi0JCQkJCQkJYnVuZGxlRGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJfQorICAgICAgICAgICAgZm9yIChvcmcuZWNsaXBzZS52aXJnby5rZXJuZWwucmVwb3NpdG9yeS5CdW5kbGVEZWZpbml0aW9uIGJ1bmRsZURlZmluaXRpb24gOiBidW5kbGVSZXBvc2l0b3J5LmdldEJ1bmRsZXMoKSkgeworICAgICAgICAgICAgICAgIGlmIChidW5kbGVEZWZpbml0aW9uLmdldE1hbmlmZXN0KCkgIT0gbnVsbCAmJiBidW5kbGVEZWZpbml0aW9uLmdldE1hbmlmZXN0KCkuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBidW5kbGVEZWZpbml0aW9uLmdldE1hbmlmZXN0KCkuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkuZ2V0U3ltYm9saWNOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdCA9IGJ1bmRsZURlZmluaXRpb24uZ2V0TWFuaWZlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzb3VyY2VmaWxlRXhpc3RzID0gU2VydmVyVXRpbHMuZ2V0U291cmNlRmlsZShidW5kbGVEZWZpbml0aW9uLmdldExvY2F0aW9uKCkpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIFNlcnZlclV0aWxzLmdldFNvdXJjZUZpbGUoYnVuZGxlRGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpKS5leGlzdHMoKTsKKyAgICAgICAgICAgICAgICAgICAgT3NnaVZlcnNpb24gdmVyc2lvbiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYW5pZmVzdC5nZXRCdW5kbGVWZXJzaW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IG5ldyBPc2dpVmVyc2lvbihtYW5pZmVzdC5nZXRCdW5kbGVWZXJzaW9uKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0cy5hZGRCdW5kbGUobmV3IExvY2FsQnVuZGxlQXJ0ZWZhY3QobWFuaWZlc3QuZ2V0QnVuZGxlTmFtZSgpLCBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKS5nZXRTeW1ib2xpY05hbWUoKSwgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZWZpbGVFeGlzdHMsIGJ1bmRsZURlZmluaXRpb24uZ2V0TG9jYXRpb24oKSkpOworICAgICAgICAgICAgICAgIH0KIAotCQkJfQotCQkJZm9yIChvcmcuZWNsaXBzZS52aXJnby5rZXJuZWwucmVwb3NpdG9yeS5MaWJyYXJ5RGVmaW5pdGlvbiBsaWJyYXJ5RGVmaW5pdGlvbiA6IGJ1bmRsZVJlcG9zaXRvcnkuZ2V0TGlicmFyaWVzKCkpIHsKLQkJCQlpZiAobGlicmFyeURlZmluaXRpb24uZ2V0U3ltYm9saWNOYW1lKCkgIT0gbnVsbCkgewotCQkJCQlhcnRpZmFjdHMuYWRkTGlicmFyeShuZXcgTG9jYWxMaWJyYXJ5QXJ0ZWZhY3QobGlicmFyeURlZmluaXRpb24uZ2V0TmFtZSgpLAotCQkJCQkJCWxpYnJhcnlEZWZpbml0aW9uLmdldFN5bWJvbGljTmFtZSgpLCBuZXcgT3NnaVZlcnNpb24obGlicmFyeURlZmluaXRpb24uZ2V0VmVyc2lvbigpKSwKLQkJCQkJCQlsaWJyYXJ5RGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhcnRpZmFjdHM7Ci0JfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChvcmcuZWNsaXBzZS52aXJnby5rZXJuZWwucmVwb3NpdG9yeS5MaWJyYXJ5RGVmaW5pdGlvbiBsaWJyYXJ5RGVmaW5pdGlvbiA6IGJ1bmRsZVJlcG9zaXRvcnkuZ2V0TGlicmFyaWVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobGlicmFyeURlZmluaXRpb24uZ2V0U3ltYm9saWNOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdHMuYWRkTGlicmFyeShuZXcgTG9jYWxMaWJyYXJ5QXJ0ZWZhY3QobGlicmFyeURlZmluaXRpb24uZ2V0TmFtZSgpLCBsaWJyYXJ5RGVmaW5pdGlvbi5nZXRTeW1ib2xpY05hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPc2dpVmVyc2lvbihsaWJyYXJ5RGVmaW5pdGlvbi5nZXRWZXJzaW9uKCkpLCBsaWJyYXJ5RGVmaW5pdGlvbi5nZXRMb2NhdGlvbigpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhcnRpZmFjdHM7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeVVybChJQXJ0ZWZhY3QgYXJ0ZWZhY3QpIHsKLQkJU3RyaW5nQnVpbGRlciB1cmwgPSBuZXcgU3RyaW5nQnVpbGRlcihCUklUU19CQVNFKTsKLQkJaWYgKGFydGVmYWN0IGluc3RhbmNlb2YgQnVuZGxlQXJ0ZWZhY3QpIHsKLQkJCXVybC5hcHBlbmQoIi9idW5kbGUvdmVyc2lvbi9kZXRhaWw/bmFtZT0iKTsKLQkJfSBlbHNlIGlmIChhcnRlZmFjdCBpbnN0YW5jZW9mIExpYnJhcnlBcnRlZmFjdCkgewotCQkJdXJsLmFwcGVuZCgiL2xpYnJhcnkvdmVyc2lvbi9kZXRhaWw/bmFtZT0iKTsKLQkJfQotCQl1cmwuYXBwZW5kKGFydGVmYWN0LmdldFN5bWJvbGljTmFtZSgpKTsKLQkJdXJsLmFwcGVuZCgiJnZlcnNpb249Iik7Ci0JCXVybC5hcHBlbmQoYXJ0ZWZhY3QuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gdXJsLnRvU3RyaW5nKCk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlcG9zaXRvcnlVcmwoSUFydGVmYWN0IGFydGVmYWN0KSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgdXJsID0gbmV3IFN0cmluZ0J1aWxkZXIoQlJJVFNfQkFTRSk7CisgICAgICAgIGlmIChhcnRlZmFjdCBpbnN0YW5jZW9mIEJ1bmRsZUFydGVmYWN0KSB7CisgICAgICAgICAgICB1cmwuYXBwZW5kKCIvYnVuZGxlL3ZlcnNpb24vZGV0YWlsP25hbWU9Iik7CisgICAgICAgIH0gZWxzZSBpZiAoYXJ0ZWZhY3QgaW5zdGFuY2VvZiBMaWJyYXJ5QXJ0ZWZhY3QpIHsKKyAgICAgICAgICAgIHVybC5hcHBlbmQoIi9saWJyYXJ5L3ZlcnNpb24vZGV0YWlsP25hbWU9Iik7CisgICAgICAgIH0KKyAgICAgICAgdXJsLmFwcGVuZChhcnRlZmFjdC5nZXRTeW1ib2xpY05hbWUoKSk7CisgICAgICAgIHVybC5hcHBlbmQoIiZ2ZXJzaW9uPSIpOworICAgICAgICB1cmwuYXBwZW5kKGFydGVmYWN0LmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIHVybC50b1N0cmluZygpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlVXJsKEJ1bmRsZUFydGVmYWN0IGJ1bmRsZSwgU3RyaW5nIGRvd25sb2FkVHlwZSkgewotCQlTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcihET1dOTE9BRF9CQVNFKTsKLQkJdXJsLmFwcGVuZCgiL2J1bmRsZXMiKTsKLQkJdXJsLmFwcGVuZChnZXRDYXRlZ29yeShidW5kbGUpKTsKLQkJaWYgKERPV05MT0FEX1RZUEVfU09VUkNFLmVxdWFscyhkb3dubG9hZFR5cGUpKSB7Ci0JCQl1cmwuYXBwZW5kKGJ1bmRsZS5nZXRSZWxhdGl2ZVNvdXJjZVVybFBhdGgoKSk7Ci0JCX0gZWxzZSBpZiAoRE9XTkxPQURfVFlQRV9TT1VSQ0VfSEFTSC5lcXVhbHMoZG93bmxvYWRUeXBlKSkgewotCQkJdXJsLmFwcGVuZChidW5kbGUuZ2V0UmVsYXRpdmVTb3VyY2VVcmxQYXRoKCkpLmFwcGVuZCgiLnNoYTEiKTsKLQkJfSBlbHNlIGlmIChET1dOTE9BRF9UWVBFX0xJQ0VOU0UuZXF1YWxzKGRvd25sb2FkVHlwZSkpIHsKLQkJCXVybC5hcHBlbmQoYnVuZGxlLmdldFJlbGF0aXZlTGljZW5zZVVybFBhdGgoKSk7Ci0JCX0gZWxzZSBpZiAoRE9XTkxPQURfVFlQRV9CSU5BUllfSEFTSC5lcXVhbHMoZG93bmxvYWRUeXBlKSkgewotCQkJdXJsLmFwcGVuZChidW5kbGUuZ2V0UmVsYXRpdmVVcmxQYXRoKCkpLmFwcGVuZCgiLnNoYTEiKTsKLQkJfSBlbHNlIHsKLQkJCXVybC5hcHBlbmQoYnVuZGxlLmdldFJlbGF0aXZlVXJsUGF0aCgpKTsKLQkJfQotCQlyZXR1cm4gdXJsLnRvU3RyaW5nKCk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlVXJsKEJ1bmRsZUFydGVmYWN0IGJ1bmRsZSwgU3RyaW5nIGRvd25sb2FkVHlwZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcihET1dOTE9BRF9CQVNFKTsKKyAgICAgICAgdXJsLmFwcGVuZCgiL2J1bmRsZXMiKTsKKyAgICAgICAgdXJsLmFwcGVuZChnZXRDYXRlZ29yeShidW5kbGUpKTsKKyAgICAgICAgaWYgKERPV05MT0FEX1RZUEVfU09VUkNFLmVxdWFscyhkb3dubG9hZFR5cGUpKSB7CisgICAgICAgICAgICB1cmwuYXBwZW5kKGJ1bmRsZS5nZXRSZWxhdGl2ZVNvdXJjZVVybFBhdGgoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoRE9XTkxPQURfVFlQRV9TT1VSQ0VfSEFTSC5lcXVhbHMoZG93bmxvYWRUeXBlKSkgeworICAgICAgICAgICAgdXJsLmFwcGVuZChidW5kbGUuZ2V0UmVsYXRpdmVTb3VyY2VVcmxQYXRoKCkpLmFwcGVuZCgiLnNoYTEiKTsKKyAgICAgICAgfSBlbHNlIGlmIChET1dOTE9BRF9UWVBFX0xJQ0VOU0UuZXF1YWxzKGRvd25sb2FkVHlwZSkpIHsKKyAgICAgICAgICAgIHVybC5hcHBlbmQoYnVuZGxlLmdldFJlbGF0aXZlTGljZW5zZVVybFBhdGgoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoRE9XTkxPQURfVFlQRV9CSU5BUllfSEFTSC5lcXVhbHMoZG93bmxvYWRUeXBlKSkgeworICAgICAgICAgICAgdXJsLmFwcGVuZChidW5kbGUuZ2V0UmVsYXRpdmVVcmxQYXRoKCkpLmFwcGVuZCgiLnNoYTEiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVybC5hcHBlbmQoYnVuZGxlLmdldFJlbGF0aXZlVXJsUGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VVcmwoTGlicmFyeUFydGVmYWN0IGxpYnJhcnksIFN0cmluZyBkb3dubG9hZFR5cGUpIHsKLQkJU3RyaW5nQnVmZmVyIHVybCA9IG5ldyBTdHJpbmdCdWZmZXIoRE9XTkxPQURfQkFTRSk7Ci0JCXVybC5hcHBlbmQoIi9saWJyYXJpZXMiKTsKLQkJdXJsLmFwcGVuZChnZXRDYXRlZ29yeShsaWJyYXJ5KSk7Ci0JCWlmIChET1dOTE9BRF9UWVBFX0xJQ0VOU0UuZXF1YWxzKGRvd25sb2FkVHlwZSkpIHsKLQkJCXVybC5hcHBlbmQobGlicmFyeS5nZXRSZWxhdGl2ZUxpY2Vuc2VVcmxQYXRoKCkpOwotCQl9IGVsc2UgaWYgKERPV05MT0FEX1RZUEVfTElCUkFSWV9IQVNILmVxdWFscyhkb3dubG9hZFR5cGUpKSB7Ci0JCQl1cmwuYXBwZW5kKGxpYnJhcnkuZ2V0UmVsYXRpdmVVcmxQYXRoKCkpLmFwcGVuZCgiLnNoYTEiKTsKLQkJfSBlbHNlIHsKLQkJCXVybC5hcHBlbmQobGlicmFyeS5nZXRSZWxhdGl2ZVVybFBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHVybC50b1N0cmluZygpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVVybChMaWJyYXJ5QXJ0ZWZhY3QgbGlicmFyeSwgU3RyaW5nIGRvd25sb2FkVHlwZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgdXJsID0gbmV3IFN0cmluZ0J1ZmZlcihET1dOTE9BRF9CQVNFKTsKKyAgICAgICAgdXJsLmFwcGVuZCgiL2xpYnJhcmllcyIpOworICAgICAgICB1cmwuYXBwZW5kKGdldENhdGVnb3J5KGxpYnJhcnkpKTsKKyAgICAgICAgaWYgKERPV05MT0FEX1RZUEVfTElDRU5TRS5lcXVhbHMoZG93bmxvYWRUeXBlKSkgeworICAgICAgICAgICAgdXJsLmFwcGVuZChsaWJyYXJ5LmdldFJlbGF0aXZlTGljZW5zZVVybFBhdGgoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoRE9XTkxPQURfVFlQRV9MSUJSQVJZX0hBU0guZXF1YWxzKGRvd25sb2FkVHlwZSkpIHsKKyAgICAgICAgICAgIHVybC5hcHBlbmQobGlicmFyeS5nZXRSZWxhdGl2ZVVybFBhdGgoKSkuYXBwZW5kKCIuc2hhMSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXJsLmFwcGVuZChsaWJyYXJ5LmdldFJlbGF0aXZlVXJsUGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyBwcm9wb3NhbHMgZm9yIHZlcnNpb24gY29udGVudCBhc3Npc3QgcmVxdWVzdHMuIDIuNS40IC0+IDIuNS40IFsyLjUuNCwyLjYuMCkgWzIuNS40LDIuNS40XSBbMi41LjQsMy4wLjApCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0VmVyc2lvblByb3Bvc2FscyhTZXQ8U3RyaW5nPiB2ZXJzaW9uU3RyaW5ncykgewotCQkvLyBGaXJzdCBvcmRlciB0aGUgdmVyc2lvbiBzbyB0aGF0IHRoZSBoaWdoZXN0IGFwcGVhcnMgZmlyc3QKLQkJTGlzdDxWZXJzaW9uPiB2ZXJzaW9ucyA9IG5ldyBBcnJheUxpc3Q8VmVyc2lvbj4oKTsKLQkJZm9yIChTdHJpbmcgdmVyc2lvblN0cmluZyA6IHZlcnNpb25TdHJpbmdzKSB7Ci0JCQl2ZXJzaW9ucy5hZGQoVmVyc2lvbi5wYXJzZVZlcnNpb24odmVyc2lvblN0cmluZykpOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnNvcnQodmVyc2lvbnMpOwotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHZlcnNpb25zKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHByb3Bvc2FscyBmb3IgdmVyc2lvbiBjb250ZW50IGFzc2lzdCByZXF1ZXN0cy4gMi41LjQgLT4gMi41LjQgWzIuNS40LDIuNi4wKSBbMi41LjQsMi41LjRdIFsyLjUuNCwzLjAuMCkKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRWZXJzaW9uUHJvcG9zYWxzKFNldDxTdHJpbmc+IHZlcnNpb25TdHJpbmdzKSB7CisgICAgICAgIC8vIEZpcnN0IG9yZGVyIHRoZSB2ZXJzaW9uIHNvIHRoYXQgdGhlIGhpZ2hlc3QgYXBwZWFycyBmaXJzdAorICAgICAgICBMaXN0PFZlcnNpb24+IHZlcnNpb25zID0gbmV3IEFycmF5TGlzdDxWZXJzaW9uPigpOworICAgICAgICBmb3IgKFN0cmluZyB2ZXJzaW9uU3RyaW5nIDogdmVyc2lvblN0cmluZ3MpIHsKKyAgICAgICAgICAgIHZlcnNpb25zLmFkZChWZXJzaW9uLnBhcnNlVmVyc2lvbih2ZXJzaW9uU3RyaW5nKSk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh2ZXJzaW9ucyk7CisgICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UodmVyc2lvbnMpOwogCi0JCS8vIE5vdyBhZGQgdmVyc2lvbiByYW5nZXMgdG8gdGhlIHZlcnNpb24KLQkJTGlzdDxTdHJpbmc+IHZlcnNpb25SYW5nZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChWZXJzaW9uIHZlcnNpb24gOiB2ZXJzaW9ucykgewotCQkJLy8gMi41LjQgLSByZW1vdmVkIGFzIHdlIGRvbid0IHdhbnQgdG8gbWFrZSBwZW9wbGUgdXNlIHRoZQotCQkJLy8gY29tcGxldGlvbgotCQkJLy8gdmVyc2lvblJhbmdlcy5hZGQodmVyc2lvbi50b1N0cmluZygpKTsKKyAgICAgICAgLy8gTm93IGFkZCB2ZXJzaW9uIHJhbmdlcyB0byB0aGUgdmVyc2lvbgorICAgICAgICBMaXN0PFN0cmluZz4gdmVyc2lvblJhbmdlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBmb3IgKFZlcnNpb24gdmVyc2lvbiA6IHZlcnNpb25zKSB7CisgICAgICAgICAgICAvLyAyLjUuNCAtIHJlbW92ZWQgYXMgd2UgZG9uJ3Qgd2FudCB0byBtYWtlIHBlb3BsZSB1c2UgdGhlCisgICAgICAgICAgICAvLyBjb21wbGV0aW9uCisgICAgICAgICAgICAvLyB2ZXJzaW9uUmFuZ2VzLmFkZCh2ZXJzaW9uLnRvU3RyaW5nKCkpOwogCi0JCQkvLyBbMi41LjQsMi42LjApCi0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIG5ldyBWZXJzaW9uKHZlcnNpb24uZ2V0TWFqb3IoKSwgdmVyc2lvbi5nZXRNaW5vcigpICsgMSwKLQkJCQkJMCwgbnVsbCksIGZhbHNlKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIC8vIFsyLjUuNCwyLjYuMCkKKyAgICAgICAgICAgIHZlcnNpb25SYW5nZXMuYWRkKG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgbmV3IFZlcnNpb24odmVyc2lvbi5nZXRNYWpvcigpLCB2ZXJzaW9uLmdldE1pbm9yKCkgKyAxLCAwLCBudWxsKSwgZmFsc2UpLnRvU3RyaW5nKCkpOwogCi0JCQkvLyBbMi41LjQsMi41LjRdCi0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIHZlcnNpb24sIHRydWUpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgLy8gWzIuNS40LDIuNS40XQorICAgICAgICAgICAgdmVyc2lvblJhbmdlcy5hZGQobmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCB2ZXJzaW9uLCB0cnVlKS50b1N0cmluZygpKTsKIAotCQkJLy8gWzIuNS40LDMuMC4wKQotCQkJdmVyc2lvblJhbmdlcy5hZGQobmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCBuZXcgVmVyc2lvbih2ZXJzaW9uLmdldE1ham9yKCkgKyAxLCAwLCAwLCBudWxsKSwgZmFsc2UpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgLy8gWzIuNS40LDMuMC4wKQorICAgICAgICAgICAgdmVyc2lvblJhbmdlcy5hZGQobmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCBuZXcgVmVyc2lvbih2ZXJzaW9uLmdldE1ham9yKCkgKyAxLCAwLCAwLCBudWxsKSwgZmFsc2UpLnRvU3RyaW5nKCkpOwogCi0JCX0KKyAgICAgICAgfQogCi0JCXJldHVybiB2ZXJzaW9uUmFuZ2VzOwotCX0KKyAgICAgICAgcmV0dXJuIHZlcnNpb25SYW5nZXM7CisgICAgfQogCi0JLyoqCi0JICogUmVzb2x2ZXMgZGVwZW5kZW5jaWVzIG9mIGdpdmVuIDxjb2RlPmFydGVmYWN0czwvY29kZT4uIEN1cnJlbnRseSB0aGlzIGltcGxlbWVudGF0aW9uIG9ubHkgcmVzb2x2ZXMgZGlyZWN0IGJ1bmRsZQotCSAqIGRlcGVuZGVuY2llcyBvZiB7QGxpbmsgTGlicmFyeUFydGVmYWN0fXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXQ8QXJ0ZWZhY3Q+IHJlc29sdmVEZXBlbmRlbmNpZXMoU2V0PEFydGVmYWN0PiBhcnRpZmFjdHMsIGJvb2xlYW4gaW5jbHVkZU9wdGlvbmFsKSB7Ci0JCVNldDxBcnRlZmFjdD4gcmVzb2x2ZWRBcnRlZmFjdHMgPSBuZXcgSGFzaFNldDxBcnRlZmFjdD4oYXJ0aWZhY3RzKTsKLQkJLy8gcmVzb2x2ZSBsaWJyYXJ5IGRlcGVuZGVuY2llcwotCQlmb3IgKElBcnRlZmFjdFR5cGVkIGFydGVmYWN0IDogYXJ0aWZhY3RzKSB7Ci0JCQlpZiAoYXJ0ZWZhY3QgaW5zdGFuY2VvZiBMaWJyYXJ5QXJ0ZWZhY3QpIHsKLQkJCQlyZXNvbHZlZEFydGVmYWN0cy5hZGRBbGwoU2VydmVyQ29yZVBsdWdpbi5nZXRBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCkuZmluZExpYnJhcnlEZXBlbmRlbmNpZXMoCi0JCQkJCQkoTGlicmFyeUFydGVmYWN0KSBhcnRlZmFjdCwgaW5jbHVkZU9wdGlvbmFsKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVkQXJ0ZWZhY3RzOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXNvbHZlcyBkZXBlbmRlbmNpZXMgb2YgZ2l2ZW4gPGNvZGU+YXJ0ZWZhY3RzPC9jb2RlPi4gQ3VycmVudGx5IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSByZXNvbHZlcyBkaXJlY3QgYnVuZGxlCisgICAgICogZGVwZW5kZW5jaWVzIG9mIHtAbGluayBMaWJyYXJ5QXJ0ZWZhY3R9cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNldDxBcnRlZmFjdD4gcmVzb2x2ZURlcGVuZGVuY2llcyhTZXQ8QXJ0ZWZhY3Q+IGFydGlmYWN0cywgYm9vbGVhbiBpbmNsdWRlT3B0aW9uYWwpIHsKKyAgICAgICAgU2V0PEFydGVmYWN0PiByZXNvbHZlZEFydGVmYWN0cyA9IG5ldyBIYXNoU2V0PEFydGVmYWN0PihhcnRpZmFjdHMpOworICAgICAgICAvLyByZXNvbHZlIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisgICAgICAgIGZvciAoSUFydGVmYWN0VHlwZWQgYXJ0ZWZhY3QgOiBhcnRpZmFjdHMpIHsKKyAgICAgICAgICAgIGlmIChhcnRlZmFjdCBpbnN0YW5jZW9mIExpYnJhcnlBcnRlZmFjdCkgeworICAgICAgICAgICAgICAgIHJlc29sdmVkQXJ0ZWZhY3RzLmFkZEFsbCgKKyAgICAgICAgICAgICAgICAgICAgU2VydmVyQ29yZVBsdWdpbi5nZXRBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCkuZmluZExpYnJhcnlEZXBlbmRlbmNpZXMoKExpYnJhcnlBcnRlZmFjdCkgYXJ0ZWZhY3QsIGluY2x1ZGVPcHRpb25hbCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXNvbHZlZEFydGVmYWN0czsKKyAgICB9CiAKLQkvKioKLQkgKiBTZWFyY2hlcyB0aGUgcmVtb3RlIGJ1bmRsZSByZXBvc2l0b3J5IGZvciBtYXRjaGVzIG9mIGEgZ2l2ZW4gc2VhcmNoIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFydGVmYWN0UmVwb3NpdG9yeSBzZWFyY2hGb3JBcnRpZmFjdHMoZmluYWwgU3RyaW5nIHNlYXJjaCkgewotCQlyZXR1cm4gc2VhcmNoRm9yQXJ0aWZhY3RzKHNlYXJjaCwgdHJ1ZSwgdHJ1ZSk7Ci0JfQorICAgIC8qKgorICAgICAqIFNlYXJjaGVzIHRoZSByZW1vdGUgYnVuZGxlIHJlcG9zaXRvcnkgZm9yIG1hdGNoZXMgb2YgYSBnaXZlbiBzZWFyY2ggc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQXJ0ZWZhY3RSZXBvc2l0b3J5IHNlYXJjaEZvckFydGlmYWN0cyhmaW5hbCBTdHJpbmcgc2VhcmNoKSB7CisgICAgICAgIHJldHVybiBzZWFyY2hGb3JBcnRpZmFjdHMoc2VhcmNoLCB0cnVlLCB0cnVlKTsKKyAgICB9CiAKLQkvKioKLQkgKiBTZWFyY2hlcyB0aGUgcmVtb3RlIGJ1bmRsZSByZXBvc2l0b3J5IGZvciBtYXRjaGVzIG9mIGEgZ2l2ZW4gc2VhcmNoIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFydGVmYWN0UmVwb3NpdG9yeSBzZWFyY2hGb3JBcnRpZmFjdHMoZmluYWwgU3RyaW5nIHNlYXJjaCwgYm9vbGVhbiBpbmNsdWRlQnVuZGxlcywKLQkJCWJvb2xlYW4gaW5jbHVkZXNMaWJyYXJpZXMpIHsKLQkJU3RyaW5nTWF0Y2hlciBtYXRjaGVyID0gbmV3IFN0cmluZ01hdGNoZXIoIioiICsgc2VhcmNoICsgIioiLCB0cnVlLCBmYWxzZSk7CisgICAgLyoqCisgICAgICogU2VhcmNoZXMgdGhlIHJlbW90ZSBidW5kbGUgcmVwb3NpdG9yeSBmb3IgbWF0Y2hlcyBvZiBhIGdpdmVuIHNlYXJjaCBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBcnRlZmFjdFJlcG9zaXRvcnkgc2VhcmNoRm9yQXJ0aWZhY3RzKGZpbmFsIFN0cmluZyBzZWFyY2gsIGJvb2xlYW4gaW5jbHVkZUJ1bmRsZXMsIGJvb2xlYW4gaW5jbHVkZXNMaWJyYXJpZXMpIHsKKyAgICAgICAgU3RyaW5nTWF0Y2hlciBtYXRjaGVyID0gbmV3IFN0cmluZ01hdGNoZXIoIioiICsgc2VhcmNoICsgIioiLCB0cnVlLCBmYWxzZSk7CiAKLQkJQXJ0ZWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBuZXcgQXJ0ZWZhY3RSZXBvc2l0b3J5KCk7Ci0JCWlmIChpbmNsdWRlQnVuZGxlcykgewotCQkJZm9yIChJQXJ0ZWZhY3RUeXBlZCBhcnRlZmFjdCA6IFNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpCi0JCQkJCS5nZXRBcnRlZmFjdFJlcG9zaXRvcnkoKQotCQkJCQkuZ2V0QnVuZGxlcygpKSB7Ci0JCQkJQnVuZGxlQXJ0ZWZhY3QgYnVuZGxlID0gKEJ1bmRsZUFydGVmYWN0KSBhcnRlZmFjdDsKLQkJCQkvLyBjaGVjayBzeW1ib2xpYyBuYW1lIGFuZCBuYW1lCi0JCQkJaWYgKG1hdGNoZXIubWF0Y2goYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKSB8fCBtYXRjaGVyLm1hdGNoKGJ1bmRsZS5nZXROYW1lKCkpKSB7Ci0JCQkJCXJlcG9zaXRvcnkuYWRkQnVuZGxlKGJ1bmRsZSk7Ci0JCQkJfQotCQkJCS8vIGNoZWNrIGV4cG9ydCBwYWNrYWdlcwotCQkJCWVsc2UgewotCQkJCQlmb3IgKG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbGVyZXBvc2l0b3J5LmRvbWFpbi5QYWNrYWdlRXhwb3J0IHBlIDogYnVuZGxlLmdldEV4cG9ydHMoKSkgewotCQkJCQkJaWYgKG1hdGNoZXIubWF0Y2gocGUuZ2V0TmFtZSgpKSkgewotCQkJCQkJCXJlcG9zaXRvcnkuYWRkQnVuZGxlKGJ1bmRsZSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlmb3IgKFBhY2thZ2VNZW1iZXIgcG0gOiBwZS5nZXRFeHBvcnRzKCkpIHsKLQkJCQkJCQlpZiAobWF0Y2hlci5tYXRjaChwbS5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJCXJlcG9zaXRvcnkuYWRkQnVuZGxlKGJ1bmRsZSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaW5jbHVkZXNMaWJyYXJpZXMpIHsKLQkJCWZvciAoSUFydGVmYWN0IGxpYnJhcnkgOiBTZXJ2ZXJDb3JlUGx1Z2luLmdldEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKQotCQkJCQkuZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5KCkKLQkJCQkJLmdldExpYnJhcmllcygpKSB7Ci0JCQkJLy8gY2hlY2sgc3ltYm9saWMgbmFtZSBhbmQgbmFtZQotCQkJCWlmIChtYXRjaGVyLm1hdGNoKGxpYnJhcnkuZ2V0U3ltYm9saWNOYW1lKCkpIHx8IG1hdGNoZXIubWF0Y2gobGlicmFyeS5nZXROYW1lKCkpKSB7Ci0JCQkJCXJlcG9zaXRvcnkuYWRkTGlicmFyeSgoTGlicmFyeUFydGVmYWN0KSBsaWJyYXJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlcG9zaXRvcnk7Ci0JfQorICAgICAgICBBcnRlZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IG5ldyBBcnRlZmFjdFJlcG9zaXRvcnkoKTsKKyAgICAgICAgaWYgKGluY2x1ZGVCdW5kbGVzKSB7CisgICAgICAgICAgICBmb3IgKElBcnRlZmFjdFR5cGVkIGFydGVmYWN0IDogU2VydmVyQ29yZVBsdWdpbi5nZXRBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCkuZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5KCkuZ2V0QnVuZGxlcygpKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlQXJ0ZWZhY3QgYnVuZGxlID0gKEJ1bmRsZUFydGVmYWN0KSBhcnRlZmFjdDsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBzeW1ib2xpYyBuYW1lIGFuZCBuYW1lCisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2goYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKSB8fCBtYXRjaGVyLm1hdGNoKGJ1bmRsZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkuYWRkQnVuZGxlKGJ1bmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGNoZWNrIGV4cG9ydCBwYWNrYWdlcworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbGVyZXBvc2l0b3J5LmRvbWFpbi5QYWNrYWdlRXhwb3J0IHBlIDogYnVuZGxlLmdldEV4cG9ydHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2gocGUuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkuYWRkQnVuZGxlKGJ1bmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhY2thZ2VNZW1iZXIgcG0gOiBwZS5nZXRFeHBvcnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaChwbS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkuYWRkQnVuZGxlKGJ1bmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaW5jbHVkZXNMaWJyYXJpZXMpIHsKKyAgICAgICAgICAgIGZvciAoSUFydGVmYWN0IGxpYnJhcnkgOiBTZXJ2ZXJDb3JlUGx1Z2luLmdldEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKS5nZXRBcnRlZmFjdFJlcG9zaXRvcnkoKS5nZXRMaWJyYXJpZXMoKSkgeworICAgICAgICAgICAgICAgIC8vIGNoZWNrIHN5bWJvbGljIG5hbWUgYW5kIG5hbWUKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaChsaWJyYXJ5LmdldFN5bWJvbGljTmFtZSgpKSB8fCBtYXRjaGVyLm1hdGNoKGxpYnJhcnkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5LmFkZExpYnJhcnkoKExpYnJhcnlBcnRlZmFjdCkgbGlicmFyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBvc2l0b3J5OworICAgIH0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSW1wb3J0QnVuZGxlUHJvcG9zYWxzRnJvbU1hbmlmZXN0KFNldDxCdW5kbGVBcnRlZmFjdD4gYnVuZGxlcywgQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QsCi0JCQlTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKG1hbmlmZXN0ICE9IG51bGwgJiYgbWFuaWZlc3QuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkgIT0gbnVsbAotCQkJCSYmIG1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpLmdldFN5bWJvbGljTmFtZSgpICE9IG51bGwKLQkJCQkmJiBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKS5nZXRTeW1ib2xpY05hbWUoKS5zdGFydHNXaXRoKHZhbHVlKSkgewotCQkJT3NnaVZlcnNpb24gdmVyc2lvbiA9IG51bGw7Ci0JCQlpZiAobWFuaWZlc3QuZ2V0QnVuZGxlVmVyc2lvbigpICE9IG51bGwpIHsKLQkJCQl2ZXJzaW9uID0gbmV3IE9zZ2lWZXJzaW9uKG1hbmlmZXN0LmdldEJ1bmRsZVZlcnNpb24oKSk7Ci0JCQl9Ci0JCQlidW5kbGVzLmFkZChuZXcgTG9jYWxCdW5kbGVBcnRlZmFjdChtYW5pZmVzdC5nZXRCdW5kbGVOYW1lKCksIG1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpCi0JCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgdmVyc2lvbiwgZmFsc2UsIG51bGwpKTsKLQkJfQotCX0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEltcG9ydEJ1bmRsZVByb3Bvc2Fsc0Zyb21NYW5pZmVzdChTZXQ8QnVuZGxlQXJ0ZWZhY3Q+IGJ1bmRsZXMsIEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKG1hbmlmZXN0ICE9IG51bGwgJiYgbWFuaWZlc3QuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkgIT0gbnVsbCAmJiBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKS5nZXRTeW1ib2xpY05hbWUoKSAhPSBudWxsCisgICAgICAgICAgICAmJiBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKS5nZXRTeW1ib2xpY05hbWUoKS5zdGFydHNXaXRoKHZhbHVlKSkgeworICAgICAgICAgICAgT3NnaVZlcnNpb24gdmVyc2lvbiA9IG51bGw7CisgICAgICAgICAgICBpZiAobWFuaWZlc3QuZ2V0QnVuZGxlVmVyc2lvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gbmV3IE9zZ2lWZXJzaW9uKG1hbmlmZXN0LmdldEJ1bmRsZVZlcnNpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidW5kbGVzLmFkZChuZXcgTG9jYWxCdW5kbGVBcnRlZmFjdChtYW5pZmVzdC5nZXRCdW5kbGVOYW1lKCksIG1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpLmdldFN5bWJvbGljTmFtZSgpLCB2ZXJzaW9uLCBmYWxzZSwgbnVsbCkpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRJbXBvcnRQYWNrYWdlUHJvcG9zYWxzRnJvbU1hbmlmZXN0KFN0cmluZyB2YWx1ZSwKLQkJCVNldDxvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uUGFja2FnZUV4cG9ydD4gcGFja2FnZXMsIEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0KSB7Ci0JCWlmIChtYW5pZmVzdCAhPSBudWxsICYmIG1hbmlmZXN0LmdldEV4cG9ydFBhY2thZ2UoKSAhPSBudWxsKSB7Ci0JCQlmb3IgKEV4cG9ydGVkUGFja2FnZSBleHBvcnQgOiBtYW5pZmVzdC5nZXRFeHBvcnRQYWNrYWdlKCkuZ2V0RXhwb3J0ZWRQYWNrYWdlcygpKSB7Ci0JCQkJT2JqZWN0IHZlcnNpb24gPSBleHBvcnQuZ2V0QXR0cmlidXRlcygpLmdldCgidmVyc2lvbiIpOwotCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IGV4cG9ydC5nZXRQYWNrYWdlTmFtZSgpOwotCQkJCWlmIChwYWNrYWdlTmFtZS5zdGFydHNXaXRoKHZhbHVlKSkgewotCQkJCQlPc2dpVmVyc2lvbiB2ID0gbnVsbDsKLQkJCQkJaWYgKHZlcnNpb24gIT0gbnVsbCkgewotCQkJCQkJdiA9IG5ldyBPc2dpVmVyc2lvbih2ZXJzaW9uLnRvU3RyaW5nKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdiA9IG5ldyBPc2dpVmVyc2lvbihWZXJzaW9uLmVtcHR5VmVyc2lvbik7Ci0JCQkJCX0KLQkJCQkJcGFja2FnZXMuYWRkKG5ldyBvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uUGFja2FnZUV4cG9ydChudWxsLCBwYWNrYWdlTmFtZSwgdikpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEltcG9ydFBhY2thZ2VQcm9wb3NhbHNGcm9tTWFuaWZlc3QoU3RyaW5nIHZhbHVlLCBTZXQ8b3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsZXJlcG9zaXRvcnkuZG9tYWluLlBhY2thZ2VFeHBvcnQ+IHBhY2thZ2VzLAorICAgICAgICBCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdCkgeworICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCAmJiBtYW5pZmVzdC5nZXRFeHBvcnRQYWNrYWdlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChFeHBvcnRlZFBhY2thZ2UgZXhwb3J0IDogbWFuaWZlc3QuZ2V0RXhwb3J0UGFja2FnZSgpLmdldEV4cG9ydGVkUGFja2FnZXMoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdCB2ZXJzaW9uID0gZXhwb3J0LmdldEF0dHJpYnV0ZXMoKS5nZXQoInZlcnNpb24iKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBleHBvcnQuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFja2FnZU5hbWUuc3RhcnRzV2l0aCh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgT3NnaVZlcnNpb24gdiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBuZXcgT3NnaVZlcnNpb24odmVyc2lvbi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBuZXcgT3NnaVZlcnNpb24oVmVyc2lvbi5lbXB0eVZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLmFkZChuZXcgb3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsZXJlcG9zaXRvcnkuZG9tYWluLlBhY2thZ2VFeHBvcnQobnVsbCwgcGFja2FnZU5hbWUsIHYpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoSUFydGVmYWN0IGFydGVmYWN0KSB7Ci0JCWlmIChhcnRlZmFjdC5nZXRPcmdhbmlzYXRpb25OYW1lKCkgIT0gbnVsbAotCQkJCSYmIChhcnRlZmFjdC5nZXRPcmdhbmlzYXRpb25OYW1lKCkuc3RhcnRzV2l0aCgiY29tLnNwcmluZ3NvdXJjZSIpIHx8IGFydGVmYWN0LmdldE9yZ2FuaXNhdGlvbk5hbWUoKQotCQkJCQkJLnN0YXJ0c1dpdGgoIm9yZy5zcHJpbmdmcmFtZXdvcmsiKSkpIHsKLQkJCXJldHVybiAiL3JlbGVhc2UiOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICIvZXh0ZXJuYWwiOwotCQl9Ci0JfQorICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDYXRlZ29yeShJQXJ0ZWZhY3QgYXJ0ZWZhY3QpIHsKKyAgICAgICAgaWYgKGFydGVmYWN0LmdldE9yZ2FuaXNhdGlvbk5hbWUoKSAhPSBudWxsCisgICAgICAgICAgICAmJiAoYXJ0ZWZhY3QuZ2V0T3JnYW5pc2F0aW9uTmFtZSgpLnN0YXJ0c1dpdGgoImNvbS5zcHJpbmdzb3VyY2UiKSB8fCBhcnRlZmFjdC5nZXRPcmdhbmlzYXRpb25OYW1lKCkuc3RhcnRzV2l0aCgib3JnLnNwcmluZ2ZyYW1ld29yayIpKSkgeworICAgICAgICAgICAgcmV0dXJuICIvcmVsZWFzZSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gIi9leHRlcm5hbCI7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBTZXQ8QnVuZGxlQXJ0ZWZhY3Q+IGdldEltcG9ydEJ1bmRsZVByb3Bvc2Fsc0ZvclJ1bnRpbWUoVmlyZ29TZXJ2ZXJSdW50aW1lIHJ1bnRpbWUsIElQcm9qZWN0IHByb2plY3QsCi0JCQlTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gIiI7Ci0JCX0KLQkJU2V0PEJ1bmRsZUFydGVmYWN0PiBidW5kbGVzID0gbmV3IEhhc2hTZXQ8QnVuZGxlQXJ0ZWZhY3Q+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PEJ1bmRsZUFydGVmYWN0PiBnZXRJbXBvcnRCdW5kbGVQcm9wb3NhbHNGb3JSdW50aW1lKFZpcmdvU2VydmVyUnVudGltZSBydW50aW1lLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhbHVlID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgU2V0PEJ1bmRsZUFydGVmYWN0PiBidW5kbGVzID0gbmV3IEhhc2hTZXQ8QnVuZGxlQXJ0ZWZhY3Q+KCk7CiAKLQkJQnVuZGxlUmVwb3NpdG9yeSBidW5kbGVSZXBvc2l0b3J5ID0gU2VydmVyQ29yZVBsdWdpbi5nZXRBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCkuZ2V0QnVuZGxlUmVwb3NpdG9yeSgKLQkJCQlydW50aW1lLmdldFJ1bnRpbWUoKSk7CisgICAgICAgIEJ1bmRsZVJlcG9zaXRvcnkgYnVuZGxlUmVwb3NpdG9yeSA9IFNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmdldEJ1bmRsZVJlcG9zaXRvcnkocnVudGltZS5nZXRSdW50aW1lKCkpOwogCi0JCWZvciAob3JnLmVjbGlwc2UudmlyZ28ua2VybmVsLnJlcG9zaXRvcnkuQnVuZGxlRGVmaW5pdGlvbiBkZWZpbml0aW9uIDogYnVuZGxlUmVwb3NpdG9yeS5nZXRCdW5kbGVzKCkpIHsKLQkJCWlmIChkZWZpbml0aW9uLmdldE1hbmlmZXN0KCkgIT0gbnVsbCkgewotCQkJCUJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gZGVmaW5pdGlvbi5nZXRNYW5pZmVzdCgpOwotCQkJCWFkZEltcG9ydEJ1bmRsZVByb3Bvc2Fsc0Zyb21NYW5pZmVzdChidW5kbGVzLCBtYW5pZmVzdCwgdmFsdWUpOwotCQkJfQotCQl9CisgICAgICAgIGZvciAob3JnLmVjbGlwc2UudmlyZ28ua2VybmVsLnJlcG9zaXRvcnkuQnVuZGxlRGVmaW5pdGlvbiBkZWZpbml0aW9uIDogYnVuZGxlUmVwb3NpdG9yeS5nZXRCdW5kbGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChkZWZpbml0aW9uLmdldE1hbmlmZXN0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gZGVmaW5pdGlvbi5nZXRNYW5pZmVzdCgpOworICAgICAgICAgICAgICAgIGFkZEltcG9ydEJ1bmRsZVByb3Bvc2Fsc0Zyb21NYW5pZmVzdChidW5kbGVzLCBtYW5pZmVzdCwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8gQWRkIHdvcmtzcGFjZSBidW5kbGVzCi0JCWZvciAoSVByb2plY3QgcCA6IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSkgewotCQkJaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KHApICYmICFwLmVxdWFscyhwcm9qZWN0KSkgewotCQkJCUJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmdldEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpLmdldEJ1bmRsZU1hbmlmZXN0KAotCQkJCQkJSmF2YUNvcmUuY3JlYXRlKHApKTsKLQkJCQlhZGRJbXBvcnRCdW5kbGVQcm9wb3NhbHNGcm9tTWFuaWZlc3QoYnVuZGxlcywgbWFuaWZlc3QsIHZhbHVlKTsKLQkJCX0KLQkJfQorICAgICAgICAvLyBBZGQgd29ya3NwYWNlIGJ1bmRsZXMKKyAgICAgICAgZm9yIChJUHJvamVjdCBwIDogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKSB7CisgICAgICAgICAgICBpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocCkgJiYgIXAuZXF1YWxzKHByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0QnVuZGxlTWFuaWZlc3QoSmF2YUNvcmUuY3JlYXRlKHApKTsKKyAgICAgICAgICAgICAgICBhZGRJbXBvcnRCdW5kbGVQcm9wb3NhbHNGcm9tTWFuaWZlc3QoYnVuZGxlcywgbWFuaWZlc3QsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXJldHVybiBidW5kbGVzOwotCX0KKyAgICAgICAgcmV0dXJuIGJ1bmRsZXM7CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgU2V0PExpYnJhcnlBcnRlZmFjdD4gZ2V0SW1wb3J0TGlicmFyeVByb3Bvc2Fsc0ZvclJ1bnRpbWUoVmlyZ29TZXJ2ZXJSdW50aW1lIHJ1bnRpbWUsCi0JCQlJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gIiI7Ci0JCX0KLQkJU2V0PExpYnJhcnlBcnRlZmFjdD4gbGlicmFyaWVzID0gbmV3IEhhc2hTZXQ8TGlicmFyeUFydGVmYWN0PigpOworICAgIHByaXZhdGUgc3RhdGljIFNldDxMaWJyYXJ5QXJ0ZWZhY3Q+IGdldEltcG9ydExpYnJhcnlQcm9wb3NhbHNGb3JSdW50aW1lKFZpcmdvU2VydmVyUnVudGltZSBydW50aW1lLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhbHVlID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgU2V0PExpYnJhcnlBcnRlZmFjdD4gbGlicmFyaWVzID0gbmV3IEhhc2hTZXQ8TGlicmFyeUFydGVmYWN0PigpOwogCi0JCUJ1bmRsZVJlcG9zaXRvcnkgYnVuZGxlUmVwb3NpdG9yeSA9IFNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmdldEJ1bmRsZVJlcG9zaXRvcnkoCi0JCQkJcnVudGltZS5nZXRSdW50aW1lKCkpOworICAgICAgICBCdW5kbGVSZXBvc2l0b3J5IGJ1bmRsZVJlcG9zaXRvcnkgPSBTZXJ2ZXJDb3JlUGx1Z2luLmdldEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKS5nZXRCdW5kbGVSZXBvc2l0b3J5KHJ1bnRpbWUuZ2V0UnVudGltZSgpKTsKIAotCQlmb3IgKG9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbC5yZXBvc2l0b3J5LkxpYnJhcnlEZWZpbml0aW9uIGRlZmluaXRpb24gOiBidW5kbGVSZXBvc2l0b3J5LmdldExpYnJhcmllcygpKSB7Ci0JCQlpZiAoZGVmaW5pdGlvbi5nZXRTeW1ib2xpY05hbWUoKSAhPSBudWxsICYmIGRlZmluaXRpb24uZ2V0U3ltYm9saWNOYW1lKCkuc3RhcnRzV2l0aCh2YWx1ZSkpIHsKLQkJCQlsaWJyYXJpZXMuYWRkKG5ldyBMaWJyYXJ5QXJ0ZWZhY3QoZGVmaW5pdGlvbi5nZXROYW1lKCksIGRlZmluaXRpb24uZ2V0U3ltYm9saWNOYW1lKCksIG5ldyBPc2dpVmVyc2lvbigKLQkJCQkJCWRlZmluaXRpb24uZ2V0VmVyc2lvbigpKSwgZGVmaW5pdGlvbi5nZXRTeW1ib2xpY05hbWUoKSwgZGVmaW5pdGlvbi5nZXRTeW1ib2xpY05hbWUoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaWJyYXJpZXM7Ci0JfQorICAgICAgICBmb3IgKG9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbC5yZXBvc2l0b3J5LkxpYnJhcnlEZWZpbml0aW9uIGRlZmluaXRpb24gOiBidW5kbGVSZXBvc2l0b3J5LmdldExpYnJhcmllcygpKSB7CisgICAgICAgICAgICBpZiAoZGVmaW5pdGlvbi5nZXRTeW1ib2xpY05hbWUoKSAhPSBudWxsICYmIGRlZmluaXRpb24uZ2V0U3ltYm9saWNOYW1lKCkuc3RhcnRzV2l0aCh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBsaWJyYXJpZXMuYWRkKG5ldyBMaWJyYXJ5QXJ0ZWZhY3QoZGVmaW5pdGlvbi5nZXROYW1lKCksIGRlZmluaXRpb24uZ2V0U3ltYm9saWNOYW1lKCksIG5ldyBPc2dpVmVyc2lvbihkZWZpbml0aW9uLmdldFZlcnNpb24oKSksCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24uZ2V0U3ltYm9saWNOYW1lKCksIGRlZmluaXRpb24uZ2V0U3ltYm9saWNOYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlicmFyaWVzOworICAgIH0KIAotCXByaXZhdGUgc3RhdGljIFNldDxvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uUGFja2FnZUV4cG9ydD4gZ2V0SW1wb3J0UGFja2FnZVByb3Bvc2Fsc0ZvclJ1bnRpbWUoCi0JCQlWaXJnb1NlcnZlclJ1bnRpbWUgcnVudGltZSwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZSA9ICIiOwotCQl9Ci0JCVNldDxvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uUGFja2FnZUV4cG9ydD4gcGFja2FnZXMgPSBuZXcgSGFzaFNldDxvcmcuZWNsaXBzZS52aXJnby5pZGUuYnVuZGxlcmVwb3NpdG9yeS5kb21haW4uUGFja2FnZUV4cG9ydD4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBTZXQ8b3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsZXJlcG9zaXRvcnkuZG9tYWluLlBhY2thZ2VFeHBvcnQ+IGdldEltcG9ydFBhY2thZ2VQcm9wb3NhbHNGb3JSdW50aW1lKFZpcmdvU2VydmVyUnVudGltZSBydW50aW1lLAorICAgICAgICBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhbHVlID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgU2V0PG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbGVyZXBvc2l0b3J5LmRvbWFpbi5QYWNrYWdlRXhwb3J0PiBwYWNrYWdlcyA9IG5ldyBIYXNoU2V0PG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbGVyZXBvc2l0b3J5LmRvbWFpbi5QYWNrYWdlRXhwb3J0PigpOwogCi0JCUJ1bmRsZVJlcG9zaXRvcnkgYnVuZGxlUmVwb3NpdG9yeSA9IFNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmdldEJ1bmRsZVJlcG9zaXRvcnkoCi0JCQkJcnVudGltZS5nZXRSdW50aW1lKCkpOworICAgICAgICBCdW5kbGVSZXBvc2l0b3J5IGJ1bmRsZVJlcG9zaXRvcnkgPSBTZXJ2ZXJDb3JlUGx1Z2luLmdldEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKS5nZXRCdW5kbGVSZXBvc2l0b3J5KHJ1bnRpbWUuZ2V0UnVudGltZSgpKTsKIAotCQlmb3IgKG9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbC5yZXBvc2l0b3J5LkJ1bmRsZURlZmluaXRpb24gZGVmaW5pdGlvbiA6IGJ1bmRsZVJlcG9zaXRvcnkuZ2V0QnVuZGxlcygpKSB7Ci0JCQlpZiAoZGVmaW5pdGlvbi5nZXRNYW5pZmVzdCgpICE9IG51bGwpIHsKLQkJCQlCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdCA9IGRlZmluaXRpb24uZ2V0TWFuaWZlc3QoKTsKLQkJCQlhZGRJbXBvcnRQYWNrYWdlUHJvcG9zYWxzRnJvbU1hbmlmZXN0KHZhbHVlLCBwYWNrYWdlcywgbWFuaWZlc3QpOwotCQkJfQotCQl9CisgICAgICAgIGZvciAob3JnLmVjbGlwc2UudmlyZ28ua2VybmVsLnJlcG9zaXRvcnkuQnVuZGxlRGVmaW5pdGlvbiBkZWZpbml0aW9uIDogYnVuZGxlUmVwb3NpdG9yeS5nZXRCdW5kbGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChkZWZpbml0aW9uLmdldE1hbmlmZXN0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gZGVmaW5pdGlvbi5nZXRNYW5pZmVzdCgpOworICAgICAgICAgICAgICAgIGFkZEltcG9ydFBhY2thZ2VQcm9wb3NhbHNGcm9tTWFuaWZlc3QodmFsdWUsIHBhY2thZ2VzLCBtYW5pZmVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLyBBZGQgd29ya3NwYWNlIGJ1bmRsZXMKLQkJZm9yIChJUHJvamVjdCBwIDogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKSB7Ci0JCQlpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocCkgJiYgIXAuZXF1YWxzKHByb2plY3QpKSB7Ci0JCQkJQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0QnVuZGxlTWFuaWZlc3QoCi0JCQkJCQlKYXZhQ29yZS5jcmVhdGUocCkpOwotCQkJCWFkZEltcG9ydFBhY2thZ2VQcm9wb3NhbHNGcm9tTWFuaWZlc3QodmFsdWUsIHBhY2thZ2VzLCBtYW5pZmVzdCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLy8gQWRkIHdvcmtzcGFjZSBidW5kbGVzCisgICAgICAgIGZvciAoSVByb2plY3QgcCA6IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSkgeworICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KHApICYmICFwLmVxdWFscyhwcm9qZWN0KSkgeworICAgICAgICAgICAgICAgIEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmdldEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpLmdldEJ1bmRsZU1hbmlmZXN0KEphdmFDb3JlLmNyZWF0ZShwKSk7CisgICAgICAgICAgICAgICAgYWRkSW1wb3J0UGFja2FnZVByb3Bvc2Fsc0Zyb21NYW5pZmVzdCh2YWx1ZSwgcGFja2FnZXMsIG1hbmlmZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXJldHVybiBwYWNrYWdlczsKLQl9CisgICAgICAgIHJldHVybiBwYWNrYWdlczsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvRGVmYXVsdFNlcnZlckRlcGxveWVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL0RlZmF1bHRTZXJ2ZXJEZXBsb3llci5qYXZhCmluZGV4IGI5MTRmNDguLmRmOTY4YjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvRGVmYXVsdFNlcnZlckRlcGxveWVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9EZWZhdWx0U2VydmVyRGVwbG95ZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTM2LDI0OCArMzcsMjQxIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlOwogCiAvKioKLSAqIERlcGxveWVyIGhlbHBlciB0aGF0IGhpZGVzIHRoZSBKTVgtYmFzZWQgY29tbXVuaWNhdGlvbiB3aXRoIGEgcnVubmluZyBkbQotICogU2VydmVyLgotICogCisgKiBEZXBsb3llciBoZWxwZXIgdGhhdCBoaWRlcyB0aGUgSk1YLWJhc2VkIGNvbW11bmljYXRpb24gd2l0aCBhIHJ1bm5pbmcgZG0gU2VydmVyLgorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDIuMC4wCiAgKi8KIHB1YmxpYyBjbGFzcyBEZWZhdWx0U2VydmVyRGVwbG95ZXIgaW1wbGVtZW50cyBJU2VydmVyRGVwbG95ZXIgewogCi0JcHJpdmF0ZSBJU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cjsKKyAgICBwcml2YXRlIGZpbmFsIElTZXJ2ZXJCZWhhdmlvdXIgYmVoYXZpb3VyOwogCi0JcHVibGljIERlZmF1bHRTZXJ2ZXJEZXBsb3llcihJU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cikgewotCQl0aGlzLmJlaGF2aW91ciA9IGJlaGF2aW91cjsKLQl9CisgICAgcHVibGljIERlZmF1bHRTZXJ2ZXJEZXBsb3llcihJU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cikgeworICAgICAgICB0aGlzLmJlaGF2aW91ciA9IGJlaGF2aW91cjsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIHZvaWQgZGVwbG95KElNb2R1bGUuLi4gbW9kdWxlcykgewotCQlMaXN0PElNb2R1bGU+IG9yZGVyZWRNb2R1bGVzID0gQXJyYXlzLmFzTGlzdChtb2R1bGVzKTsKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVwbG95KElNb2R1bGUuLi4gbW9kdWxlcykgeworICAgICAgICBMaXN0PElNb2R1bGU+IG9yZGVyZWRNb2R1bGVzID0gQXJyYXlzLmFzTGlzdChtb2R1bGVzKTsKIAotCQkvLyBtYWtlIHN1cmUgd2UgaG9ub3IgdGhlIHVzZXIgY29uZmlndXJlZCBvcmRlcgotCQlmaW5hbCBMaXN0PFN0cmluZz4gb3JkZXJlZEFydGVmYWN0cyA9IGdldEFydGVmYWN0T3JkZXIoKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGhvbm9yIHRoZSB1c2VyIGNvbmZpZ3VyZWQgb3JkZXIKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IG9yZGVyZWRBcnRlZmFjdHMgPSBnZXRBcnRlZmFjdE9yZGVyKCk7CiAKLQkJLy8gc29ydCB0aGUgbW9kdWxlcyBhY2NvcmRpbmcgdGhlIG9yZGVyIGRlZmluZWQgaW4gdGhlIHNlcnZlcgotCQkvLyBjb25maWd1cmF0aW9uCi0JCUNvbGxlY3Rpb25zLnNvcnQob3JkZXJlZE1vZHVsZXMsIG5ldyBDb21wYXJhdG9yPElNb2R1bGU+KCkgeworICAgICAgICAvLyBzb3J0IHRoZSBtb2R1bGVzIGFjY29yZGluZyB0aGUgb3JkZXIgZGVmaW5lZCBpbiB0aGUgc2VydmVyCisgICAgICAgIC8vIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChvcmRlcmVkTW9kdWxlcywgbmV3IENvbXBhcmF0b3I8SU1vZHVsZT4oKSB7CiAKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShJTW9kdWxlIG8xLCBJTW9kdWxlIG8yKSB7Ci0JCQkJSW50ZWdlciBtMSA9IChvcmRlcmVkQXJ0ZWZhY3RzLmNvbnRhaW5zKG8xLmdldElkKCkpID8gb3JkZXJlZEFydGVmYWN0cy5pbmRleE9mKG8xLmdldElkKCkpCi0JCQkJCTogSW50ZWdlci5NQVhfVkFMVUUpOwotCQkJCUludGVnZXIgbTIgPSAob3JkZXJlZEFydGVmYWN0cy5jb250YWlucyhvMi5nZXRJZCgpKSA/IG9yZGVyZWRBcnRlZmFjdHMuaW5kZXhPZihvMi5nZXRJZCgpKQotCQkJCQk6IEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCQlyZXR1cm4gbTEuY29tcGFyZVRvKG0yKTsKLQkJCX0KLQkJfSk7CisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoSU1vZHVsZSBvMSwgSU1vZHVsZSBvMikgeworICAgICAgICAgICAgICAgIEludGVnZXIgbTEgPSBvcmRlcmVkQXJ0ZWZhY3RzLmNvbnRhaW5zKG8xLmdldElkKCkpID8gb3JkZXJlZEFydGVmYWN0cy5pbmRleE9mKG8xLmdldElkKCkpIDogSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgSW50ZWdlciBtMiA9IG9yZGVyZWRBcnRlZmFjdHMuY29udGFpbnMobzIuZ2V0SWQoKSkgPyBvcmRlcmVkQXJ0ZWZhY3RzLmluZGV4T2YobzIuZ2V0SWQoKSkgOiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbTEuY29tcGFyZVRvKG0yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IG9yZGVyZWRNb2R1bGVzKSB7Ci0JCQlEZXBsb3ltZW50SWRlbnRpdHkgaWRlbnRpdHkgPSBleGVjdXRlRGVwbG95ZXJDb21tYW5kKGdldFNlcnZlckRlcGxveUNvbW1hbmQobW9kdWxlKSk7Ci0JCQlpZiAoYmVoYXZpb3VyIGluc3RhbmNlb2YgU2VydmVyQmVoYXZpb3VyKSB7Ci0JCQkJKChTZXJ2ZXJCZWhhdmlvdXIpIGJlaGF2aW91cikudGFpbChpZGVudGl0eSk7Ci0JCQl9Ci0JCQliZWhhdmlvdXIub25Nb2R1bGVQdWJsaXNoU3RhdGVDaGFuZ2UobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSk7Ci0JCQkvLyBpZiAoaWRlbnRpdHkgIT0gbnVsbCkgewotCQkJLy8gYmVoYXZpb3VyLm9uTW9kdWxlU3RhdGVDaGFuZ2UobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LAotCQkJLy8gSVNlcnZlci5TVEFURV9TVEFSVEVEKTsKLQkJCS8vIH0KLQkJCS8vIGVsc2UgewotCQkJLy8gYmVoYXZpb3VyLm9uTW9kdWxlU3RhdGVDaGFuZ2UobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LAotCQkJLy8gSVNlcnZlci5TVEFURV9TVE9QUEVEKTsKLQkJCS8vIH0KLQkJfQotCX0KKyAgICAgICAgZm9yIChJTW9kdWxlIG1vZHVsZSA6IG9yZGVyZWRNb2R1bGVzKSB7CisgICAgICAgICAgICBEZXBsb3ltZW50SWRlbnRpdHkgaWRlbnRpdHkgPSBleGVjdXRlRGVwbG95ZXJDb21tYW5kKGdldFNlcnZlckRlcGxveUNvbW1hbmQobW9kdWxlKSk7CisgICAgICAgICAgICBpZiAodGhpcy5iZWhhdmlvdXIgaW5zdGFuY2VvZiBTZXJ2ZXJCZWhhdmlvdXIpIHsKKyAgICAgICAgICAgICAgICAoKFNlcnZlckJlaGF2aW91cikgdGhpcy5iZWhhdmlvdXIpLnRhaWwoaWRlbnRpdHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5iZWhhdmlvdXIub25Nb2R1bGVQdWJsaXNoU3RhdGVDaGFuZ2UobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSk7CisgICAgICAgICAgICAvLyBpZiAoaWRlbnRpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gYmVoYXZpb3VyLm9uTW9kdWxlU3RhdGVDaGFuZ2UobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LAorICAgICAgICAgICAgLy8gSVNlcnZlci5TVEFURV9TVEFSVEVEKTsKKyAgICAgICAgICAgIC8vIH0KKyAgICAgICAgICAgIC8vIGVsc2UgeworICAgICAgICAgICAgLy8gYmVoYXZpb3VyLm9uTW9kdWxlU3RhdGVDaGFuZ2UobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LAorICAgICAgICAgICAgLy8gSVNlcnZlci5TVEFURV9TVE9QUEVEKTsKKyAgICAgICAgICAgIC8vIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBwaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFNlcnZlclBpbmdDb21tYW5kKCkuZXhlY3V0ZSgpOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIEJvb2xlYW4gcGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXRTZXJ2ZXJQaW5nQ29tbWFuZCgpLmV4ZWN1dGUoKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIHZvaWQgcmVkZXBsb3koSU1vZHVsZSBtb2R1bGUpIHsKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVkZXBsb3koSU1vZHVsZSBtb2R1bGUpIHsKIAotCQlEZXBsb3ltZW50SWRlbnRpdHkgaWRlbnRpdHkgPSBiZWhhdmlvdXIuZ2V0RGVwbG95bWVudElkZW50aXRpZXMoKS5nZXQobW9kdWxlLmdldElkKCkpOwotCQlpZiAoaWRlbnRpdHkgPT0gbnVsbCkgewotCQkJaWRlbnRpdHkgPSBleGVjdXRlRGVwbG95ZXJDb21tYW5kKGdldFNlcnZlckRlcGxveUNvbW1hbmQobW9kdWxlKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBwYXJzIHdpdGggbmVzdGVkIGJ1bmRsZXMgdG8gZGV0ZXJtaW5lIGlmCi0JCQkvLyBvbmx5IG9uZSBvZiB0aGUgYnVuZGxlcwotCQkJLy8gcmVmcmVzaGluZwotCQkJaWYgKEZhY2V0VXRpbHMuaXNQYXJQcm9qZWN0KG1vZHVsZS5nZXRQcm9qZWN0KCkpKSB7CisgICAgICAgIERlcGxveW1lbnRJZGVudGl0eSBpZGVudGl0eSA9IHRoaXMuYmVoYXZpb3VyLmdldERlcGxveW1lbnRJZGVudGl0aWVzKCkuZ2V0KG1vZHVsZS5nZXRJZCgpKTsKKyAgICAgICAgaWYgKGlkZW50aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlkZW50aXR5ID0gZXhlY3V0ZURlcGxveWVyQ29tbWFuZChnZXRTZXJ2ZXJEZXBsb3lDb21tYW5kKG1vZHVsZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU3BlY2lhbCBoYW5kbGluZyBmb3IgcGFycyB3aXRoIG5lc3RlZCBidW5kbGVzIHRvIGRldGVybWluZSBpZgorICAgICAgICAgICAgLy8gb25seSBvbmUgb2YgdGhlIGJ1bmRsZXMKKyAgICAgICAgICAgIC8vIHJlZnJlc2hpbmcKKyAgICAgICAgICAgIGlmIChGYWNldFV0aWxzLmlzUGFyUHJvamVjdChtb2R1bGUuZ2V0UHJvamVjdCgpKSkgewogCi0JCQkJU2V0PFN0cmluZz4gYnVuZGxlU3ltYm9saWNOYW1lcyA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQlJTW9kdWxlW10gY2hpbGRyZW4gPSBnZXRNb2R1bGVDaGlsZHJlbihtb2R1bGUpOwotCQkJCS8vIElmIG9ubHkgb25lIG1vZHVsZSBoYXMgYWN0dWFsIGNoYW5nZXM7IGVtaXQgYSBidW5kbGUgcmVmcmVzaAotCQkJCS8vIG9ubHkKLQkJCQlmb3IgKElNb2R1bGUgY2hpbGQgOiBjaGlsZHJlbikgewotCQkJCQlpbnQgc3RhdGUgPSBnZXRNb2R1bGVTdGF0ZShtb2R1bGUsIGNoaWxkKTsKLQkJCQkJaWYgKHN0YXRlICE9IElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKSB7Ci0JCQkJCQlpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QoY2hpbGQuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJCUJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmdldEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpCi0JCQkJCQkJCQkuZ2V0QnVuZGxlTWFuaWZlc3QoSmF2YUNvcmUuY3JlYXRlKGNoaWxkLmdldFByb2plY3QoKSkpOwotCQkJCQkJCWlmIChtYW5pZmVzdCAhPSBudWxsICYmIG1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpICE9IG51bGwpIHsKLQkJCQkJCQkJYnVuZGxlU3ltYm9saWNOYW1lcy5hZGQobWFuaWZlc3QuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KKyAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBidW5kbGVTeW1ib2xpY05hbWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIElNb2R1bGVbXSBjaGlsZHJlbiA9IGdldE1vZHVsZUNoaWxkcmVuKG1vZHVsZSk7CisgICAgICAgICAgICAgICAgLy8gSWYgb25seSBvbmUgbW9kdWxlIGhhcyBhY3R1YWwgY2hhbmdlczsgZW1pdCBhIGJ1bmRsZSByZWZyZXNoCisgICAgICAgICAgICAgICAgLy8gb25seQorICAgICAgICAgICAgICAgIGZvciAoSU1vZHVsZSBjaGlsZCA6IGNoaWxkcmVuKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSA9IGdldE1vZHVsZVN0YXRlKG1vZHVsZSwgY2hpbGQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT0gSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChjaGlsZC5nZXRQcm9qZWN0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkuZ2V0QnVuZGxlTWFuaWZlc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFDb3JlLmNyZWF0ZShjaGlsZC5nZXRQcm9qZWN0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCAmJiBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZVN5bWJvbGljTmFtZXMuYWRkKG1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAKLQkJCQkvLyBPbmx5IG9uZSBjaGFuZ2VkIGJ1bmRsZSBmb3VuZCAtPiB1cGRhdGUgc2luZ2xlIG9uZQotCQkJCWlmIChidW5kbGVTeW1ib2xpY05hbWVzLnNpemUoKSA9PSAxKSB7Ci0JCQkJCWV4ZWN1dGVEZXBsb3llckNvbW1hbmQoZ2V0U2VydmVyUmVmcmVzaENvbW1hbmQobW9kdWxlLCBidW5kbGVTeW1ib2xpY05hbWVzLml0ZXJhdG9yKCkubmV4dCgpKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWRlbnRpdHkgPSBleGVjdXRlRGVwbG95ZXJDb21tYW5kKGdldFNlcnZlckRlcGxveUNvbW1hbmQobW9kdWxlKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZGVudGl0eSA9IGV4ZWN1dGVEZXBsb3llckNvbW1hbmQoZ2V0U2VydmVyRGVwbG95Q29tbWFuZChtb2R1bGUpKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgIC8vIE9ubHkgb25lIGNoYW5nZWQgYnVuZGxlIGZvdW5kIC0+IHVwZGF0ZSBzaW5nbGUgb25lCisgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZVN5bWJvbGljTmFtZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZURlcGxveWVyQ29tbWFuZChnZXRTZXJ2ZXJSZWZyZXNoQ29tbWFuZChtb2R1bGUsIGJ1bmRsZVN5bWJvbGljTmFtZXMuaXRlcmF0b3IoKS5uZXh0KCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZGVudGl0eSA9IGV4ZWN1dGVEZXBsb3llckNvbW1hbmQoZ2V0U2VydmVyRGVwbG95Q29tbWFuZChtb2R1bGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlkZW50aXR5ID0gZXhlY3V0ZURlcGxveWVyQ29tbWFuZChnZXRTZXJ2ZXJEZXBsb3lDb21tYW5kKG1vZHVsZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8gaWYgKGlkZW50aXR5ICE9IG51bGwpIHsKLQkJLy8gYmVoYXZpb3VyLm9uTW9kdWxlU3RhdGVDaGFuZ2UobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LAotCQkvLyBJU2VydmVyLlNUQVRFX1NUQVJURUQpOwotCQkvLyB9Ci0JCS8vIGVsc2UgewotCQkvLyBiZWhhdmlvdXIub25Nb2R1bGVTdGF0ZUNoYW5nZShuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sCi0JCS8vIElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7Ci0JCS8vIH0KKyAgICAgICAgLy8gaWYgKGlkZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgLy8gYmVoYXZpb3VyLm9uTW9kdWxlU3RhdGVDaGFuZ2UobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LAorICAgICAgICAvLyBJU2VydmVyLlNUQVRFX1NUQVJURUQpOworICAgICAgICAvLyB9CisgICAgICAgIC8vIGVsc2UgeworICAgICAgICAvLyBiZWhhdmlvdXIub25Nb2R1bGVTdGF0ZUNoYW5nZShuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sCisgICAgICAgIC8vIElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7CisgICAgICAgIC8vIH0KIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHJvdGVjdGVkIElNb2R1bGVbXSBnZXRNb2R1bGVDaGlsZHJlbihJTW9kdWxlIG1vZHVsZSkgewotCQlyZXR1cm4gU2VydmVyVXRpbHMuZ2V0U2VydmVyKGJlaGF2aW91cikuZ2V0Q2hpbGRNb2R1bGVzKG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSk7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSU1vZHVsZVtdIGdldE1vZHVsZUNoaWxkcmVuKElNb2R1bGUgbW9kdWxlKSB7CisgICAgICAgIHJldHVybiBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIodGhpcy5iZWhhdmlvdXIpLmdldENoaWxkTW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0pOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldE1vZHVsZVN0YXRlKElNb2R1bGUgbW9kdWxlLCBJTW9kdWxlIGNoaWxkKSB7Ci0JCXJldHVybiBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoYmVoYXZpb3VyKS5nZXRTZXJ2ZXIoKS5nZXRNb2R1bGVQdWJsaXNoU3RhdGUobmV3IElNb2R1bGVbXSB7IG1vZHVsZSwgY2hpbGQgfSk7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGdldE1vZHVsZVN0YXRlKElNb2R1bGUgbW9kdWxlLCBJTW9kdWxlIGNoaWxkKSB7CisgICAgICAgIHJldHVybiBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIodGhpcy5iZWhhdmlvdXIpLmdldFNlcnZlcigpLmdldE1vZHVsZVB1Ymxpc2hTdGF0ZShuZXcgSU1vZHVsZVtdIHsgbW9kdWxlLCBjaGlsZCB9KTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRBcnRlZmFjdE9yZGVyKCkgewotCQlyZXR1cm4gU2VydmVyVXRpbHMuZ2V0U2VydmVyKGJlaGF2aW91cikuZ2V0Q29uZmlndXJhdGlvbigpLmdldEFydGVmYWN0T3JkZXIoKTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gZ2V0QXJ0ZWZhY3RPcmRlcigpIHsKKyAgICAgICAgcmV0dXJuIFNlcnZlclV0aWxzLmdldFNlcnZlcih0aGlzLmJlaGF2aW91cikuZ2V0Q29uZmlndXJhdGlvbigpLmdldEFydGVmYWN0T3JkZXIoKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChJTW9kdWxlIHBhck1vZHVsZSwgSU1vZHVsZS4uLiBtb2R1bGVzKSB7Ci0JCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBtb2R1bGVzKSB7Ci0JCQlCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5nZXRCdW5kbGVNYW5pZmVzdE1hbmFnZXIoKQotCQkJCQkuZ2V0QnVuZGxlTWFuaWZlc3QoSmF2YUNvcmUuY3JlYXRlKG1vZHVsZS5nZXRQcm9qZWN0KCkpKTsKLQkJCWlmIChtYW5pZmVzdCAhPSBudWxsICYmIG1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpICE9IG51bGwpIHsKLQkJCQlleGVjdXRlRGVwbG95ZXJDb21tYW5kKGdldFNlcnZlclJlZnJlc2hDb21tYW5kKHBhck1vZHVsZSwgbWFuaWZlc3QuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkKLQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSkpOwotCQkJfQotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWZyZXNoKElNb2R1bGUgcGFyTW9kdWxlLCBJTW9kdWxlLi4uIG1vZHVsZXMpIHsKKyAgICAgICAgZm9yIChJTW9kdWxlIG1vZHVsZSA6IG1vZHVsZXMpIHsKKyAgICAgICAgICAgIEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmdldEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpLmdldEJ1bmRsZU1hbmlmZXN0KEphdmFDb3JlLmNyZWF0ZShtb2R1bGUuZ2V0UHJvamVjdCgpKSk7CisgICAgICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCAmJiBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXhlY3V0ZURlcGxveWVyQ29tbWFuZChnZXRTZXJ2ZXJSZWZyZXNoQ29tbWFuZChwYXJNb2R1bGUsIG1hbmlmZXN0LmdldEJ1bmRsZVN5bWJvbGljTmFtZSgpLmdldFN5bWJvbGljTmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaFN0YXRpYyhJTW9kdWxlIG1vZHVsZSwgSU1vZHVsZUZpbGUgZmlsZSkgeworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWZyZXNoU3RhdGljKElNb2R1bGUgbW9kdWxlLCBJTW9kdWxlRmlsZSBmaWxlKSB7CiAKLQkJRGVwbG95bWVudElkZW50aXR5IGlkZW50aXR5ID0gYmVoYXZpb3VyLmdldERlcGxveW1lbnRJZGVudGl0aWVzKCkuZ2V0KG1vZHVsZS5nZXRJZCgpKTsKLQkJaWYgKGlkZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgRGVwbG95bWVudElkZW50aXR5IGlkZW50aXR5ID0gdGhpcy5iZWhhdmlvdXIuZ2V0RGVwbG95bWVudElkZW50aXRpZXMoKS5nZXQobW9kdWxlLmdldElkKCkpOworICAgICAgICBpZiAoaWRlbnRpdHkgIT0gbnVsbCkgewogCi0JCQlpZiAoRmFjZXRVdGlscy5pc1BhclByb2plY3QobW9kdWxlLmdldFByb2plY3QoKSkgfHwgRmFjZXRVdGlscy5pc1BsYW5Qcm9qZWN0KG1vZHVsZS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJSUZpbGUgZiA9IChJRmlsZSkgZmlsZS5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJCQlpZiAoZiAhPSBudWxsKSB7Ci0JCQkJCWlmIChGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChmLmdldFByb2plY3QoKSkKLQkJCQkJCXx8IEZhY2V0VXRpbHMuaGFzUHJvamVjdEZhY2V0KGYuZ2V0UHJvamVjdCgpLCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKSkgewotCQkJCQkJQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdENvcmVQbHVnaW4uZ2V0QnVuZGxlTWFuaWZlc3RNYW5hZ2VyKCkKLQkJCQkJCQkJLmdldEJ1bmRsZU1hbmlmZXN0KEphdmFDb3JlLmNyZWF0ZShmLmdldFByb2plY3QoKSkpOwotCQkJCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IG51bGw7Ci0JCQkJCQlpZiAobWFuaWZlc3QgIT0gbnVsbCAmJiBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCQkJc3ltYm9saWNOYW1lID0gbWFuaWZlc3QuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXN5bWJvbGljTmFtZSA9IGYuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBwcm9qZWN0UGF0aCA9IGYuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCQkJCVN0cmluZyBwYXRoID0gZmlsZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNQYXJQcm9qZWN0KG1vZHVsZS5nZXRQcm9qZWN0KCkpIHx8IEZhY2V0VXRpbHMuaXNQbGFuUHJvamVjdChtb2R1bGUuZ2V0UHJvamVjdCgpKSkgeworICAgICAgICAgICAgICAgIElGaWxlIGYgPSBmaWxlLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOworICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KGYuZ2V0UHJvamVjdCgpKSB8fCBGYWNldFV0aWxzLmhhc1Byb2plY3RGYWNldChmLmdldFByb2plY3QoKSwgRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmdldEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpLmdldEJ1bmRsZU1hbmlmZXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmFDb3JlLmNyZWF0ZShmLmdldFByb2plY3QoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN5bWJvbGljTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3QgIT0gbnVsbCAmJiBtYW5pZmVzdC5nZXRCdW5kbGVTeW1ib2xpY05hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9saWNOYW1lID0gbWFuaWZlc3QuZ2V0QnVuZGxlU3ltYm9saWNOYW1lKCkuZ2V0U3ltYm9saWNOYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbGljTmFtZSA9IGYuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0UGF0aCA9IGYuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gZmlsZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpOwogCi0JCQkJCQkvLyBhZGQgNSBmb3IgLmphciBvciAud2FyICsgLyAoc2VlCi0JCQkJCQkvLyBTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZSNtZW1iZXJzKCkpCi0JCQkJCQlpZiAocGF0aC5sZW5ndGgoKSA+IHByb2plY3RQYXRoLmxlbmd0aCgpICsgNSkgewotCQkJCQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhwcm9qZWN0UGF0aC5sZW5ndGgoKSArIDUpOwotCQkJCQkJCWV4ZWN1dGVEZXBsb3llckNvbW1hbmQoZ2V0U2VydmVyVXBkYXRlQ29tbWFuZChtb2R1bGUsIGZpbGUsIGlkZW50aXR5LCBzeW1ib2xpY05hbWUsIHBhdGgpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZXhlY3V0ZURlcGxveWVyQ29tbWFuZChnZXRTZXJ2ZXJVcGRhdGVDb21tYW5kKG1vZHVsZSwgZmlsZSwgaWRlbnRpdHksIHN5bWJvbGljTmFtZSwgIiIpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZXhlY3V0ZURlcGxveWVyQ29tbWFuZChnZXRTZXJ2ZXJVcGRhdGVDb21tYW5kKG1vZHVsZSwgZmlsZSwgaWRlbnRpdHksIG51bGwsIGZpbGUKLQkJCQkJCS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgNSBmb3IgLmphciBvciAud2FyICsgLyAoc2VlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZSNtZW1iZXJzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA+IHByb2plY3RQYXRoLmxlbmd0aCgpICsgNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhwcm9qZWN0UGF0aC5sZW5ndGgoKSArIDUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVEZXBsb3llckNvbW1hbmQoZ2V0U2VydmVyVXBkYXRlQ29tbWFuZChtb2R1bGUsIGZpbGUsIGlkZW50aXR5LCBzeW1ib2xpY05hbWUsIHBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZURlcGxveWVyQ29tbWFuZChnZXRTZXJ2ZXJVcGRhdGVDb21tYW5kKG1vZHVsZSwgZmlsZSwgaWRlbnRpdHksIHN5bWJvbGljTmFtZSwgIiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXhlY3V0ZURlcGxveWVyQ29tbWFuZChnZXRTZXJ2ZXJVcGRhdGVDb21tYW5kKG1vZHVsZSwgZmlsZSwgaWRlbnRpdHksIG51bGwsIGZpbGUuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHNodXRkb3duKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLQkJZ2V0U2VydmVyU2h1dGRvd25Db21tYW5kKCkuZXhlY3V0ZSgpOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBnZXRTZXJ2ZXJTaHV0ZG93bkNvbW1hbmQoKS5leGVjdXRlKCk7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZGVwbG95KElNb2R1bGUuLi4gbW9kdWxlcykgewotCQlmb3IgKElNb2R1bGUgbW9kdWxlIDogbW9kdWxlcykgewotCQkJZXhlY3V0ZURlcGxveWVyQ29tbWFuZChnZXRTZXJ2ZXJVbmRlcGxveUNvbW1hbmQobW9kdWxlKSk7Ci0JCQkvLyBiZWhhdmlvdXIub25Nb2R1bGVTdGF0ZUNoYW5nZShuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sCi0JCQkvLyBJU2VydmVyLlNUQVRFX1NUT1BQRUQpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1bmRlcGxveShJTW9kdWxlLi4uIG1vZHVsZXMpIHsKKyAgICAgICAgZm9yIChJTW9kdWxlIG1vZHVsZSA6IG1vZHVsZXMpIHsKKyAgICAgICAgICAgIGV4ZWN1dGVEZXBsb3llckNvbW1hbmQoZ2V0U2VydmVyVW5kZXBsb3lDb21tYW5kKG1vZHVsZSkpOworICAgICAgICAgICAgLy8gYmVoYXZpb3VyLm9uTW9kdWxlU3RhdGVDaGFuZ2UobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LAorICAgICAgICAgICAgLy8gSVNlcnZlci5TVEFURV9TVE9QUEVEKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByb3RlY3RlZCA8VD4gVCBleGVjdXRlRGVwbG95ZXJDb21tYW5kKElTZXJ2ZXJDb21tYW5kPFQ+IHNlcnZlckNvbW1hbmQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzZXJ2ZXJDb21tYW5kLmV4ZWN1dGUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3RhdHVzVXRpbC5lcnJvcigiRmFpbGVkIGV4ZWN1dGlvbiBvZiBkZXBsb3llciBjb21tYW5kICIgKyBzZXJ2ZXJDb21tYW5kLCBlKTsKLQkJfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGF0dXNVdGlsLmVycm9yKCJGYWlsZWQgZXhlY3V0aW9uIG9mIGRlcGxveWVyIGNvbW1hbmQgIiArIHNlcnZlckNvbW1hbmQsIGUsIFN0YXR1c01hbmFnZXIuU0hPVyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIHByb3RlY3RlZCA8VD4gVCBleGVjdXRlRGVwbG95ZXJDb21tYW5kKElTZXJ2ZXJDb21tYW5kPFQ+IHNlcnZlckNvbW1hbmQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJDb21tYW5kLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RhdHVzVXRpbC5lcnJvcigiRmFpbGVkIGV4ZWN1dGlvbiBvZiBkZXBsb3llciBjb21tYW5kICIgKyBzZXJ2ZXJDb21tYW5kLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdGF0dXNVdGlsLmVycm9yKCJGYWlsZWQgZXhlY3V0aW9uIG9mIGRlcGxveWVyIGNvbW1hbmQgIiArIHNlcnZlckNvbW1hbmQsIGUsIFN0YXR1c01hbmFnZXIuU0hPVyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JcHJvdGVjdGVkIElTZXJ2ZXJDb21tYW5kPERlcGxveW1lbnRJZGVudGl0eT4gZ2V0U2VydmVyRGVwbG95Q29tbWFuZChJTW9kdWxlIG1vZHVsZSkgewotCQlyZXR1cm4gYmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyRGVwbG95Q29tbWFuZChiZWhhdmlvdXIsIG1vZHVsZSk7Ci0JfQorICAgIHByb3RlY3RlZCBJU2VydmVyQ29tbWFuZDxEZXBsb3ltZW50SWRlbnRpdHk+IGdldFNlcnZlckRlcGxveUNvbW1hbmQoSU1vZHVsZSBtb2R1bGUpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyRGVwbG95Q29tbWFuZCh0aGlzLmJlaGF2aW91ciwgbW9kdWxlKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgSVNlcnZlckNvbW1hbmQ8Qm9vbGVhbj4gZ2V0U2VydmVyUGluZ0NvbW1hbmQoKSB7Ci0JCXJldHVybiBiZWhhdmlvdXIuZ2V0VmVyc2lvbkhhbmRsZXIoKS5nZXRTZXJ2ZXJQaW5nQ29tbWFuZChiZWhhdmlvdXIpOwotCX0KKyAgICBwcm90ZWN0ZWQgSVNlcnZlckNvbW1hbmQ8Qm9vbGVhbj4gZ2V0U2VydmVyUGluZ0NvbW1hbmQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJlaGF2aW91ci5nZXRWZXJzaW9uSGFuZGxlcigpLmdldFNlcnZlclBpbmdDb21tYW5kKHRoaXMuYmVoYXZpb3VyKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgSVNlcnZlckNvbW1hbmQ8Vm9pZD4gZ2V0U2VydmVyUmVmcmVzaENvbW1hbmQoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBidW5kbGVTeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIGJlaGF2aW91ci5nZXRWZXJzaW9uSGFuZGxlcigpLmdldFNlcnZlclJlZnJlc2hDb21tYW5kKGJlaGF2aW91ciwgbW9kdWxlLCBidW5kbGVTeW1ib2xpY05hbWUpOwotCX0KKyAgICBwcm90ZWN0ZWQgSVNlcnZlckNvbW1hbmQ8Vm9pZD4gZ2V0U2VydmVyUmVmcmVzaENvbW1hbmQoSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBidW5kbGVTeW1ib2xpY05hbWUpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyUmVmcmVzaENvbW1hbmQodGhpcy5iZWhhdmlvdXIsIG1vZHVsZSwgYnVuZGxlU3ltYm9saWNOYW1lKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgSVNlcnZlckNvbW1hbmQ8Vm9pZD4gZ2V0U2VydmVyU2h1dGRvd25Db21tYW5kKCkgewotCQlyZXR1cm4gYmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyU2h1dGRvd25Db21tYW5kKGJlaGF2aW91cik7Ci0JfQorICAgIHByb3RlY3RlZCBJU2VydmVyQ29tbWFuZDxWb2lkPiBnZXRTZXJ2ZXJTaHV0ZG93bkNvbW1hbmQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJlaGF2aW91ci5nZXRWZXJzaW9uSGFuZGxlcigpLmdldFNlcnZlclNodXRkb3duQ29tbWFuZCh0aGlzLmJlaGF2aW91cik7CisgICAgfQogCi0JcHJvdGVjdGVkIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclVuZGVwbG95Q29tbWFuZChJTW9kdWxlIG1vZHVsZSkgewotCQlyZXR1cm4gYmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyVW5kZXBsb3lDb21tYW5kKGJlaGF2aW91ciwgbW9kdWxlKTsKLQl9CisgICAgcHJvdGVjdGVkIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclVuZGVwbG95Q29tbWFuZChJTW9kdWxlIG1vZHVsZSkgeworICAgICAgICByZXR1cm4gdGhpcy5iZWhhdmlvdXIuZ2V0VmVyc2lvbkhhbmRsZXIoKS5nZXRTZXJ2ZXJVbmRlcGxveUNvbW1hbmQodGhpcy5iZWhhdmlvdXIsIG1vZHVsZSk7CisgICAgfQogCi0JcHJvdGVjdGVkIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclVwZGF0ZUNvbW1hbmQoSU1vZHVsZSBtb2R1bGUsIElNb2R1bGVGaWxlIG1vZHVsZUZpbGUsCi0JCQlEZXBsb3ltZW50SWRlbnRpdHkgaWRlbnRpdHksIFN0cmluZyBidW5kbGVTeW1ib2xpY05hbWUsIFN0cmluZyB0YXJnZXRQYXRoKSB7Ci0JCXJldHVybiBiZWhhdmlvdXIuZ2V0VmVyc2lvbkhhbmRsZXIoKS5nZXRTZXJ2ZXJVcGRhdGVDb21tYW5kKGJlaGF2aW91ciwgbW9kdWxlLCBtb2R1bGVGaWxlLCBpZGVudGl0eSwKLQkJCQkJCQkJCQkJCQkJCQkJYnVuZGxlU3ltYm9saWNOYW1lLCB0YXJnZXRQYXRoKTsKLQl9CisgICAgcHJvdGVjdGVkIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclVwZGF0ZUNvbW1hbmQoSU1vZHVsZSBtb2R1bGUsIElNb2R1bGVGaWxlIG1vZHVsZUZpbGUsIERlcGxveW1lbnRJZGVudGl0eSBpZGVudGl0eSwKKyAgICAgICAgU3RyaW5nIGJ1bmRsZVN5bWJvbGljTmFtZSwgU3RyaW5nIHRhcmdldFBhdGgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyVXBkYXRlQ29tbWFuZCh0aGlzLmJlaGF2aW91ciwgbW9kdWxlLCBtb2R1bGVGaWxlLCBpZGVudGl0eSwgYnVuZGxlU3ltYm9saWNOYW1lLAorICAgICAgICAgICAgdGFyZ2V0UGF0aCk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL0RlcGxveW1lbnRJZGVudGl0eS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9EZXBsb3ltZW50SWRlbnRpdHkuamF2YQppbmRleCBiYTg3ZDZjLi5kZDJmNThiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL0RlcGxveW1lbnRJZGVudGl0eS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvRGVwbG95bWVudElkZW50aXR5LmphdmEKQEAgLTgsMzcgKzgsMzggQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlOwogCiAvKioKICAqIFNpbXBsZSBkYXRhIGhvbGRlciBmb3IgYSBkZXBsb3llZCBwYXIgb3IgYnVuZGxlLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjAKICAqLwogcHVibGljIGNsYXNzIERlcGxveW1lbnRJZGVudGl0eSB7CiAKLQlwcml2YXRlIFN0cmluZyBzeW1ib2xpY05hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3ltYm9saWNOYW1lOwogCi0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2ZXJzaW9uOwogCi0JcHVibGljIERlcGxveW1lbnRJZGVudGl0eShTdHJpbmcgc3ltYm9saWNOYW1lLCBTdHJpbmcgdmVyc2lvbikgewotCQl0aGlzLnN5bWJvbGljTmFtZSA9IHN5bWJvbGljTmFtZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9CisgICAgcHVibGljIERlcGxveW1lbnRJZGVudGl0eShTdHJpbmcgc3ltYm9saWNOYW1lLCBTdHJpbmcgdmVyc2lvbikgeworICAgICAgICB0aGlzLnN5bWJvbGljTmFtZSA9IHN5bWJvbGljTmFtZTsKKyAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICB9CiAKLQlwdWJsaWMgRGVwbG95bWVudElkZW50aXR5KFN0cmluZyBvdXRwdXQpIHsKLQkJaW50IGl4ID0gb3V0cHV0Lmxhc3RJbmRleE9mKCcjJyk7Ci0JCXRoaXMuc3ltYm9saWNOYW1lID0gb3V0cHV0LnN1YnN0cmluZygwLCBpeCk7Ci0JCXRoaXMudmVyc2lvbiA9IG91dHB1dC5zdWJzdHJpbmcoaXggKyAxKTsKLQl9CisgICAgcHVibGljIERlcGxveW1lbnRJZGVudGl0eShTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIGludCBpeCA9IG91dHB1dC5sYXN0SW5kZXhPZignIycpOworICAgICAgICB0aGlzLnN5bWJvbGljTmFtZSA9IG91dHB1dC5zdWJzdHJpbmcoMCwgaXgpOworICAgICAgICB0aGlzLnZlcnNpb24gPSBvdXRwdXQuc3Vic3RyaW5nKGl4ICsgMSk7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRTeW1ib2xpY05hbWUoKSB7Ci0JCXJldHVybiBzeW1ib2xpY05hbWU7Ci0JfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xpY05hbWU7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9MYXVuY2hBcmd1bWVudFV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL0xhdW5jaEFyZ3VtZW50VXRpbHMuamF2YQppbmRleCA5YmE4M2RiLi5lMTBjMmM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL0xhdW5jaEFyZ3VtZW50VXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL0xhdW5jaEFyZ3VtZW50VXRpbHMuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwpAQCAtMTcsMTkyICsxOCwxOTEgQEAKIAogLyoqCiAgKiBVdGlsaXR5IGNsYXNzIHRoYXQgZGVhbHMgd2l0aCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjAKICAqLwogcHVibGljIGNsYXNzIExhdW5jaEFyZ3VtZW50VXRpbHMgewogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVyZ2VBcmd1bWVudHMoU3RyaW5nIG9yaWdpbmFsQXJnLCBTdHJpbmdbXSB2bUFyZ3MsIFN0cmluZ1tdIGV4Y2x1ZGVBcmdzLAotCQkJYm9vbGVhbiBrZWVwQWN0aW9uTGFzdCkgewotCQlpZiAodm1BcmdzID09IG51bGwpIHsKLQkJCXJldHVybiBvcmlnaW5hbEFyZzsKLQkJfQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1lcmdlQXJndW1lbnRzKFN0cmluZyBvcmlnaW5hbEFyZywgU3RyaW5nW10gdm1BcmdzLCBTdHJpbmdbXSBleGNsdWRlQXJncywgYm9vbGVhbiBrZWVwQWN0aW9uTGFzdCkgeworICAgICAgICBpZiAodm1BcmdzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEFyZzsKKyAgICAgICAgfQogCi0JCWlmIChvcmlnaW5hbEFyZyA9PSBudWxsKSB7Ci0JCQlvcmlnaW5hbEFyZyA9ICIiOwotCQl9CisgICAgICAgIGlmIChvcmlnaW5hbEFyZyA9PSBudWxsKSB7CisgICAgICAgICAgICBvcmlnaW5hbEFyZyA9ICIiOworICAgICAgICB9CiAKLQkJLy8gcmVwbGFjZSBhbmQgbnVsbCBvdXQgYWxsIHZtYXJncyB0aGF0IGFscmVhZHkgZXhpc3QKLQkJaW50IHNpemUgPSB2bUFyZ3MubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaW50IGluZCA9IHZtQXJnc1tpXS5pbmRleE9mKCIgIik7Ci0JCQlpbnQgaW5kMiA9IHZtQXJnc1tpXS5pbmRleE9mKCI9Iik7Ci0JCQlpZiAoaW5kID49IDAgJiYgKGluZDIgPT0gLTEgfHwgaW5kIDwgaW5kMikpIHsgLy8gLWEgYmMgc3R5bGUKLQkJCQlpbnQgaW5kZXggPSBvcmlnaW5hbEFyZy5pbmRleE9mKHZtQXJnc1tpXS5zdWJzdHJpbmcoMCwgaW5kICsgMSkpOwotCQkJCWlmIChpbmRleCA9PSAwIHx8IChpbmRleCA+IDAgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4IC0gMSkgPT0gJyAnKSkgewotCQkJCQkvLyByZXBsYWNlCi0JCQkJCVN0cmluZyBzID0gb3JpZ2luYWxBcmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJaW50IGluZGV4MiA9IGdldE5leHRUb2tlbihvcmlnaW5hbEFyZywgaW5kZXggKyBpbmQgKyAxKTsKLQkJCQkJaWYgKGluZGV4MiA+PSAwKSB7Ci0JCQkJCQlvcmlnaW5hbEFyZyA9IHMgKyB2bUFyZ3NbaV0gKyBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoaW5kZXgyKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIHZtQXJnc1tpXTsKLQkJCQkJfQotCQkJCQl2bUFyZ3NbaV0gPSBudWxsOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoaW5kMiA+PSAwKSB7IC8vIGE9YiBzdHlsZQotCQkJCWludCBpbmRleCA9IG9yaWdpbmFsQXJnLmluZGV4T2Yodm1BcmdzW2ldLnN1YnN0cmluZygwLCBpbmQyICsgMSkpOwotCQkJCWlmIChpbmRleCA9PSAwIHx8IChpbmRleCA+IDAgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4IC0gMSkgPT0gJyAnKSkgewotCQkJCQkvLyByZXBsYWNlCi0JCQkJCVN0cmluZyBzID0gb3JpZ2luYWxBcmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJaW50IGluZGV4MiA9IGdldE5leHRUb2tlbihvcmlnaW5hbEFyZywgaW5kZXgpOwotCQkJCQlpZiAoaW5kZXgyID49IDApIHsKLQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIHZtQXJnc1tpXSArIG9yaWdpbmFsQXJnLnN1YnN0cmluZyhpbmRleDIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJb3JpZ2luYWxBcmcgPSBzICsgdm1BcmdzW2ldOwotCQkJCQl9Ci0JCQkJCXZtQXJnc1tpXSA9IG51bGw7Ci0JCQkJfQotCQkJfSBlbHNlIHsgLy8gYWJjIHN0eWxlCi0JCQkJaW50IGluZGV4ID0gb3JpZ2luYWxBcmcuaW5kZXhPZih2bUFyZ3NbaV0pOwotCQkJCWlmIChpbmRleCA9PSAwIHx8IChpbmRleCA+IDAgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4IC0gMSkgPT0gJyAnKSkgewotCQkJCQkvLyByZXBsYWNlCi0JCQkJCVN0cmluZyBzID0gb3JpZ2luYWxBcmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJaW50IGluZGV4MiA9IGdldE5leHRUb2tlbihvcmlnaW5hbEFyZywgaW5kZXgpOwotCQkJCQlpZiAoIWtlZXBBY3Rpb25MYXN0IHx8IGkgPCAoc2l6ZSAtIDEpKSB7Ci0JCQkJCQlpZiAoaW5kZXgyID49IDApIHsKLQkJCQkJCQlvcmlnaW5hbEFyZyA9IHMgKyB2bUFyZ3NbaV0gKyBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoaW5kZXgyKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJb3JpZ2luYWxBcmcgPSBzICsgdm1BcmdzW2ldOwotCQkJCQkJfQotCQkJCQkJdm1BcmdzW2ldID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIFRoZSBsYXN0IFZNIGFyZ3VtZW50IG5lZWRzIHRvIHJlbWFpbiBsYXN0LAotCQkJCQkJLy8gcmVtb3ZlIG9yaWdpbmFsIGFyZyBhbmQgYXBwZW5kIHRoZSB2bUFyZyBsYXRlcgotCQkJCQkJaWYgKGluZGV4MiA+PSAwKSB7Ci0JCQkJCQkJb3JpZ2luYWxBcmcgPSBzICsgb3JpZ2luYWxBcmcuc3Vic3RyaW5nKGluZGV4Mik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW9yaWdpbmFsQXJnID0gczsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICAvLyByZXBsYWNlIGFuZCBudWxsIG91dCBhbGwgdm1hcmdzIHRoYXQgYWxyZWFkeSBleGlzdAorICAgICAgICBpbnQgc2l6ZSA9IHZtQXJncy5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaW5kID0gdm1BcmdzW2ldLmluZGV4T2YoIiAiKTsKKyAgICAgICAgICAgIGludCBpbmQyID0gdm1BcmdzW2ldLmluZGV4T2YoIj0iKTsKKyAgICAgICAgICAgIGlmIChpbmQgPj0gMCAmJiAoaW5kMiA9PSAtMSB8fCBpbmQgPCBpbmQyKSkgeyAvLyAtYSBiYyBzdHlsZQorICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG9yaWdpbmFsQXJnLmluZGV4T2Yodm1BcmdzW2ldLnN1YnN0cmluZygwLCBpbmQgKyAxKSk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDAgfHwgaW5kZXggPiAwICYmIG9yaWdpbmFsQXJnLmNoYXJBdChpbmRleCAtIDEpID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gb3JpZ2luYWxBcmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MiA9IGdldE5leHRUb2tlbihvcmlnaW5hbEFyZywgaW5kZXggKyBpbmQgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4MiA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEFyZyA9IHMgKyB2bUFyZ3NbaV0gKyBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoaW5kZXgyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsQXJnID0gcyArIHZtQXJnc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2bUFyZ3NbaV0gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kMiA+PSAwKSB7IC8vIGE9YiBzdHlsZQorICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG9yaWdpbmFsQXJnLmluZGV4T2Yodm1BcmdzW2ldLnN1YnN0cmluZygwLCBpbmQyICsgMSkpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwIHx8IGluZGV4ID4gMCAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXggLSAxKSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjZQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IG9yaWdpbmFsQXJnLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIgPSBnZXROZXh0VG9rZW4ob3JpZ2luYWxBcmcsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4MiA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEFyZyA9IHMgKyB2bUFyZ3NbaV0gKyBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoaW5kZXgyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsQXJnID0gcyArIHZtQXJnc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2bUFyZ3NbaV0gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIGFiYyBzdHlsZQorICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG9yaWdpbmFsQXJnLmluZGV4T2Yodm1BcmdzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCB8fCBpbmRleCA+IDAgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4IC0gMSkgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyID0gZ2V0TmV4dFRva2VuKG9yaWdpbmFsQXJnLCBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgha2VlcEFjdGlvbkxhc3QgfHwgaSA8IHNpemUgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXgyID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEFyZyA9IHMgKyB2bUFyZ3NbaV0gKyBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoaW5kZXgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxBcmcgPSBzICsgdm1BcmdzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdm1BcmdzW2ldID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBsYXN0IFZNIGFyZ3VtZW50IG5lZWRzIHRvIHJlbWFpbiBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG9yaWdpbmFsIGFyZyBhbmQgYXBwZW5kIHRoZSB2bUFyZyBsYXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4MiA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxBcmcgPSBzICsgb3JpZ2luYWxBcmcuc3Vic3RyaW5nKGluZGV4Mik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsQXJnID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vIHJlbW92ZSBleGNsdWRlZCBhcmd1bWVudHMKLQkJaWYgKGV4Y2x1ZGVBcmdzICE9IG51bGwgJiYgZXhjbHVkZUFyZ3MubGVuZ3RoID4gMCkgewotCQkJZm9yIChTdHJpbmcgZXhjbHVkZUFyZyA6IGV4Y2x1ZGVBcmdzKSB7Ci0JCQkJaW50IGluZCA9IGV4Y2x1ZGVBcmcuaW5kZXhPZigiICIpOwotCQkJCWludCBpbmQyID0gZXhjbHVkZUFyZy5pbmRleE9mKCI9Iik7Ci0JCQkJaWYgKGluZCA+PSAwICYmIChpbmQyID09IC0xIHx8IGluZCA8IGluZDIpKSB7IC8vIC1hIGJjIHN0eWxlCi0JCQkJCWludCBpbmRleCA9IG9yaWdpbmFsQXJnLmluZGV4T2YoZXhjbHVkZUFyZy5zdWJzdHJpbmcoMCwgaW5kICsgMSkpOwotCQkJCQlpZiAoaW5kZXggPT0gMCB8fCAoaW5kZXggPiAwICYmIG9yaWdpbmFsQXJnLmNoYXJBdChpbmRleCAtIDEpID09ICcgJykpIHsKLQkJCQkJCS8vIHJlbW92ZQotCQkJCQkJU3RyaW5nIHMgPSBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCQkJaW50IGluZGV4MiA9IGdldE5leHRUb2tlbihvcmlnaW5hbEFyZywgaW5kZXggKyBpbmQgKyAxKTsKLQkJCQkJCWlmIChpbmRleDIgPj0gMCkgewotCQkJCQkJCS8vIElmIHJlbWFpbmRlciB3aWxsIGJlY29tZSB0aGUgZmlyc3QgYXJndW1lbnQsCi0JCQkJCQkJLy8gcmVtb3ZlIGxlYWRpbmcgYmxhbmtzCi0JCQkJCQkJd2hpbGUgKGluZGV4MiA8IG9yaWdpbmFsQXJnLmxlbmd0aCgpICYmIG9yaWdpbmFsQXJnLmNoYXJBdChpbmRleDIpID09ICcgJykgewotCQkJCQkJCQlpbmRleDIgKz0gMTsKLQkJCQkJCQl9Ci0JCQkJCQkJb3JpZ2luYWxBcmcgPSBzICsgb3JpZ2luYWxBcmcuc3Vic3RyaW5nKGluZGV4Mik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW9yaWdpbmFsQXJnID0gczsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoaW5kMiA+PSAwKSB7IC8vIGE9YiBzdHlsZQotCQkJCQlpbnQgaW5kZXggPSBvcmlnaW5hbEFyZy5pbmRleE9mKGV4Y2x1ZGVBcmcuc3Vic3RyaW5nKDAsIGluZDIgKyAxKSk7Ci0JCQkJCWlmIChpbmRleCA9PSAwIHx8IChpbmRleCA+IDAgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4IC0gMSkgPT0gJyAnKSkgewotCQkJCQkJLy8gcmVtb3ZlCi0JCQkJCQlTdHJpbmcgcyA9IG9yaWdpbmFsQXJnLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCQlpbnQgaW5kZXgyID0gZ2V0TmV4dFRva2VuKG9yaWdpbmFsQXJnLCBpbmRleCk7Ci0JCQkJCQlpZiAoaW5kZXgyID49IDApIHsKLQkJCQkJCQkvLyBJZiByZW1haW5kZXIgd2lsbCBiZWNvbWUgdGhlIGZpcnN0IGFyZ3VtZW50LAotCQkJCQkJCS8vIHJlbW92ZSBsZWFkaW5nIGJsYW5rcwotCQkJCQkJCXdoaWxlIChpbmRleDIgPCBvcmlnaW5hbEFyZy5sZW5ndGgoKSAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXgyKSA9PSAnICcpIHsKLQkJCQkJCQkJaW5kZXgyICs9IDE7Ci0JCQkJCQkJfQotCQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIG9yaWdpbmFsQXJnLnN1YnN0cmluZyhpbmRleDIpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlvcmlnaW5hbEFyZyA9IHM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgeyAvLyBhYmMgc3R5bGUKLQkJCQkJaW50IGluZGV4ID0gb3JpZ2luYWxBcmcuaW5kZXhPZihleGNsdWRlQXJnKTsKLQkJCQkJaWYgKGluZGV4ID09IDAgfHwgKGluZGV4ID4gMCAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXggLSAxKSA9PSAnICcpKSB7Ci0JCQkJCQkvLyByZW1vdmUKLQkJCQkJCVN0cmluZyBzID0gb3JpZ2luYWxBcmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJCWludCBpbmRleDIgPSBnZXROZXh0VG9rZW4ob3JpZ2luYWxBcmcsIGluZGV4KTsKLQkJCQkJCWlmIChpbmRleDIgPj0gMCkgewotCQkJCQkJCS8vIFJlbW92ZSBsZWFkaW5nIGJsYW5rcwotCQkJCQkJCXdoaWxlIChpbmRleDIgPCBvcmlnaW5hbEFyZy5sZW5ndGgoKSAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXgyKSA9PSAnICcpIHsKLQkJCQkJCQkJaW5kZXgyICs9IDE7Ci0JCQkJCQkJfQotCQkJCQkJCW9yaWdpbmFsQXJnID0gcyArIG9yaWdpbmFsQXJnLnN1YnN0cmluZyhpbmRleDIpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlvcmlnaW5hbEFyZyA9IHM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgLy8gcmVtb3ZlIGV4Y2x1ZGVkIGFyZ3VtZW50cworICAgICAgICBpZiAoZXhjbHVkZUFyZ3MgIT0gbnVsbCAmJiBleGNsdWRlQXJncy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBleGNsdWRlQXJnIDogZXhjbHVkZUFyZ3MpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kID0gZXhjbHVkZUFyZy5pbmRleE9mKCIgIik7CisgICAgICAgICAgICAgICAgaW50IGluZDIgPSBleGNsdWRlQXJnLmluZGV4T2YoIj0iKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kID49IDAgJiYgKGluZDIgPT0gLTEgfHwgaW5kIDwgaW5kMikpIHsgLy8gLWEgYmMgc3R5bGUKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gb3JpZ2luYWxBcmcuaW5kZXhPZihleGNsdWRlQXJnLnN1YnN0cmluZygwLCBpbmQgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwIHx8IGluZGV4ID4gMCAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXggLSAxKSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZQorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MiA9IGdldE5leHRUb2tlbihvcmlnaW5hbEFyZywgaW5kZXggKyBpbmQgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleDIgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHJlbWFpbmRlciB3aWxsIGJlY29tZSB0aGUgZmlyc3QgYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGxlYWRpbmcgYmxhbmtzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4MiA8IG9yaWdpbmFsQXJnLmxlbmd0aCgpICYmIG9yaWdpbmFsQXJnLmNoYXJBdChpbmRleDIpID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDIgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxBcmcgPSBzICsgb3JpZ2luYWxBcmcuc3Vic3RyaW5nKGluZGV4Mik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsQXJnID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kMiA+PSAwKSB7IC8vIGE9YiBzdHlsZQorICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBvcmlnaW5hbEFyZy5pbmRleE9mKGV4Y2x1ZGVBcmcuc3Vic3RyaW5nKDAsIGluZDIgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwIHx8IGluZGV4ID4gMCAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXggLSAxKSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZQorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MiA9IGdldE5leHRUb2tlbihvcmlnaW5hbEFyZywgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4MiA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgcmVtYWluZGVyIHdpbGwgYmVjb21lIHRoZSBmaXJzdCBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgbGVhZGluZyBibGFua3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaW5kZXgyIDwgb3JpZ2luYWxBcmcubGVuZ3RoKCkgJiYgb3JpZ2luYWxBcmcuY2hhckF0KGluZGV4MikgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4MiArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEFyZyA9IHMgKyBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoaW5kZXgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxBcmcgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gYWJjIHN0eWxlCisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG9yaWdpbmFsQXJnLmluZGV4T2YoZXhjbHVkZUFyZyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwIHx8IGluZGV4ID4gMCAmJiBvcmlnaW5hbEFyZy5jaGFyQXQoaW5kZXggLSAxKSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZQorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBvcmlnaW5hbEFyZy5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MiA9IGdldE5leHRUb2tlbihvcmlnaW5hbEFyZywgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4MiA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGxlYWRpbmcgYmxhbmtzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGluZGV4MiA8IG9yaWdpbmFsQXJnLmxlbmd0aCgpICYmIG9yaWdpbmFsQXJnLmNoYXJBdChpbmRleDIpID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDIgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxBcmcgPSBzICsgb3JpZ2luYWxBcmcuc3Vic3RyaW5nKGluZGV4Mik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsQXJnID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vIGFkZCByZW1haW5pbmcgdm1hcmdzIHRvIHRoZSBlbmQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmICh2bUFyZ3NbaV0gIT0gbnVsbCkgewotCQkJCWlmIChvcmlnaW5hbEFyZy5sZW5ndGgoKSA+IDAgJiYgIW9yaWdpbmFsQXJnLmVuZHNXaXRoKCIgIikpIHsKLQkJCQkJb3JpZ2luYWxBcmcgKz0gIiAiOwotCQkJCX0KLQkJCQlvcmlnaW5hbEFyZyArPSB2bUFyZ3NbaV07Ci0JCQl9Ci0JCX0KKyAgICAgICAgLy8gYWRkIHJlbWFpbmluZyB2bWFyZ3MgdG8gdGhlIGVuZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgaWYgKHZtQXJnc1tpXSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsQXJnLmxlbmd0aCgpID4gMCAmJiAhb3JpZ2luYWxBcmcuZW5kc1dpdGgoIiAiKSkgeworICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEFyZyArPSAiICI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9yaWdpbmFsQXJnICs9IHZtQXJnc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXJldHVybiBvcmlnaW5hbEFyZzsKLQl9CisgICAgICAgIHJldHVybiBvcmlnaW5hbEFyZzsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2VDbGFzc3BhdGgoTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBjcCwgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlJdGVyYXRvcjxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBpdGVyYXRvciA9IGNwLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVudHJ5Mi5nZXRQYXRoKCkuZXF1YWxzKGVudHJ5LmdldFBhdGgoKSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJY3AuYWRkKGVudHJ5KTsKLQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1lcmdlQ2xhc3NwYXRoKExpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gY3AsIElSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKKyAgICAgICAgSXRlcmF0b3I8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gaXRlcmF0b3IgPSBjcC5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5MiA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChlbnRyeTIuZ2V0UGF0aCgpLmVxdWFscyhlbnRyeS5nZXRQYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNwLmFkZChlbnRyeSk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VKUkVDb250YWluZXIoTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBjcCwgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlpbnQgc2l6ZSA9IGNwLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkyID0gY3AuZ2V0KGkpOwotCQkJaWYgKGVudHJ5Mi5nZXRQYXRoKCkudXB0b1NlZ21lbnQoMikuaXNQcmVmaXhPZihlbnRyeS5nZXRQYXRoKCkpKSB7Ci0JCQkJY3Auc2V0KGksIGVudHJ5KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJY3AuYWRkKDAsIGVudHJ5KTsKLQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VKUkVDb250YWluZXIoTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBjcCwgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSkgeworICAgICAgICBpbnQgc2l6ZSA9IGNwLnNpemUoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIElSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkyID0gY3AuZ2V0KGkpOworICAgICAgICAgICAgaWYgKGVudHJ5Mi5nZXRQYXRoKCkudXB0b1NlZ21lbnQoMikuaXNQcmVmaXhPZihlbnRyeS5nZXRQYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgY3Auc2V0KGksIGVudHJ5KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY3AuYWRkKDAsIGVudHJ5KTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZXROZXh0VG9rZW4oU3RyaW5nIHMsIGludCBzdGFydCkgewotCQlpbnQgaSA9IHN0YXJ0OwotCQlpbnQgbGVuZ3RoID0gcy5sZW5ndGgoKTsKLQkJY2hhciBsb29rRm9yID0gJyAnOworICAgIHByb3RlY3RlZCBzdGF0aWMgaW50IGdldE5leHRUb2tlbihTdHJpbmcgcywgaW50IHN0YXJ0KSB7CisgICAgICAgIGludCBpID0gc3RhcnQ7CisgICAgICAgIGludCBsZW5ndGggPSBzLmxlbmd0aCgpOworICAgICAgICBjaGFyIGxvb2tGb3IgPSAnICc7CiAKLQkJd2hpbGUgKGkgPCBsZW5ndGgpIHsKLQkJCWNoYXIgYyA9IHMuY2hhckF0KGkpOwotCQkJaWYgKGxvb2tGb3IgPT0gYykgewotCQkJCWlmIChsb29rRm9yID09ICciJykgewotCQkJCQlyZXR1cm4gaSArIDE7Ci0JCQkJfQotCQkJCXJldHVybiBpOwotCQkJfQotCQkJaWYgKGMgPT0gJyInKSB7Ci0JCQkJbG9va0ZvciA9ICciJzsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICB3aGlsZSAoaSA8IGxlbmd0aCkgeworICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAobG9va0ZvciA9PSBjKSB7CisgICAgICAgICAgICAgICAgaWYgKGxvb2tGb3IgPT0gJyInKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyA9PSAnIicpIHsKKyAgICAgICAgICAgICAgICBsb29rRm9yID0gJyInOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXIuamF2YQppbmRleCBhNWU0NGJiLi44ZjM0ODFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvU2VydmVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKQEAgLTQ5LDM4OCArNTAsMzgwIEBACiAKIC8qKgogICogRGVmYXVsdCBkbSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBhdXRob3IgTGVvIERvcyBTYW50b3MKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgU2VydmVyIGV4dGVuZHMgU2VydmVyRGVsZWdhdGUgaW1wbGVtZW50cyBJU2VydmVyLCBJU2VydmVyV29ya2luZ0NvcHkgewogCi0JcHJpdmF0ZSBTZXJ2ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CisgICAgcHJpdmF0ZSBTZXJ2ZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CiAKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IExpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPigpOworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgTGlzdDxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+KCk7CiAKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IElTZXJ2ZXJSdW50aW1lUHJvdmlkZXIgdmVyc2lvbkhhbmRsZXI7CisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBJU2VydmVyUnVudGltZVByb3ZpZGVyIHZlcnNpb25IYW5kbGVyOwogCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmF0aW9uQ2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgeworICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VydmVyTmFtZSgpIHsKLQkJcmV0dXJuICJTcHJpbmdTb3VyY2UgZG0gU2VydmVyIjsKLQl9CisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gIlNwcmluZ1NvdXJjZSBkbSBTZXJ2ZXIiOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIGNhbk1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSkgewotCQlpZiAoYWRkICE9IG51bGwpIHsKLQkJCWludCBzaXplID0gYWRkLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSU1vZHVsZSBtb2R1bGUgPSBhZGRbaV07Ci0JCQkJaWYgKCFGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lELmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpCi0JCQkJCQkmJiAhRmFjZXRDb3JlUGx1Z2luLkJVTkRMRV9GQUNFVF9JRC5lcXVhbHMobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKQotCQkJCQkJJiYgIUZhY2V0Q29yZVBsdWdpbi5QQVJfRkFDRVRfSUQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkKLQkJCQkJCSYmICFGYWNldENvcmVQbHVnaW4uUExBTl9GQUNFVF9JRC5lcXVhbHMobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQkJCQkiU3ByaW5nU291cmNlIHBhciBvciBidW5kbGUgcHJvamVjdHMgb25seSIsIG51bGwpOwotCQkJCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyBjYW5Nb2RpZnlNb2R1bGVzKElNb2R1bGVbXSBhZGQsIElNb2R1bGVbXSByZW1vdmUpIHsKKyAgICAgICAgaWYgKGFkZCAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGFkZC5sZW5ndGg7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIElNb2R1bGUgbW9kdWxlID0gYWRkW2ldOworICAgICAgICAgICAgICAgIGlmICghRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRC5lcXVhbHMobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKQorICAgICAgICAgICAgICAgICAgICAmJiAhRmFjZXRDb3JlUGx1Z2luLkJVTkRMRV9GQUNFVF9JRC5lcXVhbHMobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKQorICAgICAgICAgICAgICAgICAgICAmJiAhRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRC5lcXVhbHMobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKQorICAgICAgICAgICAgICAgICAgICAmJiAhRmFjZXRDb3JlUGx1Z2luLlBMQU5fRkFDRVRfSUQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsICJTcHJpbmdTb3VyY2UgcGFyIG9yIGJ1bmRsZSBwcm9qZWN0cyBvbmx5IiwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJSVByb2plY3QgcHJvamVjdCA9IG1vZHVsZS5nZXRQcm9qZWN0KCk7Ci0JCQkJLy8gQ2hlY2sgdGhhdCBuZXN0ZWQgcGFyIG1vZHVsZSBpcyBub3QgZGlzcGxheWVkCi0JCQkJaWYgKG1vZHVsZS5nZXRJZCgpLmVuZHNXaXRoKCIkIiArIHByb2plY3QuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgIk5vIG5lc3RlZCBwYXIgbW9kdWxlcyBhbGxvd2VkIiwKLQkJCQkJCQludWxsKTsKLQkJCQl9CisgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IG1vZHVsZS5nZXRQcm9qZWN0KCk7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBuZXN0ZWQgcGFyIG1vZHVsZSBpcyBub3QgZGlzcGxheWVkCisgICAgICAgICAgICAgICAgaWYgKG1vZHVsZS5nZXRJZCgpLmVuZHNXaXRoKCIkIiArIHByb2plY3QuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgIk5vIG5lc3RlZCBwYXIgbW9kdWxlcyBhbGxvd2VkIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJLy8gQ2hlY2sgdGhhdCBzaGFyZWQgd2FyIGlzIG9ubHkgZGVwbG95ZWQgYXMgV0FSCi0JCQkJdHJ5IHsKLQkJCQkJaWYgKEZhY2V0VXRpbHMuaGFzTmF0dXJlKHByb2plY3QsIEphdmFDb3JlLk5BVFVSRV9JRCkKLQkJCQkJCQkmJiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQocHJvamVjdCwgRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRCkKLQkJCQkJCQkmJiBGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChwcm9qZWN0KQotCQkJCQkJCSYmIEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpIHsKLQkJCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJCQkiU2hhcmVkIFdBUiBkZXBsb3kgb25seSBhcyBqc3Qud2ViIG1vZHVsZXMiLCBudWxsKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwKLQkJCQkJCQkiQ29yZSBFeGNlcHRpb24gd2hlbiByZXNvbHZpbmcgcHJvamVjdDogIiwgZSk7Ci0JCQkJfQorICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgc2hhcmVkIHdhciBpcyBvbmx5IGRlcGxveWVkIGFzIFdBUgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChGYWNldFV0aWxzLmhhc05hdHVyZShwcm9qZWN0LCBKYXZhQ29yZS5OQVRVUkVfSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQocHJvamVjdCwgRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRCkgJiYgRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAwLCAiU2hhcmVkIFdBUiBkZXBsb3kgb25seSBhcyBqc3Qud2ViIG1vZHVsZXMiLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgIkNvcmUgRXhjZXB0aW9uIHdoZW4gcmVzb2x2aW5nIHByb2plY3Q6ICIsIGUpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCWlmIChnZXRWZXJzaW9uSGFuZGxlcigpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDAsICJObyAiICsgZ2V0U2VydmVyTmFtZSgpCi0JCQkJCQkJKyAiIHJ1bnRpbWUgY29uZmlndXJlZCIsIG51bGwpOwotCQkJCX0KKyAgICAgICAgICAgICAgICBpZiAoZ2V0VmVyc2lvbkhhbmRsZXIoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAwLCAiTm8gIiArIGdldFNlcnZlck5hbWUoKSArICIgcnVudGltZSBjb25maWd1cmVkIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBnZXRWZXJzaW9uSGFuZGxlcigpLmNhbkFkZE1vZHVsZShtb2R1bGUpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KKyAgICAgICAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IGdldFZlcnNpb25IYW5kbGVyKCkuY2FuQWRkTW9kdWxlKG1vZHVsZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJaWYgKG1vZHVsZS5nZXRQcm9qZWN0KCkgPT0gbnVsbCB8fCAhbW9kdWxlLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgIlByb2plY3Qgbm90IGFjY2Vzc2libGUiLCBudWxsKTsKLQkJCQl9CisgICAgICAgICAgICAgICAgaWYgKG1vZHVsZS5nZXRQcm9qZWN0KCkgPT0gbnVsbCB8fCAhbW9kdWxlLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgMCwgIlByb2plY3Qgbm90IGFjY2Vzc2libGUiLCBudWxsKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlzdGF0dXMgPSBGYWNldFV0aWwudmVyaWZ5RmFjZXRzKG1vZHVsZS5nZXRQcm9qZWN0KCksIGdldFNlcnZlcigpKTsKLQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQl9CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRmFjZXRVdGlsLnZlcmlmeUZhY2V0cyhtb2R1bGUuZ2V0UHJvamVjdCgpLCBnZXRTZXJ2ZXIoKSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQogCi0JCQl9Ci0JCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvbkNoYW5nZWQoKSB7Ci0JCWNvbmZpZ3VyYXRpb24gPSBudWxsOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uQ2hhbmdlZCgpIHsKKyAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gbnVsbDsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJTW9kdWxlW10gbW9kdWxlKSB7Ci0JCWlmIChtb2R1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSU1vZHVsZVtdIGdldENoaWxkTW9kdWxlcyhJTW9kdWxlW10gbW9kdWxlKSB7CisgICAgICAgIGlmIChtb2R1bGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQlJTW9kdWxlVHlwZSBtb2R1bGVUeXBlID0gbW9kdWxlWzBdLmdldE1vZHVsZVR5cGUoKTsKKyAgICAgICAgSU1vZHVsZVR5cGUgbW9kdWxlVHlwZSA9IG1vZHVsZVswXS5nZXRNb2R1bGVUeXBlKCk7CiAKLQkJaWYgKG1vZHVsZS5sZW5ndGggPT0gMSAmJiBtb2R1bGVUeXBlICE9IG51bGwpIHsKLQkJCWlmIChGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lELmVxdWFscyhtb2R1bGVUeXBlLmdldElkKCkpKSB7Ci0JCQkJSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSkgbW9kdWxlWzBdLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG51bGwpOwotCQkJCWlmICh3ZWJNb2R1bGUgIT0gbnVsbCkgewotCQkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IHdlYk1vZHVsZS5nZXRNb2R1bGVzKCk7Ci0JCQkJCXJldHVybiBtb2R1bGVzOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRC5lcXVhbHMobW9kdWxlVHlwZS5nZXRJZCgpKSkgewotCQkJCVNlcnZlck1vZHVsZURlbGVnYXRlIHBhck1vZHVsZSA9IChTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZSkgbW9kdWxlWzBdLmxvYWRBZGFwdGVyKAotCQkJCQkJU2VydmVyTW9kdWxlRGVsZWdhdGUuY2xhc3MsIG51bGwpOwotCQkJCWlmIChwYXJNb2R1bGUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gcGFyTW9kdWxlLmdldENoaWxkTW9kdWxlcygpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRmFjZXRDb3JlUGx1Z2luLlBMQU5fRkFDRVRfSUQuZXF1YWxzKG1vZHVsZVR5cGUuZ2V0SWQoKSkpIHsKLQkJCQlTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZSBwbGFuTW9kdWxlID0gKFNlcnZlck1vZHVsZURlbGVnYXRlKSBtb2R1bGVbMF0ubG9hZEFkYXB0ZXIoCi0JCQkJCQlTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbnVsbCk7Ci0JCQkJaWYgKHBsYW5Nb2R1bGUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gcGxhbk1vZHVsZS5nZXRDaGlsZE1vZHVsZXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKG1vZHVsZS5sZW5ndGggPT0gMSAmJiBtb2R1bGVUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lELmVxdWFscyhtb2R1bGVUeXBlLmdldElkKCkpKSB7CisgICAgICAgICAgICAgICAgSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSkgbW9kdWxlWzBdLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgICAgIGlmICh3ZWJNb2R1bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJTW9kdWxlW10gbW9kdWxlcyA9IHdlYk1vZHVsZS5nZXRNb2R1bGVzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRC5lcXVhbHMobW9kdWxlVHlwZS5nZXRJZCgpKSkgeworICAgICAgICAgICAgICAgIFNlcnZlck1vZHVsZURlbGVnYXRlIHBhck1vZHVsZSA9IChTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZSkgbW9kdWxlWzBdLmxvYWRBZGFwdGVyKFNlcnZlck1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyTW9kdWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhck1vZHVsZS5nZXRDaGlsZE1vZHVsZXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKEZhY2V0Q29yZVBsdWdpbi5QTEFOX0ZBQ0VUX0lELmVxdWFscyhtb2R1bGVUeXBlLmdldElkKCkpKSB7CisgICAgICAgICAgICAgICAgU2VydmVyTW9kdWxlRGVsZWdhdGUgcGxhbk1vZHVsZSA9IChTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZSkgbW9kdWxlWzBdLmxvYWRBZGFwdGVyKFNlcnZlck1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAocGxhbk1vZHVsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGFuTW9kdWxlLmdldENoaWxkTW9kdWxlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXJldHVybiBuZXcgSU1vZHVsZVswXTsKLQl9CisgICAgICAgIHJldHVybiBuZXcgSU1vZHVsZVswXTsKKyAgICB9CiAKLQlwdWJsaWMgc3luY2hyb25pemVkIElTZXJ2ZXJDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChjb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJY29uZmlndXJhdGlvbiA9IG5ldyBTZXJ2ZXJDb25maWd1cmF0aW9uKGdldFNlcnZlcigpLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb247Ci0JfQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSVNlcnZlckNvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IG5ldyBTZXJ2ZXJDb25maWd1cmF0aW9uKGdldFNlcnZlcigpLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbjsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGdldERlcGxveURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QRVJUWV9ERVBMT1lfRElSLCBERUZBVUxUX0RFUExPWURJUik7Ci0JfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVwbG95RGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX0RFUExPWV9ESVIsIERFRkFVTFRfREVQTE9ZRElSKTsKKyAgICB9CiAKLQlwdWJsaWMgaW50IGdldERlcGxveVRpbWVvdXQoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfREVQTE9ZX1RJTUVPVVQsIERFRkFVTFRfREVQTE9ZX1RJTUVPVVQpOwotCX0KKyAgICBwdWJsaWMgaW50IGdldERlcGxveVRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfREVQTE9ZX1RJTUVPVVQsIERFRkFVTFRfREVQTE9ZX1RJTUVPVVQpOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0TUJlYW5TZXJ2ZXJQYXNzd29yZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QRVJUWV9NQkVBTl9TRVJWRVJfUEFTU1dPUkQsIERFRkFVTFRfTUJFQU5fU0VSVkVSX1BBU1NXT1JEKTsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRNQmVhblNlcnZlclBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX01CRUFOX1NFUlZFUl9QQVNTV09SRCwgREVGQVVMVF9NQkVBTl9TRVJWRVJfUEFTU1dPUkQpOworICAgIH0KIAotCXB1YmxpYyBpbnQgZ2V0TUJlYW5TZXJ2ZXJQb3J0KCkgewotCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKGdldEF0dHJpYnV0ZShQUk9QRVJUWV9NQkVBTl9TRVJWRVJfUE9SVCwgREVGQVVMVF9NQkVBTl9TRVJWRVJfUE9SVCkpOwotCX0KKyAgICBwdWJsaWMgaW50IGdldE1CZWFuU2VydmVyUG9ydCgpIHsKKyAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfTUJFQU5fU0VSVkVSX1BPUlQsIERFRkFVTFRfTUJFQU5fU0VSVkVSX1BPUlQpKTsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGdldE1CZWFuU2VydmVyVXNlcm5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfTUJFQU5fU0VSVkVSX1VTRVJOQU1FLCBERUZBVUxUX01CRUFOX1NFUlZFUl9VU0VSTkFNRSk7Ci0JfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TUJlYW5TZXJ2ZXJVc2VybmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QRVJUWV9NQkVBTl9TRVJWRVJfVVNFUk5BTUUsIERFRkFVTFRfTUJFQU5fU0VSVkVSX1VTRVJOQU1FKTsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGdldE1heFBlcm1TaXplKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX01BWF9QRVJNX1NJWkUsIERFRkFVTFRfTUFYX1BFUk1fU0laRSk7Ci0JfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF4UGVybVNpemUoKSB7CisgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfTUFYX1BFUk1fU0laRSwgREVGQVVMVF9NQVhfUEVSTV9TSVpFKTsKKyAgICB9CiAKLQlwdWJsaWMgSVBhdGggZ2V0TW9kdWxlRGVwbG95RGlyZWN0b3J5KElNb2R1bGUgbW9kdWxlKSB7Ci0JCWlmIChGYWNldENvcmVQbHVnaW4uQlVORExFX0ZBQ0VUX0lELmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpKSB7Ci0JCQlyZXR1cm4gZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCkuYXBwZW5kKG1vZHVsZS5nZXROYW1lKCkgKyAiLmphciIpOwotCQl9IGVsc2UgaWYgKEZhY2V0Q29yZVBsdWdpbi5QQVJfRkFDRVRfSUQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpIHsKLQkJCXJldHVybiBnZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKS5hcHBlbmQobW9kdWxlLmdldE5hbWUoKSArICIucGFyIik7Ci0JCX0gZWxzZSBpZiAoRmFjZXRDb3JlUGx1Z2luLlBMQU5fRkFDRVRfSUQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpIHsKLQkJCXJldHVybiBnZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKS5hcHBlbmQobW9kdWxlLmdldE5hbWUoKSArICIud2FyIik7Ci0JCX0KLQl9CisgICAgcHVibGljIElQYXRoIGdldE1vZHVsZURlcGxveURpcmVjdG9yeShJTW9kdWxlIG1vZHVsZSkgeworICAgICAgICBpZiAoRmFjZXRDb3JlUGx1Z2luLkJVTkRMRV9GQUNFVF9JRC5lcXVhbHMobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNlcnZlckRlcGxveURpcmVjdG9yeSgpLmFwcGVuZChtb2R1bGUuZ2V0TmFtZSgpICsgIi5qYXIiKTsKKyAgICAgICAgfSBlbHNlIGlmIChGYWNldENvcmVQbHVnaW4uUEFSX0ZBQ0VUX0lELmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCkuYXBwZW5kKG1vZHVsZS5nZXROYW1lKCkgKyAiLnBhciIpOworICAgICAgICB9IGVsc2UgaWYgKEZhY2V0Q29yZVBsdWdpbi5QTEFOX0ZBQ0VUX0lELmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCkuYXBwZW5kKG1vZHVsZS5nZXROYW1lKCkgKyAiLndhciIpOworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElNb2R1bGVbXSBnZXRSb290TW9kdWxlcyhJTW9kdWxlIG1vZHVsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRC5lcXVhbHMobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKQotCQkJCXx8IEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkKLQkJCQl8fCBGYWNldENvcmVQbHVnaW4uUEFSX0ZBQ0VUX0lELmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpCi0JCQkJfHwgRmFjZXRDb3JlUGx1Z2luLlBMQU5fRkFDRVRfSUQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gY2FuTW9kaWZ5TW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG51bGwpOwotCQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8ICFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJcmV0dXJuIG5ldyBJTW9kdWxlWzBdOwotCQkJfQotCQkJcmV0dXJuIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfTsKLQkJfQotCQlyZXR1cm4gbmV3IElNb2R1bGVbMF07Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJTW9kdWxlW10gZ2V0Um9vdE1vZHVsZXMoSU1vZHVsZSBtb2R1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKEZhY2V0Q29yZVBsdWdpbi5XRUJfRkFDRVRfSUQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkKKyAgICAgICAgICAgIHx8IEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkKKyAgICAgICAgICAgIHx8IEZhY2V0Q29yZVBsdWdpbi5QQVJfRkFDRVRfSUQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkKKyAgICAgICAgICAgIHx8IEZhY2V0Q29yZVBsdWdpbi5QTEFOX0ZBQ0VUX0lELmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpKSB7CisgICAgICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IGNhbk1vZGlmeU1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LCBudWxsKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCB8fCAhc3RhdHVzLmlzT0soKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSU1vZHVsZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBJTW9kdWxlWzBdOworICAgIH0KIAotCXB1YmxpYyBWaXJnb1NlcnZlclJ1bnRpbWUgZ2V0UnVudGltZSgpIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgIHB1YmxpYyBWaXJnb1NlcnZlclJ1bnRpbWUgZ2V0UnVudGltZSgpIHsKKyAgICAgICAgaWYgKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JCXJldHVybiAoVmlyZ29TZXJ2ZXJSdW50aW1lKSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoVmlyZ29TZXJ2ZXJSdW50aW1lLmNsYXNzLCBudWxsKTsKLQl9CisgICAgICAgIHJldHVybiAoVmlyZ29TZXJ2ZXJSdW50aW1lKSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoVmlyZ29TZXJ2ZXJSdW50aW1lLmNsYXNzLCBudWxsKTsKKyAgICB9CiAKLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKSB7Ci0JCUlTZXJ2ZXJSdW50aW1lUHJvdmlkZXIgdHZoID0gZ2V0VmVyc2lvbkhhbmRsZXIoKTsKLQkJaWYgKHR2aCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHZoLmdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KHRoaXMuZ2V0U2VydmVyKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwdWJsaWMgSVBhdGggZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKSB7CisgICAgICAgIElTZXJ2ZXJSdW50aW1lUHJvdmlkZXIgdHZoID0gZ2V0VmVyc2lvbkhhbmRsZXIoKTsKKyAgICAgICAgaWYgKHR2aCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdHZoLmdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KHRoaXMuZ2V0U2VydmVyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXB1YmxpYyBJUGF0aCBnZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKSB7Ci0JCVN0cmluZyBkZXBsb3lEaXIgPSBnZXREZXBsb3lEaXJlY3RvcnkoKTsKLQkJSVBhdGggZGVwbG95UGF0aCA9IG5ldyBQYXRoKGRlcGxveURpcik7Ci0JCWlmICghZGVwbG95UGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCUlQYXRoIGJhc2UgPSBnZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCQkJZGVwbG95UGF0aCA9IGJhc2UuYXBwZW5kKGRlcGxveVBhdGgpOwotCQl9Ci0JCS8vIE1ha2Ugc3VyZSB0aGF0IHN0YWdlIGRpcmVjdG9yeSBpcyBhY2Nlc3NpYmxlIGFuZCB3ZSBjYW4gd3JpdGUgaW50bwotCQkvLyBpdDsgaWYgd2UgY2FuJ3QgdGhlIHN0YWdlIHdpbGwgYmUgaW4gdGhlCi0JCS8vIHBsdWdpbidzIHN0YXRlbG9jYXRpb24KLQkJRmlsZSBkZXBsb3lQYXRoRmlsZSA9IGRlcGxveVBhdGgudG9GaWxlKCk7Ci0JCWlmICghZGVwbG95UGF0aEZpbGUuZXhpc3RzKCkgJiYgIWRlcGxveVBhdGhGaWxlLmdldFBhcmVudEZpbGUoKS5jYW5Xcml0ZSgpKSB7Ci0JCQlkZXBsb3lQYXRoID0gU2VydmVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChkZXBsb3lEaXIpOwotCQl9IGVsc2UgaWYgKGRlcGxveVBhdGhGaWxlLmV4aXN0cygpICYmICFkZXBsb3lQYXRoRmlsZS5jYW5Xcml0ZSgpKSB7Ci0JCQlkZXBsb3lQYXRoID0gU2VydmVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChkZXBsb3lEaXIpOwotCQl9Ci0JCXJldHVybiBkZXBsb3lQYXRoOwotCX0KKyAgICBwdWJsaWMgSVBhdGggZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCkgeworICAgICAgICBTdHJpbmcgZGVwbG95RGlyID0gZ2V0RGVwbG95RGlyZWN0b3J5KCk7CisgICAgICAgIElQYXRoIGRlcGxveVBhdGggPSBuZXcgUGF0aChkZXBsb3lEaXIpOworICAgICAgICBpZiAoIWRlcGxveVBhdGguaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICBJUGF0aCBiYXNlID0gZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKKyAgICAgICAgICAgIGRlcGxveVBhdGggPSBiYXNlLmFwcGVuZChkZXBsb3lQYXRoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBzdGFnZSBkaXJlY3RvcnkgaXMgYWNjZXNzaWJsZSBhbmQgd2UgY2FuIHdyaXRlIGludG8KKyAgICAgICAgLy8gaXQ7IGlmIHdlIGNhbid0IHRoZSBzdGFnZSB3aWxsIGJlIGluIHRoZQorICAgICAgICAvLyBwbHVnaW4ncyBzdGF0ZWxvY2F0aW9uCisgICAgICAgIEZpbGUgZGVwbG95UGF0aEZpbGUgPSBkZXBsb3lQYXRoLnRvRmlsZSgpOworICAgICAgICBpZiAoIWRlcGxveVBhdGhGaWxlLmV4aXN0cygpICYmICFkZXBsb3lQYXRoRmlsZS5nZXRQYXJlbnRGaWxlKCkuY2FuV3JpdGUoKSkgeworICAgICAgICAgICAgZGVwbG95UGF0aCA9IFNlcnZlckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoZGVwbG95RGlyKTsKKyAgICAgICAgfSBlbHNlIGlmIChkZXBsb3lQYXRoRmlsZS5leGlzdHMoKSAmJiAhZGVwbG95UGF0aEZpbGUuY2FuV3JpdGUoKSkgeworICAgICAgICAgICAgZGVwbG95UGF0aCA9IFNlcnZlckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoZGVwbG95RGlyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVwbG95UGF0aDsKKyAgICB9CiAKLQlwdWJsaWMgSVNlcnZlclJ1bnRpbWVQcm92aWRlciBnZXRWZXJzaW9uSGFuZGxlcigpIHsKLQkJaWYgKHZlcnNpb25IYW5kbGVyID09IG51bGwpIHsKLQkJCWlmIChnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCB8fCBnZXRSdW50aW1lKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJdmVyc2lvbkhhbmRsZXIgPSBnZXRSdW50aW1lKCkuZ2V0VmlyZ29WZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb25IYW5kbGVyOwotCX0KKyAgICBwdWJsaWMgSVNlcnZlclJ1bnRpbWVQcm92aWRlciBnZXRWZXJzaW9uSGFuZGxlcigpIHsKKyAgICAgICAgaWYgKHRoaXMudmVyc2lvbkhhbmRsZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsIHx8IGdldFJ1bnRpbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnZlcnNpb25IYW5kbGVyID0gZ2V0UnVudGltZSgpLmdldFZpcmdvVmVyc2lvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnZlcnNpb25IYW5kbGVyOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEFkZCB0YXJnZXQgcnVudGltZSB0byBuZXcgcHJvamVjdHMgaW4gb3JkZXIgdG8gcmVmcmVzaCB0aGVpcgotCQkvLyBjbGFzc3BhdGggYmFzZWQgb24gdGhlCi0JCS8vIG1hbmlmZXN0Ci0JCWlmIChhZGQgIT0gbnVsbCAmJiBhZGQubGVuZ3RoID4gMCkgewotCQkJLy8gR2V0IHRoZSBmYWNldCBydW50aW1lIHdoaWNoIGlzICE9IHRoZSBzZXJ2ZXIgcnVudGltZQotCQkJSVJ1bnRpbWUgcnVudGltZSA9IFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWUoZ2V0UnVudGltZSgpLmdldFJ1bnRpbWUoKS5nZXROYW1lKCkpOwotCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkgewotCQkJCWZvciAoSU1vZHVsZSBhZGRlZE1vZHVsZSA6IGFkZCkgewotCQkJCQlJRmFjZXRlZFByb2plY3QgcHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShhZGRlZE1vZHVsZS5nZXRQcm9qZWN0KCksIGZhbHNlLCBtb25pdG9yKTsKLQkJCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJU2V0PElSdW50aW1lPiBydW50aW1lcyA9IG5ldyBIYXNoU2V0PElSdW50aW1lPihwcm9qZWN0LmdldFRhcmdldGVkUnVudGltZXMoKSk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbW9kaWZ5TW9kdWxlcyhJTW9kdWxlW10gYWRkLCBJTW9kdWxlW10gcmVtb3ZlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQWRkIHRhcmdldCBydW50aW1lIHRvIG5ldyBwcm9qZWN0cyBpbiBvcmRlciB0byByZWZyZXNoIHRoZWlyCisgICAgICAgIC8vIGNsYXNzcGF0aCBiYXNlZCBvbiB0aGUKKyAgICAgICAgLy8gbWFuaWZlc3QKKyAgICAgICAgaWYgKGFkZCAhPSBudWxsICYmIGFkZC5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAvLyBHZXQgdGhlIGZhY2V0IHJ1bnRpbWUgd2hpY2ggaXMgIT0gdGhlIHNlcnZlciBydW50aW1lCisgICAgICAgICAgICBJUnVudGltZSBydW50aW1lID0gUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZShnZXRSdW50aW1lKCkuZ2V0UnVudGltZSgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAocnVudGltZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChJTW9kdWxlIGFkZGVkTW9kdWxlIDogYWRkKSB7CisgICAgICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGFkZGVkTW9kdWxlLmdldFByb2plY3QoKSwgZmFsc2UsIG1vbml0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8SVJ1bnRpbWU+IHJ1bnRpbWVzID0gbmV3IEhhc2hTZXQ8SVJ1bnRpbWU+KHByb2plY3QuZ2V0VGFyZ2V0ZWRSdW50aW1lcygpKTsKIAotCQkJCQkJLy8gQWRkIHRoaXMgc2VydmVyJ3MgcnVudGltZSB0byB0aGUgdGFyZ2V0IHJ1bnRpbWUKLQkJCQkJCWlmICghcnVudGltZXMuY29udGFpbnMocnVudGltZSkpIHsKLQkJCQkJCQlydW50aW1lcy5hZGQocnVudGltZSk7Ci0JCQkJCQkJcHJvamVjdC5zZXRUYXJnZXRlZFJ1bnRpbWVzKHJ1bnRpbWVzLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQkJCQlpZiAocnVudGltZXMuc2l6ZSgpID4gMSkgewotCQkJCQkJCQlwcm9qZWN0LnNldFByaW1hcnlSdW50aW1lKHJ1bnRpbWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoaXMgc2VydmVyJ3MgcnVudGltZSB0byB0aGUgdGFyZ2V0IHJ1bnRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcnVudGltZXMuY29udGFpbnMocnVudGltZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lcy5hZGQocnVudGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXRUYXJnZXRlZFJ1bnRpbWVzKHJ1bnRpbWVzLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVudGltZXMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LnNldFByaW1hcnlSdW50aW1lKHJ1bnRpbWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vIFJlbW92ZSBhbmQgYWRkIHRoZSBtb2R1bGVzIHRvIHRoZSBvcmRlcmVkIGxpc3QKLQkJaWYgKHJlbW92ZSAhPSBudWxsICYmIHJlbW92ZS5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKElNb2R1bGUgbW9kdWxlIDogcmVtb3ZlKSB7Ci0JCQkJZ2V0Q29uZmlndXJhdGlvbigpLnJlbW92ZUFydGVmYWN0KG1vZHVsZS5nZXRJZCgpKTsKLQkJCX0KLQkJfQotCQlpZiAoYWRkICE9IG51bGwgJiYgYWRkLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBhZGQpIHsKLQkJCQlnZXRDb25maWd1cmF0aW9uKCkuYWRkQXJ0ZWZhY3QobW9kdWxlLmdldElkKCkpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICAvLyBSZW1vdmUgYW5kIGFkZCB0aGUgbW9kdWxlcyB0byB0aGUgb3JkZXJlZCBsaXN0CisgICAgICAgIGlmIChyZW1vdmUgIT0gbnVsbCAmJiByZW1vdmUubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZm9yIChJTW9kdWxlIG1vZHVsZSA6IHJlbW92ZSkgeworICAgICAgICAgICAgICAgIGdldENvbmZpZ3VyYXRpb24oKS5yZW1vdmVBcnRlZmFjdChtb2R1bGUuZ2V0SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFkZCAhPSBudWxsICYmIGFkZC5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKElNb2R1bGUgbW9kdWxlIDogYWRkKSB7CisgICAgICAgICAgICAgICAgZ2V0Q29uZmlndXJhdGlvbigpLmFkZEFydGVmYWN0KG1vZHVsZS5nZXRJZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb25DaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVDb25maWd1cmF0aW9uQ2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICB0aGlzLmxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNhdmVDb25maWd1cmF0aW9uKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2F2ZUNvbmZpZ3VyYXRpb24oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9BVVRPX1BVQkxJU0hfVElNRSwgMik7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworICAgICAgICBzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfQVVUT19QVUJMSVNIX1RJTUUsIDIpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHNldERlcGxveURpcmVjdG9yeShTdHJpbmcgZGVwbG95RGlyKSB7Ci0JCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9ERVBMT1lfRElSLCBkZXBsb3lEaXIpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBzZXREZXBsb3lEaXJlY3RvcnkoU3RyaW5nIGRlcGxveURpcikgeworICAgICAgICBzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfREVQTE9ZX0RJUiwgZGVwbG95RGlyKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzZXRNQmVhblNlcnZlclBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgewotCQlTdHJpbmcgb2xkUGFzc3dvcmQgPSBnZXRNQmVhblNlcnZlclBhc3N3b3JkKCk7Ci0JCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9NQkVBTl9TRVJWRVJfUEFTU1dPUkQsIHBhc3N3b3JkKTsKLQkJZmlyZUNvbmZpZ3VyYXRpb25DaGFuZ2VkKFBST1BFUlRZX01CRUFOX1NFUlZFUl9QQVNTV09SRCwgb2xkUGFzc3dvcmQsIHBhc3N3b3JkKTsKLQl9CisgICAgcHVibGljIHZvaWQgc2V0TUJlYW5TZXJ2ZXJQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgU3RyaW5nIG9sZFBhc3N3b3JkID0gZ2V0TUJlYW5TZXJ2ZXJQYXNzd29yZCgpOworICAgICAgICBzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfTUJFQU5fU0VSVkVSX1BBU1NXT1JELCBwYXNzd29yZCk7CisgICAgICAgIGZpcmVDb25maWd1cmF0aW9uQ2hhbmdlZChQUk9QRVJUWV9NQkVBTl9TRVJWRVJfUEFTU1dPUkQsIG9sZFBhc3N3b3JkLCBwYXNzd29yZCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgc2V0TUJlYW5TZXJ2ZXJQb3J0KGludCBwb3J0KSB7Ci0JCWludCBvbGRQb3J0ID0gZ2V0TUJlYW5TZXJ2ZXJQb3J0KCk7Ci0JCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9NQkVBTl9TRVJWRVJfUE9SVCwgcG9ydCk7Ci0JCWZpcmVDb25maWd1cmF0aW9uQ2hhbmdlZChQUk9QRVJUWV9NQkVBTl9TRVJWRVJfUE9SVCwgb2xkUG9ydCwgcG9ydCk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNldE1CZWFuU2VydmVyUG9ydChpbnQgcG9ydCkgeworICAgICAgICBpbnQgb2xkUG9ydCA9IGdldE1CZWFuU2VydmVyUG9ydCgpOworICAgICAgICBzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfTUJFQU5fU0VSVkVSX1BPUlQsIHBvcnQpOworICAgICAgICBmaXJlQ29uZmlndXJhdGlvbkNoYW5nZWQoUFJPUEVSVFlfTUJFQU5fU0VSVkVSX1BPUlQsIG9sZFBvcnQsIHBvcnQpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHNldERlcGxveVRpbWVvdXQoaW50IHRpbWVvdXQpIHsKLQkJaW50IG9sZFRpbWVvdXQgPSBnZXREZXBsb3lUaW1lb3V0KCk7Ci0JCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9ERVBMT1lfVElNRU9VVCwgdGltZW91dCk7Ci0JCWZpcmVDb25maWd1cmF0aW9uQ2hhbmdlZChQUk9QRVJUWV9ERVBMT1lfVElNRU9VVCwgb2xkVGltZW91dCwgdGltZW91dCk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNldERlcGxveVRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICAgICAgaW50IG9sZFRpbWVvdXQgPSBnZXREZXBsb3lUaW1lb3V0KCk7CisgICAgICAgIHNldEF0dHJpYnV0ZShQUk9QRVJUWV9ERVBMT1lfVElNRU9VVCwgdGltZW91dCk7CisgICAgICAgIGZpcmVDb25maWd1cmF0aW9uQ2hhbmdlZChQUk9QRVJUWV9ERVBMT1lfVElNRU9VVCwgb2xkVGltZW91dCwgdGltZW91dCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgc2V0TUJlYW5TZXJ2ZXJVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpIHsKLQkJU3RyaW5nIG9sZFBhc3N3b3JkID0gZ2V0TUJlYW5TZXJ2ZXJVc2VybmFtZSgpOwotCQlzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfTUJFQU5fU0VSVkVSX1VTRVJOQU1FLCB1c2VybmFtZSk7Ci0JCWZpcmVDb25maWd1cmF0aW9uQ2hhbmdlZChQUk9QRVJUWV9NQkVBTl9TRVJWRVJfVVNFUk5BTUUsIG9sZFBhc3N3b3JkLCB1c2VybmFtZSk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNldE1CZWFuU2VydmVyVXNlcm5hbWUoU3RyaW5nIHVzZXJuYW1lKSB7CisgICAgICAgIFN0cmluZyBvbGRQYXNzd29yZCA9IGdldE1CZWFuU2VydmVyVXNlcm5hbWUoKTsKKyAgICAgICAgc2V0QXR0cmlidXRlKFBST1BFUlRZX01CRUFOX1NFUlZFUl9VU0VSTkFNRSwgdXNlcm5hbWUpOworICAgICAgICBmaXJlQ29uZmlndXJhdGlvbkNoYW5nZWQoUFJPUEVSVFlfTUJFQU5fU0VSVkVSX1VTRVJOQU1FLCBvbGRQYXNzd29yZCwgdXNlcm5hbWUpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHNldE1heFBlcm1TaXplKFN0cmluZyBtYXhQZXJtU2l6ZSkgewotCQlTdHJpbmcgb2xkTWF4UGVybVNpemUgPSBnZXRNYXhQZXJtU2l6ZSgpOwotCQlzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfTUFYX1BFUk1fU0laRSwgbWF4UGVybVNpemUpOwotCQlmaXJlQ29uZmlndXJhdGlvbkNoYW5nZWQoUFJPUEVSVFlfTUFYX1BFUk1fU0laRSwgb2xkTWF4UGVybVNpemUsIG1heFBlcm1TaXplKTsKLQl9CisgICAgcHVibGljIHZvaWQgc2V0TWF4UGVybVNpemUoU3RyaW5nIG1heFBlcm1TaXplKSB7CisgICAgICAgIFN0cmluZyBvbGRNYXhQZXJtU2l6ZSA9IGdldE1heFBlcm1TaXplKCk7CisgICAgICAgIHNldEF0dHJpYnV0ZShQUk9QRVJUWV9NQVhfUEVSTV9TSVpFLCBtYXhQZXJtU2l6ZSk7CisgICAgICAgIGZpcmVDb25maWd1cmF0aW9uQ2hhbmdlZChQUk9QRVJUWV9NQVhfUEVSTV9TSVpFLCBvbGRNYXhQZXJtU2l6ZSwgbWF4UGVybVNpemUpOworICAgIH0KIAotCXB1YmxpYyBib29sZWFuIHNob3VsZFRhaWxUcmFjZUZpbGVzKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX1RBSUxfTE9HX0ZJTEVTLCBERUZBVUxUX1RBSUxfTE9HX0ZJTEVTKTsKLQl9CisgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkVGFpbFRyYWNlRmlsZXMoKSB7CisgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfVEFJTF9MT0dfRklMRVMsIERFRkFVTFRfVEFJTF9MT0dfRklMRVMpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHNob3VsZFRhaWxUcmFjZUZpbGVzKGJvb2xlYW4gc2hvdWxkVGFpbFRyYWNlRmlsZXMpIHsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHNob3VsZFRhaWxUcmFjZUZpbGVzKCk7Ci0JCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9UQUlMX0xPR19GSUxFUywgc2hvdWxkVGFpbFRyYWNlRmlsZXMpOwotCQlmaXJlQ29uZmlndXJhdGlvbkNoYW5nZWQoUFJPUEVSVFlfVEFJTF9MT0dfRklMRVMsIG9sZFZhbHVlLCBzaG91bGRUYWlsVHJhY2VGaWxlcyk7CisgICAgcHVibGljIHZvaWQgc2hvdWxkVGFpbFRyYWNlRmlsZXMoYm9vbGVhbiBzaG91bGRUYWlsVHJhY2VGaWxlcykgeworICAgICAgICBib29sZWFuIG9sZFZhbHVlID0gc2hvdWxkVGFpbFRyYWNlRmlsZXMoKTsKKyAgICAgICAgc2V0QXR0cmlidXRlKFBST1BFUlRZX1RBSUxfTE9HX0ZJTEVTLCBzaG91bGRUYWlsVHJhY2VGaWxlcyk7CisgICAgICAgIGZpcmVDb25maWd1cmF0aW9uQ2hhbmdlZChQUk9QRVJUWV9UQUlMX0xPR19GSUxFUywgb2xkVmFsdWUsIHNob3VsZFRhaWxUcmFjZUZpbGVzKTsKIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRDbGVhblN0YXJ0dXAoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfQ0xFQU5fU1RBUlRVUCwgREVGQVVMVF9DTEVBTl9TVEFSVFVQKTsKLQl9CisgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkQ2xlYW5TdGFydHVwKCkgeworICAgICAgICByZXR1cm4gZ2V0QXR0cmlidXRlKFBST1BFUlRZX0NMRUFOX1NUQVJUVVAsIERFRkFVTFRfQ0xFQU5fU1RBUlRVUCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgc2hvdWxkQ2xlYW5TdGFydHVwKGJvb2xlYW4gc2hvdWxkQ2xlYW5TdGFydHVwKSB7Ci0JCWJvb2xlYW4gb2xkVmFsdWUgPSBzaG91bGRDbGVhblN0YXJ0dXAoKTsKLQkJc2V0QXR0cmlidXRlKFBST1BFUlRZX0NMRUFOX1NUQVJUVVAsIHNob3VsZENsZWFuU3RhcnR1cCk7Ci0JCWZpcmVDb25maWd1cmF0aW9uQ2hhbmdlZChQUk9QRVJUWV9DTEVBTl9TVEFSVFVQLCBvbGRWYWx1ZSwgc2hvdWxkQ2xlYW5TdGFydHVwKTsKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRDbGVhblN0YXJ0dXAoYm9vbGVhbiBzaG91bGRDbGVhblN0YXJ0dXApIHsKKyAgICAgICAgYm9vbGVhbiBvbGRWYWx1ZSA9IHNob3VsZENsZWFuU3RhcnR1cCgpOworICAgICAgICBzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfQ0xFQU5fU1RBUlRVUCwgc2hvdWxkQ2xlYW5TdGFydHVwKTsKKyAgICAgICAgZmlyZUNvbmZpZ3VyYXRpb25DaGFuZ2VkKFBST1BFUlRZX0NMRUFOX1NUQVJUVVAsIG9sZFZhbHVlLCBzaG91bGRDbGVhblN0YXJ0dXApOwogCi0JfQorICAgIH0KIAotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QXJ0ZWZhY3RPcmRlcigpIHsKLQkJcmV0dXJuIGdldENvbmZpZ3VyYXRpb24oKS5nZXRBcnRlZmFjdE9yZGVyKCk7Ci0JfQorICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QXJ0ZWZhY3RPcmRlcigpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbmZpZ3VyYXRpb24oKS5nZXRBcnRlZmFjdE9yZGVyKCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgc2V0QXJ0ZWZhY3RPcmRlcihMaXN0PFN0cmluZz4gYXJ0ZWZhY3RPcmRlcikgewotCQlMaXN0PFN0cmluZz4gb2xkT3JkZXIgPSBnZXRBcnRlZmFjdE9yZGVyKCk7Ci0JCWdldENvbmZpZ3VyYXRpb24oKS5zZXRBcnRlZmFjdE9yZGVyKGFydGVmYWN0T3JkZXIpOwotCQlmaXJlQ29uZmlndXJhdGlvbkNoYW5nZWQoUFJPUEVSVFlfQVJURUZBQ1RfT1JERVIsIG9sZE9yZGVyLCBhcnRlZmFjdE9yZGVyKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRBcnRlZmFjdE9yZGVyKExpc3Q8U3RyaW5nPiBhcnRlZmFjdE9yZGVyKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBvbGRPcmRlciA9IGdldEFydGVmYWN0T3JkZXIoKTsKKyAgICAgICAgZ2V0Q29uZmlndXJhdGlvbigpLnNldEFydGVmYWN0T3JkZXIoYXJ0ZWZhY3RPcmRlcik7CisgICAgICAgIGZpcmVDb25maWd1cmF0aW9uQ2hhbmdlZChQUk9QRVJUWV9BUlRFRkFDVF9PUkRFUiwgb2xkT3JkZXIsIGFydGVmYWN0T3JkZXIpOwogCi0JfQorICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRTZXJ2ZXJOYW1lKCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXRTZXJ2ZXJOYW1lKCk7CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUNvbmZpZ3VyYXRpb25DaGFuZ2VkKFN0cmluZyBrZXksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBrZXksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCWZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIGZpcmVDb25maWd1cmF0aW9uQ2hhbmdlZChTdHJpbmcga2V5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywga2V5LCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworICAgICAgICBmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVycykgeworICAgICAgICAgICAgbGlzdGVuZXIucHJvcGVydHlDaGFuZ2UoZXZlbnQpOworICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIFN0cmluZyByZW5kZXJDb21tYW5kTGluZShTdHJpbmdbXSBjb21tYW5kTGluZSwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlpZiAoY29tbWFuZExpbmUgPT0gbnVsbCB8fCBjb21tYW5kTGluZS5sZW5ndGggPCAxKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoY29tbWFuZExpbmVbMF0pOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGNvbW1hbmRMaW5lLmxlbmd0aDsgaSsrKSB7Ci0JCQlidWYuYXBwZW5kKHNlcGFyYXRvcik7Ci0JCQlidWYuYXBwZW5kKGNvbW1hbmRMaW5lW2ldKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQorICAgIHByb3RlY3RlZCBTdHJpbmcgcmVuZGVyQ29tbWFuZExpbmUoU3RyaW5nW10gY29tbWFuZExpbmUsIFN0cmluZyBzZXBhcmF0b3IpIHsKKyAgICAgICAgaWYgKGNvbW1hbmRMaW5lID09IG51bGwgfHwgY29tbWFuZExpbmUubGVuZ3RoIDwgMSkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGNvbW1hbmRMaW5lWzBdKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjb21tYW5kTGluZS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYnVmLmFwcGVuZChzZXBhcmF0b3IpOworICAgICAgICAgICAgYnVmLmFwcGVuZChjb21tYW5kTGluZVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHNldFN0YXRpY0ZpbGVuYW1lUGF0dGVybnMoU3RyaW5nIGZpbGVuYW1lUGF0dGVybnMpIHsKLQkJU3RyaW5nIG9sZCA9IGdldFN0YXRpY0ZpbGVuYW1lUGF0dGVybnMoKTsKLQkJc2V0QXR0cmlidXRlKFBST1BFUlRZX1NUQVRJQ19GSUxFTkFNRVMsIGZpbGVuYW1lUGF0dGVybnMpOwotCQlmaXJlQ29uZmlndXJhdGlvbkNoYW5nZWQoUFJPUEVSVFlfU1RBVElDX0ZJTEVOQU1FUywgb2xkLCBmaWxlbmFtZVBhdHRlcm5zKTsKLQl9CisgICAgcHVibGljIHZvaWQgc2V0U3RhdGljRmlsZW5hbWVQYXR0ZXJucyhTdHJpbmcgZmlsZW5hbWVQYXR0ZXJucykgeworICAgICAgICBTdHJpbmcgb2xkID0gZ2V0U3RhdGljRmlsZW5hbWVQYXR0ZXJucygpOworICAgICAgICBzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfU1RBVElDX0ZJTEVOQU1FUywgZmlsZW5hbWVQYXR0ZXJucyk7CisgICAgICAgIGZpcmVDb25maWd1cmF0aW9uQ2hhbmdlZChQUk9QRVJUWV9TVEFUSUNfRklMRU5BTUVTLCBvbGQsIGZpbGVuYW1lUGF0dGVybnMpOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdGljRmlsZW5hbWVQYXR0ZXJucygpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QRVJUWV9TVEFUSUNfRklMRU5BTUVTLCBERUZBVUxUX1NUQVRJQ19GSUxFTkFNRVMpOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRpY0ZpbGVuYW1lUGF0dGVybnMoKSB7CisgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoUFJPUEVSVFlfU1RBVElDX0ZJTEVOQU1FUywgREVGQVVMVF9TVEFUSUNfRklMRU5BTUVTKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvU2VydmVyQmVoYXZpb3VyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlckJlaGF2aW91ci5qYXZhCmluZGV4IGEzZTc5NDQuLmU0NTYxYTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvU2VydmVyQmVoYXZpb3VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJCZWhhdmlvdXIuamF2YQpAQCAtOSw2ICs5LDcgQEAKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKiAgICAgU0FQIEFHIC0gbW92aW5nIHRvIEVjbGlwc2UgTGlicmEgcHJvamVjdCBhbmQgZW5oYW5jZW1lbnRzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtNjgsNTM1ICs2OSw1MjMgQEAKIAogLyoqCiAgKiBEZWZhdWx0IGRtIHNlcnZlciBiZWhhdmlvci4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBLYWxveWFuIFJhZXYKICAqIEBzaW5jZSAxLjAuMAogICovCiBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFNlcnZlckJlaGF2aW91ciBleHRlbmRzIFNlcnZlckJlaGF2aW91ckRlbGVnYXRlIGltcGxlbWVudHMgSVNlcnZlckJlaGF2aW91ciwgSU9TR2lGcmFtZXdvcmtBZG1pbiwKLQkJSU9TR2lGcmFtZXdvcmtDb25zb2xlIHsKK3B1YmxpYyBjbGFzcyBTZXJ2ZXJCZWhhdmlvdXIgZXh0ZW5kcyBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElTZXJ2ZXJCZWhhdmlvdXIsIElPU0dpRnJhbWV3b3JrQWRtaW4sIElPU0dpRnJhbWV3b3JrQ29uc29sZSB7CiAKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgV0VCX0NPTlRFWFRfUEFUSF9NQU5JRkVTVF9IRUFERVIgPSAiV2ViLUNvbnRleHRQYXRoIjsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgV0VCX0NPTlRFWFRfUEFUSF9NQU5JRkVTVF9IRUFERVIgPSAiV2ViLUNvbnRleHRQYXRoIjsKIAotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBEZXBsb3ltZW50SWRlbnRpdHk+IGRlcGxveW1lbnRJZGVudGl0aWVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgRGVwbG95bWVudElkZW50aXR5PigpOworICAgIHByb3RlY3RlZCBNYXA8U3RyaW5nLCBEZXBsb3ltZW50SWRlbnRpdHk+IGRlcGxveW1lbnRJZGVudGl0aWVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgRGVwbG95bWVudElkZW50aXR5PigpOwogCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBJTGF1bmNoIGxhdW5jaDsKKyAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IElMYXVuY2ggbGF1bmNoOwogCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBTZXJ2ZXJTdGF0dXNQaW5nVGhyZWFkIHBpbmdUaHJlYWQ7CisgICAgcHJvdGVjdGVkIHRyYW5zaWVudCBTZXJ2ZXJTdGF0dXNQaW5nVGhyZWFkIHBpbmdUaHJlYWQ7CiAKLQlwcm90ZWN0ZWQgdHJhbnNpZW50IElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIgcHJvY2Vzc0xpc3RlbmVyOworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgSURlYnVnRXZlbnRTZXRMaXN0ZW5lciBwcm9jZXNzTGlzdGVuZXI7CiAKLQlwcml2YXRlIHRyYW5zaWVudCBQcm9jZXNzQ29uc29sZSBwcm9jZXNzQ29uc29sZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBQcm9jZXNzQ29uc29sZSBwcm9jZXNzQ29uc29sZTsKIAotCXByaXZhdGUgdHJhbnNpZW50IElTZXJ2ZXJEZXBsb3llciBzZXJ2ZXJEZXBsb3llcjsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBJU2VydmVyRGVwbG95ZXIgc2VydmVyRGVwbG95ZXI7CiAKLQlwcml2YXRlIHRyYW5zaWVudCBMaXN0PFNlcnZlckxvZ1RhaWw+IHRyYWNlVGFpbEpvYnMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3Q8U2VydmVyTG9nVGFpbD4oKSk7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxTZXJ2ZXJMb2dUYWlsPiB0cmFjZVRhaWxKb2JzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0PFNlcnZlckxvZ1RhaWw+KCkpOwogCi0JcHJpdmF0ZSB0cmFuc2llbnQgTWFwPFN0cmluZywgTG9uZz4gdHJhY2VGaWxlU2l6ZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBMb25nPigpOworICAgIHByaXZhdGUgdHJhbnNpZW50IE1hcDxTdHJpbmcsIExvbmc+IHRyYWNlRmlsZVNpemVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgTG9uZz4oKTsKIAotCXB1YmxpYyBJU3RhdHVzIGNsZWFuU2VydmVyV29ya0RpcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHBhdGggPSBnZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKS50b1N0cmluZygpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJZmlsZS5kZWxldGUoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQorICAgIHB1YmxpYyBJU3RhdHVzIGNsZWFuU2VydmVyV29ya0RpcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBnZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKS50b1N0cmluZygpOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKKyAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisgICAgfQogCi0JcHVibGljIElQYXRoIGdldE1vZHVsZURlcGxveURpcmVjdG9yeShJTW9kdWxlIG1vZHVsZSkgewotCQlyZXR1cm4gU2VydmVyVXRpbHMuZ2V0U2VydmVyKHRoaXMpLmdldE1vZHVsZURlcGxveURpcmVjdG9yeShtb2R1bGUpOwotCX0KKyAgICBwdWJsaWMgSVBhdGggZ2V0TW9kdWxlRGVwbG95RGlyZWN0b3J5KElNb2R1bGUgbW9kdWxlKSB7CisgICAgICAgIHJldHVybiBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIodGhpcykuZ2V0TW9kdWxlRGVwbG95RGlyZWN0b3J5KG1vZHVsZSk7CisgICAgfQogCi0JcHVibGljIElQYXRoIGdldE1vZHVsZURlcGxveVVyaShJTW9kdWxlIG1vZHVsZSkgewotCQlyZXR1cm4gZ2V0TW9kdWxlRGVwbG95RGlyZWN0b3J5KG1vZHVsZSk7Ci0JfQorICAgIHB1YmxpYyBJUGF0aCBnZXRNb2R1bGVEZXBsb3lVcmkoSU1vZHVsZSBtb2R1bGUpIHsKKyAgICAgICAgcmV0dXJuIGdldE1vZHVsZURlcGxveURpcmVjdG9yeShtb2R1bGUpOworICAgIH0KIAotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIFNlcnZlclV0aWxzLmdldFNlcnZlcih0aGlzKS5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpOwotCX0KKyAgICBwdWJsaWMgSVBhdGggZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIodGhpcykuZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKTsKKyAgICB9CiAKLQlwdWJsaWMgSVBhdGggZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gU2VydmVyVXRpbHMuZ2V0U2VydmVyKHRoaXMpLmdldFNlcnZlckRlcGxveURpcmVjdG9yeSgpOwotCX0KKyAgICBwdWJsaWMgSVBhdGggZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gU2VydmVyVXRpbHMuZ2V0U2VydmVyKHRoaXMpLmdldFNlcnZlckRlcGxveURpcmVjdG9yeSgpOworICAgIH0KIAotCXB1YmxpYyBJU2VydmVyUnVudGltZVByb3ZpZGVyIGdldFZlcnNpb25IYW5kbGVyKCkgewotCQlyZXR1cm4gU2VydmVyVXRpbHMuZ2V0U2VydmVyKHRoaXMpLmdldFZlcnNpb25IYW5kbGVyKCk7Ci0JfQorICAgIHB1YmxpYyBJU2VydmVyUnVudGltZVByb3ZpZGVyIGdldFZlcnNpb25IYW5kbGVyKCkgeworICAgICAgICByZXR1cm4gU2VydmVyVXRpbHMuZ2V0U2VydmVyKHRoaXMpLmdldFZlcnNpb25IYW5kbGVyKCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaGFuZGxlUmVzb3VyY2VDaGFuZ2UoKSB7Ci0JCWlmIChnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSkgewotCQkJcmV0dXJuOwotCQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaGFuZGxlUmVzb3VyY2VDaGFuZ2UoKSB7CisgICAgICAgIGlmIChnZXRTZXJ2ZXIoKS5nZXRTZXJ2ZXJSZXN0YXJ0U3RhdGUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJSXRlcmF0b3I8SU1vZHVsZVtdPiBpdGVyYXRvciA9IGdldEFsbE1vZHVsZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJTW9kdWxlW10gbW9kdWxlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YSA9IGdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEobW9kdWxlKTsKLQkJCWlmIChkZWx0YSA9PSBudWxsIHx8IGRlbHRhLmxlbmd0aCA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIEl0ZXJhdG9yPElNb2R1bGVbXT4gaXRlcmF0b3IgPSBnZXRBbGxNb2R1bGVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgSU1vZHVsZVtdIG1vZHVsZSA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEgPSBnZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZSk7CisgICAgICAgICAgICBpZiAoZGVsdGEgPT0gbnVsbCB8fCBkZWx0YS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgb25Nb2R1bGVQdWJsaXNoU3RhdGVDaGFuZ2UoSU1vZHVsZVtdIG1vZHVsZSwgaW50IHN0YXRlKSB7Ci0JCXNldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUsIHN0YXRlKTsKLQl9CisgICAgcHVibGljIHZvaWQgb25Nb2R1bGVQdWJsaXNoU3RhdGVDaGFuZ2UoSU1vZHVsZVtdIG1vZHVsZSwgaW50IHN0YXRlKSB7CisgICAgICAgIHNldE1vZHVsZVB1Ymxpc2hTdGF0ZShtb2R1bGUsIHN0YXRlKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBvbk1vZHVsZVN0YXRlQ2hhbmdlKElNb2R1bGVbXSBtb2R1bGUsIGludCBzdGF0ZSkgewotCQlzZXRNb2R1bGVTdGF0ZShtb2R1bGUsIHN0YXRlKTsKLQl9CisgICAgcHVibGljIHZvaWQgb25Nb2R1bGVTdGF0ZUNoYW5nZShJTW9kdWxlW10gbW9kdWxlLCBpbnQgc3RhdGUpIHsKKyAgICAgICAgc2V0TW9kdWxlU3RhdGUobW9kdWxlLCBzdGF0ZSk7CisgICAgfQogCi0JcHVibGljIHZvaWQgc2V0dXBMYXVuY2goSUxhdW5jaCBsYXVuY2gsIFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJSdW50aW1lKHRoaXMpLnZhbGlkYXRlKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9CisgICAgcHVibGljIHZvaWQgc2V0dXBMYXVuY2goSUxhdW5jaCBsYXVuY2gsIFN0cmluZyBsYXVuY2hNb2RlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgSVN0YXR1cyBzdGF0dXMgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJSdW50aW1lKHRoaXMpLnZhbGlkYXRlKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOworICAgICAgICB9CiAKLQkJZ2V0VmVyc2lvbkhhbmRsZXIoKS5wcmVTdGFydHVwKHRoaXMpOworICAgICAgICBnZXRWZXJzaW9uSGFuZGxlcigpLnByZVN0YXJ0dXAodGhpcyk7CiAKLQkJc2V0U2VydmVyUmVzdGFydFN0YXRlKGZhbHNlKTsKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVElORyk7Ci0JCXNldE1vZGUobGF1bmNoTW9kZSk7Ci0JCXRoaXMubGF1bmNoID0gbGF1bmNoOwotCQl0aGlzLnBpbmdUaHJlYWQgPSBuZXcgU2VydmVyU3RhdHVzUGluZ1RocmVhZCh0aGlzKTsKLQl9CisgICAgICAgIHNldFNlcnZlclJlc3RhcnRTdGF0ZShmYWxzZSk7CisgICAgICAgIHNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RBUlRJTkcpOworICAgICAgICBzZXRNb2RlKGxhdW5jaE1vZGUpOworICAgICAgICB0aGlzLmxhdW5jaCA9IGxhdW5jaDsKKyAgICAgICAgdGhpcy5waW5nVGhyZWFkID0gbmV3IFNlcnZlclN0YXR1c1BpbmdUaHJlYWQodGhpcyk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0dXBMYXVuY2hDb25maWd1cmF0aW9uKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgd29ya2luZ0NvcHksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cExhdW5jaENvbmZpZ3VyYXRpb24oSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSB3b3JraW5nQ29weSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAKLQkJU3RyaW5nIGV4aXN0aW5nUHJvZ0FyZ3MgPSB3b3JraW5nQ29weS5nZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPR1JBTV9BUkdVTUVOVFMsCi0JCQkJKFN0cmluZykgbnVsbCk7Ci0JCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUywKLQkJCQlMYXVuY2hBcmd1bWVudFV0aWxzLm1lcmdlQXJndW1lbnRzKGV4aXN0aW5nUHJvZ0FyZ3MsIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKCksCi0JCQkJCQlnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKHRydWUpLCB0cnVlKSk7CisgICAgICAgIFN0cmluZyBleGlzdGluZ1Byb2dBcmdzID0gd29ya2luZ0NvcHkuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLCAoU3RyaW5nKSBudWxsKTsKKyAgICAgICAgd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLAorICAgICAgICAgICAgTGF1bmNoQXJndW1lbnRVdGlscy5tZXJnZUFyZ3VtZW50cyhleGlzdGluZ1Byb2dBcmdzLCBnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cygpLCBnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKHRydWUpLCB0cnVlKSk7CiAKLQkJU3RyaW5nIGV4aXN0aW5nVk1BcmdzID0gd29ya2luZ0NvcHkuZ2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywKLQkJCQkoU3RyaW5nKSBudWxsKTsKLQkJU3RyaW5nW10gY29uZmlnVk1BcmdzID0gZ2V0UnVudGltZVZNQXJndW1lbnRzKCk7CisgICAgICAgIFN0cmluZyBleGlzdGluZ1ZNQXJncyA9IHdvcmtpbmdDb3B5LmdldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9BUkdVTUVOVFMsIChTdHJpbmcpIG51bGwpOworICAgICAgICBTdHJpbmdbXSBjb25maWdWTUFyZ3MgPSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoKTsKIAotCQl3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fQVJHVU1FTlRTLAotCQkJCUxhdW5jaEFyZ3VtZW50VXRpbHMubWVyZ2VBcmd1bWVudHMoZXhpc3RpbmdWTUFyZ3MsIGNvbmZpZ1ZNQXJncywgbnVsbCwgZmFsc2UpKTsKKyAgICAgICAgd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1ZNX0FSR1VNRU5UUywKKyAgICAgICAgICAgIExhdW5jaEFyZ3VtZW50VXRpbHMubWVyZ2VBcmd1bWVudHMoZXhpc3RpbmdWTUFyZ3MsIGNvbmZpZ1ZNQXJncywgbnVsbCwgZmFsc2UpKTsKIAotCQlJU2VydmVyUnVudGltZSBydW50aW1lID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyUnVudGltZSh0aGlzKTsKLQkJSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBydW50aW1lLmdldFZNSW5zdGFsbCgpOwotCQlpZiAodm1JbnN0YWxsICE9IG51bGwpIHsKLQkJCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9KUkVfQ09OVEFJTkVSX1BBVEgsCi0JCQkJCUphdmFSdW50aW1lLm5ld0pSRUNvbnRhaW5lclBhdGgodm1JbnN0YWxsKS50b1BvcnRhYmxlU3RyaW5nKCkpOwotCQl9CisgICAgICAgIElTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJSdW50aW1lKHRoaXMpOworICAgICAgICBJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IHJ1bnRpbWUuZ2V0Vk1JbnN0YWxsKCk7CisgICAgICAgIGlmICh2bUluc3RhbGwgIT0gbnVsbCkgeworICAgICAgICAgICAgd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0pSRV9DT05UQUlORVJfUEFUSCwKKyAgICAgICAgICAgICAgICBKYXZhUnVudGltZS5uZXdKUkVDb250YWluZXJQYXRoKHZtSW5zdGFsbCkudG9Qb3J0YWJsZVN0cmluZygpKTsKKyAgICAgICAgfQogCi0JCXdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSwKLQkJCQlnZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpLnRvT1NTdHJpbmcoKSk7CisgICAgICAgIHdvcmtpbmdDb3B5LnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSwgZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKS50b09TU3RyaW5nKCkpOwogCi0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBvcmlnaW5hbENsYXNzcGF0aCA9IEphdmFSdW50aW1lLmNvbXB1dGVVbnJlc29sdmVkUnVudGltZUNsYXNzcGF0aCh3b3JraW5nQ29weSk7Ci0JCWludCBzaXplID0gb3JpZ2luYWxDbGFzc3BhdGgubGVuZ3RoOwotCQlMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+IG9sZENwID0gbmV3IEFycmF5TGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PihvcmlnaW5hbENsYXNzcGF0aC5sZW5ndGggKyAyKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCW9sZENwLmFkZChvcmlnaW5hbENsYXNzcGF0aFtpXSk7Ci0JCX0KKyAgICAgICAgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsQ2xhc3NwYXRoID0gSmF2YVJ1bnRpbWUuY29tcHV0ZVVucmVzb2x2ZWRSdW50aW1lQ2xhc3NwYXRoKHdvcmtpbmdDb3B5KTsKKyAgICAgICAgaW50IHNpemUgPSBvcmlnaW5hbENsYXNzcGF0aC5sZW5ndGg7CisgICAgICAgIExpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gb2xkQ3AgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+KG9yaWdpbmFsQ2xhc3NwYXRoLmxlbmd0aCArIDIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgb2xkQ3AuYWRkKG9yaWdpbmFsQ2xhc3NwYXRoW2ldKTsKKyAgICAgICAgfQogCi0JCUxpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gY3AyID0gcnVudGltZS5nZXRSdW50aW1lQ2xhc3NwYXRoKCk7Ci0JCUl0ZXJhdG9yPElSdW50aW1lQ2xhc3NwYXRoRW50cnk+IGl0ZXJhdG9yID0gY3AyLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlMYXVuY2hBcmd1bWVudFV0aWxzLm1lcmdlQ2xhc3NwYXRoKG9sZENwLCBlbnRyeSk7Ci0JCX0KKyAgICAgICAgTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBjcDIgPSBydW50aW1lLmdldFJ1bnRpbWVDbGFzc3BhdGgoKTsKKyAgICAgICAgSXRlcmF0b3I8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gaXRlcmF0b3IgPSBjcDIuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIExhdW5jaEFyZ3VtZW50VXRpbHMubWVyZ2VDbGFzc3BhdGgob2xkQ3AsIGVudHJ5KTsKKyAgICAgICAgfQogCi0JCWlmICh2bUluc3RhbGwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdHlwZUlkID0gdm1JbnN0YWxsLmdldFZNSW5zdGFsbFR5cGUoKS5nZXRJZCgpOwotCQkJCUxhdW5jaEFyZ3VtZW50VXRpbHMucmVwbGFjZUpSRUNvbnRhaW5lcihvbGRDcCwgSmF2YVJ1bnRpbWUubmV3UnVudGltZUNvbnRhaW5lckNsYXNzcGF0aEVudHJ5KG5ldyBQYXRoKAotCQkJCQkJSmF2YVJ1bnRpbWUuSlJFX0NPTlRBSU5FUikuYXBwZW5kKHR5cGVJZCkuYXBwZW5kKHZtSW5zdGFsbC5nZXROYW1lKCkpLAotCQkJCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5CT09UU1RSQVBfQ0xBU1NFUykpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KKyAgICAgICAgaWYgKHZtSW5zdGFsbCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlSWQgPSB2bUluc3RhbGwuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCk7CisgICAgICAgICAgICAgICAgTGF1bmNoQXJndW1lbnRVdGlscy5yZXBsYWNlSlJFQ29udGFpbmVyKG9sZENwLCBKYXZhUnVudGltZS5uZXdSdW50aW1lQ29udGFpbmVyQ2xhc3NwYXRoRW50cnkoCisgICAgICAgICAgICAgICAgICAgIG5ldyBQYXRoKEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIpLmFwcGVuZCh0eXBlSWQpLmFwcGVuZCh2bUluc3RhbGwuZ2V0TmFtZSgpKSwgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5CT09UU1RSQVBfQ0xBU1NFUykpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KIAotCQkJSVBhdGgganJlUGF0aCA9IG5ldyBQYXRoKHZtSW5zdGFsbC5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlpZiAoanJlUGF0aCAhPSBudWxsKSB7Ci0JCQkJSVBhdGggdG9vbHNQYXRoID0ganJlUGF0aC5hcHBlbmQoImxpYiIpLmFwcGVuZCgidG9vbHMuamFyIik7Ci0JCQkJaWYgKHRvb2xzUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IHRvb2xzSmFyID0gSmF2YVJ1bnRpbWUubmV3QXJjaGl2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSh0b29sc1BhdGgpOwotCQkJCQlpbnQgdG9vbHNJbmRleDsKLQkJCQkJZm9yICh0b29sc0luZGV4ID0gMDsgdG9vbHNJbmRleCA8IG9sZENwLnNpemUoKTsgdG9vbHNJbmRleCsrKSB7Ci0JCQkJCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gb2xkQ3AuZ2V0KHRvb2xzSW5kZXgpOwotCQkJCQkJaWYgKGVudHJ5LmdldFR5cGUoKSA9PSBJUnVudGltZUNsYXNzcGF0aEVudHJ5LkFSQ0hJVkUKLQkJCQkJCQkJJiYgZW50cnkuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCkuZXF1YWxzKCJ0b29scy5qYXIiKSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh0b29sc0luZGV4IDwgb2xkQ3Auc2l6ZSgpKSB7Ci0JCQkJCQlvbGRDcC5zZXQodG9vbHNJbmRleCwgdG9vbHNKYXIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJTGF1bmNoQXJndW1lbnRVdGlscy5tZXJnZUNsYXNzcGF0aChvbGRDcCwgdG9vbHNKYXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgICAgICBJUGF0aCBqcmVQYXRoID0gbmV3IFBhdGgodm1JbnN0YWxsLmdldEluc3RhbGxMb2NhdGlvbigpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIGlmIChqcmVQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJUGF0aCB0b29sc1BhdGggPSBqcmVQYXRoLmFwcGVuZCgibGliIikuYXBwZW5kKCJ0b29scy5qYXIiKTsKKyAgICAgICAgICAgICAgICBpZiAodG9vbHNQYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgIElSdW50aW1lQ2xhc3NwYXRoRW50cnkgdG9vbHNKYXIgPSBKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KHRvb2xzUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGludCB0b29sc0luZGV4OworICAgICAgICAgICAgICAgICAgICBmb3IgKHRvb2xzSW5kZXggPSAwOyB0b29sc0luZGV4IDwgb2xkQ3Auc2l6ZSgpOyB0b29sc0luZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBvbGRDcC5nZXQodG9vbHNJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0VHlwZSgpID09IElSdW50aW1lQ2xhc3NwYXRoRW50cnkuQVJDSElWRSAmJiBlbnRyeS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKS5lcXVhbHMoInRvb2xzLmphciIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvb2xzSW5kZXggPCBvbGRDcC5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZENwLnNldCh0b29sc0luZGV4LCB0b29sc0phcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMYXVuY2hBcmd1bWVudFV0aWxzLm1lcmdlQ2xhc3NwYXRoKG9sZENwLCB0b29sc0phcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpdGVyYXRvciA9IG9sZENwLml0ZXJhdG9yKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCWxpc3QuYWRkKGVudHJ5LmdldE1lbWVudG8oKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9CisgICAgICAgIGl0ZXJhdG9yID0gb2xkQ3AuaXRlcmF0b3IoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoZW50cnkuZ2V0TWVtZW50bygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQl3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1NQQVRILCBsaXN0KTsKLQkJd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0RFRkFVTFRfQ0xBU1NQQVRILCBmYWxzZSk7Ci0JfQorICAgICAgICB3b3JraW5nQ29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1NQQVRILCBsaXN0KTsKKyAgICAgICAgd29ya2luZ0NvcHkuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0RFRkFVTFRfQ0xBU1NQQVRILCBmYWxzZSk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlKSB7Ci0JCWlmIChmb3JjZSkgewotCQkJaW1tZWRpYXRlU2h1dGRvd24oKTsKLQkJfSBlbHNlIHsKLQkJCXNodXRkb3duKCk7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcChib29sZWFuIGZvcmNlKSB7CisgICAgICAgIGlmIChmb3JjZSkgeworICAgICAgICAgICAgaW1tZWRpYXRlU2h1dGRvd24oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNodXRkb3duKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzdG9wU2VydmVyKCkgeworICAgIHB1YmxpYyB2b2lkIHN0b3BTZXJ2ZXIoKSB7CiAKLQkJLy8gaWYgdGhlIHNlcnZlciBpcyBpbiBzdGFydGluZyBtb2RlIG1ha2Ugc3VyZSB0aGF0IHRoZSBzdGF0ZSB0cmFuc2l0aW9uCi0JCS8vIGlzIGFsbG93ZWQKLQkJaWYgKGdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCkgIT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7Ci0JCQlzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQSU5HKTsKLQkJfQorICAgICAgICAvLyBpZiB0aGUgc2VydmVyIGlzIGluIHN0YXJ0aW5nIG1vZGUgbWFrZSBzdXJlIHRoYXQgdGhlIHN0YXRlIHRyYW5zaXRpb24KKyAgICAgICAgLy8gaXMgYWxsb3dlZAorICAgICAgICBpZiAoZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKSAhPSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKKyAgICAgICAgICAgIHNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpOworICAgICAgICB9CiAKLQkJaWYgKHBpbmdUaHJlYWQgIT0gbnVsbCkgewotCQkJcGluZ1RocmVhZC5zdG9wKCk7Ci0JCQlwaW5nVGhyZWFkID0gbnVsbDsKLQkJfQotCQlpZiAocHJvY2Vzc0xpc3RlbmVyICE9IG51bGwpIHsKLQkJCURlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5yZW1vdmVEZWJ1Z0V2ZW50TGlzdGVuZXIocHJvY2Vzc0xpc3RlbmVyKTsKLQkJCXByb2Nlc3NMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQkJaWYgKHByb2Nlc3NDb25zb2xlICE9IG51bGwgJiYgdHJhY2VUYWlsSm9icy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKFNlcnZlckxvZ1RhaWwgam9iIDogdHJhY2VUYWlsSm9icykgewotCQkJCWpvYi5zdG9wVGFpbGluZygpOwotCQkJfQotCQkJdHJhY2VUYWlsSm9icy5jbGVhcigpOwotCQkJdHJhY2VGaWxlU2l6ZXMuY2xlYXIoKTsKLQkJCXByb2Nlc3NDb25zb2xlID0gbnVsbDsKLQkJfQorICAgICAgICBpZiAodGhpcy5waW5nVGhyZWFkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucGluZ1RocmVhZC5zdG9wKCk7CisgICAgICAgICAgICB0aGlzLnBpbmdUaHJlYWQgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnByb2Nlc3NMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHRoaXMucHJvY2Vzc0xpc3RlbmVyKTsKKyAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5wcm9jZXNzQ29uc29sZSAhPSBudWxsICYmIHRoaXMudHJhY2VUYWlsSm9icy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKFNlcnZlckxvZ1RhaWwgam9iIDogdGhpcy50cmFjZVRhaWxKb2JzKSB7CisgICAgICAgICAgICAgICAgam9iLnN0b3BUYWlsaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnRyYWNlVGFpbEpvYnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHRoaXMudHJhY2VGaWxlU2l6ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbnNvbGUgPSBudWxsOworICAgICAgICB9CiAKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVE9QUEVEKTsKLQl9CisgICAgICAgIHNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBFRCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdGFpbChEZXBsb3ltZW50SWRlbnRpdHkgaWRlbnRpdHkpIHsKLQkJLy8gYWRkIHNldHRpbmcgdG8gZW5hYmxlL2Rpc2FibGUgdGFpbGluZwotCQlpZiAocHJvY2Vzc0NvbnNvbGUgIT0gbnVsbCAmJiBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIodGhpcykuc2hvdWxkVGFpbFRyYWNlRmlsZXMoKSAmJiBpZGVudGl0eSAhPSBudWxsCi0JCQkJJiYgaWRlbnRpdHkuZ2V0U3ltYm9saWNOYW1lKCkgIT0gbnVsbCAmJiBpZGVudGl0eS5nZXRWZXJzaW9uKCkgIT0gbnVsbCkgewotCQkJU2VydmVyTG9nVGFpbCB0YWlsID0gbmV3IFNlcnZlckxvZ1RhaWwodGhpcywgaWRlbnRpdHksIHByb2Nlc3NDb25zb2xlKTsKLQkJCXRhaWwuc2V0U3lzdGVtKHRydWUpOwotCQkJdGFpbC5zY2hlZHVsZSgpOwotCQkJdHJhY2VUYWlsSm9icy5hZGQodGFpbCk7Ci0JCX0KLQl9CisgICAgcHVibGljIHZvaWQgdGFpbChEZXBsb3ltZW50SWRlbnRpdHkgaWRlbnRpdHkpIHsKKyAgICAgICAgLy8gYWRkIHNldHRpbmcgdG8gZW5hYmxlL2Rpc2FibGUgdGFpbGluZworICAgICAgICBpZiAodGhpcy5wcm9jZXNzQ29uc29sZSAhPSBudWxsICYmIFNlcnZlclV0aWxzLmdldFNlcnZlcih0aGlzKS5zaG91bGRUYWlsVHJhY2VGaWxlcygpICYmIGlkZW50aXR5ICE9IG51bGwKKyAgICAgICAgICAgICYmIGlkZW50aXR5LmdldFN5bWJvbGljTmFtZSgpICE9IG51bGwgJiYgaWRlbnRpdHkuZ2V0VmVyc2lvbigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFNlcnZlckxvZ1RhaWwgdGFpbCA9IG5ldyBTZXJ2ZXJMb2dUYWlsKHRoaXMsIGlkZW50aXR5LCB0aGlzLnByb2Nlc3NDb25zb2xlKTsKKyAgICAgICAgICAgIHRhaWwuc2V0U3lzdGVtKHRydWUpOworICAgICAgICAgICAgdGFpbC5zY2hlZHVsZSgpOworICAgICAgICAgICAgdGhpcy50cmFjZVRhaWxKb2JzLmFkZCh0YWlsKTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiZG0gU2VydmVyIjsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJkbSBTZXJ2ZXIiOworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIGFkZFByb2Nlc3NMaXN0ZW5lcihmaW5hbCBJUHJvY2VzcyBuZXdQcm9jZXNzKSB7Ci0JCWlmIChwcm9jZXNzTGlzdGVuZXIgIT0gbnVsbCB8fCBuZXdQcm9jZXNzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQorICAgIHByb3RlY3RlZCB2b2lkIGFkZFByb2Nlc3NMaXN0ZW5lcihmaW5hbCBJUHJvY2VzcyBuZXdQcm9jZXNzKSB7CisgICAgICAgIGlmICh0aGlzLnByb2Nlc3NMaXN0ZW5lciAhPSBudWxsIHx8IG5ld1Byb2Nlc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJcHJvY2Vzc0xpc3RlbmVyID0gbmV3IElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10gZXZlbnRzKSB7Ci0JCQkJaWYgKGV2ZW50cyAhPSBudWxsKSB7Ci0JCQkJCWludCBzaXplID0gZXZlbnRzLmxlbmd0aDsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJCWlmIChuZXdQcm9jZXNzICE9IG51bGwgJiYgbmV3UHJvY2Vzcy5lcXVhbHMoZXZlbnRzW2ldLmdldFNvdXJjZSgpKQotCQkJCQkJCQkmJiBldmVudHNbaV0uZ2V0S2luZCgpID09IERlYnVnRXZlbnQuVEVSTUlOQVRFKSB7Ci0JCQkJCQkJc3RvcFNlcnZlcigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYWRkRGVidWdFdmVudExpc3RlbmVyKHByb2Nlc3NMaXN0ZW5lcik7CisgICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVyID0gbmV3IElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIoKSB7CiAKLQkJZm9yIChJQ29uc29sZSBjb25zb2xlIDogQ29uc29sZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29uc29sZU1hbmFnZXIoKS5nZXRDb25zb2xlcygpKSB7Ci0JCQlpZiAoY29uc29sZSBpbnN0YW5jZW9mIFByb2Nlc3NDb25zb2xlICYmIG5ld1Byb2Nlc3MuZXF1YWxzKCgoUHJvY2Vzc0NvbnNvbGUpIGNvbnNvbGUpLmdldFByb2Nlc3MoKSkpIHsKLQkJCQl0aGlzLnByb2Nlc3NDb25zb2xlID0gKFByb2Nlc3NDb25zb2xlKSBjb25zb2xlOwotCQkJfQotCQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10gZXZlbnRzKSB7CisgICAgICAgICAgICAgICAgaWYgKGV2ZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gZXZlbnRzLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdQcm9jZXNzICE9IG51bGwgJiYgbmV3UHJvY2Vzcy5lcXVhbHMoZXZlbnRzW2ldLmdldFNvdXJjZSgpKSAmJiBldmVudHNbaV0uZ2V0S2luZCgpID09IERlYnVnRXZlbnQuVEVSTUlOQVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFNlcnZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuYWRkRGVidWdFdmVudExpc3RlbmVyKHRoaXMucHJvY2Vzc0xpc3RlbmVyKTsKIAotCQlGaWxlIHRyYWNlRGlyZWN0b3J5ID0gbmV3IEZpbGUoZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKS50b09TU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArICJzZXJ2aWNlYWJpbGl0eSIKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgInRyYWNlIik7Ci0JCWlmICh0cmFjZURpcmVjdG9yeS5leGlzdHMoKSkgewotCQkJZm9yIChGaWxlIGFwcGxpY2F0aW9uVHJhY2VEaXJlY3RvcnkgOiB0cmFjZURpcmVjdG9yeS5saXN0RmlsZXMoKSkgewotCQkJCWlmIChhcHBsaWNhdGlvblRyYWNlRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJRmlsZSB0cmFjZUZpbGUgPSBuZXcgRmlsZShhcHBsaWNhdGlvblRyYWNlRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkrICJ0cmFjZS5sb2ciKTsKLQkJCQkJaWYgKHRyYWNlRmlsZS5leGlzdHMoKSkgewotCQkJCQkJdHJhY2VGaWxlU2l6ZXMucHV0KHRyYWNlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdHJhY2VGaWxlLmxlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICBmb3IgKElDb25zb2xlIGNvbnNvbGUgOiBDb25zb2xlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb25zb2xlTWFuYWdlcigpLmdldENvbnNvbGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChjb25zb2xlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbnNvbGUgJiYgbmV3UHJvY2Vzcy5lcXVhbHMoKChQcm9jZXNzQ29uc29sZSkgY29uc29sZSkuZ2V0UHJvY2VzcygpKSkgeworICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbnNvbGUgPSAoUHJvY2Vzc0NvbnNvbGUpIGNvbnNvbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGaWxlIHRyYWNlRGlyZWN0b3J5ID0gbmV3IEZpbGUoZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKS50b09TU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArICJzZXJ2aWNlYWJpbGl0eSIgKyBGaWxlLnNlcGFyYXRvciArICJ0cmFjZSIpOworICAgICAgICBpZiAodHJhY2VEaXJlY3RvcnkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGZvciAoRmlsZSBhcHBsaWNhdGlvblRyYWNlRGlyZWN0b3J5IDogdHJhY2VEaXJlY3RvcnkubGlzdEZpbGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXBwbGljYXRpb25UcmFjZURpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgdHJhY2VGaWxlID0gbmV3IEZpbGUoYXBwbGljYXRpb25UcmFjZURpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgInRyYWNlLmxvZyIpOworICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYWNlRmlsZVNpemVzLnB1dCh0cmFjZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRyYWNlRmlsZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgVVJMIGdldE1vZHVsZVJvb3RVUkwoSU1vZHVsZSBtb2R1bGUpIHsKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrIHByZSBjb25kaXRpb247IG9ubHkgZHluYW1pYyB3ZWIgcHJvamVjdHMgYW5kIGphdmEgcHJvamVjdHMKLQkJCS8vIGFyZSBhbGxvd2VkCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gbW9kdWxlLmdldFByb2plY3QoKTsKLQkJCWlmICghRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuaGFzUHJvamVjdEZhY2V0KHByb2plY3QsIEZhY2V0Q29yZVBsdWdpbi5XRUJfRkFDRVRfSUQpCi0JCQkJCXx8ICFGYWNldFV0aWxzLmhhc1Byb2plY3RGYWNldChwcm9qZWN0LCBKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9CisgICAgcHVibGljIFVSTCBnZXRNb2R1bGVSb290VVJMKElNb2R1bGUgbW9kdWxlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBjaGVjayBwcmUgY29uZGl0aW9uOyBvbmx5IGR5bmFtaWMgd2ViIHByb2plY3RzIGFuZCBqYXZhIHByb2plY3RzCisgICAgICAgICAgICAvLyBhcmUgYWxsb3dlZAorICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IG1vZHVsZS5nZXRQcm9qZWN0KCk7CisgICAgICAgICAgICBpZiAoIUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldChwcm9qZWN0LCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKQorICAgICAgICAgICAgICAgIHx8ICFGYWNldFV0aWxzLmhhc1Byb2plY3RGYWNldChwcm9qZWN0LCBKYXZhQ29yZS5OQVRVUkVfSUQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CiAKLQkJCVN0cmluZyBjb250ZXh0UGF0aCA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dFBhdGggPSBudWxsOwogCi0JCQlCdW5kbGVNYW5pZmVzdCBidW5kbGVNYW5pZmVzdCA9IEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5nZXRCdW5kbGVNYW5pZmVzdE1hbmFnZXIoKS5nZXRCdW5kbGVNYW5pZmVzdCgKLQkJCQkJSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKLQkJCWlmIChidW5kbGVNYW5pZmVzdCAhPSBudWxsKSB7Ci0JCQkJRGljdGlvbmFyeTxTdHJpbmcsIFN0cmluZz4gbWFuaWZlc3QgPSBidW5kbGVNYW5pZmVzdC50b0RpY3Rpb25hcnkoKTsKLQkJCQlpZiAobWFuaWZlc3QgIT0gbnVsbCAmJiBtYW5pZmVzdC5nZXQoV0VCX0NPTlRFWFRfUEFUSF9NQU5JRkVTVF9IRUFERVIpICE9IG51bGwpIHsKLQkJCQkJY29udGV4dFBhdGggPSBtYW5pZmVzdC5nZXQoV0VCX0NPTlRFWFRfUEFUSF9NQU5JRkVTVF9IRUFERVIpOwotCQkJCX0KKyAgICAgICAgICAgIEJ1bmRsZU1hbmlmZXN0IGJ1bmRsZU1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLmdldEJ1bmRsZU1hbmlmZXN0TWFuYWdlcigpLmdldEJ1bmRsZU1hbmlmZXN0KEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7CisgICAgICAgICAgICBpZiAoYnVuZGxlTWFuaWZlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8U3RyaW5nLCBTdHJpbmc+IG1hbmlmZXN0ID0gYnVuZGxlTWFuaWZlc3QudG9EaWN0aW9uYXJ5KCk7CisgICAgICAgICAgICAgICAgaWYgKG1hbmlmZXN0ICE9IG51bGwgJiYgbWFuaWZlc3QuZ2V0KFdFQl9DT05URVhUX1BBVEhfTUFOSUZFU1RfSEVBREVSKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRQYXRoID0gbWFuaWZlc3QuZ2V0KFdFQl9DT05URVhUX1BBVEhfTUFOSUZFU1RfSEVBREVSKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCX0KLQkJCWlmIChjb250ZXh0UGF0aCA9PSBudWxsKSB7Ci0JCQkJY29udGV4dFBhdGggPSBtb2R1bGUuZ2V0TmFtZSgpOwotCQkJfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbnRleHRQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0UGF0aCA9IG1vZHVsZS5nZXROYW1lKCk7CisgICAgICAgICAgICB9CiAKLQkJCS8vIFRPRE86IENEIG1ha2UgcG9ydCBjb25maWd1cmFibGUKLQkJCWludCBwb3J0ID0gODA4MDsKLQkJCVN0cmluZ0J1aWxkZXIgdXJsQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQl1cmxCdWlsZGVyLmFwcGVuZCgiaHR0cDovL2xvY2FsaG9zdDoiKTsKLQkJCXVybEJ1aWxkZXIuYXBwZW5kKHBvcnQpOwotCQkJdXJsQnVpbGRlci5hcHBlbmQoIi8iKTsKLQkJCXVybEJ1aWxkZXIuYXBwZW5kKGNvbnRleHRQYXRoKTsKKyAgICAgICAgICAgIC8vIFRPRE86IENEIG1ha2UgcG9ydCBjb25maWd1cmFibGUKKyAgICAgICAgICAgIGludCBwb3J0ID0gODA4MDsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdXJsQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZCgiaHR0cDovL2xvY2FsaG9zdDoiKTsKKyAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kKHBvcnQpOworICAgICAgICAgICAgdXJsQnVpbGRlci5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIHVybEJ1aWxkZXIuYXBwZW5kKGNvbnRleHRQYXRoKTsKIAotCQkJU3RyaW5nIHVybCA9IHVybEJ1aWxkZXIudG9TdHJpbmcoKTsKLQkJCWlmICghdXJsLmVuZHNXaXRoKCIvIikpIHsKLQkJCQl1cmxCdWlsZGVyLmFwcGVuZCgiLyIpOwotCQkJfQorICAgICAgICAgICAgU3RyaW5nIHVybCA9IHVybEJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmICghdXJsLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICB1cmxCdWlsZGVyLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQogCi0JCQlyZXR1cm4gbmV3IFVSTCh1cmxCdWlsZGVyLnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9CisgICAgICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmxCdWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgTWFwPFN0cmluZywgRGVwbG95bWVudElkZW50aXR5PiBnZXREZXBsb3ltZW50SWRlbnRpdGllcygpIHsKLQkJcmV0dXJuIHRoaXMuZGVwbG95bWVudElkZW50aXRpZXM7Ci0JfQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBEZXBsb3ltZW50SWRlbnRpdHk+IGdldERlcGxveW1lbnRJZGVudGl0aWVzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5kZXBsb3ltZW50SWRlbnRpdGllczsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuIHN0YXJ0aW5nKSB7Ci0JCXJldHVybiBnZXRWZXJzaW9uSGFuZGxlcigpLmdldEV4Y2x1ZGVkUnVudGltZVByb2dyYW1Bcmd1bWVudHMoc3RhcnRpbmcpOwotCX0KKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuIHN0YXJ0aW5nKSB7CisgICAgICAgIHJldHVybiBnZXRWZXJzaW9uSGFuZGxlcigpLmdldEV4Y2x1ZGVkUnVudGltZVByb2dyYW1Bcmd1bWVudHMoc3RhcnRpbmcpOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VEZWx0YVtdIGdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEoSU1vZHVsZVtdIG1vZHVsZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShtb2R1bGUpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBnZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKElNb2R1bGVbXSBtb2R1bGUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEobW9kdWxlKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gZ2V0UmVzb3VyY2VzKElNb2R1bGVbXSBtb2R1bGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlcyhtb2R1bGUpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gZ2V0UmVzb3VyY2VzKElNb2R1bGVbXSBtb2R1bGUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJlc291cmNlcyhtb2R1bGUpOworICAgIH0KIAotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cygpIHsKLQkJcmV0dXJuIGdldFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHModGhpcyk7Ci0JfQorICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGdldFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHModGhpcyk7CisgICAgfQogCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFJ1bnRpbWVWTUFyZ3VtZW50cygpIHsKLQkJSVBhdGggaW5zdGFsbFBhdGggPSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKTsKLQkJSVBhdGggY29uZmlnUGF0aCA9IGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KCk7Ci0JCUlQYXRoIGRlcGxveVBhdGggPSBnZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKTsKLQkJcmV0dXJuIGdldFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZVZNQXJndW1lbnRzKHRoaXMsIGluc3RhbGxQYXRoLCBjb25maWdQYXRoLCBkZXBsb3lQYXRoKTsKLQl9CisgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFJ1bnRpbWVWTUFyZ3VtZW50cygpIHsKKyAgICAgICAgSVBhdGggaW5zdGFsbFBhdGggPSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKTsKKyAgICAgICAgSVBhdGggY29uZmlnUGF0aCA9IGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KCk7CisgICAgICAgIElQYXRoIGRlcGxveVBhdGggPSBnZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKTsKKyAgICAgICAgcmV0dXJuIGdldFZlcnNpb25IYW5kbGVyKCkuZ2V0UnVudGltZVZNQXJndW1lbnRzKHRoaXMsIGluc3RhbGxQYXRoLCBjb25maWdQYXRoLCBkZXBsb3lQYXRoKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBpbW1lZGlhdGVTaHV0ZG93bigpIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7Ci0JCQlyZXR1cm47Ci0JCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbW1lZGlhdGVTaHV0ZG93bigpIHsKKyAgICAgICAgaWYgKGdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVE9QUEVEKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVE9QUElORyk7Ci0JCQkvLyBSZXZpc2Ugb25jZSBvbiBXVFAgMwotCQkJLy8gSUxhdW5jaCBsYXVuY2ggPSBnZXRTZXJ2ZXIoKS5nZXRMYXVuY2goKTsKLQkJCWlmIChsYXVuY2ggIT0gbnVsbCkgewotCQkJCWxhdW5jaC50ZXJtaW5hdGUoKTsKLQkJCQlzdG9wU2VydmVyKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQSU5HKTsKKyAgICAgICAgICAgIC8vIFJldmlzZSBvbmNlIG9uIFdUUCAzCisgICAgICAgICAgICAvLyBJTGF1bmNoIGxhdW5jaCA9IGdldFNlcnZlcigpLmdldExhdW5jaCgpOworICAgICAgICAgICAgaWYgKHRoaXMubGF1bmNoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmxhdW5jaC50ZXJtaW5hdGUoKTsKKyAgICAgICAgICAgICAgICBzdG9wU2VydmVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoU2VydmVyKGludCBraW5kLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0U2VydmVyUHVibGlzaFN0YXRlKElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgcHVibGlzaFNlcnZlcihpbnQga2luZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNldFNlcnZlclB1Ymxpc2hTdGF0ZShJU2VydmVyLlBVQkxJU0hfU1RBVEVfTk9ORSk7CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VydmVyU3RhcnRlZCgpIHsKLQkJLy8gRGVwbG95IG1vZHVsZXMKLQkJc2VydmVyRGVwbG95ZXIuZGVwbG95KGdldFNlcnZlcigpLmdldE1vZHVsZXMoKSk7CisgICAgcHJvdGVjdGVkIHZvaWQgc2V0U2VydmVyU3RhcnRlZCgpIHsKKyAgICAgICAgLy8gRGVwbG95IG1vZHVsZXMKKyAgICAgICAgdGhpcy5zZXJ2ZXJEZXBsb3llci5kZXBsb3koZ2V0U2VydmVyKCkuZ2V0TW9kdWxlcygpKTsKIAotCQkvLyBTZXQgc2VydmVyIHN0YXJ0ZWQKLQkJc2V0U2VydmVyU3RhdGUoSVNlcnZlci5TVEFURV9TVEFSVEVEKTsKLQl9CisgICAgICAgIC8vIFNldCBzZXJ2ZXIgc3RhcnRlZAorICAgICAgICBzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUQVJURUQpOworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIHNodXRkb3duKCkgewotCQlpZiAoZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKLQkJCXJldHVybjsKLQkJfQorICAgIHByb3RlY3RlZCB2b2lkIHNodXRkb3duKCkgeworICAgICAgICBpZiAoZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUT1BQRUQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0JCXNldFNlcnZlclN0YXRlKElTZXJ2ZXIuU1RBVEVfU1RPUFBJTkcpOwotCQkvLyBSZXZpc2Ugb25jZSBvbiBXVFAgMwotCQkvLyBJTGF1bmNoIGxhdW5jaCA9IGdldFNlcnZlcigpLmdldExhdW5jaCgpOwotCQlpZiAobGF1bmNoICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0U2VydmVyRGVwbG95ZXIoKS5zaHV0ZG93bigpOwotCQkJfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaW1tZWRpYXRlU2h1dGRvd24oKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpbW1lZGlhdGVTaHV0ZG93bigpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBzZXRTZXJ2ZXJTdGF0ZShJU2VydmVyLlNUQVRFX1NUT1BQSU5HKTsKKyAgICAgICAgLy8gUmV2aXNlIG9uY2Ugb24gV1RQIDMKKyAgICAgICAgLy8gSUxhdW5jaCBsYXVuY2ggPSBnZXRTZXJ2ZXIoKS5nZXRMYXVuY2goKTsKKyAgICAgICAgaWYgKHRoaXMubGF1bmNoICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZ2V0U2VydmVyRGVwbG95ZXIoKS5zaHV0ZG93bigpOworICAgICAgICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaW1tZWRpYXRlU2h1dGRvd24oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpbW1lZGlhdGVTaHV0ZG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHN5bmNocm9uaXplZCBJU2VydmVyRGVwbG95ZXIgZ2V0U2VydmVyRGVwbG95ZXIoKSB7Ci0JCWlmIChzZXJ2ZXJEZXBsb3llciA9PSBudWxsKSB7Ci0JCQl0aGlzLnNlcnZlckRlcGxveWVyID0gbmV3IERlZmF1bHRTZXJ2ZXJEZXBsb3llcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zZXJ2ZXJEZXBsb3llcjsKLQl9CisgICAgcHVibGljIHN5bmNocm9uaXplZCBJU2VydmVyRGVwbG95ZXIgZ2V0U2VydmVyRGVwbG95ZXIoKSB7CisgICAgICAgIGlmICh0aGlzLnNlcnZlckRlcGxveWVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyRGVwbG95ZXIgPSBuZXcgRGVmYXVsdFNlcnZlckRlcGxveWVyKHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnNlcnZlckRlcGxveWVyOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0TUJlYW5TZXJ2ZXJJcCgpIHsKLQkJcmV0dXJuIGxhdW5jaC5nZXRBdHRyaWJ1dGUoUFJPUEVSVFlfTUJFQU5fU0VSVkVSX0lQKTsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRNQmVhblNlcnZlcklwKCkgeworICAgICAgICByZXR1cm4gdGhpcy5sYXVuY2guZ2V0QXR0cmlidXRlKFBST1BFUlRZX01CRUFOX1NFUlZFUl9JUCk7CisgICAgfQogCi0JY2xhc3MgU2VydmVyTG9nVGFpbCBleHRlbmRzIEpvYiB7CisgICAgY2xhc3MgU2VydmVyTG9nVGFpbCBleHRlbmRzIEpvYiB7CiAKLQkJcHJpdmF0ZSBmaW5hbCBJT0NvbnNvbGVPdXRwdXRTdHJlYW0gc3RyZWFtOworICAgICAgICBwcml2YXRlIGZpbmFsIElPQ29uc29sZU91dHB1dFN0cmVhbSBzdHJlYW07CiAKLQkJcHVibGljIFNlcnZlckxvZ1RhaWwoU2VydmVyQmVoYXZpb3VyIHNlcnZlciwgRGVwbG95bWVudElkZW50aXR5IGlkZW50aXR5LCBQcm9jZXNzQ29uc29sZSBjb25zb2xlKSB7Ci0JCQlzdXBlcihzZXJ2ZXIuZ2V0U2VydmVyKCkuZ2V0TmFtZSgpKTsKLQkJCXRoaXMubG9nZmlsZSA9IG5ldyBGaWxlKHNlcnZlci5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpLnRvT1NTdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgInNlcnZpY2VhYmlsaXR5IgotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgInRyYWNlIiArIEZpbGUuc2VwYXJhdG9yICsgaWRlbnRpdHkuZ2V0U3ltYm9saWNOYW1lKCkgKyAiLSIKLQkJCQkJKyBpZGVudGl0eS5nZXRWZXJzaW9uKCkgKyBGaWxlLnNlcGFyYXRvciArICJ0cmFjZS5sb2ciKTsKLQkJCXRoaXMuc3RyZWFtID0gY29uc29sZS5uZXdPdXRwdXRTdHJlYW0oKTsKLQkJCUxvbmcgZmlsZVNpemUgPSB0cmFjZUZpbGVTaXplcy5nZXQobG9nZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlpZiAoZmlsZVNpemUgIT0gbnVsbCkgewotCQkJCWZpbGVQb2ludGVyID0gZmlsZVNpemU7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIFNlcnZlckxvZ1RhaWwoU2VydmVyQmVoYXZpb3VyIHNlcnZlciwgRGVwbG95bWVudElkZW50aXR5IGlkZW50aXR5LCBQcm9jZXNzQ29uc29sZSBjb25zb2xlKSB7CisgICAgICAgICAgICBzdXBlcihzZXJ2ZXIuZ2V0U2VydmVyKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHRoaXMubG9nZmlsZSA9IG5ldyBGaWxlKHNlcnZlci5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpLnRvT1NTdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgInNlcnZpY2VhYmlsaXR5IiArIEZpbGUuc2VwYXJhdG9yICsgInRyYWNlIgorICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyBpZGVudGl0eS5nZXRTeW1ib2xpY05hbWUoKSArICItIiArIGlkZW50aXR5LmdldFZlcnNpb24oKSArIEZpbGUuc2VwYXJhdG9yICsgInRyYWNlLmxvZyIpOworICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBjb25zb2xlLm5ld091dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgTG9uZyBmaWxlU2l6ZSA9IFNlcnZlckJlaGF2aW91ci50aGlzLnRyYWNlRmlsZVNpemVzLmdldCh0aGlzLmxvZ2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgaWYgKGZpbGVTaXplICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZpbGVQb2ludGVyID0gZmlsZVNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKiogSG93IGZyZXF1ZW50bHkgdG8gY2hlY2sgZm9yIGZpbGUgY2hhbmdlczsgZGVmYXVsdHMgdG8gNSBzZWNvbmRzICovCi0JCXByaXZhdGUgZmluYWwgbG9uZyBzYW1wbGVJbnRlcnZhbCA9IDEwMDA7CisgICAgICAgIC8qKiBIb3cgZnJlcXVlbnRseSB0byBjaGVjayBmb3IgZmlsZSBjaGFuZ2VzOyBkZWZhdWx0cyB0byA1IHNlY29uZHMgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHNhbXBsZUludGVydmFsID0gMTAwMDsKIAotCQkvKiogVGhlIGxvZyBmaWxlIHRvIHRhaWwgKi8KLQkJcHJpdmF0ZSBmaW5hbCBGaWxlIGxvZ2ZpbGU7CisgICAgICAgIC8qKiBUaGUgbG9nIGZpbGUgdG8gdGFpbCAqLworICAgICAgICBwcml2YXRlIGZpbmFsIEZpbGUgbG9nZmlsZTsKIAotCQkvKiogSXMgdGhlIHRhaWxlciBjdXJyZW50bHkgdGFpbGluZz8gKi8KLQkJcHJpdmF0ZSBib29sZWFuIHRhaWxpbmcgPSBmYWxzZTsKKyAgICAgICAgLyoqIElzIHRoZSB0YWlsZXIgY3VycmVudGx5IHRhaWxpbmc/ICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB0YWlsaW5nID0gZmFsc2U7CiAKLQkJLyoqIFRoZSBmaWxlIHBvaW50ZXIga2VlcHMgdHJhY2sgb2Ygd2hlcmUgd2UgYXJlIGluIHRoZSBmaWxlICovCi0JCXByaXZhdGUgbG9uZyBmaWxlUG9pbnRlciA9IDA7CisgICAgICAgIC8qKiBUaGUgZmlsZSBwb2ludGVyIGtlZXBzIHRyYWNrIG9mIHdoZXJlIHdlIGFyZSBpbiB0aGUgZmlsZSAqLworICAgICAgICBwcml2YXRlIGxvbmcgZmlsZVBvaW50ZXIgPSAwOwogCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAKLQkJCXRoaXMudGFpbGluZyA9IHRydWU7Ci0JCQl3aGlsZSAodGhpcy50YWlsaW5nICYmICFsb2dmaWxlLmV4aXN0cygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKHNhbXBsZUludGVydmFsKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgdGhpcy50YWlsaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHdoaWxlICh0aGlzLnRhaWxpbmcgJiYgIXRoaXMubG9nZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCh0aGlzLnNhbXBsZUludGVydmFsKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQl0cnkgewotCQkJCS8vIFN0YXJ0IHRhaWxpbmcKLQkJCQlSYW5kb21BY2Nlc3NGaWxlIGZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShsb2dmaWxlLCAiciIpOwotCQkJCXdoaWxlICh0aGlzLnRhaWxpbmcpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIENvbXBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSB0byB0aGUgZmlsZSBwb2ludGVyCi0JCQkJCQlsb25nIGZpbGVMZW5ndGggPSB0aGlzLmxvZ2ZpbGUubGVuZ3RoKCk7Ci0JCQkJCQlpZiAoZmlsZUxlbmd0aCA8IGZpbGVQb2ludGVyKSB7Ci0JCQkJCQkJLy8gTG9nIGZpbGUgbXVzdCBoYXZlIGJlZW4gcm90YXRlZCBvciBkZWxldGVkOwotCQkJCQkJCS8vIHJlb3BlbiB0aGUgZmlsZSBhbmQgcmVzZXQgdGhlIGZpbGUgcG9pbnRlcgotCQkJCQkJCWZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShsb2dmaWxlLCAiciIpOwotCQkJCQkJCWZpbGVQb2ludGVyID0gMDsKLQkJCQkJCX0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gU3RhcnQgdGFpbGluZworICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgZmlsZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHRoaXMubG9nZmlsZSwgInIiKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy50YWlsaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb21wYXJlIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUgdG8gdGhlIGZpbGUgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBmaWxlTGVuZ3RoID0gdGhpcy5sb2dmaWxlLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVMZW5ndGggPCB0aGlzLmZpbGVQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9nIGZpbGUgbXVzdCBoYXZlIGJlZW4gcm90YXRlZCBvciBkZWxldGVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlb3BlbiB0aGUgZmlsZSBhbmQgcmVzZXQgdGhlIGZpbGUgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZSh0aGlzLmxvZ2ZpbGUsICJyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlUG9pbnRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJCWlmIChmaWxlTGVuZ3RoID4gZmlsZVBvaW50ZXIpIHsKLQkJCQkJCQkvLyBUaGVyZSBpcyBkYXRhIHRvIHJlYWQKLQkJCQkJCQlmaWxlLnNlZWsoZmlsZVBvaW50ZXIpOwotCQkJCQkJCWJ5dGVbXSBsaW5lID0gbmV3IGJ5dGVbMTAyNF07Ci0JCQkJCQkJaW50IGxlbmd0aCA9IGZpbGUucmVhZChsaW5lKTsKLQkJCQkJCQl3aGlsZSAobGVuZ3RoID4gMCkgewotCQkJCQkJCQlzdHJlYW0ud3JpdGUobGluZSwgMCwgbGVuZ3RoKTsKLQkJCQkJCQkJbGluZSA9IG5ldyBieXRlWzEwMjRdOwotCQkJCQkJCQlsZW5ndGggPSBmaWxlLnJlYWQobGluZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbGVQb2ludGVyID0gZmlsZS5nZXRGaWxlUG9pbnRlcigpOwotCQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVMZW5ndGggPiB0aGlzLmZpbGVQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgZGF0YSB0byByZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5zZWVrKHRoaXMuZmlsZVBvaW50ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBsaW5lID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IGZpbGUucmVhZChsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbS53cml0ZShsaW5lLCAwLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGZpbGUucmVhZChsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlUG9pbnRlciA9IGZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJCQkJLy8gU2xlZXAgZm9yIHRoZSBzcGVjaWZpZWQgaW50ZXJ2YWwKLQkJCQkJCVRocmVhZC5zbGVlcCh0aGlzLnNhbXBsZUludGVydmFsKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNsZWVwIGZvciB0aGUgc3BlY2lmaWVkIGludGVydmFsCisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAodGhpcy5zYW1wbGVJbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAKLQkJCQkvLyBDbG9zZSB0aGUgZmlsZSB0aGF0IHdlIGFyZSB0YWlsaW5nCi0JCQkJZmlsZS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZmlsZSB0aGF0IHdlIGFyZSB0YWlsaW5nCisgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAotCQkJfQorICAgICAgICAgICAgfQogCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQorICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBzdG9wVGFpbGluZygpIHsKLQkJCXRoaXMudGFpbGluZyA9IGZhbHNlOwotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgdm9pZCBzdG9wVGFpbGluZygpIHsKKyAgICAgICAgICAgIHRoaXMudGFpbGluZyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIE1hcDxMb25nLCBJQnVuZGxlPiBnZXRCdW5kbGVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyQnVuZGxlQWRtaW5Db21tYW5kKHRoaXMpLmV4ZWN1dGUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLQl9CisgICAgcHVibGljIE1hcDxMb25nLCBJQnVuZGxlPiBnZXRCdW5kbGVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyQnVuZGxlQWRtaW5Db21tYW5kKHRoaXMpLmV4ZWN1dGUoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzdGFydEJ1bmRsZShsb25nIGJ1bmRsZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWV4ZWN1dGVDb21tYW5kKCJzdGFydCAiICsgYnVuZGxlSWQpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBzdGFydEJ1bmRsZShsb25nIGJ1bmRsZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVDb21tYW5kKCJzdGFydCAiICsgYnVuZGxlSWQpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHN0b3BCdW5kbGUobG9uZyBidW5kbGVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlleGVjdXRlQ29tbWFuZCgic3RvcCAiICsgYnVuZGxlSWQpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBzdG9wQnVuZGxlKGxvbmcgYnVuZGxlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZUNvbW1hbmQoInN0b3AgIiArIGJ1bmRsZUlkKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCByZWZyZXNoQnVuZGxlKGxvbmcgYnVuZGxlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZXhlY3V0ZUNvbW1hbmQoInJlZnJlc2ggIiArIGJ1bmRsZUlkKTsKLQl9CisgICAgcHVibGljIHZvaWQgcmVmcmVzaEJ1bmRsZShsb25nIGJ1bmRsZUlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dGVDb21tYW5kKCJyZWZyZXNoICIgKyBidW5kbGVJZCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgdXBkYXRlQnVuZGxlKGxvbmcgYnVuZGxlSWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZXhlY3V0ZUNvbW1hbmQoInVwZGF0ZSAiICsgYnVuZGxlSWQpOwotCX0KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVCdW5kbGUobG9uZyBidW5kbGVJZCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBleGVjdXRlQ29tbWFuZCgidXBkYXRlICIgKyBidW5kbGVJZCk7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyQnVuZGxlQWRtaW5FeGVjdXRlQ29tbWFuZCh0aGlzLCBjb21tYW5kKS5leGVjdXRlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuICI8ZXJyb3I+IjsKLQl9CisgICAgcHVibGljIFN0cmluZyBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyQnVuZGxlQWRtaW5FeGVjdXRlQ29tbWFuZCh0aGlzLCBjb21tYW5kKS5leGVjdXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICI8ZXJyb3I+IjsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvU2VydmVyQ29uZmlndXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJDb25maWd1cmF0aW9uLmphdmEKaW5kZXggOGQ1ODE1MS4uNGVhNzYzOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJDb25maWd1cmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJDb25maWd1cmF0aW9uLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTI4LDc5ICsyOSw4MSBAQAogLyoqCiAgKiBEZWZhdWx0IHtAbGluayBJU2VydmVyQ29uZmlndXJhdGlvbn0gaW1wbGVtZW50YXRpb24uCiAgKiA8cD4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJDb25maWd1cmF0aW9uIGltcGxlbWVudHMgSVNlcnZlckNvbmZpZ3VyYXRpb24gewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVEVGQUNUX09SREVSX0ZJTEVfTkFNRSA9ICJhcnRlZmFjdC1vcmRlci5jb25maWciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRFRkFDVF9PUkRFUl9GSUxFX05BTUUgPSAiYXJ0ZWZhY3Qtb3JkZXIuY29uZmlnIjsKIAotCXByaXZhdGUgSUZvbGRlciBjb25maWd1cmF0aW9uRm9sZGVyID0gbnVsbDsKKyAgICBwcml2YXRlIElGb2xkZXIgY29uZmlndXJhdGlvbkZvbGRlciA9IG51bGw7CiAKLQlwdWJsaWMgU2VydmVyQ29uZmlndXJhdGlvbihJRm9sZGVyIHNlcnZlckNvbmZpZ3VyYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNvbmZpZ3VyYXRpb25Gb2xkZXIgPSBzZXJ2ZXJDb25maWd1cmF0aW9uOwotCX0KKyAgICBwdWJsaWMgU2VydmVyQ29uZmlndXJhdGlvbihJRm9sZGVyIHNlcnZlckNvbmZpZ3VyYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbkZvbGRlciA9IHNlcnZlckNvbmZpZ3VyYXRpb247CisgICAgfQogCi0JcHVibGljIHZvaWQgYWRkQXJ0ZWZhY3QoU3RyaW5nIGFydGVmYWN0KSB7Ci0JCUxpc3Q8U3RyaW5nPiBhcnRlZmFjdHMgPSBnZXRBcnRlZmFjdE9yZGVyKCk7Ci0JCWlmICghYXJ0ZWZhY3RzLmNvbnRhaW5zKGFydGVmYWN0KSkgewotCQkJYXJ0ZWZhY3RzLmFkZChhcnRlZmFjdCk7Ci0JCQlzYXZlQXJ0ZWZhY3RPcmRlckZpbGUoYXJ0ZWZhY3RzKTsKLQkJfQotCX0KKyAgICBwdWJsaWMgdm9pZCBhZGRBcnRlZmFjdChTdHJpbmcgYXJ0ZWZhY3QpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGFydGVmYWN0cyA9IGdldEFydGVmYWN0T3JkZXIoKTsKKyAgICAgICAgaWYgKCFhcnRlZmFjdHMuY29udGFpbnMoYXJ0ZWZhY3QpKSB7CisgICAgICAgICAgICBhcnRlZmFjdHMuYWRkKGFydGVmYWN0KTsKKyAgICAgICAgICAgIHNhdmVBcnRlZmFjdE9yZGVyRmlsZShhcnRlZmFjdHMpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBcnRlZmFjdE9yZGVyKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gYXJ0ZWZhY3RzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUlGaWxlIGZpbGUgPSBjb25maWd1cmF0aW9uRm9sZGVyLmdldEZpbGUoQVJURUZBQ1RfT1JERVJfRklMRV9OQU1FKTsKLQkJRmlsZSBjb25maWd1cmF0aW9uRmlsZSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLQkJaWYgKGNvbmZpZ3VyYXRpb25GaWxlLmV4aXN0cygpKSB7Ci0JCQluZXcgSlNPTkZpbGVQYXJzZXIoY29uZmlndXJhdGlvbkZpbGUpIHsKLQkJCQlwdWJsaWMgdm9pZCBwYXJzZShKU09OT2JqZWN0IG9iamVjdCkgdGhyb3dzIEpTT05FeGNlcHRpb24gewotCQkJCQluZXcgSlNPTkNoaWxkUGFyc2VyKG9iamVjdCwgImFydGVmYWN0cyIpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHBhcnNlKEpTT05PYmplY3Qgb2JqZWN0KSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7Ci0JCQkJCQkJYXJ0ZWZhY3RzLmFkZChvYmplY3QuZ2V0U3RyaW5nKCJpZCIpKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhcnRlZmFjdHM7Ci0JfQorICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QXJ0ZWZhY3RPcmRlcigpIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGFydGVmYWN0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBJRmlsZSBmaWxlID0gdGhpcy5jb25maWd1cmF0aW9uRm9sZGVyLmdldEZpbGUoQVJURUZBQ1RfT1JERVJfRklMRV9OQU1FKTsKKyAgICAgICAgRmlsZSBjb25maWd1cmF0aW9uRmlsZSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKKyAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb25GaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBuZXcgSlNPTkZpbGVQYXJzZXIoY29uZmlndXJhdGlvbkZpbGUpIHsKIAotCXB1YmxpYyB2b2lkIHNldEFydGVmYWN0T3JkZXIoTGlzdDxTdHJpbmc+IGFydGVmYWN0cykgewotCQlzYXZlQXJ0ZWZhY3RPcmRlckZpbGUoYXJ0ZWZhY3RzKTsKLQl9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoSlNPTk9iamVjdCBvYmplY3QpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IEpTT05DaGlsZFBhcnNlcihvYmplY3QsICJhcnRlZmFjdHMiKSB7CiAKLQlwdWJsaWMgdm9pZCByZW1vdmVBcnRlZmFjdChTdHJpbmcgYXJ0ZWZhY3QpIHsKLQkJTGlzdDxTdHJpbmc+IGFydGVmYWN0cyA9IGdldEFydGVmYWN0T3JkZXIoKTsKLQkJaWYgKGFydGVmYWN0cy5jb250YWlucyhhcnRlZmFjdCkpIHsKLQkJCWFydGVmYWN0cy5yZW1vdmUoYXJ0ZWZhY3QpOwotCQkJc2F2ZUFydGVmYWN0T3JkZXJGaWxlKGFydGVmYWN0cyk7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJzZShKU09OT2JqZWN0IG9iamVjdCkgdGhyb3dzIEpTT05FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGVmYWN0cy5hZGQob2JqZWN0LmdldFN0cmluZygiaWQiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJ0ZWZhY3RzOworICAgIH0KIAotCXByaXZhdGUgdm9pZCBzYXZlQXJ0ZWZhY3RPcmRlckZpbGUoTGlzdDxTdHJpbmc+IGFydGVmYWN0cykgewotCQlJRmlsZSBmaWxlID0gY29uZmlndXJhdGlvbkZvbGRlci5nZXRGaWxlKEFSVEVGQUNUX09SREVSX0ZJTEVfTkFNRSk7Ci0JCXRyeSB7Ci0JCQlKU09OT2JqZWN0IGFydGVmYWN0Tm9kZXMgPSBuZXcgSlNPTk9iamVjdCgpOwotCQkJZm9yIChTdHJpbmcgYXJ0ZWZhY3QgOiBhcnRlZmFjdHMpIHsKLQkJCQlKU09OT2JqZWN0IGFydGVmYWN0Tm9kZSA9IG5ldyBKU09OT2JqZWN0KCk7Ci0JCQkJYXJ0ZWZhY3ROb2RlLnB1dCgiaWQiLCBhcnRlZmFjdCk7Ci0JCQkJYXJ0ZWZhY3ROb2Rlcy5hY2N1bXVsYXRlKCJhcnRlZmFjdHMiLCBhcnRlZmFjdE5vZGUpOwotCQkJfQotCQkJRmlsZVdyaXRlciBmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKTsKLQkJCVN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQlhcnRlZmFjdE5vZGVzLndyaXRlKHN0cmluZ1dyaXRlcik7Ci0JCQlTdHJpbmcganNvblN0cmluZyA9IHN0cmluZ1dyaXRlci50b1N0cmluZygpOwotCQkJanNvblN0cmluZyA9IGpzb25TdHJpbmcucmVwbGFjZUFsbCgiLCIsICIsXG4iKTsKLQkJCWZpbGVXcml0ZXIud3JpdGUoanNvblN0cmluZyk7Ci0JCQlmaWxlV3JpdGVyLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNldEFydGVmYWN0T3JkZXIoTGlzdDxTdHJpbmc+IGFydGVmYWN0cykgeworICAgICAgICBzYXZlQXJ0ZWZhY3RPcmRlckZpbGUoYXJ0ZWZhY3RzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBcnRlZmFjdChTdHJpbmcgYXJ0ZWZhY3QpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGFydGVmYWN0cyA9IGdldEFydGVmYWN0T3JkZXIoKTsKKyAgICAgICAgaWYgKGFydGVmYWN0cy5jb250YWlucyhhcnRlZmFjdCkpIHsKKyAgICAgICAgICAgIGFydGVmYWN0cy5yZW1vdmUoYXJ0ZWZhY3QpOworICAgICAgICAgICAgc2F2ZUFydGVmYWN0T3JkZXJGaWxlKGFydGVmYWN0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2F2ZUFydGVmYWN0T3JkZXJGaWxlKExpc3Q8U3RyaW5nPiBhcnRlZmFjdHMpIHsKKyAgICAgICAgSUZpbGUgZmlsZSA9IHRoaXMuY29uZmlndXJhdGlvbkZvbGRlci5nZXRGaWxlKEFSVEVGQUNUX09SREVSX0ZJTEVfTkFNRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKU09OT2JqZWN0IGFydGVmYWN0Tm9kZXMgPSBuZXcgSlNPTk9iamVjdCgpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgYXJ0ZWZhY3QgOiBhcnRlZmFjdHMpIHsKKyAgICAgICAgICAgICAgICBKU09OT2JqZWN0IGFydGVmYWN0Tm9kZSA9IG5ldyBKU09OT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgYXJ0ZWZhY3ROb2RlLnB1dCgiaWQiLCBhcnRlZmFjdCk7CisgICAgICAgICAgICAgICAgYXJ0ZWZhY3ROb2Rlcy5hY2N1bXVsYXRlKCJhcnRlZmFjdHMiLCBhcnRlZmFjdE5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZVdyaXRlciBmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKTsKKyAgICAgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgICAgICBhcnRlZmFjdE5vZGVzLndyaXRlKHN0cmluZ1dyaXRlcik7CisgICAgICAgICAgICBTdHJpbmcganNvblN0cmluZyA9IHN0cmluZ1dyaXRlci50b1N0cmluZygpOworICAgICAgICAgICAganNvblN0cmluZyA9IGpzb25TdHJpbmcucmVwbGFjZUFsbCgiLCIsICIsXG4iKTsKKyAgICAgICAgICAgIGZpbGVXcml0ZXIud3JpdGUoanNvblN0cmluZyk7CisgICAgICAgICAgICBmaWxlV3JpdGVyLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUuamF2YQppbmRleCAzOGZhYjlhLi41OWZmYjIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlckxhdW5jaENvbmZpZ3VyYXRpb25EZWxlZ2F0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvbkRlbGVnYXRlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTM1LDEwNyArMzYsMTA2IEBACiAKIC8qKgogICoge0BsaW5rIElMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGV9IGZvciB0aGUgZG0gc2VydmVyLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjAKICAqLwogQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKIHB1YmxpYyBjbGFzcyBTZXJ2ZXJMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBYnN0cmFjdEphdmFMYXVuY2hDb25maWd1cmF0aW9uRGVsZWdhdGUgewogCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgbGF1bmNoKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIFN0cmluZyBtb2RlLCBJTGF1bmNoIGxhdW5jaCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU2VydmVyIHNlcnZlciA9IFNlcnZlclV0aWwuZ2V0U2VydmVyKGNvbmZpZ3VyYXRpb24pOwotCQlpZiAoc2VydmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIGxhdW5jaChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgbW9kZSwgSUxhdW5jaCBsYXVuY2gsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBJU2VydmVyIHNlcnZlciA9IFNlcnZlclV0aWwuZ2V0U2VydmVyKGNvbmZpZ3VyYXRpb24pOworICAgICAgICBpZiAoc2VydmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0JCUlQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNSk7Ci0JCWNoZWNrQ2FuY2VsbGVkKHN1Yk1vbml0b3IpOwotCQlzdWJNb25pdG9yLmJlZ2luVGFzaygiU3RhcnRpbmcgU3ByaW5nU291cmNlIGRtIFNlcnZlciBpbnN0YW5jZSIsIDUpOworICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDUpOworICAgICAgICBjaGVja0NhbmNlbGxlZChzdWJNb25pdG9yKTsKKyAgICAgICAgc3ViTW9uaXRvci5iZWdpblRhc2soIlN0YXJ0aW5nIFNwcmluZ1NvdXJjZSBkbSBTZXJ2ZXIgaW5zdGFuY2UiLCA1KTsKIAotCQlpZiAoc2VydmVyLnNob3VsZFB1Ymxpc2goKSAmJiBTZXJ2ZXJQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpLmlzQXV0b1B1Ymxpc2hpbmcoKSkgewotCQkJc3ViTW9uaXRvci5zdWJUYXNrKCJQdWJsaXNoaW5nIHRvIHN0YWdpbmcgZGlyZWN0b3J5Li4uIik7Ci0JCQlzZXJ2ZXIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG1vbml0b3IpOwotCQl9Ci0JCXN1Yk1vbml0b3Iud29ya2VkKDEpOwotCQljaGVja0NhbmNlbGxlZChzdWJNb25pdG9yKTsKLQkJc3ViTW9uaXRvci5zdWJUYXNrKCJDb25maWd1cmluZyBsYXVuY2ggcGFyYW1ldGVycy4uLiIpOworICAgICAgICBpZiAoc2VydmVyLnNob3VsZFB1Ymxpc2goKSAmJiBTZXJ2ZXJQcmVmZXJlbmNlcy5nZXRJbnN0YW5jZSgpLmlzQXV0b1B1Ymxpc2hpbmcoKSkgeworICAgICAgICAgICAgc3ViTW9uaXRvci5zdWJUYXNrKCJQdWJsaXNoaW5nIHRvIHN0YWdpbmcgZGlyZWN0b3J5Li4uIik7CisgICAgICAgICAgICBzZXJ2ZXIucHVibGlzaChJU2VydmVyLlBVQkxJU0hfSU5DUkVNRU5UQUwsIG1vbml0b3IpOworICAgICAgICB9CisgICAgICAgIHN1Yk1vbml0b3Iud29ya2VkKDEpOworICAgICAgICBjaGVja0NhbmNlbGxlZChzdWJNb25pdG9yKTsKKyAgICAgICAgc3ViTW9uaXRvci5zdWJUYXNrKCJDb25maWd1cmluZyBsYXVuY2ggcGFyYW1ldGVycy4uLiIpOwogCi0JCVNlcnZlckJlaGF2aW91ciBiZWhhdmlvdXIgPSAoU2VydmVyQmVoYXZpb3VyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoU2VydmVyQmVoYXZpb3VyLmNsYXNzLCBudWxsKTsKKyAgICAgICAgU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91ciA9IChTZXJ2ZXJCZWhhdmlvdXIpIHNlcnZlci5sb2FkQWRhcHRlcihTZXJ2ZXJCZWhhdmlvdXIuY2xhc3MsIG51bGwpOwogCi0JCVN0cmluZyBtYWluVHlwZU5hbWUgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoYmVoYXZpb3VyKS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZUNsYXNzKCk7CisgICAgICAgIFN0cmluZyBtYWluVHlwZU5hbWUgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoYmVoYXZpb3VyKS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZUNsYXNzKCk7CiAKLQkJSVZNSW5zdGFsbCB2bSA9IHZlcmlmeVZNSW5zdGFsbChjb25maWd1cmF0aW9uKTsKLQkJSVZNUnVubmVyIHJ1bm5lciA9IHZtLmdldFZNUnVubmVyKG1vZGUpOwotCQlpZiAocnVubmVyID09IG51bGwpIHsKLQkJCXJ1bm5lciA9IHZtLmdldFZNUnVubmVyKElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFKTsKLQkJfQorICAgICAgICBJVk1JbnN0YWxsIHZtID0gdmVyaWZ5Vk1JbnN0YWxsKGNvbmZpZ3VyYXRpb24pOworICAgICAgICBJVk1SdW5uZXIgcnVubmVyID0gdm0uZ2V0Vk1SdW5uZXIobW9kZSk7CisgICAgICAgIGlmIChydW5uZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcnVubmVyID0gdm0uZ2V0Vk1SdW5uZXIoSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOworICAgICAgICB9CiAKLQkJRmlsZSB3b3JraW5nRGlyID0gdmVyaWZ5V29ya2luZ0RpcmVjdG9yeShjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIHdvcmtpbmdEaXJOYW1lID0gbnVsbDsKLQkJaWYgKHdvcmtpbmdEaXIgIT0gbnVsbCkgewotCQkJd29ya2luZ0Rpck5hbWUgPSB3b3JraW5nRGlyLmdldEFic29sdXRlUGF0aCgpOwotCQl9CisgICAgICAgIEZpbGUgd29ya2luZ0RpciA9IHZlcmlmeVdvcmtpbmdEaXJlY3RvcnkoY29uZmlndXJhdGlvbik7CisgICAgICAgIFN0cmluZyB3b3JraW5nRGlyTmFtZSA9IG51bGw7CisgICAgICAgIGlmICh3b3JraW5nRGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdvcmtpbmdEaXJOYW1lID0gd29ya2luZ0Rpci5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgfQogCi0JCVN0cmluZyBwZ21BcmdzID0gZ2V0UHJvZ3JhbUFyZ3VtZW50cyhjb25maWd1cmF0aW9uKTsKLQkJU3RyaW5nIHZtQXJncyA9IGdldFZNQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOwotCQlTdHJpbmdbXSBlbnZwID0gZ2V0RW52aXJvbm1lbnQoY29uZmlndXJhdGlvbik7CisgICAgICAgIFN0cmluZyBwZ21BcmdzID0gZ2V0UHJvZ3JhbUFyZ3VtZW50cyhjb25maWd1cmF0aW9uKTsKKyAgICAgICAgU3RyaW5nIHZtQXJncyA9IGdldFZNQXJndW1lbnRzKGNvbmZpZ3VyYXRpb24pOworICAgICAgICBTdHJpbmdbXSBlbnZwID0gZ2V0RW52aXJvbm1lbnQoY29uZmlndXJhdGlvbik7CiAKLQkJRXhlY3V0aW9uQXJndW1lbnRzIGV4ZWNBcmdzID0gbmV3IEV4ZWN1dGlvbkFyZ3VtZW50cyh2bUFyZ3MsIHBnbUFyZ3MpOworICAgICAgICBFeGVjdXRpb25Bcmd1bWVudHMgZXhlY0FyZ3MgPSBuZXcgRXhlY3V0aW9uQXJndW1lbnRzKHZtQXJncywgcGdtQXJncyk7CiAKLQkJTWFwPFN0cmluZywgT2JqZWN0PiB2bUF0dHJpYnV0ZXNNYXAgPSBnZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcChjb25maWd1cmF0aW9uKTsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiB2bUF0dHJpYnV0ZXNNYXAgPSBnZXRWTVNwZWNpZmljQXR0cmlidXRlc01hcChjb25maWd1cmF0aW9uKTsKIAotCQlTdHJpbmdbXSBjbGFzc3BhdGggPSBnZXRDbGFzc3BhdGgoY29uZmlndXJhdGlvbik7CisgICAgICAgIFN0cmluZ1tdIGNsYXNzcGF0aCA9IGdldENsYXNzcGF0aChjb25maWd1cmF0aW9uKTsKIAotCQlWTVJ1bm5lckNvbmZpZ3VyYXRpb24gcnVuQ29uZmlndXJhdGlvbiA9IG5ldyBWTVJ1bm5lckNvbmZpZ3VyYXRpb24obWFpblR5cGVOYW1lLCBjbGFzc3BhdGgpOwotCQlydW5Db25maWd1cmF0aW9uLnNldFByb2dyYW1Bcmd1bWVudHMoZXhlY0FyZ3MuZ2V0UHJvZ3JhbUFyZ3VtZW50c0FycmF5KCkpOwotCQlydW5Db25maWd1cmF0aW9uLnNldFZNQXJndW1lbnRzKGV4ZWNBcmdzLmdldFZNQXJndW1lbnRzQXJyYXkoKSk7Ci0JCXJ1bkNvbmZpZ3VyYXRpb24uc2V0V29ya2luZ0RpcmVjdG9yeSh3b3JraW5nRGlyTmFtZSk7Ci0JCXJ1bkNvbmZpZ3VyYXRpb24uc2V0RW52aXJvbm1lbnQoZW52cCk7Ci0JCXJ1bkNvbmZpZ3VyYXRpb24uc2V0Vk1TcGVjaWZpY0F0dHJpYnV0ZXNNYXAodm1BdHRyaWJ1dGVzTWFwKTsKKyAgICAgICAgVk1SdW5uZXJDb25maWd1cmF0aW9uIHJ1bkNvbmZpZ3VyYXRpb24gPSBuZXcgVk1SdW5uZXJDb25maWd1cmF0aW9uKG1haW5UeXBlTmFtZSwgY2xhc3NwYXRoKTsKKyAgICAgICAgcnVuQ29uZmlndXJhdGlvbi5zZXRQcm9ncmFtQXJndW1lbnRzKGV4ZWNBcmdzLmdldFByb2dyYW1Bcmd1bWVudHNBcnJheSgpKTsKKyAgICAgICAgcnVuQ29uZmlndXJhdGlvbi5zZXRWTUFyZ3VtZW50cyhleGVjQXJncy5nZXRWTUFyZ3VtZW50c0FycmF5KCkpOworICAgICAgICBydW5Db25maWd1cmF0aW9uLnNldFdvcmtpbmdEaXJlY3Rvcnkod29ya2luZ0Rpck5hbWUpOworICAgICAgICBydW5Db25maWd1cmF0aW9uLnNldEVudmlyb25tZW50KGVudnApOworICAgICAgICBydW5Db25maWd1cmF0aW9uLnNldFZNU3BlY2lmaWNBdHRyaWJ1dGVzTWFwKHZtQXR0cmlidXRlc01hcCk7CiAKLQkJU3RyaW5nW10gYm9vdHBhdGggPSBnZXRCb290cGF0aChjb25maWd1cmF0aW9uKTsKLQkJaWYgKGJvb3RwYXRoICE9IG51bGwgJiYgYm9vdHBhdGgubGVuZ3RoID4gMCkgewotCQkJcnVuQ29uZmlndXJhdGlvbi5zZXRCb290Q2xhc3NQYXRoKGJvb3RwYXRoKTsKLQkJfQorICAgICAgICBTdHJpbmdbXSBib290cGF0aCA9IGdldEJvb3RwYXRoKGNvbmZpZ3VyYXRpb24pOworICAgICAgICBpZiAoYm9vdHBhdGggIT0gbnVsbCAmJiBib290cGF0aC5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBydW5Db25maWd1cmF0aW9uLnNldEJvb3RDbGFzc1BhdGgoYm9vdHBhdGgpOworICAgICAgICB9CiAKLQkJc3ViTW9uaXRvci53b3JrZWQoMSk7Ci0JCWNoZWNrQ2FuY2VsbGVkKHN1Yk1vbml0b3IpOworICAgICAgICBzdWJNb25pdG9yLndvcmtlZCgxKTsKKyAgICAgICAgY2hlY2tDYW5jZWxsZWQoc3ViTW9uaXRvcik7CiAKLQkJc3ViTW9uaXRvci5zdWJUYXNrKCJTZXR0aW5nIHVwIHNvdXJjZSBsb2NhdG9yLi4uIik7Ci0JCXNldERlZmF1bHRTb3VyY2VMb2NhdG9yKGxhdW5jaCwgY29uZmlndXJhdGlvbik7Ci0JCXN1Yk1vbml0b3Iud29ya2VkKDEpOwotCQljaGVja0NhbmNlbGxlZChzdWJNb25pdG9yKTsKKyAgICAgICAgc3ViTW9uaXRvci5zdWJUYXNrKCJTZXR0aW5nIHVwIHNvdXJjZSBsb2NhdG9yLi4uIik7CisgICAgICAgIHNldERlZmF1bHRTb3VyY2VMb2NhdG9yKGxhdW5jaCwgY29uZmlndXJhdGlvbik7CisgICAgICAgIHN1Yk1vbml0b3Iud29ya2VkKDEpOworICAgICAgICBjaGVja0NhbmNlbGxlZChzdWJNb25pdG9yKTsKIAotCQlpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkgewotCQkJdHJ5IHsKLQkJCQlzdWJNb25pdG9yLnN1YlRhc2soIkNvbmZpZ3VyaW5nIFRQVFAgcHJvZmlsaW5nIHBhcmFtZXRlci4uLiIpOwotCQkJCVNlcnZlclByb2ZpbGVyRGVsZWdhdGUuY29uZmlndXJlUHJvZmlsaW5nKGxhdW5jaCwgdm0sIHJ1bkNvbmZpZ3VyYXRpb24sIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCWJlaGF2aW91ci5zdG9wU2VydmVyKCk7Ci0JCQkJdGhyb3cgY2U7Ci0JCQl9Ci0JCX0KLQkJc3ViTW9uaXRvci53b3JrZWQoMSk7Ci0JCWNoZWNrQ2FuY2VsbGVkKHN1Yk1vbml0b3IpOworICAgICAgICBpZiAoSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFLmVxdWFscyhtb2RlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdWJNb25pdG9yLnN1YlRhc2soIkNvbmZpZ3VyaW5nIFRQVFAgcHJvZmlsaW5nIHBhcmFtZXRlci4uLiIpOworICAgICAgICAgICAgICAgIFNlcnZlclByb2ZpbGVyRGVsZWdhdGUuY29uZmlndXJlUHJvZmlsaW5nKGxhdW5jaCwgdm0sIHJ1bkNvbmZpZ3VyYXRpb24sIG1vbml0b3IpOworICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworICAgICAgICAgICAgICAgIGJlaGF2aW91ci5zdG9wU2VydmVyKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3ViTW9uaXRvci53b3JrZWQoMSk7CisgICAgICAgIGNoZWNrQ2FuY2VsbGVkKHN1Yk1vbml0b3IpOwogCi0JCXN1Yk1vbml0b3Iuc3ViVGFzaygiTGF1bmNoaW5nIFNwcmluZ1NvdXJjZSBkbSBTZXJ2ZXIuLi4iKTsKLQkJYmVoYXZpb3VyLnNldHVwTGF1bmNoKGxhdW5jaCwgbW9kZSwgbW9uaXRvcik7Ci0JCWxhdW5jaC5zZXRBdHRyaWJ1dGUoSVNlcnZlckJlaGF2aW91ci5QUk9QRVJUWV9NQkVBTl9TRVJWRVJfSVAsICIxMjcuMC4wLjEiKTsKKyAgICAgICAgc3ViTW9uaXRvci5zdWJUYXNrKCJMYXVuY2hpbmcgU3ByaW5nU291cmNlIGRtIFNlcnZlci4uLiIpOworICAgICAgICBiZWhhdmlvdXIuc2V0dXBMYXVuY2gobGF1bmNoLCBtb2RlLCBtb25pdG9yKTsKKyAgICAgICAgbGF1bmNoLnNldEF0dHJpYnV0ZShJU2VydmVyQmVoYXZpb3VyLlBST1BFUlRZX01CRUFOX1NFUlZFUl9JUCwgIjEyNy4wLjAuMSIpOwogCi0JCXRyeSB7Ci0JCQlydW5uZXIucnVuKHJ1bkNvbmZpZ3VyYXRpb24sIGxhdW5jaCwgbW9uaXRvcik7Ci0JCQliZWhhdmlvdXIuYWRkUHJvY2Vzc0xpc3RlbmVyKGxhdW5jaC5nZXRQcm9jZXNzZXMoKVswXSk7Ci0JCQlzdWJNb25pdG9yLndvcmtlZCgxKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJ1bm5lci5ydW4ocnVuQ29uZmlndXJhdGlvbiwgbGF1bmNoLCBtb25pdG9yKTsKKyAgICAgICAgICAgIGJlaGF2aW91ci5hZGRQcm9jZXNzTGlzdGVuZXIobGF1bmNoLmdldFByb2Nlc3NlcygpWzBdKTsKKyAgICAgICAgICAgIHN1Yk1vbml0b3Iud29ya2VkKDEpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tDYW5jZWxsZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oU3RhdHVzLkNBTkNFTF9TVEFUVVMpOwotCQl9Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQ2FuY2VsbGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKKyAgICAgICAgfQorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJMYXVuY2hhYmxlQWRhcHRlckRlbGVnYXRlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlckxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQppbmRleCA5MzA5MmUyLi4xMjYzOWMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlckxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlckxhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS5uZXQuVVJMOwpAQCAtMjIsNTQgKzIzLDUzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuV2ViUmVzb3VyY2U7CiAKIC8qKgotICoge0BsaW5rIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGV9IHRvIGFsbG93ICJSdW4gYXMuLi4iIGFjdGlvbnMgZm9yIHdlYgotICogcmVzb3VyY2VzLgotICogCisgKiB7QGxpbmsgTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZX0gdG8gYWxsb3cgIlJ1biBhcy4uLiIgYWN0aW9ucyBmb3Igd2ViIHJlc291cmNlcy4KKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgU2VydmVyTGF1bmNoYWJsZUFkYXB0ZXJEZWxlZ2F0ZSBleHRlbmRzIExhdW5jaGFibGVBZGFwdGVyRGVsZWdhdGUgewogCi0JcHVibGljIE9iamVjdCBnZXRMYXVuY2hhYmxlKElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlT2JqZWN0KSB7Ci0JCS8vIENoZWNrIGZvciBjb3JyZWN0IG1vZHVsZSB0eXBlCi0JCWlmIChzZXJ2ZXIuZ2V0QWRhcHRlcihTZXJ2ZXIuY2xhc3MpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICghKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIFNlcnZsZXQpICYmICEobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgV2ViUmVzb3VyY2UpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAobW9kdWxlT2JqZWN0LmdldE1vZHVsZSgpLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG51bGwpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBnZXRMYXVuY2hhYmxlKElTZXJ2ZXIgc2VydmVyLCBJTW9kdWxlQXJ0aWZhY3QgbW9kdWxlT2JqZWN0KSB7CisgICAgICAgIC8vIENoZWNrIGZvciBjb3JyZWN0IG1vZHVsZSB0eXBlCisgICAgICAgIGlmIChzZXJ2ZXIuZ2V0QWRhcHRlcihTZXJ2ZXIuY2xhc3MpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICghKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIFNlcnZsZXQpICYmICEobW9kdWxlT2JqZWN0IGluc3RhbmNlb2YgV2ViUmVzb3VyY2UpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9kdWxlT2JqZWN0LmdldE1vZHVsZSgpLmxvYWRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MsIG51bGwpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSAoKElVUkxQcm92aWRlcikgc2VydmVyLmxvYWRBZGFwdGVyKElVUkxQcm92aWRlci5jbGFzcywgbnVsbCkpLmdldE1vZHVsZVJvb3RVUkwobW9kdWxlT2JqZWN0Ci0JCQkJCS5nZXRNb2R1bGUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsID0gKChJVVJMUHJvdmlkZXIpIHNlcnZlci5sb2FkQWRhcHRlcihJVVJMUHJvdmlkZXIuY2xhc3MsIG51bGwpKS5nZXRNb2R1bGVSb290VVJMKG1vZHVsZU9iamVjdC5nZXRNb2R1bGUoKSk7CiAKLQkJCWlmIChtb2R1bGVPYmplY3QgaW5zdGFuY2VvZiBTZXJ2bGV0KSB7Ci0JCQkJU2VydmxldCBzZXJ2bGV0ID0gKFNlcnZsZXQpIG1vZHVsZU9iamVjdDsKLQkJCQlpZiAoc2VydmxldC5nZXRBbGlhcygpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhdGggPSBzZXJ2bGV0LmdldEFsaWFzKCk7Ci0JCQkJCWlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgewotCQkJCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwotCQkJCQl9Ci0JCQkJCXVybCA9IG5ldyBVUkwodXJsLCBwYXRoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl1cmwgPSBuZXcgVVJMKHVybCwgInNlcnZsZXQvIiArIHNlcnZsZXQuZ2V0U2VydmxldENsYXNzTmFtZSgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIFdlYlJlc291cmNlKSB7Ci0JCQkJV2ViUmVzb3VyY2UgcmVzb3VyY2UgPSAoV2ViUmVzb3VyY2UpIG1vZHVsZU9iamVjdDsKLQkJCQlTdHJpbmcgcGF0aCA9IHJlc291cmNlLmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5zdGFydHNXaXRoKCIvIikgJiYgcGF0aC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwotCQkJCX0KLQkJCQlpZiAocGF0aCAhPSBudWxsICYmIHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXVybCA9IG5ldyBVUkwodXJsLCBwYXRoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEh0dHBMYXVuY2hhYmxlKHVybCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KKyAgICAgICAgICAgIGlmIChtb2R1bGVPYmplY3QgaW5zdGFuY2VvZiBTZXJ2bGV0KSB7CisgICAgICAgICAgICAgICAgU2VydmxldCBzZXJ2bGV0ID0gKFNlcnZsZXQpIG1vZHVsZU9iamVjdDsKKyAgICAgICAgICAgICAgICBpZiAoc2VydmxldC5nZXRBbGlhcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBzZXJ2bGV0LmdldEFsaWFzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwodXJsLCBwYXRoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKHVybCwgInNlcnZsZXQvIiArIHNlcnZsZXQuZ2V0U2VydmxldENsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZHVsZU9iamVjdCBpbnN0YW5jZW9mIFdlYlJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgV2ViUmVzb3VyY2UgcmVzb3VyY2UgPSAoV2ViUmVzb3VyY2UpIG1vZHVsZU9iamVjdDsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IHJlc291cmNlLmdldFBhdGgoKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5zdGFydHNXaXRoKCIvIikgJiYgcGF0aC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsICYmIHBhdGgubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwodXJsLCBwYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IEh0dHBMYXVuY2hhYmxlKHVybCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvU2VydmVyUHVibGlzaE9wZXJhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJQdWJsaXNoT3BlcmF0aW9uLmphdmEKaW5kZXggNmY5NGY2Ni4uNjMwYzA3OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJQdWJsaXNoT3BlcmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJQdWJsaXNoT3BlcmF0aW9uLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTQ4LDI3NiArNDksMjcyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlNlcnZlckJlaGF2aW91ckRlbGVnYXRlOwogCiAvKioKLSAqIHtAbGluayBQdWJsaXNoT3BlcmF0aW9ufSBleHRlbnNpb24gdGhhdCBkZWFscyB3aXRoIGRlcGxveSwgY2xlYW4gYW5kIHJlZnJlc2gKLSAqIG9mIGRtIFNlcnZlciBtb2R1bGVzLgotICogCisgKiB7QGxpbmsgUHVibGlzaE9wZXJhdGlvbn0gZXh0ZW5zaW9uIHRoYXQgZGVhbHMgd2l0aCBkZXBsb3ksIGNsZWFuIGFuZCByZWZyZXNoIG9mIGRtIFNlcnZlciBtb2R1bGVzLgorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCiBwdWJsaWMgY2xhc3MgU2VydmVyUHVibGlzaE9wZXJhdGlvbiBleHRlbmRzIFB1Ymxpc2hPcGVyYXRpb24gewogCi0JcHJpdmF0ZSBpbnQgZGVsdGFLaW5kOworICAgIHByaXZhdGUgZmluYWwgaW50IGRlbHRhS2luZDsKIAotCXByaXZhdGUgaW50IGtpbmQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQga2luZDsKIAotCXByaXZhdGUgSU1vZHVsZVtdIG1vZHVsZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBJTW9kdWxlW10gbW9kdWxlczsKIAotCXByaXZhdGUgU2VydmVyQmVoYXZpb3VyIHNlcnZlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNlcnZlckJlaGF2aW91ciBzZXJ2ZXI7CiAKLQlwdWJsaWMgU2VydmVyUHVibGlzaE9wZXJhdGlvbihTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyLCBpbnQga2luZCwgSU1vZHVsZVtdIG1vZHVsZSwgaW50IGRlbHRhS2luZCkgewotCQlzdXBlcigiUHVibGlzaCB0byBzZXJ2ZXIiLCAiUHVibGlzaCBtb2R1bGUgdG8gU3ByaW5nU291cmNlIGRtIFNlcnZlciIpOwotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5raW5kID0ga2luZDsKLQkJdGhpcy5tb2R1bGVzID0gbW9kdWxlOwotCQl0aGlzLmRlbHRhS2luZCA9IGRlbHRhS2luZDsKLQl9CisgICAgcHVibGljIFNlcnZlclB1Ymxpc2hPcGVyYXRpb24oU2VydmVyQmVoYXZpb3VyIHNlcnZlciwgaW50IGtpbmQsIElNb2R1bGVbXSBtb2R1bGUsIGludCBkZWx0YUtpbmQpIHsKKyAgICAgICAgc3VwZXIoIlB1Ymxpc2ggdG8gc2VydmVyIiwgIlB1Ymxpc2ggbW9kdWxlIHRvIFNwcmluZ1NvdXJjZSBkbSBTZXJ2ZXIiKTsKKyAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgICAgIHRoaXMua2luZCA9IGtpbmQ7CisgICAgICAgIHRoaXMubW9kdWxlcyA9IG1vZHVsZTsKKyAgICAgICAgdGhpcy5kZWx0YUtpbmQgPSBkZWx0YUtpbmQ7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIHNob3VsZFJlZGVwbG95ID0gZmFsc2U7Ci0JCUxpc3Q8SVN0YXR1cz4gc3RhdHVzID0gbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpOwotCQlpZiAobW9kdWxlcy5sZW5ndGggPT0gMSkgewotCQkJc2hvdWxkUmVkZXBsb3kgPSBwdWJsaXNoTW9kdWxlKG1vZHVsZXNbMF0sIHN0YXR1cywgbW9uaXRvcik7Ci0JCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gc2hvdWxkUmVkZXBsb3kgPSBmYWxzZTsKKyAgICAgICAgTGlzdDxJU3RhdHVzPiBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KCk7CisgICAgICAgIGlmICh0aGlzLm1vZHVsZXMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIHNob3VsZFJlZGVwbG95ID0gcHVibGlzaE1vZHVsZSh0aGlzLm1vZHVsZXNbMF0sIHN0YXR1cywgbW9uaXRvcik7CisgICAgICAgIH0KIAotCQlib29sZWFuIHNob3VsZFJlcGxveUNoaWxkID0gZmFsc2U7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBtb2R1bGVzWzBdLmdldFByb2plY3QoKTsKLQkJaWYgKCFGYWNldFV0aWxzLmlzQnVuZGxlUHJvamVjdChwcm9qZWN0KSAmJiAhRmFjZXRVdGlscy5pc1BhclByb2plY3QocHJvamVjdCkKLQkJCSYmIFNlcnZlclV0aWxzLmdldFNlcnZlcihzZXJ2ZXIpLmdldENoaWxkTW9kdWxlcyhtb2R1bGVzKSAhPSBudWxsICYmICFGYWNldFV0aWxzLmlzUGxhblByb2plY3QocHJvamVjdCkpIHsKLQkJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoc2VydmVyKS5nZXRDaGlsZE1vZHVsZXMobW9kdWxlcykpIHsKLQkJCQlpZiAocHVibGlzaEphcihtb2R1bGUsIHN0YXR1cywgbW9uaXRvcikpIHsKLQkJCQkJc2hvdWxkUmVwbG95Q2hpbGQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICBib29sZWFuIHNob3VsZFJlcGxveUNoaWxkID0gZmFsc2U7CisgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSB0aGlzLm1vZHVsZXNbMF0uZ2V0UHJvamVjdCgpOworICAgICAgICBpZiAoIUZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KHByb2plY3QpICYmICFGYWNldFV0aWxzLmlzUGFyUHJvamVjdChwcm9qZWN0KQorICAgICAgICAgICAgJiYgU2VydmVyVXRpbHMuZ2V0U2VydmVyKHRoaXMuc2VydmVyKS5nZXRDaGlsZE1vZHVsZXModGhpcy5tb2R1bGVzKSAhPSBudWxsICYmICFGYWNldFV0aWxzLmlzUGxhblByb2plY3QocHJvamVjdCkpIHsKKyAgICAgICAgICAgIGZvciAoSU1vZHVsZSBtb2R1bGUgOiBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIodGhpcy5zZXJ2ZXIpLmdldENoaWxkTW9kdWxlcyh0aGlzLm1vZHVsZXMpKSB7CisgICAgICAgICAgICAgICAgaWYgKHB1Ymxpc2hKYXIobW9kdWxlLCBzdGF0dXMsIG1vbml0b3IpKSB7CisgICAgICAgICAgICAgICAgICAgIHNob3VsZFJlcGxveUNoaWxkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAoc2hvdWxkUmVkZXBsb3kgfHwgc2hvdWxkUmVwbG95Q2hpbGQpIHsKLQkJCXNlcnZlci5nZXRTZXJ2ZXJEZXBsb3llcigpLnJlZGVwbG95KG1vZHVsZXNbMF0pOwotCQl9CisgICAgICAgIGlmIChzaG91bGRSZWRlcGxveSB8fCBzaG91bGRSZXBsb3lDaGlsZCkgeworICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0U2VydmVyRGVwbG95ZXIoKS5yZWRlcGxveSh0aGlzLm1vZHVsZXNbMF0pOworICAgICAgICB9CiAKLQkJc2VydmVyLm9uTW9kdWxlUHVibGlzaFN0YXRlQ2hhbmdlKG1vZHVsZXMsIElTZXJ2ZXIuUFVCTElTSF9TVEFURV9OT05FKTsKLQl9CisgICAgICAgIHRoaXMuc2VydmVyLm9uTW9kdWxlUHVibGlzaFN0YXRlQ2hhbmdlKHRoaXMubW9kdWxlcywgSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUpOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIFJFUVVJUkVEOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEtpbmQoKSB7CisgICAgICAgIHJldHVybiBSRVFVSVJFRDsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGdldE9yZGVyKCkgewotCQlyZXR1cm4gMDsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRPcmRlcigpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiA8Y29kZT5maWxlPC9jb2RlPiBpcyBhIHJvb3Qgbm9kZSB0aGF0IGlzIGEga25vd24KLQkgKiBTcHJpbmcgbmFtZXNwYWNlLgotCSAqLwotCS8vIHByaXZhdGUgYm9vbGVhbiBjaGVja0lmU3ByaW5nQ29uZmlndXJhdGlvbkZpbGUoSUZpbGUgZmlsZSkgewotCS8vIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCS8vIHRyeSB7Ci0JLy8gbW9kZWwgPQotCS8vIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZmlsZSk7Ci0JLy8gaWYgKG1vZGVsID09IG51bGwpIHsKLQkvLyBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpOwotCS8vIH0KLQkvLyBpZiAobW9kZWwgIT0gbnVsbCkgewotCS8vIElET01Eb2N1bWVudCBkb2N1bWVudCA9ICgoRE9NTW9kZWxJbXBsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkvLyBpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JLy8gU3RyaW5nIG5hbWVzcGFjZVVyaSA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpLmdldE5hbWVzcGFjZVVSSSgpOwotCS8vIGlmIChOYW1lc3BhY2VVdGlscy5ERUZBVUxUX05BTUVTUEFDRV9VUkkuZXF1YWxzKG5hbWVzcGFjZVVyaSkKLQkvLyB8fCBuZXcKLQkvLyBEZWxlZ2F0aW5nTmFtZXNwYWNlSGFuZGxlclJlc29sdmVyKEpkdFV0aWxzLmdldENsYXNzTG9hZGVyKGZpbGUuZ2V0UHJvamVjdCgpLAotCS8vIG51bGwpLAotCS8vIG51bGwpLnJlc29sdmUobmFtZXNwYWNlVXJpKSAhPSBudWxsKSB7Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkvLyB9Ci0JLy8gZmluYWxseSB7Ci0JLy8gaWYgKG1vZGVsICE9IG51bGwpIHsKLQkvLyBtb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkvLyB9Ci0JLy8gbW9kZWwgPSBudWxsOwotCS8vIH0KLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9CisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiA8Y29kZT5maWxlPC9jb2RlPiBpcyBhIHJvb3Qgbm9kZSB0aGF0IGlzIGEga25vd24gU3ByaW5nIG5hbWVzcGFjZS4KKyAgICAgKi8KKyAgICAvLyBwcml2YXRlIGJvb2xlYW4gY2hlY2tJZlNwcmluZ0NvbmZpZ3VyYXRpb25GaWxlKElGaWxlIGZpbGUpIHsKKyAgICAvLyBJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKKyAgICAvLyB0cnkgeworICAgIC8vIG1vZGVsID0KKyAgICAvLyBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZpbGUpOworICAgIC8vIGlmIChtb2RlbCA9PSBudWxsKSB7CisgICAgLy8gbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKKyAgICAvLyB9CisgICAgLy8gaWYgKG1vZGVsICE9IG51bGwpIHsKKyAgICAvLyBJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoKERPTU1vZGVsSW1wbCkgbW9kZWwpLmdldERvY3VtZW50KCk7CisgICAgLy8gaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkgIT0gbnVsbCkgeworICAgIC8vIFN0cmluZyBuYW1lc3BhY2VVcmkgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAvLyBpZiAoTmFtZXNwYWNlVXRpbHMuREVGQVVMVF9OQU1FU1BBQ0VfVVJJLmVxdWFscyhuYW1lc3BhY2VVcmkpCisgICAgLy8gfHwgbmV3CisgICAgLy8gRGVsZWdhdGluZ05hbWVzcGFjZUhhbmRsZXJSZXNvbHZlcihKZHRVdGlscy5nZXRDbGFzc0xvYWRlcihmaWxlLmdldFByb2plY3QoKSwKKyAgICAvLyBudWxsKSwKKyAgICAvLyBudWxsKS5yZXNvbHZlKG5hbWVzcGFjZVVyaSkgIT0gbnVsbCkgeworICAgIC8vIHJldHVybiBmYWxzZTsKKyAgICAvLyB9CisgICAgLy8gfQorICAgIC8vIH0KKyAgICAvLyB9CisgICAgLy8gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgLy8gfQorICAgIC8vIGZpbmFsbHkgeworICAgIC8vIGlmIChtb2RlbCAhPSBudWxsKSB7CisgICAgLy8gbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7CisgICAgLy8gfQorICAgIC8vIG1vZGVsID0gbnVsbDsKKyAgICAvLyB9CisgICAgLy8gcmV0dXJuIHRydWU7CisgICAgLy8gfQogCi0JLyoqCi0JICogQ2hlY2sgaWYgcmVzb3VyY2UgZGVsdGEgb25seSBjb250YWlucyBzdGF0aWMgcmVzb3VyY2VzCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG9ubHlTdGF0aWNSZXNvdXJjZXMoSU1vZHVsZVJlc291cmNlRGVsdGEgZGVsdGEsIFNldDxJTW9kdWxlRmlsZT4gZmlsZXMpIHsKLQkJaWYgKGRlbHRhLmdldE1vZHVsZVJlc291cmNlKCkgaW5zdGFuY2VvZiBJTW9kdWxlRm9sZGVyKSB7Ci0JCQlmb3IgKElNb2R1bGVSZXNvdXJjZURlbHRhIGNoaWxkIDogZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKSB7Ci0JCQkJaWYgKCFvbmx5U3RhdGljUmVzb3VyY2VzKGNoaWxkLCBmaWxlcykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJaWYgKGRlbHRhLmdldE1vZHVsZVJlc291cmNlKCkgaW5zdGFuY2VvZiBJTW9kdWxlRmlsZSkgewotCQkJCWZpbGVzLmFkZCgoSU1vZHVsZUZpbGUpIGRlbHRhLmdldE1vZHVsZVJlc291cmNlKCkpOwotCQkJfQotCQkJU3RyaW5nIG5hbWUgPSBkZWx0YS5nZXRNb2R1bGVSZXNvdXJjZSgpLmdldE5hbWUoKTsKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiByZXNvdXJjZSBkZWx0YSBvbmx5IGNvbnRhaW5zIHN0YXRpYyByZXNvdXJjZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gb25seVN0YXRpY1Jlc291cmNlcyhJTW9kdWxlUmVzb3VyY2VEZWx0YSBkZWx0YSwgU2V0PElNb2R1bGVGaWxlPiBmaWxlcykgeworICAgICAgICBpZiAoZGVsdGEuZ2V0TW9kdWxlUmVzb3VyY2UoKSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKKyAgICAgICAgICAgIGZvciAoSU1vZHVsZVJlc291cmNlRGVsdGEgY2hpbGQgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW9ubHlTdGF0aWNSZXNvdXJjZXMoY2hpbGQsIGZpbGVzKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZGVsdGEuZ2V0TW9kdWxlUmVzb3VyY2UoKSBpbnN0YW5jZW9mIElNb2R1bGVGaWxlKSB7CisgICAgICAgICAgICAgICAgZmlsZXMuYWRkKChJTW9kdWxlRmlsZSkgZGVsdGEuZ2V0TW9kdWxlUmVzb3VyY2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGRlbHRhLmdldE1vZHVsZVJlc291cmNlKCkuZ2V0TmFtZSgpOwogCi0JCQlib29sZWFuIGlzU3RhdGljID0gZmFsc2U7Ci0JCQkvLyBDaGVjayB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBzdGF0aWMgcmVzb3VyY2VzCi0JCQlBbnRQYXRoTWF0Y2hlciBtYXRjaGVyID0gbmV3IEFudFBhdGhNYXRjaGVyKCk7Ci0JCQlmb3IgKFN0cmluZyBwYXR0ZXJuIDogU3RyaW5nVXRpbHMuZGVsaW1pdGVkTGlzdFRvU3RyaW5nQXJyYXkoU2VydmVyVXRpbHMuZ2V0U2VydmVyKHNlcnZlcikKLQkJCQkJLmdldFN0YXRpY0ZpbGVuYW1lUGF0dGVybnMoKSwgIiwiKSkgewotCQkJCWlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgoIiEiKSAmJiBtYXRjaGVyLm1hdGNoKHBhdHRlcm4uc3Vic3RyaW5nKDEpLCBuYW1lKSkgewotCQkJCQlpc1N0YXRpYyA9IGZhbHNlOwotCQkJCX0gZWxzZSBpZiAobWF0Y2hlci5tYXRjaChwYXR0ZXJuLCBuYW1lKSkgewotCQkJCQlpc1N0YXRpYyA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGlzU3RhdGljOwotCQl9Ci0JfQorICAgICAgICAgICAgYm9vbGVhbiBpc1N0YXRpYyA9IGZhbHNlOworICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3Igc3RhdGljIHJlc291cmNlcworICAgICAgICAgICAgQW50UGF0aE1hdGNoZXIgbWF0Y2hlciA9IG5ldyBBbnRQYXRoTWF0Y2hlcigpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgcGF0dGVybiA6IFN0cmluZ1V0aWxzLmRlbGltaXRlZExpc3RUb1N0cmluZ0FycmF5KFNlcnZlclV0aWxzLmdldFNlcnZlcih0aGlzLnNlcnZlcikuZ2V0U3RhdGljRmlsZW5hbWVQYXR0ZXJucygpLCAiLCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uc3RhcnRzV2l0aCgiISIpICYmIG1hdGNoZXIubWF0Y2gocGF0dGVybi5zdWJzdHJpbmcoMSksIG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlzU3RhdGljID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaGVyLm1hdGNoKHBhdHRlcm4sIG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlzU3RhdGljID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaXNTdGF0aWM7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaEphcihJTW9kdWxlIG1vZHVsZSwgTGlzdDxJU3RhdHVzPiBzdGF0dXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBwYXRoID0gc2VydmVyLmdldE1vZHVsZURlcGxveURpcmVjdG9yeShtb2R1bGVzWzBdKS5hcHBlbmQoIldFQi1JTkYiKS5hcHBlbmQoImxpYiIpOwotCQlJUGF0aCB6aXBQYXRoID0gcGF0aC5hcHBlbmQobW9kdWxlLmdldE5hbWUoKSArICIuamFyIik7CisgICAgcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hKYXIoSU1vZHVsZSBtb2R1bGUsIExpc3Q8SVN0YXR1cz4gc3RhdHVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgSVBhdGggcGF0aCA9IHRoaXMuc2VydmVyLmdldE1vZHVsZURlcGxveURpcmVjdG9yeSh0aGlzLm1vZHVsZXNbMF0pLmFwcGVuZCgiV0VCLUlORiIpLmFwcGVuZCgibGliIik7CisgICAgICAgIElQYXRoIHppcFBhdGggPSBwYXRoLmFwcGVuZChtb2R1bGUuZ2V0TmFtZSgpICsgIi5qYXIiKTsKIAotCQlpZiAoa2luZCA9PSBJU2VydmVyLlBVQkxJU0hfQ0xFQU4gfHwgZGVsdGFLaW5kID09IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLlJFTU9WRUQpIHsKLQkJCWlmICh6aXBQYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJemlwUGF0aC50b0ZpbGUoKS5kZWxldGUoKTsKLQkJCX0KKyAgICAgICAgaWYgKHRoaXMua2luZCA9PSBJU2VydmVyLlBVQkxJU0hfQ0xFQU4gfHwgdGhpcy5kZWx0YUtpbmQgPT0gU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuUkVNT1ZFRCkgeworICAgICAgICAgICAgaWYgKHppcFBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICB6aXBQYXRoLnRvRmlsZSgpLmRlbGV0ZSgpOworICAgICAgICAgICAgfQogCi0JCQlpZiAoZGVsdGFLaW5kID09IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLlJFTU9WRUQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKGtpbmQgIT0gSVNlcnZlci5QVUJMSVNIX0NMRUFOICYmIGtpbmQgIT0gSVNlcnZlci5QVUJMSVNIX0ZVTEwpIHsKLQkJCUlNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEgPSBzZXJ2ZXIuZ2V0UHVibGlzaGVkUmVzb3VyY2VEZWx0YShuZXcgSU1vZHVsZVtdIHsgbW9kdWxlc1swXSwgbW9kdWxlIH0pOwotCQkJaWYgKGRlbHRhID09IG51bGwgfHwgZGVsdGEubGVuZ3RoID09IDApIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIGlmICh0aGlzLmRlbHRhS2luZCA9PSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5SRU1PVkVEKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmtpbmQgIT0gSVNlcnZlci5QVUJMSVNIX0NMRUFOICYmIHRoaXMua2luZCAhPSBJU2VydmVyLlBVQkxJU0hfRlVMTCkgeworICAgICAgICAgICAgSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YSA9IHRoaXMuc2VydmVyLmdldFB1Ymxpc2hlZFJlc291cmNlRGVsdGEobmV3IElNb2R1bGVbXSB7IHRoaXMubW9kdWxlc1swXSwgbW9kdWxlIH0pOworICAgICAgICAgICAgaWYgKGRlbHRhID09IG51bGwgfHwgZGVsdGEubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAoIXBhdGgudG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCXBhdGgudG9GaWxlKCkubWtkaXJzKCk7Ci0JCX0KKyAgICAgICAgaWYgKCFwYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7CisgICAgICAgICAgICBwYXRoLnRvRmlsZSgpLm1rZGlycygpOworICAgICAgICB9CiAKLQkJUHVibGlzaFV0aWwucHVibGlzaFppcChzZXJ2ZXIuZ2V0UmVzb3VyY2VzKG5ldyBJTW9kdWxlW10geyBtb2R1bGVzWzBdLCBtb2R1bGUgfSksIHppcFBhdGgsIG1vbml0b3IpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgICAgIFB1Ymxpc2hVdGlsLnB1Ymxpc2haaXAodGhpcy5zZXJ2ZXIuZ2V0UmVzb3VyY2VzKG5ldyBJTW9kdWxlW10geyB0aGlzLm1vZHVsZXNbMF0sIG1vZHVsZSB9KSwgemlwUGF0aCwgbW9uaXRvcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCS8qKgotCSAqIENyZWF0ZXMgYSBkdW1teSBtYW5pZmVzdCBmb3IgV1RQIER5bmFtaWMgV2ViIFByb2plY3RzIG9ubHkKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHVibGlzaE1hbmlmZXN0KElNb2R1bGUgbW9kdWxlLCBJUGF0aCBwYXRoKSB7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGR1bW15IG1hbmlmZXN0IGZvciBXVFAgRHluYW1pYyBXZWIgUHJvamVjdHMgb25seQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwdWJsaXNoTWFuaWZlc3QoSU1vZHVsZSBtb2R1bGUsIElQYXRoIHBhdGgpIHsKIAotCQlpZiAoRmFjZXRVdGlscy5oYXNQcm9qZWN0RmFjZXQobW9kdWxlLmdldFByb2plY3QoKSwgRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRCkpIHsKLQkJCUZpbGUgbWFuaWZlc3RGaWxlID0gcGF0aC5hcHBlbmQoQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLk1BTklGRVNUX0ZPTERFUl9OQU1FKQotCQkJCQkuYXBwZW5kKEJ1bmRsZU1hbmlmZXN0Q29yZVBsdWdpbi5NQU5JRkVTVF9GSUxFX05BTUUpLnRvRmlsZSgpOwotCQkJaWYgKG1hbmlmZXN0RmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gQnVuZGxlTWFuaWZlc3RGYWN0b3J5LmNyZWF0ZUJ1bmRsZU1hbmlmZXN0KCk7Ci0JCQlXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbWFuaWZlc3RGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQl3cml0ZXIgPSBuZXcgRmlsZVdyaXRlcihtYW5pZmVzdEZpbGUpOwotCQkJCW1hbmlmZXN0LndyaXRlKHdyaXRlcik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmICh3cml0ZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICBpZiAoRmFjZXRVdGlscy5oYXNQcm9qZWN0RmFjZXQobW9kdWxlLmdldFByb2plY3QoKSwgRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRCkpIHsKKyAgICAgICAgICAgIEZpbGUgbWFuaWZlc3RGaWxlID0gcGF0aC5hcHBlbmQoQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLk1BTklGRVNUX0ZPTERFUl9OQU1FKS5hcHBlbmQoCisgICAgICAgICAgICAgICAgQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLk1BTklGRVNUX0ZJTEVfTkFNRSkudG9GaWxlKCk7CisgICAgICAgICAgICBpZiAobWFuaWZlc3RGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBCdW5kbGVNYW5pZmVzdEZhY3RvcnkuY3JlYXRlQnVuZGxlTWFuaWZlc3QoKTsKKyAgICAgICAgICAgIFdyaXRlciB3cml0ZXIgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtYW5pZmVzdEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOworICAgICAgICAgICAgICAgIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKG1hbmlmZXN0RmlsZSk7CisgICAgICAgICAgICAgICAgbWFuaWZlc3Qud3JpdGUod3JpdGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaE1vZHVsZShJTW9kdWxlIG1vZHVsZSwgTGlzdDxJU3RhdHVzPiBzdGF0dXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBwYXRoID0gc2VydmVyLmdldE1vZHVsZURlcGxveURpcmVjdG9yeShtb2R1bGUpOworICAgIHByaXZhdGUgYm9vbGVhbiBwdWJsaXNoTW9kdWxlKElNb2R1bGUgbW9kdWxlLCBMaXN0PElTdGF0dXM+IHN0YXR1cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIElQYXRoIHBhdGggPSB0aGlzLnNlcnZlci5nZXRNb2R1bGVEZXBsb3lEaXJlY3RvcnkobW9kdWxlKTsKIAotCQlpZiAoZGVsdGFLaW5kID09IFNlcnZlckJlaGF2aW91ckRlbGVnYXRlLlJFTU9WRUQpIHsKLQkJCUZpbGUgZiA9IHBhdGgudG9GaWxlKCk7Ci0JCQlpZiAoU2VydmVyVXRpbHMuZ2V0U2VydmVyKHNlcnZlcikuZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKLQkJCQlzZXJ2ZXIuZ2V0U2VydmVyRGVwbG95ZXIoKS51bmRlcGxveShtb2R1bGUpOwotCQkJfQotCQkJaWYgKGYuZXhpc3RzKCkgJiYgIXBhdGguZXF1YWxzKHNlcnZlci5nZXRTZXJ2ZXJEZXBsb3lEaXJlY3RvcnkoKSkpIHsKLQkJCQlQdWJsaXNoVXRpbC5kZWxldGVEaXJlY3RvcnkoZiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9CisgICAgICAgIGlmICh0aGlzLmRlbHRhS2luZCA9PSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5SRU1PVkVEKSB7CisgICAgICAgICAgICBGaWxlIGYgPSBwYXRoLnRvRmlsZSgpOworICAgICAgICAgICAgaWYgKFNlcnZlclV0aWxzLmdldFNlcnZlcih0aGlzLnNlcnZlcikuZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRTZXJ2ZXJEZXBsb3llcigpLnVuZGVwbG95KG1vZHVsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSAmJiAhcGF0aC5lcXVhbHModGhpcy5zZXJ2ZXIuZ2V0U2VydmVyRGVwbG95RGlyZWN0b3J5KCkpKSB7CisgICAgICAgICAgICAgICAgUHVibGlzaFV0aWwuZGVsZXRlRGlyZWN0b3J5KGYsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICAgICAgfQogCi0JCQlpZiAobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpLmVxdWFscyhGYWNldENvcmVQbHVnaW4uUExBTl9GQUNFVF9JRCkpIHsKLQkJCQkvLyBEZWxldGUgdGhlIHBsYW4gZmlsZQotCQkJCXBhdGggPSBwYXRoLmFwcGVuZChtb2R1bGUuZ2V0SWQoKS5zdWJzdHJpbmcobW9kdWxlLmdldElkKCkubGFzdEluZGV4T2YoJy8nKSkpOwotCQkJCUZpbGUgcGxhbkZpbGUgPSBwYXRoLnRvRmlsZSgpOwotCQkJCWlmIChwbGFuRmlsZS5leGlzdHMoKSkgewotCQkJCQlwbGFuRmlsZS5kZWxldGUoKTsKLQkJCQl9CisgICAgICAgICAgICBpZiAobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpLmVxdWFscyhGYWNldENvcmVQbHVnaW4uUExBTl9GQUNFVF9JRCkpIHsKKyAgICAgICAgICAgICAgICAvLyBEZWxldGUgdGhlIHBsYW4gZmlsZQorICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLmFwcGVuZChtb2R1bGUuZ2V0SWQoKS5zdWJzdHJpbmcobW9kdWxlLmdldElkKCkubGFzdEluZGV4T2YoJy8nKSkpOworICAgICAgICAgICAgICAgIEZpbGUgcGxhbkZpbGUgPSBwYXRoLnRvRmlsZSgpOworICAgICAgICAgICAgICAgIGlmIChwbGFuRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBwbGFuRmlsZS5kZWxldGUoKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQkvLyBEZWxldGUgYWxsIGNoaWxkIG1vZHVsZXMgdGhhdCBhcmUgbm90IGJlaW5nIHVzZWQgYW55bW9yZQotCQkJCVNlcnZlck1vZHVsZURlbGVnYXRlIHBsYW5Nb2R1bGUgPSAoU2VydmVyTW9kdWxlRGVsZWdhdGUpIG1vZHVsZS5sb2FkQWRhcHRlcihTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZS5jbGFzcywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJbnVsbCk7Ci0JCQkJSVNlcnZlciBzID0gc2VydmVyLmdldFNlcnZlcigpOwotCQkJCWZvciAoSU1vZHVsZSBjaGlsZE1vZHVsZSA6IHBsYW5Nb2R1bGUuZ2V0Q2hpbGRNb2R1bGVzKCkpIHsKLQkJCQkJaWYgKCFTZXJ2ZXJVdGlsLmNvbnRhaW5zTW9kdWxlKHMsIGNoaWxkTW9kdWxlLCBtb25pdG9yKSkgewotCQkJCQkJSVBhdGggbW9kdWxlUGF0aCA9IHNlcnZlci5nZXRNb2R1bGVEZXBsb3lEaXJlY3RvcnkoY2hpbGRNb2R1bGUpOwotCQkJCQkJRmlsZSBtb2R1bGVGaWxlID0gbW9kdWxlUGF0aC50b0ZpbGUoKTsKLQkJCQkJCWlmIChtb2R1bGVGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJUHVibGlzaFV0aWwuZGVsZXRlRGlyZWN0b3J5KG1vZHVsZUZpbGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBhbGwgY2hpbGQgbW9kdWxlcyB0aGF0IGFyZSBub3QgYmVpbmcgdXNlZCBhbnltb3JlCisgICAgICAgICAgICAgICAgU2VydmVyTW9kdWxlRGVsZWdhdGUgcGxhbk1vZHVsZSA9IChTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZSkgbW9kdWxlLmxvYWRBZGFwdGVyKFNlcnZlck1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgICAgICBJU2VydmVyIHMgPSB0aGlzLnNlcnZlci5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgICAgICAgICBmb3IgKElNb2R1bGUgY2hpbGRNb2R1bGUgOiBwbGFuTW9kdWxlLmdldENoaWxkTW9kdWxlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghU2VydmVyVXRpbC5jb250YWluc01vZHVsZShzLCBjaGlsZE1vZHVsZSwgbW9uaXRvcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElQYXRoIG1vZHVsZVBhdGggPSB0aGlzLnNlcnZlci5nZXRNb2R1bGVEZXBsb3lEaXJlY3RvcnkoY2hpbGRNb2R1bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBtb2R1bGVGaWxlID0gbW9kdWxlUGF0aC50b0ZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGVGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHVibGlzaFV0aWwuZGVsZXRlRGlyZWN0b3J5KG1vZHVsZUZpbGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogCi0JCWlmIChraW5kID09IElTZXJ2ZXIuUFVCTElTSF9DTEVBTiB8fCBraW5kID09IElTZXJ2ZXIuUFVCTElTSF9GVUxMKSB7Ci0JCQlJTW9kdWxlUmVzb3VyY2VbXSBtciA9IHNlcnZlci5nZXRSZXNvdXJjZXMobW9kdWxlcyk7Ci0JCQlzdGF0dXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoUHVibGlzaFV0aWwucHVibGlzaEZ1bGwobXIsIHBhdGgsIG1vbml0b3IpKSk7Ci0JCQkvLyBIYWNrIHRvIGdldCBhIE1BTklGRVNULk1GIGludG8gdGhlIGRlcGxveW1lbnQgYXJlYQotCQkJcHVibGlzaE1hbmlmZXN0KG1vZHVsZSwgcGF0aCk7CisgICAgICAgIGlmICh0aGlzLmtpbmQgPT0gSVNlcnZlci5QVUJMSVNIX0NMRUFOIHx8IHRoaXMua2luZCA9PSBJU2VydmVyLlBVQkxJU0hfRlVMTCkgeworICAgICAgICAgICAgSU1vZHVsZVJlc291cmNlW10gbXIgPSB0aGlzLnNlcnZlci5nZXRSZXNvdXJjZXModGhpcy5tb2R1bGVzKTsKKyAgICAgICAgICAgIHN0YXR1cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChQdWJsaXNoVXRpbC5wdWJsaXNoRnVsbChtciwgcGF0aCwgbW9uaXRvcikpKTsKKyAgICAgICAgICAgIC8vIEhhY2sgdG8gZ2V0IGEgTUFOSUZFU1QuTUYgaW50byB0aGUgZGVwbG95bWVudCBhcmVhCisgICAgICAgICAgICBwdWJsaXNoTWFuaWZlc3QobW9kdWxlLCBwYXRoKTsKIAotCQkJaWYgKFNlcnZlclV0aWxzLmdldFNlcnZlcihzZXJ2ZXIpLmdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVEKSB7Ci0JCQkJLy8gcmVkZXBsb3kKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQorICAgICAgICAgICAgaWYgKFNlcnZlclV0aWxzLmdldFNlcnZlcih0aGlzLnNlcnZlcikuZ2V0U2VydmVyKCkuZ2V0U2VydmVyU3RhdGUoKSA9PSBJU2VydmVyLlNUQVRFX1NUQVJURUQpIHsKKyAgICAgICAgICAgICAgICAvLyByZWRlcGxveQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAKLQkJSU1vZHVsZVJlc291cmNlRGVsdGFbXSBkZWx0YSA9IHNlcnZlci5nZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKG1vZHVsZXMpOwotCQlmb3IgKElNb2R1bGVSZXNvdXJjZURlbHRhIGQgOiBkZWx0YSkgewotCQkJc3RhdHVzLmFkZEFsbChBcnJheXMuYXNMaXN0KFB1Ymxpc2hVdGlsLnB1Ymxpc2hEZWx0YShkLCBwYXRoLCBtb25pdG9yKSkpOwotCQl9CisgICAgICAgIElNb2R1bGVSZXNvdXJjZURlbHRhW10gZGVsdGEgPSB0aGlzLnNlcnZlci5nZXRQdWJsaXNoZWRSZXNvdXJjZURlbHRhKHRoaXMubW9kdWxlcyk7CisgICAgICAgIGZvciAoSU1vZHVsZVJlc291cmNlRGVsdGEgZCA6IGRlbHRhKSB7CisgICAgICAgICAgICBzdGF0dXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoUHVibGlzaFV0aWwucHVibGlzaERlbHRhKGQsIHBhdGgsIG1vbml0b3IpKSk7CisgICAgICAgIH0KIAotCQlwdWJsaXNoTWFuaWZlc3QobW9kdWxlLCBwYXRoKTsKKyAgICAgICAgcHVibGlzaE1hbmlmZXN0KG1vZHVsZSwgcGF0aCk7CiAKLQkJaWYgKFNlcnZlclV0aWxzLmdldFNlcnZlcihzZXJ2ZXIpLmdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVECi0JCQkmJiBkZWx0YUtpbmQgIT0gU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuTk9fQ0hBTkdFKSB7CisgICAgICAgIGlmIChTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIodGhpcy5zZXJ2ZXIpLmdldFNlcnZlcigpLmdldFNlcnZlclN0YXRlKCkgPT0gSVNlcnZlci5TVEFURV9TVEFSVEVECisgICAgICAgICAgICAmJiB0aGlzLmRlbHRhS2luZCAhPSBTZXJ2ZXJCZWhhdmlvdXJEZWxlZ2F0ZS5OT19DSEFOR0UpIHsKIAotCQkJU2V0PElNb2R1bGVGaWxlPiBmaWxlcyA9IG5ldyBIYXNoU2V0PElNb2R1bGVGaWxlPigpOwotCQkJLy8gZmlyc3QgY2hlY2sgaWYgb25seSBzdGF0aWMgcmVzb3VyY2VzIGFyZSBjaGFuZ2VkCi0JCQlib29sZWFuIG9ubHlTdGF0aWNSZXNvdXJjZXMgPSB0cnVlOwotCQkJZm9yIChJTW9kdWxlUmVzb3VyY2VEZWx0YSBkIDogZGVsdGEpIHsKLQkJCQlpZiAoIW9ubHlTdGF0aWNSZXNvdXJjZXMoZCwgZmlsZXMpKSB7Ci0JCQkJCW9ubHlTdGF0aWNSZXNvdXJjZXMgPSBmYWxzZTsKLQkJCQkJLy8gZG9uJ3QgYnJlYWsgdG8gZ2V0IGEgZnVsbCBzZXQgb2YgYWxsIGZpbGVzCi0JCQkJfQotCQkJfQorICAgICAgICAgICAgU2V0PElNb2R1bGVGaWxlPiBmaWxlcyA9IG5ldyBIYXNoU2V0PElNb2R1bGVGaWxlPigpOworICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgaWYgb25seSBzdGF0aWMgcmVzb3VyY2VzIGFyZSBjaGFuZ2VkCisgICAgICAgICAgICBib29sZWFuIG9ubHlTdGF0aWNSZXNvdXJjZXMgPSB0cnVlOworICAgICAgICAgICAgZm9yIChJTW9kdWxlUmVzb3VyY2VEZWx0YSBkIDogZGVsdGEpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW9ubHlTdGF0aWNSZXNvdXJjZXMoZCwgZmlsZXMpKSB7CisgICAgICAgICAgICAgICAgICAgIG9ubHlTdGF0aWNSZXNvdXJjZXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgYnJlYWsgdG8gZ2V0IGEgZnVsbCBzZXQgb2YgYWxsIGZpbGVzCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlpZiAoIW9ubHlTdGF0aWNSZXNvdXJjZXMpIHsKLQkJCQkvLyByZWRlcGxveQotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQkvLyByZWZyZXNoIHN0YXRpYyByZXNvdXJjZXMKLQkJCQlmb3IgKElNb2R1bGVGaWxlIGZpbGUgOiBmaWxlcykgewotCQkJCQlzZXJ2ZXIuZ2V0U2VydmVyRGVwbG95ZXIoKS5yZWZyZXNoU3RhdGljKG1vZHVsZSwgZmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgICAgICAgICBpZiAoIW9ubHlTdGF0aWNSZXNvdXJjZXMpIHsKKyAgICAgICAgICAgICAgICAvLyByZWRlcGxveQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyByZWZyZXNoIHN0YXRpYyByZXNvdXJjZXMKKyAgICAgICAgICAgICAgICBmb3IgKElNb2R1bGVGaWxlIGZpbGUgOiBmaWxlcykgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRTZXJ2ZXJEZXBsb3llcigpLnJlZnJlc2hTdGF0aWMobW9kdWxlLCBmaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJQdWJsaXNoVGFzay5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJQdWJsaXNoVGFzay5qYXZhCmluZGV4IDNjNDE1ZmEuLmEyZTVjZDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvU2VydmVyUHVibGlzaFRhc2suamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlclB1Ymxpc2hUYXNrLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0yNCw1NSArMjUsNTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuU2VydmVyQmVoYXZpb3VyRGVsZWdhdGU7CiAKIC8qKgotICoge0BsaW5rIFB1Ymxpc2hPcGVyYXRpb259IGV4dGVuc2lvbiB0aGF0IGRlYWxzIHdpdGggZGVwbG95LCBjbGVhbiBhbmQgcmVmcmVzaAotICogb2YgZG0gU2VydmVyIG1vZHVsZXMuCi0gKiAKKyAqIHtAbGluayBQdWJsaXNoT3BlcmF0aW9ufSBleHRlbnNpb24gdGhhdCBkZWFscyB3aXRoIGRlcGxveSwgY2xlYW4gYW5kIHJlZnJlc2ggb2YgZG0gU2VydmVyIG1vZHVsZXMuCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjAKICAqLwogcHVibGljIGNsYXNzIFNlcnZlclB1Ymxpc2hUYXNrIGV4dGVuZHMgUHVibGlzaFRhc2tEZWxlZ2F0ZSB7CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUHVibGlzaE9wZXJhdGlvbltdIGdldFRhc2tzKElTZXJ2ZXIgc2VydmVyLCBpbnQga2luZCwgTGlzdCBtb2R1bGVzLCBMaXN0IGtpbmRMaXN0KSB7Ci0JCWlmIChtb2R1bGVzID09IG51bGwgfHwgbW9kdWxlcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUHVibGlzaE9wZXJhdGlvbltdIGdldFRhc2tzKElTZXJ2ZXIgc2VydmVyLCBpbnQga2luZCwgTGlzdCBtb2R1bGVzLCBMaXN0IGtpbmRMaXN0KSB7CisgICAgICAgIGlmIChtb2R1bGVzID09IG51bGwgfHwgbW9kdWxlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQlTZXQ8SU1vZHVsZT4gbW9kdWxlc1RvUHVibGlzaCA9IG5ldyBIYXNoU2V0PElNb2R1bGU+KCk7Ci0JCUxpc3Q8U2VydmVyUHVibGlzaE9wZXJhdGlvbj4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PFNlcnZlclB1Ymxpc2hPcGVyYXRpb24+KCk7CisgICAgICAgIFNldDxJTW9kdWxlPiBtb2R1bGVzVG9QdWJsaXNoID0gbmV3IEhhc2hTZXQ8SU1vZHVsZT4oKTsKKyAgICAgICAgTGlzdDxTZXJ2ZXJQdWJsaXNoT3BlcmF0aW9uPiB0YXNrcyA9IG5ldyBBcnJheUxpc3Q8U2VydmVyUHVibGlzaE9wZXJhdGlvbj4oKTsKIAotCQlTZXJ2ZXJCZWhhdmlvdXIgZW5naW5lU2VydmVyID0gKFNlcnZlckJlaGF2aW91cikgc2VydmVyLmxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ci5jbGFzcywgbnVsbCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJSU1vZHVsZVtdIG1vZHVsZSA9IChJTW9kdWxlW10pIG1vZHVsZXMuZ2V0KGkpOworICAgICAgICBTZXJ2ZXJCZWhhdmlvdXIgZW5naW5lU2VydmVyID0gKFNlcnZlckJlaGF2aW91cikgc2VydmVyLmxvYWRBZGFwdGVyKFNlcnZlckJlaGF2aW91ci5jbGFzcywgbnVsbCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgSU1vZHVsZVtdIG1vZHVsZSA9IChJTW9kdWxlW10pIG1vZHVsZXMuZ2V0KGkpOwogCi0JCQlpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSk7Ci0JCQlpZiAoc3RhdGUgIT0gSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUgfHwga2luZCA9PSBJU2VydmVyLlBVQkxJU0hfQ0xFQU4pIHsKLQkJCQlJbnRlZ2VyIGluID0gKEludGVnZXIpIGtpbmRMaXN0LmdldChpKTsKLQkJCQlpZiAoaW4gIT0gU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuTk9fQ0hBTkdFIHx8IGtpbmQgPT0gSVNlcnZlci5QVUJMSVNIX0NMRUFOKSB7Ci0JCQkJCWlmIChtb2R1bGUubGVuZ3RoID09IDEpIHsKLQkJCQkJCWFkZE1vZHVsZVRvUHVibGlzaCh0YXNrcywgbW9kdWxlc1RvUHVibGlzaCwgZW5naW5lU2VydmVyLCBtb2R1bGVbMF0sIGluLCBraW5kKTsKLQkJCQkJfSBlbHNlIGlmIChGYWNldFV0aWxzLmlzUGFyUHJvamVjdChtb2R1bGVbMF0uZ2V0UHJvamVjdCgpKSAmJiBraW5kICE9IElTZXJ2ZXIuUFVCTElTSF9DTEVBTikgewotCQkJCQkJYWRkTW9kdWxlVG9QdWJsaXNoKHRhc2tzLCBtb2R1bGVzVG9QdWJsaXNoLCBlbmdpbmVTZXJ2ZXIsIG1vZHVsZVswXSwgaW4sIGtpbmQpOwotCQkJCQl9IGVsc2UgaWYgKG1vZHVsZS5sZW5ndGggPiAxKSB7Ci0JCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gbW9kdWxlWzBdLmdldFByb2plY3QoKTsKLQkJCQkJCWlmICghRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkgJiYgIUZhY2V0VXRpbHMuaXNQYXJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCQkJYWRkTW9kdWxlVG9QdWJsaXNoKHRhc2tzLCBtb2R1bGVzVG9QdWJsaXNoLCBlbmdpbmVTZXJ2ZXIsIG1vZHVsZVswXSwgaW4sIGtpbmQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgICAgICBpbnQgc3RhdGUgPSBzZXJ2ZXIuZ2V0TW9kdWxlUHVibGlzaFN0YXRlKG1vZHVsZSk7CisgICAgICAgICAgICBpZiAoc3RhdGUgIT0gSVNlcnZlci5QVUJMSVNIX1NUQVRFX05PTkUgfHwga2luZCA9PSBJU2VydmVyLlBVQkxJU0hfQ0xFQU4pIHsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIGluID0gKEludGVnZXIpIGtpbmRMaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW4gIT0gU2VydmVyQmVoYXZpb3VyRGVsZWdhdGUuTk9fQ0hBTkdFIHx8IGtpbmQgPT0gSVNlcnZlci5QVUJMSVNIX0NMRUFOKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGUubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1vZHVsZVRvUHVibGlzaCh0YXNrcywgbW9kdWxlc1RvUHVibGlzaCwgZW5naW5lU2VydmVyLCBtb2R1bGVbMF0sIGluLCBraW5kKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChGYWNldFV0aWxzLmlzUGFyUHJvamVjdChtb2R1bGVbMF0uZ2V0UHJvamVjdCgpKSAmJiBraW5kICE9IElTZXJ2ZXIuUFVCTElTSF9DTEVBTikgeworICAgICAgICAgICAgICAgICAgICAgICAgYWRkTW9kdWxlVG9QdWJsaXNoKHRhc2tzLCBtb2R1bGVzVG9QdWJsaXNoLCBlbmdpbmVTZXJ2ZXIsIG1vZHVsZVswXSwgaW4sIGtpbmQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZHVsZS5sZW5ndGggPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gbW9kdWxlWzBdLmdldFByb2plY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkgJiYgIUZhY2V0VXRpbHMuaXNQYXJQcm9qZWN0KHByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTW9kdWxlVG9QdWJsaXNoKHRhc2tzLCBtb2R1bGVzVG9QdWJsaXNoLCBlbmdpbmVTZXJ2ZXIsIG1vZHVsZVswXSwgaW4sIGtpbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcmV0dXJuIHRhc2tzLnRvQXJyYXkobmV3IFB1Ymxpc2hPcGVyYXRpb25bdGFza3Muc2l6ZSgpXSk7Ci0JfQorICAgICAgICByZXR1cm4gdGFza3MudG9BcnJheShuZXcgUHVibGlzaE9wZXJhdGlvblt0YXNrcy5zaXplKCldKTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgYWRkTW9kdWxlVG9QdWJsaXNoKExpc3Q8U2VydmVyUHVibGlzaE9wZXJhdGlvbj4gdGFza3MsIFNldDxJTW9kdWxlPiBtb2R1bGVzVG9QdWJsaXNoLAotCQkJU2VydmVyQmVoYXZpb3VyIGVuZ2luZVNlcnZlciwgSU1vZHVsZSBtb2R1bGUsIEludGVnZXIgaW4sIGludCBraW5kKSB7CisgICAgcHJpdmF0ZSB2b2lkIGFkZE1vZHVsZVRvUHVibGlzaChMaXN0PFNlcnZlclB1Ymxpc2hPcGVyYXRpb24+IHRhc2tzLCBTZXQ8SU1vZHVsZT4gbW9kdWxlc1RvUHVibGlzaCwgU2VydmVyQmVoYXZpb3VyIGVuZ2luZVNlcnZlciwgSU1vZHVsZSBtb2R1bGUsCisgICAgICAgIEludGVnZXIgaW4sIGludCBraW5kKSB7CiAKLQkJaWYgKCFtb2R1bGVzVG9QdWJsaXNoLmNvbnRhaW5zKG1vZHVsZSkpIHsKLQkJCXRhc2tzLmFkZChuZXcgU2VydmVyUHVibGlzaE9wZXJhdGlvbihlbmdpbmVTZXJ2ZXIsIGtpbmQsIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgaW4uaW50VmFsdWUoKSkpOwotCQkJbW9kdWxlc1RvUHVibGlzaC5hZGQobW9kdWxlKTsKLQkJfQotCX0KKyAgICAgICAgaWYgKCFtb2R1bGVzVG9QdWJsaXNoLmNvbnRhaW5zKG1vZHVsZSkpIHsKKyAgICAgICAgICAgIHRhc2tzLmFkZChuZXcgU2VydmVyUHVibGlzaE9wZXJhdGlvbihlbmdpbmVTZXJ2ZXIsIGtpbmQsIG5ldyBJTW9kdWxlW10geyBtb2R1bGUgfSwgaW4uaW50VmFsdWUoKSkpOworICAgICAgICAgICAgbW9kdWxlc1RvUHVibGlzaC5hZGQobW9kdWxlKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvU2VydmVyUnVudGltZVV0aWxzLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlclJ1bnRpbWVVdGlscy5qYXZhCmluZGV4IDYzNWFkZWMuLmMyOWNmMjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvU2VydmVyUnVudGltZVV0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJSdW50aW1lVXRpbHMuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CkBAIC0yNSw5NiArMjYsOTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKIAogLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRoYXQgYWxsb3dzIGNhbGxiYWNrIG9wZXJhdGlvbnMgd2l0aCB0aGUKLSAqIHtAbGluayBWaXJnb1NlcnZlclJ1bnRpbWV9IHRoYXQgYSBnaXZlbiB7QGxpbmsgSVByb2plY3R9IGlzIHRhcmdldGVkIHRvLgotICogCisgKiBVdGlsaXR5IGNsYXNzIHRoYXQgYWxsb3dzIGNhbGxiYWNrIG9wZXJhdGlvbnMgd2l0aCB0aGUge0BsaW5rIFZpcmdvU2VydmVyUnVudGltZX0gdGhhdCBhIGdpdmVuIHtAbGluayBJUHJvamVjdH0gaXMKKyAqIHRhcmdldGVkIHRvLgorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJSdW50aW1lVXRpbHMgewogCi0JLyoqCi0JICogQ2FsbGJhY2sgaW50ZXJmYWNlIHRvIGRvIGxvZ2ljIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhCi0JICoge0BsaW5rIFZpcmdvU2VydmVyUnVudGltZX0uCi0JICovCi0JcHVibGljIGludGVyZmFjZSBTZXJ2ZXJSdW50aW1lQ2FsbGJhY2sgeworICAgIC8qKgorICAgICAqIENhbGxiYWNrIGludGVyZmFjZSB0byBkbyBsb2dpYyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYSB7QGxpbmsgVmlyZ29TZXJ2ZXJSdW50aW1lfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFNlcnZlclJ1bnRpbWVDYWxsYmFjayB7CiAKLQkJLyoqCi0JCSAqIEV4ZWN1dGUgbG9naWMgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEge0BsaW5rIFZpcmdvU2VydmVyUnVudGltZX0KLQkJICovCi0JCWJvb2xlYW4gZG9XaXRoUnVudGltZShWaXJnb1NlcnZlclJ1bnRpbWUgcnVudGltZSk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBFeGVjdXRlIGxvZ2ljIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhIHtAbGluayBWaXJnb1NlcnZlclJ1bnRpbWV9CisgICAgICAgICAqLworICAgICAgICBib29sZWFuIGRvV2l0aFJ1bnRpbWUoVmlyZ29TZXJ2ZXJSdW50aW1lIHJ1bnRpbWUpOwogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBjYWxsYmFjayB3aXRoIGV2ZXJ5IHtAbGluayBWaXJnb1NlcnZlclJ1bnRpbWV9IHRoYXQKLQkgKiBnaXZlbiB7QGxpbmsgSVByb2plY3R9IGlzIHRhcmdldGVkIGFnYWluc3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgdG8gY2hlY2sgZm9yIHRhcmdldGVkIHJ1bnRpbWVzCi0JICogQHBhcmFtIGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBleGVjdXRlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCwgU2VydmVyUnVudGltZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0JCXRyeSB7Ci0JCQlJRmFjZXRlZFByb2plY3QgZlByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7CisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIGNhbGxiYWNrIHdpdGggZXZlcnkge0BsaW5rIFZpcmdvU2VydmVyUnVudGltZX0gdGhhdCBnaXZlbiB7QGxpbmsgSVByb2plY3R9IGlzIHRhcmdldGVkCisgICAgICogYWdhaW5zdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IHRvIGNoZWNrIGZvciB0YXJnZXRlZCBydW50aW1lcworICAgICAqIEBwYXJhbSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gZXhlY3V0ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIFNlcnZlclJ1bnRpbWVDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwogCi0JCQkvLyBJZiB0aGUgZmFjZXQgZnJhbWV3b3JrcyByZXR1cm5zIG51bGwgd2Ugc2hvdWxkIGp1c3QgZXhpdCBoZXJlCi0JCQlpZiAoZlByb2plY3QgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KKyAgICAgICAgICAgIC8vIElmIHRoZSBmYWNldCBmcmFtZXdvcmtzIHJldHVybnMgbnVsbCB3ZSBzaG91bGQganVzdCBleGl0IGhlcmUKKyAgICAgICAgICAgIGlmIChmUHJvamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCQlvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lIHJ1bnRpbWUgPSBmUHJvamVjdC5nZXRQcmltYXJ5UnVudGltZSgpOwotCQkJLy8gSWYgYSB0YXJnZXRlZCBydW50aW1lIGV4aXN0cyB1c2UgdGhlIGNvbmZpZ3VyZWQgcnVudGltZSBidW5kbGUKLQkJCS8vIHJlcG9zaXRvcnkKLQkJCWlmIChydW50aW1lICE9IG51bGwpIHsKLQkJCQlJUnVudGltZVtdIHNlcnZlclJ1bnRpbWVzID0gU2VydmVyVXRpbC5nZXRSdW50aW1lcyhGYWNldENvcmVQbHVnaW4uQlVORExFX0ZBQ0VUX0lELCBudWxsKTsKLQkJCQlmb3IgKElSdW50aW1lIHNlcnZlclJ1bnRpbWUgOiBzZXJ2ZXJSdW50aW1lcykgewotCQkJCQlpZiAoc2VydmVyUnVudGltZS5nZXROYW1lKCkuZXF1YWxzKHJ1bnRpbWUuZ2V0TmFtZSgpKSkgewotCQkJCQkJaWYgKCFleGVjdXRlQ2FsbGJhY2soY2FsbGJhY2ssIHNlcnZlclJ1bnRpbWUpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gSWYgcHJvamVjdCBpcyB0YXJnZXRlZCB0byBhIHNlcnZlciB1c2UgdGhlIHNlcnZlciB0byBhZGQgbGlicmFyeQotCQkJLy8gcGF0aHMKLQkJCWVsc2UgewotCQkJCUlTZXJ2ZXJbXSBzZXJ2ZXJzID0gU2VydmVyVXRpbC5nZXRTZXJ2ZXJzQnlNb2R1bGUoU2VydmVyVXRpbC5nZXRNb2R1bGUocHJvamVjdCksIG51bGwpOwotCQkJCS8vIENoZWNrIGlmIHRoZSBwcm9qZWN0IGlzIHRhcmdldGVkIGRpcmVjdGx5IHRvIGEgc2VydmVyCi0JCQkJaWYgKHNlcnZlcnMgIT0gbnVsbCAmJiBzZXJ2ZXJzLmxlbmd0aCA+IDApIHsKLQkJCQkJZm9yIChJU2VydmVyIHNlcnZlciA6IHNlcnZlcnMpIHsKLQkJCQkJCWlmICghZXhlY3V0ZUNhbGxiYWNrKGNhbGxiYWNrLCBzZXJ2ZXIuZ2V0UnVudGltZSgpKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIENoZWNrIGlmIHRoZSBwcm9qZWN0IGlzIHBhcnQgb2YgYSBwYXI7IGlmIHNvIGFkZCB0aGUgcGFyCi0JCQkJCS8vIHByb2plY3QgdGFyZ2V0IHRvCi0JCQkJCS8vIHRoZSBzZWFyY2ggcGF0aAotCQkJCQlmb3IgKElQcm9qZWN0IHBhclByb2plY3QgOiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkpIHsKLQkJCQkJCWlmIChGYWNldFV0aWxzLmlzUGFyUHJvamVjdChwYXJQcm9qZWN0KSkgewotCQkJCQkJCVBhciBwYXJEZWZpbml0aW9uID0gRmFjZXRVdGlscy5nZXRQYXJEZWZpbml0aW9uKHBhclByb2plY3QpOwotCQkJCQkJCWlmIChwYXJEZWZpbml0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkJZm9yIChCdW5kbGUgYnVuZGxlIDogcGFyRGVmaW5pdGlvbi5nZXRCdW5kbGUoKSkgewotCQkJCQkJCQkJaWYgKHByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyhidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpKSB7Ci0JCQkJCQkJCQkJZXhlY3V0ZShwYXJQcm9qZWN0LCBjYWxsYmFjayk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZSBydW50aW1lID0gZlByb2plY3QuZ2V0UHJpbWFyeVJ1bnRpbWUoKTsKKyAgICAgICAgICAgIC8vIElmIGEgdGFyZ2V0ZWQgcnVudGltZSBleGlzdHMgdXNlIHRoZSBjb25maWd1cmVkIHJ1bnRpbWUgYnVuZGxlCisgICAgICAgICAgICAvLyByZXBvc2l0b3J5CisgICAgICAgICAgICBpZiAocnVudGltZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSVJ1bnRpbWVbXSBzZXJ2ZXJSdW50aW1lcyA9IFNlcnZlclV0aWwuZ2V0UnVudGltZXMoRmFjZXRDb3JlUGx1Z2luLkJVTkRMRV9GQUNFVF9JRCwgbnVsbCk7CisgICAgICAgICAgICAgICAgZm9yIChJUnVudGltZSBzZXJ2ZXJSdW50aW1lIDogc2VydmVyUnVudGltZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlclJ1bnRpbWUuZ2V0TmFtZSgpLmVxdWFscyhydW50aW1lLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhlY3V0ZUNhbGxiYWNrKGNhbGxiYWNrLCBzZXJ2ZXJSdW50aW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIElmIHByb2plY3QgaXMgdGFyZ2V0ZWQgdG8gYSBzZXJ2ZXIgdXNlIHRoZSBzZXJ2ZXIgdG8gYWRkIGxpYnJhcnkKKyAgICAgICAgICAgIC8vIHBhdGhzCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBJU2VydmVyW10gc2VydmVycyA9IFNlcnZlclV0aWwuZ2V0U2VydmVyc0J5TW9kdWxlKFNlcnZlclV0aWwuZ2V0TW9kdWxlKHByb2plY3QpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvamVjdCBpcyB0YXJnZXRlZCBkaXJlY3RseSB0byBhIHNlcnZlcgorICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJzICE9IG51bGwgJiYgc2VydmVycy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSVNlcnZlciBzZXJ2ZXIgOiBzZXJ2ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV4ZWN1dGVDYWxsYmFjayhjYWxsYmFjaywgc2VydmVyLmdldFJ1bnRpbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvamVjdCBpcyBwYXJ0IG9mIGEgcGFyOyBpZiBzbyBhZGQgdGhlIHBhcgorICAgICAgICAgICAgICAgICAgICAvLyBwcm9qZWN0IHRhcmdldCB0bworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2VhcmNoIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJUHJvamVjdCBwYXJQcm9qZWN0IDogUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRmFjZXRVdGlscy5pc1BhclByb2plY3QocGFyUHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXIgcGFyRGVmaW5pdGlvbiA9IEZhY2V0VXRpbHMuZ2V0UGFyRGVmaW5pdGlvbihwYXJQcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyRGVmaW5pdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IHBhckRlZmluaXRpb24uZ2V0QnVuZGxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0LmdldE5hbWUoKS5lcXVhbHMoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUocGFyUHJvamVjdCwgY2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXhlY3V0ZUNhbGxiYWNrKFNlcnZlclJ1bnRpbWVDYWxsYmFjayBjYWxsYmFjaywgSVJ1bnRpbWUgcnVudGltZSkgewotCQlWaXJnb1NlcnZlclJ1bnRpbWUgc2VydmVyUnVudGltZSA9IChWaXJnb1NlcnZlclJ1bnRpbWUpIHJ1bnRpbWUubG9hZEFkYXB0ZXIoVmlyZ29TZXJ2ZXJSdW50aW1lLmNsYXNzLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWlmIChzZXJ2ZXJSdW50aW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBjYWxsYmFjay5kb1dpdGhSdW50aW1lKHNlcnZlclJ1bnRpbWUpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGV4ZWN1dGVDYWxsYmFjayhTZXJ2ZXJSdW50aW1lQ2FsbGJhY2sgY2FsbGJhY2ssIElSdW50aW1lIHJ1bnRpbWUpIHsKKyAgICAgICAgVmlyZ29TZXJ2ZXJSdW50aW1lIHNlcnZlclJ1bnRpbWUgPSAoVmlyZ29TZXJ2ZXJSdW50aW1lKSBydW50aW1lLmxvYWRBZGFwdGVyKFZpcmdvU2VydmVyUnVudGltZS5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisgICAgICAgIGlmIChzZXJ2ZXJSdW50aW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjYWxsYmFjay5kb1dpdGhSdW50aW1lKHNlcnZlclJ1bnRpbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZS5qYXZhCmluZGV4IDU2YTM4MGEuLmYxOTQwYTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvU2VydmVyU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlclNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0zMCw0OCArMzEsNDQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKIAogLyoqCi0gKiB7QGxpbmsgSVNvdXJjZVBhdGhDb21wdXRlckRlbGVnYXRlfSB0aGF0IHNldHMgdXAgdGhlIHNvdXJjZSBmb2xkZXIgb2YgdGhlIGRtCi0gKiBzZXJ2ZXIgcnVudGltZSBzZXJ2ZXIuCi0gKiAKKyAqIHtAbGluayBJU291cmNlUGF0aENvbXB1dGVyRGVsZWdhdGV9IHRoYXQgc2V0cyB1cCB0aGUgc291cmNlIGZvbGRlciBvZiB0aGUgZG0gc2VydmVyIHJ1bnRpbWUgc2VydmVyLgorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElTb3VyY2VQYXRoQ29tcHV0ZXJEZWxlZ2F0ZSB7CiAKLQlwdWJsaWMgSVNvdXJjZUNvbnRhaW5lcltdIGNvbXB1dGVTb3VyY2VDb250YWluZXJzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgSVNvdXJjZUNvbnRhaW5lcltdIGNvbXB1dGVTb3VyY2VDb250YWluZXJzKElMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCi0JCUxpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gcnVudGltZUNsYXNzcGF0aCA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4oKTsKLQkJSVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcihjb25maWd1cmF0aW9uKTsKKyAgICAgICAgTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBydW50aW1lQ2xhc3NwYXRoID0gbmV3IEFycmF5TGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PigpOworICAgICAgICBJU2VydmVyIHNlcnZlciA9IFNlcnZlclV0aWwuZ2V0U2VydmVyKGNvbmZpZ3VyYXRpb24pOwogCi0JCUlNb2R1bGVbXSBtb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsKLQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IG1vZHVsZXMpIHsKLQkJCWlmIChtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkuZXF1YWxzKEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQpKSB7Ci0JCQkJYWRkUnVudGltZUNsYXNzcGF0aEZvckphdmFQcm9qZWN0KHJ1bnRpbWVDbGFzc3BhdGgsIG1vZHVsZSk7Ci0JCQl9IGVsc2UgaWYgKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKS5lcXVhbHMoRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRCkpIHsKLQkJCQlTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZSBtb2R1bGVEZWxlZ2F0ZSA9IChTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZSkgbW9kdWxlCi0JCQkJCQkubG9hZEFkYXB0ZXIoU2VydmVyTW9kdWxlRGVsZWdhdGUuY2xhc3MsIG51bGwpOwotCQkJCWlmIChtb2R1bGVEZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQkJCUlNb2R1bGVbXSBjaGlsZHJlbiA9IG1vZHVsZURlbGVnYXRlLmdldENoaWxkTW9kdWxlcygpOwotCQkJCQlmb3IgKElNb2R1bGUgY2hpbGQgOiBjaGlsZHJlbikgewotCQkJCQkJYWRkUnVudGltZUNsYXNzcGF0aEZvckphdmFQcm9qZWN0KHJ1bnRpbWVDbGFzc3BhdGgsIGNoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAobW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpLmVxdWFscyhGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKSkgewotCQkJCWFkZFJ1bnRpbWVDbGFzc3BhdGhGb3JKYXZhUHJvamVjdChydW50aW1lQ2xhc3NwYXRoLCBtb2R1bGUpOwotCQkJfQotCQl9CisgICAgICAgIElNb2R1bGVbXSBtb2R1bGVzID0gc2VydmVyLmdldE1vZHVsZXMoKTsKKyAgICAgICAgZm9yIChJTW9kdWxlIG1vZHVsZSA6IG1vZHVsZXMpIHsKKyAgICAgICAgICAgIGlmIChtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkuZXF1YWxzKEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQpKSB7CisgICAgICAgICAgICAgICAgYWRkUnVudGltZUNsYXNzcGF0aEZvckphdmFQcm9qZWN0KHJ1bnRpbWVDbGFzc3BhdGgsIG1vZHVsZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKS5lcXVhbHMoRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRCkpIHsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZSBtb2R1bGVEZWxlZ2F0ZSA9IChTZXJ2ZXJNb2R1bGVEZWxlZ2F0ZSkgbW9kdWxlLmxvYWRBZGFwdGVyKFNlcnZlck1vZHVsZURlbGVnYXRlLmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobW9kdWxlRGVsZWdhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJTW9kdWxlW10gY2hpbGRyZW4gPSBtb2R1bGVEZWxlZ2F0ZS5nZXRDaGlsZE1vZHVsZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJTW9kdWxlIGNoaWxkIDogY2hpbGRyZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJ1bnRpbWVDbGFzc3BhdGhGb3JKYXZhUHJvamVjdChydW50aW1lQ2xhc3NwYXRoLCBjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKS5lcXVhbHMoRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRCkpIHsKKyAgICAgICAgICAgICAgICBhZGRSdW50aW1lQ2xhc3NwYXRoRm9ySmF2YVByb2plY3QocnVudGltZUNsYXNzcGF0aCwgbW9kdWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXJ1bnRpbWVDbGFzc3BhdGguYWRkQWxsKEFycmF5cy5hc0xpc3QoSmF2YVJ1bnRpbWUuY29tcHV0ZVVucmVzb2x2ZWRTb3VyY2VMb29rdXBQYXRoKGNvbmZpZ3VyYXRpb24pKSk7Ci0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gcnVudGltZUNsYXNzcGF0aAotCQkJCS50b0FycmF5KG5ldyBJUnVudGltZUNsYXNzcGF0aEVudHJ5W3J1bnRpbWVDbGFzc3BhdGguc2l6ZSgpXSk7Ci0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSByZXNvbHZlZCA9IEphdmFSdW50aW1lLnJlc29sdmVTb3VyY2VMb29rdXBQYXRoKGVudHJpZXMsIGNvbmZpZ3VyYXRpb24pOwotCQlyZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0U291cmNlQ29udGFpbmVycyhyZXNvbHZlZCk7Ci0JfQorICAgICAgICBydW50aW1lQ2xhc3NwYXRoLmFkZEFsbChBcnJheXMuYXNMaXN0KEphdmFSdW50aW1lLmNvbXB1dGVVbnJlc29sdmVkU291cmNlTG9va3VwUGF0aChjb25maWd1cmF0aW9uKSkpOworICAgICAgICBJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IHJ1bnRpbWVDbGFzc3BhdGgudG9BcnJheShuZXcgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtydW50aW1lQ2xhc3NwYXRoLnNpemUoKV0pOworICAgICAgICBJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gcmVzb2x2ZWQgPSBKYXZhUnVudGltZS5yZXNvbHZlU291cmNlTG9va3VwUGF0aChlbnRyaWVzLCBjb25maWd1cmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIEphdmFSdW50aW1lLmdldFNvdXJjZUNvbnRhaW5lcnMocmVzb2x2ZWQpOworICAgIH0KIAotCXByaXZhdGUgdm9pZCBhZGRSdW50aW1lQ2xhc3NwYXRoRm9ySmF2YVByb2plY3QoTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBydW50aW1lQ2xhc3NwYXRoLCBJTW9kdWxlIG1vZHVsZSkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUobW9kdWxlLmdldFByb2plY3QoKSk7Ci0JCXJ1bnRpbWVDbGFzc3BhdGguYWRkKEphdmFSdW50aW1lLm5ld0RlZmF1bHRQcm9qZWN0Q2xhc3NwYXRoRW50cnkoamF2YVByb2plY3QpKTsKLQl9CisgICAgcHJpdmF0ZSB2b2lkIGFkZFJ1bnRpbWVDbGFzc3BhdGhGb3JKYXZhUHJvamVjdChMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+IHJ1bnRpbWVDbGFzc3BhdGgsIElNb2R1bGUgbW9kdWxlKSB7CisgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShtb2R1bGUuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgcnVudGltZUNsYXNzcGF0aC5hZGQoSmF2YVJ1bnRpbWUubmV3RGVmYXVsdFByb2plY3RDbGFzc3BhdGhFbnRyeShqYXZhUHJvamVjdCkpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9TZXJ2ZXJTdGF0dXNQaW5nVGhyZWFkLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlclN0YXR1c1BpbmdUaHJlYWQuamF2YQppbmRleCBjN2U3YjNmLi44MzhjMTdjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlclN0YXR1c1BpbmdUaHJlYWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1NlcnZlclN0YXR1c1BpbmdUaHJlYWQuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTE1LDg4ICsxNiw4NyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUudXRpbHMuU3RhdHVzVXRpbDsKIAogLyoqCi0gKiBQaW5nIHRocmVhZCB0aGUgdHJpZXMgdG8gY29ubmVjdCB0byB0aGUgZG0gc2VydmVyIGFuZCBsaXN0ZW5zIHRvIHRoZSByZWNvdmVyeQotICogbm90aWZpY2F0aW9uLgorICogUGluZyB0aHJlYWQgdGhlIHRyaWVzIHRvIGNvbm5lY3QgdG8gdGhlIGRtIHNlcnZlciBhbmQgbGlzdGVucyB0byB0aGUgcmVjb3Zlcnkgbm90aWZpY2F0aW9uLgogICogPHA+Ci0gKiBUaGlzIGlzIHVzZWQgdG8gdGVzdCBpZiBhIHNlcnZlciBpcyBydW5uaW5nIGFmdGVyIGl0IGhhcyBiZWVuIHN0YXJ0ZWQgYnkgdGhlCi0gKiBzZXJ2ZXIgdmlldy4KLSAqIAorICogVGhpcyBpcyB1c2VkIHRvIHRlc3QgaWYgYSBzZXJ2ZXIgaXMgcnVubmluZyBhZnRlciBpdCBoYXMgYmVlbiBzdGFydGVkIGJ5IHRoZSBzZXJ2ZXIgdmlldy4KKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgU2VydmVyU3RhdHVzUGluZ1RocmVhZCB7CiAKLQkvKiogRGVsYXkgYWZ0ZXIgd2hpY2ggdGhlIHRocmVhZCBzaG91bGQgc3RhcnQgcGluZ2luZyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSU5HX0RFTEFZID0gMzAwMDsKKyAgICAvKiogRGVsYXkgYWZ0ZXIgd2hpY2ggdGhlIHRocmVhZCBzaG91bGQgc3RhcnQgcGluZ2luZyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSU5HX0RFTEFZID0gMzAwMDsKIAotCS8qKiBJbnRlcnZhbCBpbiB3aGljaCB0aGUgdGhyZWFkIHRvIHBpbmcgdGhlIHNlcnZlciAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSU5HX0lOVEVSVkFMID0gMTAwMDsKKyAgICAvKiogSW50ZXJ2YWwgaW4gd2hpY2ggdGhlIHRocmVhZCB0byBwaW5nIHRoZSBzZXJ2ZXIgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUElOR19JTlRFUlZBTCA9IDEwMDA7CiAKLQkvKiogSW5kaWNhdGUgdGhhdCB0aGUgdGhyZWFkIHNob3VsZCBzdG9wIHBpbmdpbmcgKi8KLQlwcml2YXRlIGJvb2xlYW4gc3RvcCA9IGZhbHNlOworICAgIC8qKiBJbmRpY2F0ZSB0aGF0IHRoZSB0aHJlYWQgc2hvdWxkIHN0b3AgcGluZ2luZyAqLworICAgIHByaXZhdGUgYm9vbGVhbiBzdG9wID0gZmFsc2U7CiAKLQkvKiogUmVmZXJlbmNlIHRvIHRoZSBzZXJ2ZXIgdGhlIHVzZXIgaGFzIHN0YXJ0ZWQgb24gdGhlIFVJICovCi0JcHJpdmF0ZSBmaW5hbCBTZXJ2ZXJCZWhhdmlvdXIgYmVoYXZpb3VyOworICAgIC8qKiBSZWZlcmVuY2UgdG8gdGhlIHNlcnZlciB0aGUgdXNlciBoYXMgc3RhcnRlZCBvbiB0aGUgVUkgKi8KKyAgICBwcml2YXRlIGZpbmFsIFNlcnZlckJlaGF2aW91ciBiZWhhdmlvdXI7CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBTZXJ2ZXJTdGF0dXNQaW5nVGhyZWFkfQotCSAqLwotCXByb3RlY3RlZCBTZXJ2ZXJTdGF0dXNQaW5nVGhyZWFkKFNlcnZlckJlaGF2aW91ciBiZWhhdmlvdXIpIHsKLQkJdGhpcy5iZWhhdmlvdXIgPSBiZWhhdmlvdXI7Ci0JCVRocmVhZCB0ID0gbmV3IFRocmVhZCgiU3ByaW5nU291cmNlIGRtIFNlcnZlciBQaW5nIFRocmVhZCIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXBpbmcoKTsKLQkJCX0KLQkJfTsKLQkJdC5zZXREYWVtb24odHJ1ZSk7Ci0JCXQuc3RhcnQoKTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgU2VydmVyU3RhdHVzUGluZ1RocmVhZH0KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2VydmVyU3RhdHVzUGluZ1RocmVhZChTZXJ2ZXJCZWhhdmlvdXIgYmVoYXZpb3VyKSB7CisgICAgICAgIHRoaXMuYmVoYXZpb3VyID0gYmVoYXZpb3VyOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoIlNwcmluZ1NvdXJjZSBkbSBTZXJ2ZXIgUGluZyBUaHJlYWQiKSB7CiAKLQlwcm90ZWN0ZWQgdm9pZCBwaW5nKCkgewotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKFBJTkdfREVMQVkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJd2hpbGUgKCFzdG9wKSB7Ci0JCQl0cnkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgcGluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0LnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgdC5zdGFydCgpOworICAgIH0KIAotCQkJCUJvb2xlYW4gdmFsdWUgPSBiZWhhdmlvdXIuZ2V0U2VydmVyRGVwbG95ZXIoKS5waW5nKCk7Ci0JCQkJaWYgKCFzdG9wICYmIHZhbHVlICE9IG51bGwgJiYgdmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJLy8gcGluZyB3b3JrZWQgLSBzZXJ2ZXIgaXMgdXAKLQkJCQkJc3RvcCA9IHRydWU7Ci0JCQkJCWJlaGF2aW91ci5zZXRTZXJ2ZXJTdGFydGVkKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2xlZXAoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBzZSkgewotCQkJCXNsZWVwKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0YXR1c1V0aWwuZXJyb3IoIlNlcnZlciBzdGFydHVwIHBpbmcgZmFpbGVkIiwgZSk7Ci0JCQkJLy8gcGluZ2luZyBmYWlsZWQKLQkJCQlpZiAoIXN0b3ApIHsKLQkJCQkJc2xlZXAoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgcGluZygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChQSU5HX0RFTEFZKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICB9CisgICAgICAgIHdoaWxlICghdGhpcy5zdG9wKSB7CisgICAgICAgICAgICB0cnkgewogCi0JLyoqCi0JICogU2VuZHMgdGhpcyB0aHJlYWQgdG8gc2xlZXAgZm9yIHRoZSBjb25maWd1cmVkIHRpbWVvdXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2xlZXAoKSB7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoUElOR19JTlRFUlZBTCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KKyAgICAgICAgICAgICAgICBCb29sZWFuIHZhbHVlID0gdGhpcy5iZWhhdmlvdXIuZ2V0U2VydmVyRGVwbG95ZXIoKS5waW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnN0b3AgJiYgdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5ib29sZWFuVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBwaW5nIHdvcmtlZCAtIHNlcnZlciBpcyB1cAorICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3AgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0aGlzLmJlaGF2aW91ci5zZXRTZXJ2ZXJTdGFydGVkKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2xlZXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIHNsZWVwKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN0YXR1c1V0aWwuZXJyb3IoIlNlcnZlciBzdGFydHVwIHBpbmcgZmFpbGVkIiwgZSk7CisgICAgICAgICAgICAgICAgLy8gcGluZ2luZyBmYWlsZWQKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3RvcCkgeworICAgICAgICAgICAgICAgICAgICBzbGVlcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFN0b3BzIHRoaXMgdGhyZWFkIGZyb20gcGluZ2luZyB0aGUgZG0gU2VydmVyIGluc3RhbmNlCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJc3RvcCA9IHRydWU7Ci0JfQorICAgIC8qKgorICAgICAqIFNlbmRzIHRoaXMgdGhyZWFkIHRvIHNsZWVwIGZvciB0aGUgY29uZmlndXJlZCB0aW1lb3V0CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNsZWVwKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFBJTkdfSU5URVJWQUwpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGlzIHRocmVhZCBmcm9tIHBpbmdpbmcgdGhlIGRtIFNlcnZlciBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHRoaXMuc3RvcCA9IHRydWU7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1ZpcmdvU2VydmVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1ZpcmdvU2VydmVyLmphdmEKaW5kZXggYzUwNGIxNi4uZmQ2YWZiMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9WaXJnb1NlcnZlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvVmlyZ29TZXJ2ZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyOwpAQCAtMTUsMjQgKzE2LDI1IEBACiAKIC8qKgogICogRGVmYXVsdCBWaXJnbyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCi0gKiAKKyAqCiAgKiBAYXV0aG9yIFRlcnJ5IEhvbgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjAKICAqLwogcHVibGljIGNsYXNzIFZpcmdvU2VydmVyIGV4dGVuZHMgU2VydmVyIGltcGxlbWVudHMgSVNlcnZlciwgSVNlcnZlcldvcmtpbmdDb3B5IHsKIAotCXB1YmxpYyBWaXJnb1NlcnZlclJ1bnRpbWUgZ2V0UnVudGltZSgpIHsKLQkJaWYgKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWaXJnb1NlcnZlclJ1bnRpbWUgZ2V0UnVudGltZSgpIHsKKyAgICAgICAgaWYgKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JCXJldHVybiAoVmlyZ29TZXJ2ZXJSdW50aW1lKSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoVmlyZ29TZXJ2ZXJSdW50aW1lLmNsYXNzLCBudWxsKTsKLQl9CisgICAgICAgIHJldHVybiAoVmlyZ29TZXJ2ZXJSdW50aW1lKSBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkubG9hZEFkYXB0ZXIoVmlyZ29TZXJ2ZXJSdW50aW1lLmNsYXNzLCBudWxsKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7Ci0JCXJldHVybiAiVmlyZ28gU2VydmVyIjsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gIlZpcmdvIFNlcnZlciI7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1ZpcmdvU2VydmVyQmVoYXZpb3VyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1ZpcmdvU2VydmVyQmVoYXZpb3VyLmphdmEKaW5kZXggNWY3ZDczMi4uMDUxY2Q3ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9WaXJnb1NlcnZlckJlaGF2aW91ci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvVmlyZ29TZXJ2ZXJCZWhhdmlvdXIuamF2YQpAQCAtOCwyMiArOCwyMyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJCZWhhdmlvdXI7CiAKIC8qKgogICogRGVmYXVsdCBWaXJnbyBzZXJ2ZXIgYmVoYXZpb3IuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIFRlcnJ5IEhvbgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjAKICAqLwogcHVibGljIGNsYXNzIFZpcmdvU2VydmVyQmVoYXZpb3VyIGV4dGVuZHMgU2VydmVyQmVoYXZpb3VyIGltcGxlbWVudHMgSVNlcnZlckJlaGF2aW91ciB7CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlZpcmdvIFNlcnZlciI7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiVmlyZ28gU2VydmVyIjsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvVmlyZ29TZXJ2ZXJSdW50aW1lLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL1ZpcmdvU2VydmVyUnVudGltZS5qYXZhCmluZGV4IDY3NzRjMWIuLjU5M2ZlMDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvVmlyZ29TZXJ2ZXJSdW50aW1lLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9WaXJnb1NlcnZlclJ1bnRpbWUuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC0yOCwxMTYgKzI5LDExNiBAQAogCiAvKioKICAqIFZpcmdvIHNlcnZlciBydW50aW1lIGltcGxlbWVudGF0aW9uLiBEZWxlZ2F0ZXMgdG8gaGFuZGxlcnMuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgVmlyZ29TZXJ2ZXJSdW50aW1lIGV4dGVuZHMgUnVudGltZURlbGVnYXRlIGltcGxlbWVudHMgSVNlcnZlclJ1bnRpbWUsIElTZXJ2ZXJSdW50aW1lV29ya2luZ0NvcHkgewogCi0JcHVibGljIExpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gZ2V0UnVudGltZUNsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIGdldFZpcmdvVmVyc2lvbigpLmdldFJ1bnRpbWVDbGFzc3BhdGgoZ2V0UnVudGltZSgpLmdldExvY2F0aW9uKCkpOwotCX0KKyAgICBwdWJsaWMgTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBnZXRSdW50aW1lQ2xhc3NwYXRoKCkgeworICAgICAgICByZXR1cm4gZ2V0VmlyZ29WZXJzaW9uKCkuZ2V0UnVudGltZUNsYXNzcGF0aChnZXRSdW50aW1lKCkuZ2V0TG9jYXRpb24oKSk7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lQ2xhc3MoKSB7Ci0JCXJldHVybiBnZXRWaXJnb1ZlcnNpb24oKS5nZXRSdW50aW1lQ2xhc3MoKTsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRSdW50aW1lQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBnZXRWaXJnb1ZlcnNpb24oKS5nZXRSdW50aW1lQ2xhc3MoKTsKKyAgICB9CiAKLQlwdWJsaWMgSVZNSW5zdGFsbCBnZXRWTUluc3RhbGwoKSB7Ci0JCWlmIChnZXRWTUluc3RhbGxUeXBlSWQoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlJVk1JbnN0YWxsW10gdm1JbnN0YWxscyA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGUoZ2V0Vk1JbnN0YWxsVHlwZUlkKCkpLmdldFZNSW5zdGFsbHMoKTsKLQkJCVN0cmluZyBpZCA9IGdldFZNSW5zdGFsbElkKCk7Ci0JCQlmb3IgKElWTUluc3RhbGwgdm1JbnN0YWxsIDogdm1JbnN0YWxscykgewotCQkJCWlmIChpZC5lcXVhbHModm1JbnN0YWxsLmdldElkKCkpKSB7Ci0JCQkJCXJldHVybiB2bUluc3RhbGw7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwdWJsaWMgSVZNSW5zdGFsbCBnZXRWTUluc3RhbGwoKSB7CisgICAgICAgIGlmIChnZXRWTUluc3RhbGxUeXBlSWQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0RGVmYXVsdFZNSW5zdGFsbCgpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJVk1JbnN0YWxsW10gdm1JbnN0YWxscyA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGUoZ2V0Vk1JbnN0YWxsVHlwZUlkKCkpLmdldFZNSW5zdGFsbHMoKTsKKyAgICAgICAgICAgIFN0cmluZyBpZCA9IGdldFZNSW5zdGFsbElkKCk7CisgICAgICAgICAgICBmb3IgKElWTUluc3RhbGwgdm1JbnN0YWxsIDogdm1JbnN0YWxscykgeworICAgICAgICAgICAgICAgIGlmIChpZC5lcXVhbHModm1JbnN0YWxsLmdldElkKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2bUluc3RhbGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXB1YmxpYyBib29sZWFuIGlzVXNpbmdEZWZhdWx0SlJFKCkgewotCQlyZXR1cm4gZ2V0Vk1JbnN0YWxsVHlwZUlkKCkgPT0gbnVsbDsKLQl9CisgICAgcHVibGljIGJvb2xlYW4gaXNVc2luZ0RlZmF1bHRKUkUoKSB7CisgICAgICAgIHJldHVybiBnZXRWTUluc3RhbGxUeXBlSWQoKSA9PSBudWxsOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJUnVudGltZVR5cGUgdHlwZSA9IGdldFJ1bnRpbWVXb3JraW5nQ29weSgpLmdldFJ1bnRpbWVUeXBlKCk7Ci0JCWdldFJ1bnRpbWVXb3JraW5nQ29weSgpLnNldExvY2F0aW9uKG5ldyBQYXRoKFNlcnZlckNvcmVQbHVnaW4uZ2V0UHJlZmVyZW5jZSgibG9jYXRpb24iICsgdHlwZS5nZXRJZCgpKSkpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKyAgICAgICAgSVJ1bnRpbWVUeXBlIHR5cGUgPSBnZXRSdW50aW1lV29ya2luZ0NvcHkoKS5nZXRSdW50aW1lVHlwZSgpOworICAgICAgICBnZXRSdW50aW1lV29ya2luZ0NvcHkoKS5zZXRMb2NhdGlvbihuZXcgUGF0aChTZXJ2ZXJDb3JlUGx1Z2luLmdldFByZWZlcmVuY2UoImxvY2F0aW9uIiArIHR5cGUuZ2V0SWQoKSkpKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzZXRWTUluc3RhbGwoSVZNSW5zdGFsbCB2bUluc3RhbGwpIHsKLQkJaWYgKHZtSW5zdGFsbCA9PSBudWxsKSB7Ci0JCQlzZXRWTUluc3RhbGwobnVsbCwgbnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRWTUluc3RhbGwodm1JbnN0YWxsLmdldFZNSW5zdGFsbFR5cGUoKS5nZXRJZCgpLCB2bUluc3RhbGwuZ2V0SWQoKSk7Ci0JCX0KLQl9CisgICAgcHVibGljIHZvaWQgc2V0Vk1JbnN0YWxsKElWTUluc3RhbGwgdm1JbnN0YWxsKSB7CisgICAgICAgIGlmICh2bUluc3RhbGwgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0Vk1JbnN0YWxsKG51bGwsIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0Vk1JbnN0YWxsKHZtSW5zdGFsbC5nZXRWTUluc3RhbGxUeXBlKCkuZ2V0SWQoKSwgdm1JbnN0YWxsLmdldElkKCkpOworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIudmFsaWRhdGUoKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElTdGF0dXMgdmFsaWRhdGUoKSB7CisgICAgICAgIElTdGF0dXMgc3RhdHVzID0gc3VwZXIudmFsaWRhdGUoKTsKKyAgICAgICAgaWYgKCFzdGF0dXMuaXNPSygpKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKLQkJcmV0dXJuIGdldFZpcmdvVmVyc2lvbigpLnZlcmlmeUluc3RhbGxhdGlvbihnZXRSdW50aW1lKCkpOwotCQkvLyB9CisgICAgICAgIHJldHVybiBnZXRWaXJnb1ZlcnNpb24oKS52ZXJpZnlJbnN0YWxsYXRpb24oZ2V0UnVudGltZSgpKTsKKyAgICAgICAgLy8gfQogCi0JCS8vIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICAgICAgLy8gcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisgICAgfQogCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWTUluc3RhbGxJZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QRVJUWV9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKSBudWxsKTsKLQl9CisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWTUluc3RhbGxJZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QRVJUWV9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKSBudWxsKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZNSW5zdGFsbFR5cGVJZCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QRVJUWV9WTV9JTlNUQUxMX1RZUEVfSUQsIChTdHJpbmcpIG51bGwpOwotCX0KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZNSW5zdGFsbFR5cGVJZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZShQUk9QRVJUWV9WTV9JTlNUQUxMX1RZUEVfSUQsIChTdHJpbmcpIG51bGwpOworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIHNldFZNSW5zdGFsbChTdHJpbmcgdHlwZUlkLCBTdHJpbmcgaWQpIHsKLQkJaWYgKHR5cGVJZCA9PSBudWxsKSB7Ci0JCQlzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfVk1fSU5TVEFMTF9UWVBFX0lELCAoU3RyaW5nKSBudWxsKTsKLQkJfSBlbHNlIHsKLQkJCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9WTV9JTlNUQUxMX1RZUEVfSUQsIHR5cGVJZCk7Ci0JCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRWTUluc3RhbGwoU3RyaW5nIHR5cGVJZCwgU3RyaW5nIGlkKSB7CisgICAgICAgIGlmICh0eXBlSWQgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0QXR0cmlidXRlKFBST1BFUlRZX1ZNX0lOU1RBTExfVFlQRV9JRCwgKFN0cmluZykgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfVk1fSU5TVEFMTF9UWVBFX0lELCB0eXBlSWQpOworICAgICAgICB9CiAKLQkJaWYgKGlkID09IG51bGwpIHsKLQkJCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9WTV9JTlNUQUxMX0lELCAoU3RyaW5nKSBudWxsKTsKLQkJfSBlbHNlIHsKLQkJCXNldEF0dHJpYnV0ZShQUk9QRVJUWV9WTV9JTlNUQUxMX0lELCBpZCk7Ci0JCX0KLQl9CisgICAgICAgIGlmIChpZCA9PSBudWxsKSB7CisgICAgICAgICAgICBzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfVk1fSU5TVEFMTF9JRCwgKFN0cmluZykgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfVk1fSU5TVEFMTF9JRCwgaWQpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRVc2VyTGV2ZWxCdW5kbGVSZXBvc2l0b3J5UGF0aCgpIHsKLQkJcmV0dXJuIGdldFZpcmdvVmVyc2lvbigpLmdldFVzZXJMZXZlbEJ1bmRsZVJlcG9zaXRvcnlQYXRoKGdldFJ1bnRpbWUoKSk7Ci0JfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckxldmVsQnVuZGxlUmVwb3NpdG9yeVBhdGgoKSB7CisgICAgICAgIHJldHVybiBnZXRWaXJnb1ZlcnNpb24oKS5nZXRVc2VyTGV2ZWxCdW5kbGVSZXBvc2l0b3J5UGF0aChnZXRSdW50aW1lKCkpOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlckxldmVsTGlicmFyeVJlcG9zaXRvcnlQYXRoKCkgewotCQlyZXR1cm4gZ2V0VmlyZ29WZXJzaW9uKCkuZ2V0VXNlckxldmVsTGlicmFyeVJlcG9zaXRvcnlQYXRoKGdldFJ1bnRpbWUoKSk7Ci0JfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckxldmVsTGlicmFyeVJlcG9zaXRvcnlQYXRoKCkgeworICAgICAgICByZXR1cm4gZ2V0VmlyZ29WZXJzaW9uKCkuZ2V0VXNlckxldmVsTGlicmFyeVJlcG9zaXRvcnlQYXRoKGdldFJ1bnRpbWUoKSk7CisgICAgfQogCi0JcHVibGljIFN0cmluZyBnZXRQcm9maWxlUGF0aCgpIHsKLQkJcmV0dXJuIGdldFZpcmdvVmVyc2lvbigpLmdldFByb2ZpbGVQYXRoKGdldFJ1bnRpbWUoKSk7Ci0JfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZVBhdGgoKSB7CisgICAgICAgIHJldHVybiBnZXRWaXJnb1ZlcnNpb24oKS5nZXRQcm9maWxlUGF0aChnZXRSdW50aW1lKCkpOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnUGF0aCgpIHsKLQkJcmV0dXJuIGdldFZpcmdvVmVyc2lvbigpLmdldENvbmZpZ1BhdGgoZ2V0UnVudGltZSgpKTsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWdQYXRoKCkgeworICAgICAgICByZXR1cm4gZ2V0VmlyZ29WZXJzaW9uKCkuZ2V0Q29uZmlnUGF0aChnZXRSdW50aW1lKCkpOworICAgIH0KIAotCXB1YmxpYyBJU2VydmVyUnVudGltZVByb3ZpZGVyIGdldFZpcmdvVmVyc2lvbigpIHsKLQkJcmV0dXJuIFJ1bnRpbWVQcm92aWRlcnMuZ2V0UnVudGltZVByb3ZpZGVyKGdldFJ1bnRpbWUoKSk7Ci0JfQorICAgIHB1YmxpYyBJU2VydmVyUnVudGltZVByb3ZpZGVyIGdldFZpcmdvVmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIFJ1bnRpbWVQcm92aWRlcnMuZ2V0UnVudGltZVByb3ZpZGVyKGdldFJ1bnRpbWUoKSk7CisgICAgfQogCi0JLy8gLyoqCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVdvcmtpbmdDb3B5I3NldFZpcmdvVmVyc2lvbihqYXZhLmxhbmcuU3RyaW5nKQotCS8vICovCi0JLy8gcHVibGljIHZvaWQgc2V0VmlyZ29WZXJzaW9uKElTZXJ2ZXJWZXJzaW9uSGFuZGxlciBoYW5kbGVyKSB7Ci0JLy8gc2V0QXR0cmlidXRlKFBST1BFUlRZX1ZJUkdPX1ZFUlNJT05fVFlQRV9JRCwKLQkvLyBTZXJ2ZXJWZXJzaW9uQWRhcHRlci5nZXRWZXJzaW9uSUQoaGFuZGxlcikpOwotCS8vIH0KKyAgICAvLyAvKioKKyAgICAvLyAqIEBzZWUKKyAgICAvLyBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lV29ya2luZ0NvcHkjc2V0VmlyZ29WZXJzaW9uKGphdmEubGFuZy5TdHJpbmcpCisgICAgLy8gKi8KKyAgICAvLyBwdWJsaWMgdm9pZCBzZXRWaXJnb1ZlcnNpb24oSVNlcnZlclZlcnNpb25IYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAvLyBzZXRBdHRyaWJ1dGUoUFJPUEVSVFlfVklSR09fVkVSU0lPTl9UWVBFX0lELAorICAgIC8vIFNlcnZlclZlcnNpb25BZGFwdGVyLmdldFZlcnNpb25JRChoYW5kbGVyKSk7CisgICAgLy8gfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9hY3Rpb25zL01vZGlmeUFydGVmYWN0T3JkZXJDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2FjdGlvbnMvTW9kaWZ5QXJ0ZWZhY3RPcmRlckNvbW1hbmQuamF2YQppbmRleCBhYzNhOTlkLi44ZDZlMjNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2FjdGlvbnMvTW9kaWZ5QXJ0ZWZhY3RPcmRlckNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2FjdGlvbnMvTW9kaWZ5QXJ0ZWZhY3RPcmRlckNvbW1hbmQuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLmFjdGlvbnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTIyLDQxICsyMyw0MSBAQAogCiAvKioKICAqIHtAbGluayBBYnN0cmFjdE9wZXJhdGlvbn0gdG8gbW9kaWZ5IHRoZSBhcnRlZmFjdCBkZXBsb3ltZW50IG9yZGVyLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjIKICAqLwogcHVibGljIGNsYXNzIE1vZGlmeUFydGVmYWN0T3JkZXJDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gewogCi0JcHJpdmF0ZSBJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHk7CisgICAgcHJpdmF0ZSBmaW5hbCBJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHk7CiAKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBvbGRPcmRlcjsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBvbGRPcmRlcjsKIAotCXByaXZhdGUgTGlzdDxTdHJpbmc+IG5ld09yZGVyOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IG5ld09yZGVyOwogCi0JcHVibGljIE1vZGlmeUFydGVmYWN0T3JkZXJDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSwgTGlzdDxTdHJpbmc+IG5ld09yZGVyKSB7Ci0JCXN1cGVyKCJNb2RpZnkgQXJ0ZWZhY3QgZGVwbG95bWVudCBvcmRlciIpOwotCQl0aGlzLndvcmtpbmdDb3B5ID0gd29ya2luZ0NvcHk7Ci0JCXRoaXMub2xkT3JkZXIgPSB3b3JraW5nQ29weS5nZXRBcnRlZmFjdE9yZGVyKCk7Ci0JCXRoaXMubmV3T3JkZXIgPSBuZXdPcmRlcjsKLQl9CisgICAgcHVibGljIE1vZGlmeUFydGVmYWN0T3JkZXJDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSwgTGlzdDxTdHJpbmc+IG5ld09yZGVyKSB7CisgICAgICAgIHN1cGVyKCJNb2RpZnkgQXJ0ZWZhY3QgZGVwbG95bWVudCBvcmRlciIpOworICAgICAgICB0aGlzLndvcmtpbmdDb3B5ID0gd29ya2luZ0NvcHk7CisgICAgICAgIHRoaXMub2xkT3JkZXIgPSB3b3JraW5nQ29weS5nZXRBcnRlZmFjdE9yZGVyKCk7CisgICAgICAgIHRoaXMubmV3T3JkZXIgPSBuZXdPcmRlcjsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJd29ya2luZ0NvcHkuc2V0QXJ0ZWZhY3RPcmRlcihuZXdPcmRlcik7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weS5zZXRBcnRlZmFjdE9yZGVyKHRoaXMubmV3T3JkZXIpOworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJd29ya2luZ0NvcHkuc2V0QXJ0ZWZhY3RPcmRlcihuZXdPcmRlcik7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weS5zZXRBcnRlZmFjdE9yZGVyKHRoaXMubmV3T3JkZXIpOworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJd29ya2luZ0NvcHkuc2V0QXJ0ZWZhY3RPcmRlcihvbGRPcmRlcik7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weS5zZXRBcnRlZmFjdE9yZGVyKHRoaXMub2xkT3JkZXIpOworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvYWN0aW9ucy9Nb2RpZnlDbGVhblN0YXJ0dXBDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2FjdGlvbnMvTW9kaWZ5Q2xlYW5TdGFydHVwQ29tbWFuZC5qYXZhCmluZGV4IGFmMDliMzMuLjZmZWFjMjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvYWN0aW9ucy9Nb2RpZnlDbGVhblN0YXJ0dXBDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9hY3Rpb25zL01vZGlmeUNsZWFuU3RhcnR1cENvbW1hbmQuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLmFjdGlvbnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKQEAgLTIwLDQxICsyMSw0MSBAQAogCiAvKioKICAqIHtAbGluayBBYnN0cmFjdE9wZXJhdGlvbn0gdG8gbW9kaWZ5IHRoZSBjbGVhbiBzdGFydHVwIHNldHRpbmcKLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDIuMC4wCiAgKi8KIHB1YmxpYyBjbGFzcyBNb2RpZnlDbGVhblN0YXJ0dXBDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gewogCi0JcHJpdmF0ZSBJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHk7CisgICAgcHJpdmF0ZSBmaW5hbCBJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHk7CiAKLQlwcml2YXRlIGJvb2xlYW4gb2xkVmFsdWU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG9sZFZhbHVlOwogCi0JcHJpdmF0ZSBib29sZWFuIG5ld1ZhbHVlOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBuZXdWYWx1ZTsKIAotCXB1YmxpYyBNb2RpZnlDbGVhblN0YXJ0dXBDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlzdXBlcigiTW9kaWZ5IENsZWFuIFN0YXJ0dXAiKTsKLQkJdGhpcy53b3JraW5nQ29weSA9IHdvcmtpbmdDb3B5OwotCQl0aGlzLm9sZFZhbHVlID0gd29ya2luZ0NvcHkuc2hvdWxkQ2xlYW5TdGFydHVwKCk7Ci0JCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQl9CisgICAgcHVibGljIE1vZGlmeUNsZWFuU3RhcnR1cENvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5LCBib29sZWFuIG5ld1ZhbHVlKSB7CisgICAgICAgIHN1cGVyKCJNb2RpZnkgQ2xlYW4gU3RhcnR1cCIpOworICAgICAgICB0aGlzLndvcmtpbmdDb3B5ID0gd29ya2luZ0NvcHk7CisgICAgICAgIHRoaXMub2xkVmFsdWUgPSB3b3JraW5nQ29weS5zaG91bGRDbGVhblN0YXJ0dXAoKTsKKyAgICAgICAgdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl3b3JraW5nQ29weS5zaG91bGRDbGVhblN0YXJ0dXAobmV3VmFsdWUpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMud29ya2luZ0NvcHkuc2hvdWxkQ2xlYW5TdGFydHVwKHRoaXMubmV3VmFsdWUpOworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJd29ya2luZ0NvcHkuc2hvdWxkQ2xlYW5TdGFydHVwKG5ld1ZhbHVlKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLndvcmtpbmdDb3B5LnNob3VsZENsZWFuU3RhcnR1cCh0aGlzLm5ld1ZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXdvcmtpbmdDb3B5LnNob3VsZENsZWFuU3RhcnR1cChvbGRWYWx1ZSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weS5zaG91bGRDbGVhblN0YXJ0dXAodGhpcy5vbGRWYWx1ZSk7CisgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9hY3Rpb25zL01vZGlmeURlcGxveWVyUGFzc3dvcmRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2FjdGlvbnMvTW9kaWZ5RGVwbG95ZXJQYXNzd29yZENvbW1hbmQuamF2YQppbmRleCBmYzNkOGFjLi5hOTJlYTZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2FjdGlvbnMvTW9kaWZ5RGVwbG95ZXJQYXNzd29yZENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2FjdGlvbnMvTW9kaWZ5RGVwbG95ZXJQYXNzd29yZENvbW1hbmQuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLmFjdGlvbnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKQEAgLTIwLDQxICsyMSw0MSBAQAogCiAvKioKICAqIHtAbGluayBBYnN0cmFjdE9wZXJhdGlvbn0gdG8gbW9kaWZ5IHRoZSBqbXggZGVwbG95ZXIgcGFzc3dvcmQuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMQogICovCiBwdWJsaWMgY2xhc3MgTW9kaWZ5RGVwbG95ZXJQYXNzd29yZENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiB7CiAKLQlwcml2YXRlIElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weTsKKyAgICBwcml2YXRlIGZpbmFsIElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weTsKIAotCXByaXZhdGUgU3RyaW5nIG9sZFBhc3N3b3JkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG9sZFBhc3N3b3JkOwogCi0JcHJpdmF0ZSBTdHJpbmcgbmV3UGFzc3dvcmQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmV3UGFzc3dvcmQ7CiAKLQlwdWJsaWMgTW9kaWZ5RGVwbG95ZXJQYXNzd29yZENvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5LCBTdHJpbmcgdXNlcm5hbWUpIHsKLQkJc3VwZXIoIk1vZGlmeSBKTVggc2VydmVyIHBvcnQiKTsKLQkJdGhpcy53b3JraW5nQ29weSA9IHdvcmtpbmdDb3B5OwotCQl0aGlzLm9sZFBhc3N3b3JkID0gd29ya2luZ0NvcHkuZ2V0TUJlYW5TZXJ2ZXJQYXNzd29yZCgpOwotCQl0aGlzLm5ld1Bhc3N3b3JkID0gdXNlcm5hbWU7Ci0JfQorICAgIHB1YmxpYyBNb2RpZnlEZXBsb3llclBhc3N3b3JkQ29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHksIFN0cmluZyB1c2VybmFtZSkgeworICAgICAgICBzdXBlcigiTW9kaWZ5IEpNWCBzZXJ2ZXIgcG9ydCIpOworICAgICAgICB0aGlzLndvcmtpbmdDb3B5ID0gd29ya2luZ0NvcHk7CisgICAgICAgIHRoaXMub2xkUGFzc3dvcmQgPSB3b3JraW5nQ29weS5nZXRNQmVhblNlcnZlclBhc3N3b3JkKCk7CisgICAgICAgIHRoaXMubmV3UGFzc3dvcmQgPSB1c2VybmFtZTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJd29ya2luZ0NvcHkuc2V0TUJlYW5TZXJ2ZXJQYXNzd29yZChuZXdQYXNzd29yZCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weS5zZXRNQmVhblNlcnZlclBhc3N3b3JkKHRoaXMubmV3UGFzc3dvcmQpOworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJd29ya2luZ0NvcHkuc2V0TUJlYW5TZXJ2ZXJQYXNzd29yZChuZXdQYXNzd29yZCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weS5zZXRNQmVhblNlcnZlclBhc3N3b3JkKHRoaXMubmV3UGFzc3dvcmQpOworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJd29ya2luZ0NvcHkuc2V0TUJlYW5TZXJ2ZXJQYXNzd29yZChvbGRQYXNzd29yZCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weS5zZXRNQmVhblNlcnZlclBhc3N3b3JkKHRoaXMub2xkUGFzc3dvcmQpOworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvYWN0aW9ucy9Nb2RpZnlEZXBsb3llclBvcnRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2FjdGlvbnMvTW9kaWZ5RGVwbG95ZXJQb3J0Q29tbWFuZC5qYXZhCmluZGV4IDI5NzMzM2IuLmI0MGRhZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvYWN0aW9ucy9Nb2RpZnlEZXBsb3llclBvcnRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9hY3Rpb25zL01vZGlmeURlcGxveWVyUG9ydENvbW1hbmQuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLmFjdGlvbnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKQEAgLTIwLDQxICsyMSw0MSBAQAogCiAvKioKICAqIHtAbGluayBBYnN0cmFjdE9wZXJhdGlvbn0gdG8gbW9kaWZ5IHRoZSBqbXggZGVwbG95ZXIgcG9ydC4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4xCiAgKi8KIHB1YmxpYyBjbGFzcyBNb2RpZnlEZXBsb3llclBvcnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gewogCi0JcHJpdmF0ZSBJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHk7CisgICAgcHJpdmF0ZSBmaW5hbCBJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHk7CiAKLQlwcml2YXRlIGludCBvbGRQb3J0OworICAgIHByaXZhdGUgZmluYWwgaW50IG9sZFBvcnQ7CiAKLQlwcml2YXRlIGludCBuZXdQb3J0OworICAgIHByaXZhdGUgZmluYWwgaW50IG5ld1BvcnQ7CiAKLQlwdWJsaWMgTW9kaWZ5RGVwbG95ZXJQb3J0Q29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHksIGludCBwb3J0TnVtYmVyKSB7Ci0JCXN1cGVyKCJNb2RpZnkgSk1YIHNlcnZlciBwb3J0Iik7Ci0JCXRoaXMud29ya2luZ0NvcHkgPSB3b3JraW5nQ29weTsKLQkJdGhpcy5vbGRQb3J0ID0gd29ya2luZ0NvcHkuZ2V0TUJlYW5TZXJ2ZXJQb3J0KCk7Ci0JCXRoaXMubmV3UG9ydCA9IHBvcnROdW1iZXI7Ci0JfQorICAgIHB1YmxpYyBNb2RpZnlEZXBsb3llclBvcnRDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSwgaW50IHBvcnROdW1iZXIpIHsKKyAgICAgICAgc3VwZXIoIk1vZGlmeSBKTVggc2VydmVyIHBvcnQiKTsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weSA9IHdvcmtpbmdDb3B5OworICAgICAgICB0aGlzLm9sZFBvcnQgPSB3b3JraW5nQ29weS5nZXRNQmVhblNlcnZlclBvcnQoKTsKKyAgICAgICAgdGhpcy5uZXdQb3J0ID0gcG9ydE51bWJlcjsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJd29ya2luZ0NvcHkuc2V0TUJlYW5TZXJ2ZXJQb3J0KG5ld1BvcnQpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMud29ya2luZ0NvcHkuc2V0TUJlYW5TZXJ2ZXJQb3J0KHRoaXMubmV3UG9ydCk7CisgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl3b3JraW5nQ29weS5zZXRNQmVhblNlcnZlclBvcnQobmV3UG9ydCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weS5zZXRNQmVhblNlcnZlclBvcnQodGhpcy5uZXdQb3J0KTsKKyAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXdvcmtpbmdDb3B5LnNldE1CZWFuU2VydmVyUG9ydChvbGRQb3J0KTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLndvcmtpbmdDb3B5LnNldE1CZWFuU2VydmVyUG9ydCh0aGlzLm9sZFBvcnQpOworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvYWN0aW9ucy9Nb2RpZnlEZXBsb3llclRpbWVvdXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2FjdGlvbnMvTW9kaWZ5RGVwbG95ZXJUaW1lb3V0Q29tbWFuZC5qYXZhCmluZGV4IGUxNjQxNGYuLjQ5MWZhNDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvYWN0aW9ucy9Nb2RpZnlEZXBsb3llclRpbWVvdXRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9hY3Rpb25zL01vZGlmeURlcGxveWVyVGltZW91dENvbW1hbmQuamF2YQpAQCAtMSwzICsxLDQgQEAKKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLmFjdGlvbnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKQEAgLTE1LDM1ICsxNiwzNSBAQAogICovCiBwdWJsaWMgY2xhc3MgTW9kaWZ5RGVwbG95ZXJUaW1lb3V0Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIHsKIAotCXByaXZhdGUgZmluYWwgSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5OworICAgIHByaXZhdGUgZmluYWwgSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5OwogCi0JcHJpdmF0ZSBmaW5hbCBpbnQgb2xkVGltZW91dDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBvbGRUaW1lb3V0OwogCi0JcHJpdmF0ZSBmaW5hbCBpbnQgbmV3VGltZW91dDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBuZXdUaW1lb3V0OwogCi0JcHVibGljIE1vZGlmeURlcGxveWVyVGltZW91dENvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5LCBpbnQgdGltZW91dCkgewotCQlzdXBlcigiTW9kaWZ5IEpNWCBkZXBsb3llciB0aW1lb3V0Iik7Ci0JCXRoaXMud29ya2luZ0NvcHkgPSB3b3JraW5nQ29weTsKLQkJdGhpcy5vbGRUaW1lb3V0ID0gd29ya2luZ0NvcHkuZ2V0RGVwbG95VGltZW91dCgpOwotCQl0aGlzLm5ld1RpbWVvdXQgPSB0aW1lb3V0OwotCX0KKyAgICBwdWJsaWMgTW9kaWZ5RGVwbG95ZXJUaW1lb3V0Q29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHksIGludCB0aW1lb3V0KSB7CisgICAgICAgIHN1cGVyKCJNb2RpZnkgSk1YIGRlcGxveWVyIHRpbWVvdXQiKTsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weSA9IHdvcmtpbmdDb3B5OworICAgICAgICB0aGlzLm9sZFRpbWVvdXQgPSB3b3JraW5nQ29weS5nZXREZXBsb3lUaW1lb3V0KCk7CisgICAgICAgIHRoaXMubmV3VGltZW91dCA9IHRpbWVvdXQ7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXdvcmtpbmdDb3B5LnNldERlcGxveVRpbWVvdXQobmV3VGltZW91dCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weS5zZXREZXBsb3lUaW1lb3V0KHRoaXMubmV3VGltZW91dCk7CisgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl3b3JraW5nQ29weS5zZXREZXBsb3lUaW1lb3V0KG5ld1RpbWVvdXQpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMud29ya2luZ0NvcHkuc2V0RGVwbG95VGltZW91dCh0aGlzLm5ld1RpbWVvdXQpOworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJd29ya2luZ0NvcHkuc2V0RGVwbG95VGltZW91dChvbGRUaW1lb3V0KTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLndvcmtpbmdDb3B5LnNldERlcGxveVRpbWVvdXQodGhpcy5vbGRUaW1lb3V0KTsKKyAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2FjdGlvbnMvTW9kaWZ5RGVwbG95ZXJVc2VybmFtZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvYWN0aW9ucy9Nb2RpZnlEZXBsb3llclVzZXJuYW1lQ29tbWFuZC5qYXZhCmluZGV4IGMyZTU0YjAuLmM0ZjQ0NGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvYWN0aW9ucy9Nb2RpZnlEZXBsb3llclVzZXJuYW1lQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvYWN0aW9ucy9Nb2RpZnlEZXBsb3llclVzZXJuYW1lQ29tbWFuZC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUuYWN0aW9uczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwpAQCAtMjAsNDEgKzIxLDQxIEBACiAKIC8qKgogICoge0BsaW5rIEFic3RyYWN0T3BlcmF0aW9ufSB0byBtb2RpZnkgdGhlIGpteCBkZXBsb3llciB1c2VybmFtZS4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4xCiAgKi8KIHB1YmxpYyBjbGFzcyBNb2RpZnlEZXBsb3llclVzZXJuYW1lQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIHsKIAotCXByaXZhdGUgSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5OworICAgIHByaXZhdGUgZmluYWwgSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5OwogCi0JcHJpdmF0ZSBTdHJpbmcgb2xkVXNlcm5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgb2xkVXNlcm5hbWU7CiAKLQlwcml2YXRlIFN0cmluZyBuZXdVc2VybmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuZXdVc2VybmFtZTsKIAotCXB1YmxpYyBNb2RpZnlEZXBsb3llclVzZXJuYW1lQ29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHksIFN0cmluZyB1c2VybmFtZSkgewotCQlzdXBlcigiTW9kaWZ5IEpNWCBzZXJ2ZXIgcG9ydCIpOwotCQl0aGlzLndvcmtpbmdDb3B5ID0gd29ya2luZ0NvcHk7Ci0JCXRoaXMub2xkVXNlcm5hbWUgPSB3b3JraW5nQ29weS5nZXRNQmVhblNlcnZlclVzZXJuYW1lKCk7Ci0JCXRoaXMubmV3VXNlcm5hbWUgPSB1c2VybmFtZTsKLQl9CisgICAgcHVibGljIE1vZGlmeURlcGxveWVyVXNlcm5hbWVDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSwgU3RyaW5nIHVzZXJuYW1lKSB7CisgICAgICAgIHN1cGVyKCJNb2RpZnkgSk1YIHNlcnZlciBwb3J0Iik7CisgICAgICAgIHRoaXMud29ya2luZ0NvcHkgPSB3b3JraW5nQ29weTsKKyAgICAgICAgdGhpcy5vbGRVc2VybmFtZSA9IHdvcmtpbmdDb3B5LmdldE1CZWFuU2VydmVyVXNlcm5hbWUoKTsKKyAgICAgICAgdGhpcy5uZXdVc2VybmFtZSA9IHVzZXJuYW1lOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl3b3JraW5nQ29weS5zZXRNQmVhblNlcnZlclVzZXJuYW1lKG5ld1VzZXJuYW1lKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLndvcmtpbmdDb3B5LnNldE1CZWFuU2VydmVyVXNlcm5hbWUodGhpcy5uZXdVc2VybmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl3b3JraW5nQ29weS5zZXRNQmVhblNlcnZlclVzZXJuYW1lKG5ld1VzZXJuYW1lKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLndvcmtpbmdDb3B5LnNldE1CZWFuU2VydmVyVXNlcm5hbWUodGhpcy5uZXdVc2VybmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl3b3JraW5nQ29weS5zZXRNQmVhblNlcnZlclVzZXJuYW1lKG9sZFVzZXJuYW1lKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLndvcmtpbmdDb3B5LnNldE1CZWFuU2VydmVyVXNlcm5hbWUodGhpcy5vbGRVc2VybmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9hY3Rpb25zL01vZGlmeU1heFBlcm1TaXplQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9hY3Rpb25zL01vZGlmeU1heFBlcm1TaXplQ29tbWFuZC5qYXZhCmluZGV4IDAxOWU4YzIuLmZiNmE2N2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvYWN0aW9ucy9Nb2RpZnlNYXhQZXJtU2l6ZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2FjdGlvbnMvTW9kaWZ5TWF4UGVybVNpemVDb21tYW5kLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgVGFza3RvcCBUZWNobm9sb2dpZXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLmFjdGlvbnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKQEAgLTIzLDM0ICsyNCwzNCBAQAogICovCiBwdWJsaWMgY2xhc3MgTW9kaWZ5TWF4UGVybVNpemVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RPcGVyYXRpb24gewogCi0JcHJpdmF0ZSBmaW5hbCBJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHk7CisgICAgcHJpdmF0ZSBmaW5hbCBJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHk7CiAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBvbGRQZXJtU2l6ZVZhbHVlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG9sZFBlcm1TaXplVmFsdWU7CiAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuZXdQZXJtU2l6ZVZhbHVlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5ld1Blcm1TaXplVmFsdWU7CiAKLQlwdWJsaWMgTW9kaWZ5TWF4UGVybVNpemVDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSwgU3RyaW5nIG1heFBlcm1TaXplVmFsdWUpIHsKLQkJc3VwZXIoIk1vZGlmeSAtWFg6TWF4UGVybVNpemUgdmFsdWUiKTsKLQkJdGhpcy53b3JraW5nQ29weSA9IHdvcmtpbmdDb3B5OwotCQl0aGlzLm9sZFBlcm1TaXplVmFsdWUgPSB3b3JraW5nQ29weS5nZXRNYXhQZXJtU2l6ZSgpOwotCQl0aGlzLm5ld1Blcm1TaXplVmFsdWUgPSBtYXhQZXJtU2l6ZVZhbHVlOwotCX0KKyAgICBwdWJsaWMgTW9kaWZ5TWF4UGVybVNpemVDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSwgU3RyaW5nIG1heFBlcm1TaXplVmFsdWUpIHsKKyAgICAgICAgc3VwZXIoIk1vZGlmeSAtWFg6TWF4UGVybVNpemUgdmFsdWUiKTsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weSA9IHdvcmtpbmdDb3B5OworICAgICAgICB0aGlzLm9sZFBlcm1TaXplVmFsdWUgPSB3b3JraW5nQ29weS5nZXRNYXhQZXJtU2l6ZSgpOworICAgICAgICB0aGlzLm5ld1Blcm1TaXplVmFsdWUgPSBtYXhQZXJtU2l6ZVZhbHVlOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl3b3JraW5nQ29weS5zZXRNYXhQZXJtU2l6ZShuZXdQZXJtU2l6ZVZhbHVlKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLndvcmtpbmdDb3B5LnNldE1heFBlcm1TaXplKHRoaXMubmV3UGVybVNpemVWYWx1ZSk7CisgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBleGVjdXRlKG1vbml0b3IsIGluZm8pOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl3b3JraW5nQ29weS5zZXRNYXhQZXJtU2l6ZShvbGRQZXJtU2l6ZVZhbHVlKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLndvcmtpbmdDb3B5LnNldE1heFBlcm1TaXplKHRoaXMub2xkUGVybVNpemVWYWx1ZSk7CisgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9hY3Rpb25zL01vZGlmeVN0YXRpY1Jlc291cmNlc0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvYWN0aW9ucy9Nb2RpZnlTdGF0aWNSZXNvdXJjZXNDb21tYW5kLmphdmEKaW5kZXggNjk2Y2IxNy4uZDUzZGYwZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9hY3Rpb25zL01vZGlmeVN0YXRpY1Jlc291cmNlc0NvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2FjdGlvbnMvTW9kaWZ5U3RhdGljUmVzb3VyY2VzQ29tbWFuZC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUuYWN0aW9uczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwpAQCAtMjAsNDEgKzIxLDQxIEBACiAKIC8qKgogICoge0BsaW5rIEFic3RyYWN0T3BlcmF0aW9ufSB0byBtb2RpZnkgdGhlIGpteCBkZXBsb3llciBwb3J0LgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4xLjMKICAqLwogcHVibGljIGNsYXNzIE1vZGlmeVN0YXRpY1Jlc291cmNlc0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiB7CiAKLQlwcml2YXRlIElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weTsKKyAgICBwcml2YXRlIGZpbmFsIElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weTsKIAotCXByaXZhdGUgU3RyaW5nIG9sZFZhbHVlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG9sZFZhbHVlOwogCi0JcHJpdmF0ZSBTdHJpbmcgbmV3VmFsdWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmV3VmFsdWU7CiAKLQlwdWJsaWMgTW9kaWZ5U3RhdGljUmVzb3VyY2VzQ29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHksIFN0cmluZyBuZXdWYWx1ZSkgewotCQlzdXBlcigiTW9kaWZ5IHN0YXRpYyByZXNvdXJjZXMiKTsKLQkJdGhpcy53b3JraW5nQ29weSA9IHdvcmtpbmdDb3B5OwotCQl0aGlzLm9sZFZhbHVlID0gd29ya2luZ0NvcHkuZ2V0U3RhdGljRmlsZW5hbWVQYXR0ZXJucygpOwotCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JfQorICAgIHB1YmxpYyBNb2RpZnlTdGF0aWNSZXNvdXJjZXNDb21tYW5kKElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weSwgU3RyaW5nIG5ld1ZhbHVlKSB7CisgICAgICAgIHN1cGVyKCJNb2RpZnkgc3RhdGljIHJlc291cmNlcyIpOworICAgICAgICB0aGlzLndvcmtpbmdDb3B5ID0gd29ya2luZ0NvcHk7CisgICAgICAgIHRoaXMub2xkVmFsdWUgPSB3b3JraW5nQ29weS5nZXRTdGF0aWNGaWxlbmFtZVBhdHRlcm5zKCk7CisgICAgICAgIHRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJd29ya2luZ0NvcHkuc2V0U3RhdGljRmlsZW5hbWVQYXR0ZXJucyhuZXdWYWx1ZSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weS5zZXRTdGF0aWNGaWxlbmFtZVBhdHRlcm5zKHRoaXMubmV3VmFsdWUpOworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJd29ya2luZ0NvcHkuc2V0U3RhdGljRmlsZW5hbWVQYXR0ZXJucyhuZXdWYWx1ZSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weS5zZXRTdGF0aWNGaWxlbmFtZVBhdHRlcm5zKHRoaXMubmV3VmFsdWUpOworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJd29ya2luZ0NvcHkuc2V0U3RhdGljRmlsZW5hbWVQYXR0ZXJucyhvbGRWYWx1ZSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weS5zZXRTdGF0aWNGaWxlbmFtZVBhdHRlcm5zKHRoaXMub2xkVmFsdWUpOworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvYWN0aW9ucy9Nb2RpZnlUYWlsTG9nRmlsZXNDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2FjdGlvbnMvTW9kaWZ5VGFpbExvZ0ZpbGVzQ29tbWFuZC5qYXZhCmluZGV4IGMxNGI5MGYuLmQwNGIzNmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvYWN0aW9ucy9Nb2RpZnlUYWlsTG9nRmlsZXNDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9hY3Rpb25zL01vZGlmeVRhaWxMb2dGaWxlc0NvbW1hbmQuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLmFjdGlvbnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKQEAgLTIwLDQxICsyMSw0MSBAQAogCiAvKioKICAqIHtAbGluayBBYnN0cmFjdE9wZXJhdGlvbn0gdG8gbW9kaWZ5IHRoZSB0YWlsIGxvZyBmaWxlIHNldHRpbmdzLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjEKICAqLwogcHVibGljIGNsYXNzIE1vZGlmeVRhaWxMb2dGaWxlc0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiB7CiAKLQlwcml2YXRlIElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weTsKKyAgICBwcml2YXRlIGZpbmFsIElTZXJ2ZXJXb3JraW5nQ29weSB3b3JraW5nQ29weTsKIAotCXByaXZhdGUgYm9vbGVhbiBvbGRWYWx1ZTsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gb2xkVmFsdWU7CiAKLQlwcml2YXRlIGJvb2xlYW4gbmV3VmFsdWU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG5ld1ZhbHVlOwogCi0JcHVibGljIE1vZGlmeVRhaWxMb2dGaWxlc0NvbW1hbmQoSVNlcnZlcldvcmtpbmdDb3B5IHdvcmtpbmdDb3B5LCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCXN1cGVyKCJNb2RpZnkgVGFpbCBMb2cgRmlsZXMiKTsKLQkJdGhpcy53b3JraW5nQ29weSA9IHdvcmtpbmdDb3B5OwotCQl0aGlzLm9sZFZhbHVlID0gd29ya2luZ0NvcHkuc2hvdWxkVGFpbFRyYWNlRmlsZXMoKTsKLQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCX0KKyAgICBwdWJsaWMgTW9kaWZ5VGFpbExvZ0ZpbGVzQ29tbWFuZChJU2VydmVyV29ya2luZ0NvcHkgd29ya2luZ0NvcHksIGJvb2xlYW4gbmV3VmFsdWUpIHsKKyAgICAgICAgc3VwZXIoIk1vZGlmeSBUYWlsIExvZyBGaWxlcyIpOworICAgICAgICB0aGlzLndvcmtpbmdDb3B5ID0gd29ya2luZ0NvcHk7CisgICAgICAgIHRoaXMub2xkVmFsdWUgPSB3b3JraW5nQ29weS5zaG91bGRUYWlsVHJhY2VGaWxlcygpOworICAgICAgICB0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXdvcmtpbmdDb3B5LnNob3VsZFRhaWxUcmFjZUZpbGVzKG5ld1ZhbHVlKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICB0aGlzLndvcmtpbmdDb3B5LnNob3VsZFRhaWxUcmFjZUZpbGVzKHRoaXMubmV3VmFsdWUpOworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJd29ya2luZ0NvcHkuc2hvdWxkVGFpbFRyYWNlRmlsZXMobmV3VmFsdWUpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMud29ya2luZ0NvcHkuc2hvdWxkVGFpbFRyYWNlRmlsZXModGhpcy5uZXdWYWx1ZSk7CisgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQl3b3JraW5nQ29weS5zaG91bGRUYWlsVHJhY2VGaWxlcyhvbGRWYWx1ZSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53b3JraW5nQ29weS5zaG91bGRUYWlsVHJhY2VGaWxlcyh0aGlzLm9sZFZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvQWJzdHJhY3RKbXhTZXJ2ZXJDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvQWJzdHJhY3RKbXhTZXJ2ZXJDb21tYW5kLmphdmEKaW5kZXggNTFmOTk2MC4uZmU1OTI0YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0Fic3RyYWN0Sm14U2VydmVyQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9BYnN0cmFjdEpteFNlcnZlckNvbW1hbmQuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLmNvbW1hbmQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMzUsNzIgKzM2LDcxIEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpteFNlcnZlckNvbW1hbmQgewogCi0JcHJvdGVjdGVkIGludGVyZmFjZSBKbXhTZXJ2ZXJDb21tYW5kVGVtcGxhdGUgeworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgSm14U2VydmVyQ29tbWFuZFRlbXBsYXRlIHsKIAotCQlPYmplY3QgaW52b2tlT3BlcmF0aW9uKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uOworICAgICAgICBPYmplY3QgaW52b2tlT3BlcmF0aW9uKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uOwogCi0JfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKTVhfQ09OTkVDVE9SX1VSTCA9ICJzZXJ2aWNlOmpteDpybWk6Ly8vam5kaS9ybWk6Ly8lczolZC9qbXhybWkiOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpNWF9DT05ORUNUT1JfVVJMID0gInNlcnZpY2U6am14OnJtaTovLy9qbmRpL3JtaTovLyVzOiVkL2pteHJtaSI7IC8vJE5PTi1OTFMtMSQKIAotCXByb3RlY3RlZCBmaW5hbCBJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXI7CiAKLQlwdWJsaWMgQWJzdHJhY3RKbXhTZXJ2ZXJDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7Ci0JCXRoaXMuc2VydmVyQmVoYXZpb3VyID0gc2VydmVyQmVoYXZpb3VyOwotCX0KKyAgICBwdWJsaWMgQWJzdHJhY3RKbXhTZXJ2ZXJDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7CisgICAgICAgIHRoaXMuc2VydmVyQmVoYXZpb3VyID0gc2VydmVyQmVoYXZpb3VyOworICAgIH0KIAotCXByaXZhdGUgSk1YQ29ubmVjdG9yIGdldEpteENvbm5lY3RvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gaCA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCVNlcnZlciBzZXJ2ZXIgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoc2VydmVyQmVoYXZpb3VyKTsKKyAgICBwcml2YXRlIEpNWENvbm5lY3RvciBnZXRKbXhDb25uZWN0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGggPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBTZXJ2ZXIgc2VydmVyID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyKHRoaXMuc2VydmVyQmVoYXZpb3VyKTsKIAotCQlpZiAoc2VydmVyQmVoYXZpb3VyLmdldE1CZWFuU2VydmVySXAoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk1CZWFuIHNlcnZlciBub3Qgb3BlbiBmb3IgY29ubmVjdGlvbiIpOwotCQl9Ci0JCVN0cmluZyBjb25uZWN0b3JVcmwgPSBTdHJpbmcuZm9ybWF0KEpNWF9DT05ORUNUT1JfVVJMLCBzZXJ2ZXJCZWhhdmlvdXIuZ2V0TUJlYW5TZXJ2ZXJJcCgpLAotCQkJCQkJCQkJCQlzZXJ2ZXIuZ2V0TUJlYW5TZXJ2ZXJQb3J0KCkpOwotCQlyZXR1cm4gSk1YQ29ubmVjdG9yRmFjdG9yeS5jb25uZWN0KG5ldyBKTVhTZXJ2aWNlVVJMKGNvbm5lY3RvclVybCksIGgpOwotCX0KKyAgICAgICAgaWYgKHRoaXMuc2VydmVyQmVoYXZpb3VyLmdldE1CZWFuU2VydmVySXAoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIk1CZWFuIHNlcnZlciBub3Qgb3BlbiBmb3IgY29ubmVjdGlvbiIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBjb25uZWN0b3JVcmwgPSBTdHJpbmcuZm9ybWF0KEpNWF9DT05ORUNUT1JfVVJMLCB0aGlzLnNlcnZlckJlaGF2aW91ci5nZXRNQmVhblNlcnZlcklwKCksIHNlcnZlci5nZXRNQmVhblNlcnZlclBvcnQoKSk7CisgICAgICAgIHJldHVybiBKTVhDb25uZWN0b3JGYWN0b3J5LmNvbm5lY3QobmV3IEpNWFNlcnZpY2VVUkwoY29ubmVjdG9yVXJsKSwgaCk7CisgICAgfQogCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBleGVjdXRlKGZpbmFsIEpteFNlcnZlckNvbW1hbmRUZW1wbGF0ZSB0ZW1wbGF0ZSkgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24geworICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgZXhlY3V0ZShmaW5hbCBKbXhTZXJ2ZXJDb21tYW5kVGVtcGxhdGUgdGVtcGxhdGUpIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKIAotCQlDYWxsYWJsZTxPYmplY3Q+IGRlcGxveU9wZXJhdGlvbiA9IG5ldyBDYWxsYWJsZTxPYmplY3Q+KCkgeworICAgICAgICBDYWxsYWJsZTxPYmplY3Q+IGRlcGxveU9wZXJhdGlvbiA9IG5ldyBDYWxsYWJsZTxPYmplY3Q+KCkgewogCi0JCQlwdWJsaWMgT2JqZWN0IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlKTVhDb25uZWN0b3IgY29ubmVjdG9yID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQljb25uZWN0b3IgPSBnZXRKbXhDb25uZWN0b3IoKTsKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmludm9rZU9wZXJhdGlvbihjb25uZWN0b3IuZ2V0TUJlYW5TZXJ2ZXJDb25uZWN0aW9uKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChjb25uZWN0b3IgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQljb25uZWN0b3IuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTdGF0dXNVdGlsLmVycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OworICAgICAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgSk1YQ29ubmVjdG9yIGNvbm5lY3RvciA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yID0gZ2V0Sm14Q29ubmVjdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZS5pbnZva2VPcGVyYXRpb24oY29ubmVjdG9yLmdldE1CZWFuU2VydmVyQ29ubmVjdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzVXRpbC5lcnJvcihlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKIAotCQlGdXR1cmVUYXNrPE9iamVjdD4gdGFzayA9IG5ldyBGdXR1cmVUYXNrPE9iamVjdD4oZGVwbG95T3BlcmF0aW9uKTsKLQkJU2VydmVyQ29yZVBsdWdpbi5FWEVDVVRPUi5zdWJtaXQodGFzayk7CisgICAgICAgIEZ1dHVyZVRhc2s8T2JqZWN0PiB0YXNrID0gbmV3IEZ1dHVyZVRhc2s8T2JqZWN0PihkZXBsb3lPcGVyYXRpb24pOworICAgICAgICBTZXJ2ZXJDb3JlUGx1Z2luLkVYRUNVVE9SLnN1Ym1pdCh0YXNrKTsKIAotCQl0cnkgewotCQkJcmV0dXJuIHRhc2suZ2V0KGdldFRpbWVvdXQoKSwgVGltZVVuaXQuU0VDT05EUyk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHN3YWxsb3cgZXhjZXB0aW9uIGhlcmUKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHN3YWxsb3cgZXhjZXB0aW9uIGhlcmUKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHRhc2suZ2V0KGdldFRpbWVvdXQoKSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHN3YWxsb3cgZXhjZXB0aW9uIGhlcmUKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHN3YWxsb3cgZXhjZXB0aW9uIGhlcmUKKyAgICAgICAgfQogCi0JCXJldHVybiBudWxsOwotCX0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHJldHVybiB0aGUgdGltZW91dCBvZiB0aGUgb3BlcmF0aW9uIGluIHNlY29uZHMKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFRpbWVvdXQoKSB7Ci0JCXJldHVybiAzMDsKLQl9CisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdGltZW91dCBvZiB0aGUgb3BlcmF0aW9uIGluIHNlY29uZHMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGdldFRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiAzMDsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9BYnN0cmFjdEpteFNlcnZlckRlcGxveWVyQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0Fic3RyYWN0Sm14U2VydmVyRGVwbG95ZXJDb21tYW5kLmphdmEKaW5kZXggM2RjMzRlZC4uZGI5MGYwNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0Fic3RyYWN0Sm14U2VydmVyRGVwbG95ZXJDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0Fic3RyYWN0Sm14U2VydmVyRGVwbG95ZXJDb21tYW5kLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZS5jb21tYW5kOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTI2LDEwMCArMjcsOTggQEAKIAogLyoqCiAgKiBCYXNlIGltcGxlbWVudGF0aW9uIHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggYSBKTVggTUJlYW4uCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMQogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKbXhTZXJ2ZXJEZXBsb3llckNvbW1hbmQ8VD4gZXh0ZW5kcyBBYnN0cmFjdEpteFNlcnZlckNvbW1hbmQgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU0NIRU1FID0gImZpbGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1NDSEVNRSA9ICJmaWxlIjsKIAotCXByb3RlY3RlZCBmaW5hbCBJTW9kdWxlIG1vZHVsZTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgSU1vZHVsZSBtb2R1bGU7CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBBYnN0cmFjdEpteFNlcnZlckRlcGxveWVyQ29tbWFuZH0uCi0JICovCi0JcHVibGljIEFic3RyYWN0Sm14U2VydmVyRGVwbG95ZXJDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLCBJTW9kdWxlIG1vZHVsZSkgewotCQlzdXBlcihzZXJ2ZXJCZWhhdmlvdXIpOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQWJzdHJhY3RKbXhTZXJ2ZXJEZXBsb3llckNvbW1hbmR9LgorICAgICAqLworICAgIHB1YmxpYyBBYnN0cmFjdEpteFNlcnZlckRlcGxveWVyQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUpIHsKKyAgICAgICAgc3VwZXIoc2VydmVyQmVoYXZpb3VyKTsKKyAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGU7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCJbIik7Ci0JCWJ1aWxkZXIuYXBwZW5kKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKS5hcHBlbmQoIiAtPiAiKS5hcHBlbmQoZ2V0TUJlYW5OYW1lKCkpLmFwcGVuZCgiLiIpCi0JCQkJLmFwcGVuZChnZXRPcGVyYXRpb25OYW1lKCkpLmFwcGVuZCgiKCIpLmFwcGVuZChBcnJheXMuZGVlcFRvU3RyaW5nKGdldE9wZXJhdGlvbkFyZ3VtZW50cygpKSkKLQkJCQkuYXBwZW5kKCIpIikuYXBwZW5kKCJdIik7Ci0JCXJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiWyIpOworICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYXBwZW5kKCIgLT4gIikuYXBwZW5kKGdldE1CZWFuTmFtZSgpKS5hcHBlbmQoIi4iKS5hcHBlbmQoZ2V0T3BlcmF0aW9uTmFtZSgpKS5hcHBlbmQoIigiKS5hcHBlbmQoCisgICAgICAgICAgICBBcnJheXMuZGVlcFRvU3RyaW5nKGdldE9wZXJhdGlvbkFyZ3VtZW50cygpKSkuYXBwZW5kKCIpIikuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQogCi0JLyoqCi0JICogTWV0aG9kIHRvIGJlIGNhbGxlZCBieSBzdWItY2xhc3NlcyB0byBleGVjdXRlIGdpdmVuIGNvbW1hbmQgYWdhaW5zdCB0aGUKLQkgKiBNQmVhbgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBmaW5hbCBUIGRvRXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgLyoqCisgICAgICogTWV0aG9kIHRvIGJlIGNhbGxlZCBieSBzdWItY2xhc3NlcyB0byBleGVjdXRlIGdpdmVuIGNvbW1hbmQgYWdhaW5zdCB0aGUgTUJlYW4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcm90ZWN0ZWQgZmluYWwgVCBkb0V4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewogCi0JCUpteFNlcnZlckNvbW1hbmRUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG5ldyBKbXhTZXJ2ZXJDb21tYW5kVGVtcGxhdGUoKSB7CisgICAgICAgIEpteFNlcnZlckNvbW1hbmRUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG5ldyBKbXhTZXJ2ZXJDb21tYW5kVGVtcGxhdGUoKSB7CiAKLQkJCXB1YmxpYyBPYmplY3QgaW52b2tlT3BlcmF0aW9uKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgaW52b2tlT3BlcmF0aW9uKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAotCQkJCU9iamVjdE5hbWUgbmFtZSA9IE9iamVjdE5hbWUuZ2V0SW5zdGFuY2UoZ2V0TUJlYW5OYW1lKCkpOworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IE9iamVjdE5hbWUuZ2V0SW5zdGFuY2UoZ2V0TUJlYW5OYW1lKCkpOwogCi0JCQkJT2JqZWN0W10gb3BlcmF0aW9uQXJndW1lbnRzID0gZ2V0T3BlcmF0aW9uQXJndW1lbnRzKCk7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gb3BlcmF0aW9uQXJndW1lbnRzID0gZ2V0T3BlcmF0aW9uQXJndW1lbnRzKCk7CiAKLQkJCQlTdHJpbmdbXSBjbGFzc05hbWVzID0gbmV3IFN0cmluZ1tvcGVyYXRpb25Bcmd1bWVudHMubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdGlvbkFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAob3BlcmF0aW9uQXJndW1lbnRzW2ldIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJCQkJY2xhc3NOYW1lc1tpXSA9IGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY2xhc3NOYW1lc1tpXSA9IG9wZXJhdGlvbkFyZ3VtZW50c1tpXS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCX0KKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWVzID0gbmV3IFN0cmluZ1tvcGVyYXRpb25Bcmd1bWVudHMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhdGlvbkFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAob3BlcmF0aW9uQXJndW1lbnRzW2ldIGluc3RhbmNlb2YgQm9vbGVhbikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lc1tpXSA9IGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lc1tpXSA9IG9wZXJhdGlvbkFyZ3VtZW50c1tpXS5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KIAotCQkJCXJldHVybiBjb25uZWN0aW9uLmludm9rZShuYW1lLCBnZXRPcGVyYXRpb25OYW1lKCksIG9wZXJhdGlvbkFyZ3VtZW50cywgY2xhc3NOYW1lcyk7Ci0JCQl9Ci0JCX07CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uaW52b2tlKG5hbWUsIGdldE9wZXJhdGlvbk5hbWUoKSwgb3BlcmF0aW9uQXJndW1lbnRzLCBjbGFzc05hbWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKIAotCQlyZXR1cm4gKFQpIGV4ZWN1dGUodGVtcGxhdGUpOwotCX0KKyAgICAgICAgcmV0dXJuIChUKSBleGVjdXRlKHRlbXBsYXRlKTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBNQmVhbiB0byBjb25uZWN0IHRvLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TUJlYW5OYW1lKCkgewotCQlyZXR1cm4gc2VydmVyQmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0RGVwbG95ZXJNQmVhbk5hbWUoKTsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgTUJlYW4gdG8gY29ubmVjdCB0by4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE1CZWFuTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VydmVyQmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0RGVwbG95ZXJNQmVhbk5hbWUoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhcmd1bWVudHMgb2YgdGhlIE1CZWFuIG9wZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0W10gZ2V0T3BlcmF0aW9uQXJndW1lbnRzKCk7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXJndW1lbnRzIG9mIHRoZSBNQmVhbiBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdFtdIGdldE9wZXJhdGlvbkFyZ3VtZW50cygpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgTUJlYW4gb3BlcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0T3BlcmF0aW9uTmFtZSgpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIE1CZWFuIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoKTsKIAotCS8qKgotCSAqIENyZWF0ZSBhIHtAbGluayBVUkl9IGZyb20gdGhlIGdpdmVuIDxjb2RlPnBhdGg8L2NvZGU+LgotCSAqLwotCXN0YXRpYyBmaW5hbCBVUkkgZ2V0VXJpKElQYXRoIHBhdGgpIHsKLQkJLy8gd2UgY2FuJ3QgdXNlIHBhdGgudG9GaWxlKCkudG9VUkkoKSBhcyB0aGlzIHdpbGwgdXNlIE9TIHNwZWNpZmljIHBhdGhzCi0JCS8vIGFuZCB3aWxsIGZhaWwKLQkJLy8gbWlzZXJhYmxlIGlmIHlvdSBydW4gZm9yIFZNd2FyZQotCQl0cnkgewotCQkJaWYgKHBhdGgudG9TdHJpbmcoKS5zdGFydHNXaXRoKCIvIikpIHsKLQkJCQlyZXR1cm4gbmV3IFVSSShGSUxFX1NDSEVNRSwgcGF0aC50b1N0cmluZygpLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkkoRklMRV9TQ0hFTUUsICIvIiArIHBhdGgudG9TdHJpbmcoKSwgbnVsbCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGF0dXNVdGlsLmVycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgVVJJfSBmcm9tIHRoZSBnaXZlbiA8Y29kZT5wYXRoPC9jb2RlPi4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgVVJJIGdldFVyaShJUGF0aCBwYXRoKSB7CisgICAgICAgIC8vIHdlIGNhbid0IHVzZSBwYXRoLnRvRmlsZSgpLnRvVVJJKCkgYXMgdGhpcyB3aWxsIHVzZSBPUyBzcGVjaWZpYyBwYXRocworICAgICAgICAvLyBhbmQgd2lsbCBmYWlsCisgICAgICAgIC8vIG1pc2VyYWJsZSBpZiB5b3UgcnVuIGZvciBWTXdhcmUKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChwYXRoLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkoRklMRV9TQ0hFTUUsIHBhdGgudG9TdHJpbmcoKSwgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJJKEZJTEVfU0NIRU1FLCAiLyIgKyBwYXRoLnRvU3RyaW5nKCksIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RhdHVzVXRpbC5lcnJvcihlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvR2VuZXJpY0pteFNlcnZlckRlcGxveUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9HZW5lcmljSm14U2VydmVyRGVwbG95Q29tbWFuZC5qYXZhCmluZGV4IDMwYmVjMmYuLjRlNzBhNmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9HZW5lcmljSm14U2VydmVyRGVwbG95Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9HZW5lcmljSm14U2VydmVyRGVwbG95Q29tbWFuZC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUuY29tbWFuZDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yMiw1NiArMjMsNTcgQEAKIAogLyoqCiAgKiB7QGxpbmsgSVNlcnZlckNvbW1hbmR9IHRvIGRlcGxveSBhIFBBUiBvciBidW5kbGUuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMQogICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pteFNlcnZlckRlcGxveUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdEpteFNlcnZlckRlcGxveWVyQ29tbWFuZDxDb21wb3NpdGVEYXRhPiBpbXBsZW1lbnRzCi0JCUlTZXJ2ZXJDb21tYW5kPERlcGxveW1lbnRJZGVudGl0eT4geworcHVibGljIGNsYXNzIEdlbmVyaWNKbXhTZXJ2ZXJEZXBsb3lDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RKbXhTZXJ2ZXJEZXBsb3llckNvbW1hbmQ8Q29tcG9zaXRlRGF0YT5pbXBsZW1lbnRzIElTZXJ2ZXJDb21tYW5kPERlcGxveW1lbnRJZGVudGl0eT4gewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElURU1fU1lNQk9MSUNfTkFNRSA9ICJzeW1ib2xpY05hbWUiOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElURU1fU1lNQk9MSUNfTkFNRSA9ICJzeW1ib2xpY05hbWUiOyAvLyROT04tTkxTLTEkCiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElURU1fVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAogCi0JcHJpdmF0ZSBmaW5hbCBVUkkgdXJpOworICAgIHByaXZhdGUgZmluYWwgVVJJIHVyaTsKIAotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEdlbmVyaWNKbXhTZXJ2ZXJEZXBsb3lDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgR2VuZXJpY0pteFNlcnZlckRlcGxveUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIFVSSSB1cmkpIHsKLQkJc3VwZXIoc2VydmVyQmVoYXZpb3VyLCBudWxsKTsKLQkJdGhpcy51cmkgPSB1cmk7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEdlbmVyaWNKbXhTZXJ2ZXJEZXBsb3lDb21tYW5kfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgR2VuZXJpY0pteFNlcnZlckRlcGxveUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIFVSSSB1cmkpIHsKKyAgICAgICAgc3VwZXIoc2VydmVyQmVoYXZpb3VyLCBudWxsKTsKKyAgICAgICAgdGhpcy51cmkgPSB1cmk7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBEZXBsb3ltZW50SWRlbnRpdHkgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBEZXBsb3ltZW50SWRlbnRpdHkgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7CiAKLQkJQ29tcG9zaXRlRGF0YSByZXR1cm5WYWx1ZSA9IGRvRXhlY3V0ZSgpOwotCQlpZiAocmV0dXJuVmFsdWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IChTdHJpbmcpIHJldHVyblZhbHVlLmdldChJVEVNX1NZTUJPTElDX05BTUUpOwotCQkJU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSByZXR1cm5WYWx1ZS5nZXQoSVRFTV9WRVJTSU9OKTsKLQkJCU1hcDxTdHJpbmcsIERlcGxveW1lbnRJZGVudGl0eT4gaWRlbnRpdGllcyA9IHNlcnZlckJlaGF2aW91ci5nZXREZXBsb3ltZW50SWRlbnRpdGllcygpOwotCQkJRGVwbG95bWVudElkZW50aXR5IGlkZW50aXR5ID0gbmV3IERlcGxveW1lbnRJZGVudGl0eShzeW1ib2xpY05hbWUsIHZlcnNpb24pOwotCQkJaWRlbnRpdGllcy5wdXQodXJpLnRvU3RyaW5nKCksIGlkZW50aXR5KTsKLQkJCXJldHVybiBpZGVudGl0eTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgICAgIENvbXBvc2l0ZURhdGEgcmV0dXJuVmFsdWUgPSBkb0V4ZWN1dGUoKTsKKyAgICAgICAgaWYgKHJldHVyblZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBzeW1ib2xpY05hbWUgPSAoU3RyaW5nKSByZXR1cm5WYWx1ZS5nZXQoSVRFTV9TWU1CT0xJQ19OQU1FKTsKKyAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmV0dXJuVmFsdWUuZ2V0KElURU1fVkVSU0lPTik7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBEZXBsb3ltZW50SWRlbnRpdHk+IGlkZW50aXRpZXMgPSB0aGlzLnNlcnZlckJlaGF2aW91ci5nZXREZXBsb3ltZW50SWRlbnRpdGllcygpOworICAgICAgICAgICAgRGVwbG95bWVudElkZW50aXR5IGlkZW50aXR5ID0gbmV3IERlcGxveW1lbnRJZGVudGl0eShzeW1ib2xpY05hbWUsIHZlcnNpb24pOworICAgICAgICAgICAgaWRlbnRpdGllcy5wdXQodGhpcy51cmkudG9TdHJpbmcoKSwgaWRlbnRpdHkpOworICAgICAgICAgICAgcmV0dXJuIGlkZW50aXR5OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0T3BlcmF0aW9uQXJndW1lbnRzKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgdXJpLnRvU3RyaW5nKCksIGZhbHNlIH07Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0T3BlcmF0aW9uQXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsgdGhpcy51cmkudG9TdHJpbmcoKSwgZmFsc2UgfTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCkgewotCQlyZXR1cm4gImRlcGxveSI7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoKSB7CisgICAgICAgIHJldHVybiAiZGVwbG95IjsKKyAgICB9CiAKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvSVNlcnZlckNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9JU2VydmVyQ29tbWFuZC5qYXZhCmluZGV4IDk4ZWEzMjQuLmFmOTdlOTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9JU2VydmVyQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9JU2VydmVyQ29tbWFuZC5qYXZhCkBAIC04LDI5ICs4LDI5IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZS5jb21tYW5kOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwogCiAvKioKLSAqIFJlcHJlc2VudHMgYSBzdGF0ZS1mdWxsIHNlcnZlciBjb21tYW5kIHRvIGNvbnRyb2wgcmVtb3RlIFNwcmluZ1NvdXJjZSBkbQotICogU2VydmVyIGluc3RhbmNlcy4KKyAqIFJlcHJlc2VudHMgYSBzdGF0ZS1mdWxsIHNlcnZlciBjb21tYW5kIHRvIGNvbnRyb2wgcmVtb3RlIFNwcmluZ1NvdXJjZSBkbSBTZXJ2ZXIgaW5zdGFuY2VzLgogICogPHA+CiAgKiBFYWNoIHNlcnZlciBjb21tYW5kIHNob3VsZCBvbmx5IGJlIGV4ZWN1dGVkIG9uY2UuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMQogICovCiBwdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJDb21tYW5kPFQ+IHsKIAotCS8qKgotCSAqIEV4ZWN1dGUgdGhpcyBzZXJ2ZXIgY29tbWFuZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHJldHVybnMgdGhlIGdlbmVyaWZpZWQgcmV0dXJuIHZhbHVlIG9mIHRoZSBjb21tYW5kCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbgotCSAqLwotCVQgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbjsKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoaXMgc2VydmVyIGNvbW1hbmQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGdlbmVyaWZpZWQgcmV0dXJuIHZhbHVlIG9mIHRoZSBjb21tYW5kCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbgorICAgICAqLworICAgIFQgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbjsKIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0pteEJ1bmRsZUFkbWluRXhlY3V0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9KbXhCdW5kbGVBZG1pbkV4ZWN1dGVDb21tYW5kLmphdmEKaW5kZXggNjFlYzA2ZS4uY2U3ZTg4OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0pteEJ1bmRsZUFkbWluRXhlY3V0ZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvSm14QnVuZGxlQWRtaW5FeGVjdXRlQ29tbWFuZC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUuY29tbWFuZDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yNSwzOSArMjYsMzkgQEAKICAqLwogcHVibGljIGNsYXNzIEpteEJ1bmRsZUFkbWluRXhlY3V0ZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdEpteFNlcnZlckNvbW1hbmQgaW1wbGVtZW50cyBJU2VydmVyQ29tbWFuZDxTdHJpbmc+IHsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIGNtZExpbmU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY21kTGluZTsKIAotCXB1YmxpYyBKbXhCdW5kbGVBZG1pbkV4ZWN1dGVDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLCBTdHJpbmcgY21kTGluZSkgewotCQlzdXBlcihzZXJ2ZXJCZWhhdmlvdXIpOwotCQl0aGlzLmNtZExpbmUgPSBjbWRMaW5lOwotCX0KKyAgICBwdWJsaWMgSm14QnVuZGxlQWRtaW5FeGVjdXRlQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91ciwgU3RyaW5nIGNtZExpbmUpIHsKKyAgICAgICAgc3VwZXIoc2VydmVyQmVoYXZpb3VyKTsKKyAgICAgICAgdGhpcy5jbWRMaW5lID0gY21kTGluZTsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24geworICAgIHB1YmxpYyBTdHJpbmcgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7CiAKLQkJcmV0dXJuIChTdHJpbmcpIGV4ZWN1dGUobmV3IEpteFNlcnZlckNvbW1hbmRUZW1wbGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIGV4ZWN1dGUobmV3IEpteFNlcnZlckNvbW1hbmRUZW1wbGF0ZSgpIHsKIAotCQkJcHVibGljIE9iamVjdCBpbnZva2VPcGVyYXRpb24oTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHRocm93cyBFeGNlcHRpb24gewotCQkJCU9iamVjdE5hbWUgbmFtZSA9IE9iamVjdE5hbWUuZ2V0SW5zdGFuY2UoIm9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbDp0eXBlPUJ1bmRsZUFkbWluIik7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGludm9rZU9wZXJhdGlvbihNQmVhblNlcnZlckNvbm5lY3Rpb24gY29ubmVjdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gT2JqZWN0TmFtZS5nZXRJbnN0YW5jZSgib3JnLmVjbGlwc2UudmlyZ28ua2VybmVsOnR5cGU9QnVuZGxlQWRtaW4iKTsKIAotCQkJCS8vIFZlcmlmeSB0aGF0IHRoZSBCdW5kbGVBZG1pbiBleGlzdHMgYW5kIHJ1bnMKLQkJCQljaGVja0J1bmRsZUFkbWluQW5kSW5zdGFsbChzZXJ2ZXJCZWhhdmlvdXIsIGNvbm5lY3Rpb24sIG5hbWUpOworICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBCdW5kbGVBZG1pbiBleGlzdHMgYW5kIHJ1bnMKKyAgICAgICAgICAgICAgICBjaGVja0J1bmRsZUFkbWluQW5kSW5zdGFsbChKbXhCdW5kbGVBZG1pbkV4ZWN1dGVDb21tYW5kLnRoaXMuc2VydmVyQmVoYXZpb3VyLCBjb25uZWN0aW9uLCBuYW1lKTsKIAotCQkJCXJldHVybiBjb25uZWN0aW9uLmludm9rZShuYW1lLCAiZXhlY3V0ZSIsIG5ldyBPYmplY3RbXSB7IGNtZExpbmUgfSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7IFN0cmluZy5jbGFzcy5nZXROYW1lKCkgfSk7Ci0JCQl9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uaW52b2tlKG5hbWUsICJleGVjdXRlIiwgbmV3IE9iamVjdFtdIHsgSm14QnVuZGxlQWRtaW5FeGVjdXRlQ29tbWFuZC50aGlzLmNtZExpbmUgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgU3RyaW5nLmNsYXNzLmdldE5hbWUoKSB9KTsKKyAgICAgICAgICAgIH0KIAotCQl9KTsKLQl9CisgICAgICAgIH0pOworICAgIH0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tCdW5kbGVBZG1pbkFuZEluc3RhbGwoSVNlcnZlckJlaGF2aW91ciBiZWhhdmlvdXIsIE1CZWFuU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uLAotCQkJT2JqZWN0TmFtZSBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBDaGVjayBpZiBCdW5kbGVBZG1pbiBNQmVhbiBpcyByZWdpc3RlcmVkCi0JCQljb25uZWN0aW9uLmdldE9iamVjdEluc3RhbmNlKG5hbWUpOwotCQl9IGNhdGNoIChJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEluc3RhbGwgdGhlIEJ1bmRsZUFkbWluIGJ1bmRsZQotCQkJYmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyRGVwbG95Q29tbWFuZChiZWhhdmlvdXIpLmV4ZWN1dGUoKTsKLQkJfQotCX0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQnVuZGxlQWRtaW5BbmRJbnN0YWxsKElTZXJ2ZXJCZWhhdmlvdXIgYmVoYXZpb3VyLCBNQmVhblNlcnZlckNvbm5lY3Rpb24gY29ubmVjdGlvbiwgT2JqZWN0TmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiBCdW5kbGVBZG1pbiBNQmVhbiBpcyByZWdpc3RlcmVkCisgICAgICAgICAgICBjb25uZWN0aW9uLmdldE9iamVjdEluc3RhbmNlKG5hbWUpOworICAgICAgICB9IGNhdGNoIChJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEluc3RhbGwgdGhlIEJ1bmRsZUFkbWluIGJ1bmRsZQorICAgICAgICAgICAgYmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyRGVwbG95Q29tbWFuZChiZWhhdmlvdXIpLmV4ZWN1dGUoKTsKKyAgICAgICAgfQorICAgIH0KIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9KbXhCdW5kbGVBZG1pblNlcnZlckNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9KbXhCdW5kbGVBZG1pblNlcnZlckNvbW1hbmQuamF2YQppbmRleCAyZTlhOTI2Li4wZjM4MzU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvSm14QnVuZGxlQWRtaW5TZXJ2ZXJDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0pteEJ1bmRsZUFkbWluU2VydmVyQ29tbWFuZC5qYXZhCkBAIC05LDYgKzksNyBAQAogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqICAgICBTQVAgQUcgLSBtb3ZpbmcgdG8gRWNsaXBzZSBMaWJyYSBwcm9qZWN0IGFuZCBlbmhhbmNlbWVudHMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUuY29tbWFuZDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yOSwzNiArMzAsMzYgQEAKICAqLwogcHVibGljIGNsYXNzIEpteEJ1bmRsZUFkbWluU2VydmVyQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Sm14U2VydmVyQ29tbWFuZCBpbXBsZW1lbnRzIElTZXJ2ZXJDb21tYW5kPE1hcDxMb25nLCBJQnVuZGxlPj4gewogCi0JcHVibGljIEpteEJ1bmRsZUFkbWluU2VydmVyQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cikgewotCQlzdXBlcihzZXJ2ZXJCZWhhdmlvdXIpOwotCX0KKyAgICBwdWJsaWMgSm14QnVuZGxlQWRtaW5TZXJ2ZXJDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7CisgICAgICAgIHN1cGVyKHNlcnZlckJlaGF2aW91cik7CisgICAgfQogCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIE1hcDxMb25nLCBJQnVuZGxlPiBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgTWFwPExvbmcsIElCdW5kbGU+IGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewogCi0JCXJldHVybiAoTWFwPExvbmcsIElCdW5kbGU+KSBleGVjdXRlKG5ldyBKbXhTZXJ2ZXJDb21tYW5kVGVtcGxhdGUoKSB7CisgICAgICAgIHJldHVybiAoTWFwPExvbmcsIElCdW5kbGU+KSBleGVjdXRlKG5ldyBKbXhTZXJ2ZXJDb21tYW5kVGVtcGxhdGUoKSB7CiAKLQkJCXB1YmxpYyBPYmplY3QgaW52b2tlT3BlcmF0aW9uKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlPYmplY3ROYW1lIG5hbWUgPSBPYmplY3ROYW1lLmdldEluc3RhbmNlKCJvcmcuZWNsaXBzZS52aXJnby5rZXJuZWw6dHlwZT1CdW5kbGVBZG1pbiIpOworICAgICAgICAgICAgcHVibGljIE9iamVjdCBpbnZva2VPcGVyYXRpb24oTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IE9iamVjdE5hbWUuZ2V0SW5zdGFuY2UoIm9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbDp0eXBlPUJ1bmRsZUFkbWluIik7CiAKLQkJCQkvLyBWZXJpZnkgdGhhdCB0aGUgQnVuZGxlQWRtaW4gZXhpc3RzIGFuZCBydW5zCi0JCQkJY2hlY2tCdW5kbGVBZG1pbkFuZEluc3RhbGwoc2VydmVyQmVoYXZpb3VyLCBjb25uZWN0aW9uLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgQnVuZGxlQWRtaW4gZXhpc3RzIGFuZCBydW5zCisgICAgICAgICAgICAgICAgY2hlY2tCdW5kbGVBZG1pbkFuZEluc3RhbGwoSm14QnVuZGxlQWRtaW5TZXJ2ZXJDb21tYW5kLnRoaXMuc2VydmVyQmVoYXZpb3VyLCBjb25uZWN0aW9uLCBuYW1lKTsKIAotCQkJCXJldHVybiBjb25uZWN0aW9uLmludm9rZShuYW1lLCAicmV0cmlldmVCdW5kbGVzIiwgbnVsbCwgbnVsbCk7Ci0JCQl9CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uaW52b2tlKG5hbWUsICJyZXRyaWV2ZUJ1bmRsZXMiLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0KIAotCQl9KTsKLQl9CisgICAgICAgIH0pOworICAgIH0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tCdW5kbGVBZG1pbkFuZEluc3RhbGwoSVNlcnZlckJlaGF2aW91ciBiZWhhdmlvdXIsIE1CZWFuU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uLAotCQkJT2JqZWN0TmFtZSBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBDaGVjayBpZiBCdW5kbGVBZG1pbiBNQmVhbiBpcyByZWdpc3RlcmVkCi0JCQljb25uZWN0aW9uLmdldE9iamVjdEluc3RhbmNlKG5hbWUpOwotCQl9IGNhdGNoIChJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEluc3RhbGwgdGhlIEJ1bmRsZUFkbWluIGJ1bmRsZQotCQkJYmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyRGVwbG95Q29tbWFuZChiZWhhdmlvdXIpLmV4ZWN1dGUoKTsKLQkJfQotCX0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQnVuZGxlQWRtaW5BbmRJbnN0YWxsKElTZXJ2ZXJCZWhhdmlvdXIgYmVoYXZpb3VyLCBNQmVhblNlcnZlckNvbm5lY3Rpb24gY29ubmVjdGlvbiwgT2JqZWN0TmFtZSBuYW1lKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBDaGVjayBpZiBCdW5kbGVBZG1pbiBNQmVhbiBpcyByZWdpc3RlcmVkCisgICAgICAgICAgICBjb25uZWN0aW9uLmdldE9iamVjdEluc3RhbmNlKG5hbWUpOworICAgICAgICB9IGNhdGNoIChJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEluc3RhbGwgdGhlIEJ1bmRsZUFkbWluIGJ1bmRsZQorICAgICAgICAgICAgYmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2VydmVyRGVwbG95Q29tbWFuZChiZWhhdmlvdXIpLmV4ZWN1dGUoKTsKKyAgICAgICAgfQorICAgIH0KIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9KbXhTZXJ2ZXJDaGVja0J1bmRsZURlcGxveWVkQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0pteFNlcnZlckNoZWNrQnVuZGxlRGVwbG95ZWRDb21tYW5kLmphdmEKaW5kZXggYTI4ZGM1NC4uNGNhNTY4YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0pteFNlcnZlckNoZWNrQnVuZGxlRGVwbG95ZWRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0pteFNlcnZlckNoZWNrQnVuZGxlRGVwbG95ZWRDb21tYW5kLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgR2lhbk1hcmlhIFJvbWFuYXRvIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLmNvbW1hbmQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMzksMTI4ICs0MCwxMjUgQEAKICAqIEBhdXRob3IgR2lhbk1hcmlhIFJvbWFuYXRvCiAgKiBAc2luY2UgMS4wLjIKICAqLwotY2xhc3MgSm14U2VydmVyQ2hlY2tCdW5kbGVEZXBsb3llZENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdEpteFNlcnZlckNvbW1hbmQKLQkJaW1wbGVtZW50cyBJU2VydmVyQ29tbWFuZDxEZXBsb3ltZW50SWRlbnRpdHk+IHsKK2NsYXNzIEpteFNlcnZlckNoZWNrQnVuZGxlRGVwbG95ZWRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RKbXhTZXJ2ZXJDb21tYW5kIGltcGxlbWVudHMgSVNlcnZlckNvbW1hbmQ8RGVwbG95bWVudElkZW50aXR5PiB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9JTkZfTUFOSUZFU1RfTUYgPSAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfSU5GX01BTklGRVNUX01GID0gIk1FVEEtSU5GL01BTklGRVNULk1GIjsgLy8kTk9OLU5MUy0xJAogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fQVRUUklCVVRFID0gIlZlcnNpb24iOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fQVRUUklCVVRFID0gIlZlcnNpb24iOyAvLyROT04tTkxTLTEkCiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfQVRUUklCVVRFID0gIlN0YXRlIjsgLy8kTk9OLU5MUy0xJAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURV9BVFRSSUJVVEUgPSAiU3RhdGUiOyAvLyROT04tTkxTLTEkCiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfQVRUUklCVVRFX0FDVElWRSA9ICJBQ1RJVkUiOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX0FUVFJJQlVURV9BQ1RJVkUgPSAiQUNUSVZFIjsgLy8kTk9OLU5MUy0xJAogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX09QRVJBVElPTiA9ICJzdGFydCI7IC8vJE5PTi1OTFMtMSQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfT1BFUkFUSU9OID0gInN0YXJ0IjsgLy8kTk9OLU5MUy0xJAogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1RBUlRfT1BFUkFUSU9OX1NJR05BVFVSRSA9IG5ldyBTdHJpbmdbMF07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1RBUlRfT1BFUkFUSU9OX1NJR05BVFVSRSA9IG5ldyBTdHJpbmdbMF07CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBTVEFSVF9PUEVSQVRJT05fUEFSQU1FVEVSUyA9IG5ldyBPYmplY3RbMF07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gU1RBUlRfT1BFUkFUSU9OX1BBUkFNRVRFUlMgPSBuZXcgT2JqZWN0WzBdOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9OQU1FID0gIm9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbDp0eXBlPUFydGlmYWN0TW9kZWwsYXJ0aWZhY3QtdHlwZT1idW5kbGUsdmVyc2lvbj0qLHJlZ2lvbj1vcmcuZWNsaXBzZS52aXJnby5yZWdpb24udXNlcixuYW1lPSI7IC8vJE5PTi1OTFMtMSQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX05BTUUgPSAib3JnLmVjbGlwc2UudmlyZ28ua2VybmVsOnR5cGU9QXJ0aWZhY3RNb2RlbCxhcnRpZmFjdC10eXBlPWJ1bmRsZSx2ZXJzaW9uPSoscmVnaW9uPW9yZy5lY2xpcHNlLnZpcmdvLnJlZ2lvbi51c2VyLG5hbWU9IjsgLy8kTk9OLU5MUy0xJAogCi0JcHJpdmF0ZSBmaW5hbCBJTW9kdWxlIG1vZHVsZTsKKyAgICBwcml2YXRlIGZpbmFsIElNb2R1bGUgbW9kdWxlOwogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSm14U2VydmVyQ2hlY2tCdW5kbGVEZXBsb3llZENvbW1hbmR9LgotCSAqLwotCUpteFNlcnZlckNoZWNrQnVuZGxlRGVwbG95ZWRDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLCBJTW9kdWxlIG1vZHVsZSkgewotCQlzdXBlcihzZXJ2ZXJCZWhhdmlvdXIpOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSm14U2VydmVyQ2hlY2tCdW5kbGVEZXBsb3llZENvbW1hbmR9LgorICAgICAqLworICAgIEpteFNlcnZlckNoZWNrQnVuZGxlRGVwbG95ZWRDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLCBJTW9kdWxlIG1vZHVsZSkgeworICAgICAgICBzdXBlcihzZXJ2ZXJCZWhhdmlvdXIpOworICAgICAgICB0aGlzLm1vZHVsZSA9IG1vZHVsZTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIERlcGxveW1lbnRJZGVudGl0eSBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKLQkJLy8gaWYgYW5kIG9ubHkgaWYgdGhlIGFydGlmYWN0IGlzIGEgbW9kdWxlCi0JCWlmIChpc0J1bmRsZSgpKSB7Ci0JCQkvLyBhbmQgd2UgY291bGQgZGV0ZXJtaW5lIGl0cyB2ZXJzaW9uIG51bWJlcgotCQkJLy8gZW5xdWlyeSB0aGUgYXJ0aWZhY3QgcmVwb3NpdG9yeSBmb3IgYSBNQmVhbiBuYW1lZCBhZnRlciB0aGUgYnVuZGxlCi0JCQlKbXhTZXJ2ZXJDb21tYW5kVGVtcGxhdGUgdHBsID0gbmV3IEpteFNlcnZlckNvbW1hbmRUZW1wbGF0ZSgpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGludm9rZU9wZXJhdGlvbihNQmVhblNlcnZlckNvbm5lY3Rpb24gY29ubmVjdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCXJldHVybiBjaGVja0lmQnVuZGxlQWxyZWFkeURlcGxveWVkKGNvbm5lY3Rpb24pOwotCQkJCX0KLQkJCX07Ci0JCQkvLyBhbmQgcmV0dXJuIHRydWUgaWYgaXQgd2FzIGZvdW5kCi0JCQlyZXR1cm4gKERlcGxveW1lbnRJZGVudGl0eSkgZXhlY3V0ZSh0cGwpOwotCQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBEZXBsb3ltZW50SWRlbnRpdHkgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRoZSBhcnRpZmFjdCBpcyBhIG1vZHVsZQorICAgICAgICBpZiAoaXNCdW5kbGUoKSkgeworICAgICAgICAgICAgLy8gYW5kIHdlIGNvdWxkIGRldGVybWluZSBpdHMgdmVyc2lvbiBudW1iZXIKKyAgICAgICAgICAgIC8vIGVucXVpcnkgdGhlIGFydGlmYWN0IHJlcG9zaXRvcnkgZm9yIGEgTUJlYW4gbmFtZWQgYWZ0ZXIgdGhlIGJ1bmRsZQorICAgICAgICAgICAgSm14U2VydmVyQ29tbWFuZFRlbXBsYXRlIHRwbCA9IG5ldyBKbXhTZXJ2ZXJDb21tYW5kVGVtcGxhdGUoKSB7CiAKLQkJLy8gaWYgbm90IGEgYnVuZGxlIChwbGFuKSBvciB0aGUgbWFuaWZlc3QgY291bGQgbm90IGJlIHBhcnNlZAotCQkvLyByZXR1cm4gbnVsbCwgdGhlIElERSB0b29sIHdpbGwgdGhlbiBhc3N1bWUgdGhlIGJ1bmRsZSB3YXMgbm90IGFscmVhZHkKLQkJLy8gZGVwbG95ZWQgYW5kIHRoaXMgd2lsbCBtYWtlIGl0IGJlaGF2ZSB0aGUgc2FtZSB3YXkgaXQgZGlkIGJlZm9yZQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBpbnZva2VPcGVyYXRpb24oTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tJZkJ1bmRsZUFscmVhZHlEZXBsb3llZChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgLy8gYW5kIHJldHVybiB0cnVlIGlmIGl0IHdhcyBmb3VuZAorICAgICAgICAgICAgcmV0dXJuIChEZXBsb3ltZW50SWRlbnRpdHkpIGV4ZWN1dGUodHBsKTsKKyAgICAgICAgfQogCi0JcHJvdGVjdGVkIERlcGxveW1lbnRJZGVudGl0eSBjaGVja0lmQnVuZGxlQWxyZWFkeURlcGxveWVkKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uKQotCQkJdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24gewotCQlPYmplY3ROYW1lIG5hbWUgPSBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWUuZ2V0SW5zdGFuY2UoT0JKRUNUX05BTUUgKyBtb2R1bGUuZ2V0TmFtZSgpKTsKLQkJU2V0PE9iamVjdE5hbWU+IGNhbmRpZGF0ZXM7Ci0JCXRyeSB7Ci0JCQljYW5kaWRhdGVzID0gY29ubmVjdGlvbi5xdWVyeU5hbWVzKG5hbWUsIG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCS8vIHNpbGVudGx5IGlnbm9yZSwgdGhpcyBpcyBhIGJlc3QgZWZmb3J0IHRlbnRhdGl2ZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgLy8gaWYgbm90IGEgYnVuZGxlIChwbGFuKSBvciB0aGUgbWFuaWZlc3QgY291bGQgbm90IGJlIHBhcnNlZAorICAgICAgICAvLyByZXR1cm4gbnVsbCwgdGhlIElERSB0b29sIHdpbGwgdGhlbiBhc3N1bWUgdGhlIGJ1bmRsZSB3YXMgbm90IGFscmVhZHkKKyAgICAgICAgLy8gZGVwbG95ZWQgYW5kIHRoaXMgd2lsbCBtYWtlIGl0IGJlaGF2ZSB0aGUgc2FtZSB3YXkgaXQgZGlkIGJlZm9yZQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkJaWYgKCFjYW5kaWRhdGVzLmlzRW1wdHkoKSkgewotCQkJZmluYWwgU3RyaW5nIGxvY2FsVmVyc2lvbiA9IGRpc2NvdmVyQnVuZGxlVmVyc2lvbigpOwotCQkJZm9yIChPYmplY3ROYW1lIG9iamVjdE5hbWUgOiBjYW5kaWRhdGVzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJQXR0cmlidXRlTGlzdCBhdHRyaWJ1dGVzID0gY29ubmVjdGlvbi5nZXRBdHRyaWJ1dGVzKG9iamVjdE5hbWUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgVkVSU0lPTl9BVFRSSUJVVEUsIFNUQVRFX0FUVFJJQlVURSB9KTsKLQkJCQkJQXR0cmlidXRlIHZlcnNpb24gPSAoQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldCgwKTsKLQkJCQkJQXR0cmlidXRlIHN0YXRlID0gKEF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoMSk7CisgICAgcHJvdGVjdGVkIERlcGxveW1lbnRJZGVudGl0eSBjaGVja0lmQnVuZGxlQWxyZWFkeURlcGxveWVkKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZS5nZXRJbnN0YW5jZShPQkpFQ1RfTkFNRSArIHRoaXMubW9kdWxlLmdldE5hbWUoKSk7CisgICAgICAgIFNldDxPYmplY3ROYW1lPiBjYW5kaWRhdGVzOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2FuZGlkYXRlcyA9IGNvbm5lY3Rpb24ucXVlcnlOYW1lcyhuYW1lLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICAvLyBzaWxlbnRseSBpZ25vcmUsIHRoaXMgaXMgYSBiZXN0IGVmZm9ydCB0ZW50YXRpdmUKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJCQkJaWYgKGxvY2FsVmVyc2lvbi5lcXVhbHModmVyc2lvbi5nZXRWYWx1ZSgpKSkgeworICAgICAgICBpZiAoIWNhbmRpZGF0ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxWZXJzaW9uID0gZGlzY292ZXJCdW5kbGVWZXJzaW9uKCk7CisgICAgICAgICAgICBmb3IgKE9iamVjdE5hbWUgb2JqZWN0TmFtZSA6IGNhbmRpZGF0ZXMpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0IGF0dHJpYnV0ZXMgPSBjb25uZWN0aW9uLmdldEF0dHJpYnV0ZXMob2JqZWN0TmFtZSwgbmV3IFN0cmluZ1tdIHsgVkVSU0lPTl9BVFRSSUJVVEUsIFNUQVRFX0FUVFJJQlVURSB9KTsKKyAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIHZlcnNpb24gPSAoQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldCgwKTsKKyAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIHN0YXRlID0gKEF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoMSk7CiAKLQkJCQkJCWlmICghU1RBVEVfQVRUUklCVVRFX0FDVElWRS5lcXVhbHMoc3RhdGUuZ2V0VmFsdWUoKSkpIHsKLQkJCQkJCQkvLyBpZiBidW5kbGUgaXMgbm90IGFjdGl2ZSwgYWN0aXZhdGUgaXQsIGJlY2F1c2UgdGhpcwotCQkJCQkJCS8vIGlzIHRoZSBleHBlY3RlZCBiZWhhdmlvdXIgZm9yIGEgYnVuZGxlIHRoYXQgaXMgYWRkZWQKLQkJCQkJCQkvLyB0byBhIFZpcmdvIHNlcnZlciBpbnN0YW5jZSBpbiBFY2xpcHNlCi0JCQkJCQkJY29ubmVjdGlvbi5pbnZva2Uob2JqZWN0TmFtZSwgU1RBUlRfT1BFUkFUSU9OLCBTVEFSVF9PUEVSQVRJT05fUEFSQU1FVEVSUywKLQkJCQkJCQkJCVNUQVJUX09QRVJBVElPTl9TSUdOQVRVUkUpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG5ldyBEZXBsb3ltZW50SWRlbnRpdHkobW9kdWxlLmdldE5hbWUoKSwgbG9jYWxWZXJzaW9uKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHNpbGVudGx5IGlnbm9yZSwgdGhpcyBpcyBhIGJlc3QgZWZmb3J0IHRlbnRhdGl2ZQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbFZlcnNpb24uZXF1YWxzKHZlcnNpb24uZ2V0VmFsdWUoKSkpIHsKIAotCS8qKgotCSAqIFBhcnNlIHRoZSBidW5kbGUgbWFuaWZlc3QgdG8gZXh0cmFjdCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gTm90ZSB0aGF0IHRoZSBtYW5pZmVzdCBpcyB0YWtlbiBmcm9tIHRoZSBkZXBsb3ltZW50Ci0JICogZm9sZGVyIChzdGFnZSkgYXMgb3Bwb3NlZCB0byB0aGUge0BsaW5rIElQcm9qZWN0fSBiZWNhdXNlIHRoZSB7QGxpbmsgSVByb2plY3R9IG1heSBjb250YWluIGNoYW5nZXMgbm90IHlldAotCSAqIHB1Ymxpc2hlZC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHZlcnNpb24gYXMgYSBzdHJpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG1hbmlmZXN0IGNvdWxkIG5vdCBiZSBmb3VuZCBvciBjb3VsZCBub3QgYmUgcGFyc2VkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkaXNjb3ZlckJ1bmRsZVZlcnNpb24oKSB7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBtYW5pZmVzdCA9IENvbGxlY3Rpb25zLjxTdHJpbmcsIFN0cmluZz4gZW1wdHlNYXAoKTsKLQkJdHJ5IHsKLQkJCVVSSSBtYW5pZmVzdFVSSSA9IEFic3RyYWN0Sm14U2VydmVyRGVwbG95ZXJDb21tYW5kCi0JCQkJCS5nZXRVcmkoc2VydmVyQmVoYXZpb3VyLmdldE1vZHVsZURlcGxveVVyaShtb2R1bGUpLmFwcGVuZChNRVRBX0lORl9NQU5JRkVTVF9NRikpOwotCQkJaXMgPSBtYW5pZmVzdFVSSS50b1VSTCgpLm9wZW5TdHJlYW0oKTsKLQkJCW1hbmlmZXN0ID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlQnVuZGxlTWFuaWZlc3QoaXMsIG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaXMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFTVEFURV9BVFRSSUJVVEVfQUNUSVZFLmVxdWFscyhzdGF0ZS5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGJ1bmRsZSBpcyBub3QgYWN0aXZlLCBhY3RpdmF0ZSBpdCwgYmVjYXVzZSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIGV4cGVjdGVkIGJlaGF2aW91ciBmb3IgYSBidW5kbGUgdGhhdCBpcyBhZGRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGEgVmlyZ28gc2VydmVyIGluc3RhbmNlIGluIEVjbGlwc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmludm9rZShvYmplY3ROYW1lLCBTVEFSVF9PUEVSQVRJT04sIFNUQVJUX09QRVJBVElPTl9QQVJBTUVURVJTLCBTVEFSVF9PUEVSQVRJT05fU0lHTkFUVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVwbG95bWVudElkZW50aXR5KHRoaXMubW9kdWxlLmdldE5hbWUoKSwgbG9jYWxWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNpbGVudGx5IGlnbm9yZSwgdGhpcyBpcyBhIGJlc3QgZWZmb3J0IHRlbnRhdGl2ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkJcmV0dXJuIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pOwotCX0KKyAgICAvKioKKyAgICAgKiBQYXJzZSB0aGUgYnVuZGxlIG1hbmlmZXN0IHRvIGV4dHJhY3QgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24uIE5vdGUgdGhhdCB0aGUgbWFuaWZlc3QgaXMgdGFrZW4gZnJvbSB0aGUgZGVwbG95bWVudAorICAgICAqIGZvbGRlciAoc3RhZ2UpIGFzIG9wcG9zZWQgdG8gdGhlIHtAbGluayBJUHJvamVjdH0gYmVjYXVzZSB0aGUge0BsaW5rIElQcm9qZWN0fSBtYXkgY29udGFpbiBjaGFuZ2VzIG5vdCB5ZXQKKyAgICAgKiBwdWJsaXNoZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIGFzIGEgc3RyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtYW5pZmVzdCBjb3VsZCBub3QgYmUgZm91bmQgb3IgY291bGQgbm90IGJlIHBhcnNlZAorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZGlzY292ZXJCdW5kbGVWZXJzaW9uKCkgeworICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFuaWZlc3QgPSBDb2xsZWN0aW9ucy48U3RyaW5nLCBTdHJpbmc+IGVtcHR5TWFwKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkkgbWFuaWZlc3RVUkkgPSBBYnN0cmFjdEpteFNlcnZlckRlcGxveWVyQ29tbWFuZC5nZXRVcmkoCisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXJCZWhhdmlvdXIuZ2V0TW9kdWxlRGVwbG95VXJpKHRoaXMubW9kdWxlKS5hcHBlbmQoTUVUQV9JTkZfTUFOSUZFU1RfTUYpKTsKKyAgICAgICAgICAgIGlzID0gbWFuaWZlc3RVUkkudG9VUkwoKS5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICBtYW5pZmVzdCA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUJ1bmRsZU1hbmlmZXN0KGlzLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCXByb3RlY3RlZCBib29sZWFuIGlzQnVuZGxlKCkgewotCQlyZXR1cm4gbW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpLmVxdWFscyhGYWNldENvcmVQbHVnaW4uQlVORExFX0ZBQ0VUX0lEKTsKLQl9CisgICAgICAgIHJldHVybiBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0J1bmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpLmVxdWFscyhGYWNldENvcmVQbHVnaW4uQlVORExFX0ZBQ0VUX0lEKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9KbXhTZXJ2ZXJEZXBsb3lDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvSm14U2VydmVyRGVwbG95Q29tbWFuZC5qYXZhCmluZGV4IDVmZDMwMDIuLjQ4NDM3ZmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9KbXhTZXJ2ZXJEZXBsb3lDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0pteFNlcnZlckRlcGxveUNvbW1hbmQuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLmNvbW1hbmQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMzAsODggKzMxLDg1IEBACiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMQogICovCi1wdWJsaWMgY2xhc3MgSm14U2VydmVyRGVwbG95Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Sm14U2VydmVyRGVwbG95ZXJDb21tYW5kPENvbXBvc2l0ZURhdGE+Ci0JCWltcGxlbWVudHMgSVNlcnZlckNvbW1hbmQ8RGVwbG95bWVudElkZW50aXR5PiB7CitwdWJsaWMgY2xhc3MgSm14U2VydmVyRGVwbG95Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Sm14U2VydmVyRGVwbG95ZXJDb21tYW5kPENvbXBvc2l0ZURhdGE+aW1wbGVtZW50cyBJU2VydmVyQ29tbWFuZDxEZXBsb3ltZW50SWRlbnRpdHk+IHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNX1NZTUJPTElDX05BTUUgPSAic3ltYm9saWNOYW1lIjsgLy8kTk9OLU5MUy0xJAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNX1NZTUJPTElDX05BTUUgPSAic3ltYm9saWNOYW1lIjsgLy8kTk9OLU5MUy0xJAogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElURU1fVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKIAotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBjaGVja0J1bmRsZURlcGxveWVkOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjaGVja0J1bmRsZURlcGxveWVkOwogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSm14U2VydmVyRGVwbG95Q29tbWFuZH0uCi0JICovCi0JcHVibGljIEpteFNlcnZlckRlcGxveUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlKSB7Ci0JCXRoaXMoc2VydmVyQmVoYXZpb3VyLCBtb2R1bGUsIGZhbHNlKTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSm14U2VydmVyRGVwbG95Q29tbWFuZH0uCisgICAgICovCisgICAgcHVibGljIEpteFNlcnZlckRlcGxveUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlKSB7CisgICAgICAgIHRoaXMoc2VydmVyQmVoYXZpb3VyLCBtb2R1bGUsIGZhbHNlKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBKbXhTZXJ2ZXJEZXBsb3lDb21tYW5kfSB0aGF0IGNoZWNrcyB3aGV0aGVyIHRoZSBidW5kbGUgdG8gYmUgZGVwbG95ZWQgaXMgYWN0dWFsbHkgYWxyZWFkeQotCSAqIGRlcGxveWVkLgotCSAqCi0JICogQHBhcmFtIGNoZWNrQnVuZGxlRGVwbG95ZWQKLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IHRvIGNoZWNrIGJlZm9yZSBkZXBsb3lpbmcsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgSm14U2VydmVyRGVwbG95Q29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUsIGJvb2xlYW4gY2hlY2tCdW5kbGVEZXBsb3llZCkgewotCQlzdXBlcihzZXJ2ZXJCZWhhdmlvdXIsIG1vZHVsZSk7Ci0JCXRoaXMuY2hlY2tCdW5kbGVEZXBsb3llZCA9IGNoZWNrQnVuZGxlRGVwbG95ZWQ7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEpteFNlcnZlckRlcGxveUNvbW1hbmR9IHRoYXQgY2hlY2tzIHdoZXRoZXIgdGhlIGJ1bmRsZSB0byBiZSBkZXBsb3llZCBpcyBhY3R1YWxseSBhbHJlYWR5CisgICAgICogZGVwbG95ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hlY2tCdW5kbGVEZXBsb3llZCA8Y29kZT50cnVlPC9jb2RlPiB0byBjaGVjayBiZWZvcmUgZGVwbG95aW5nLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIEpteFNlcnZlckRlcGxveUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlLCBib29sZWFuIGNoZWNrQnVuZGxlRGVwbG95ZWQpIHsKKyAgICAgICAgc3VwZXIoc2VydmVyQmVoYXZpb3VyLCBtb2R1bGUpOworICAgICAgICB0aGlzLmNoZWNrQnVuZGxlRGVwbG95ZWQgPSBjaGVja0J1bmRsZURlcGxveWVkOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgRGVwbG95bWVudElkZW50aXR5IGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotCQlNYXA8U3RyaW5nLCBEZXBsb3ltZW50SWRlbnRpdHk+IGlkZW50aXRpZXMgPSBzZXJ2ZXJCZWhhdmlvdXIuZ2V0RGVwbG95bWVudElkZW50aXRpZXMoKTsKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIERlcGxveW1lbnRJZGVudGl0eSBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgTWFwPFN0cmluZywgRGVwbG95bWVudElkZW50aXR5PiBpZGVudGl0aWVzID0gdGhpcy5zZXJ2ZXJCZWhhdmlvdXIuZ2V0RGVwbG95bWVudElkZW50aXRpZXMoKTsKIAotCQlpZiAoY2hlY2tCdW5kbGVEZXBsb3llZCkgewotCQkJRGVwbG95bWVudElkZW50aXR5IGFscmVhZHlEZXBsb3llZCA9IG5ldyBKbXhTZXJ2ZXJDaGVja0J1bmRsZURlcGxveWVkQ29tbWFuZChzZXJ2ZXJCZWhhdmlvdXIsIG1vZHVsZSkKLQkJCQkJLmV4ZWN1dGUoKTsKLQkJCWlmIChhbHJlYWR5RGVwbG95ZWQgIT0gbnVsbCkgewotCQkJCWlkZW50aXRpZXMucHV0KG1vZHVsZS5nZXRJZCgpLCBhbHJlYWR5RGVwbG95ZWQpOwotCQkJCXJldHVybiBhbHJlYWR5RGVwbG95ZWQ7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKHRoaXMuY2hlY2tCdW5kbGVEZXBsb3llZCkgeworICAgICAgICAgICAgRGVwbG95bWVudElkZW50aXR5IGFscmVhZHlEZXBsb3llZCA9IG5ldyBKbXhTZXJ2ZXJDaGVja0J1bmRsZURlcGxveWVkQ29tbWFuZCh0aGlzLnNlcnZlckJlaGF2aW91ciwgdGhpcy5tb2R1bGUpLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGlmIChhbHJlYWR5RGVwbG95ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlkZW50aXRpZXMucHV0KHRoaXMubW9kdWxlLmdldElkKCksIGFscmVhZHlEZXBsb3llZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFscmVhZHlEZXBsb3llZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCUNvbXBvc2l0ZURhdGEgcmV0dXJuVmFsdWUgPSBkb0V4ZWN1dGUoKTsKLQkJaWYgKHJldHVyblZhbHVlICE9IG51bGwpIHsKLQkJCVN0cmluZyBzeW1ib2xpY05hbWUgPSAoU3RyaW5nKSByZXR1cm5WYWx1ZS5nZXQoSVRFTV9TWU1CT0xJQ19OQU1FKTsKLQkJCVN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgcmV0dXJuVmFsdWUuZ2V0KElURU1fVkVSU0lPTik7Ci0JCQlEZXBsb3ltZW50SWRlbnRpdHkgaWRlbnRpdHkgPSBuZXcgRGVwbG95bWVudElkZW50aXR5KHN5bWJvbGljTmFtZSwgdmVyc2lvbik7Ci0JCQlpZGVudGl0aWVzLnB1dChtb2R1bGUuZ2V0SWQoKSwgaWRlbnRpdHkpOwotCQkJcmV0dXJuIGlkZW50aXR5OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAgICAgQ29tcG9zaXRlRGF0YSByZXR1cm5WYWx1ZSA9IGRvRXhlY3V0ZSgpOworICAgICAgICBpZiAocmV0dXJuVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHN5bWJvbGljTmFtZSA9IChTdHJpbmcpIHJldHVyblZhbHVlLmdldChJVEVNX1NZTUJPTElDX05BTUUpOworICAgICAgICAgICAgU3RyaW5nIHZlcnNpb24gPSAoU3RyaW5nKSByZXR1cm5WYWx1ZS5nZXQoSVRFTV9WRVJTSU9OKTsKKyAgICAgICAgICAgIERlcGxveW1lbnRJZGVudGl0eSBpZGVudGl0eSA9IG5ldyBEZXBsb3ltZW50SWRlbnRpdHkoc3ltYm9saWNOYW1lLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIGlkZW50aXRpZXMucHV0KHRoaXMubW9kdWxlLmdldElkKCksIGlkZW50aXR5KTsKKyAgICAgICAgICAgIHJldHVybiBpZGVudGl0eTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldE9wZXJhdGlvbkFyZ3VtZW50cygpIHsKLQkJVVJJIHVyaSA9IG51bGw7Ci0JCWlmIChtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkuZXF1YWxzKEZhY2V0Q29yZVBsdWdpbi5QTEFOX0ZBQ0VUX0lEKSkgewotCQkJU3RyaW5nIGZpbGVOYW1lID0gbW9kdWxlLmdldElkKCk7Ci0JCQlmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5sYXN0SW5kZXhPZignLycpICsgMSk7Ci0JCQl1cmkgPSBnZXRVcmkoc2VydmVyQmVoYXZpb3VyLmdldE1vZHVsZURlcGxveVVyaShtb2R1bGUpLmFwcGVuZChmaWxlTmFtZSkpOwotCQl9IGVsc2UgewotCQkJdXJpID0gZ2V0VXJpKHNlcnZlckJlaGF2aW91ci5nZXRNb2R1bGVEZXBsb3lVcmkobW9kdWxlKSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IHVyaS50b1N0cmluZygpLCBmYWxzZSB9OwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE9iamVjdFtdIGdldE9wZXJhdGlvbkFyZ3VtZW50cygpIHsKKyAgICAgICAgVVJJIHVyaSA9IG51bGw7CisgICAgICAgIGlmICh0aGlzLm1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKS5lcXVhbHMoRmFjZXRDb3JlUGx1Z2luLlBMQU5fRkFDRVRfSUQpKSB7CisgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSB0aGlzLm1vZHVsZS5nZXRJZCgpOworICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoZmlsZU5hbWUubGFzdEluZGV4T2YoJy8nKSArIDEpOworICAgICAgICAgICAgdXJpID0gZ2V0VXJpKHRoaXMuc2VydmVyQmVoYXZpb3VyLmdldE1vZHVsZURlcGxveVVyaSh0aGlzLm1vZHVsZSkuYXBwZW5kKGZpbGVOYW1lKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1cmkgPSBnZXRVcmkodGhpcy5zZXJ2ZXJCZWhhdmlvdXIuZ2V0TW9kdWxlRGVwbG95VXJpKHRoaXMubW9kdWxlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IHVyaS50b1N0cmluZygpLCBmYWxzZSB9OworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAiZGVwbG95IjsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3BlcmF0aW9uTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJkZXBsb3kiOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0VGltZW91dCgpIHsKLQkJU2VydmVyIHNlcnZlciA9IFNlcnZlclV0aWxzLmdldFNlcnZlcihzZXJ2ZXJCZWhhdmlvdXIpOwotCQlyZXR1cm4gc2VydmVyLmdldERlcGxveVRpbWVvdXQoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBnZXRUaW1lb3V0KCkgeworICAgICAgICBTZXJ2ZXIgc2VydmVyID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyKHRoaXMuc2VydmVyQmVoYXZpb3VyKTsKKyAgICAgICAgcmV0dXJuIHNlcnZlci5nZXREZXBsb3lUaW1lb3V0KCk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvSm14U2VydmVyUGluZ0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9KbXhTZXJ2ZXJQaW5nQ29tbWFuZC5qYXZhCmluZGV4IDc5NDg4NDQuLmNjNmJjZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9KbXhTZXJ2ZXJQaW5nQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9KbXhTZXJ2ZXJQaW5nQ29tbWFuZC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUuY29tbWFuZDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yMCwzOSArMjEsMzggQEAKIAogLyoqCiAgKiB7QGxpbmsgSVNlcnZlckNvbW1hbmR9IHRvIHBpbmcgYSBkbSBTZXJ2ZXIuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMQogICovCiBwdWJsaWMgY2xhc3MgSm14U2VydmVyUGluZ0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdEpteFNlcnZlckNvbW1hbmQgaW1wbGVtZW50cyBJU2VydmVyQ29tbWFuZDxCb29sZWFuPiB7CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBKbXhTZXJ2ZXJQaW5nQ29tbWFuZH0uCi0JICovCi0JcHVibGljIEpteFNlcnZlclBpbmdDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7Ci0JCXN1cGVyKHNlcnZlckJlaGF2aW91cik7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEpteFNlcnZlclBpbmdDb21tYW5kfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSm14U2VydmVyUGluZ0NvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIpIHsKKyAgICAgICAgc3VwZXIoc2VydmVyQmVoYXZpb3VyKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBCb29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewogCi0JCUpteFNlcnZlckNvbW1hbmRUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG5ldyBKbXhTZXJ2ZXJDb21tYW5kVGVtcGxhdGUoKSB7CisgICAgICAgIEpteFNlcnZlckNvbW1hbmRUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG5ldyBKbXhTZXJ2ZXJDb21tYW5kVGVtcGxhdGUoKSB7CiAKLQkJCXB1YmxpYyBPYmplY3QgaW52b2tlT3BlcmF0aW9uKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlPYmplY3ROYW1lIG5hbWUgPSBPYmplY3ROYW1lLmdldEluc3RhbmNlKHNlcnZlckJlaGF2aW91ci5nZXRWZXJzaW9uSGFuZGxlcigpCi0JCQkJCQkuZ2V0UmVjb3ZlcnlNb25pdG9yTUJlYW5OYW1lKCkpOwotCQkJCXJldHVybiBjb25uZWN0aW9uLmdldEF0dHJpYnV0ZShuYW1lLCAiUmVjb3ZlcnlDb21wbGV0ZSIpOwotCQkJfQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBpbnZva2VPcGVyYXRpb24oTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IE9iamVjdE5hbWUuZ2V0SW5zdGFuY2UoSm14U2VydmVyUGluZ0NvbW1hbmQudGhpcy5zZXJ2ZXJCZWhhdmlvdXIuZ2V0VmVyc2lvbkhhbmRsZXIoKS5nZXRSZWNvdmVyeU1vbml0b3JNQmVhbk5hbWUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0QXR0cmlidXRlKG5hbWUsICJSZWNvdmVyeUNvbXBsZXRlIik7CisgICAgICAgICAgICB9CiAKLQkJfTsKKyAgICAgICAgfTsKIAotCQlPYmplY3QgcmV0dXJuVmFsdWUgPSBleGVjdXRlKHRlbXBsYXRlKTsKLQkJaWYgKHJldHVyblZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJcmV0dXJuIChCb29sZWFuKSByZXR1cm5WYWx1ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgICAgIE9iamVjdCByZXR1cm5WYWx1ZSA9IGV4ZWN1dGUodGVtcGxhdGUpOworICAgICAgICBpZiAocmV0dXJuVmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7CisgICAgICAgICAgICByZXR1cm4gKEJvb2xlYW4pIHJldHVyblZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0pteFNlcnZlclJlZnJlc2hDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvSm14U2VydmVyUmVmcmVzaENvbW1hbmQuamF2YQppbmRleCBhODY5OGQzLi5kNTNkOTAwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvSm14U2VydmVyUmVmcmVzaENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvSm14U2VydmVyUmVmcmVzaENvbW1hbmQuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLmNvbW1hbmQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMTksNDQgKzIwLDQ2IEBACiAKIC8qKgogICoge0BsaW5rIElTZXJ2ZXJDb21tYW5kfSB0byB1cGRhdGUgYSBQQVIgb3IgYnVuZGxlIG9uIGEgZG0gU2VydmVyLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMS4wLjEKICAqLwotcHVibGljIGNsYXNzIEpteFNlcnZlclJlZnJlc2hDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RKbXhTZXJ2ZXJEZXBsb3llckNvbW1hbmQ8T2JqZWN0PiBpbXBsZW1lbnRzIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IHsKK3B1YmxpYyBjbGFzcyBKbXhTZXJ2ZXJSZWZyZXNoQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Sm14U2VydmVyRGVwbG95ZXJDb21tYW5kPE9iamVjdD5pbXBsZW1lbnRzIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IHsKIAotCS8qKiBTeW1ib2xpYyBuYW1lIG9mIHRoZSBidW5kbGUgdG8gdXBkYXRlICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lOworICAgIC8qKiBTeW1ib2xpYyBuYW1lIG9mIHRoZSBidW5kbGUgdG8gdXBkYXRlICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lOwogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSm14U2VydmVyUmVmcmVzaENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBKbXhTZXJ2ZXJSZWZyZXNoQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBidW5kbGVTeW1ib2xpY05hbWUpIHsKLQkJc3VwZXIoc2VydmVyQmVoYXZpb3VyLCBtb2R1bGUpOwotCQl0aGlzLmJ1bmRsZVN5bWJvbGljTmFtZSA9IGJ1bmRsZVN5bWJvbGljTmFtZTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSm14U2VydmVyUmVmcmVzaENvbW1hbmR9LgorICAgICAqLworICAgIHB1YmxpYyBKbXhTZXJ2ZXJSZWZyZXNoQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBidW5kbGVTeW1ib2xpY05hbWUpIHsKKyAgICAgICAgc3VwZXIoc2VydmVyQmVoYXZpb3VyLCBtb2R1bGUpOworICAgICAgICB0aGlzLmJ1bmRsZVN5bWJvbGljTmFtZSA9IGJ1bmRsZVN5bWJvbGljTmFtZTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFZvaWQgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7Ci0JCWRvRXhlY3V0ZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBWb2lkIGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBkb0V4ZWN1dGUoKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSBnZXRPcGVyYXRpb25Bcmd1bWVudHMoKSB7Ci0JCVVSSSB1cmkgPSBnZXRVcmkoc2VydmVyQmVoYXZpb3VyLmdldE1vZHVsZURlcGxveVVyaShtb2R1bGUpKTsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IHVyaS50b1N0cmluZygpLCBidW5kbGVTeW1ib2xpY05hbWUgfTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBPYmplY3RbXSBnZXRPcGVyYXRpb25Bcmd1bWVudHMoKSB7CisgICAgICAgIFVSSSB1cmkgPSBnZXRVcmkodGhpcy5zZXJ2ZXJCZWhhdmlvdXIuZ2V0TW9kdWxlRGVwbG95VXJpKHRoaXMubW9kdWxlKSk7CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10geyB1cmkudG9TdHJpbmcoKSwgdGhpcy5idW5kbGVTeW1ib2xpY05hbWUgfTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCkgewotCQlyZXR1cm4gInJlZnJlc2giOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCkgeworICAgICAgICByZXR1cm4gInJlZnJlc2giOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0pteFNlcnZlclNodXRkb3duQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0pteFNlcnZlclNodXRkb3duQ29tbWFuZC5qYXZhCmluZGV4IGE3ZDc0MDIuLjI1ZGQ0YmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9KbXhTZXJ2ZXJTaHV0ZG93bkNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvSm14U2VydmVyU2h1dGRvd25Db21tYW5kLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZS5jb21tYW5kOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTIwLDM1ICsyMSwzNSBAQAogCiAvKioKICAqIHtAbGluayBJU2VydmVyQ29tbWFuZH0gdG8gc2h1dGRvd24gYSBkbSBTZXJ2ZXIuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMQogICovCiBwdWJsaWMgY2xhc3MgSm14U2VydmVyU2h1dGRvd25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RKbXhTZXJ2ZXJDb21tYW5kIGltcGxlbWVudHMgSVNlcnZlckNvbW1hbmQ8Vm9pZD4gewogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSm14U2VydmVyU2h1dGRvd25Db21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgSm14U2VydmVyU2h1dGRvd25Db21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7Ci0JCXN1cGVyKHNlcnZlckJlaGF2aW91cik7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEpteFNlcnZlclNodXRkb3duQ29tbWFuZH0uCisgICAgICovCisgICAgcHVibGljIEpteFNlcnZlclNodXRkb3duQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cikgeworICAgICAgICBzdXBlcihzZXJ2ZXJCZWhhdmlvdXIpOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVm9pZCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFZvaWQgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7CiAKLQkJSm14U2VydmVyQ29tbWFuZFRlbXBsYXRlIHRlbXBsYXRlID0gbmV3IEpteFNlcnZlckNvbW1hbmRUZW1wbGF0ZSgpIHsKKyAgICAgICAgSm14U2VydmVyQ29tbWFuZFRlbXBsYXRlIHRlbXBsYXRlID0gbmV3IEpteFNlcnZlckNvbW1hbmRUZW1wbGF0ZSgpIHsKIAotCQkJcHVibGljIE9iamVjdCBpbnZva2VPcGVyYXRpb24oTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHRocm93cyBFeGNlcHRpb24gewotCQkJCU9iamVjdE5hbWUgbmFtZSA9IE9iamVjdE5hbWUuZ2V0SW5zdGFuY2Uoc2VydmVyQmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2h1dGRvd25NQmVhbk5hbWUoKSk7Ci0JCQkJcmV0dXJuIGNvbm5lY3Rpb24uaW52b2tlKG5hbWUsICJzaHV0ZG93biIsIG51bGwsIG51bGwpOwotCQkJfQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBpbnZva2VPcGVyYXRpb24oTUJlYW5TZXJ2ZXJDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgbmFtZSA9IE9iamVjdE5hbWUuZ2V0SW5zdGFuY2UoSm14U2VydmVyU2h1dGRvd25Db21tYW5kLnRoaXMuc2VydmVyQmVoYXZpb3VyLmdldFZlcnNpb25IYW5kbGVyKCkuZ2V0U2h1dGRvd25NQmVhbk5hbWUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uaW52b2tlKG5hbWUsICJzaHV0ZG93biIsIG51bGwsIG51bGwpOworICAgICAgICAgICAgfQogCi0JCX07CisgICAgICAgIH07CiAKLQkJZXhlY3V0ZSh0ZW1wbGF0ZSk7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAgICAgZXhlY3V0ZSh0ZW1wbGF0ZSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0pteFNlcnZlclVuZGVwbG95Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0pteFNlcnZlclVuZGVwbG95Q29tbWFuZC5qYXZhCmluZGV4IGQyY2FiOGQuLmQwOGIyMzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9KbXhTZXJ2ZXJVbmRlcGxveUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvSm14U2VydmVyVW5kZXBsb3lDb21tYW5kLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZS5jb21tYW5kOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTIxLDM4ICsyMiwzNyBAQAogCiAvKioKICAqIHtAbGluayBJU2VydmVyQ29tbWFuZH0gdG8gdW5kZXBsb3kgYXJ0aWZhY3RzIG9uIFZpcmdvCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBhdXRob3IgTGVvIERvcyBTYW50b3MKICAqIEBzaW5jZSAyLjMuMQogICovCi1wdWJsaWMgY2xhc3MgSm14U2VydmVyVW5kZXBsb3lDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RKbXhTZXJ2ZXJEZXBsb3llckNvbW1hbmQ8Q29tcG9zaXRlRGF0YT4gaW1wbGVtZW50cwotCQlJU2VydmVyQ29tbWFuZDxWb2lkPiB7CitwdWJsaWMgY2xhc3MgSm14U2VydmVyVW5kZXBsb3lDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RKbXhTZXJ2ZXJEZXBsb3llckNvbW1hbmQ8Q29tcG9zaXRlRGF0YT5pbXBsZW1lbnRzIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IHsKIAotCS8qKiB7QGxpbmsgRGVwbG95bWVudElkZW50aXR5fSBvZiB0aGUgZGVwbG95ZWQgUEFSIG9yIGJ1bmRsZSAqLwotCXByaXZhdGUgZmluYWwgRGVwbG95bWVudElkZW50aXR5IGlkZW50aXR5OworICAgIC8qKiB7QGxpbmsgRGVwbG95bWVudElkZW50aXR5fSBvZiB0aGUgZGVwbG95ZWQgUEFSIG9yIGJ1bmRsZSAqLworICAgIHByaXZhdGUgZmluYWwgRGVwbG95bWVudElkZW50aXR5IGlkZW50aXR5OwogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSm14U2VydmVyVW5kZXBsb3lDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgSm14U2VydmVyVW5kZXBsb3lDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLCBJTW9kdWxlIG1vZHVsZSkgewotCQlzdXBlcihzZXJ2ZXJCZWhhdmlvdXIsIG1vZHVsZSk7Ci0JCWlkZW50aXR5ID0gc2VydmVyQmVoYXZpb3VyLmdldERlcGxveW1lbnRJZGVudGl0aWVzKCkucmVtb3ZlKG1vZHVsZS5nZXRJZCgpKTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSm14U2VydmVyVW5kZXBsb3lDb21tYW5kfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSm14U2VydmVyVW5kZXBsb3lDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLCBJTW9kdWxlIG1vZHVsZSkgeworICAgICAgICBzdXBlcihzZXJ2ZXJCZWhhdmlvdXIsIG1vZHVsZSk7CisgICAgICAgIHRoaXMuaWRlbnRpdHkgPSBzZXJ2ZXJCZWhhdmlvdXIuZ2V0RGVwbG95bWVudElkZW50aXRpZXMoKS5yZW1vdmUobW9kdWxlLmdldElkKCkpOworICAgIH0KIAotCXB1YmxpYyBWb2lkIGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewotCQlkb0V4ZWN1dGUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIHB1YmxpYyBWb2lkIGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBkb0V4ZWN1dGUoKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldE9wZXJhdGlvbkFyZ3VtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGlkZW50aXR5LmdldFN5bWJvbGljTmFtZSgpLCBpZGVudGl0eS5nZXRWZXJzaW9uKCkgfTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE9iamVjdFtdIGdldE9wZXJhdGlvbkFyZ3VtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IHRoaXMuaWRlbnRpdHkuZ2V0U3ltYm9saWNOYW1lKCksIHRoaXMuaWRlbnRpdHkuZ2V0VmVyc2lvbigpIH07CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPcGVyYXRpb25OYW1lKCkgewotCQlyZXR1cm4gInVuZGVwbG95IjsgLy8kTk9OLU5MUy0xJAotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZXJhdGlvbk5hbWUoKSB7CisgICAgICAgIHJldHVybiAidW5kZXBsb3kiOyAvLyROT04tTkxTLTEkCisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvSm14U2VydmVyVXBkYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9jb21tYW5kL0pteFNlcnZlclVwZGF0ZUNvbW1hbmQuamF2YQppbmRleCBjOGVlNGY5Li5iMGQ4OTIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL2NvbW1hbmQvSm14U2VydmVyVXBkYXRlQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvY29tbWFuZC9KbXhTZXJ2ZXJVcGRhdGVDb21tYW5kLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZS5jb21tYW5kOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMjUsMTQ2ICsyNiwxNDMgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZpbGU7CiAKIC8qKgotICoge0BsaW5rIElTZXJ2ZXJDb21tYW5kfSB0byB1cGRhdGUvcmVmcmVzaCBhIHNpbmdsZSBzdGF0aWMgcmVzb3VyY2Ugb24gZG0KLSAqIFNlcnZlciAyLjAuCi0gKiAKKyAqIHtAbGluayBJU2VydmVyQ29tbWFuZH0gdG8gdXBkYXRlL3JlZnJlc2ggYSBzaW5nbGUgc3RhdGljIHJlc291cmNlIG9uIGRtIFNlcnZlciAyLjAuCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMi4yLjIKICAqLwogcHVibGljIGNsYXNzIEpteFNlcnZlclVwZGF0ZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdEpteFNlcnZlckNvbW1hbmQgaW1wbGVtZW50cyBJU2VydmVyQ29tbWFuZDxWb2lkPiB7CiAKLQkvKioKLQkgKiBTeW1ib2xpYyBuYW1lIG9mIHRoZSBidW5kbGUgaW5zaWRlIGEgUEFSIHRoYXQgY29udGFpbnMgdGhlIHJlc291cmNlIHRvCi0JICogdXBkYXRlCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lOworICAgIC8qKgorICAgICAqIFN5bWJvbGljIG5hbWUgb2YgdGhlIGJ1bmRsZSBpbnNpZGUgYSBQQVIgdGhhdCBjb250YWlucyB0aGUgcmVzb3VyY2UgdG8gdXBkYXRlCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lOwogCi0JLyoqIHtAbGluayBEZXBsb3ltZW50SWRlbnRpdHl9IG9mIHRoZSBkZXBsb3llZCBQQVIgb3IgYnVuZGxlICovCi0JcHJpdmF0ZSBmaW5hbCBEZXBsb3ltZW50SWRlbnRpdHkgaWRlbnRpdHk7CisgICAgLyoqIHtAbGluayBEZXBsb3ltZW50SWRlbnRpdHl9IG9mIHRoZSBkZXBsb3llZCBQQVIgb3IgYnVuZGxlICovCisgICAgcHJpdmF0ZSBmaW5hbCBEZXBsb3ltZW50SWRlbnRpdHkgaWRlbnRpdHk7CiAKLQkvKiogRmlsZSB0byByZWZyZXNoIG9yIHVwZGF0ZSAqLwotCXByaXZhdGUgZmluYWwgSU1vZHVsZUZpbGUgbW9kdWxlRmlsZTsKKyAgICAvKiogRmlsZSB0byByZWZyZXNoIG9yIHVwZGF0ZSAqLworICAgIHByaXZhdGUgZmluYWwgSU1vZHVsZUZpbGUgbW9kdWxlRmlsZTsKIAotCS8qKiBNb2R1bGUgdGhhdCBuZWVkcyByZWZyZXNoaW5nICovCi0JcHJpdmF0ZSBmaW5hbCBJTW9kdWxlIG1vZHVsZTsKKyAgICAvKiogTW9kdWxlIHRoYXQgbmVlZHMgcmVmcmVzaGluZyAqLworICAgIHByaXZhdGUgZmluYWwgSU1vZHVsZSBtb2R1bGU7CiAKLQkvKiogVGFyZ2V0IHBhdGggb2YgdGhlIGZpbGUgcmVsYXRpdmUgdG8gdGhlIFBBUiBvciBidW5kbGUgcm9vdCAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHRhcmdldFBhdGg7CisgICAgLyoqIFRhcmdldCBwYXRoIG9mIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHRoZSBQQVIgb3IgYnVuZGxlIHJvb3QgKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0YXJnZXRQYXRoOwogCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYnVuZGxlT2JqZWN0TmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBidW5kbGVPYmplY3ROYW1lOwogCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFyT2JqZWN0TmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwYXJPYmplY3ROYW1lOwogCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGxhbk9iamVjdE5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGxhbk9iamVjdE5hbWU7CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBKbXhTZXJ2ZXJVcGRhdGVDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgSm14U2VydmVyVXBkYXRlQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUsIElNb2R1bGVGaWxlIG1vZHVsZUZpbGUsCi0JCURlcGxveW1lbnRJZGVudGl0eSBpZGVudGl0eSwgU3RyaW5nIGJ1bmRsZVN5bWJvbGljTmFtZSwgU3RyaW5nIHRhcmdldFBhdGgsIFN0cmluZyBidW5kbGVPYmplY3ROYW1lLAotCQlTdHJpbmcgcGFyT2JqZWN0TmFtZSwgU3RyaW5nIHBsYW5PYmplY3ROYW1lKSB7Ci0JCXN1cGVyKHNlcnZlckJlaGF2aW91cik7Ci0JCXRoaXMuYnVuZGxlU3ltYm9saWNOYW1lID0gYnVuZGxlU3ltYm9saWNOYW1lOwotCQl0aGlzLm1vZHVsZUZpbGUgPSBtb2R1bGVGaWxlOwotCQl0aGlzLm1vZHVsZSA9IG1vZHVsZTsKLQkJdGhpcy5pZGVudGl0eSA9IGlkZW50aXR5OwotCQl0aGlzLnRhcmdldFBhdGggPSB0YXJnZXRQYXRoOwotCQl0aGlzLmJ1bmRsZU9iamVjdE5hbWUgPSBidW5kbGVPYmplY3ROYW1lOwotCQl0aGlzLnBhck9iamVjdE5hbWUgPSBwYXJPYmplY3ROYW1lOwotCQl0aGlzLnBsYW5PYmplY3ROYW1lID0gcGxhbk9iamVjdE5hbWU7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEpteFNlcnZlclVwZGF0ZUNvbW1hbmR9LgorICAgICAqLworICAgIHB1YmxpYyBKbXhTZXJ2ZXJVcGRhdGVDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLCBJTW9kdWxlIG1vZHVsZSwgSU1vZHVsZUZpbGUgbW9kdWxlRmlsZSwgRGVwbG95bWVudElkZW50aXR5IGlkZW50aXR5LAorICAgICAgICBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lLCBTdHJpbmcgdGFyZ2V0UGF0aCwgU3RyaW5nIGJ1bmRsZU9iamVjdE5hbWUsIFN0cmluZyBwYXJPYmplY3ROYW1lLCBTdHJpbmcgcGxhbk9iamVjdE5hbWUpIHsKKyAgICAgICAgc3VwZXIoc2VydmVyQmVoYXZpb3VyKTsKKyAgICAgICAgdGhpcy5idW5kbGVTeW1ib2xpY05hbWUgPSBidW5kbGVTeW1ib2xpY05hbWU7CisgICAgICAgIHRoaXMubW9kdWxlRmlsZSA9IG1vZHVsZUZpbGU7CisgICAgICAgIHRoaXMubW9kdWxlID0gbW9kdWxlOworICAgICAgICB0aGlzLmlkZW50aXR5ID0gaWRlbnRpdHk7CisgICAgICAgIHRoaXMudGFyZ2V0UGF0aCA9IHRhcmdldFBhdGg7CisgICAgICAgIHRoaXMuYnVuZGxlT2JqZWN0TmFtZSA9IGJ1bmRsZU9iamVjdE5hbWU7CisgICAgICAgIHRoaXMucGFyT2JqZWN0TmFtZSA9IHBhck9iamVjdE5hbWU7CisgICAgICAgIHRoaXMucGxhbk9iamVjdE5hbWUgPSBwbGFuT2JqZWN0TmFtZTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFZvaWQgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBWb2lkIGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24gewogCi0JCUpteFNlcnZlckNvbW1hbmRUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG5ldyBKbXhTZXJ2ZXJDb21tYW5kVGVtcGxhdGUoKSB7CisgICAgICAgIEpteFNlcnZlckNvbW1hbmRUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG5ldyBKbXhTZXJ2ZXJDb21tYW5kVGVtcGxhdGUoKSB7CiAKLQkJCXB1YmxpYyBPYmplY3QgaW52b2tlT3BlcmF0aW9uKE1CZWFuU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQlPYmplY3ROYW1lIGJ1bmRsZU9iamVjdCA9IG51bGw7Ci0JCQkJaWYgKGJ1bmRsZVN5bWJvbGljTmFtZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXJ0aWFsT2JqZWN0TmFtZSA9ICJvcmcuZWNsaXBzZS52aXJnby5rZXJuZWw6YXJ0aWZhY3QtdHlwZT1idW5kbGUsbmFtZT0iCi0JCQkJCQkrIGJ1bmRsZVN5bWJvbGljTmFtZSArICIsdHlwZT1Nb2RlbCx2ZXJzaW9uPSI7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGludm9rZU9wZXJhdGlvbihNQmVhblNlcnZlckNvbm5lY3Rpb24gY29ubmVjdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBidW5kbGVPYmplY3QgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChKbXhTZXJ2ZXJVcGRhdGVDb21tYW5kLnRoaXMuYnVuZGxlU3ltYm9saWNOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnRpYWxPYmplY3ROYW1lID0gIm9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbDphcnRpZmFjdC10eXBlPWJ1bmRsZSxuYW1lPSIgKyBKbXhTZXJ2ZXJVcGRhdGVDb21tYW5kLnRoaXMuYnVuZGxlU3ltYm9saWNOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICIsdHlwZT1Nb2RlbCx2ZXJzaW9uPSI7CiAKLQkJCQkJU3RyaW5nIHBhck9iamVjdCA9IG51bGw7Ci0JCQkJCS8vIEZpZ3VyZSBvdXQgdGhlIGJ1bmRsZSByZWZlcmVuY2UgZnJvbSBwYXIgb3IgcGxhbgotCQkJCQkvLyBkZXBlbmRlbnRzCi0JCQkJCWlmIChtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkuZXF1YWxzKEZhY2V0Q29yZVBsdWdpbi5QQVJfRkFDRVRfSUQpKSB7Ci0JCQkJCQlwYXJPYmplY3QgPSBwYXJPYmplY3ROYW1lLnJlcGxhY2UoIiRWRVJTSU9OIiwgaWRlbnRpdHkuZ2V0VmVyc2lvbigpKQotCQkJCQkJCQkucmVwbGFjZSgiJE5BTUUiLCBpZGVudGl0eS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXJPYmplY3QgPSBwbGFuT2JqZWN0TmFtZS5yZXBsYWNlKCIkVkVSU0lPTiIsIGlkZW50aXR5LmdldFZlcnNpb24oKSkKLQkJCQkJCQkJLnJlcGxhY2UoIiROQU1FIiwgaWRlbnRpdHkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJCQl9CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJPYmplY3QgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IHRoZSBidW5kbGUgcmVmZXJlbmNlIGZyb20gcGFyIG9yIHBsYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kZW50cworICAgICAgICAgICAgICAgICAgICBpZiAoSm14U2VydmVyVXBkYXRlQ29tbWFuZC50aGlzLm1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKS5lcXVhbHMoRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhck9iamVjdCA9IEpteFNlcnZlclVwZGF0ZUNvbW1hbmQudGhpcy5wYXJPYmplY3ROYW1lLnJlcGxhY2UoIiRWRVJTSU9OIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKbXhTZXJ2ZXJVcGRhdGVDb21tYW5kLnRoaXMuaWRlbnRpdHkuZ2V0VmVyc2lvbigpKS5yZXBsYWNlKCIkTkFNRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpteFNlcnZlclVwZGF0ZUNvbW1hbmQudGhpcy5pZGVudGl0eS5nZXRTeW1ib2xpY05hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJPYmplY3QgPSBKbXhTZXJ2ZXJVcGRhdGVDb21tYW5kLnRoaXMucGxhbk9iamVjdE5hbWUucmVwbGFjZSgiJFZFUlNJT04iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpteFNlcnZlclVwZGF0ZUNvbW1hbmQudGhpcy5pZGVudGl0eS5nZXRWZXJzaW9uKCkpLnJlcGxhY2UoIiROQU1FIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm14U2VydmVyVXBkYXRlQ29tbWFuZC50aGlzLmlkZW50aXR5LmdldFN5bWJvbGljTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCU9iamVjdE5hbWUgbmFtZSA9IE9iamVjdE5hbWUuZ2V0SW5zdGFuY2UocGFyT2JqZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSBuYW1lID0gT2JqZWN0TmFtZS5nZXRJbnN0YW5jZShwYXJPYmplY3QpOwogCi0JCQkJCU9iamVjdE5hbWVbXSBkZXBlbmRlbnRzID0gKE9iamVjdE5hbWVbXSkgY29ubmVjdGlvbgotCQkJCQkJCS5nZXRBdHRyaWJ1dGUobmFtZSwgZ2V0RGVwZW5kZW50c0F0dHJpYnV0ZU5hbWUoKSk7Ci0JCQkJCWZvciAoT2JqZWN0TmFtZSBkZXBlbmRlbnQgOiBkZXBlbmRlbnRzKSB7Ci0JCQkJCQlpZiAoZGVwZW5kZW50LmdldENhbm9uaWNhbE5hbWUoKS5zdGFydHNXaXRoKHBhcnRpYWxPYmplY3ROYW1lKQotCQkJCQkJCXx8IGRlcGVuZGVudC5nZXRDYW5vbmljYWxOYW1lKCkuY29udGFpbnMoIi0iICsgYnVuZGxlU3ltYm9saWNOYW1lICsgIix0eXBlPU1vZGVsIikpIHsKLQkJCQkJCQlidW5kbGVPYmplY3QgPSBkZXBlbmRlbnQ7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlidW5kbGVPYmplY3QgPSBPYmplY3ROYW1lLmdldEluc3RhbmNlKGJ1bmRsZU9iamVjdE5hbWUucmVwbGFjZSgiJFZFUlNJT04iLCBpZGVudGl0eS5nZXRWZXJzaW9uKCkpCi0JCQkJCQkJLnJlcGxhY2UoIiROQU1FIiwgaWRlbnRpdHkuZ2V0U3ltYm9saWNOYW1lKCkpKTsKLQkJCQl9CisgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWVbXSBkZXBlbmRlbnRzID0gKE9iamVjdE5hbWVbXSkgY29ubmVjdGlvbi5nZXRBdHRyaWJ1dGUobmFtZSwgZ2V0RGVwZW5kZW50c0F0dHJpYnV0ZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0TmFtZSBkZXBlbmRlbnQgOiBkZXBlbmRlbnRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwZW5kZW50LmdldENhbm9uaWNhbE5hbWUoKS5zdGFydHNXaXRoKHBhcnRpYWxPYmplY3ROYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRlcGVuZGVudC5nZXRDYW5vbmljYWxOYW1lKCkuY29udGFpbnMoIi0iICsgSm14U2VydmVyVXBkYXRlQ29tbWFuZC50aGlzLmJ1bmRsZVN5bWJvbGljTmFtZSArICIsdHlwZT1Nb2RlbCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlT2JqZWN0ID0gZGVwZW5kZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVuZGxlT2JqZWN0ID0gT2JqZWN0TmFtZS5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEpteFNlcnZlclVwZGF0ZUNvbW1hbmQudGhpcy5idW5kbGVPYmplY3ROYW1lLnJlcGxhY2UoIiRWRVJTSU9OIiwgSm14U2VydmVyVXBkYXRlQ29tbWFuZC50aGlzLmlkZW50aXR5LmdldFZlcnNpb24oKSkucmVwbGFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJE5BTUUiLCBKbXhTZXJ2ZXJVcGRhdGVDb21tYW5kLnRoaXMuaWRlbnRpdHkuZ2V0U3ltYm9saWNOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQkvLyBVcGRhdGUgdGhlIHJlc291cmNlCi0JCQkJT2JqZWN0W10gb3BlcmF0aW9uQXJndW1lbnRzID0gZ2V0VXBkYXRlT3BlcmF0aW9uQXJndW1lbnRzKCk7CisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZXNvdXJjZQorICAgICAgICAgICAgICAgIE9iamVjdFtdIG9wZXJhdGlvbkFyZ3VtZW50cyA9IGdldFVwZGF0ZU9wZXJhdGlvbkFyZ3VtZW50cygpOwogCi0JCQkJU3RyaW5nW10gY2xhc3NOYW1lcyA9IG5ldyBTdHJpbmdbb3BlcmF0aW9uQXJndW1lbnRzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25Bcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKG9wZXJhdGlvbkFyZ3VtZW50c1tpXSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLQkJCQkJCWNsYXNzTmFtZXNbaV0gPSBib29sZWFuLmNsYXNzLmdldE5hbWUoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNsYXNzTmFtZXNbaV0gPSBvcGVyYXRpb25Bcmd1bWVudHNbaV0uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQl9CisgICAgICAgICAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lcyA9IG5ldyBTdHJpbmdbb3BlcmF0aW9uQXJndW1lbnRzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcGVyYXRpb25Bcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbkFyZ3VtZW50c1tpXSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZXNbaV0gPSBib29sZWFuLmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZXNbaV0gPSBvcGVyYXRpb25Bcmd1bWVudHNbaV0uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlyZXR1cm4gY29ubmVjdGlvbi5pbnZva2UoCWJ1bmRsZU9iamVjdCwgZ2V0VXBkYXRlT3BlcmF0aW9uTmFtZShvcGVyYXRpb25Bcmd1bWVudHMpLAotCQkJCQkJCQkJCQlvcGVyYXRpb25Bcmd1bWVudHMsCi0JCQkJCQkJCQkJCWNsYXNzTmFtZXMpOwotCQkJfQorICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmludm9rZShidW5kbGVPYmplY3QsIGdldFVwZGF0ZU9wZXJhdGlvbk5hbWUob3BlcmF0aW9uQXJndW1lbnRzKSwgb3BlcmF0aW9uQXJndW1lbnRzLCBjbGFzc05hbWVzKTsKKyAgICAgICAgICAgIH0KIAotCQl9OworICAgICAgICB9OwogCi0JCWV4ZWN1dGUodGVtcGxhdGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgICAgIGV4ZWN1dGUodGVtcGxhdGUpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldFVwZGF0ZU9wZXJhdGlvbkFyZ3VtZW50cygpIHsKLQkJVVJJIHVyaSA9IEFic3RyYWN0Sm14U2VydmVyRGVwbG95ZXJDb21tYW5kLmdldFVyaShzZXJ2ZXJCZWhhdmlvdXIuZ2V0TW9kdWxlRGVwbG95VXJpKG1vZHVsZSkKLQkJCQkuYXBwZW5kKG1vZHVsZUZpbGUuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpLmFwcGVuZChtb2R1bGVGaWxlLmdldE5hbWUoKSkpOwotCQlpZiAobmV3IEZpbGUodXJpKS5leGlzdHMoKSkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IHVyaS50b1N0cmluZygpLCB0YXJnZXRQYXRoICsgIi8iICsgbW9kdWxlRmlsZS5nZXROYW1lKCkgfTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgT2JqZWN0W10geyB0YXJnZXRQYXRoICsgIi8iICsgbW9kdWxlRmlsZS5nZXROYW1lKCkgfTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdFtdIGdldFVwZGF0ZU9wZXJhdGlvbkFyZ3VtZW50cygpIHsKKyAgICAgICAgVVJJIHVyaSA9IEFic3RyYWN0Sm14U2VydmVyRGVwbG95ZXJDb21tYW5kLmdldFVyaSgKKyAgICAgICAgICAgIHRoaXMuc2VydmVyQmVoYXZpb3VyLmdldE1vZHVsZURlcGxveVVyaSh0aGlzLm1vZHVsZSkuYXBwZW5kKHRoaXMubW9kdWxlRmlsZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSkuYXBwZW5kKHRoaXMubW9kdWxlRmlsZS5nZXROYW1lKCkpKTsKKyAgICAgICAgaWYgKG5ldyBGaWxlKHVyaSkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10geyB1cmkudG9TdHJpbmcoKSwgdGhpcy50YXJnZXRQYXRoICsgIi8iICsgdGhpcy5tb2R1bGVGaWxlLmdldE5hbWUoKSB9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IHRoaXMudGFyZ2V0UGF0aCArICIvIiArIHRoaXMubW9kdWxlRmlsZS5nZXROYW1lKCkgfTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVwZGF0ZU9wZXJhdGlvbk5hbWUoT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0JCWlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiAiZGVsZXRlRW50cnkiOwotCQl9Ci0JCXJldHVybiAidXBkYXRlRW50cnkiOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRVcGRhdGVPcGVyYXRpb25OYW1lKE9iamVjdFtdIGFyZ3VtZW50cykgeworICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gImRlbGV0ZUVudHJ5IjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gInVwZGF0ZUVudHJ5IjsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXBlbmRlbnRzQXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuICJEZXBlbmRlbnRzIjsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVwZW5kZW50c0F0dHJpYnV0ZU5hbWUoKSB7CisgICAgICAgIHJldHVybiAiRGVwZW5kZW50cyI7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3Byb3Zpc2lvbmluZy9JQXJ0ZWZhY3RSZXBvc2l0b3J5TG9hZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3Byb3Zpc2lvbmluZy9JQXJ0ZWZhY3RSZXBvc2l0b3J5TG9hZGVyLmphdmEKaW5kZXggNzU4ZjRkOC4uNThhNzc1NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9wcm92aXNpb25pbmcvSUFydGVmYWN0UmVwb3NpdG9yeUxvYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvcHJvdmlzaW9uaW5nL0lBcnRlZmFjdFJlcG9zaXRvcnlMb2FkZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLnByb3Zpc2lvbmluZzsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTIwLDYgKzIxLDYgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBJQXJ0ZWZhY3RSZXBvc2l0b3J5TG9hZGVyIHsKIAotCUFydGVmYWN0UmVwb3NpdG9yeSBsb2FkQXJ0ZWZhY3RSZXBvc2l0b3J5KEZpbGUgcm9vdEZvbGRlcik7CisgICAgQXJ0ZWZhY3RSZXBvc2l0b3J5IGxvYWRBcnRlZmFjdFJlcG9zaXRvcnkoRmlsZSByb290Rm9sZGVyKTsKIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvcHJvdmlzaW9uaW5nL0pzb25BcnRlZmFjdFJlcG9zaXRvcnlMb2FkZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvcHJvdmlzaW9uaW5nL0pzb25BcnRlZmFjdFJlcG9zaXRvcnlMb2FkZXIuamF2YQppbmRleCBkZmJiNWNiLi5jZjc5MTI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3Byb3Zpc2lvbmluZy9Kc29uQXJ0ZWZhY3RSZXBvc2l0b3J5TG9hZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9wcm92aXNpb25pbmcvSnNvbkFydGVmYWN0UmVwb3NpdG9yeUxvYWRlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUucHJvdmlzaW9uaW5nOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMzgsMTU4ICszOSwxNTkgQEAKICAqLwogcHVibGljIGNsYXNzIEpzb25BcnRlZmFjdFJlcG9zaXRvcnlMb2FkZXIgaW1wbGVtZW50cyBJQXJ0ZWZhY3RSZXBvc2l0b3J5TG9hZGVyIHsKIAotCXByaXZhdGUgTWFwPFN0cmluZywgT3NnaVZlcnNpb24+IHZlcnNpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPc2dpVmVyc2lvbj4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9zZ2lWZXJzaW9uPiB2ZXJzaW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT3NnaVZlcnNpb24+KCk7CiAKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFZlcnNpb25SYW5nZT4gdmVyc2lvblJhbmdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmVyc2lvblJhbmdlPigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVmVyc2lvblJhbmdlPiB2ZXJzaW9uUmFuZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWZXJzaW9uUmFuZ2U+KCk7CiAKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFBhY2thZ2VJbXBvcnQ+IGltcG9ydHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBhY2thZ2VJbXBvcnQ+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBQYWNrYWdlSW1wb3J0PiBpbXBvcnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQYWNrYWdlSW1wb3J0PigpOwogCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRDbGFzc2VzID0gU2VydmVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCS5nZXRCb29sZWFuKFNlcnZlckNvcmVQbHVnaW4uUFJFRl9MT0FEX0NMQVNTRVNfS0VZKTsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbG9hZENsYXNzZXMgPSBTZXJ2ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKFNlcnZlckNvcmVQbHVnaW4uUFJFRl9MT0FEX0NMQVNTRVNfS0VZKTsKIAotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgRk9STUFUID0gbmV3Ci0JLy8gU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBISDptbTpzcy5TU1MiKTsKKyAgICAvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IEZPUk1BVCA9IG5ldworICAgIC8vIFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgSEg6bW06c3MuU1NTIik7CiAKLQlwdWJsaWMgQXJ0ZWZhY3RSZXBvc2l0b3J5IGxvYWRBcnRlZmFjdFJlcG9zaXRvcnkoRmlsZSByb290Rm9sZGVyKSB7Ci0JCWZpbmFsIEFydGVmYWN0UmVwb3NpdG9yeSBuZXdBcnRlZmFjdFJlcG9zaXRvcnkgPSBuZXcgQXJ0ZWZhY3RSZXBvc2l0b3J5KCk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChyb290Rm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJSVBhdGggYnVuZGxlUGF0aCA9IHBhdGguYXBwZW5kKCJidW5kbGVzIik7Ci0JCUZpbGUgYnVuZGxlRm9sZGVyID0gYnVuZGxlUGF0aC50b0ZpbGUoKTsKLQkJZm9yIChGaWxlIGJ1bmRsZUZpbGUgOiBidW5kbGVGb2xkZXIubGlzdEZpbGVzKCkpIHsKLQkJCW5ldyBKU09ORmlsZVBhcnNlcihidW5kbGVGaWxlKSB7Ci0JCQkJcHVibGljIHZvaWQgcGFyc2UoSlNPTk9iamVjdCBvYmplY3QpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKLQkJCQkJSlNPTk9iamVjdCBidW5kbGVOb2RlID0gKEpTT05PYmplY3QpIG9iamVjdC5nZXQoImJ1bmRsZSIpOwotCQkJCQluZXdBcnRlZmFjdFJlcG9zaXRvcnkuYWRkQnVuZGxlKGNyZWF0ZUJ1bmRsZUFydGVmYWN0KGJ1bmRsZU5vZGUpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCUlQYXRoIGxpYnJhcnlQYXRoID0gcGF0aC5hcHBlbmQoImxpYnJhcmllcyIpOwotCQlGaWxlIGxpYnJhcnlGb2xkZXIgPSBsaWJyYXJ5UGF0aC50b0ZpbGUoKTsKLQkJZm9yIChGaWxlIGxpYnJhcnlGaWxlIDogbGlicmFyeUZvbGRlci5saXN0RmlsZXMoKSkgewotCQkJbmV3IEpTT05GaWxlUGFyc2VyKGxpYnJhcnlGaWxlKSB7Ci0JCQkJcHVibGljIHZvaWQgcGFyc2UoSlNPTk9iamVjdCBvYmplY3QpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKLQkJCQkJSlNPTk9iamVjdCBidW5kbGVOb2RlID0gKEpTT05PYmplY3QpIG9iamVjdC5nZXQoImxpYnJhcnkiKTsKLQkJCQkJbmV3QXJ0ZWZhY3RSZXBvc2l0b3J5LmFkZExpYnJhcnkoY3JlYXRlTGlicmFyeUFydGVmYWN0KGJ1bmRsZU5vZGUpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBuZXdBcnRlZmFjdFJlcG9zaXRvcnk7Ci0JfQorICAgIHB1YmxpYyBBcnRlZmFjdFJlcG9zaXRvcnkgbG9hZEFydGVmYWN0UmVwb3NpdG9yeShGaWxlIHJvb3RGb2xkZXIpIHsKKyAgICAgICAgZmluYWwgQXJ0ZWZhY3RSZXBvc2l0b3J5IG5ld0FydGVmYWN0UmVwb3NpdG9yeSA9IG5ldyBBcnRlZmFjdFJlcG9zaXRvcnkoKTsKKyAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKHJvb3RGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBJUGF0aCBidW5kbGVQYXRoID0gcGF0aC5hcHBlbmQoImJ1bmRsZXMiKTsKKyAgICAgICAgRmlsZSBidW5kbGVGb2xkZXIgPSBidW5kbGVQYXRoLnRvRmlsZSgpOworICAgICAgICBmb3IgKEZpbGUgYnVuZGxlRmlsZSA6IGJ1bmRsZUZvbGRlci5saXN0RmlsZXMoKSkgeworICAgICAgICAgICAgbmV3IEpTT05GaWxlUGFyc2VyKGJ1bmRsZUZpbGUpIHsKIAotCXByaXZhdGUgT3NnaVZlcnNpb24gZ2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvblN0cmluZykgewotCQlpZiAodmVyc2lvbnMuY29udGFpbnNLZXkodmVyc2lvblN0cmluZykpIHsKLQkJCXJldHVybiB2ZXJzaW9ucy5nZXQodmVyc2lvblN0cmluZyk7Ci0JCX0KLQkJT3NnaVZlcnNpb24gdmVyc2lvbiA9IG5ldyBPc2dpVmVyc2lvbih2ZXJzaW9uU3RyaW5nKTsKLQkJdmVyc2lvbnMucHV0KHZlcnNpb25TdHJpbmcsIHZlcnNpb24pOwotCQlyZXR1cm4gdmVyc2lvbjsKLQl9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoSlNPTk9iamVjdCBvYmplY3QpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgSlNPTk9iamVjdCBidW5kbGVOb2RlID0gKEpTT05PYmplY3QpIG9iamVjdC5nZXQoImJ1bmRsZSIpOworICAgICAgICAgICAgICAgICAgICBuZXdBcnRlZmFjdFJlcG9zaXRvcnkuYWRkQnVuZGxlKGNyZWF0ZUJ1bmRsZUFydGVmYWN0KGJ1bmRsZU5vZGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIElQYXRoIGxpYnJhcnlQYXRoID0gcGF0aC5hcHBlbmQoImxpYnJhcmllcyIpOworICAgICAgICBGaWxlIGxpYnJhcnlGb2xkZXIgPSBsaWJyYXJ5UGF0aC50b0ZpbGUoKTsKKyAgICAgICAgZm9yIChGaWxlIGxpYnJhcnlGaWxlIDogbGlicmFyeUZvbGRlci5saXN0RmlsZXMoKSkgeworICAgICAgICAgICAgbmV3IEpTT05GaWxlUGFyc2VyKGxpYnJhcnlGaWxlKSB7CiAKLQlwcml2YXRlIFZlcnNpb25SYW5nZSBnZXRWZXJzaW9uUmFuZ2UoU3RyaW5nIHZlcnNpb25SYW5nZVN0cmluZykgewotCQlpZiAodmVyc2lvblJhbmdlcy5jb250YWluc0tleSh2ZXJzaW9uUmFuZ2VTdHJpbmcpKSB7Ci0JCQlyZXR1cm4gdmVyc2lvblJhbmdlcy5nZXQodmVyc2lvblJhbmdlU3RyaW5nKTsKLQkJfQotCQlWZXJzaW9uUmFuZ2UgdmVyc2lvbiA9IG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvblJhbmdlU3RyaW5nKTsKLQkJdmVyc2lvblJhbmdlcy5wdXQodmVyc2lvblJhbmdlU3RyaW5nLCB2ZXJzaW9uKTsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhcnNlKEpTT05PYmplY3Qgb2JqZWN0KSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIEpTT05PYmplY3QgYnVuZGxlTm9kZSA9IChKU09OT2JqZWN0KSBvYmplY3QuZ2V0KCJsaWJyYXJ5Iik7CisgICAgICAgICAgICAgICAgICAgIG5ld0FydGVmYWN0UmVwb3NpdG9yeS5hZGRMaWJyYXJ5KGNyZWF0ZUxpYnJhcnlBcnRlZmFjdChidW5kbGVOb2RlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3QXJ0ZWZhY3RSZXBvc2l0b3J5OworICAgIH0KIAotCXByaXZhdGUgUGFja2FnZUltcG9ydCBnZXRQYWNrYWdlSW1wb3J0KFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHZlcnNpb25SYW5nZVN0cmluZywgYm9vbGVhbiBpc09wdGlvbmFsKSB7Ci0JCVN0cmluZyBrZXkgPSBwYWNrYWdlTmFtZSArICIuIiArIHZlcnNpb25SYW5nZVN0cmluZyArICIuIiArIGlzT3B0aW9uYWw7Ci0JCWlmIChpbXBvcnRzLmNvbnRhaW5zS2V5KGtleSkpIHsKLQkJCXJldHVybiBpbXBvcnRzLmdldChrZXkpOwotCQl9Ci0JCVBhY2thZ2VJbXBvcnQgcGFja2FnZUltcG9ydCA9IG5ldyBQYWNrYWdlSW1wb3J0KHBhY2thZ2VOYW1lLCBpc09wdGlvbmFsLCBnZXRWZXJzaW9uUmFuZ2UodmVyc2lvblJhbmdlU3RyaW5nKSk7Ci0JCWltcG9ydHMucHV0KGtleSwgcGFja2FnZUltcG9ydCk7Ci0JCXJldHVybiBwYWNrYWdlSW1wb3J0OwotCX0KKyAgICBwcml2YXRlIE9zZ2lWZXJzaW9uIGdldFZlcnNpb24oU3RyaW5nIHZlcnNpb25TdHJpbmcpIHsKKyAgICAgICAgaWYgKHRoaXMudmVyc2lvbnMuY29udGFpbnNLZXkodmVyc2lvblN0cmluZykpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnZlcnNpb25zLmdldCh2ZXJzaW9uU3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBPc2dpVmVyc2lvbiB2ZXJzaW9uID0gbmV3IE9zZ2lWZXJzaW9uKHZlcnNpb25TdHJpbmcpOworICAgICAgICB0aGlzLnZlcnNpb25zLnB1dCh2ZXJzaW9uU3RyaW5nLCB2ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIHZlcnNpb247CisgICAgfQogCi0JcHJpdmF0ZSBCdW5kbGVBcnRlZmFjdCBjcmVhdGVCdW5kbGVBcnRlZmFjdChKU09OT2JqZWN0IGJ1bmRsZU5vZGUpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKLQkJU3RyaW5nIG5hbWUgPSBidW5kbGVOb2RlLmdldFN0cmluZygibmFtZSIpOwotCQlTdHJpbmcgdmVyc2lvbiA9IGJ1bmRsZU5vZGUuZ2V0U3RyaW5nKCJ2ZXJzaW9uIik7Ci0JCVN0cmluZyBzeW1ib2xpY05hbWUgPSBidW5kbGVOb2RlLmdldFN0cmluZygic3ltYm9saWNOYW1lIik7Ci0JCVN0cmluZyBvcmdhbmlzdGF0aW9uTmFtZSA9IGJ1bmRsZU5vZGUuZ2V0U3RyaW5nKCJvcmdhbmlzYXRpb25OYW1lIik7Ci0JCVN0cmluZyBtb2R1bGVOYW1lID0gYnVuZGxlTm9kZS5nZXRTdHJpbmcoIm1vZHVsZU5hbWUiKTsKLQkJLy8gU3RyaW5nIG5vdGVzID0gbmIuZ2V0U3RyaW5nKCJub3RlcyIpOwotCQlib29sZWFuIHNvdXJjZUF2YWlsYWJsZSA9IGJ1bmRsZU5vZGUuZ2V0Qm9vbGVhbigic291cmNlQXZhaWxhYmxlIik7Ci0JCS8vIFN0cmluZyBkYXRlQWRkZWQgPSBuYi5nZXRTdHJpbmcoImRhdGVBZGRlZCIpOworICAgIHByaXZhdGUgVmVyc2lvblJhbmdlIGdldFZlcnNpb25SYW5nZShTdHJpbmcgdmVyc2lvblJhbmdlU3RyaW5nKSB7CisgICAgICAgIGlmICh0aGlzLnZlcnNpb25SYW5nZXMuY29udGFpbnNLZXkodmVyc2lvblJhbmdlU3RyaW5nKSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvblJhbmdlcy5nZXQodmVyc2lvblJhbmdlU3RyaW5nKTsKKyAgICAgICAgfQorICAgICAgICBWZXJzaW9uUmFuZ2UgdmVyc2lvbiA9IG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvblJhbmdlU3RyaW5nKTsKKyAgICAgICAgdGhpcy52ZXJzaW9uUmFuZ2VzLnB1dCh2ZXJzaW9uUmFuZ2VTdHJpbmcsIHZlcnNpb24pOworICAgICAgICByZXR1cm4gdmVyc2lvbjsKKyAgICB9CiAKLQkJZmluYWwgQnVuZGxlQXJ0ZWZhY3QgYXJ0ZWZhY3QgPSBuZXcgQnVuZGxlQXJ0ZWZhY3QobmFtZSwgc3ltYm9saWNOYW1lLCBnZXRWZXJzaW9uKHZlcnNpb24pLCBvcmdhbmlzdGF0aW9uTmFtZSwKLQkJCW1vZHVsZU5hbWUpOwotCQkvLyBhcnRlZmFjdC5zZXROb3Rlcyhub3Rlcyk7Ci0JCWFydGVmYWN0LnNldFNvdXJjZUF2YWlsYWJsZShzb3VyY2VBdmFpbGFibGUpOwotCQkvLyBhcnRlZmFjdC5zZXREYXRlQWRkZWQoRk9STUFULnBhcnNlKGRhdGVBZGRlZCkpOwotCQluZXcgSlNPTkNoaWxkUGFyc2VyKGJ1bmRsZU5vZGUsICJwYWNrYWdlRXhwb3J0cyIpIHsKLQkJCXB1YmxpYyB2b2lkIHBhcnNlKEpTT05PYmplY3Qgb2JqZWN0KSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7Ci0JCQkJY3JlYXRlUGFja2FnZUV4cG9ydChhcnRlZmFjdCwgb2JqZWN0KTsKLQkJCX0KLQkJfTsKLQkJbmV3IEpTT05DaGlsZFBhcnNlcihidW5kbGVOb2RlLCAicGFja2FnZUltcG9ydHMiKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYXJzZShKU09OT2JqZWN0IG9iamVjdCkgdGhyb3dzIEpTT05FeGNlcHRpb24gewotCQkJCWNyZWF0ZVBhY2thZ2VJbXBvcnQoYXJ0ZWZhY3QsIG9iamVjdCk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBhcnRlZmFjdDsKLQl9CisgICAgcHJpdmF0ZSBQYWNrYWdlSW1wb3J0IGdldFBhY2thZ2VJbXBvcnQoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdmVyc2lvblJhbmdlU3RyaW5nLCBib29sZWFuIGlzT3B0aW9uYWwpIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IHBhY2thZ2VOYW1lICsgIi4iICsgdmVyc2lvblJhbmdlU3RyaW5nICsgIi4iICsgaXNPcHRpb25hbDsKKyAgICAgICAgaWYgKHRoaXMuaW1wb3J0cy5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRzLmdldChrZXkpOworICAgICAgICB9CisgICAgICAgIFBhY2thZ2VJbXBvcnQgcGFja2FnZUltcG9ydCA9IG5ldyBQYWNrYWdlSW1wb3J0KHBhY2thZ2VOYW1lLCBpc09wdGlvbmFsLCBnZXRWZXJzaW9uUmFuZ2UodmVyc2lvblJhbmdlU3RyaW5nKSk7CisgICAgICAgIHRoaXMuaW1wb3J0cy5wdXQoa2V5LCBwYWNrYWdlSW1wb3J0KTsKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VJbXBvcnQ7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhY2thZ2VJbXBvcnQoQnVuZGxlQXJ0ZWZhY3QgYXJ0ZWZhY3QsIEpTT05PYmplY3QgZSkgdGhyb3dzIEpTT05FeGNlcHRpb24gewotCQlTdHJpbmcgbmFtZSA9IGUuZ2V0U3RyaW5nKCJuYW1lIik7Ci0JCVN0cmluZyB2ZXJzaW9uID0gZS5nZXRTdHJpbmcoInZlcnNpb25SYW5nZSIpOwotCQlCb29sZWFuIG9wdGlvbmFsID0gZS5nZXRCb29sZWFuKCJvcHRpb25hbCIpOwotCQlQYWNrYWdlSW1wb3J0IG5waSA9IGdldFBhY2thZ2VJbXBvcnQobmFtZSwgdmVyc2lvbiwgb3B0aW9uYWwpOworICAgIHByaXZhdGUgQnVuZGxlQXJ0ZWZhY3QgY3JlYXRlQnVuZGxlQXJ0ZWZhY3QoSlNPTk9iamVjdCBidW5kbGVOb2RlKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBuYW1lID0gYnVuZGxlTm9kZS5nZXRTdHJpbmcoIm5hbWUiKTsKKyAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBidW5kbGVOb2RlLmdldFN0cmluZygidmVyc2lvbiIpOworICAgICAgICBTdHJpbmcgc3ltYm9saWNOYW1lID0gYnVuZGxlTm9kZS5nZXRTdHJpbmcoInN5bWJvbGljTmFtZSIpOworICAgICAgICBTdHJpbmcgb3JnYW5pc3RhdGlvbk5hbWUgPSBidW5kbGVOb2RlLmdldFN0cmluZygib3JnYW5pc2F0aW9uTmFtZSIpOworICAgICAgICBTdHJpbmcgbW9kdWxlTmFtZSA9IGJ1bmRsZU5vZGUuZ2V0U3RyaW5nKCJtb2R1bGVOYW1lIik7CisgICAgICAgIC8vIFN0cmluZyBub3RlcyA9IG5iLmdldFN0cmluZygibm90ZXMiKTsKKyAgICAgICAgYm9vbGVhbiBzb3VyY2VBdmFpbGFibGUgPSBidW5kbGVOb2RlLmdldEJvb2xlYW4oInNvdXJjZUF2YWlsYWJsZSIpOworICAgICAgICAvLyBTdHJpbmcgZGF0ZUFkZGVkID0gbmIuZ2V0U3RyaW5nKCJkYXRlQWRkZWQiKTsKIAotCQlhcnRlZmFjdC5hZGRJbXBvcnQobnBpKTsKLQl9CisgICAgICAgIGZpbmFsIEJ1bmRsZUFydGVmYWN0IGFydGVmYWN0ID0gbmV3IEJ1bmRsZUFydGVmYWN0KG5hbWUsIHN5bWJvbGljTmFtZSwgZ2V0VmVyc2lvbih2ZXJzaW9uKSwgb3JnYW5pc3RhdGlvbk5hbWUsIG1vZHVsZU5hbWUpOworICAgICAgICAvLyBhcnRlZmFjdC5zZXROb3Rlcyhub3Rlcyk7CisgICAgICAgIGFydGVmYWN0LnNldFNvdXJjZUF2YWlsYWJsZShzb3VyY2VBdmFpbGFibGUpOworICAgICAgICAvLyBhcnRlZmFjdC5zZXREYXRlQWRkZWQoRk9STUFULnBhcnNlKGRhdGVBZGRlZCkpOworICAgICAgICBuZXcgSlNPTkNoaWxkUGFyc2VyKGJ1bmRsZU5vZGUsICJwYWNrYWdlRXhwb3J0cyIpIHsKIAotCXByaXZhdGUgdm9pZCBjcmVhdGVQYWNrYWdlRXhwb3J0KEJ1bmRsZUFydGVmYWN0IGFydGVmYWN0LCBKU09OT2JqZWN0IGUpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKLQkJU3RyaW5nIG5hbWU7Ci0JCVN0cmluZyB2ZXJzaW9uOwotCQluYW1lID0gZS5nZXRTdHJpbmcoIm5hbWUiKTsKLQkJdmVyc2lvbiA9IGUuZ2V0U3RyaW5nKCJ2ZXJzaW9uIik7Ci0JCVBhY2thZ2VFeHBvcnQgbnBlID0gbmV3IFBhY2thZ2VFeHBvcnQoYXJ0ZWZhY3QsIG5hbWUsIGdldFZlcnNpb24odmVyc2lvbikpOworICAgICAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoSlNPTk9iamVjdCBvYmplY3QpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVQYWNrYWdlRXhwb3J0KGFydGVmYWN0LCBvYmplY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBuZXcgSlNPTkNoaWxkUGFyc2VyKGJ1bmRsZU5vZGUsICJwYWNrYWdlSW1wb3J0cyIpIHsKIAotCQlpZiAobG9hZENsYXNzZXMpIHsKLQkJCUpTT05BcnJheSBleHBvcnRNZW1iZXJzID0gZS5nZXRKU09OQXJyYXkoInBhY2thZ2VNZW1iZXJzIik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydE1lbWJlcnMubGVuZ3RoKCk7IGkrKykgewotCQkJCUpTT05PYmplY3QgbSA9IChKU09OT2JqZWN0KSBleHBvcnRNZW1iZXJzLmdldChpKTsKLQkJCQljcmVhdGVQYWNrYWdlTWVtYmVyKG5wZSwgbSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhcnNlKEpTT05PYmplY3Qgb2JqZWN0KSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgY3JlYXRlUGFja2FnZUltcG9ydChhcnRlZmFjdCwgb2JqZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIGFydGVmYWN0OworICAgIH0KIAotCQlhcnRlZmFjdC5hZGRFeHBvcnQobnBlKTsKLQl9CisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhY2thZ2VJbXBvcnQoQnVuZGxlQXJ0ZWZhY3QgYXJ0ZWZhY3QsIEpTT05PYmplY3QgZSkgdGhyb3dzIEpTT05FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbmFtZSA9IGUuZ2V0U3RyaW5nKCJuYW1lIik7CisgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gZS5nZXRTdHJpbmcoInZlcnNpb25SYW5nZSIpOworICAgICAgICBCb29sZWFuIG9wdGlvbmFsID0gZS5nZXRCb29sZWFuKCJvcHRpb25hbCIpOworICAgICAgICBQYWNrYWdlSW1wb3J0IG5waSA9IGdldFBhY2thZ2VJbXBvcnQobmFtZSwgdmVyc2lvbiwgb3B0aW9uYWwpOwogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhY2thZ2VNZW1iZXIoUGFja2FnZUV4cG9ydCBucGUsIEpTT05PYmplY3QgbSkgdGhyb3dzIEpTT05FeGNlcHRpb24gewotCQlTdHJpbmcgbmFtZSA9IG0uZ2V0U3RyaW5nKCJuYW1lIik7Ci0JCVBhY2thZ2VNZW1iZXJUeXBlIHR5cGUgPSBQYWNrYWdlTWVtYmVyVHlwZS52YWx1ZU9mKChtLmdldFN0cmluZygidHlwZSIpKSk7Ci0JCWlmICh0eXBlID09IFBhY2thZ2VNZW1iZXJUeXBlLkNMQVNTKSB7Ci0JCQlucGUuYWRkQ2xhc3NFeHBvcnQobmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlucGUuYWRkUmVzb3VyY2VFeHBvcnQobmFtZSk7Ci0JCX0KLQl9CisgICAgICAgIGFydGVmYWN0LmFkZEltcG9ydChucGkpOworICAgIH0KIAotCXByaXZhdGUgTGlicmFyeUFydGVmYWN0IGNyZWF0ZUxpYnJhcnlBcnRlZmFjdChKU09OT2JqZWN0IG5sKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBuYW1lID0gbmwuZ2V0U3RyaW5nKCJuYW1lIik7Ci0JCVN0cmluZyB2ZXJzaW9uID0gbmwuZ2V0U3RyaW5nKCJ2ZXJzaW9uIik7Ci0JCVN0cmluZyBzeW1ib2xpY05hbWUgPSBubC5nZXRTdHJpbmcoInN5bWJvbGljTmFtZSIpOwotCQlTdHJpbmcgb3JnYW5pc3RhdGlvbk5hbWUgPSBubC5nZXRTdHJpbmcoIm9yZ2FuaXNhdGlvbk5hbWUiKTsKLQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBubC5nZXRTdHJpbmcoIm1vZHVsZU5hbWUiKTsKLQkJQm9vbGVhbiBzb3VyY2VBdmFpbGFibGUgPSBubC5nZXRCb29sZWFuKCJzb3VyY2VBdmFpbGFibGUiKTsKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlUGFja2FnZUV4cG9ydChCdW5kbGVBcnRlZmFjdCBhcnRlZmFjdCwgSlNPTk9iamVjdCBlKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICBTdHJpbmcgdmVyc2lvbjsKKyAgICAgICAgbmFtZSA9IGUuZ2V0U3RyaW5nKCJuYW1lIik7CisgICAgICAgIHZlcnNpb24gPSBlLmdldFN0cmluZygidmVyc2lvbiIpOworICAgICAgICBQYWNrYWdlRXhwb3J0IG5wZSA9IG5ldyBQYWNrYWdlRXhwb3J0KGFydGVmYWN0LCBuYW1lLCBnZXRWZXJzaW9uKHZlcnNpb24pKTsKIAotCQlmaW5hbCBMaWJyYXJ5QXJ0ZWZhY3QgYXJ0ZWZhY3QgPSBuZXcgTGlicmFyeUFydGVmYWN0KG5hbWUsIHN5bWJvbGljTmFtZSwgZ2V0VmVyc2lvbih2ZXJzaW9uKSwKLQkJCW9yZ2FuaXN0YXRpb25OYW1lLCBtb2R1bGVOYW1lKTsKLQkJYXJ0ZWZhY3Quc2V0U291cmNlQXZhaWxhYmxlKHNvdXJjZUF2YWlsYWJsZSk7CisgICAgICAgIGlmICh0aGlzLmxvYWRDbGFzc2VzKSB7CisgICAgICAgICAgICBKU09OQXJyYXkgZXhwb3J0TWVtYmVycyA9IGUuZ2V0SlNPTkFycmF5KCJwYWNrYWdlTWVtYmVycyIpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBvcnRNZW1iZXJzLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBKU09OT2JqZWN0IG0gPSAoSlNPTk9iamVjdCkgZXhwb3J0TWVtYmVycy5nZXQoaSk7CisgICAgICAgICAgICAgICAgY3JlYXRlUGFja2FnZU1lbWJlcihucGUsIG0pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJbmV3IEpTT05DaGlsZFBhcnNlcihubCwgImJ1bmRsZUltcG9ydHMiKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYXJzZShKU09OT2JqZWN0IG9iamVjdCkgdGhyb3dzIEpTT05FeGNlcHRpb24gewotCQkJCUJ1bmRsZUltcG9ydCBucGUgPSBuZXcgQnVuZGxlSW1wb3J0KGFydGVmYWN0LCBvYmplY3QuZ2V0U3RyaW5nKCJuYW1lIiksCi0JCQkJCWdldFZlcnNpb25SYW5nZShvYmplY3QuZ2V0U3RyaW5nKCJ2ZXJzaW9uUmFuZ2UiKSkpOwotCQkJCWFydGVmYWN0LmFkZEJ1bmRsZUltcG9ydChucGUpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gYXJ0ZWZhY3Q7CisgICAgICAgIGFydGVmYWN0LmFkZEV4cG9ydChucGUpOworICAgIH0KIAotCX0KKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlUGFja2FnZU1lbWJlcihQYWNrYWdlRXhwb3J0IG5wZSwgSlNPTk9iamVjdCBtKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBuYW1lID0gbS5nZXRTdHJpbmcoIm5hbWUiKTsKKyAgICAgICAgUGFja2FnZU1lbWJlclR5cGUgdHlwZSA9IFBhY2thZ2VNZW1iZXJUeXBlLnZhbHVlT2YobS5nZXRTdHJpbmcoInR5cGUiKSk7CisgICAgICAgIGlmICh0eXBlID09IFBhY2thZ2VNZW1iZXJUeXBlLkNMQVNTKSB7CisgICAgICAgICAgICBucGUuYWRkQ2xhc3NFeHBvcnQobmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBucGUuYWRkUmVzb3VyY2VFeHBvcnQobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExpYnJhcnlBcnRlZmFjdCBjcmVhdGVMaWJyYXJ5QXJ0ZWZhY3QoSlNPTk9iamVjdCBubCkgdGhyb3dzIEpTT05FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgbmFtZSA9IG5sLmdldFN0cmluZygibmFtZSIpOworICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IG5sLmdldFN0cmluZygidmVyc2lvbiIpOworICAgICAgICBTdHJpbmcgc3ltYm9saWNOYW1lID0gbmwuZ2V0U3RyaW5nKCJzeW1ib2xpY05hbWUiKTsKKyAgICAgICAgU3RyaW5nIG9yZ2FuaXN0YXRpb25OYW1lID0gbmwuZ2V0U3RyaW5nKCJvcmdhbmlzYXRpb25OYW1lIik7CisgICAgICAgIFN0cmluZyBtb2R1bGVOYW1lID0gbmwuZ2V0U3RyaW5nKCJtb2R1bGVOYW1lIik7CisgICAgICAgIEJvb2xlYW4gc291cmNlQXZhaWxhYmxlID0gbmwuZ2V0Qm9vbGVhbigic291cmNlQXZhaWxhYmxlIik7CisKKyAgICAgICAgZmluYWwgTGlicmFyeUFydGVmYWN0IGFydGVmYWN0ID0gbmV3IExpYnJhcnlBcnRlZmFjdChuYW1lLCBzeW1ib2xpY05hbWUsIGdldFZlcnNpb24odmVyc2lvbiksIG9yZ2FuaXN0YXRpb25OYW1lLCBtb2R1bGVOYW1lKTsKKyAgICAgICAgYXJ0ZWZhY3Quc2V0U291cmNlQXZhaWxhYmxlKHNvdXJjZUF2YWlsYWJsZSk7CisKKyAgICAgICAgbmV3IEpTT05DaGlsZFBhcnNlcihubCwgImJ1bmRsZUltcG9ydHMiKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhcnNlKEpTT05PYmplY3Qgb2JqZWN0KSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgQnVuZGxlSW1wb3J0IG5wZSA9IG5ldyBCdW5kbGVJbXBvcnQoYXJ0ZWZhY3QsIG9iamVjdC5nZXRTdHJpbmcoIm5hbWUiKSwgZ2V0VmVyc2lvblJhbmdlKG9iamVjdC5nZXRTdHJpbmcoInZlcnNpb25SYW5nZSIpKSk7CisgICAgICAgICAgICAgICAgYXJ0ZWZhY3QuYWRkQnVuZGxlSW1wb3J0KG5wZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBhcnRlZmFjdDsKKworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9ydW50aW1lcy9JbnN0YWxsYXRpb25UeXBlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3J1bnRpbWVzL0luc3RhbGxhdGlvblR5cGUuamF2YQppbmRleCA2YWRkZDM5Li5lZjYzNjQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3J1bnRpbWVzL0luc3RhbGxhdGlvblR5cGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3J1bnRpbWVzL0luc3RhbGxhdGlvblR5cGUuamF2YQpAQCAtNiwyNCArNiwyNSBAQAogICogPC9jb3B5cmlnaHQ+CiAgKgogICovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZS5ydW50aW1lczsKIAogLyoqCiAgKiBBIHBhcnRpY3VsYXIgZGlzdHJpYnV0aW9uIG9mIFZpcmdvLgotICogCisgKgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKLSAqIAorICoKICAqLwogcHVibGljIGVudW0gSW5zdGFsbGF0aW9uVHlwZSB7Ci0JVE9NQ0FUKCJWaXJnbyBTZXJ2ZXIgZm9yIEFwYWNoZSBUb21jYXQiKSwgSkVUVFkoIlZpcmdvIEpldHR5IFNlcnZlciIpLCBLRVJORUwoIlZpcmdvIEtlcm5lbCIpLCBOQU5PKCJWaXJnbyBOYW5vIik7CisgICAgVE9NQ0FUKCJWaXJnbyBTZXJ2ZXIgZm9yIEFwYWNoZSBUb21jYXQiKSwgSkVUVFkoIlZpcmdvIEpldHR5IFNlcnZlciIpLCBLRVJORUwoIlZpcmdvIEtlcm5lbCIpLCBOQU5PKCJWaXJnbyBOYW5vIik7CiAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CiAKLQlJbnN0YWxsYXRpb25UeXBlKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQorICAgIEluc3RhbGxhdGlvblR5cGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9ydW50aW1lcy9JbnZhbGlkUnVudGltZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3J1bnRpbWVzL0ludmFsaWRSdW50aW1lUHJvdmlkZXIuamF2YQppbmRleCAzOTM5MDFlLi43NTg1NWUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3J1bnRpbWVzL0ludmFsaWRSdW50aW1lUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3J1bnRpbWVzL0ludmFsaWRSdW50aW1lUHJvdmlkZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTQVAgQUcgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLnJ1bnRpbWVzOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTQxLDMzMiArNDIsMzI3IEBACiAKIC8qKgogICogQSB7QGxpbmsgSVNlcnZlclJ1bnRpbWVQcm92aWRlcn0gcmVwcmVzZW50aW5nIGFuIGludmFsaWQgc2VydmVyIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5LgotICogCisgKgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKICAqLwogcHVibGljIGNsYXNzIEludmFsaWRSdW50aW1lUHJvdmlkZXIgaW1wbGVtZW50cyBJU2VydmVyUnVudGltZVByb3ZpZGVyIHsKIAotCS8vIEFzc3VtZXMgU3RhdGVsZXNzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJU2VydmVyUnVudGltZVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEludmFsaWRSdW50aW1lUHJvdmlkZXIoKTsKKyAgICAvLyBBc3N1bWVzIFN0YXRlbGVzcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVNlcnZlclJ1bnRpbWVQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBJbnZhbGlkUnVudGltZVByb3ZpZGVyKCk7CiAKLQlwcml2YXRlIEludmFsaWRSdW50aW1lUHJvdmlkZXIoKSB7Ci0JfQorICAgIHByaXZhdGUgSW52YWxpZFJ1bnRpbWVQcm92aWRlcigpIHsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRSdW50aW1lQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCkgewotCQloYW5kbGVFcnJvcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0UnVudGltZUNsYXNzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVDbGFzcygpIHsKKyAgICAgICAgaGFuZGxlRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLy8gUG90ZW50aWFsIGxlYWsgc291cmNlPyBVbmxpa2VseSwgYnV0IHBvc3NpYmxlLgotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxTdHJpbmc+IGVycm9yc1JlcG9ydGVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgIC8vIFBvdGVudGlhbCBsZWFrIHNvdXJjZT8gVW5saWtlbHksIGJ1dCBwb3NzaWJsZS4KKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBlcnJvcnNSZXBvcnRlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKIAotCXByaXZhdGUgdm9pZCBoYW5kbGVFcnJvcihJUnVudGltZSBydW50aW1lKSB7Ci0JCVN0cmluZyBydW50aW1lTmFtZSA9IG51bGw7Ci0JCS8vIGJvb2xlYW4gc2hvd0Vycm9yID0gZmFsc2U7Ci0JCWlmIChydW50aW1lICE9IG51bGwpIHsKLQkJCXJ1bnRpbWVOYW1lID0gcnVudGltZS5nZXROYW1lKCk7Ci0JCQkvLyBzaG93RXJyb3IgPSBlcnJvcnNSZXBvcnRlZC5hZGQocnVudGltZU5hbWUpOwotCQl9IGVsc2UgewotCQkJcnVudGltZU5hbWUgPSAiVGhlIHJ1bnRpbWUiOwotCQl9Ci0JCVN0cmluZyBtZXNzYWdlID0gcnVudGltZU5hbWUKLQkJCQkrICIgaXMgbm90IGEgdmFsaWQgZW52aXJvbm1lbnQuIEdvIHRvIFByZWZlcmVuY2VzOlNlcnZlcjpSdW50aW1lIEVudmlyb25tZW50cyB0byBkZWZpbmUgYSB2YWxpZCBzZXJ2ZXIuIjsKLQkJbWVzc2FnZSArPSAiXG4oVGhpcyBlcnJvciBtYXkgYmUgZm9sbG93ZWQgYnkgcmVsYXRlZCBleGNlcHRpb25zLikiOwotCQlpbnQgdHlwZSA9IFN0YXR1c01hbmFnZXIuTE9HIHwgU3RhdHVzTWFuYWdlci5TSE9XOwotCQkvLyBpZiAoc2hvd0Vycm9yKSB7Ci0JCS8vIHR5cGUgfD0gU3RhdHVzTWFuYWdlci5TSE9XOwotCQkvLyB9Ci0JCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZShuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKSwgdHlwZSk7Ci0JfQorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFcnJvcihJUnVudGltZSBydW50aW1lKSB7CisgICAgICAgIFN0cmluZyBydW50aW1lTmFtZSA9IG51bGw7CisgICAgICAgIC8vIGJvb2xlYW4gc2hvd0Vycm9yID0gZmFsc2U7CisgICAgICAgIGlmIChydW50aW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJ1bnRpbWVOYW1lID0gcnVudGltZS5nZXROYW1lKCk7CisgICAgICAgICAgICAvLyBzaG93RXJyb3IgPSBlcnJvcnNSZXBvcnRlZC5hZGQocnVudGltZU5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVudGltZU5hbWUgPSAiVGhlIHJ1bnRpbWUiOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gcnVudGltZU5hbWUgKyAiIGlzIG5vdCBhIHZhbGlkIGVudmlyb25tZW50LiBHbyB0byBQcmVmZXJlbmNlczpTZXJ2ZXI6UnVudGltZSBFbnZpcm9ubWVudHMgdG8gZGVmaW5lIGEgdmFsaWQgc2VydmVyLiI7CisgICAgICAgIG1lc3NhZ2UgKz0gIlxuKFRoaXMgZXJyb3IgbWF5IGJlIGZvbGxvd2VkIGJ5IHJlbGF0ZWQgZXhjZXB0aW9ucy4pIjsKKyAgICAgICAgaW50IHR5cGUgPSBTdGF0dXNNYW5hZ2VyLkxPRyB8IFN0YXR1c01hbmFnZXIuU0hPVzsKKyAgICAgICAgLy8gaWYgKHNob3dFcnJvcikgeworICAgICAgICAvLyB0eXBlIHw9IFN0YXR1c01hbmFnZXIuU0hPVzsKKyAgICAgICAgLy8gfQorICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSksIHR5cGUpOworICAgIH0KIAotCXByaXZhdGUgdm9pZCBoYW5kbGVFcnJvcihJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cikgewotCQlTZXJ2ZXIgc2VydmVyID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyKHNlcnZlckJlaGF2aW91cik7Ci0JCVZpcmdvU2VydmVyUnVudGltZSBydW50aW1lID0gc2VydmVyLmdldFJ1bnRpbWUoKTsKLQkJaGFuZGxlRXJyb3IocnVudGltZS5nZXRSdW50aW1lKCkpOwotCX0KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlRXJyb3IoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIpIHsKKyAgICAgICAgU2VydmVyIHNlcnZlciA9IFNlcnZlclV0aWxzLmdldFNlcnZlcihzZXJ2ZXJCZWhhdmlvdXIpOworICAgICAgICBWaXJnb1NlcnZlclJ1bnRpbWUgcnVudGltZSA9IHNlcnZlci5nZXRSdW50aW1lKCk7CisgICAgICAgIGhhbmRsZUVycm9yKHJ1bnRpbWUuZ2V0UnVudGltZSgpKTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgaGFuZGxlRXJyb3IoKSB7Ci0JCWhhbmRsZUVycm9yKChJUnVudGltZSkgbnVsbCk7Ci0JfQorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFcnJvcigpIHsKKyAgICAgICAgaGFuZGxlRXJyb3IoKElSdW50aW1lKSBudWxsKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJCZWhhdmlvdXIpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7Ci0JCWhhbmRsZUVycm9yKHNlcnZlckJlaGF2aW91cik7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJCZWhhdmlvdXIpCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7CisgICAgICAgIGhhbmRsZUVycm9yKHNlcnZlckJlaGF2aW91cik7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2NyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZSwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLmRlcGVuZGVuY2llcy5JRGVwZW5kZW5jeUxvY2F0b3IuSmF2YVZlcnNpb24pCi0JICovCi0JcHVibGljIElEZXBlbmRlbmN5TG9jYXRvciBjcmVhdGVEZXBlbmRlbmN5TG9jYXRvcihJUnVudGltZSBydW50aW1lLCBTdHJpbmcgc2VydmVySG9tZVBhdGgsCi0JCQlTdHJpbmdbXSBhZGRpdGlvbmFsU2VhcmNoUGF0aHMsIFN0cmluZyBpbmRleERpcmVjdG9yeVBhdGgsIEphdmFWZXJzaW9uIGphdmFWZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQloYW5kbGVFcnJvcihydW50aW1lKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2NyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZSwKKyAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5sYW5nLlN0cmluZywKKyAgICAgKiAgICAgIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLmRlcGVuZGVuY2llcy5JRGVwZW5kZW5jeUxvY2F0b3IuSmF2YVZlcnNpb24pCisgICAgICovCisgICAgcHVibGljIElEZXBlbmRlbmN5TG9jYXRvciBjcmVhdGVEZXBlbmRlbmN5TG9jYXRvcihJUnVudGltZSBydW50aW1lLCBTdHJpbmcgc2VydmVySG9tZVBhdGgsIFN0cmluZ1tdIGFkZGl0aW9uYWxTZWFyY2hQYXRocywKKyAgICAgICAgU3RyaW5nIGluZGV4RGlyZWN0b3J5UGF0aCwgSmF2YVZlcnNpb24gamF2YVZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGhhbmRsZUVycm9yKHJ1bnRpbWUpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlwdWJsaWMgSVN0YXR1cyB2ZXJpZnlJbnN0YWxsYXRpb24oSVJ1bnRpbWUgcnVudGltZSkgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgIk5vIFZpcmdvIFJ1bnRpbWUgZm91bmQ6ICIgKyBydW50aW1lLmdldExvY2F0aW9uKCkKLQkJCQkrICIuIik7Ci0JfQorICAgIHB1YmxpYyBJU3RhdHVzIHZlcmlmeUluc3RhbGxhdGlvbihJUnVudGltZSBydW50aW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAiTm8gVmlyZ28gUnVudGltZSBmb3VuZDogIiArIHJ1bnRpbWUuZ2V0TG9jYXRpb24oKSArICIuIik7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLnJ1bnRpbWVzLlZpcmdvUnVudGltZVByb3ZpZGVyI2dldENvbmZpZ3VyYXRpb25EaXIoKQotCSAqLwotCVN0cmluZyBnZXRDb25maWdEaXIoKSB7Ci0JCWhhbmRsZUVycm9yKCk7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUucnVudGltZXMuVmlyZ29SdW50aW1lUHJvdmlkZXIjZ2V0Q29uZmlndXJhdGlvbkRpcigpCisgICAgICovCisgICAgU3RyaW5nIGdldENvbmZpZ0RpcigpIHsKKyAgICAgICAgaGFuZGxlRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLnJ1bnRpbWVzLlZpcmdvUnVudGltZVByb3ZpZGVyI2dldFByb2ZpbGVEaXIoKQotCSAqLwotCVN0cmluZyBnZXRQcm9maWxlRGlyKCkgewotCQloYW5kbGVFcnJvcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLnJ1bnRpbWVzLlZpcmdvUnVudGltZVByb3ZpZGVyI2dldFByb2ZpbGVEaXIoKQorICAgICAqLworICAgIFN0cmluZyBnZXRQcm9maWxlRGlyKCkgeworICAgICAgICBoYW5kbGVFcnJvcigpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUucnVudGltZXMuVmlyZ29SdW50aW1lUHJvdmlkZXIjZ2V0SUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7Ci0JCWhhbmRsZUVycm9yKCk7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUucnVudGltZXMuVmlyZ29SdW50aW1lUHJvdmlkZXIjZ2V0SUQoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SUQoKSB7CisgICAgICAgIGhhbmRsZUVycm9yKCk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZS5ydW50aW1lcy5WaXJnb1J1bnRpbWVQcm92aWRlciNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWhhbmRsZUVycm9yKCk7Ci0JCXJldHVybiAiSW52YWxpZCBSdW50aW1lIjsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLnJ1bnRpbWVzLlZpcmdvUnVudGltZVByb3ZpZGVyI2dldE5hbWUoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgaGFuZGxlRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuICJJbnZhbGlkIFJ1bnRpbWUiOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2NhbkFkZE1vZHVsZShvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZSkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjYW5BZGRNb2R1bGUoSU1vZHVsZSBtb2R1bGUpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQsICJObyBWaXJnbyBSdW50aW1lIGZvdW5kLiIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNjYW5BZGRNb2R1bGUob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUpCisgICAgICovCisgICAgcHVibGljIElTdGF0dXMgY2FuQWRkTW9kdWxlKElNb2R1bGUgbW9kdWxlKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAiTm8gVmlyZ28gUnVudGltZSBmb3VuZC4iKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVkUnVudGltZVByb2dyYW1Bcmd1bWVudHMoYm9vbGVhbiBzdGFydGluZykgewotCQloYW5kbGVFcnJvcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGJvb2xlYW4gc3RhcnRpbmcpIHsKKyAgICAgICAgaGFuZGxlRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0UnVudGltZUJhc2VEaXJlY3Rvcnkob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIpCi0JICovCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWhhbmRsZUVycm9yKHNlcnZlci5nZXRSdW50aW1lKCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0UnVudGltZUJhc2VEaXJlY3Rvcnkob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIpCisgICAgICovCisgICAgcHVibGljIElQYXRoIGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KElTZXJ2ZXIgc2VydmVyKSB7CisgICAgICAgIGhhbmRsZUVycm9yKHNlcnZlci5nZXRSdW50aW1lKCkpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRSdW50aW1lQ2xhc3NwYXRoKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQlwdWJsaWMgTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCWhhbmRsZUVycm9yKCk7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRSdW50aW1lQ2xhc3NwYXRoKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoIGluc3RhbGxQYXRoKSB7CisgICAgICAgIGhhbmRsZUVycm9yKCk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldFJ1bnRpbWVWTUFyZ3VtZW50cyhvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJCZWhhdmlvdXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElQYXRoIGluc3RhbGxQYXRoLCBJUGF0aCBjb25maWdQYXRoLAotCQkJSVBhdGggZGVwbG95UGF0aCkgewotCQloYW5kbGVFcnJvcihzZXJ2ZXJCZWhhdmlvdXIpOwotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHt9OwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRSdW50aW1lVk1Bcmd1bWVudHMob3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyQmVoYXZpb3VyLAorICAgICAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVZNQXJndW1lbnRzKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLCBJUGF0aCBpbnN0YWxsUGF0aCwgSVBhdGggY29uZmlnUGF0aCwgSVBhdGggZGVwbG95UGF0aCkgeworICAgICAgICBoYW5kbGVFcnJvcihzZXJ2ZXJCZWhhdmlvdXIpOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHt9OworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldFByb2ZpbGVQYXRoKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVQYXRoKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJaGFuZGxlRXJyb3IocnVudGltZSk7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRQcm9maWxlUGF0aChvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWUpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9maWxlUGF0aChJUnVudGltZSBydW50aW1lKSB7CisgICAgICAgIGhhbmRsZUVycm9yKHJ1bnRpbWUpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRFeHRMZXZlbEJ1bmRsZVJlcG9zaXRvcnlQYXRoKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dExldmVsQnVuZGxlUmVwb3NpdG9yeVBhdGgoSVJ1bnRpbWUgcnVudGltZSkgewotCQloYW5kbGVFcnJvcihydW50aW1lKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldEV4dExldmVsQnVuZGxlUmVwb3NpdG9yeVBhdGgob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0TGV2ZWxCdW5kbGVSZXBvc2l0b3J5UGF0aChJUnVudGltZSBydW50aW1lKSB7CisgICAgICAgIGhhbmRsZUVycm9yKHJ1bnRpbWUpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRVc2VyTGV2ZWxCdW5kbGVSZXBvc2l0b3J5UGF0aChvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWUpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVc2VyTGV2ZWxCdW5kbGVSZXBvc2l0b3J5UGF0aChJUnVudGltZSBydW50aW1lKSB7Ci0JCWhhbmRsZUVycm9yKHJ1bnRpbWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0VXNlckxldmVsQnVuZGxlUmVwb3NpdG9yeVBhdGgob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckxldmVsQnVuZGxlUmVwb3NpdG9yeVBhdGgoSVJ1bnRpbWUgcnVudGltZSkgeworICAgICAgICBoYW5kbGVFcnJvcihydW50aW1lKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0VXNlckxldmVsTGlicmFyeVJlcG9zaXRvcnlQYXRoKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJMZXZlbExpYnJhcnlSZXBvc2l0b3J5UGF0aChJUnVudGltZSBydW50aW1lKSB7Ci0JCWhhbmRsZUVycm9yKHJ1bnRpbWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0VXNlckxldmVsTGlicmFyeVJlcG9zaXRvcnlQYXRoKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJMZXZlbExpYnJhcnlSZXBvc2l0b3J5UGF0aChJUnVudGltZSBydW50aW1lKSB7CisgICAgICAgIGhhbmRsZUVycm9yKHJ1bnRpbWUpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRDb25maWdQYXRoKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbmZpZ1BhdGgoSVJ1bnRpbWUgcnVudGltZSkgewotCQloYW5kbGVFcnJvcihydW50aW1lKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldENvbmZpZ1BhdGgob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnUGF0aChJUnVudGltZSBydW50aW1lKSB7CisgICAgICAgIGhhbmRsZUVycm9yKHJ1bnRpbWUpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXREZXBsb3llck1CZWFuTmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXBsb3llck1CZWFuTmFtZSgpIHsKLQkJaGFuZGxlRXJyb3IoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldERlcGxveWVyTUJlYW5OYW1lKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlcGxveWVyTUJlYW5OYW1lKCkgeworICAgICAgICBoYW5kbGVFcnJvcigpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRSZWNvdmVyeU1vbml0b3JNQmVhbk5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVjb3ZlcnlNb25pdG9yTUJlYW5OYW1lKCkgewotCQloYW5kbGVFcnJvcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0UmVjb3ZlcnlNb25pdG9yTUJlYW5OYW1lKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlY292ZXJ5TW9uaXRvck1CZWFuTmFtZSgpIHsKKyAgICAgICAgaGFuZGxlRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0U2h1dGRvd25NQmVhbk5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2h1dGRvd25NQmVhbk5hbWUoKSB7Ci0JCWhhbmRsZUVycm9yKCk7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRTaHV0ZG93bk1CZWFuTmFtZSgpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTaHV0ZG93bk1CZWFuTmFtZSgpIHsKKyAgICAgICAgaGFuZGxlRXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0U2VydmVyUGluZ0NvbW1hbmQob3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyQmVoYXZpb3VyKQotCSAqLwotCXB1YmxpYyBJU2VydmVyQ29tbWFuZDxCb29sZWFuPiBnZXRTZXJ2ZXJQaW5nQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cikgewotCQloYW5kbGVFcnJvcigpOwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0U2VydmVyUGluZ0NvbW1hbmQob3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyQmVoYXZpb3VyKQorICAgICAqLworICAgIHB1YmxpYyBJU2VydmVyQ29tbWFuZDxCb29sZWFuPiBnZXRTZXJ2ZXJQaW5nQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cikgeworICAgICAgICBoYW5kbGVFcnJvcigpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRTZXJ2ZXJTaHV0ZG93bkNvbW1hbmQob3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyQmVoYXZpb3VyKQotCSAqLwotCXB1YmxpYyBJU2VydmVyQ29tbWFuZDxWb2lkPiBnZXRTZXJ2ZXJTaHV0ZG93bkNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIpIHsKLQkJaGFuZGxlRXJyb3Ioc2VydmVyQmVoYXZpb3VyKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldFNlcnZlclNodXRkb3duQ29tbWFuZChvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJCZWhhdmlvdXIpCisgICAgICovCisgICAgcHVibGljIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclNodXRkb3duQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cikgeworICAgICAgICBoYW5kbGVFcnJvcihzZXJ2ZXJCZWhhdmlvdXIpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRTZXJ2ZXJEZXBsb3lDb21tYW5kKG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlckJlaGF2aW91ciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlKQotCSAqLwotCXB1YmxpYyBJU2VydmVyQ29tbWFuZDxEZXBsb3ltZW50SWRlbnRpdHk+IGdldFNlcnZlckRlcGxveUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlKSB7Ci0JCWhhbmRsZUVycm9yKHNlcnZlckJlaGF2aW91cik7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRTZXJ2ZXJEZXBsb3lDb21tYW5kKG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlckJlaGF2aW91ciwKKyAgICAgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlKQorICAgICAqLworICAgIHB1YmxpYyBJU2VydmVyQ29tbWFuZDxEZXBsb3ltZW50SWRlbnRpdHk+IGdldFNlcnZlckRlcGxveUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlKSB7CisgICAgICAgIGhhbmRsZUVycm9yKHNlcnZlckJlaGF2aW91cik7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldFNlcnZlclJlZnJlc2hDb21tYW5kKG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlckJlaGF2aW91ciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU2VydmVyQ29tbWFuZDxWb2lkPiBnZXRTZXJ2ZXJSZWZyZXNoQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUsCi0JCQlTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lKSB7Ci0JCWhhbmRsZUVycm9yKHNlcnZlckJlaGF2aW91cik7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRTZXJ2ZXJSZWZyZXNoQ29tbWFuZChvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJCZWhhdmlvdXIsCisgICAgICogICAgICBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZSwgamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgSVNlcnZlckNvbW1hbmQ8Vm9pZD4gZ2V0U2VydmVyUmVmcmVzaENvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lKSB7CisgICAgICAgIGhhbmRsZUVycm9yKHNlcnZlckJlaGF2aW91cik7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldFNlcnZlclVwZGF0ZUNvbW1hbmQob3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyQmVoYXZpb3VyLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUsIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRmlsZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUuRGVwbG95bWVudElkZW50aXR5LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU2VydmVyQ29tbWFuZDxWb2lkPiBnZXRTZXJ2ZXJVcGRhdGVDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLCBJTW9kdWxlIG1vZHVsZSwKLQkJCUlNb2R1bGVGaWxlIG1vZHVsZUZpbGUsIERlcGxveW1lbnRJZGVudGl0eSBpZGVudGl0eSwgU3RyaW5nIGJ1bmRsZVN5bWJvbGljTmFtZSwgU3RyaW5nIHRhcmdldFBhdGgpIHsKLQkJaGFuZGxlRXJyb3Ioc2VydmVyQmVoYXZpb3VyKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldFNlcnZlclVwZGF0ZUNvbW1hbmQob3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyQmVoYXZpb3VyLAorICAgICAqICAgICAgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUsIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRmlsZSwKKyAgICAgKiAgICAgIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUuRGVwbG95bWVudElkZW50aXR5LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBJU2VydmVyQ29tbWFuZDxWb2lkPiBnZXRTZXJ2ZXJVcGRhdGVDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLCBJTW9kdWxlIG1vZHVsZSwgSU1vZHVsZUZpbGUgbW9kdWxlRmlsZSwKKyAgICAgICAgRGVwbG95bWVudElkZW50aXR5IGlkZW50aXR5LCBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lLCBTdHJpbmcgdGFyZ2V0UGF0aCkgeworICAgICAgICBoYW5kbGVFcnJvcihzZXJ2ZXJCZWhhdmlvdXIpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRTZXJ2ZXJVbmRlcGxveUNvbW1hbmQob3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyQmVoYXZpb3VyLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUpCi0JICovCi0JcHVibGljIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclVuZGVwbG95Q29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUpIHsKLQkJaGFuZGxlRXJyb3Ioc2VydmVyQmVoYXZpb3VyKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldFNlcnZlclVuZGVwbG95Q29tbWFuZChvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJCZWhhdmlvdXIsCisgICAgICogICAgICBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgSVNlcnZlckNvbW1hbmQ8Vm9pZD4gZ2V0U2VydmVyVW5kZXBsb3lDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLCBJTW9kdWxlIG1vZHVsZSkgeworICAgICAgICBoYW5kbGVFcnJvcihzZXJ2ZXJCZWhhdmlvdXIpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRTZXJ2ZXJEZXBsb3lDb21tYW5kKG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlckJlaGF2aW91ciwKLQkgKiAgICAgIGphdmEubmV0LlVSSSkKLQkgKi8KLQlwdWJsaWMgSVNlcnZlckNvbW1hbmQ8RGVwbG95bWVudElkZW50aXR5PiBnZXRTZXJ2ZXJEZXBsb3lDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLAotCQkJVVJJIGNvbm5lY3RvckJ1bmRsZVVyaSkgewotCQloYW5kbGVFcnJvcihzZXJ2ZXJCZWhhdmlvdXIpOwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0U2VydmVyRGVwbG95Q29tbWFuZChvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJCZWhhdmlvdXIsCisgICAgICogICAgICBqYXZhLm5ldC5VUkkpCisgICAgICovCisgICAgcHVibGljIElTZXJ2ZXJDb21tYW5kPERlcGxveW1lbnRJZGVudGl0eT4gZ2V0U2VydmVyRGVwbG95Q29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91ciwgVVJJIGNvbm5lY3RvckJ1bmRsZVVyaSkgeworICAgICAgICBoYW5kbGVFcnJvcihzZXJ2ZXJCZWhhdmlvdXIpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRTZXJ2ZXJCdW5kbGVBZG1pbkNvbW1hbmQob3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyQmVoYXZpb3VyKQotCSAqLwotCXB1YmxpYyBJU2VydmVyQ29tbWFuZDxNYXA8TG9uZywgSUJ1bmRsZT4+IGdldFNlcnZlckJ1bmRsZUFkbWluQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cikgewotCQloYW5kbGVFcnJvcihzZXJ2ZXJCZWhhdmlvdXIpOwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0U2VydmVyQnVuZGxlQWRtaW5Db21tYW5kKG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlckJlaGF2aW91cikKKyAgICAgKi8KKyAgICBwdWJsaWMgSVNlcnZlckNvbW1hbmQ8TWFwPExvbmcsIElCdW5kbGU+PiBnZXRTZXJ2ZXJCdW5kbGVBZG1pbkNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIpIHsKKyAgICAgICAgaGFuZGxlRXJyb3Ioc2VydmVyQmVoYXZpb3VyKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0U2VydmVyQnVuZGxlQWRtaW5FeGVjdXRlQ29tbWFuZChvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJCZWhhdmlvdXIsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU2VydmVyQ29tbWFuZDxTdHJpbmc+IGdldFNlcnZlckJ1bmRsZUFkbWluRXhlY3V0ZUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIFN0cmluZyBjb21tYW5kKSB7Ci0JCWhhbmRsZUVycm9yKHNlcnZlckJlaGF2aW91cik7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRTZXJ2ZXJCdW5kbGVBZG1pbkV4ZWN1dGVDb21tYW5kKG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlckJlaGF2aW91ciwKKyAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIElTZXJ2ZXJDb21tYW5kPFN0cmluZz4gZ2V0U2VydmVyQnVuZGxlQWRtaW5FeGVjdXRlQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91ciwgU3RyaW5nIGNvbW1hbmQpIHsKKyAgICAgICAgaGFuZGxlRXJyb3Ioc2VydmVyQmVoYXZpb3VyKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjcHJlU3RhcnR1cChvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJCZWhhdmlvdXIpCi0JICovCi0JcHVibGljIHZvaWQgcHJlU3RhcnR1cChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cikgewotCQloYW5kbGVFcnJvcihzZXJ2ZXJCZWhhdmlvdXIpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNwcmVTdGFydHVwKG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlckJlaGF2aW91cikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmVTdGFydHVwKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7CisgICAgICAgIGhhbmRsZUVycm9yKHNlcnZlckJlaGF2aW91cik7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0U2VydmVyRGVwbG95Q29tbWFuZChvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJCZWhhdmlvdXIpCi0JICovCi0JcHVibGljIElTZXJ2ZXJDb21tYW5kPERlcGxveW1lbnRJZGVudGl0eT4gZ2V0U2VydmVyRGVwbG95Q29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cikgewotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0U2VydmVyRGVwbG95Q29tbWFuZChvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJCZWhhdmlvdXIpCisgICAgICovCisgICAgcHVibGljIElTZXJ2ZXJDb21tYW5kPERlcGxveW1lbnRJZGVudGl0eT4gZ2V0U2VydmVyRGVwbG95Q29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cikgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRDb25uZWN0b3JCdW5kbGVVcmkoKQotCSAqLwotCXB1YmxpYyBVUkkgZ2V0Q29ubmVjdG9yQnVuZGxlVXJpKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0Q29ubmVjdG9yQnVuZGxlVXJpKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgVVJJIGdldENvbm5lY3RvckJ1bmRsZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0U2VydmVyUHJvcGVydGllc0RpcmVjdG9yaWVzKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmVyUHJvcGVydGllc0RpcmVjdG9yaWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0U2VydmVyUHJvcGVydGllc0RpcmVjdG9yaWVzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmVyUHJvcGVydGllc0RpcmVjdG9yaWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRTZXJ2ZXJMb2dEaXJlY3RvcmllcygpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFNlcnZlckxvZ0RpcmVjdG9yaWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0U2VydmVyTG9nRGlyZWN0b3JpZXMoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJMb2dEaXJlY3RvcmllcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9ydW50aW1lcy9SdW50aW1lUHJvdmlkZXJzLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3J1bnRpbWVzL1J1bnRpbWVQcm92aWRlcnMuamF2YQppbmRleCBiM2I2YzA0Li4xY2U3OTlkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3J1bnRpbWVzL1J1bnRpbWVQcm92aWRlcnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3J1bnRpbWVzL1J1bnRpbWVQcm92aWRlcnMuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLnJ1bnRpbWVzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyOwpAQCAtMTUsNyArMTYsNyBAQAogCiAvKioKICAqIFV0aWxpdHkgdGhhdCBsb2FkcyB7QGxpbmsgSVNlcnZlclJ1bnRpbWVQcm92aWRlcn1zIGJhc2VkIG9uIGdpdmVuIHZlcnNpb24gaWRlbnRpZmllcnMuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBhdXRob3IgTGVvIERvcyBTYW50b3MKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCkBAIC0yMywxNyArMjQsMTYgQEAKICAqLwogcHVibGljIGNsYXNzIFJ1bnRpbWVQcm92aWRlcnMgewogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBWaXJnb1J1bnRpbWVQcm92aWRlcltdIEFMTF9IQU5ETEVSUyA9IG5ldyBWaXJnb1J1bnRpbWVQcm92aWRlcltdIHsgVmlyZ28yMV8zMFByb3ZpZGVyLklOU1RBTkNFLAotCQkJVmlyZ28zNVByb3ZpZGVyLklOU1RBTkNFIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBWaXJnb1J1bnRpbWVQcm92aWRlcltdIEFMTF9IQU5ETEVSUyA9IG5ldyBWaXJnb1J1bnRpbWVQcm92aWRlcltdIHsgVmlyZ28yMV8zMFByb3ZpZGVyLklOU1RBTkNFLCBWaXJnbzM1UHJvdmlkZXIuSU5TVEFOQ0UgfTsKIAotCXB1YmxpYyBzdGF0aWMgSVNlcnZlclJ1bnRpbWVQcm92aWRlciBnZXRSdW50aW1lUHJvdmlkZXIoSVJ1bnRpbWUgcnVudGltZSkgewotCQlpZiAocnVudGltZSAhPSBudWxsKSB7Ci0JCQlmb3IgKFZpcmdvUnVudGltZVByb3ZpZGVyIHZlcnNpb24gOiBSdW50aW1lUHJvdmlkZXJzLkFMTF9IQU5ETEVSUykgewotCQkJCWlmICh2ZXJzaW9uLmlzSGFuZGxlckZvcihydW50aW1lKSkgewotCQkJCQlyZXR1cm4gdmVyc2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEludmFsaWRSdW50aW1lUHJvdmlkZXIuSU5TVEFOQ0U7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgSVNlcnZlclJ1bnRpbWVQcm92aWRlciBnZXRSdW50aW1lUHJvdmlkZXIoSVJ1bnRpbWUgcnVudGltZSkgeworICAgICAgICBpZiAocnVudGltZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKFZpcmdvUnVudGltZVByb3ZpZGVyIHZlcnNpb24gOiBSdW50aW1lUHJvdmlkZXJzLkFMTF9IQU5ETEVSUykgeworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uLmlzSGFuZGxlckZvcihydW50aW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVyc2lvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEludmFsaWRSdW50aW1lUHJvdmlkZXIuSU5TVEFOQ0U7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9ydW50aW1lcy9WaXJnbzIxXzMwUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvcnVudGltZXMvVmlyZ28yMV8zMFByb3ZpZGVyLmphdmEKaW5kZXggNzYzNzJjZC4uYmFhYmM2MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9ydW50aW1lcy9WaXJnbzIxXzMwUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3J1bnRpbWVzL1ZpcmdvMjFfMzBQcm92aWRlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNBUCBBRyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUucnVudGltZXM7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMjYsNzUgKzI3LDc1IEBACiAKIC8qKgogICoge0BsaW5rIElTZXJ2ZXJSdW50aW1lUHJvdmlkZXJ9IGZvciBWaXJnbyBTZXJ2ZXIgMi4xLnggdGhyb3VnaCAzLjAueC4KLSAqIAorICoKICAqIEBhdXRob3IgQm9yaXNsYXYgS2FwdWthcmFub3YKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCiAgKi8KIHB1YmxpYyBjbGFzcyBWaXJnbzIxXzMwUHJvdmlkZXIgZXh0ZW5kcyBWaXJnb1J1bnRpbWVQcm92aWRlciB7CiAKLQkvLyBBc3N1bWVzIFN0YXRlbGVzcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmlyZ29SdW50aW1lUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgVmlyZ28yMV8zMFByb3ZpZGVyKCk7CisgICAgLy8gQXNzdW1lcyBTdGF0ZWxlc3MKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZpcmdvUnVudGltZVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IFZpcmdvMjFfMzBQcm92aWRlcigpOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX0NPTk5FQ1RPUl9CVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGVfMS4wLjAuMjAxMjAzMDkxODAzLmphciI7IC8vJE5PTi1OTFMtMSQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfQ09OTkVDVE9SX0JVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5hZ2VtZW50LnJlbW90ZV8xLjAuMC4yMDEyMDMwOTE4MDMuamFyIjsgLy8kTk9OLU5MUy0xJAogCi0JcHJpdmF0ZSBWaXJnbzIxXzMwUHJvdmlkZXIoKSB7Ci0JfQorICAgIHByaXZhdGUgVmlyZ28yMV8zMFByb3ZpZGVyKCkgeworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWVDbGFzcygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS52aXJnby5vc2dpLmxhdW5jaGVyLkxhdW5jaGVyIjsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCkgeworICAgICAgICByZXR1cm4gIm9yZy5lY2xpcHNlLnZpcmdvLm9zZ2kubGF1bmNoZXIuTGF1bmNoZXIiOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UnVudGltZVByb2dyYW1Bcmd1bWVudHMoSVNlcnZlckJlaGF2aW91ciBiZWhhdmlvdXIpIHsKLQkJU3RyaW5nIHNlcnZlckhvbWUgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoYmVoYXZpb3VyKS5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpLnRvT1NTdHJpbmcoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIi1jb25maWcgXCIiICsgc2VydmVySG9tZSArICIvbGliL29yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbC5sYXVuY2gucHJvcGVydGllc1wiIik7Ci0JCWxpc3QuYWRkKCItRm9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbC5ob21lPVwiIiArIHNlcnZlckhvbWUgKyAiXCIiKTsKLQkJbGlzdC5hZGQoIi1Gb3JnLmVjbGlwc2UudmlyZ28ua2VybmVsLmNvbmZpZz1cIiIgKyBzZXJ2ZXJIb21lICsgIi9jb25maWcsIiArIHNlcnZlckhvbWUgKyAiL3N0YWdlXCIiKTsKLQkJbGlzdC5hZGQoIi1Gb3NnaS5jb25maWd1cmF0aW9uLmFyZWE9XCIiICsgc2VydmVySG9tZSArICIvd29yay9vc2dpL2NvbmZpZ3VyYXRpb25cIiIpOwotCQlsaXN0LmFkZCgiLUZvc2dpLmphdmEucHJvZmlsZT1cImZpbGU6IiArIHNlcnZlckhvbWUgKyAiL2xpYi9qYXZhNi1zZXJ2ZXIucHJvZmlsZVwiIik7Ci0JCWxpc3QuYWRkKCItRm9zZ2kuY2xlYW49dHJ1ZSIpOwotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhJU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cikgeworICAgICAgICBTdHJpbmcgc2VydmVySG9tZSA9IFNlcnZlclV0aWxzLmdldFNlcnZlcihiZWhhdmlvdXIpLmdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KCkudG9PU1N0cmluZygpOworICAgICAgICBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBsaXN0LmFkZCgiLWNvbmZpZyBcIiIgKyBzZXJ2ZXJIb21lICsgIi9saWIvb3JnLmVjbGlwc2UudmlyZ28ua2VybmVsLmxhdW5jaC5wcm9wZXJ0aWVzXCIiKTsKKyAgICAgICAgbGlzdC5hZGQoIi1Gb3JnLmVjbGlwc2UudmlyZ28ua2VybmVsLmhvbWU9XCIiICsgc2VydmVySG9tZSArICJcIiIpOworICAgICAgICBsaXN0LmFkZCgiLUZvcmcuZWNsaXBzZS52aXJnby5rZXJuZWwuY29uZmlnPVwiIiArIHNlcnZlckhvbWUgKyAiL2NvbmZpZywiICsgc2VydmVySG9tZSArICIvc3RhZ2VcIiIpOworICAgICAgICBsaXN0LmFkZCgiLUZvc2dpLmNvbmZpZ3VyYXRpb24uYXJlYT1cIiIgKyBzZXJ2ZXJIb21lICsgIi93b3JrL29zZ2kvY29uZmlndXJhdGlvblwiIik7CisgICAgICAgIGxpc3QuYWRkKCItRm9zZ2kuamF2YS5wcm9maWxlPVwiZmlsZToiICsgc2VydmVySG9tZSArICIvbGliL2phdmE2LXNlcnZlci5wcm9maWxlXCIiKTsKKyAgICAgICAgbGlzdC5hZGQoIi1Gb3NnaS5jbGVhbj10cnVlIik7CisgICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0U3VwcG9ydGVkVmVyc2lvbnMoKSB7Ci0JCXJldHVybiAiMi4xLTMuMCI7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VwcG9ydGVkVmVyc2lvbnMoKSB7CisgICAgICAgIHJldHVybiAiMi4xLTMuMCI7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjY3JlYXRlRGVwZW5kZW5jeUxvY2F0b3Iob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZ1tdLCBqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmlmZXN0LmNvcmUuZGVwZW5kZW5jaWVzLklEZXBlbmRlbmN5TG9jYXRvci5KYXZhVmVyc2lvbikKLQkgKi8KLQlwdWJsaWMgSURlcGVuZGVuY3lMb2NhdG9yIGNyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKElSdW50aW1lIHJ1bnRpbWUsIFN0cmluZyBzZXJ2ZXJIb21lUGF0aCwKLQkJCVN0cmluZ1tdIGFkZGl0aW9uYWxTZWFyY2hQYXRocywgU3RyaW5nIGluZGV4RGlyZWN0b3J5UGF0aCwgSmF2YVZlcnNpb24gamF2YVZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUHJlMzVEZXBlbmRlbmN5TG9jYXRvclZpcmdvKHNlcnZlckhvbWVQYXRoLCBhZGRpdGlvbmFsU2VhcmNoUGF0aHMsIGluZGV4RGlyZWN0b3J5UGF0aCwgamF2YVZlcnNpb24pOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNjcmVhdGVEZXBlbmRlbmN5TG9jYXRvcihvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWUsCisgICAgICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10sIGphdmEubGFuZy5TdHJpbmcsCisgICAgICogICAgICBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS5kZXBlbmRlbmNpZXMuSURlcGVuZGVuY3lMb2NhdG9yLkphdmFWZXJzaW9uKQorICAgICAqLworICAgIHB1YmxpYyBJRGVwZW5kZW5jeUxvY2F0b3IgY3JlYXRlRGVwZW5kZW5jeUxvY2F0b3IoSVJ1bnRpbWUgcnVudGltZSwgU3RyaW5nIHNlcnZlckhvbWVQYXRoLCBTdHJpbmdbXSBhZGRpdGlvbmFsU2VhcmNoUGF0aHMsCisgICAgICAgIFN0cmluZyBpbmRleERpcmVjdG9yeVBhdGgsIEphdmFWZXJzaW9uIGphdmFWZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IFByZTM1RGVwZW5kZW5jeUxvY2F0b3JWaXJnbyhzZXJ2ZXJIb21lUGF0aCwgYWRkaXRpb25hbFNlYXJjaFBhdGhzLCBpbmRleERpcmVjdG9yeVBhdGgsIGphdmFWZXJzaW9uKTsKKyAgICB9CiAKLQlwdWJsaWMgVVJJIGdldENvbm5lY3RvckJ1bmRsZVVyaSgpIHsKLQkJcmV0dXJuIFNlcnZlckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZVVyaShMRUdBQ1lfQ09OTkVDVE9SX0JVTkRMRV9OQU1FKTsKLQl9CisgICAgcHVibGljIFVSSSBnZXRDb25uZWN0b3JCdW5kbGVVcmkoKSB7CisgICAgICAgIHJldHVybiBTZXJ2ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGVVcmkoTEVHQUNZX0NPTk5FQ1RPUl9CVU5ETEVfTkFNRSk7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlndXJhdGlvbkRpcigpIHsKLQkJcmV0dXJuICJjb25maWciOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRDb25maWd1cmF0aW9uRGlyKCkgeworICAgICAgICByZXR1cm4gImNvbmZpZyI7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCVN0cmluZyBnZXRQcm9maWxlRGlyKCkgewotCQlyZXR1cm4gImxpYiI7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBTdHJpbmcgZ2V0UHJvZmlsZURpcigpIHsKKyAgICAgICAgcmV0dXJuICJsaWIiOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9ydW50aW1lcy9WaXJnbzM1UHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvcnVudGltZXMvVmlyZ28zNVByb3ZpZGVyLmphdmEKaW5kZXggNmNiNTk4Ni4uMWIxOTJlZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9ydW50aW1lcy9WaXJnbzM1UHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3J1bnRpbWVzL1ZpcmdvMzVQcm92aWRlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNBUCBBRyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUucnVudGltZXM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC00MywxNDcgKzQ0LDE0OSBAQAogICovCiBwdWJsaWMgY2xhc3MgVmlyZ28zNVByb3ZpZGVyIGV4dGVuZHMgVmlyZ29SdW50aW1lUHJvdmlkZXIgewogCi0JLy8gQXNzdW1lcyBTdGF0ZWxlc3MKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZpcmdvUnVudGltZVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IFZpcmdvMzVQcm92aWRlcigpOworICAgIC8vIEFzc3VtZXMgU3RhdGVsZXNzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBWaXJnb1J1bnRpbWVQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBWaXJnbzM1UHJvdmlkZXIoKTsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTUlOSV9DT05ORUNUT1JfQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLm1hbmFnZW1lbnQucmVtb3RlXzMuNS4wLjIwMTIwODI5MTYzMC5qYXIiOyAvLyROT04tTkxTLTEkCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VNSU5JX0NPTk5FQ1RPUl9CVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuYWdlbWVudC5yZW1vdGVfMy41LjAuMjAxMjA4MjkxNjMwLmphciI7IC8vJE5PTi1OTFMtMSQKIAotCXByaXZhdGUgVmlyZ28zNVByb3ZpZGVyKCkgewotCX0KKyAgICBwcml2YXRlIFZpcmdvMzVQcm92aWRlcigpIHsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRSdW50aW1lQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5NYWluIjsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UnVudGltZUNsYXNzKCkgeworICAgICAgICByZXR1cm4gIm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuTWFpbiI7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDb25maWd1cmF0aW9uRGlyKCkgewotCQlyZXR1cm4gImNvbmZpZ3VyYXRpb24iOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ3VyYXRpb25EaXIoKSB7CisgICAgICAgIHJldHVybiAiY29uZmlndXJhdGlvbiI7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLnJ1bnRpbWVzLlZpcmdvUnVudGltZVByb3ZpZGVyI2dldFByb2ZpbGVEaXIoKQotCSAqLwotCUBPdmVycmlkZQotCVN0cmluZyBnZXRQcm9maWxlRGlyKCkgewotCQlyZXR1cm4gZ2V0Q29uZmlndXJhdGlvbkRpcigpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUucnVudGltZXMuVmlyZ29SdW50aW1lUHJvdmlkZXIjZ2V0UHJvZmlsZURpcigpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgU3RyaW5nIGdldFByb2ZpbGVEaXIoKSB7CisgICAgICAgIHJldHVybiBnZXRDb25maWd1cmF0aW9uRGlyKCk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0UnVudGltZUNsYXNzcGF0aChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gZ2V0UnVudGltZUNsYXNzcGF0aChJUGF0aCBpbnN0YWxsUGF0aCkgewotCQlMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+IGNwID0gc3VwZXIuZ2V0UnVudGltZUNsYXNzcGF0aChpbnN0YWxsUGF0aCk7CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0UnVudGltZUNsYXNzcGF0aChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gZ2V0UnVudGltZUNsYXNzcGF0aChJUGF0aCBpbnN0YWxsUGF0aCkgeworICAgICAgICBMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+IGNwID0gc3VwZXIuZ2V0UnVudGltZUNsYXNzcGF0aChpbnN0YWxsUGF0aCk7CiAKLQkJSVBhdGggcGx1Z2luc1BhdGggPSBpbnN0YWxsUGF0aC5hcHBlbmQoInBsdWdpbnMiKTsKLQkJaWYgKHBsdWdpbnNQYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQlGaWxlIHBsdWdpbnNGb2xkZXIgPSBwbHVnaW5zUGF0aC50b0ZpbGUoKTsKLQkJCWZvciAoRmlsZSBsaWJyYXJ5IDogcGx1Z2luc0ZvbGRlci5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLQkJCQkJcmV0dXJuIHBhdGhuYW1lLmlzRmlsZSgpICYmIHBhdGhuYW1lLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi5qYXIiKQotCQkJCQkJCSYmIHBhdGhuYW1lLnRvU3RyaW5nKCkuY29udGFpbnMoIm9yZy5lY2xpcHNlLm9zZ2lfIikKLQkJCQkJCQkmJiBwYXRobmFtZS50b1N0cmluZygpLmNvbnRhaW5zKCJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbnNvbGUuc3VwcG9ydGFiaWxpdHlfIik7Ci0JCQkJfQotCQkJfSkpIHsKLQkJCQlJUGF0aCBwYXRoID0gcGx1Z2luc1BhdGguYXBwZW5kKGxpYnJhcnkuZ2V0TmFtZSgpKTsKLQkJCQljcC5hZGQoSmF2YVJ1bnRpbWUubmV3QXJjaGl2ZVJ1bnRpbWVDbGFzc3BhdGhFbnRyeShwYXRoKSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgSVBhdGggcGx1Z2luc1BhdGggPSBpbnN0YWxsUGF0aC5hcHBlbmQoInBsdWdpbnMiKTsKKyAgICAgICAgaWYgKHBsdWdpbnNQYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7CisgICAgICAgICAgICBGaWxlIHBsdWdpbnNGb2xkZXIgPSBwbHVnaW5zUGF0aC50b0ZpbGUoKTsKKyAgICAgICAgICAgIGZvciAoRmlsZSBsaWJyYXJ5IDogcGx1Z2luc0ZvbGRlci5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7CiAKLQkJcmV0dXJuIGNwOwotCX0KKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aG5hbWUuaXNGaWxlKCkgJiYgcGF0aG5hbWUudG9TdHJpbmcoKS5lbmRzV2l0aCgiLmphciIpICYmIHBhdGhuYW1lLnRvU3RyaW5nKCkuY29udGFpbnMoIm9yZy5lY2xpcHNlLm9zZ2lfIikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHBhdGhuYW1lLnRvU3RyaW5nKCkuY29udGFpbnMoIm9yZy5lY2xpcHNlLmVxdWlub3guY29uc29sZS5zdXBwb3J0YWJpbGl0eV8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSkgeworICAgICAgICAgICAgICAgIElQYXRoIHBhdGggPSBwbHVnaW5zUGF0aC5hcHBlbmQobGlicmFyeS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGNwLmFkZChKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KHBhdGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhJU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91cikgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiLW5vRXhpdCIpOwotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKTsKLQl9CisgICAgICAgIHJldHVybiBjcDsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVWTUFyZ3VtZW50cyhJU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91ciwgSVBhdGggaW5zdGFsbFBhdGgsIElQYXRoIGNvbmZpZ1BhdGgsCi0JCQlJUGF0aCBkZXBsb3lQYXRoKSB7Ci0JCVN0cmluZ1tdIGNvbW1vbkFyZ3VtZW50cyA9IHN1cGVyLmdldFJ1bnRpbWVWTUFyZ3VtZW50cyhiZWhhdmlvdXIsIGluc3RhbGxQYXRoLCBjb25maWdQYXRoLCBkZXBsb3lQYXRoKTsKLQkJU3RyaW5nIHNlcnZlckhvbWUgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoYmVoYXZpb3VyKS5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpLnRvT1NTdHJpbmcoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb21tb25Bcmd1bWVudHMpKTsKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKElTZXJ2ZXJCZWhhdmlvdXIgYmVoYXZpb3VyKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGxpc3QuYWRkKCItbm9FeGl0Iik7CisgICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOworICAgIH0KIAotCQlsaXN0LmFkZCgiLURvcmcuZWNsaXBzZS52aXJnby5rZXJuZWwuY29uZmlnPSIgKyBzZXJ2ZXJIb21lICsgIi8iICsgZ2V0Q29uZmlndXJhdGlvbkRpcigpICsgIiwiICsgc2VydmVySG9tZQotCQkJCSsgIi9zdGFnZSIpOwotCQlsaXN0LmFkZCgiLURvc2dpLmphdmEucHJvZmlsZT1maWxlOiIgKyBzZXJ2ZXJIb21lICsgIi8iICsgZ2V0Q29uZmlndXJhdGlvbkRpcigpICsgIi9qYXZhNi1zZXJ2ZXIucHJvZmlsZSIpOwotCQlsaXN0LmFkZCgiLURlY2xpcHNlLmlnbm9yZUFwcD10cnVlIik7Ci0JCWxpc3QuYWRkKCItRG9zZ2kuaW5zdGFsbC5hcmVhPSIgKyBzZXJ2ZXJIb21lKTsKLQkJbGlzdC5hZGQoIi1Eb3NnaS5jb25maWd1cmF0aW9uLmFyZWE9IiArIHNlcnZlckhvbWUgKyAiL3dvcmsiKTsKLQkJbGlzdC5hZGQoIi1Ec3NoLnNlcnZlci5rZXlzdG9yZT0iICsgc2VydmVySG9tZSArICIvIiArIGdldENvbmZpZ3VyYXRpb25EaXIoKSArICIvaG9zdGtleS5zZXIiKTsKLQkJbGlzdC5hZGQoIi1EamF2YS5lbmRvcnNlZC5kaXJzPVwiIiArIHNlcnZlckhvbWUgKyAiL2xpYi9lbmRvcnNlZFwiIik7CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRSdW50aW1lVk1Bcmd1bWVudHMoSVNlcnZlckJlaGF2aW91ciBiZWhhdmlvdXIsIElQYXRoIGluc3RhbGxQYXRoLCBJUGF0aCBjb25maWdQYXRoLCBJUGF0aCBkZXBsb3lQYXRoKSB7CisgICAgICAgIFN0cmluZ1tdIGNvbW1vbkFyZ3VtZW50cyA9IHN1cGVyLmdldFJ1bnRpbWVWTUFyZ3VtZW50cyhiZWhhdmlvdXIsIGluc3RhbGxQYXRoLCBjb25maWdQYXRoLCBkZXBsb3lQYXRoKTsKKyAgICAgICAgU3RyaW5nIHNlcnZlckhvbWUgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoYmVoYXZpb3VyKS5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpLnRvT1NTdHJpbmcoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb21tb25Bcmd1bWVudHMpKTsKIAotCQlTdHJpbmcgZndDbGFzc1BhdGggPSBjcmVhdGVGV0NsYXNzUGF0aChzZXJ2ZXJIb21lKTsKKyAgICAgICAgbGlzdC5hZGQoIi1Eb3JnLmVjbGlwc2UudmlyZ28ua2VybmVsLmNvbmZpZz0iICsgc2VydmVySG9tZSArICIvIiArIGdldENvbmZpZ3VyYXRpb25EaXIoKSArICIsIiArIHNlcnZlckhvbWUgKyAiL3N0YWdlIik7CisgICAgICAgIGxpc3QuYWRkKCItRG9zZ2kuamF2YS5wcm9maWxlPWZpbGU6IiArIHNlcnZlckhvbWUgKyAiLyIgKyBnZXRDb25maWd1cmF0aW9uRGlyKCkgKyAiL2phdmE2LXNlcnZlci5wcm9maWxlIik7CisgICAgICAgIGxpc3QuYWRkKCItRGVjbGlwc2UuaWdub3JlQXBwPXRydWUiKTsKKyAgICAgICAgbGlzdC5hZGQoIi1Eb3NnaS5pbnN0YWxsLmFyZWE9IiArIHNlcnZlckhvbWUpOworICAgICAgICBsaXN0LmFkZCgiLURvc2dpLmNvbmZpZ3VyYXRpb24uYXJlYT0iICsgc2VydmVySG9tZSArICIvd29yayIpOworICAgICAgICBsaXN0LmFkZCgiLURzc2guc2VydmVyLmtleXN0b3JlPSIgKyBzZXJ2ZXJIb21lICsgIi8iICsgZ2V0Q29uZmlndXJhdGlvbkRpcigpICsgIi9ob3N0a2V5LnNlciIpOworICAgICAgICBsaXN0LmFkZCgiLURqYXZhLmVuZG9yc2VkLmRpcnM9XCIiICsgc2VydmVySG9tZSArICIvbGliL2VuZG9yc2VkXCIiKTsKIAotCQlsaXN0LmFkZCgiLURvc2dpLmZyYW1ld29ya0NsYXNzUGF0aD0iICsgZndDbGFzc1BhdGgpOworICAgICAgICBTdHJpbmcgZndDbGFzc1BhdGggPSBjcmVhdGVGV0NsYXNzUGF0aChzZXJ2ZXJIb21lKTsKIAotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKTsKLQl9CisgICAgICAgIGxpc3QuYWRkKCItRG9zZ2kuZnJhbWV3b3JrQ2xhc3NQYXRoPSIgKyBmd0NsYXNzUGF0aCk7CiAKLQlwcml2YXRlIFN0cmluZyBjcmVhdGVGV0NsYXNzUGF0aChTdHJpbmcgc2VydmVySG9tZSkgewotCQlTdHJpbmdCdWlsZGVyIGZ3Q2xhc3NQYXRoID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShzZXJ2ZXJIb21lICsgIi9saWIiKTsKLQkJaWYgKGxpYkRpci5leGlzdHMoKSkgewotCQkJZm9yIChGaWxlIGZpbGUgOiBsaWJEaXIubGlzdEZpbGVzKCkpIHsKLQkJCQlpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgewotCQkJCQlmd0NsYXNzUGF0aC5hcHBlbmQoImZpbGU6IiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLCIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlGaWxlIHBsdWdpbnMgPSBuZXcgRmlsZShzZXJ2ZXJIb21lICsgIi9wbHVnaW5zIik7Ci0JCWlmIChwbHVnaW5zLmV4aXN0cygpKSB7Ci0JCQlmb3IgKEZpbGUgZmlsZSA6IHBsdWdpbnMubGlzdEZpbGVzKCkpIHsKLQkJCQlpZiAoZmlsZS5nZXROYW1lKCkuY29udGFpbnMoIm9yZy5lY2xpcHNlLm9zZ2lfIikpIHsKLQkJCQkJZndDbGFzc1BhdGguYXBwZW5kKCJmaWxlOiIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiwiKTsKLQkJCQl9Ci0JCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmNvbnRhaW5zKCJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbnNvbGUuc3VwcG9ydGFiaWxpdHlfIikpIHsKLQkJCQkJZndDbGFzc1BhdGguYXBwZW5kKCJmaWxlOiIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiwiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZndDbGFzc1BhdGguZGVsZXRlQ2hhckF0KGZ3Q2xhc3NQYXRoLmxlbmd0aCgpIC0gMSk7Ci0JCXJldHVybiBmd0NsYXNzUGF0aC50b1N0cmluZygpOwotCX0KKyAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRTdXBwb3J0ZWRWZXJzaW9ucygpIHsKLQkJcmV0dXJuICIzLjUrIjsKLQl9CisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlRldDbGFzc1BhdGgoU3RyaW5nIHNlcnZlckhvbWUpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBmd0NsYXNzUGF0aCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIEZpbGUgbGliRGlyID0gbmV3IEZpbGUoc2VydmVySG9tZSArICIvbGliIik7CisgICAgICAgIGlmIChsaWJEaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGZvciAoRmlsZSBmaWxlIDogbGliRGlyLmxpc3RGaWxlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZndDbGFzc1BhdGguYXBwZW5kKCJmaWxlOiIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBwbHVnaW5zID0gbmV3IEZpbGUoc2VydmVySG9tZSArICIvcGx1Z2lucyIpOworICAgICAgICBpZiAocGx1Z2lucy5leGlzdHMoKSkgeworICAgICAgICAgICAgZm9yIChGaWxlIGZpbGUgOiBwbHVnaW5zLmxpc3RGaWxlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuZ2V0TmFtZSgpLmNvbnRhaW5zKCJvcmcuZWNsaXBzZS5vc2dpXyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZ3Q2xhc3NQYXRoLmFwcGVuZCgiZmlsZToiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmaWxlLmdldE5hbWUoKS5jb250YWlucygib3JnLmVjbGlwc2UuZXF1aW5veC5jb25zb2xlLnN1cHBvcnRhYmlsaXR5XyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZ3Q2xhc3NQYXRoLmFwcGVuZCgiZmlsZToiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZ3Q2xhc3NQYXRoLmRlbGV0ZUNoYXJBdChmd0NsYXNzUGF0aC5sZW5ndGgoKSAtIDEpOworICAgICAgICByZXR1cm4gZndDbGFzc1BhdGgudG9TdHJpbmcoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNjcmVhdGVEZXBlbmRlbmN5TG9jYXRvcihvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWUsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nW10sIGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS52aXJnby5pZGUubWFuaWZlc3QuY29yZS5kZXBlbmRlbmNpZXMuSURlcGVuZGVuY3lMb2NhdG9yLkphdmFWZXJzaW9uKQotCSAqLwotCXB1YmxpYyBJRGVwZW5kZW5jeUxvY2F0b3IgY3JlYXRlRGVwZW5kZW5jeUxvY2F0b3IoSVJ1bnRpbWUgcnVudGltZSwgU3RyaW5nIHNlcnZlckhvbWVQYXRoLAotCQkJU3RyaW5nW10gYWRkaXRpb25hbFNlYXJjaFBhdGhzLCBTdHJpbmcgaW5kZXhEaXJlY3RvcnlQYXRoLCBKYXZhVmVyc2lvbiBqYXZhVmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBEZXBlbmRlbmN5TG9jYXRvclZpcmdvKHNlcnZlckhvbWVQYXRoLCBhZGRpdGlvbmFsU2VhcmNoUGF0aHMsIGluZGV4RGlyZWN0b3J5UGF0aCwgamF2YVZlcnNpb24pOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN1cHBvcnRlZFZlcnNpb25zKCkgeworICAgICAgICByZXR1cm4gIjMuNSsiOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldENvbm5lY3RvckJ1bmRsZVVyaSgpCi0JICovCi0JcHVibGljIFVSSSBnZXRDb25uZWN0b3JCdW5kbGVVcmkoKSB7Ci0JCXJldHVybiBTZXJ2ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGVVcmkoR0VNSU5JX0NPTk5FQ1RPUl9CVU5ETEVfTkFNRSk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2NyZWF0ZURlcGVuZGVuY3lMb2NhdG9yKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZSwKKyAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5sYW5nLlN0cmluZywKKyAgICAgKiAgICAgIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5tYW5pZmVzdC5jb3JlLmRlcGVuZGVuY2llcy5JRGVwZW5kZW5jeUxvY2F0b3IuSmF2YVZlcnNpb24pCisgICAgICovCisgICAgcHVibGljIElEZXBlbmRlbmN5TG9jYXRvciBjcmVhdGVEZXBlbmRlbmN5TG9jYXRvcihJUnVudGltZSBydW50aW1lLCBTdHJpbmcgc2VydmVySG9tZVBhdGgsIFN0cmluZ1tdIGFkZGl0aW9uYWxTZWFyY2hQYXRocywKKyAgICAgICAgU3RyaW5nIGluZGV4RGlyZWN0b3J5UGF0aCwgSmF2YVZlcnNpb24gamF2YVZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRGVwZW5kZW5jeUxvY2F0b3JWaXJnbyhzZXJ2ZXJIb21lUGF0aCwgYWRkaXRpb25hbFNlYXJjaFBhdGhzLCBpbmRleERpcmVjdG9yeVBhdGgsIGphdmFWZXJzaW9uKTsKKyAgICB9CiAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC5jb3JlLnJ1bnRpbWVzLlZpcmdvUnVudGltZVByb3ZpZGVyI2dldFNlcnZlckRlcGxveUNvbW1hbmQob3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyQmVoYXZpb3VyLCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVNlcnZlckNvbW1hbmQ8RGVwbG95bWVudElkZW50aXR5PiBnZXRTZXJ2ZXJEZXBsb3lDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgSVNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUpIHsKLQkJcmV0dXJuIG5ldyBKbXhTZXJ2ZXJEZXBsb3lDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIsIG1vZHVsZSwgdHJ1ZSk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldENvbm5lY3RvckJ1bmRsZVVyaSgpCisgICAgICovCisgICAgcHVibGljIFVSSSBnZXRDb25uZWN0b3JCdW5kbGVVcmkoKSB7CisgICAgICAgIHJldHVybiBTZXJ2ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGVVcmkoR0VNSU5JX0NPTk5FQ1RPUl9CVU5ETEVfTkFNRSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlCisgICAgICogb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZS5ydW50aW1lcy5WaXJnb1J1bnRpbWVQcm92aWRlciNnZXRTZXJ2ZXJEZXBsb3lDb21tYW5kKG9yZy5lY2xpcHNlLgorICAgICAqIHZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlckJlaGF2aW91ciwgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGUpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElTZXJ2ZXJDb21tYW5kPERlcGxveW1lbnRJZGVudGl0eT4gZ2V0U2VydmVyRGVwbG95Q29tbWFuZChJU2VydmVyQmVoYXZpb3VyIElTZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlKSB7CisgICAgICAgIHJldHVybiBuZXcgSm14U2VydmVyRGVwbG95Q29tbWFuZChJU2VydmVyQmVoYXZpb3VyLCBtb2R1bGUsIHRydWUpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvcnVudGltZXMvVmlyZ29SdW50aW1lUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvcnVudGltZXMvVmlyZ29SdW50aW1lUHJvdmlkZXIuamF2YQppbmRleCBmOTg2Y2Q5Li5hMGJlNDk4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC9jb3JlL3J1bnRpbWVzL1ZpcmdvUnVudGltZVByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS9ydW50aW1lcy9WaXJnb1J1bnRpbWVQcm92aWRlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLmNvcmUucnVudGltZXM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC02MiwzODQgKzYzLDM3OSBAQAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlyZ29SdW50aW1lUHJvdmlkZXIgaW1wbGVtZW50cyBJU2VydmVyUnVudGltZVByb3ZpZGVyIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRfRElSID0gImV4dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVF9ESVIgPSAiZXh0IjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU1JfRElSID0gInVzciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTUl9ESVIgPSAidXNyIjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPU0lUT1JZX0RJUiA9ICJyZXBvc2l0b3J5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9ESVIgPSAicmVwb3NpdG9yeSI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfVklSR09fQkFTRSA9ICJvcmcuZWNsaXBzZS52aXJnby5zZXJ2ZXIucnVudGltZS52aXJnbyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1ZJUkdPX0JBU0UgPSAib3JnLmVjbGlwc2UudmlyZ28uc2VydmVyLnJ1bnRpbWUudmlyZ28iOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9PQkpFQ1RfTkFNRSA9ICJvcmcuZWNsaXBzZS52aXJnby5rZXJuZWw6dHlwZT1Nb2RlbCxhcnRpZmFjdC10eXBlPWJ1bmRsZSxuYW1lPSROQU1FLHZlcnNpb249JFZFUlNJT04iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfT0JKRUNUX05BTUUgPSAib3JnLmVjbGlwc2UudmlyZ28ua2VybmVsOnR5cGU9TW9kZWwsYXJ0aWZhY3QtdHlwZT1idW5kbGUsbmFtZT0kTkFNRSx2ZXJzaW9uPSRWRVJTSU9OIjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lFUl9NQkVBTl9OQU1FID0gIm9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbDpjYXRlZ29yeT1Db250cm9sLHR5cGU9RGVwbG95ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lFUl9NQkVBTl9OQU1FID0gIm9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbDpjYXRlZ29yeT1Db250cm9sLHR5cGU9RGVwbG95ZXIiOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUl9PQkpFQ1RfTkFNRSA9ICJvcmcuZWNsaXBzZS52aXJnby5rZXJuZWw6dHlwZT1Nb2RlbCxhcnRpZmFjdC10eXBlPXBhcixuYW1lPSROQU1FLHZlcnNpb249JFZFUlNJT04iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJfT0JKRUNUX05BTUUgPSAib3JnLmVjbGlwc2UudmlyZ28ua2VybmVsOnR5cGU9TW9kZWwsYXJ0aWZhY3QtdHlwZT1wYXIsbmFtZT0kTkFNRSx2ZXJzaW9uPSRWRVJTSU9OIjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFOX09CSkVDVF9OQU1FID0gIm9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbDp0eXBlPU1vZGVsLGFydGlmYWN0LXR5cGU9cGxhbixuYW1lPSROQU1FLHZlcnNpb249JFZFUlNJT04iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFOX09CSkVDVF9OQU1FID0gIm9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbDp0eXBlPU1vZGVsLGFydGlmYWN0LXR5cGU9cGxhbixuYW1lPSROQU1FLHZlcnNpb249JFZFUlNJT04iOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09WRVJZX01PTklUT1JfTUJFQU5fTkFNRSA9ICJvcmcuZWNsaXBzZS52aXJnby5rZXJuZWw6Y2F0ZWdvcnk9Q29udHJvbCx0eXBlPVJlY292ZXJ5TW9uaXRvciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09WRVJZX01PTklUT1JfTUJFQU5fTkFNRSA9ICJvcmcuZWNsaXBzZS52aXJnby5rZXJuZWw6Y2F0ZWdvcnk9Q29udHJvbCx0eXBlPVJlY292ZXJ5TW9uaXRvciI7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hVVERPV05fTUJFQU5fTkFNRSA9ICJvcmcuZWNsaXBzZS52aXJnby5rZXJuZWw6dHlwZT1TaHV0ZG93biI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIVVRET1dOX01CRUFOX05BTUUgPSAib3JnLmVjbGlwc2UudmlyZ28ua2VybmVsOnR5cGU9U2h1dGRvd24iOwogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVwbG95ZXJNQmVhbk5hbWUoKSB7Ci0JCXJldHVybiBERVBMT1lFUl9NQkVBTl9OQU1FOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZXBsb3llck1CZWFuTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIERFUExPWUVSX01CRUFOX05BTUU7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVjb3ZlcnlNb25pdG9yTUJlYW5OYW1lKCkgewotCQlyZXR1cm4gUkVDT1ZFUllfTU9OSVRPUl9NQkVBTl9OQU1FOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZWNvdmVyeU1vbml0b3JNQmVhbk5hbWUoKSB7CisgICAgICAgIHJldHVybiBSRUNPVkVSWV9NT05JVE9SX01CRUFOX05BTUU7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfSBQcm92aWRlcyBnZW5lcmljIHJ1bnRpbWUgYXJndW1lbnRzIHNoYXJlZCBieSBhbGwgdmVyc2lvbnMuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVWTUFyZ3VtZW50cyhJU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91ciwgSVBhdGggaW5zdGFsbFBhdGgsIElQYXRoIGNvbmZpZ1BhdGgsCi0JCQlJUGF0aCBkZXBsb3lQYXRoKSB7Ci0JCVN0cmluZyBzZXJ2ZXJIb21lID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyKGJlaGF2aW91cikuZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKS50b09TU3RyaW5nKCk7Ci0JCVN0cmluZyBhYnNDb25maWdEaXIgPSBzZXJ2ZXJIb21lICsgIi8iICsgZ2V0Q29uZmlndXJhdGlvbkRpcigpOwotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiLVhYOitIZWFwRHVtcE9uT3V0T2ZNZW1vcnlFcnJvciIpOwotCQlsaXN0LmFkZCgiLVhYOkVycm9yRmlsZT1cIiIgKyBzZXJ2ZXJIb21lICsgIi9zZXJ2aWNlYWJpbGl0eS9lcnJvci5sb2dcIiIpOwotCQlsaXN0LmFkZCgiLVhYOkhlYXBEdW1wUGF0aD1cIiIgKyBzZXJ2ZXJIb21lICsgIi9zZXJ2aWNlYWJpbGl0eS9oZWFwX2R1bXAuaHByb2ZcIiIpOwotCQlsaXN0LmFkZCgiLVhYOk1heFBlcm1TaXplPSIgKyBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoYmVoYXZpb3VyKS5nZXRNYXhQZXJtU2l6ZSgpKTsKLQkJbGlzdC5hZGQoIi1EamF2YS5ybWkuc2VydmVyLmhvc3RuYW1lPTEyNy4wLjAuMSIpOwotCQlsaXN0LmFkZCgiLURvcmcuZWNsaXBzZS52aXJnby5rZXJuZWwuaG9tZT1cIiIgKyBzZXJ2ZXJIb21lICsgIlwiIik7Ci0JCWxpc3QuYWRkKCItRGphdmEuaW8udG1wZGlyPVwiIiArIHNlcnZlckhvbWUgKyAiL3dvcmsvdG1wL1wiIik7Ci0JCWxpc3QuYWRkKCItRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUiKTsKLQkJbGlzdC5hZGQoIi1Ec3NoLnNlcnZlci5rZXlzdG9yZT1cIiIgKyBhYnNDb25maWdEaXIgKyAiL2hvc3RrZXkuc2VyXCIiKTsKLQkJbGlzdC5hZGQoIi1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5wb3J0PSIgKyBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoYmVoYXZpb3VyKS5nZXRNQmVhblNlcnZlclBvcnQoKSk7Ci0JCWxpc3QuYWRkKCItRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuYXV0aGVudGljYXRlPWZhbHNlIik7Ci0JCWxpc3QuYWRkKCItRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsPWZhbHNlIik7Ci0JCWxpc3QuYWRkKCItRG9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbC5hdXRoZW50aWNhdGlvbi5maWxlPVwiIiArIGFic0NvbmZpZ0RpcgotCQkJCSsgIi9vcmcuZWNsaXBzZS52aXJnby5rZXJuZWwudXNlcnMucHJvcGVydGllc1wiIik7Ci0JCWxpc3QuYWRkKCItRGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWc9XCIiICsgYWJzQ29uZmlnRGlyCi0JCQkJKyAiL29yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbC5hdXRoZW50aWNhdGlvbi5jb25maWdcIiIpOwotCQlpZiAoZ2V0SW5zdGFsbGF0aW9uVHlwZShTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoYmVoYXZpb3VyKS5nZXRSdW50aW1lKCkuZ2V0UnVudGltZSgpKSA9PSBJbnN0YWxsYXRpb25UeXBlLkpFVFRZKSB7Ci0JCQlsaXN0LmFkZCgiLURqZXR0eS5ob21lPVwiIiArIHNlcnZlckhvbWUgKyAiL2pldHR5XCIiKTsKLQkJfQotCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfSBQcm92aWRlcyBnZW5lcmljIHJ1bnRpbWUgYXJndW1lbnRzIHNoYXJlZCBieSBhbGwgdmVyc2lvbnMuCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldFJ1bnRpbWVWTUFyZ3VtZW50cyhJU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91ciwgSVBhdGggaW5zdGFsbFBhdGgsIElQYXRoIGNvbmZpZ1BhdGgsIElQYXRoIGRlcGxveVBhdGgpIHsKKyAgICAgICAgU3RyaW5nIHNlcnZlckhvbWUgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoYmVoYXZpb3VyKS5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpLnRvT1NTdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIGFic0NvbmZpZ0RpciA9IHNlcnZlckhvbWUgKyAiLyIgKyBnZXRDb25maWd1cmF0aW9uRGlyKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGxpc3QuYWRkKCItWFg6K0hlYXBEdW1wT25PdXRPZk1lbW9yeUVycm9yIik7CisgICAgICAgIGxpc3QuYWRkKCItWFg6RXJyb3JGaWxlPVwiIiArIHNlcnZlckhvbWUgKyAiL3NlcnZpY2VhYmlsaXR5L2Vycm9yLmxvZ1wiIik7CisgICAgICAgIGxpc3QuYWRkKCItWFg6SGVhcER1bXBQYXRoPVwiIiArIHNlcnZlckhvbWUgKyAiL3NlcnZpY2VhYmlsaXR5L2hlYXBfZHVtcC5ocHJvZlwiIik7CisgICAgICAgIGxpc3QuYWRkKCItWFg6TWF4UGVybVNpemU9IiArIFNlcnZlclV0aWxzLmdldFNlcnZlcihiZWhhdmlvdXIpLmdldE1heFBlcm1TaXplKCkpOworICAgICAgICBsaXN0LmFkZCgiLURqYXZhLnJtaS5zZXJ2ZXIuaG9zdG5hbWU9MTI3LjAuMC4xIik7CisgICAgICAgIGxpc3QuYWRkKCItRG9yZy5lY2xpcHNlLnZpcmdvLmtlcm5lbC5ob21lPVwiIiArIHNlcnZlckhvbWUgKyAiXCIiKTsKKyAgICAgICAgbGlzdC5hZGQoIi1EamF2YS5pby50bXBkaXI9XCIiICsgc2VydmVySG9tZSArICIvd29yay90bXAvXCIiKTsKKyAgICAgICAgbGlzdC5hZGQoIi1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZSIpOworICAgICAgICBsaXN0LmFkZCgiLURzc2guc2VydmVyLmtleXN0b3JlPVwiIiArIGFic0NvbmZpZ0RpciArICIvaG9zdGtleS5zZXJcIiIpOworICAgICAgICBsaXN0LmFkZCgiLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBvcnQ9IiArIFNlcnZlclV0aWxzLmdldFNlcnZlcihiZWhhdmlvdXIpLmdldE1CZWFuU2VydmVyUG9ydCgpKTsKKyAgICAgICAgbGlzdC5hZGQoIi1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5hdXRoZW50aWNhdGU9ZmFsc2UiKTsKKyAgICAgICAgbGlzdC5hZGQoIi1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5zc2w9ZmFsc2UiKTsKKyAgICAgICAgbGlzdC5hZGQoIi1Eb3JnLmVjbGlwc2UudmlyZ28ua2VybmVsLmF1dGhlbnRpY2F0aW9uLmZpbGU9XCIiICsgYWJzQ29uZmlnRGlyICsgIi9vcmcuZWNsaXBzZS52aXJnby5rZXJuZWwudXNlcnMucHJvcGVydGllc1wiIik7CisgICAgICAgIGxpc3QuYWRkKCItRGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWc9XCIiICsgYWJzQ29uZmlnRGlyICsgIi9vcmcuZWNsaXBzZS52aXJnby5rZXJuZWwuYXV0aGVudGljYXRpb24uY29uZmlnXCIiKTsKKyAgICAgICAgaWYgKGdldEluc3RhbGxhdGlvblR5cGUoU2VydmVyVXRpbHMuZ2V0U2VydmVyKGJlaGF2aW91cikuZ2V0UnVudGltZSgpLmdldFJ1bnRpbWUoKSkgPT0gSW5zdGFsbGF0aW9uVHlwZS5KRVRUWSkgeworICAgICAgICAgICAgbGlzdC5hZGQoIi1EamV0dHkuaG9tZT1cIiIgKyBzZXJ2ZXJIb21lICsgIi9qZXR0eVwiIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJU2VydmVyQ29tbWFuZDxWb2lkPiBnZXRTZXJ2ZXJVbmRlcGxveUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlKSB7Ci0JCXJldHVybiBuZXcgSm14U2VydmVyVW5kZXBsb3lDb21tYW5kKHNlcnZlckJlaGF2aW91ciwgbW9kdWxlKTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBJU2VydmVyQ29tbWFuZDxWb2lkPiBnZXRTZXJ2ZXJVbmRlcGxveUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlKSB7CisgICAgICAgIHJldHVybiBuZXcgSm14U2VydmVyVW5kZXBsb3lDb21tYW5kKHNlcnZlckJlaGF2aW91ciwgbW9kdWxlKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclVwZGF0ZUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlLAotCQkJSU1vZHVsZUZpbGUgbW9kdWxlRmlsZSwgRGVwbG95bWVudElkZW50aXR5IGlkZW50aXR5LCBTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lLCBTdHJpbmcgdGFyZ2V0UGF0aCkgewotCQlyZXR1cm4gbmV3IEpteFNlcnZlclVwZGF0ZUNvbW1hbmQoc2VydmVyQmVoYXZpb3VyLCBtb2R1bGUsIG1vZHVsZUZpbGUsIGlkZW50aXR5LCBidW5kbGVTeW1ib2xpY05hbWUsCi0JCQkJdGFyZ2V0UGF0aCwgQlVORExFX09CSkVDVF9OQU1FLCBQQVJfT0JKRUNUX05BTUUsIFBMQU5fT0JKRUNUX05BTUUpOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclVwZGF0ZUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIElNb2R1bGUgbW9kdWxlLCBJTW9kdWxlRmlsZSBtb2R1bGVGaWxlLAorICAgICAgICBEZXBsb3ltZW50SWRlbnRpdHkgaWRlbnRpdHksIFN0cmluZyBidW5kbGVTeW1ib2xpY05hbWUsIFN0cmluZyB0YXJnZXRQYXRoKSB7CisgICAgICAgIHJldHVybiBuZXcgSm14U2VydmVyVXBkYXRlQ29tbWFuZChzZXJ2ZXJCZWhhdmlvdXIsIG1vZHVsZSwgbW9kdWxlRmlsZSwgaWRlbnRpdHksIGJ1bmRsZVN5bWJvbGljTmFtZSwgdGFyZ2V0UGF0aCwgQlVORExFX09CSkVDVF9OQU1FLAorICAgICAgICAgICAgUEFSX09CSkVDVF9OQU1FLCBQTEFOX09CSkVDVF9OQU1FKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaHV0ZG93bk1CZWFuTmFtZSgpIHsKLQkJcmV0dXJuIFNIVVRET1dOX01CRUFOX05BTUU7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNodXRkb3duTUJlYW5OYW1lKCkgeworICAgICAgICByZXR1cm4gU0hVVERPV05fTUJFQU5fTkFNRTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICoKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcyhJUGF0aCBpbnN0YWxsUGF0aCwgU3RyaW5nIHR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2ZXJzaW9uID0gaW5zdGFsbFBhdGguYXBwZW5kKCJsaWIiKS5hcHBlbmQoIi4iICsgdHlwZSkudG9PU1N0cmluZygpOwotCQlGaWxlIHZlcnNpb25GaWxlID0gbmV3IEZpbGUodmVyc2lvbik7Ci0JCWlmICh2ZXJzaW9uRmlsZS5leGlzdHMoKSkgewotCQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQkJaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHZlcnNpb25GaWxlKTsKLQkJCVByb3BlcnRpZXMgdmVyc2lvblByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJdmVyc2lvblByb3BlcnRpZXMubG9hZChpcyk7Ci0JCQl0cnkgewotCQkJCWlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlyZXR1cm4gdmVyc2lvblByb3BlcnRpZXM7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkluc3RhbGxhdGlvbiBkb2VzIG5vdCBjb250YWluIGEgcHJvcGVydGllcyBmaWxlLiBQYXRoOiAiICsgaW5zdGFsbFBhdGgpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKElQYXRoIGluc3RhbGxQYXRoLCBTdHJpbmcgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBpbnN0YWxsUGF0aC5hcHBlbmQoImxpYiIpLmFwcGVuZCgiLiIgKyB0eXBlKS50b09TU3RyaW5nKCk7CisgICAgICAgIEZpbGUgdmVyc2lvbkZpbGUgPSBuZXcgRmlsZSh2ZXJzaW9uKTsKKyAgICAgICAgaWYgKHZlcnNpb25GaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisgICAgICAgICAgICBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odmVyc2lvbkZpbGUpOworICAgICAgICAgICAgUHJvcGVydGllcyB2ZXJzaW9uUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICB2ZXJzaW9uUHJvcGVydGllcy5sb2FkKGlzKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uUHJvcGVydGllczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW5zdGFsbGF0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSBwcm9wZXJ0aWVzIGZpbGUuIFBhdGg6ICIgKyBpbnN0YWxsUGF0aCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcG9zaXRvcnlDb25maWd1cmF0aW9uRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UudmlyZ28ucmVwb3NpdG9yeS5wcm9wZXJ0aWVzIjsKLQl9CisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXBvc2l0b3J5Q29uZmlndXJhdGlvbkZpbGVOYW1lKCkgeworICAgICAgICByZXR1cm4gIm9yZy5lY2xpcHNlLnZpcmdvLnJlcG9zaXRvcnkucHJvcGVydGllcyI7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNhbkFkZE1vZHVsZShJTW9kdWxlIG1vZHVsZSkgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBJU3RhdHVzIGNhbkFkZE1vZHVsZShJTW9kdWxlIG1vZHVsZSkgeworICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICB9CiAKLQlwdWJsaWMgSVNlcnZlckNvbW1hbmQ8Qm9vbGVhbj4gZ2V0U2VydmVyUGluZ0NvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBJU2VydmVyQmVoYXZpb3VyKSB7Ci0JCXJldHVybiBuZXcgSm14U2VydmVyUGluZ0NvbW1hbmQoSVNlcnZlckJlaGF2aW91cik7Ci0JfQorICAgIHB1YmxpYyBJU2VydmVyQ29tbWFuZDxCb29sZWFuPiBnZXRTZXJ2ZXJQaW5nQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIElTZXJ2ZXJCZWhhdmlvdXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKbXhTZXJ2ZXJQaW5nQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclNodXRkb3duQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyIElTZXJ2ZXJCZWhhdmlvdXIpIHsKLQkJcmV0dXJuIG5ldyBKbXhTZXJ2ZXJTaHV0ZG93bkNvbW1hbmQoSVNlcnZlckJlaGF2aW91cik7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgSVNlcnZlckNvbW1hbmQ8Vm9pZD4gZ2V0U2VydmVyU2h1dGRvd25Db21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgSVNlcnZlckJlaGF2aW91cikgeworICAgICAgICByZXR1cm4gbmV3IEpteFNlcnZlclNodXRkb3duQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclJlZnJlc2hDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgSVNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUsCi0JCQlTdHJpbmcgYnVuZGxlU3ltYm9saWNOYW1lKSB7Ci0JCXJldHVybiBuZXcgSm14U2VydmVyUmVmcmVzaENvbW1hbmQoSVNlcnZlckJlaGF2aW91ciwgbW9kdWxlLCBidW5kbGVTeW1ib2xpY05hbWUpOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIElTZXJ2ZXJDb21tYW5kPFZvaWQ+IGdldFNlcnZlclJlZnJlc2hDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgSVNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUsIFN0cmluZyBidW5kbGVTeW1ib2xpY05hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKbXhTZXJ2ZXJSZWZyZXNoQ29tbWFuZChJU2VydmVyQmVoYXZpb3VyLCBtb2R1bGUsIGJ1bmRsZVN5bWJvbGljTmFtZSk7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZFJ1bnRpbWVQcm9ncmFtQXJndW1lbnRzKGJvb2xlYW4gc3RhcnRpbmcpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmV0dXJuIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZWRSdW50aW1lUHJvZ3JhbUFyZ3VtZW50cyhib29sZWFuIHN0YXJ0aW5nKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbmZpZ1BhdGgoSVJ1bnRpbWUgcnVudGltZSkgewotCQlyZXR1cm4gcnVudGltZS5nZXRMb2NhdGlvbigpLmFwcGVuZChnZXRDb25maWd1cmF0aW9uRGlyKCkpLmFwcGVuZCgic2VydmVyLmNvbmZpZyIpLnRvU3RyaW5nKCk7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ1BhdGgoSVJ1bnRpbWUgcnVudGltZSkgeworICAgICAgICByZXR1cm4gcnVudGltZS5nZXRMb2NhdGlvbigpLmFwcGVuZChnZXRDb25maWd1cmF0aW9uRGlyKCkpLmFwcGVuZCgic2VydmVyLmNvbmZpZyIpLnRvU3RyaW5nKCk7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZVBhdGgoSVJ1bnRpbWUgcnVudGltZSkgewotCQlyZXR1cm4gcnVudGltZS5nZXRMb2NhdGlvbigpLmFwcGVuZChnZXRQcm9maWxlRGlyKCkpLmFwcGVuZCgiamF2YTYtc2VydmVyLnByb2ZpbGUiKS50b1N0cmluZygpOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9maWxlUGF0aChJUnVudGltZSBydW50aW1lKSB7CisgICAgICAgIHJldHVybiBydW50aW1lLmdldExvY2F0aW9uKCkuYXBwZW5kKGdldFByb2ZpbGVEaXIoKSkuYXBwZW5kKCJqYXZhNi1zZXJ2ZXIucHJvZmlsZSIpLnRvU3RyaW5nKCk7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lQmFzZURpcmVjdG9yeShJU2VydmVyIHNlcnZlcikgewotCQlyZXR1cm4gc2VydmVyLmdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIElQYXRoIGdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KElTZXJ2ZXIgc2VydmVyKSB7CisgICAgICAgIHJldHVybiBzZXJ2ZXIuZ2V0UnVudGltZSgpLmdldExvY2F0aW9uKCk7CisgICAgfQogCi0JLyoqCi0JICogUHJvdmlkZXMgcnVudGltZSBjbGFzcyBwYXRoIGNvbW1vbiB0byBzZXJ2ZXIgdmVyc2lvbnMuCi0JICoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRSdW50aW1lQ2xhc3NwYXRoKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKLQkgKi8KLQlwdWJsaWMgTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoIGluc3RhbGxQYXRoKSB7Ci0JCUxpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gY3AgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+KCk7CisgICAgLyoqCisgICAgICogUHJvdmlkZXMgcnVudGltZSBjbGFzcyBwYXRoIGNvbW1vbiB0byBzZXJ2ZXIgdmVyc2lvbnMuCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRSdW50aW1lQ2xhc3NwYXRoKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxJUnVudGltZUNsYXNzcGF0aEVudHJ5PiBnZXRSdW50aW1lQ2xhc3NwYXRoKElQYXRoIGluc3RhbGxQYXRoKSB7CisgICAgICAgIExpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gY3AgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+KCk7CiAKLQkJSVBhdGggYmluUGF0aCA9IGluc3RhbGxQYXRoLmFwcGVuZCgibGliIik7Ci0JCWlmIChiaW5QYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQlGaWxlIGxpYkZvbGRlciA9IGJpblBhdGgudG9GaWxlKCk7Ci0JCQlmb3IgKEZpbGUgbGlicmFyeSA6IGxpYkZvbGRlci5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLQkJCQkJcmV0dXJuIHBhdGhuYW1lLmlzRmlsZSgpICYmIHBhdGhuYW1lLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi5qYXIiKTsKLQkJCQl9Ci0JCQl9KSkgewotCQkJCUlQYXRoIHBhdGggPSBiaW5QYXRoLmFwcGVuZChsaWJyYXJ5LmdldE5hbWUoKSk7Ci0JCQkJY3AuYWRkKEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkocGF0aCkpOwotCQkJfQotCQl9CisgICAgICAgIElQYXRoIGJpblBhdGggPSBpbnN0YWxsUGF0aC5hcHBlbmQoImxpYiIpOworICAgICAgICBpZiAoYmluUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgeworICAgICAgICAgICAgRmlsZSBsaWJGb2xkZXIgPSBiaW5QYXRoLnRvRmlsZSgpOworICAgICAgICAgICAgZm9yIChGaWxlIGxpYnJhcnkgOiBsaWJGb2xkZXIubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgewogCi0JCXJldHVybiBjcDsKLQl9CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhuYW1lLmlzRmlsZSgpICYmIHBhdGhuYW1lLnRvU3RyaW5nKCkuZW5kc1dpdGgoIi5qYXIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSkgeworICAgICAgICAgICAgICAgIElQYXRoIHBhdGggPSBiaW5QYXRoLmFwcGVuZChsaWJyYXJ5LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgY3AuYWRkKEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkocGF0aCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRVc2VyTGV2ZWxCdW5kbGVSZXBvc2l0b3J5UGF0aChJUnVudGltZSBydW50aW1lKSB7Ci0JCXJldHVybiBydW50aW1lLmdldExvY2F0aW9uKCkuYXBwZW5kKFJFUE9TSVRPUllfRElSKS5hcHBlbmQoVVNSX0RJUikudG9TdHJpbmcoKTsKLQl9CisgICAgICAgIHJldHVybiBjcDsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRVc2VyTGV2ZWxMaWJyYXJ5UmVwb3NpdG9yeVBhdGgoSVJ1bnRpbWUgcnVudGltZSkgewotCQlyZXR1cm4gcnVudGltZS5nZXRMb2NhdGlvbigpLmFwcGVuZChSRVBPU0lUT1JZX0RJUikuYXBwZW5kKFVTUl9ESVIpLnRvU3RyaW5nKCk7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJMZXZlbEJ1bmRsZVJlcG9zaXRvcnlQYXRoKElSdW50aW1lIHJ1bnRpbWUpIHsKKyAgICAgICAgcmV0dXJuIHJ1bnRpbWUuZ2V0TG9jYXRpb24oKS5hcHBlbmQoUkVQT1NJVE9SWV9ESVIpLmFwcGVuZChVU1JfRElSKS50b1N0cmluZygpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldEV4dExldmVsQnVuZGxlUmVwb3NpdG9yeVBhdGgob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0TGV2ZWxCdW5kbGVSZXBvc2l0b3J5UGF0aChJUnVudGltZSBydW50aW1lKSB7Ci0JCXJldHVybiBydW50aW1lLmdldExvY2F0aW9uKCkuYXBwZW5kKFJFUE9TSVRPUllfRElSKS5hcHBlbmQoRVhUX0RJUikudG9TdHJpbmcoKTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlckxldmVsTGlicmFyeVJlcG9zaXRvcnlQYXRoKElSdW50aW1lIHJ1bnRpbWUpIHsKKyAgICAgICAgcmV0dXJuIHJ1bnRpbWUuZ2V0TG9jYXRpb24oKS5hcHBlbmQoUkVQT1NJVE9SWV9ESVIpLmFwcGVuZChVU1JfRElSKS50b1N0cmluZygpOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSVNlcnZlckNvbW1hbmQ8RGVwbG95bWVudElkZW50aXR5PiBnZXRTZXJ2ZXJEZXBsb3lDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgSVNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUpIHsKLQkJcmV0dXJuIG5ldyBKbXhTZXJ2ZXJEZXBsb3lDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIsIG1vZHVsZSk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyUnVudGltZVByb3ZpZGVyI2dldEV4dExldmVsQnVuZGxlUmVwb3NpdG9yeVBhdGgob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXh0TGV2ZWxCdW5kbGVSZXBvc2l0b3J5UGF0aChJUnVudGltZSBydW50aW1lKSB7CisgICAgICAgIHJldHVybiBydW50aW1lLmdldExvY2F0aW9uKCkuYXBwZW5kKFJFUE9TSVRPUllfRElSKS5hcHBlbmQoRVhUX0RJUikudG9TdHJpbmcoKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElTZXJ2ZXJDb21tYW5kPE1hcDxMb25nLCBJQnVuZGxlPj4gZ2V0U2VydmVyQnVuZGxlQWRtaW5Db21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7Ci0JCXJldHVybiBuZXcgSm14QnVuZGxlQWRtaW5TZXJ2ZXJDb21tYW5kKHNlcnZlckJlaGF2aW91cik7Ci0JfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgSVNlcnZlckNvbW1hbmQ8RGVwbG95bWVudElkZW50aXR5PiBnZXRTZXJ2ZXJEZXBsb3lDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgSVNlcnZlckJlaGF2aW91ciwgSU1vZHVsZSBtb2R1bGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKbXhTZXJ2ZXJEZXBsb3lDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIsIG1vZHVsZSk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJSdW50aW1lUHJvdmlkZXIjZ2V0U2VydmVyRGVwbG95Q29tbWFuZChvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXJCZWhhdmlvdXIpCi0JICovCi0JcHVibGljIElTZXJ2ZXJDb21tYW5kPERlcGxveW1lbnRJZGVudGl0eT4gZ2V0U2VydmVyRGVwbG95Q29tbWFuZChJU2VydmVyQmVoYXZpb3VyIHNlcnZlckJlaGF2aW91cikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKbXhTZXJ2ZXJEZXBsb3lDb21tYW5kKHNlcnZlckJlaGF2aW91ciwgZ2V0Q29ubmVjdG9yQnVuZGxlVXJpKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIElTZXJ2ZXJDb21tYW5kPE1hcDxMb25nLCBJQnVuZGxlPj4gZ2V0U2VydmVyQnVuZGxlQWRtaW5Db21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7CisgICAgICAgIHJldHVybiBuZXcgSm14QnVuZGxlQWRtaW5TZXJ2ZXJDb21tYW5kKHNlcnZlckJlaGF2aW91cik7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJU2VydmVyQ29tbWFuZDxTdHJpbmc+IGdldFNlcnZlckJ1bmRsZUFkbWluRXhlY3V0ZUNvbW1hbmQoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIFN0cmluZyBjb21tYW5kKSB7Ci0JCXJldHVybiBuZXcgSm14QnVuZGxlQWRtaW5FeGVjdXRlQ29tbWFuZChzZXJ2ZXJCZWhhdmlvdXIsIGNvbW1hbmQpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlclJ1bnRpbWVQcm92aWRlciNnZXRTZXJ2ZXJEZXBsb3lDb21tYW5kKG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlckJlaGF2aW91cikKKyAgICAgKi8KKyAgICBwdWJsaWMgSVNlcnZlckNvbW1hbmQ8RGVwbG95bWVudElkZW50aXR5PiBnZXRTZXJ2ZXJEZXBsb3lDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7CisgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0pteFNlcnZlckRlcGxveUNvbW1hbmQoc2VydmVyQmVoYXZpb3VyLCBnZXRDb25uZWN0b3JCdW5kbGVVcmkoKSk7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlcG9zaXRvcnlDb25maWd1cmF0aW9uKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLCBTdHJpbmcgZmlsZU5hbWUpIHsKLQkJLy8gY29weSByZXBvc2l0b3J5LnByb3BlcnRpZXMgaW50byB0aGUgc3RhZ2UgYW5kIGFkZCB0aGUgc3RhZ2UKLQkJLy8gcmVwb3NpdG9yeQotCQlGaWxlIHNlcnZlckhvbWUgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoc2VydmVyQmVoYXZpb3VyKS5nZXRSdW50aW1lQmFzZURpcmVjdG9yeSgpLnRvRmlsZSgpOwotCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQl0cnkgewotCQkJcHJvcGVydGllcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoc2VydmVySG9tZSwgZ2V0Q29uZmlndXJhdGlvbkRpcigpICsgRmlsZS5zZXBhcmF0b3JDaGFyCi0JCQkJCSsgZmlsZU5hbWUpKSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIENEIGFkZCBsb2dnaW5nCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQ0QgYWRkIGxvZ2dpbmcKLQkJfQorICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgSVNlcnZlckNvbW1hbmQ8U3RyaW5nPiBnZXRTZXJ2ZXJCdW5kbGVBZG1pbkV4ZWN1dGVDb21tYW5kKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyLCBTdHJpbmcgY29tbWFuZCkgeworICAgICAgICByZXR1cm4gbmV3IEpteEJ1bmRsZUFkbWluRXhlY3V0ZUNvbW1hbmQoc2VydmVyQmVoYXZpb3VyLCBjb21tYW5kKTsKKyAgICB9CiAKLQkJcHJvcGVydGllcy5wdXQoInN0YWdlLnR5cGUiLCAid2F0Y2hlZCIpOwotCQlwcm9wZXJ0aWVzLnB1dCgic3RhZ2Uud2F0Y2hEaXJlY3RvcnkiLCAic3RhZ2UiKTsKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlUmVwb3NpdG9yeUNvbmZpZ3VyYXRpb24oSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIsIFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICAvLyBjb3B5IHJlcG9zaXRvcnkucHJvcGVydGllcyBpbnRvIHRoZSBzdGFnZSBhbmQgYWRkIHRoZSBzdGFnZQorICAgICAgICAvLyByZXBvc2l0b3J5CisgICAgICAgIEZpbGUgc2VydmVySG9tZSA9IFNlcnZlclV0aWxzLmdldFNlcnZlcihzZXJ2ZXJCZWhhdmlvdXIpLmdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KCkudG9GaWxlKCk7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShzZXJ2ZXJIb21lLCBnZXRDb25maWd1cmF0aW9uRGlyKCkgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBmaWxlTmFtZSkpKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQ0QgYWRkIGxvZ2dpbmcKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gVE9ETyBDRCBhZGQgbG9nZ2luZworICAgICAgICB9CiAKLQkJU3RyaW5nIGNoYWluID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eSgiY2hhaW4iKTsKLQkJY2hhaW4gPSAic3RhZ2UiICsgKFN0cmluZ1V0aWxzLmhhc0xlbmd0aChjaGFpbikgPyAiLCIgKyBjaGFpbiA6ICIiKTsKLQkJcHJvcGVydGllcy5wdXQoImNoYWluIiwgY2hhaW4pOworICAgICAgICBwcm9wZXJ0aWVzLnB1dCgic3RhZ2UudHlwZSIsICJ3YXRjaGVkIik7CisgICAgICAgIHByb3BlcnRpZXMucHV0KCJzdGFnZS53YXRjaERpcmVjdG9yeSIsICJzdGFnZSIpOwogCi0JCXRyeSB7Ci0JCQlGaWxlIHN0YWdlRGlyZWN0b3J5ID0gbmV3IEZpbGUoc2VydmVySG9tZSwgInN0YWdlIik7Ci0JCQlpZiAoIXN0YWdlRGlyZWN0b3J5LmV4aXN0cygpKSB7Ci0JCQkJc3RhZ2VEaXJlY3RvcnkubWtkaXJzKCk7Ci0JCQl9Ci0JCQlwcm9wZXJ0aWVzLnN0b3JlKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKHNlcnZlckhvbWUsICJzdGFnZSIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lKSksCi0JCQkJCSJHZW5lcmF0ZWQgYnkgVmlyZ28gSURFICIgKyBTZXJ2ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRWZXJzaW9uKCkpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBDRCBhZGQgbG9nZ2luZwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIENEIGFkZCBsb2dnaW5nCi0JCX0KLQl9CisgICAgICAgIFN0cmluZyBjaGFpbiA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoImNoYWluIik7CisgICAgICAgIGNoYWluID0gInN0YWdlIiArIChTdHJpbmdVdGlscy5oYXNMZW5ndGgoY2hhaW4pID8gIiwiICsgY2hhaW4gOiAiIik7CisgICAgICAgIHByb3BlcnRpZXMucHV0KCJjaGFpbiIsIGNoYWluKTsKIAotCXB1YmxpYyB2b2lkIHByZVN0YXJ0dXAoSVNlcnZlckJlaGF2aW91ciBzZXJ2ZXJCZWhhdmlvdXIpIHsKLQkJRmlsZSBzZXJ2ZXJIb21lID0gU2VydmVyVXRpbHMuZ2V0U2VydmVyKHNlcnZlckJlaGF2aW91cikuZ2V0UnVudGltZUJhc2VEaXJlY3RvcnkoKS50b0ZpbGUoKTsKLQkJRmlsZSB3b3JrRm9sZGVyID0gbmV3IEZpbGUoc2VydmVySG9tZSwgIndvcmsiKTsKLQkJaWYgKFNlcnZlclV0aWxzLmdldFNlcnZlcihzZXJ2ZXJCZWhhdmlvdXIpLnNob3VsZENsZWFuU3RhcnR1cCgpKSB7Ci0JCQlQdWJsaXNoSGVscGVyLmRlbGV0ZURpcmVjdG9yeSh3b3JrRm9sZGVyLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCVB1Ymxpc2hIZWxwZXIuZGVsZXRlRGlyZWN0b3J5KG5ldyBGaWxlKHNlcnZlckhvbWUsICJzZXJ2aWNlYWJpbGl0eSIpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQluZXcgRmlsZSh3b3JrRm9sZGVyLCAidG1wIikubWtkaXJzKCk7IC8vIEZpeCA0NjQ4MTQKLQkJY3JlYXRlUmVwb3NpdG9yeUNvbmZpZ3VyYXRpb24oc2VydmVyQmVoYXZpb3VyLCBnZXRSZXBvc2l0b3J5Q29uZmlndXJhdGlvbkZpbGVOYW1lKCkpOwotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgc3RhZ2VEaXJlY3RvcnkgPSBuZXcgRmlsZShzZXJ2ZXJIb21lLCAic3RhZ2UiKTsKKyAgICAgICAgICAgIGlmICghc3RhZ2VEaXJlY3RvcnkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBzdGFnZURpcmVjdG9yeS5ta2RpcnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb3BlcnRpZXMuc3RvcmUobmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoc2VydmVySG9tZSwgInN0YWdlIiArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWUpKSwKKyAgICAgICAgICAgICAgICAiR2VuZXJhdGVkIGJ5IFZpcmdvIElERSAiICsgU2VydmVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQ0QgYWRkIGxvZ2dpbmcKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gVE9ETyBDRCBhZGQgbG9nZ2luZworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gaXNIYW5kbGVyRm9yKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJSVBhdGggY29uZmlnUGF0aCA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKS5hcHBlbmQoZ2V0Q29uZmlndXJhdGlvbkRpcigpKTsKLQkJRmlsZSBjb25maWdEaXIgPSBjb25maWdQYXRoLnRvRmlsZSgpOwotCQlyZXR1cm4gY29uZmlnRGlyLmV4aXN0cygpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBwcmVTdGFydHVwKElTZXJ2ZXJCZWhhdmlvdXIgc2VydmVyQmVoYXZpb3VyKSB7CisgICAgICAgIEZpbGUgc2VydmVySG9tZSA9IFNlcnZlclV0aWxzLmdldFNlcnZlcihzZXJ2ZXJCZWhhdmlvdXIpLmdldFJ1bnRpbWVCYXNlRGlyZWN0b3J5KCkudG9GaWxlKCk7CisgICAgICAgIEZpbGUgd29ya0ZvbGRlciA9IG5ldyBGaWxlKHNlcnZlckhvbWUsICJ3b3JrIik7CisgICAgICAgIGlmIChTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXIoc2VydmVyQmVoYXZpb3VyKS5zaG91bGRDbGVhblN0YXJ0dXAoKSkgeworICAgICAgICAgICAgUHVibGlzaEhlbHBlci5kZWxldGVEaXJlY3Rvcnkod29ya0ZvbGRlciwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisgICAgICAgICAgICBQdWJsaXNoSGVscGVyLmRlbGV0ZURpcmVjdG9yeShuZXcgRmlsZShzZXJ2ZXJIb21lLCAic2VydmljZWFiaWxpdHkiKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisgICAgICAgIH0KKyAgICAgICAgbmV3IEZpbGUod29ya0ZvbGRlciwgInRtcCIpLm1rZGlycygpOyAvLyBGaXggNDY0ODE0CisgICAgICAgIGNyZWF0ZVJlcG9zaXRvcnlDb25maWd1cmF0aW9uKHNlcnZlckJlaGF2aW91ciwgZ2V0UmVwb3NpdG9yeUNvbmZpZ3VyYXRpb25GaWxlTmFtZSgpKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElTdGF0dXMgdmVyaWZ5SW5zdGFsbGF0aW9uKElSdW50aW1lIHJ1bnRpbWUpIHsKLQkJSW5zdGFsbGF0aW9uVHlwZSBpbnN0YWxsYXRpb24gPSBnZXRJbnN0YWxsYXRpb25UeXBlKHJ1bnRpbWUpOwotCQlpZiAoaW5zdGFsbGF0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQkiSW52YWxpZCBWaXJnbyBTZXJ2ZXI6IENvdWxkIG5vdCBkZXRlcm1pbmUgdmVyc2lvbi4iKTsKLQkJfQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgIlZhbGlkIGluc3RhbGxhdGlvbjogIiArIGdldE5hbWUocnVudGltZSkgKyAiLiIpOwotCX0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hhbmRsZXJGb3IoSVJ1bnRpbWUgcnVudGltZSkgeworICAgICAgICBJUGF0aCBjb25maWdQYXRoID0gcnVudGltZS5nZXRMb2NhdGlvbigpLmFwcGVuZChnZXRDb25maWd1cmF0aW9uRGlyKCkpOworICAgICAgICBGaWxlIGNvbmZpZ0RpciA9IGNvbmZpZ1BhdGgudG9GaWxlKCk7CisgICAgICAgIHJldHVybiBjb25maWdEaXIuZXhpc3RzKCk7CisgICAgfQogCi0JcHVibGljIEluc3RhbGxhdGlvblR5cGUgZ2V0SW5zdGFsbGF0aW9uVHlwZShJUnVudGltZSBydW50aW1lKSB7Ci0JCVByb3BlcnRpZXMgdmVyc2lvblByb3BlcnRpZXM7Ci0JCUlQYXRoIGxvY2F0aW9uID0gcnVudGltZS5nZXRMb2NhdGlvbigpOwotCQl0cnkgewotCQkJdmVyc2lvblByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzKGxvY2F0aW9uLCAidmVyc2lvbiIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgdmVyc2lvblN0cmluZyA9IHZlcnNpb25Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJ2aXJnby5zZXJ2ZXIudmVyc2lvbiIpOwotCQlpZiAodmVyc2lvblN0cmluZyAhPSBudWxsKSB7Ci0JCQlpZiAobG9jYXRpb24uYXBwZW5kKCJqZXR0eSIpLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIEluc3RhbGxhdGlvblR5cGUuSkVUVFk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBJbnN0YWxsYXRpb25UeXBlLlRPTUNBVDsKLQkJCX0KLQkJfQotCQl2ZXJzaW9uU3RyaW5nID0gdmVyc2lvblByb3BlcnRpZXMuZ2V0UHJvcGVydHkoInZpcmdvLmtlcm5lbC52ZXJzaW9uIik7Ci0JCWlmICh2ZXJzaW9uU3RyaW5nICE9IG51bGwpIHsKLQkJCXJldHVybiBJbnN0YWxsYXRpb25UeXBlLktFUk5FTDsKLQkJfQotCQl2ZXJzaW9uU3RyaW5nID0gdmVyc2lvblByb3BlcnRpZXMuZ2V0UHJvcGVydHkoInZpcmdvLm5hbm8udmVyc2lvbiIpOwotCQlpZiAodmVyc2lvblN0cmluZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gSW5zdGFsbGF0aW9uVHlwZS5OQU5POwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIElTdGF0dXMgdmVyaWZ5SW5zdGFsbGF0aW9uKElSdW50aW1lIHJ1bnRpbWUpIHsKKyAgICAgICAgSW5zdGFsbGF0aW9uVHlwZSBpbnN0YWxsYXRpb24gPSBnZXRJbnN0YWxsYXRpb25UeXBlKHJ1bnRpbWUpOworICAgICAgICBpZiAoaW5zdGFsbGF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAiSW52YWxpZCBWaXJnbyBTZXJ2ZXI6IENvdWxkIG5vdCBkZXRlcm1pbmUgdmVyc2lvbi4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgIlZhbGlkIGluc3RhbGxhdGlvbjogIiArIGdldE5hbWUocnVudGltZSkgKyAiLiIpOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbk5hbWUoSVJ1bnRpbWUgcnVudGltZSkgewotCQlQcm9wZXJ0aWVzIHZlcnNpb25Qcm9wZXJ0aWVzOwotCQl0cnkgewotCQkJdmVyc2lvblByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzKHJ1bnRpbWUuZ2V0TG9jYXRpb24oKSwgInZlcnNpb24iKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uUHJvcGVydGllcy5nZXRQcm9wZXJ0eSgidmlyZ28uc2VydmVyLnZlcnNpb24iKTsKLQkJaWYgKHZlcnNpb25TdHJpbmcgPT0gbnVsbCkgewotCQkJdmVyc2lvblN0cmluZyA9IHZlcnNpb25Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJ2aXJnby5rZXJuZWwudmVyc2lvbiIpOwotCQl9Ci0JCWlmICh2ZXJzaW9uU3RyaW5nID09IG51bGwpIHsKLQkJCXZlcnNpb25TdHJpbmcgPSB2ZXJzaW9uUHJvcGVydGllcy5nZXRQcm9wZXJ0eSgidmlyZ28ubmFuby52ZXJzaW9uIik7Ci0JCX0KLQkJaWYgKHZlcnNpb25TdHJpbmcgPT0gbnVsbCkgewotCQkJdmVyc2lvblN0cmluZyA9ICJVbmtub3duIjsKLQkJfQotCQlyZXR1cm4gdmVyc2lvblN0cmluZzsKLQl9CisgICAgcHVibGljIEluc3RhbGxhdGlvblR5cGUgZ2V0SW5zdGFsbGF0aW9uVHlwZShJUnVudGltZSBydW50aW1lKSB7CisgICAgICAgIFByb3BlcnRpZXMgdmVyc2lvblByb3BlcnRpZXM7CisgICAgICAgIElQYXRoIGxvY2F0aW9uID0gcnVudGltZS5nZXRMb2NhdGlvbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmVyc2lvblByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0aWVzKGxvY2F0aW9uLCAidmVyc2lvbiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZyA9IHZlcnNpb25Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJ2aXJnby5zZXJ2ZXIudmVyc2lvbiIpOworICAgICAgICBpZiAodmVyc2lvblN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9jYXRpb24uYXBwZW5kKCJqZXR0eSIpLnRvRmlsZSgpLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEluc3RhbGxhdGlvblR5cGUuSkVUVFk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnN0YWxsYXRpb25UeXBlLlRPTUNBVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2ZXJzaW9uU3RyaW5nID0gdmVyc2lvblByb3BlcnRpZXMuZ2V0UHJvcGVydHkoInZpcmdvLmtlcm5lbC52ZXJzaW9uIik7CisgICAgICAgIGlmICh2ZXJzaW9uU3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBJbnN0YWxsYXRpb25UeXBlLktFUk5FTDsKKyAgICAgICAgfQorICAgICAgICB2ZXJzaW9uU3RyaW5nID0gdmVyc2lvblByb3BlcnRpZXMuZ2V0UHJvcGVydHkoInZpcmdvLm5hbm8udmVyc2lvbiIpOworICAgICAgICBpZiAodmVyc2lvblN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gSW5zdGFsbGF0aW9uVHlwZS5OQU5POworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShJUnVudGltZSBydW50aW1lKSB7Ci0JCXJldHVybiBnZXRJbnN0YWxsYXRpb25UeXBlKHJ1bnRpbWUpLmdldE5hbWUoKSArICIgdiIgKyBnZXRWZXJzaW9uTmFtZShydW50aW1lKTsKLQl9CisgICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uTmFtZShJUnVudGltZSBydW50aW1lKSB7CisgICAgICAgIFByb3BlcnRpZXMgdmVyc2lvblByb3BlcnRpZXM7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2ZXJzaW9uUHJvcGVydGllcyA9IGdldFByb3BlcnRpZXMocnVudGltZS5nZXRMb2NhdGlvbigpLCAidmVyc2lvbiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZyA9IHZlcnNpb25Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJ2aXJnby5zZXJ2ZXIudmVyc2lvbiIpOworICAgICAgICBpZiAodmVyc2lvblN0cmluZyA9PSBudWxsKSB7CisgICAgICAgICAgICB2ZXJzaW9uU3RyaW5nID0gdmVyc2lvblByb3BlcnRpZXMuZ2V0UHJvcGVydHkoInZpcmdvLmtlcm5lbC52ZXJzaW9uIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZlcnNpb25TdHJpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgdmVyc2lvblN0cmluZyA9IHZlcnNpb25Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJ2aXJnby5uYW5vLnZlcnNpb24iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmVyc2lvblN0cmluZyA9PSBudWxsKSB7CisgICAgICAgICAgICB2ZXJzaW9uU3RyaW5nID0gIlVua25vd24iOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2ZXJzaW9uU3RyaW5nOworICAgIH0KIAotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0U3VwcG9ydGVkVmVyc2lvbnMoKTsKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoSVJ1bnRpbWUgcnVudGltZSkgeworICAgICAgICByZXR1cm4gZ2V0SW5zdGFsbGF0aW9uVHlwZShydW50aW1lKS5nZXROYW1lKCkgKyAiIHYiICsgZ2V0VmVyc2lvbk5hbWUocnVudGltZSk7CisgICAgfQogCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDb25maWd1cmF0aW9uRGlyKCk7CisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTdXBwb3J0ZWRWZXJzaW9ucygpOwogCi0JcHVibGljIFN0cmluZ1tdIGdldFNlcnZlclByb3BlcnRpZXNEaXJlY3RvcmllcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IGdldENvbmZpZ3VyYXRpb25EaXIoKSwgInJlcG9zaXRvcnkvZXh0IiB9OwotCX0KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldENvbmZpZ3VyYXRpb25EaXIoKTsKIAotCXB1YmxpYyBTdHJpbmdbXSBnZXRTZXJ2ZXJMb2dEaXJlY3RvcmllcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IGdldExvZ0RpcigpICsgIi9sb2dzIiwgZ2V0TG9nRGlyKCkgKyAiL2V2ZW50bG9ncyIgfTsKLQl9CisgICAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZlclByb3BlcnRpZXNEaXJlY3RvcmllcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IGdldENvbmZpZ3VyYXRpb25EaXIoKSwgInJlcG9zaXRvcnkvZXh0IiB9OworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZS5ydW50aW1lcy5WaXJnb1J1bnRpbWVQcm92aWRlciNnZXRMb2dEaXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9nRGlyKCkgewotCQlyZXR1cm4gInNlcnZpY2VhYmlsaXR5IjsKLQl9CisgICAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZlckxvZ0RpcmVjdG9yaWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgZ2V0TG9nRGlyKCkgKyAiL2xvZ3MiLCBnZXRMb2dEaXIoKSArICIvZXZlbnRsb2dzIiB9OworICAgIH0KIAotCS8qKgotCSAqIE5vbi1BUEkKLQkgKi8KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvZmlsZURpcigpOworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZS5ydW50aW1lcy5WaXJnb1J1bnRpbWVQcm92aWRlciNnZXRMb2dEaXIoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9nRGlyKCkgeworICAgICAgICByZXR1cm4gInNlcnZpY2VhYmlsaXR5IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb24tQVBJCisgICAgICovCisgICAgYWJzdHJhY3QgU3RyaW5nIGdldFByb2ZpbGVEaXIoKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvdXRpbHMvU3RhdHVzVXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS91dGlscy9TdGF0dXNVdGlsLmphdmEKaW5kZXggYTkxZDA2MC4uMWNjNGM4YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS91dGlscy9TdGF0dXNVdGlsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS91dGlscy9TdGF0dXNVdGlsLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZS51dGlsczsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0xOCwzMCArMTksMjkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLlNlcnZlckNvcmVQbHVnaW47CiAKIC8qKgotICogCisgKgogICogQGF1dGhvciBtcGFya2VyCi0gKiAKKyAqCiAgKi8KIHB1YmxpYyBjbGFzcyBTdGF0dXNVdGlsIHsKLQlwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBlKSB7Ci0JCWVycm9yKG1lc3NhZ2UsIGUsIFN0YXR1c01hbmFnZXIuTE9HKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGJlIHJlcG9ydGVkCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBjYXVzZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgYSBiaXRtYXNrIG9mIHN0eWxlIGJpdHMgYXMgZW51bWVyYXRlZCBvbiB7QGxpbmsgU3RhdHVzTWFuYWdlcn0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBlLCBpbnQgc3R5bGUpIHsKLQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQsICJBbiBJTyBFeGNlcHRpb24gb2NjdXJyZWQuIiwgZSksIHN0eWxlKTsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKEV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCWVycm9yKCJBbiBJTyBFeGNlcHRpb24gb2NjdXJyZWQuIiwgZSk7Ci0JCX0KLQkJZXJyb3IoIkFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycmVkLiIsIGUpOwotCX0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZXJyb3IobWVzc2FnZSwgZSwgU3RhdHVzTWFuYWdlci5MT0cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIHJlcG9ydGVkCisgICAgICogQHBhcmFtIGUgdGhlIGNhdXNlCisgICAgICogQHBhcmFtIHN0eWxlIGEgYml0bWFzayBvZiBzdHlsZSBiaXRzIGFzIGVudW1lcmF0ZWQgb24ge0BsaW5rIFN0YXR1c01hbmFnZXJ9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKFN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gZSwgaW50IHN0eWxlKSB7CisgICAgICAgIFN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZShuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAiQW4gSU8gRXhjZXB0aW9uIG9jY3VycmVkLiIsIGUpLCBzdHlsZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKKyAgICAgICAgICAgIGVycm9yKCJBbiBJTyBFeGNlcHRpb24gb2NjdXJyZWQuIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgZXJyb3IoIkFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycmVkLiIsIGUpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL2NvcmUvdXRpbHMvV2ViRG93bmxvYWRVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS91dGlscy9XZWJEb3dubG9hZFV0aWxzLmphdmEKaW5kZXggYzZiNDExNi4uZDRlZDkzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS91dGlscy9XZWJEb3dubG9hZFV0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvY29yZS91dGlscy9XZWJEb3dubG9hZFV0aWxzLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwuY29yZS51dGlsczsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKQEAgLTI4LDIyMiArMjksMjE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5uZXQucHJveHkuSVByb3h5RGF0YTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLm5ldC5wcm94eS5JUHJveHlTZXJ2aWNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5TZXJ2ZXJDb3JlUGx1Z2luOwogaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwogCiAvKioKLSAqIFV0aWxpdHkgdG8gZG93bmxvYWQgZmlsZXMgdXNpbmcgQXBhY2hlIEhUVFBDbGllbnQgd2l0aCB1c2luZyBFY2xpcHNlJ3MgcHJveHkKLSAqIHNlcnZpY2UuCi0gKiAKKyAqIFV0aWxpdHkgdG8gZG93bmxvYWQgZmlsZXMgdXNpbmcgQXBhY2hlIEhUVFBDbGllbnQgd2l0aCB1c2luZyBFY2xpcHNlJ3MgcHJveHkgc2VydmljZS4KKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgV2ViRG93bmxvYWRVdGlscyB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OTk5FQ1RfVElNRU9VVCA9IDYwMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05OTkVDVF9USU1FT1VUID0gNjAwMDA7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9QT1JUID0gODA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUVFBfUE9SVCA9IDgwOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNPQ0tFVF9USU1FT1VUID0gNjAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNPQ0tFVF9USU1FT1VUID0gNjAwMDA7CiAKLQlwcml2YXRlIHN0YXRpYyBDcmVkZW50aWFscyBnZXRDcmVkZW50aWFscyhJUHJveHlEYXRhIHByb3h5RGF0YSwgU3RyaW5nIGhvc3QpIHsKLQkJaW50IGkgPSBwcm94eURhdGEuZ2V0VXNlcklkKCkuaW5kZXhPZigiXFwiKTsKLQkJaWYgKGkgPiAwICYmIGkgPCBwcm94eURhdGEuZ2V0VXNlcklkKCkubGVuZ3RoKCkgLSAxKSB7Ci0JCQlyZXR1cm4gbmV3IE5UQ3JlZGVudGlhbHMocHJveHlEYXRhLmdldFVzZXJJZCgpLnN1YnN0cmluZyhpICsgMSksIHByb3h5RGF0YS5nZXRQYXNzd29yZCgpLCBob3N0LCBwcm94eURhdGEKLQkJCQkJLmdldFVzZXJJZCgpLnN1YnN0cmluZygwLCBpKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscyhwcm94eURhdGEuZ2V0VXNlcklkKCksIHByb3h5RGF0YS5nZXRQYXNzd29yZCgpKTsKLQkJfQotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBDcmVkZW50aWFscyBnZXRDcmVkZW50aWFscyhJUHJveHlEYXRhIHByb3h5RGF0YSwgU3RyaW5nIGhvc3QpIHsKKyAgICAgICAgaW50IGkgPSBwcm94eURhdGEuZ2V0VXNlcklkKCkuaW5kZXhPZigiXFwiKTsKKyAgICAgICAgaWYgKGkgPiAwICYmIGkgPCBwcm94eURhdGEuZ2V0VXNlcklkKCkubGVuZ3RoKCkgLSAxKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5UQ3JlZGVudGlhbHMocHJveHlEYXRhLmdldFVzZXJJZCgpLnN1YnN0cmluZyhpICsgMSksIHByb3h5RGF0YS5nZXRQYXNzd29yZCgpLCBob3N0LCBwcm94eURhdGEuZ2V0VXNlcklkKCkuc3Vic3RyaW5nKDAsIGkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKHByb3h5RGF0YS5nZXRVc2VySWQoKSwgcHJveHlEYXRhLmdldFBhc3N3b3JkKCkpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEhvc3QoU3RyaW5nIHJlcG9zaXRvcnlVcmwpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IHJlcG9zaXRvcnlVcmw7Ci0JCWludCBjb2xvblNsYXNoU2xhc2ggPSByZXBvc2l0b3J5VXJsLmluZGV4T2YoIjovLyIpOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRIb3N0KFN0cmluZyByZXBvc2l0b3J5VXJsKSB7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSByZXBvc2l0b3J5VXJsOworICAgICAgICBpbnQgY29sb25TbGFzaFNsYXNoID0gcmVwb3NpdG9yeVVybC5pbmRleE9mKCI6Ly8iKTsKIAotCQlpZiAoY29sb25TbGFzaFNsYXNoID49IDApIHsKLQkJCXJlc3VsdCA9IHJlcG9zaXRvcnlVcmwuc3Vic3RyaW5nKGNvbG9uU2xhc2hTbGFzaCArIDMpOwotCQl9CisgICAgICAgIGlmIChjb2xvblNsYXNoU2xhc2ggPj0gMCkgeworICAgICAgICAgICAgcmVzdWx0ID0gcmVwb3NpdG9yeVVybC5zdWJzdHJpbmcoY29sb25TbGFzaFNsYXNoICsgMyk7CisgICAgICAgIH0KIAotCQlpbnQgY29sb25Qb3J0ID0gcmVzdWx0LmluZGV4T2YoJzonKTsKLQkJaW50IHJlcXVlc3RQYXRoID0gcmVzdWx0LmluZGV4T2YoJy8nKTsKKyAgICAgICAgaW50IGNvbG9uUG9ydCA9IHJlc3VsdC5pbmRleE9mKCc6Jyk7CisgICAgICAgIGludCByZXF1ZXN0UGF0aCA9IHJlc3VsdC5pbmRleE9mKCcvJyk7CiAKLQkJaW50IHN1YnN0cmluZ0VuZDsKKyAgICAgICAgaW50IHN1YnN0cmluZ0VuZDsKIAotCQkvLyBtaW5pbXVtIHBvc2l0aXZlLCBvciBzdHJpbmcgbGVuZ3RoCi0JCWlmIChjb2xvblBvcnQgPiAwICYmIHJlcXVlc3RQYXRoID4gMCkgewotCQkJc3Vic3RyaW5nRW5kID0gTWF0aC5taW4oY29sb25Qb3J0LCByZXF1ZXN0UGF0aCk7Ci0JCX0gZWxzZSBpZiAoY29sb25Qb3J0ID4gMCkgewotCQkJc3Vic3RyaW5nRW5kID0gY29sb25Qb3J0OwotCQl9IGVsc2UgaWYgKHJlcXVlc3RQYXRoID4gMCkgewotCQkJc3Vic3RyaW5nRW5kID0gcmVxdWVzdFBhdGg7Ci0JCX0gZWxzZSB7Ci0JCQlzdWJzdHJpbmdFbmQgPSByZXN1bHQubGVuZ3RoKCk7Ci0JCX0KKyAgICAgICAgLy8gbWluaW11bSBwb3NpdGl2ZSwgb3Igc3RyaW5nIGxlbmd0aAorICAgICAgICBpZiAoY29sb25Qb3J0ID4gMCAmJiByZXF1ZXN0UGF0aCA+IDApIHsKKyAgICAgICAgICAgIHN1YnN0cmluZ0VuZCA9IE1hdGgubWluKGNvbG9uUG9ydCwgcmVxdWVzdFBhdGgpOworICAgICAgICB9IGVsc2UgaWYgKGNvbG9uUG9ydCA+IDApIHsKKyAgICAgICAgICAgIHN1YnN0cmluZ0VuZCA9IGNvbG9uUG9ydDsKKyAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0UGF0aCA+IDApIHsKKyAgICAgICAgICAgIHN1YnN0cmluZ0VuZCA9IHJlcXVlc3RQYXRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3Vic3RyaW5nRW5kID0gcmVzdWx0Lmxlbmd0aCgpOworICAgICAgICB9CiAKLQkJcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMCwgc3Vic3RyaW5nRW5kKTsKLQl9CisgICAgICAgIHJldHVybiByZXN1bHQuc3Vic3RyaW5nKDAsIHN1YnN0cmluZ0VuZCk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBEYXRlIGdldExhc3RNb2RpZmllZERhdGUoU3RyaW5nIHVybCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUdldE1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG51bGw7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSHR0cENsaWVudCBjbGllbnQgPSBuZXcgSHR0cENsaWVudCgpOwotCQkJbWV0aG9kID0gbmV3IEdldE1ldGhvZCh1cmwpOwotCQkJbWV0aG9kLnNldEZvbGxvd1JlZGlyZWN0cyh0cnVlKTsKKyAgICBwdWJsaWMgc3RhdGljIERhdGUgZ2V0TGFzdE1vZGlmaWVkRGF0ZShTdHJpbmcgdXJsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKyAgICAgICAgR2V0TWV0aG9kIG1ldGhvZCA9IG51bGw7CisgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbnVsbDsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBIdHRwQ2xpZW50IGNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7CisgICAgICAgICAgICBtZXRob2QgPSBuZXcgR2V0TWV0aG9kKHVybCk7CisgICAgICAgICAgICBtZXRob2Quc2V0Rm9sbG93UmVkaXJlY3RzKHRydWUpOwogCi0JCQlIb3N0Q29uZmlndXJhdGlvbiBob3N0Q29uZmlndXJhdGlvbiA9IG5ldyBIb3N0Q29uZmlndXJhdGlvbigpOwotCQkJaG9zdENvbmZpZ3VyYXRpb24uc2V0SG9zdChnZXRIb3N0KHVybCksIEhUVFBfUE9SVCwgImh0dHAiKTsKKyAgICAgICAgICAgIEhvc3RDb25maWd1cmF0aW9uIGhvc3RDb25maWd1cmF0aW9uID0gbmV3IEhvc3RDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBob3N0Q29uZmlndXJhdGlvbi5zZXRIb3N0KGdldEhvc3QodXJsKSwgSFRUUF9QT1JULCAiaHR0cCIpOwogCi0JCQljb25maWd1cmVIdHRwQ2xpZW50UHJveHkodXJsLCBjbGllbnQsIGhvc3RDb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZUh0dHBDbGllbnRQcm94eSh1cmwsIGNsaWVudCwgaG9zdENvbmZpZ3VyYXRpb24pOwogCi0JCQljbGllbnQuZ2V0SHR0cENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0UGFyYW1zKCkuc2V0U29UaW1lb3V0KFNPQ0tFVF9USU1FT1VUKTsKLQkJCWNsaWVudC5nZXRIdHRwQ29ubmVjdGlvbk1hbmFnZXIoKS5nZXRQYXJhbXMoKS5zZXRDb25uZWN0aW9uVGltZW91dChDT05OTkVDVF9USU1FT1VUKTsKKyAgICAgICAgICAgIGNsaWVudC5nZXRIdHRwQ29ubmVjdGlvbk1hbmFnZXIoKS5nZXRQYXJhbXMoKS5zZXRTb1RpbWVvdXQoU09DS0VUX1RJTUVPVVQpOworICAgICAgICAgICAgY2xpZW50LmdldEh0dHBDb25uZWN0aW9uTWFuYWdlcigpLmdldFBhcmFtcygpLnNldENvbm5lY3Rpb25UaW1lb3V0KENPTk5ORUNUX1RJTUVPVVQpOwogCi0JCQkvLyBFeGVjdXRlIHRoZSBHRVQgbWV0aG9kCi0JCQlpbnQgc3RhdHVzQ29kZSA9IGNsaWVudC5leGVjdXRlTWV0aG9kKGhvc3RDb25maWd1cmF0aW9uLCBtZXRob2QpOwotCQkJaWYgKHN0YXR1c0NvZGUgPT0gMjAwKSB7CisgICAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBHRVQgbWV0aG9kCisgICAgICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IGNsaWVudC5leGVjdXRlTWV0aG9kKGhvc3RDb25maWd1cmF0aW9uLCBtZXRob2QpOworICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT0gMjAwKSB7CiAKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQorICAgICAgICAgICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlIZWFkZXIgbGFzdE1vZGlmaWVkID0gbWV0aG9kLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7Ci0JCQkJaWYgKGxhc3RNb2RpZmllZCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBEYXRlVXRpbC5wYXJzZURhdGUobGFzdE1vZGlmaWVkLmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJCW1ldGhvZC5yZWxlYXNlQ29ubmVjdGlvbigpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotCQkJfQotCQkJdHJ5IHsKLQkJCQlpZiAoYmlzICE9IG51bGwpIHsKLQkJCQkJYmlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChmb3MgIT0gbnVsbCkgewotCQkJCQlmb3MuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgICAgICAgICAgICAgSGVhZGVyIGxhc3RNb2RpZmllZCA9IG1ldGhvZC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpOworICAgICAgICAgICAgICAgIGlmIChsYXN0TW9kaWZpZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZVV0aWwucGFyc2VEYXRlKGxhc3RNb2RpZmllZC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtZXRob2QucmVsZWFzZUNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGJpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoZm9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBGaWxlIGRvd25sb2FkRmlsZShTdHJpbmcgdXJsLCBGaWxlIG91dHB1dFBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlHZXRNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBudWxsOwotCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0JCUZpbGUgb3V0cHV0RmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKLQkJCW1ldGhvZCA9IG5ldyBHZXRNZXRob2QodXJsKTsKLQkJCW1ldGhvZC5zZXRGb2xsb3dSZWRpcmVjdHModHJ1ZSk7CisgICAgcHVibGljIHN0YXRpYyBGaWxlIGRvd25sb2FkRmlsZShTdHJpbmcgdXJsLCBGaWxlIG91dHB1dFBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworICAgICAgICBHZXRNZXRob2QgbWV0aG9kID0gbnVsbDsKKyAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBudWxsOworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEh0dHBDbGllbnQgY2xpZW50ID0gbmV3IEh0dHBDbGllbnQoKTsKKyAgICAgICAgICAgIG1ldGhvZCA9IG5ldyBHZXRNZXRob2QodXJsKTsKKyAgICAgICAgICAgIG1ldGhvZC5zZXRGb2xsb3dSZWRpcmVjdHModHJ1ZSk7CiAKLQkJCUhvc3RDb25maWd1cmF0aW9uIGhvc3RDb25maWd1cmF0aW9uID0gbmV3IEhvc3RDb25maWd1cmF0aW9uKCk7Ci0JCQlob3N0Q29uZmlndXJhdGlvbi5zZXRIb3N0KGdldEhvc3QodXJsKSwgSFRUUF9QT1JULCAiaHR0cCIpOworICAgICAgICAgICAgSG9zdENvbmZpZ3VyYXRpb24gaG9zdENvbmZpZ3VyYXRpb24gPSBuZXcgSG9zdENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIGhvc3RDb25maWd1cmF0aW9uLnNldEhvc3QoZ2V0SG9zdCh1cmwpLCBIVFRQX1BPUlQsICJodHRwIik7CiAKLQkJCWNvbmZpZ3VyZUh0dHBDbGllbnRQcm94eSh1cmwsIGNsaWVudCwgaG9zdENvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgY29uZmlndXJlSHR0cENsaWVudFByb3h5KHVybCwgY2xpZW50LCBob3N0Q29uZmlndXJhdGlvbik7CiAKLQkJCWNsaWVudC5nZXRIdHRwQ29ubmVjdGlvbk1hbmFnZXIoKS5nZXRQYXJhbXMoKS5zZXRTb1RpbWVvdXQoU09DS0VUX1RJTUVPVVQpOwotCQkJY2xpZW50LmdldEh0dHBDb25uZWN0aW9uTWFuYWdlcigpLmdldFBhcmFtcygpLnNldENvbm5lY3Rpb25UaW1lb3V0KENPTk5ORUNUX1RJTUVPVVQpOworICAgICAgICAgICAgY2xpZW50LmdldEh0dHBDb25uZWN0aW9uTWFuYWdlcigpLmdldFBhcmFtcygpLnNldFNvVGltZW91dChTT0NLRVRfVElNRU9VVCk7CisgICAgICAgICAgICBjbGllbnQuZ2V0SHR0cENvbm5lY3Rpb25NYW5hZ2VyKCkuZ2V0UGFyYW1zKCkuc2V0Q29ubmVjdGlvblRpbWVvdXQoQ09OTk5FQ1RfVElNRU9VVCk7CiAKLQkJCS8vIEV4ZWN1dGUgdGhlIEdFVCBtZXRob2QKLQkJCWludCBzdGF0dXNDb2RlID0gY2xpZW50LmV4ZWN1dGVNZXRob2QoaG9zdENvbmZpZ3VyYXRpb24sIG1ldGhvZCk7Ci0JCQlpZiAoc3RhdHVzQ29kZSA9PSAyMDApIHsKKyAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIEdFVCBtZXRob2QKKyAgICAgICAgICAgIGludCBzdGF0dXNDb2RlID0gY2xpZW50LmV4ZWN1dGVNZXRob2QoaG9zdENvbmZpZ3VyYXRpb24sIG1ldGhvZCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzQ29kZSA9PSAyMDApIHsKIAotCQkJCWludCBpeCA9IG1ldGhvZC5nZXRQYXRoKCkubGFzdEluZGV4T2YoJy8nKTsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBtZXRob2QuZ2V0UGF0aCgpLnN1YnN0cmluZyhpeCArIDEpOwotCQkJCW1vbml0b3Iuc3ViVGFzaygiRG93bmxvYWRpbmcgZmlsZSAnIiArIGZpbGVOYW1lICsgIiciKTsKKyAgICAgICAgICAgICAgICBpbnQgaXggPSBtZXRob2QuZ2V0UGF0aCgpLmxhc3RJbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gbWV0aG9kLmdldFBhdGgoKS5zdWJzdHJpbmcoaXggKyAxKTsKKyAgICAgICAgICAgICAgICBtb25pdG9yLnN1YlRhc2soIkRvd25sb2FkaW5nIGZpbGUgJyIgKyBmaWxlTmFtZSArICInIik7CiAKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQorICAgICAgICAgICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlIZWFkZXJbXSBoZWFkZXIgPSBtZXRob2QuZ2V0UmVzcG9uc2VIZWFkZXJzKCJjb250ZW50LWxlbmd0aCIpOwotCQkJCWxvbmcgdG90YWxCeXRlcyA9IExvbmcudmFsdWVPZihoZWFkZXJbMF0uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgSGVhZGVyW10gaGVhZGVyID0gbWV0aG9kLmdldFJlc3BvbnNlSGVhZGVycygiY29udGVudC1sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICBsb25nIHRvdGFsQnl0ZXMgPSBMb25nLnZhbHVlT2YoaGVhZGVyWzBdLmdldFZhbHVlKCkpOwogCi0JCQkJSW5wdXRTdHJlYW0gaXMgPSBtZXRob2QuZ2V0UmVzcG9uc2VCb2R5QXNTdHJlYW0oKTsKLQkJCQliaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpcyk7Ci0JCQkJb3V0cHV0RmlsZSA9IG5ldyBGaWxlKG91dHB1dFBhdGgsIGZpbGVOYW1lKTsKLQkJCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLQkJCQlsb25nIGJ5dGVzUmVhZCA9IDA7Ci0JCQkJYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbODE5Ml07Ci0JCQkJaW50IGNvdW50ID0gYmlzLnJlYWQoYnl0ZXMpOwotCQkJCXdoaWxlIChjb3VudCAhPSAtMSAmJiBjb3VudCA8PSA4MTkyKSB7Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJYnl0ZXNSZWFkID0gYnl0ZXNSZWFkICsgY291bnQ7Ci0JCQkJCWZsb2F0IHBlcmNlbnQgPSAoRmxvYXQudmFsdWVPZihieXRlc1JlYWQpIC8gRmxvYXQudmFsdWVPZih0b3RhbEJ5dGVzKSkgKiAxMDA7Ci0JCQkJCW1vbml0b3Iuc3ViVGFzaygiRG93bmxvYWRpbmcgZmlsZSAnIiArIGZpbGVOYW1lICsgIic6ICIgKyBieXRlc1JlYWQgKyAiYnl0ZXMvIiArIHRvdGFsQnl0ZXMKLQkJCQkJCSsgImJ5dGVzICgiICsgTWF0aC5yb3VuZChwZXJjZW50KSArICIlKSIpOwotCQkJCQlmb3Mud3JpdGUoYnl0ZXMsIDAsIGNvdW50KTsKLQkJCQkJY291bnQgPSBiaXMucmVhZChieXRlcyk7Ci0JCQkJfQotCQkJCWlmIChjb3VudCAhPSAtMSkgewotCQkJCQlmb3Mud3JpdGUoYnl0ZXMsIDAsIGNvdW50KTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBtZXRob2QuZ2V0UmVzcG9uc2VCb2R5QXNTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpcyk7CisgICAgICAgICAgICAgICAgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKG91dHB1dFBhdGgsIGZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKKyAgICAgICAgICAgICAgICBsb25nIGJ5dGVzUmVhZCA9IDA7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbODE5Ml07CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gYmlzLnJlYWQoYnl0ZXMpOworICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudCAhPSAtMSAmJiBjb3VudCA8PSA4MTkyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnl0ZXNSZWFkID0gYnl0ZXNSZWFkICsgY291bnQ7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHBlcmNlbnQgPSBGbG9hdC52YWx1ZU9mKGJ5dGVzUmVhZCkgLyBGbG9hdC52YWx1ZU9mKHRvdGFsQnl0ZXMpICogMTAwOworICAgICAgICAgICAgICAgICAgICBtb25pdG9yLnN1YlRhc2soCisgICAgICAgICAgICAgICAgICAgICAgICAiRG93bmxvYWRpbmcgZmlsZSAnIiArIGZpbGVOYW1lICsgIic6ICIgKyBieXRlc1JlYWQgKyAiYnl0ZXMvIiArIHRvdGFsQnl0ZXMgKyAiYnl0ZXMgKCIgKyBNYXRoLnJvdW5kKHBlcmNlbnQpICsgIiUpIik7CisgICAgICAgICAgICAgICAgICAgIGZvcy53cml0ZShieXRlcywgMCwgY291bnQpOworICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGJpcy5yZWFkKGJ5dGVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcy53cml0ZShieXRlcywgMCwgY291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJcmV0dXJuIG91dHB1dEZpbGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTZXJ2ZXJDb3JlUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldExvZygpCi0JCQkJCS5sb2cobmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAxLCAiRXJyb3IgZG93bmxvYWRpbmcgYnVuZGxlL2xpYnJhcnkiLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCQltZXRob2QucmVsZWFzZUNvbm5lY3Rpb24oKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJaWYgKGJpcyAhPSBudWxsKSB7Ci0JCQkJCWJpcy5jbG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgewotCQkJfQotCQkJdHJ5IHsKLQkJCQlpZiAoZm9zICE9IG51bGwpIHsKLQkJCQkJZm9zLmNsb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBvdXRwdXRGaWxlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2VydmVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAorICAgICAgICAgICAgICAgIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDEsICJFcnJvciBkb3dubG9hZGluZyBidW5kbGUvbGlicmFyeSIsIGUpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5yZWxlYXNlQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoYmlzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYmlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChmb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXJldHVybiBudWxsOwotCX0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb25maWd1cmVIdHRwQ2xpZW50UHJveHkoU3RyaW5nIHVybCwgSHR0cENsaWVudCBjbGllbnQsIEhvc3RDb25maWd1cmF0aW9uIGhvc3RDb25maWd1cmF0aW9uKSB7Ci0JCVNlcnZpY2VSZWZlcmVuY2Ugc2VydmljZXMgPSBTZXJ2ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRCdW5kbGVDb250ZXh0KCkKLQkJCQkuZ2V0U2VydmljZVJlZmVyZW5jZShJUHJveHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChzZXJ2aWNlcyAhPSBudWxsKSB7Ci0JCQlJUHJveHlTZXJ2aWNlIHByb3h5U2VydmljZSA9IChJUHJveHlTZXJ2aWNlKSBTZXJ2ZXJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRCdW5kbGVDb250ZXh0KCkKLQkJCQkJLmdldFNlcnZpY2Uoc2VydmljZXMpOwotCQkJSVByb3h5RGF0YSBwcm94eURhdGEgPSBwcm94eVNlcnZpY2UuZ2V0UHJveHlEYXRhRm9ySG9zdChnZXRIb3N0KHVybCksIElQcm94eURhdGEuSFRUUF9QUk9YWV9UWVBFKTsKLQkJCWlmIChwcm94eVNlcnZpY2UuaXNQcm94aWVzRW5hYmxlZCgpICYmIHByb3h5RGF0YSAhPSBudWxsKSB7Ci0JCQkJaG9zdENvbmZpZ3VyYXRpb24uc2V0UHJveHkocHJveHlEYXRhLmdldEhvc3QoKSwgcHJveHlEYXRhLmdldFBvcnQoKSk7Ci0JCQl9Ci0JCQlpZiAocHJveHlEYXRhICE9IG51bGwgJiYgcHJveHlEYXRhLmlzUmVxdWlyZXNBdXRoZW50aWNhdGlvbigpKSB7Ci0JCQkJY2xpZW50LmdldFN0YXRlKCkuc2V0UHJveHlDcmVkZW50aWFscyhBdXRoU2NvcGUuQU5ZLCBnZXRDcmVkZW50aWFscyhwcm94eURhdGEsIGdldEhvc3QodXJsKSkpOwotCQkJfQotCQl9Ci0JfQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29uZmlndXJlSHR0cENsaWVudFByb3h5KFN0cmluZyB1cmwsIEh0dHBDbGllbnQgY2xpZW50LCBIb3N0Q29uZmlndXJhdGlvbiBob3N0Q29uZmlndXJhdGlvbikgeworICAgICAgICBTZXJ2aWNlUmVmZXJlbmNlIHNlcnZpY2VzID0gU2VydmVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0QnVuZGxlQ29udGV4dCgpLmdldFNlcnZpY2VSZWZlcmVuY2UoSVByb3h5U2VydmljZS5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBpZiAoc2VydmljZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgSVByb3h5U2VydmljZSBwcm94eVNlcnZpY2UgPSAoSVByb3h5U2VydmljZSkgU2VydmVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0QnVuZGxlQ29udGV4dCgpLmdldFNlcnZpY2Uoc2VydmljZXMpOworICAgICAgICAgICAgSVByb3h5RGF0YSBwcm94eURhdGEgPSBwcm94eVNlcnZpY2UuZ2V0UHJveHlEYXRhRm9ySG9zdChnZXRIb3N0KHVybCksIElQcm94eURhdGEuSFRUUF9QUk9YWV9UWVBFKTsKKyAgICAgICAgICAgIGlmIChwcm94eVNlcnZpY2UuaXNQcm94aWVzRW5hYmxlZCgpICYmIHByb3h5RGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaG9zdENvbmZpZ3VyYXRpb24uc2V0UHJveHkocHJveHlEYXRhLmdldEhvc3QoKSwgcHJveHlEYXRhLmdldFBvcnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHJveHlEYXRhICE9IG51bGwgJiYgcHJveHlEYXRhLmlzUmVxdWlyZXNBdXRoZW50aWNhdGlvbigpKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LmdldFN0YXRlKCkuc2V0UHJveHlDcmVkZW50aWFscyhBdXRoU2NvcGUuQU5ZLCBnZXRDcmVkZW50aWFscyhwcm94eURhdGEsIGdldEhvc3QodXJsKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm9qZWN0cy9BcnRlZmFjdFByb2plY3RGaWxlQ29udGFpbmVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm9qZWN0cy9BcnRlZmFjdFByb2plY3RGaWxlQ29udGFpbmVyLmphdmEKaW5kZXggMWYxOThjNC4uOWVmY2YwNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvamVjdHMvQXJ0ZWZhY3RQcm9qZWN0RmlsZUNvbnRhaW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb2plY3RzL0FydGVmYWN0UHJvamVjdEZpbGVDb250YWluZXIuamF2YQpAQCAtMjQsNDEgKzI0LDQxIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBBcnRlZmFjdFByb2plY3RGaWxlQ29udGFpbmVyIGV4dGVuZHMgUHJvamVjdEZpbGVDb250YWluZXIgewogCi0JcHJpdmF0ZSBmaW5hbCBMb2NhbEFydGVmYWN0U2V0IGFydGVmYWN0U2V0OworICAgIHByaXZhdGUgZmluYWwgTG9jYWxBcnRlZmFjdFNldCBhcnRlZmFjdFNldDsKIAotCXB1YmxpYyBBcnRlZmFjdFByb2plY3RGaWxlQ29udGFpbmVyKFNlcnZlclByb2plY3Qgc2VydmVyUHJvamVjdCwgTG9jYWxBcnRlZmFjdFNldCBhcnRlZmFjdFNldCkgewotCQlzdXBlcihzZXJ2ZXJQcm9qZWN0KTsKLQkJdGhpcy5hcnRlZmFjdFNldCA9IGFydGVmYWN0U2V0OwotCX0KKyAgICBwdWJsaWMgQXJ0ZWZhY3RQcm9qZWN0RmlsZUNvbnRhaW5lcihTZXJ2ZXJQcm9qZWN0IHNlcnZlclByb2plY3QsIExvY2FsQXJ0ZWZhY3RTZXQgYXJ0ZWZhY3RTZXQpIHsKKyAgICAgICAgc3VwZXIoc2VydmVyUHJvamVjdCk7CisgICAgICAgIHRoaXMuYXJ0ZWZhY3RTZXQgPSBhcnRlZmFjdFNldDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb2plY3RzLlByb2plY3RGaWxlQ29udGFpbmVyI2NyZWF0ZUZpbGVSZWZlcmVuY2VzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvamVjdEZpbGVSZWZlcmVuY2VbXSBjcmVhdGVGaWxlUmVmZXJlbmNlcygpIHsKLQkJTGlzdDxQcm9qZWN0RmlsZVJlZmVyZW5jZT4gcmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8UHJvamVjdEZpbGVSZWZlcmVuY2U+KCk7Ci0JCWNyZWF0ZUZvbGRlcihnZXRSb290Rm9sZGVyKCkpOwotCQlmb3IgKElBcnRlZmFjdCBhcnRlZmFjdCA6IGFydGVmYWN0U2V0LmdldEFydGVmYWN0cygpKSB7Ci0JCQlpZiAoYXJ0ZWZhY3QgaW5zdGFuY2VvZiBJTG9jYWxBcnRlZmFjdCkgewotCQkJCVByb2plY3RGaWxlUmVmZXJlbmNlIGZpbGVSZWZlcmVuY2UgPSBuZXcgUHJvamVjdEZpbGVSZWZlcmVuY2UodGhpcywgKElMb2NhbEFydGVmYWN0KSBhcnRlZmFjdCk7Ci0JCQkJcmVmZXJlbmNlcy5hZGQoZmlsZVJlZmVyZW5jZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZXMudG9BcnJheShuZXcgUHJvamVjdEZpbGVSZWZlcmVuY2VbMF0pOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb2plY3RzLlByb2plY3RGaWxlQ29udGFpbmVyI2NyZWF0ZUZpbGVSZWZlcmVuY2VzKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUHJvamVjdEZpbGVSZWZlcmVuY2VbXSBjcmVhdGVGaWxlUmVmZXJlbmNlcygpIHsKKyAgICAgICAgTGlzdDxQcm9qZWN0RmlsZVJlZmVyZW5jZT4gcmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8UHJvamVjdEZpbGVSZWZlcmVuY2U+KCk7CisgICAgICAgIGNyZWF0ZUZvbGRlcihnZXRSb290Rm9sZGVyKCkpOworICAgICAgICBmb3IgKElBcnRlZmFjdCBhcnRlZmFjdCA6IHRoaXMuYXJ0ZWZhY3RTZXQuZ2V0QXJ0ZWZhY3RzKCkpIHsKKyAgICAgICAgICAgIGlmIChhcnRlZmFjdCBpbnN0YW5jZW9mIElMb2NhbEFydGVmYWN0KSB7CisgICAgICAgICAgICAgICAgUHJvamVjdEZpbGVSZWZlcmVuY2UgZmlsZVJlZmVyZW5jZSA9IG5ldyBQcm9qZWN0RmlsZVJlZmVyZW5jZSh0aGlzLCAoSUxvY2FsQXJ0ZWZhY3QpIGFydGVmYWN0KTsKKyAgICAgICAgICAgICAgICByZWZlcmVuY2VzLmFkZChmaWxlUmVmZXJlbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy50b0FycmF5KG5ldyBQcm9qZWN0RmlsZVJlZmVyZW5jZVswXSk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm9qZWN0cy5JU2VydmVyUHJvamVjdENvbnRhaW5lciNnZXRBcnRlZmFjdFNldCgpCi0JICovCi0JcHVibGljIExvY2FsQXJ0ZWZhY3RTZXQgZ2V0QXJ0ZWZhY3RTZXQoKSB7Ci0JCXJldHVybiBhcnRlZmFjdFNldDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm9qZWN0cy5JU2VydmVyUHJvamVjdENvbnRhaW5lciNnZXRBcnRlZmFjdFNldCgpCisgICAgICovCisgICAgcHVibGljIExvY2FsQXJ0ZWZhY3RTZXQgZ2V0QXJ0ZWZhY3RTZXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFydGVmYWN0U2V0OworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvamVjdHMuUHJvamVjdEZpbGVDb250YWluZXIjZ2V0Um9vdEZvbGRlcigpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElGb2xkZXIgZ2V0Um9vdEZvbGRlcigpIHsKLQkJcmV0dXJuIGdldFNlcnZlclByb2plY3QoKS5nZXRXb3Jrc3BhY2VQcm9qZWN0KCkuZ2V0Rm9sZGVyKGdldEFydGVmYWN0U2V0KCkuZ2V0UmVsYXRpdmVQYXRoKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb2plY3RzLlByb2plY3RGaWxlQ29udGFpbmVyI2dldFJvb3RGb2xkZXIoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBJRm9sZGVyIGdldFJvb3RGb2xkZXIoKSB7CisgICAgICAgIHJldHVybiBnZXRTZXJ2ZXJQcm9qZWN0KCkuZ2V0V29ya3NwYWNlUHJvamVjdCgpLmdldEZvbGRlcihnZXRBcnRlZmFjdFNldCgpLmdldFJlbGF0aXZlUGF0aCgpKTsKKyAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvamVjdHMvSVNlcnZlclByb2plY3RBcnRlZmFjdC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvamVjdHMvSVNlcnZlclByb2plY3RBcnRlZmFjdC5qYXZhCmluZGV4IGM2YTE3NzguLjUwMWJiYTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb2plY3RzL0lTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm9qZWN0cy9JU2VydmVyUHJvamVjdEFydGVmYWN0LmphdmEKQEAgLTE0LDEyICsxNCwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuYXJ0ZWZhY3RzLklMb2NhbEFydGVmYWN0OwogCiAvKioKLSAqIAorICoKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCi0gKiAKKyAqCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlclByb2plY3RBcnRlZmFjdCB7Ci0JSVNlcnZlclByb2plY3RDb250YWluZXIgZ2V0Q29udGFpbmVyKCk7CiAKLQlwdWJsaWMgSUxvY2FsQXJ0ZWZhY3QgZ2V0QXJ0ZWZhY3QoKTsKKyAgICBJU2VydmVyUHJvamVjdENvbnRhaW5lciBnZXRDb250YWluZXIoKTsKKworICAgIHB1YmxpYyBJTG9jYWxBcnRlZmFjdCBnZXRBcnRlZmFjdCgpOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvamVjdHMvSVNlcnZlclByb2plY3RDb250YWluZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb2plY3RzL0lTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyLmphdmEKaW5kZXggYjgxMGI1MC4uN2YwOGQ1NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvamVjdHMvSVNlcnZlclByb2plY3RDb250YWluZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm9qZWN0cy9JU2VydmVyUHJvamVjdENvbnRhaW5lci5qYXZhCkBAIC0xNSwxNCArMTUsMTUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKIAogLyoqCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgotICogCisgKgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyIHsKLQlPYmplY3RbXSBnZXRNZW1iZXJzKCk7CiAKLQlJU2VydmVyIGdldFNlcnZlcigpOworICAgIE9iamVjdFtdIGdldE1lbWJlcnMoKTsKIAotCUxvY2FsQXJ0ZWZhY3RTZXQgZ2V0QXJ0ZWZhY3RTZXQoKTsKKyAgICBJU2VydmVyIGdldFNlcnZlcigpOworCisgICAgTG9jYWxBcnRlZmFjdFNldCBnZXRBcnRlZmFjdFNldCgpOwogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvamVjdHMvUHJvamVjdEJ1bmRsZUNvbnRhaW5lci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvamVjdHMvUHJvamVjdEJ1bmRsZUNvbnRhaW5lci5qYXZhCmluZGV4IGFkYjUyODYuLmU1MWU0ODAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb2plY3RzL1Byb2plY3RCdW5kbGVDb250YWluZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm9qZWN0cy9Qcm9qZWN0QnVuZGxlQ29udGFpbmVyLmphdmEKQEAgLTM3LDEyMiArMzcsMTIyIEBACiAKIC8qKgogICogUHJvdmlkZXMgYSB3cmFwcGVyIGZvciBhbiBhcnRlZmFjdCBzZXQgdGhhdCBhY3RzIGFzIGEgTGlicmFyeS4gVE9ETyB3ZSBtYXkgbm90IG5lZWQgYXJ0ZWZhY3Qgc2V0cyBhdCBhbGwuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgogICovCiBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIFByb2plY3RCdW5kbGVDb250YWluZXIgZXh0ZW5kcyBQYWNrYWdlRnJhZ21lbnRSb290Q29udGFpbmVyIGltcGxlbWVudHMgSUNsYXNzcGF0aENvbnRhaW5lciwKLQkJSVNlcnZlclByb2plY3RDb250YWluZXIgeworcHVibGljIGNsYXNzIFByb2plY3RCdW5kbGVDb250YWluZXIgZXh0ZW5kcyBQYWNrYWdlRnJhZ21lbnRSb290Q29udGFpbmVyIGltcGxlbWVudHMgSUNsYXNzcGF0aENvbnRhaW5lciwgSVNlcnZlclByb2plY3RDb250YWluZXIgewogCi0JcHJpdmF0ZSBmaW5hbCBMb2NhbEFydGVmYWN0U2V0IGFydGVmYWN0U2V0OworICAgIHByaXZhdGUgZmluYWwgTG9jYWxBcnRlZmFjdFNldCBhcnRlZmFjdFNldDsKIAotCXByaXZhdGUgZmluYWwgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGVudHJpZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PElDbGFzc3BhdGhFbnRyeT4gZW50cmllczsKIAotCXByaXZhdGUgZmluYWwgTGlzdDxJUGFja2FnZUZyYWdtZW50Um9vdD4gcm9vdHM7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PElQYWNrYWdlRnJhZ21lbnRSb290PiByb290czsKIAotCXByb3RlY3RlZCBQcm9qZWN0QnVuZGxlQ29udGFpbmVyKGZpbmFsIFNlcnZlclByb2plY3Qgc2VydmVyUHJvamVjdCwgTG9jYWxBcnRlZmFjdFNldCBhcnRlZmFjdFNldCkgewotCQlzdXBlcihzZXJ2ZXJQcm9qZWN0LmdldEphdmFQcm9qZWN0KCkpOwotCQl0aGlzLmFydGVmYWN0U2V0ID0gYXJ0ZWZhY3RTZXQ7CisgICAgcHJvdGVjdGVkIFByb2plY3RCdW5kbGVDb250YWluZXIoZmluYWwgU2VydmVyUHJvamVjdCBzZXJ2ZXJQcm9qZWN0LCBMb2NhbEFydGVmYWN0U2V0IGFydGVmYWN0U2V0KSB7CisgICAgICAgIHN1cGVyKHNlcnZlclByb2plY3QuZ2V0SmF2YVByb2plY3QoKSk7CisgICAgICAgIHRoaXMuYXJ0ZWZhY3RTZXQgPSBhcnRlZmFjdFNldDsKIAotCQllbnRyaWVzID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7Ci0JCXJvb3RzID0gbmV3IEFycmF5TGlzdDxJUGFja2FnZUZyYWdtZW50Um9vdD4oKTsKLQkJZm9yIChJQXJ0ZWZhY3QgYXJ0ZWZhY3QgOiBhcnRlZmFjdFNldC5nZXRBcnRlZmFjdHMoKSkgewotCQkJaWYgKGFydGVmYWN0IGluc3RhbmNlb2YgSUxvY2FsQXJ0ZWZhY3QpIHsKLQkJCQlJTG9jYWxBcnRlZmFjdCBsb2NhbEFydGVmYWN0ID0gKElMb2NhbEFydGVmYWN0KSBhcnRlZmFjdDsKLQkJCQlJUGF0aCBsb2NhdGlvbiA9IG5ldyBQYXRoKGxvY2FsQXJ0ZWZhY3QuZ2V0RmlsZSgpLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobG9jYXRpb24sIG51bGwsIG51bGwpOwotCQkJCWVudHJpZXMuYWRkKGVudHJ5KTsKLQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gbmV3IFByb2plY3RCdW5kbGVSb290KHRoaXMsIGxvY2FsQXJ0ZWZhY3QpOwotCQkJCXJvb3RzLmFkZChwYWNrYWdlRnJhZ21lbnRSb290KTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJSmF2YUNvcmUuc2V0Q2xhc3NwYXRoQ29udGFpbmVyKGdldFBhdGgoKSwgbmV3IElKYXZhUHJvamVjdFtdIHsgc2VydmVyUHJvamVjdC5qYXZhUHJvamVjdCB9LAotCQkJCQluZXcgSUNsYXNzcGF0aENvbnRhaW5lcltdIHsgUHJvamVjdEJ1bmRsZUNvbnRhaW5lci50aGlzIH0sIG51bGwpOwotCQkJc2VydmVyUHJvamVjdC5nZXRMaWJyYXJ5RW50cmllcygpLmFkZChKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeShnZXRQYXRoKCkpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKLQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgIlByb2JsZW0gb2NjdXJyZWQgaW4gYnVuZGxlIG1hbmFnZXIuIiwgZSkpOwotCQl9Ci0JfQorICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKKyAgICAgICAgdGhpcy5yb290cyA9IG5ldyBBcnJheUxpc3Q8SVBhY2thZ2VGcmFnbWVudFJvb3Q+KCk7CisgICAgICAgIGZvciAoSUFydGVmYWN0IGFydGVmYWN0IDogYXJ0ZWZhY3RTZXQuZ2V0QXJ0ZWZhY3RzKCkpIHsKKyAgICAgICAgICAgIGlmIChhcnRlZmFjdCBpbnN0YW5jZW9mIElMb2NhbEFydGVmYWN0KSB7CisgICAgICAgICAgICAgICAgSUxvY2FsQXJ0ZWZhY3QgbG9jYWxBcnRlZmFjdCA9IChJTG9jYWxBcnRlZmFjdCkgYXJ0ZWZhY3Q7CisgICAgICAgICAgICAgICAgSVBhdGggbG9jYXRpb24gPSBuZXcgUGF0aChsb2NhbEFydGVmYWN0LmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGxvY2F0aW9uLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXMuYWRkKGVudHJ5KTsKKyAgICAgICAgICAgICAgICBJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gbmV3IFByb2plY3RCdW5kbGVSb290KHRoaXMsIGxvY2FsQXJ0ZWZhY3QpOworICAgICAgICAgICAgICAgIHRoaXMucm9vdHMuYWRkKHBhY2thZ2VGcmFnbWVudFJvb3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoZ2V0UGF0aCgpLCBuZXcgSUphdmFQcm9qZWN0W10geyBzZXJ2ZXJQcm9qZWN0LmphdmFQcm9qZWN0IH0sCisgICAgICAgICAgICAgICAgbmV3IElDbGFzc3BhdGhDb250YWluZXJbXSB7IFByb2plY3RCdW5kbGVDb250YWluZXIudGhpcyB9LCBudWxsKTsKKyAgICAgICAgICAgIHNlcnZlclByb2plY3QuZ2V0TGlicmFyeUVudHJpZXMoKS5hZGQoSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoZ2V0UGF0aCgpKSk7CisgICAgICAgIH0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgIlByb2JsZW0gb2NjdXJyZWQgaW4gYnVuZGxlIG1hbmFnZXIuIiwgZSkpOworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2plY3RCdW5kbGVDb250YWluZXIpIHsKLQkJCVByb2plY3RCdW5kbGVDb250YWluZXIgb3RoZXIgPSAoUHJvamVjdEJ1bmRsZUNvbnRhaW5lcikgb2JqOwotCQkJcmV0dXJuIGFydGVmYWN0U2V0LmVxdWFscyhvdGhlci5hcnRlZmFjdFNldCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUHJvamVjdEJ1bmRsZUNvbnRhaW5lcikgeworICAgICAgICAgICAgUHJvamVjdEJ1bmRsZUNvbnRhaW5lciBvdGhlciA9IChQcm9qZWN0QnVuZGxlQ29udGFpbmVyKSBvYmo7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5hcnRlZmFjdFNldC5lcXVhbHMob3RoZXIuYXJ0ZWZhY3RTZXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0SmF2YVByb2plY3QoKS5oYXNoQ29kZSgpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gZ2V0SmF2YVByb2plY3QoKS5oYXNoQ29kZSgpOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJQWRhcHRhYmxlW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUFkYXB0YWJsZVtdIGdldENoaWxkcmVuKCkgeworICAgICAgICByZXR1cm4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIEphdmFQbHVnaW5JbWFnZXMuREVTQ19PQkpTX0xJQlJBUlk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgeworICAgICAgICByZXR1cm4gSmF2YVBsdWdpbkltYWdlcy5ERVNDX09CSlNfTElCUkFSWTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gYXJ0ZWZhY3RTZXQuZ2V0U2hvcnRMYWJlbCgpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hcnRlZmFjdFNldC5nZXRTaG9ydExhYmVsKCk7CisgICAgfQogCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnBhY2thZ2V2aWV3LlBhY2thZ2VGcmFnbWVudFJvb3RDb250YWluZXIjZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIGdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkgewotCQlyZXR1cm4gcm9vdHMudG9BcnJheShuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3Rbcm9vdHMuc2l6ZSgpXSk7Ci0JfQorICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucGFja2FnZXZpZXcuUGFja2FnZUZyYWdtZW50Um9vdENvbnRhaW5lciNnZXRQYWNrYWdlRnJhZ21lbnRSb290cygpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElQYWNrYWdlRnJhZ21lbnRSb290W10gZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJvb3RzLnRvQXJyYXkobmV3IElQYWNrYWdlRnJhZ21lbnRSb290W3RoaXMucm9vdHMuc2l6ZSgpXSk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyI2dldENsYXNzcGF0aEVudHJpZXMoKQotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCkgewotCQlyZXR1cm4gZW50cmllcy50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbZW50cmllcy5zaXplKCldKTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyI2dldENsYXNzcGF0aEVudHJpZXMoKQorICAgICAqLworICAgIHB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBnZXRDbGFzc3BhdGhFbnRyaWVzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVt0aGlzLmVudHJpZXMuc2l6ZSgpXSk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyI2dldERlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYXJ0ZWZhY3RTZXQuZ2V0U2hvcnRMYWJlbCgpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIjZ2V0RGVzY3JpcHRpb24oKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFydGVmYWN0U2V0LmdldFNob3J0TGFiZWwoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIjZ2V0S2luZCgpCi0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4gSUNsYXNzcGF0aENvbnRhaW5lci5LX0FQUExJQ0FUSU9OOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIjZ2V0S2luZCgpCisgICAgICovCisgICAgcHVibGljIGludCBnZXRLaW5kKCkgeworICAgICAgICByZXR1cm4gSUNsYXNzcGF0aENvbnRhaW5lci5LX0FQUExJQ0FUSU9OOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lciNnZXRQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBQYXRoKGFydGVmYWN0U2V0LmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSArICIvIiArIGFydGVmYWN0U2V0LmdldEFydGVmYWN0VHlwZSgpLmdldFBsdXJhbExhYmVsKCkpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXIjZ2V0UGF0aCgpCisgICAgICovCisgICAgcHVibGljIElQYXRoIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiBuZXcgUGF0aCh0aGlzLmFydGVmYWN0U2V0LmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSArICIvIiArIHRoaXMuYXJ0ZWZhY3RTZXQuZ2V0QXJ0ZWZhY3RUeXBlKCkuZ2V0UGx1cmFsTGFiZWwoKSk7CisgICAgfQogCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gYXJ0ZWZhY3RTZXQuZ2V0UmVwb3NpdG9yeSgpLmdldFNlcnZlcigpOwotCX0KKyAgICBwdWJsaWMgSVNlcnZlciBnZXRTZXJ2ZXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmFydGVmYWN0U2V0LmdldFJlcG9zaXRvcnkoKS5nZXRTZXJ2ZXIoKTsKKyAgICB9CiAKLQlwdWJsaWMgTG9jYWxBcnRlZmFjdFNldCBnZXRBcnRlZmFjdFNldCgpIHsKLQkJcmV0dXJuIGFydGVmYWN0U2V0OwotCX0KKyAgICBwdWJsaWMgTG9jYWxBcnRlZmFjdFNldCBnZXRBcnRlZmFjdFNldCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYXJ0ZWZhY3RTZXQ7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm9qZWN0cy5JU2VydmVyUHJvamVjdENvbnRhaW5lciNnZXRNZW1iZXJzKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0TWVtYmVycygpIHsKLQkJcmV0dXJuIGdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvamVjdHMuSVNlcnZlclByb2plY3RDb250YWluZXIjZ2V0TWVtYmVycygpCisgICAgICovCisgICAgcHVibGljIE9iamVjdFtdIGdldE1lbWJlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOworICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm9qZWN0cy9Qcm9qZWN0QnVuZGxlUm9vdC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvamVjdHMvUHJvamVjdEJ1bmRsZVJvb3QuamF2YQppbmRleCBlYzE3YzNhLi5iZDBhZGZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm9qZWN0cy9Qcm9qZWN0QnVuZGxlUm9vdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb2plY3RzL1Byb2plY3RCdW5kbGVSb290LmphdmEKQEAgLTE4LDIyICsxOCwyMiBAQAogCiBwdWJsaWMgY2xhc3MgUHJvamVjdEJ1bmRsZVJvb3QgZXh0ZW5kcyBKYXJQYWNrYWdlRnJhZ21lbnRSb290IGltcGxlbWVudHMgSVNlcnZlclByb2plY3RBcnRlZmFjdCB7CiAKLQlwcml2YXRlIGZpbmFsIElMb2NhbEFydGVmYWN0IGFydGVmYWN0OworICAgIHByaXZhdGUgZmluYWwgSUxvY2FsQXJ0ZWZhY3QgYXJ0ZWZhY3Q7CiAKLQlwcml2YXRlIGZpbmFsIFByb2plY3RCdW5kbGVDb250YWluZXIgY29udGFpbmVyOworICAgIHByaXZhdGUgZmluYWwgUHJvamVjdEJ1bmRsZUNvbnRhaW5lciBjb250YWluZXI7CiAKLQkvL092ZXJyaWRlIHRvIGFsbG93IGNvbnN0cnVjdG9yIGFjY2VzcyBmb3IgamFyIHBhY2thZ2UKLQlwdWJsaWMgUHJvamVjdEJ1bmRsZVJvb3QoUHJvamVjdEJ1bmRsZUNvbnRhaW5lciBjb250YWluZXIsIElMb2NhbEFydGVmYWN0IGFydGVmYWN0KSB7Ci0JCXN1cGVyKG5ldyBQYXRoKGFydGVmYWN0LmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSksIChKYXZhUHJvamVjdCkgY29udGFpbmVyLmdldEphdmFQcm9qZWN0KCkpOwotCQl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQkJdGhpcy5hcnRlZmFjdCA9IGFydGVmYWN0OwotCX0KKyAgICAvLyBPdmVycmlkZSB0byBhbGxvdyBjb25zdHJ1Y3RvciBhY2Nlc3MgZm9yIGphciBwYWNrYWdlCisgICAgcHVibGljIFByb2plY3RCdW5kbGVSb290KFByb2plY3RCdW5kbGVDb250YWluZXIgY29udGFpbmVyLCBJTG9jYWxBcnRlZmFjdCBhcnRlZmFjdCkgeworICAgICAgICBzdXBlcihuZXcgUGF0aChhcnRlZmFjdC5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpLCAoSmF2YVByb2plY3QpIGNvbnRhaW5lci5nZXRKYXZhUHJvamVjdCgpKTsKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgIHRoaXMuYXJ0ZWZhY3QgPSBhcnRlZmFjdDsKKyAgICB9CiAKLQlwdWJsaWMgSVNlcnZlclByb2plY3RDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KKyAgICBwdWJsaWMgSVNlcnZlclByb2plY3RDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgICAgfQogCi0JcHVibGljIElMb2NhbEFydGVmYWN0IGdldEFydGVmYWN0KCkgewotCQlyZXR1cm4gYXJ0ZWZhY3Q7Ci0JfQorICAgIHB1YmxpYyBJTG9jYWxBcnRlZmFjdCBnZXRBcnRlZmFjdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYXJ0ZWZhY3Q7CisgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb2plY3RzL1Byb2plY3RGaWxlQ29udGFpbmVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm9qZWN0cy9Qcm9qZWN0RmlsZUNvbnRhaW5lci5qYXZhCmluZGV4IDRjMTgyMjkuLjk4MTNmMzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb2plY3RzL1Byb2plY3RGaWxlQ29udGFpbmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvamVjdHMvUHJvamVjdEZpbGVDb250YWluZXIuamF2YQpAQCAtMjUsNTYgKzI1LDU1IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9qZWN0RmlsZUNvbnRhaW5lciBpbXBsZW1lbnRzIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyIHsKIAotCXByaXZhdGUgZmluYWwgU2VydmVyUHJvamVjdCBzZXJ2ZXJQcm9qZWN0OworICAgIHByaXZhdGUgZmluYWwgU2VydmVyUHJvamVjdCBzZXJ2ZXJQcm9qZWN0OwogCi0JcHJvdGVjdGVkIFByb2plY3RGaWxlUmVmZXJlbmNlW10gZmlsZVJlZmVyZW5jZXM7CisgICAgcHJvdGVjdGVkIFByb2plY3RGaWxlUmVmZXJlbmNlW10gZmlsZVJlZmVyZW5jZXM7CiAKLQlwcm90ZWN0ZWQgUHJvamVjdEZpbGVDb250YWluZXIoU2VydmVyUHJvamVjdCBzZXJ2ZXJQcm9qZWN0KSB7Ci0JCXRoaXMuc2VydmVyUHJvamVjdCA9IHNlcnZlclByb2plY3Q7Ci0JfQorICAgIHByb3RlY3RlZCBQcm9qZWN0RmlsZUNvbnRhaW5lcihTZXJ2ZXJQcm9qZWN0IHNlcnZlclByb2plY3QpIHsKKyAgICAgICAgdGhpcy5zZXJ2ZXJQcm9qZWN0ID0gc2VydmVyUHJvamVjdDsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlRm9sZGVyKElGb2xkZXIgZm9sZGVyKSB7Ci0JCUlDb250YWluZXIgcGFyZW50ID0gZm9sZGVyLmdldFBhcmVudCgpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJY3JlYXRlRm9sZGVyKChJRm9sZGVyKSBwYXJlbnQpOwotCQl9Ci0JCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoCi0JCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQkiUHJvYmxlbSBvY2N1cnJlZCB3aGlsZSBtYW5hZ2luZyBzZXJ2ZXIgcHJvamVjdC4iLCBlKSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUZvbGRlcihJRm9sZGVyIGZvbGRlcikgeworICAgICAgICBJQ29udGFpbmVyIHBhcmVudCA9IGZvbGRlci5nZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKyAgICAgICAgICAgIGNyZWF0ZUZvbGRlcigoSUZvbGRlcikgcGFyZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvbGRlci5leGlzdHMoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAiUHJvYmxlbSBvY2N1cnJlZCB3aGlsZSBtYW5hZ2luZyBzZXJ2ZXIgcHJvamVjdC4iLCBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb2plY3RzLklTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyI2dldE1lbWJlcnMoKQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRNZW1iZXJzKCkgewotCQlyZXR1cm4gZ2V0RmlsZVJlZmVyZW5jZXMoKTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm9qZWN0cy5JU2VydmVyUHJvamVjdENvbnRhaW5lciNnZXRNZW1iZXJzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0TWVtYmVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldEZpbGVSZWZlcmVuY2VzKCk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm9qZWN0cy5JU2VydmVyUHJvamVjdENvbnRhaW5lciNnZXRTZXJ2ZXIoKQotCSAqLwotCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpIHsKLQkJcmV0dXJuIGdldFNlcnZlclByb2plY3QoKS5nZXRTZXJ2ZXIoKTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm9qZWN0cy5JU2VydmVyUHJvamVjdENvbnRhaW5lciNnZXRTZXJ2ZXIoKQorICAgICAqLworICAgIHB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpIHsKKyAgICAgICAgcmV0dXJuIGdldFNlcnZlclByb2plY3QoKS5nZXRTZXJ2ZXIoKTsKKyAgICB9CiAKLQlwdWJsaWMgUHJvamVjdEZpbGVSZWZlcmVuY2VbXSBnZXRGaWxlUmVmZXJlbmNlcygpIHsKLQkJaWYgKGZpbGVSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZpbGVSZWZlcmVuY2VzID0gY3JlYXRlRmlsZVJlZmVyZW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gZmlsZVJlZmVyZW5jZXM7Ci0JfQorICAgIHB1YmxpYyBQcm9qZWN0RmlsZVJlZmVyZW5jZVtdIGdldEZpbGVSZWZlcmVuY2VzKCkgeworICAgICAgICBpZiAodGhpcy5maWxlUmVmZXJlbmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmZpbGVSZWZlcmVuY2VzID0gY3JlYXRlRmlsZVJlZmVyZW5jZXMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5maWxlUmVmZXJlbmNlczsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJvamVjdEZpbGVSZWZlcmVuY2VbXSBjcmVhdGVGaWxlUmVmZXJlbmNlcygpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBQcm9qZWN0RmlsZVJlZmVyZW5jZVtdIGNyZWF0ZUZpbGVSZWZlcmVuY2VzKCk7CiAKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUZvbGRlciBnZXRSb290Rm9sZGVyKCk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IElGb2xkZXIgZ2V0Um9vdEZvbGRlcigpOwogCi0JcHVibGljIFNlcnZlclByb2plY3QgZ2V0U2VydmVyUHJvamVjdCgpIHsKLQkJcmV0dXJuIHNlcnZlclByb2plY3Q7Ci0JfQorICAgIHB1YmxpYyBTZXJ2ZXJQcm9qZWN0IGdldFNlcnZlclByb2plY3QoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNlcnZlclByb2plY3Q7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvamVjdHMvUHJvamVjdEZpbGVSZWZlcmVuY2UuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb2plY3RzL1Byb2plY3RGaWxlUmVmZXJlbmNlLmphdmEKaW5kZXggYjUzOWMzMS4uNTZhM2M5NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvamVjdHMvUHJvamVjdEZpbGVSZWZlcmVuY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm9qZWN0cy9Qcm9qZWN0RmlsZVJlZmVyZW5jZS5qYXZhCkBAIC0yNiw2MSArMjYsNjAgQEAKICAqLwogcHVibGljIGNsYXNzIFByb2plY3RGaWxlUmVmZXJlbmNlIGltcGxlbWVudHMgSVNlcnZlclByb2plY3RBcnRlZmFjdCwgSUFkYXB0YWJsZSB7CiAKLQlQcm9qZWN0RmlsZUNvbnRhaW5lciBjb250YWluZXI7CisgICAgUHJvamVjdEZpbGVDb250YWluZXIgY29udGFpbmVyOwogCi0JSUxvY2FsQXJ0ZWZhY3QgbGlicmFyeTsKKyAgICBJTG9jYWxBcnRlZmFjdCBsaWJyYXJ5OwogCi0JcHJpdmF0ZSBmaW5hbCBGaWxlIHJ1bnRpbWVGaWxlOworICAgIHByaXZhdGUgZmluYWwgRmlsZSBydW50aW1lRmlsZTsKIAotCXByaXZhdGUgZmluYWwgSUZpbGUgd29ya3NwYWNlRmlsZTsKKyAgICBwcml2YXRlIGZpbmFsIElGaWxlIHdvcmtzcGFjZUZpbGU7CiAKLQlwdWJsaWMgUHJvamVjdEZpbGVSZWZlcmVuY2UoUHJvamVjdEZpbGVDb250YWluZXIgY29udGFpbmVyLCBJTG9jYWxBcnRlZmFjdCBhcnRlZmFjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQkJdGhpcy5saWJyYXJ5ID0gYXJ0ZWZhY3Q7CisgICAgcHVibGljIFByb2plY3RGaWxlUmVmZXJlbmNlKFByb2plY3RGaWxlQ29udGFpbmVyIGNvbnRhaW5lciwgSUxvY2FsQXJ0ZWZhY3QgYXJ0ZWZhY3QpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgIHRoaXMubGlicmFyeSA9IGFydGVmYWN0OwogCi0JCXJ1bnRpbWVGaWxlID0gYXJ0ZWZhY3QuZ2V0RmlsZSgpOwotCQlTdHJpbmcgYXJ0ZWZhY3RSZWxhdGl2ZSA9IHJ1bnRpbWVGaWxlLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoCi0JCQkJKChMb2NhbEFydGVmYWN0U2V0KSBhcnRlZmFjdC5nZXRTZXQoKSkuZ2V0RmlsZSgpLmdldEFic29sdXRlUGF0aCgpLCAiIik7Ci0JCXdvcmtzcGFjZUZpbGUgPSBjb250YWluZXIuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUoYXJ0ZWZhY3RSZWxhdGl2ZSk7Ci0JCXRyeSB7Ci0JCQlydW50aW1lRmlsZS5zZXRSZWFkT25seSgpOwotCQkJd29ya3NwYWNlRmlsZS5jcmVhdGVMaW5rKG5ldyBQYXRoKHJ1bnRpbWVGaWxlLmdldEFic29sdXRlUGF0aCgpKSwgSVJlc291cmNlLlJFUExBQ0UsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZlclByb2plY3RNYW5hZ2VyLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJfQorICAgICAgICB0aGlzLnJ1bnRpbWVGaWxlID0gYXJ0ZWZhY3QuZ2V0RmlsZSgpOworICAgICAgICBTdHJpbmcgYXJ0ZWZhY3RSZWxhdGl2ZSA9IHRoaXMucnVudGltZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZSgoKExvY2FsQXJ0ZWZhY3RTZXQpIGFydGVmYWN0LmdldFNldCgpKS5nZXRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCksICIiKTsKKyAgICAgICAgdGhpcy53b3Jrc3BhY2VGaWxlID0gY29udGFpbmVyLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKGFydGVmYWN0UmVsYXRpdmUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5ydW50aW1lRmlsZS5zZXRSZWFkT25seSgpOworICAgICAgICAgICAgdGhpcy53b3Jrc3BhY2VGaWxlLmNyZWF0ZUxpbmsobmV3IFBhdGgodGhpcy5ydW50aW1lRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIElSZXNvdXJjZS5SRVBMQUNFLCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTZXJ2ZXJQcm9qZWN0TWFuYWdlci5oYW5kbGVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb2plY3RzLklTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QjZ2V0Q29udGFpbmVyKCkKLQkgKi8KLQlwdWJsaWMgSVNlcnZlclByb2plY3RDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb2plY3RzLklTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QjZ2V0Q29udGFpbmVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgSVNlcnZlclByb2plY3RDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXI7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm9qZWN0cy5JU2VydmVyUHJvamVjdEFydGVmYWN0I2dldEFydGVmYWN0KCkKLQkgKi8KLQlwdWJsaWMgSUxvY2FsQXJ0ZWZhY3QgZ2V0QXJ0ZWZhY3QoKSB7Ci0JCXJldHVybiBsaWJyYXJ5OwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb2plY3RzLklTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QjZ2V0QXJ0ZWZhY3QoKQorICAgICAqLworICAgIHB1YmxpYyBJTG9jYWxBcnRlZmFjdCBnZXRBcnRlZmFjdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGlicmFyeTsKKyAgICB9CiAKLQlwdWJsaWMgRmlsZSBnZXRSdW50aW1lRmlsZSgpIHsKLQkJcmV0dXJuIHJ1bnRpbWVGaWxlOwotCX0KKyAgICBwdWJsaWMgRmlsZSBnZXRSdW50aW1lRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucnVudGltZUZpbGU7CisgICAgfQogCi0JcHVibGljIElGaWxlIGdldFdvcmtzcGFjZUZpbGUoKSB7Ci0JCXJldHVybiB3b3Jrc3BhY2VGaWxlOwotCX0KKyAgICBwdWJsaWMgSUZpbGUgZ2V0V29ya3NwYWNlRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMud29ya3NwYWNlRmlsZTsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyID09IElGaWxlLmNsYXNzKSB7Ci0JCQlyZXR1cm4gd29ya3NwYWNlRmlsZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeworICAgICAgICBpZiAoYWRhcHRlciA9PSBJRmlsZS5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMud29ya3NwYWNlRmlsZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm9qZWN0cy9TZXJ2ZXJQcm9qZWN0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm9qZWN0cy9TZXJ2ZXJQcm9qZWN0LmphdmEKaW5kZXggY2QyNzNhOC4uYWM1YjIxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvamVjdHMvU2VydmVyUHJvamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb2plY3RzL1NlcnZlclByb2plY3QuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm9qZWN0czsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTQ4LDI3MCArNDksMjY5IEBACiAgKiBNYW5hZ2VzIGEgc2VydmVyIHByb2plY3QgZm9yIGEgVmlyZ28gc2VydmVyLiBUaGUgc2VydmVyIHByb2plY3QgYWN0cyBhcyBhIGtpbmQgb2YgcHJveHkgc2VydmVyLCBhbGxvd2luZyB1cyB0bwogICogdHJhbnNwYXJlbnRseSBzdXBwb3J0IFVJIC0tIGFuZCBldmVudHVhbGx5IG90aGVyIGZlYXR1cmVzIC0tIGxldmVyYWdpbmcgZXhpc3RpbmcgRWNsaXBzZSBJREUgY2FwYWJpbGl0aWVzIHN1Y2ggYXMgSkRUCiAgKiBhbmQgUERFIHN1cHBvcnQuIFRoZXJlIHNob3VsZCBiZSBvbmUgYW5kIG9ubHkgb25lIHNlcnZlciBwcm9qZWN0IGZvciBhIGdpdmVuIHNlcnZlci4KLSAqIAorICoKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCiAgKiBAYXV0aG9yIExlbyBEb3MgU2FudG9zCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJQcm9qZWN0IHsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9QUk9KRUNUX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLm1hbmFnZWRQcm9qZWN0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfUFJPSkVDVF9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5tYW5hZ2VkUHJvamVjdCI7CiAKLQlmaW5hbCBJU2VydmVyIHNlcnZlcjsKKyAgICBmaW5hbCBJU2VydmVyIHNlcnZlcjsKIAotCUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OworICAgIEphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwogCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OworICAgIHByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKIAotCXByaXZhdGUgTGlzdDxJU2VydmVyUHJvamVjdENvbnRhaW5lcj4gY29udGFpbmVyczsKKyAgICBwcml2YXRlIExpc3Q8SVNlcnZlclByb2plY3RDb250YWluZXI+IGNvbnRhaW5lcnM7CiAKLQlwcml2YXRlIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBsaWJyYXJ5RW50cmllczsKKyAgICBwcml2YXRlIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBsaWJyYXJ5RW50cmllczsKIAotCXByaXZhdGUgTGlzdDxBcnRlZmFjdFNldD4gYXJ0ZWZhY3RTZXRzOworICAgIHByaXZhdGUgTGlzdDxBcnRlZmFjdFNldD4gYXJ0ZWZhY3RTZXRzOwogCi0JcHJpdmF0ZSBNYXA8QXJ0ZWZhY3RTZXQsIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyPiBwcm9qZWN0Q29udGFpbmVyRm9yQXJ0ZWZhY3RTZXQ7CisgICAgcHJpdmF0ZSBNYXA8QXJ0ZWZhY3RTZXQsIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyPiBwcm9qZWN0Q29udGFpbmVyRm9yQXJ0ZWZhY3RTZXQ7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfV09SS1NQQUNFX0RJUiA9ICJsb2dzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfV09SS1NQQUNFX0RJUiA9ICJsb2dzIjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfRElSID0gInByb3BlcnRpZXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfRElSID0gInByb3BlcnRpZXMiOwogCi0JcHVibGljIFNlcnZlclByb2plY3QoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCXVwZGF0ZVdvcmtzcGFjZVByb2plY3QoKTsKLQl9CisgICAgcHVibGljIFNlcnZlclByb2plY3QoSVNlcnZlciBzZXJ2ZXIpIHsKKyAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgICAgIHVwZGF0ZVdvcmtzcGFjZVByb2plY3QoKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl1cGRhdGVXb3Jrc3BhY2VQcm9qZWN0KCk7CisgICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKKyAgICAgICAgdXBkYXRlV29ya3NwYWNlUHJvamVjdCgpOwogCi0JCWNsZWFyQXJ0ZWZhY3RzKCk7CisgICAgICAgIGNsZWFyQXJ0ZWZhY3RzKCk7CiAKLQkJaWYgKGlzUnVudGltZUV4aXN0cygpKSB7Ci0JCQkvL1RPRE8gd2UgbmVlZCBhIG1vcmUgZWZmaWNpZW50IHdheSBvZiB1cGRhdGluZyB0aGlzCi0JCQljbGVhckZpbGVzKCk7CisgICAgICAgIGlmIChpc1J1bnRpbWVFeGlzdHMoKSkgeworICAgICAgICAgICAgLy8gVE9ETyB3ZSBuZWVkIGEgbW9yZSBlZmZpY2llbnQgd2F5IG9mIHVwZGF0aW5nIHRoaXMKKyAgICAgICAgICAgIGNsZWFyRmlsZXMoKTsKIAotCQkJcmVmcmVzaEFydGVmYWN0cygpOworICAgICAgICAgICAgcmVmcmVzaEFydGVmYWN0cygpOwogCi0JCQlyZWZyZXNoRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgICAgIHJlZnJlc2hEaXJlY3RvcmllcygpOwogCi0JCQl0cnkgewotCQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aCgKLQkJCQkJCWdldExpYnJhcnlFbnRyaWVzKCkudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2dldExpYnJhcnlFbnRyaWVzKCkuc2l6ZSgpXSksIG51bGwpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlTZXJ2ZXJQcm9qZWN0TWFuYWdlci5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoaXMuamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGdldExpYnJhcnlFbnRyaWVzKCkudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W2dldExpYnJhcnlFbnRyaWVzKCkuc2l6ZSgpXSksIG51bGwpOworICAgICAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9qZWN0TWFuYWdlci5oYW5kbGVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CiAKLQkJfQotCX0KKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHJlZnJlc2hBcnRlZmFjdHMoKSB7Ci0JCUFydGVmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gUmVwb3NpdG9yeVV0aWxzLmdldFJlcG9zaXRvcnlDb250ZW50cyhzZXJ2ZXIuZ2V0UnVudGltZSgpKTsKLQkJcmVwb3NpdG9yeS5zZXRTZXJ2ZXIoc2VydmVyKTsKLQkJTWFwPEZpbGUsIEFydGVmYWN0UmVwb3NpdG9yeT4gc2V0Rm9yRmlsZSA9IG5ldyBIYXNoTWFwPEZpbGUsIEFydGVmYWN0UmVwb3NpdG9yeT4oKTsKKyAgICBwdWJsaWMgdm9pZCByZWZyZXNoQXJ0ZWZhY3RzKCkgeworICAgICAgICBBcnRlZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IFJlcG9zaXRvcnlVdGlscy5nZXRSZXBvc2l0b3J5Q29udGVudHModGhpcy5zZXJ2ZXIuZ2V0UnVudGltZSgpKTsKKyAgICAgICAgcmVwb3NpdG9yeS5zZXRTZXJ2ZXIodGhpcy5zZXJ2ZXIpOworICAgICAgICBNYXA8RmlsZSwgQXJ0ZWZhY3RSZXBvc2l0b3J5PiBzZXRGb3JGaWxlID0gbmV3IEhhc2hNYXA8RmlsZSwgQXJ0ZWZhY3RSZXBvc2l0b3J5PigpOwogCi0JCWZvciAoSUFydGVmYWN0IGJ1bmRsZSA6IHJlcG9zaXRvcnkuZ2V0QWxsQXJ0ZWZhY3RzKCkuZ2V0QXJ0ZWZhY3RzKCkpIHsKLQkJCWlmIChidW5kbGUgaW5zdGFuY2VvZiBJTG9jYWxBcnRlZmFjdCkgewotCQkJCUZpbGUgZmlsZSA9ICgoSUxvY2FsQXJ0ZWZhY3QpIGJ1bmRsZSkuZ2V0RmlsZSgpLmdldFBhcmVudEZpbGUoKTsKLQkJCQlpZiAoZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0TmFtZSgpLmVxdWFscygic3Vic3lzdGVtcyIpKSB7Ci0JCQkJCWZpbGUgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQl9Ci0JCQkJaWYgKHNldEZvckZpbGUuY29udGFpbnNLZXkoZmlsZSkpIHsKLQkJCQkJc2V0Rm9yRmlsZS5nZXQoZmlsZSkuYWRkKGJ1bmRsZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXJ0ZWZhY3RSZXBvc2l0b3J5IGxvY2FsUmVwb3NpdG9yeSA9IG5ldyBMb2NhbEFydGVmYWN0UmVwb3NpdG9yeShmaWxlKTsKLQkJCQkJbG9jYWxSZXBvc2l0b3J5LnNldFNlcnZlcihzZXJ2ZXIpOwotCQkJCQlsb2NhbFJlcG9zaXRvcnkuYWRkKGJ1bmRsZSk7Ci0JCQkJCXNldEZvckZpbGUucHV0KGZpbGUsIGxvY2FsUmVwb3NpdG9yeSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZvciAoQXJ0ZWZhY3RSZXBvc2l0b3J5IHJlcG9zIDogc2V0Rm9yRmlsZS52YWx1ZXMoKSkgewotCQkJaWYgKHJlcG9zLmdldEJ1bmRsZVNldCgpLmdldEFydGVmYWN0cygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKSB7Ci0JCQkJYXJ0ZWZhY3RTZXRzLmFkZChyZXBvcy5nZXRCdW5kbGVTZXQoKSk7Ci0JCQl9Ci0JCQlpZiAocmVwb3MuZ2V0TGlicmFyeVNldCgpLmdldEFydGVmYWN0cygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKSB7Ci0JCQkJYXJ0ZWZhY3RTZXRzLmFkZChyZXBvcy5nZXRMaWJyYXJ5U2V0KCkpOwotCQkJfQotCQl9CisgICAgICAgIGZvciAoSUFydGVmYWN0IGJ1bmRsZSA6IHJlcG9zaXRvcnkuZ2V0QWxsQXJ0ZWZhY3RzKCkuZ2V0QXJ0ZWZhY3RzKCkpIHsKKyAgICAgICAgICAgIGlmIChidW5kbGUgaW5zdGFuY2VvZiBJTG9jYWxBcnRlZmFjdCkgeworICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9ICgoSUxvY2FsQXJ0ZWZhY3QpIGJ1bmRsZSkuZ2V0RmlsZSgpLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0TmFtZSgpLmVxdWFscygic3Vic3lzdGVtcyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNldEZvckZpbGUuY29udGFpbnNLZXkoZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Rm9yRmlsZS5nZXQoZmlsZSkuYWRkKGJ1bmRsZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQXJ0ZWZhY3RSZXBvc2l0b3J5IGxvY2FsUmVwb3NpdG9yeSA9IG5ldyBMb2NhbEFydGVmYWN0UmVwb3NpdG9yeShmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxSZXBvc2l0b3J5LnNldFNlcnZlcih0aGlzLnNlcnZlcik7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsUmVwb3NpdG9yeS5hZGQoYnVuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0Rm9yRmlsZS5wdXQoZmlsZSwgbG9jYWxSZXBvc2l0b3J5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChBcnRlZmFjdFJlcG9zaXRvcnkgcmVwb3MgOiBzZXRGb3JGaWxlLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZiAocmVwb3MuZ2V0QnVuZGxlU2V0KCkuZ2V0QXJ0ZWZhY3RzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmFydGVmYWN0U2V0cy5hZGQocmVwb3MuZ2V0QnVuZGxlU2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlcG9zLmdldExpYnJhcnlTZXQoKS5nZXRBcnRlZmFjdHMoKS5pdGVyYXRvcigpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHRoaXMuYXJ0ZWZhY3RTZXRzLmFkZChyZXBvcy5nZXRMaWJyYXJ5U2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJZm9yIChBcnRlZmFjdFNldCBhcnRlZmFjdFNldCA6IGFydGVmYWN0U2V0cykgewotCQkJaWYgKGFydGVmYWN0U2V0IGluc3RhbmNlb2YgTG9jYWxBcnRlZmFjdFNldCkgewotCQkJCUxvY2FsQXJ0ZWZhY3RTZXQgbG9jYWxTZXQgPSAoTG9jYWxBcnRlZmFjdFNldCkgYXJ0ZWZhY3RTZXQ7Ci0JCQkJaWYgKGFydGVmYWN0U2V0LmdldEFydGVmYWN0VHlwZSgpID09IEFydGVmYWN0VHlwZS5CVU5ETEUpIHsKLQkJCQkJUHJvamVjdEJ1bmRsZUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgUHJvamVjdEJ1bmRsZUNvbnRhaW5lcih0aGlzLCBsb2NhbFNldCk7Ci0JCQkJCWNvbnRhaW5lcnMuYWRkKGNvbnRhaW5lcik7Ci0JCQkJCXByb2plY3RDb250YWluZXJGb3JBcnRlZmFjdFNldC5wdXQobG9jYWxTZXQsIGNvbnRhaW5lcik7Ci0JCQkJfSBlbHNlIGlmIChhcnRlZmFjdFNldC5nZXRBcnRlZmFjdFR5cGUoKSA9PSBBcnRlZmFjdFR5cGUuTElCUkFSWSkgewotCQkJCQlQcm9qZWN0RmlsZUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQXJ0ZWZhY3RQcm9qZWN0RmlsZUNvbnRhaW5lcih0aGlzLCBsb2NhbFNldCk7Ci0JCQkJCWNvbnRhaW5lcnMuYWRkKGNvbnRhaW5lcik7Ci0JCQkJCXByb2plY3RDb250YWluZXJGb3JBcnRlZmFjdFNldC5wdXQobG9jYWxTZXQsIGNvbnRhaW5lcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICBmb3IgKEFydGVmYWN0U2V0IGFydGVmYWN0U2V0IDogdGhpcy5hcnRlZmFjdFNldHMpIHsKKyAgICAgICAgICAgIGlmIChhcnRlZmFjdFNldCBpbnN0YW5jZW9mIExvY2FsQXJ0ZWZhY3RTZXQpIHsKKyAgICAgICAgICAgICAgICBMb2NhbEFydGVmYWN0U2V0IGxvY2FsU2V0ID0gKExvY2FsQXJ0ZWZhY3RTZXQpIGFydGVmYWN0U2V0OworICAgICAgICAgICAgICAgIGlmIChhcnRlZmFjdFNldC5nZXRBcnRlZmFjdFR5cGUoKSA9PSBBcnRlZmFjdFR5cGUuQlVORExFKSB7CisgICAgICAgICAgICAgICAgICAgIFByb2plY3RCdW5kbGVDb250YWluZXIgY29udGFpbmVyID0gbmV3IFByb2plY3RCdW5kbGVDb250YWluZXIodGhpcywgbG9jYWxTZXQpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lcnMuYWRkKGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdENvbnRhaW5lckZvckFydGVmYWN0U2V0LnB1dChsb2NhbFNldCwgY29udGFpbmVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFydGVmYWN0U2V0LmdldEFydGVmYWN0VHlwZSgpID09IEFydGVmYWN0VHlwZS5MSUJSQVJZKSB7CisgICAgICAgICAgICAgICAgICAgIFByb2plY3RGaWxlQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBBcnRlZmFjdFByb2plY3RGaWxlQ29udGFpbmVyKHRoaXMsIGxvY2FsU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXJzLmFkZChjb250YWluZXIpOworICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RDb250YWluZXJGb3JBcnRlZmFjdFNldC5wdXQobG9jYWxTZXQsIGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgcmVmcmVzaERpcmVjdG9yaWVzKCkgewotCQl0cnkgewotCQkJSVNlcnZlclJ1bnRpbWVQcm92aWRlciBwcm92aWRlciA9IFJ1bnRpbWVQcm92aWRlcnMuZ2V0UnVudGltZVByb3ZpZGVyKGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKSk7Ci0JCQlmb3IgKFN0cmluZyBydW50aW1lRGlyIDogcHJvdmlkZXIuZ2V0U2VydmVyUHJvcGVydGllc0RpcmVjdG9yaWVzKCkpIHsKLQkJCQlzeW5jaHJvbml6ZVJ1bnRpbWVEaXJlY3RvcnkoUFJPUEVSVElFU19ESVIsIHJ1bnRpbWVEaXIpOwotCQkJfQotCQkJZm9yIChTdHJpbmcgcnVudGltZURpciA6IHByb3ZpZGVyLmdldFNlcnZlckxvZ0RpcmVjdG9yaWVzKCkpIHsKLQkJCQlzeW5jaHJvbml6ZVJ1bnRpbWVEaXJlY3RvcnkoTE9HX1dPUktTUEFDRV9ESVIsIHJ1bnRpbWVEaXIpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hEaXJlY3RvcmllcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElTZXJ2ZXJSdW50aW1lUHJvdmlkZXIgcHJvdmlkZXIgPSBSdW50aW1lUHJvdmlkZXJzLmdldFJ1bnRpbWVQcm92aWRlcihnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgcnVudGltZURpciA6IHByb3ZpZGVyLmdldFNlcnZlclByb3BlcnRpZXNEaXJlY3RvcmllcygpKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVSdW50aW1lRGlyZWN0b3J5KFBST1BFUlRJRVNfRElSLCBydW50aW1lRGlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHJ1bnRpbWVEaXIgOiBwcm92aWRlci5nZXRTZXJ2ZXJMb2dEaXJlY3RvcmllcygpKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVSdW50aW1lRGlyZWN0b3J5KExPR19XT1JLU1BBQ0VfRElSLCBydW50aW1lRGlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KIAotCXZvaWQgc3luY2hyb25pemVSdW50aW1lRGlyZWN0b3J5KFN0cmluZyB3b3Jrc3BhY2VEaXJlY3RvcnksIFN0cmluZyBydW50aW1lRGlyZWN0b3J5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGb2xkZXIgZm9sZGVyID0gZ2V0V29ya3NwYWNlUHJvamVjdCgpLmdldEZvbGRlcih3b3Jrc3BhY2VEaXJlY3RvcnkgKyAiLyIgKyBydW50aW1lRGlyZWN0b3J5KTsKLQkJUHJvamVjdEZpbGVDb250YWluZXIuY3JlYXRlRm9sZGVyKGZvbGRlcik7Ci0JCUZpbGUgcnVudGltZUZvbGRlciA9IGdldFNlcnZlcigpLmdldFJ1bnRpbWUoKS5nZXRMb2NhdGlvbigpLmFwcGVuZChydW50aW1lRGlyZWN0b3J5KS50b0ZpbGUoKTsKLQkJRmlsZVtdIGZpbGVzID0gcnVudGltZUZvbGRlci5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoRmlsZSBydW50aW1lRmlsZSA6IGZpbGVzKSB7Ci0JCQkJbGlua0ZpbGUoZm9sZGVyLCBydW50aW1lRmlsZSwgcnVudGltZURpcmVjdG9yeSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgdm9pZCBzeW5jaHJvbml6ZVJ1bnRpbWVEaXJlY3RvcnkoU3RyaW5nIHdvcmtzcGFjZURpcmVjdG9yeSwgU3RyaW5nIHJ1bnRpbWVEaXJlY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgSUZvbGRlciBmb2xkZXIgPSBnZXRXb3Jrc3BhY2VQcm9qZWN0KCkuZ2V0Rm9sZGVyKHdvcmtzcGFjZURpcmVjdG9yeSArICIvIiArIHJ1bnRpbWVEaXJlY3RvcnkpOworICAgICAgICBQcm9qZWN0RmlsZUNvbnRhaW5lci5jcmVhdGVGb2xkZXIoZm9sZGVyKTsKKyAgICAgICAgRmlsZSBydW50aW1lRm9sZGVyID0gZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpLmdldExvY2F0aW9uKCkuYXBwZW5kKHJ1bnRpbWVEaXJlY3RvcnkpLnRvRmlsZSgpOworICAgICAgICBGaWxlW10gZmlsZXMgPSBydW50aW1lRm9sZGVyLmxpc3RGaWxlcygpOworICAgICAgICBpZiAoZmlsZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChGaWxlIHJ1bnRpbWVGaWxlIDogZmlsZXMpIHsKKyAgICAgICAgICAgICAgICBsaW5rRmlsZShmb2xkZXIsIHJ1bnRpbWVGaWxlLCBydW50aW1lRGlyZWN0b3J5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIGxpbmtGaWxlKElGb2xkZXIgZm9sZGVyLCBGaWxlIHJ1bnRpbWVGaWxlLCBTdHJpbmcgcnVudGltZURpcmVjdG9yeSkgewotCQlpZiAoIXJ1bnRpbWVGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUlGaWxlIHdvcmtzcGFjZUZpbGUgPSBmb2xkZXIuZ2V0RmlsZShydW50aW1lRmlsZS5nZXROYW1lKCkpOwotCQkJdHJ5IHsKLQkJCQl3b3Jrc3BhY2VGaWxlLmNyZWF0ZUxpbmsobmV3IFBhdGgocnVudGltZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLCBJUmVzb3VyY2UuUkVQTEFDRSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlTZXJ2ZXJQcm9qZWN0TWFuYWdlci5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgbGlua0ZpbGUoSUZvbGRlciBmb2xkZXIsIEZpbGUgcnVudGltZUZpbGUsIFN0cmluZyBydW50aW1lRGlyZWN0b3J5KSB7CisgICAgICAgIGlmICghcnVudGltZUZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgSUZpbGUgd29ya3NwYWNlRmlsZSA9IGZvbGRlci5nZXRGaWxlKHJ1bnRpbWVGaWxlLmdldE5hbWUoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdvcmtzcGFjZUZpbGUuY3JlYXRlTGluayhuZXcgUGF0aChydW50aW1lRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIElSZXNvdXJjZS5SRVBMQUNFLCBudWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFNlcnZlclByb2plY3RNYW5hZ2VyLmhhbmRsZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXByb3RlY3RlZCBib29sZWFuIGlzUnVudGltZUV4aXN0cygpIHsKLQkJU3RyaW5nIGhvbWUgPSBTZXJ2ZXJVdGlscy5nZXRTZXJ2ZXJIb21lKHNlcnZlci5nZXRSdW50aW1lKCkpOwotCQlpZiAoaG9tZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBGaWxlKGhvbWUpLmV4aXN0cygpOwotCX0KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1J1bnRpbWVFeGlzdHMoKSB7CisgICAgICAgIFN0cmluZyBob21lID0gU2VydmVyVXRpbHMuZ2V0U2VydmVySG9tZSh0aGlzLnNlcnZlci5nZXRSdW50aW1lKCkpOworICAgICAgICBpZiAoaG9tZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGhvbWUpLmV4aXN0cygpOworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIGNsZWFyRmlsZXMoKSB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBwcm9qZWN0Lm1lbWJlcnMoKSkgewotCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJCQlyZXNvdXJjZS5zZXRSZWFkT25seShmYWxzZSk7Ci0JCQkJCQlyZXNvdXJjZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlTZXJ2ZXJQcm9qZWN0TWFuYWdlci5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJGaWxlcygpIHsKKyAgICAgICAgaWYgKHRoaXMucHJvamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvciAoSVJlc291cmNlIHJlc291cmNlIDogdGhpcy5wcm9qZWN0Lm1lbWJlcnMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5zZXRSZWFkT25seShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5kZWxldGUodHJ1ZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9qZWN0TWFuYWdlci5oYW5kbGVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckFydGVmYWN0cygpIHsKLQkJbGlicmFyeUVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKLQkJY29udGFpbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlcnZlclByb2plY3RDb250YWluZXI+KCk7Ci0JCWFydGVmYWN0U2V0cyA9IG5ldyBBcnJheUxpc3Q8QXJ0ZWZhY3RTZXQ+KCk7Ci0JCXByb2plY3RDb250YWluZXJGb3JBcnRlZmFjdFNldCA9IG5ldyBIYXNoTWFwPEFydGVmYWN0U2V0LCBJU2VydmVyUHJvamVjdENvbnRhaW5lcj4oKTsKLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgY2xlYXJBcnRlZmFjdHMoKSB7CisgICAgICAgIHRoaXMubGlicmFyeUVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKKyAgICAgICAgdGhpcy5jb250YWluZXJzID0gbmV3IEFycmF5TGlzdDxJU2VydmVyUHJvamVjdENvbnRhaW5lcj4oKTsKKyAgICAgICAgdGhpcy5hcnRlZmFjdFNldHMgPSBuZXcgQXJyYXlMaXN0PEFydGVmYWN0U2V0PigpOworICAgICAgICB0aGlzLnByb2plY3RDb250YWluZXJGb3JBcnRlZmFjdFNldCA9IG5ldyBIYXNoTWFwPEFydGVmYWN0U2V0LCBJU2VydmVyUHJvamVjdENvbnRhaW5lcj4oKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9qZWN0KCkgewotCQlpZiAoaXNSdW50aW1lRXhpc3RzKCkpIHsKLQkJCXVwZGF0ZVdvcmtzcGFjZVByb2plY3QoKTsKLQkJfSBlbHNlIHsKLQkJCWRlbGV0ZVdvcmtzcGFjZVByb2plY3QoKTsKLQkJfQotCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9qZWN0KCkgeworICAgICAgICBpZiAoaXNSdW50aW1lRXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHVwZGF0ZVdvcmtzcGFjZVByb2plY3QoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbGV0ZVdvcmtzcGFjZVByb2plY3QoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXZvaWQgZGVsZXRlV29ya3NwYWNlUHJvamVjdCgpIHsKLQkJSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0V29ya3NwYWNlUHJvamVjdE5hbWUoKTsKLQkJcHJvamVjdCA9IHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCXByb2plY3QuZGVsZXRlKGZhbHNlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVNlcnZlclByb2plY3RNYW5hZ2VyLmhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlwcm9qZWN0ID0gbnVsbDsKLQkJY2xlYXJBcnRlZmFjdHMoKTsKLQl9CisgICAgdm9pZCBkZWxldGVXb3Jrc3BhY2VQcm9qZWN0KCkgeworICAgICAgICBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOworICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBnZXRXb3Jrc3BhY2VQcm9qZWN0TmFtZSgpOworICAgICAgICB0aGlzLnByb2plY3QgPSB3cy5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7CisgICAgICAgIGlmICh0aGlzLnByb2plY3QgIT0gbnVsbCAmJiB0aGlzLnByb2plY3QuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0LmRlbGV0ZShmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9qZWN0TWFuYWdlci5oYW5kbGVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5wcm9qZWN0ID0gbnVsbDsKKyAgICAgICAgY2xlYXJBcnRlZmFjdHMoKTsKKyAgICB9CiAKLQl2b2lkIHVwZGF0ZVdvcmtzcGFjZVByb2plY3QoKSB7Ci0JCWlmIChpc1J1bnRpbWVFeGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFdvcmtzcGFjZVByb2plY3ROYW1lKCk7Ci0JCQkJcHJvamVjdCA9IHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG5ldyBQcm9qZWN0RGVzY3JpcHRpb24oKTsKLQkJCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ldyBTdHJpbmdbXSB7IEphdmFDb3JlLk5BVFVSRV9JRCwgU0VSVkVSX1BST0pFQ1RfSUQgfSk7Ci0JCQkJCWRlc2NyaXB0aW9uLnNldENvbW1lbnQoIkNyZWF0ZWQgYW5kIG1hbmFnZWQgYnkgVmlyZ28gVG9vbGluZy4iKTsKLQkJCQkJZGVzY3JpcHRpb24uc2V0TmFtZShwcm9qZWN0TmFtZSk7Ci0JCQkJCXByb2plY3QuY3JlYXRlKGRlc2NyaXB0aW9uLCBudWxsKTsKLQkJCQl9Ci0JCQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCXByb2plY3Qub3BlbihudWxsKTsKLQkJCQl9CisgICAgdm9pZCB1cGRhdGVXb3Jrc3BhY2VQcm9qZWN0KCkgeworICAgICAgICBpZiAoaXNSdW50aW1lRXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBnZXRXb3Jrc3BhY2VQcm9qZWN0TmFtZSgpOworICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IHdzLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMucHJvamVjdC5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbmV3IFByb2plY3REZXNjcmlwdGlvbigpOworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobmV3IFN0cmluZ1tdIHsgSmF2YUNvcmUuTkFUVVJFX0lELCBTRVJWRVJfUFJPSkVDVF9JRCB9KTsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uc2V0Q29tbWVudCgiQ3JlYXRlZCBhbmQgbWFuYWdlZCBieSBWaXJnbyBUb29saW5nLiIpOworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5zZXROYW1lKHByb2plY3ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0LmNyZWF0ZShkZXNjcmlwdGlvbiwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghdGhpcy5wcm9qZWN0LmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdC5vcGVuKG51bGwpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCWphdmFQcm9qZWN0ID0gKEphdmFQcm9qZWN0KSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlTZXJ2ZXJQcm9qZWN0TWFuYWdlci5oYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgdGhpcy5qYXZhUHJvamVjdCA9IChKYXZhUHJvamVjdCkgSmF2YUNvcmUuY3JlYXRlKHRoaXMucHJvamVjdCk7CisgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9qZWN0TWFuYWdlci5oYW5kbGVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlTdHJpbmcgZ2V0V29ya3NwYWNlUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBzZXJ2ZXIuZ2V0TmFtZSgpICsgIiBTZXJ2ZXIiOwotCX0KKyAgICBTdHJpbmcgZ2V0V29ya3NwYWNlUHJvamVjdE5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNlcnZlci5nZXROYW1lKCkgKyAiIFNlcnZlciI7CisgICAgfQogCi0JcHVibGljIElQcm9qZWN0IGdldFdvcmtzcGFjZVByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KKyAgICBwdWJsaWMgSVByb2plY3QgZ2V0V29ya3NwYWNlUHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvamVjdDsKKyAgICB9CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotCXB1YmxpYyBKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotCX0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorICAgIHB1YmxpYyBKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuamF2YVByb2plY3Q7CisgICAgfQogCi0JcHVibGljIExpc3Q8SVNlcnZlclByb2plY3RDb250YWluZXI+IGdldENvbnRhaW5lcnMoKSB7Ci0JCXJldHVybiBjb250YWluZXJzOwotCX0KKyAgICBwdWJsaWMgTGlzdDxJU2VydmVyUHJvamVjdENvbnRhaW5lcj4gZ2V0Q29udGFpbmVycygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyczsKKyAgICB9CiAKLQlwdWJsaWMgSVNlcnZlclByb2plY3RDb250YWluZXIgZ2V0Q29udGFpbmVyKEFydGVmYWN0U2V0IHNldCkgewotCQlyZXR1cm4gcHJvamVjdENvbnRhaW5lckZvckFydGVmYWN0U2V0LmdldChzZXQpOwotCX0KKyAgICBwdWJsaWMgSVNlcnZlclByb2plY3RDb250YWluZXIgZ2V0Q29udGFpbmVyKEFydGVmYWN0U2V0IHNldCkgeworICAgICAgICByZXR1cm4gdGhpcy5wcm9qZWN0Q29udGFpbmVyRm9yQXJ0ZWZhY3RTZXQuZ2V0KHNldCk7CisgICAgfQogCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KKyAgICBwdWJsaWMgSVNlcnZlciBnZXRTZXJ2ZXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNlcnZlcjsKKyAgICB9CiAKLQlwdWJsaWMgTGlzdDxBcnRlZmFjdFNldD4gZ2V0QXJ0ZWZhY3RTZXRzKCkgewotCQlyZXR1cm4gYXJ0ZWZhY3RTZXRzOwotCX0KKyAgICBwdWJsaWMgTGlzdDxBcnRlZmFjdFNldD4gZ2V0QXJ0ZWZhY3RTZXRzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5hcnRlZmFjdFNldHM7CisgICAgfQogCi0JcHVibGljIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBnZXRMaWJyYXJ5RW50cmllcygpIHsKLQkJcmV0dXJuIGxpYnJhcnlFbnRyaWVzOwotCX0KKyAgICBwdWJsaWMgTGlzdDxJQ2xhc3NwYXRoRW50cnk+IGdldExpYnJhcnlFbnRyaWVzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5saWJyYXJ5RW50cmllczsKKyAgICB9CiAKLQkvKioKLQkgKiBDaGVja3Mgc2VydmVyIHR5cGUgZm9yIHZpcmdvLiBOdWxsIHNhZmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmlyZ28oSVNlcnZlciBzZXJ2ZXIpIHsKLQkJcmV0dXJuIHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKS5lcXVhbHMoU2VydmVyQ29yZVBsdWdpbi5WSVJHT19TRVJWRVJfSUQpOwotCX0KKyAgICAvKioKKyAgICAgKiBDaGVja3Mgc2VydmVyIHR5cGUgZm9yIHZpcmdvLiBOdWxsIHNhZmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmlyZ28oSVNlcnZlciBzZXJ2ZXIpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZlciAhPSBudWxsICYmIHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKS5lcXVhbHMoU2VydmVyQ29yZVBsdWdpbi5WSVJHT19TRVJWRVJfSUQpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgU2VydmVyUHJvamVjdCkgewotCQkJU2VydmVyUHJvamVjdCBvdGhlciA9IChTZXJ2ZXJQcm9qZWN0KSBvYmo7Ci0JCQlyZXR1cm4gb3RoZXIucHJvamVjdC5lcXVhbHMocHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFNlcnZlclByb2plY3QpIHsKKyAgICAgICAgICAgIFNlcnZlclByb2plY3Qgb3RoZXIgPSAoU2VydmVyUHJvamVjdCkgb2JqOworICAgICAgICAgICAgcmV0dXJuIG90aGVyLnByb2plY3QuZXF1YWxzKHRoaXMucHJvamVjdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb2plY3RzL1NlcnZlclByb2plY3RNYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm9qZWN0cy9TZXJ2ZXJQcm9qZWN0TWFuYWdlci5qYXZhCmluZGV4IGY2MDRhNWUuLjY3NDYxODcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb2plY3RzL1NlcnZlclByb2plY3RNYW5hZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvamVjdHMvU2VydmVyUHJvamVjdE1hbmFnZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm9qZWN0czsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtMjUsMTEyICsyNiwxMDcgQEAKIC8qKgogICogVGhlIHNlcnZlciBwcm9qZWN0IG1hbmFnZXIgaXMgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIGV4aXN0aW5nIHNlcnZlciBwcm9qZWN0cyBhbmQgY3JlYXRpbmcgYW5kIGRlc3RvcnlpbmcgdGhlbSBhcwogICogYXBwcm9wcmlhdGUuIFNlcnZlciBQcm9qZWN0cyBhcmUgY3JlYXRlZCBvbiBkZW1hbmQuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgogICovCiBwdWJsaWMgY2xhc3MgU2VydmVyUHJvamVjdE1hbmFnZXIgaW1wbGVtZW50cyBJU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIgewogCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmVyUHJvamVjdE1hbmFnZXIgSU5TVEFOQ0U7CisgICAgcHJpdmF0ZSBzdGF0aWMgU2VydmVyUHJvamVjdE1hbmFnZXIgSU5TVEFOQ0U7CiAKLQlwcml2YXRlIGZpbmFsIE1hcDxJU2VydmVyLCBTZXJ2ZXJQcm9qZWN0PiBwcm9qZWN0Rm9yU2VydmVyID0gbmV3IEhhc2hNYXA8SVNlcnZlciwgU2VydmVyUHJvamVjdD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxJU2VydmVyLCBTZXJ2ZXJQcm9qZWN0PiBwcm9qZWN0Rm9yU2VydmVyID0gbmV3IEhhc2hNYXA8SVNlcnZlciwgU2VydmVyUHJvamVjdD4oKTsKIAotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU2VydmVyUHJvamVjdD4gcHJvamVjdEZvck5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZlclByb2plY3Q+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTZXJ2ZXJQcm9qZWN0PiBwcm9qZWN0Rm9yTmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2VydmVyUHJvamVjdD4oKTsKIAotCXB1YmxpYyBzdGF0aWMgU2VydmVyUHJvamVjdE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBTZXJ2ZXJQcm9qZWN0TWFuYWdlcigpOwotCQkJU2VydmVyQ29yZS5hZGRTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lcihJTlNUQU5DRSk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZlclByb2plY3RNYW5hZ2VyIGdldEluc3RhbmNlKCkgeworICAgICAgICBpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgeworICAgICAgICAgICAgSU5TVEFOQ0UgPSBuZXcgU2VydmVyUHJvamVjdE1hbmFnZXIoKTsKKyAgICAgICAgICAgIFNlcnZlckNvcmUuYWRkU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIoSU5TVEFOQ0UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJTlNUQU5DRTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIGEgcHJvamVjdCBmb3IgdGhlIHByb3ZpZGVkIHNlcnZlci4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmVyCi0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IHNlcnZlcgotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiAgICAgICAgICAgIElmIGEgcHJvamVjdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QsIGNyZWF0ZSBvbmUuCi0JICogQHBhcmFtIHJlZnJlc2gKLQkgKiAgICAgICAgICAgICh1cGRhdGUpIHRoZSBjb250ZW50cyBvZiB0aGUgc2VydmVyIGFzIHdlbGwKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFNlcnZlclByb2plY3QgZ2V0UHJvamVjdChJU2VydmVyIHNlcnZlciwgYm9vbGVhbiBjcmVhdGUsIGJvb2xlYW4gcmVmcmVzaCkgewotCQlpZiAoU2VydmVyUHJvamVjdC5pc1ZpcmdvKHNlcnZlcikpIHsKLQkJCVNlcnZlclByb2plY3Qgc2VydmVyUHJvamVjdCA9IHByb2plY3RGb3JTZXJ2ZXIuZ2V0KHNlcnZlcik7Ci0JCQlpZiAoc2VydmVyUHJvamVjdCA9PSBudWxsICYmIGNyZWF0ZSkgewotCQkJCXNlcnZlclByb2plY3QgPSBuZXcgU2VydmVyUHJvamVjdChzZXJ2ZXIpOwotCQkJCWlmIChzZXJ2ZXJQcm9qZWN0LmdldFdvcmtzcGFjZVByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQkJCXByb2plY3RGb3JTZXJ2ZXIucHV0KHNlcnZlciwgc2VydmVyUHJvamVjdCk7Ci0JCQkJCXByb2plY3RGb3JOYW1lLnB1dChzZXJ2ZXJQcm9qZWN0LmdldFdvcmtzcGFjZVByb2plY3QoKS5nZXROYW1lKCksIHNlcnZlclByb2plY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlcnZlclByb2plY3QgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzZXJ2ZXJQcm9qZWN0ICE9IG51bGwgJiYgcmVmcmVzaCkgewotCQkJCXNlcnZlclByb2plY3QucmVmcmVzaCgpOwotCQkJfQotCQkJcmV0dXJuIHNlcnZlclByb2plY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwcm9qZWN0IGZvciB0aGUgcHJvdmlkZWQgc2VydmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZlciB0aGUgdGFyZ2V0IHNlcnZlcgorICAgICAqIEBwYXJhbSBjcmVhdGUgSWYgYSBwcm9qZWN0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCwgY3JlYXRlIG9uZS4KKyAgICAgKiBAcGFyYW0gcmVmcmVzaCAodXBkYXRlKSB0aGUgY29udGVudHMgb2YgdGhlIHNlcnZlciBhcyB3ZWxsCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTZXJ2ZXJQcm9qZWN0IGdldFByb2plY3QoSVNlcnZlciBzZXJ2ZXIsIGJvb2xlYW4gY3JlYXRlLCBib29sZWFuIHJlZnJlc2gpIHsKKyAgICAgICAgaWYgKFNlcnZlclByb2plY3QuaXNWaXJnbyhzZXJ2ZXIpKSB7CisgICAgICAgICAgICBTZXJ2ZXJQcm9qZWN0IHNlcnZlclByb2plY3QgPSB0aGlzLnByb2plY3RGb3JTZXJ2ZXIuZ2V0KHNlcnZlcik7CisgICAgICAgICAgICBpZiAoc2VydmVyUHJvamVjdCA9PSBudWxsICYmIGNyZWF0ZSkgeworICAgICAgICAgICAgICAgIHNlcnZlclByb2plY3QgPSBuZXcgU2VydmVyUHJvamVjdChzZXJ2ZXIpOworICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJQcm9qZWN0LmdldFdvcmtzcGFjZVByb2plY3QoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdEZvclNlcnZlci5wdXQoc2VydmVyLCBzZXJ2ZXJQcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9qZWN0Rm9yTmFtZS5wdXQoc2VydmVyUHJvamVjdC5nZXRXb3Jrc3BhY2VQcm9qZWN0KCkuZ2V0TmFtZSgpLCBzZXJ2ZXJQcm9qZWN0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJQcm9qZWN0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2VydmVyUHJvamVjdCAhPSBudWxsICYmIHJlZnJlc2gpIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJQcm9qZWN0LnJlZnJlc2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJQcm9qZWN0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgYSBwcm9qZWN0IGZvciB0aGUgc2VydmVyLCB3aXRob3V0IGNyZWF0aW5nIG9yIHJlZnJlaGluZyBpdC4KLQkgKi8KLQlwdWJsaWMgU2VydmVyUHJvamVjdCBnZXRQcm9qZWN0KElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KHNlcnZlciwgZmFsc2UsIGZhbHNlKTsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHByb2plY3QgZm9yIHRoZSBzZXJ2ZXIsIHdpdGhvdXQgY3JlYXRpbmcgb3IgcmVmcmVoaW5nIGl0LgorICAgICAqLworICAgIHB1YmxpYyBTZXJ2ZXJQcm9qZWN0IGdldFByb2plY3QoSVNlcnZlciBzZXJ2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGdldFByb2plY3Qoc2VydmVyLCBmYWxzZSwgZmFsc2UpOworICAgIH0KIAotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVQcm9qZWN0cygpIHsKLQkJTWFwPFN0cmluZywgU2VydmVyUHJvamVjdD4gdW5tYXRjaGVkUHJvamVjdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZlclByb2plY3Q+KHByb2plY3RGb3JOYW1lKTsKLQkJZm9yIChJU2VydmVyIHNlcnZlciA6IFNlcnZlckNvcmUuZ2V0U2VydmVycygpKSB7Ci0JCQlTZXJ2ZXJQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHNlcnZlciwgdHJ1ZSwgdHJ1ZSk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJdW5tYXRjaGVkUHJvamVjdHMucmVtb3ZlKHByb2plY3QuZ2V0V29ya3NwYWNlUHJvamVjdE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChTZXJ2ZXJQcm9qZWN0IG9sZFByb2plY3QgOiB1bm1hdGNoZWRQcm9qZWN0cy52YWx1ZXMoKSkgewotCQkJb2xkUHJvamVjdC5kZWxldGVXb3Jrc3BhY2VQcm9qZWN0KCk7Ci0JCQlwcm9qZWN0Rm9yTmFtZS5yZW1vdmUob2xkUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQl9Ci0JfQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVQcm9qZWN0cygpIHsKKyAgICAgICAgTWFwPFN0cmluZywgU2VydmVyUHJvamVjdD4gdW5tYXRjaGVkUHJvamVjdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNlcnZlclByb2plY3Q+KHRoaXMucHJvamVjdEZvck5hbWUpOworICAgICAgICBmb3IgKElTZXJ2ZXIgc2VydmVyIDogU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCkpIHsKKyAgICAgICAgICAgIFNlcnZlclByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3Qoc2VydmVyLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1bm1hdGNoZWRQcm9qZWN0cy5yZW1vdmUocHJvamVjdC5nZXRXb3Jrc3BhY2VQcm9qZWN0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKFNlcnZlclByb2plY3Qgb2xkUHJvamVjdCA6IHVubWF0Y2hlZFByb2plY3RzLnZhbHVlcygpKSB7CisgICAgICAgICAgICBvbGRQcm9qZWN0LmRlbGV0ZVdvcmtzcGFjZVByb2plY3QoKTsKKyAgICAgICAgICAgIHRoaXMucHJvamVjdEZvck5hbWUucmVtb3ZlKG9sZFByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJIlByb2JsZW0gb2NjdXJyZWQgd2hpbGUgbWFuYWdpbmcgc2VydmVyIHByb2plY3QuIiwgZSkpOwotCX0KKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoCisgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAiUHJvYmxlbSBvY2N1cnJlZCB3aGlsZSBtYW5hZ2luZyBzZXJ2ZXIgcHJvamVjdC4iLCBlKSk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyI3NlcnZlckFkZGVkKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlcnZlckFkZGVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCWdldFByb2plY3Qoc2VydmVyLCB0cnVlLCB0cnVlKTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyI3NlcnZlckFkZGVkKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlcnZlckFkZGVkKElTZXJ2ZXIgc2VydmVyKSB7CisgICAgICAgIGdldFByb2plY3Qoc2VydmVyLCB0cnVlLCB0cnVlKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIjc2VydmVyQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2VydmVyQ2hhbmdlZChJU2VydmVyIHNlcnZlcikgewotCQlpZiAoU2VydmVyUHJvamVjdC5pc1ZpcmdvKHNlcnZlcikpIHsKLQkJCVNlcnZlclByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3Qoc2VydmVyLCBmYWxzZSwgZmFsc2UpOwotCQkJaWYgKHByb2plY3QuZ2V0V29ya3NwYWNlUHJvamVjdCgpID09IG51bGwKLQkJCQkJfHwgIXByb2plY3RGb3JOYW1lLmNvbnRhaW5zS2V5KHByb2plY3QuZ2V0V29ya3NwYWNlUHJvamVjdCgpLmdldE5hbWUoKSkpIHsKLQkJCQkvL1RoZSBwcm9qZWN0IG5hbWUgaGFzIHByb2JhYmx5IGNoYW5nZWQsIHNvIHVwZGF0ZSBldmVyeXRoaW5nCi0JCQkJdXBkYXRlUHJvamVjdHMoKTsKLQkJCX0KLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyTGlmZWN5Y2xlTGlzdGVuZXIjc2VydmVyQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2VydmVyQ2hhbmdlZChJU2VydmVyIHNlcnZlcikgeworICAgICAgICBpZiAoU2VydmVyUHJvamVjdC5pc1ZpcmdvKHNlcnZlcikpIHsKKyAgICAgICAgICAgIFNlcnZlclByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3Qoc2VydmVyLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgaWYgKHByb2plY3QuZ2V0V29ya3NwYWNlUHJvamVjdCgpID09IG51bGwgfHwgIXRoaXMucHJvamVjdEZvck5hbWUuY29udGFpbnNLZXkocHJvamVjdC5nZXRXb3Jrc3BhY2VQcm9qZWN0KCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBwcm9qZWN0IG5hbWUgaGFzIHByb2JhYmx5IGNoYW5nZWQsIHNvIHVwZGF0ZSBldmVyeXRoaW5nCisgICAgICAgICAgICAgICAgdXBkYXRlUHJvamVjdHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJMaWZlY3ljbGVMaXN0ZW5lciNzZXJ2ZXJSZW1vdmVkKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXJ2ZXJSZW1vdmVkKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCVNlcnZlclByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3Qoc2VydmVyKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJcHJvamVjdEZvclNlcnZlci5yZW1vdmUoc2VydmVyKTsKLQkJCXByb2plY3RGb3JOYW1lLnJlbW92ZShwcm9qZWN0LmdldFdvcmtzcGFjZVByb2plY3QoKS5nZXROYW1lKCkpOwotCQkJcHJvamVjdC5kZWxldGVXb3Jrc3BhY2VQcm9qZWN0KCk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlckxpZmVjeWNsZUxpc3RlbmVyI3NlcnZlclJlbW92ZWQob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIpCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNlcnZlclJlbW92ZWQoSVNlcnZlciBzZXJ2ZXIpIHsKKyAgICAgICAgU2VydmVyUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdChzZXJ2ZXIpOworICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnByb2plY3RGb3JTZXJ2ZXIucmVtb3ZlKHNlcnZlcik7CisgICAgICAgICAgICB0aGlzLnByb2plY3RGb3JOYW1lLnJlbW92ZShwcm9qZWN0LmdldFdvcmtzcGFjZVByb2plY3QoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgcHJvamVjdC5kZWxldGVXb3Jrc3BhY2VQcm9qZWN0KCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggODAwZDcwOC4uNDMyMWJkOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtNyw2ICs3LDggQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQpAQCAtODEsMTQgKzgzLDE0IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249NDgKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb249MApAQCAtOTYsNyArOTgsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnk9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTgwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgpAQCAtMTA2LDEyICsxMDgsMTIgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKQEAgLTEyMiwzMCArMTI0LDMxIEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9sYW1iZGFfYm9keT1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9MTIwCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5uZXdfbGluZXNfYXRfYmxvY2tfYm91bmRhcmllcz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5uZXdfbGluZXNfYXRfamF2YWRvY19ib3VuZGFyaWVzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LnByZXNlcnZlX3doaXRlX3NwYWNlX2JldHdlZW5fY29kZV9hbmRfbGluZV9jb21tZW50cz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmRpc2FibGluZ190YWc9QGZvcm1hdHRlclw6b2ZmCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZW5hYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9uCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQpAQCAtMTU5LDcgKzE2Miw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9maWVsZD1pbnNlcnQKQEAgLTE2NywxMCArMTcwLDExIEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWVtYmVyPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21ldGhvZD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYWNrYWdlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3R5cGU9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2xhYmVsPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX3R5cGVfYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKQEAgLTIxOCw2ICsyMjIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfbGFtYmRhX2Fycm93PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydApAQCAtMjk1LDYgKzMwMCw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfbGFtYmRhX2Fycm93PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydApAQCAtMzQ5LDE2ICszNTUsMTcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTEyMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTE1MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9c3BhY2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV9vbl9vZmZfdGFncz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9vcl9vcGVyYXRvcl9tdWx0aWNhdGNoPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX291dGVyX2V4cHJlc3Npb25zX3doZW5fbmVzdGVkPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFGb3JtYXR0ZXI9b3JnLmVjbGlwc2UuamR0LmNvcmUuZGVmYXVsdEphdmFGb3JtYXR0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmluZGV4IDhhY2U2N2EuLjZjOTgwMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpAQCAtMSw3ICsxLDY1IEBACitjbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCitjbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19tZXRob2RzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnNfaW50ZXJmYWNlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfZnVuY3Rpb25hbF9pbnRlcmZhY2VzPWZhbHNlCitjbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKK2NsZWFudXAuY29ycmVjdF9pbmRlbnRhdGlvbj1mYWxzZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQorY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGVfY2hhbmdlc19vbmx5PWZhbHNlCitjbGVhbnVwLmluc2VydF9pbmZlcnJlZF90eXBlX2FyZ3VtZW50cz1mYWxzZQorY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKK2NsZWFudXAubWFrZV90eXBlX2Fic3RyYWN0X2lmX21pc3NpbmdfbWV0aG9kPWZhbHNlCitjbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKK2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQorY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK2NsZWFudXAucmVtb3ZlX3JlZHVuZGFudF90eXBlX2FyZ3VtZW50cz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQorY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKK2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQorY2xlYW51cC51c2VfYW5vbnltb3VzX2NsYXNzX2NyZWF0aW9uPWZhbHNlCitjbGVhbnVwLnVzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK2NsZWFudXAudXNlX2xhbWJkYT10cnVlCitjbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz10cnVlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorY2xlYW51cC51c2VfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXBfcHJvZmlsZT1fVmlyZ28gV2ViIFNlcnZlciAtIENvZGUgQ2xlYW4gVXAKIGNsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCiBlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQogZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fJ1ZpcmdvIGJhc2VkIG9uIE15bHluJworZm9ybWF0dGVyX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIEZvcm1hdHRlcgogZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTIKIGludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CiBvcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL1NlcnZlckxpY2Vuc2VSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9TZXJ2ZXJMaWNlbnNlUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEKaW5kZXggZTQ2N2RlOC4uODMyYWZmNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL1NlcnZlckxpY2Vuc2VSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvU2VydmVyTGljZW5zZVJ1bnRpbWVXaXphcmRGcmFnbWVudC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpOwogCiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwpAQCAtMTcsNjEgKzE4LDY1IEBACiAKIC8qKgogICoge0BsaW5rIFdpemFyZEZyYWdtZW50fSB0byBhY2NlcHQgbGljZW5zZSB0ZXJtcy4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICovCiBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQogcHVibGljIGNsYXNzIFNlcnZlckxpY2Vuc2VSdW50aW1lV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUNFTlNFID0gImxpY2Vuc2UiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0UgPSAibGljZW5zZSI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUNFTlNFX05PTkUgPSAibm9uZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElDRU5TRV9OT05FID0gIm5vbmUiOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElDRU5TRV9VTktOT1dOID0gInVua25vd24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VfVU5LTk9XTiA9ICJ1bmtub3duIjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VfQUNDRVBUID0gImFjY2VwdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElDRU5TRV9BQ0NFUFQgPSAiYWNjZXB0IjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VfU0VSVkVSID0gImxpY2Vuc2Vfc2VydmVyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUNFTlNFX1NFUlZFUiA9ICJsaWNlbnNlX3NlcnZlciI7CiAKLQlwcm90ZWN0ZWQgTGljZW5zZUNvbXBvc2l0ZSBjb21wOworICAgIHByb3RlY3RlZCBMaWNlbnNlQ29tcG9zaXRlIGNvbXA7CiAKLQlwdWJsaWMgU2VydmVyTGljZW5zZVJ1bnRpbWVXaXphcmRGcmFnbWVudCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KKyAgICBwdWJsaWMgU2VydmVyTGljZW5zZVJ1bnRpbWVXaXphcmRGcmFnbWVudCgpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgIH0KIAotCXB1YmxpYyB2b2lkIGVudGVyKCkgewotCQlpZiAoY29tcCAhPSBudWxsKSB7Ci0JCQljb21wLnVwZGF0ZUxpY2Vuc2UoKTsKLQkJfQotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgaWYgKHRoaXMuY29tcCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNvbXAudXBkYXRlTGljZW5zZSgpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudGFzay5XaXphcmRUYXNrI2dldFdpemFyZFBhZ2UoKQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkKSB7Ci0JCWNvbXAgPSBuZXcgTGljZW5zZUNvbXBvc2l0ZShwYXJlbnQsIGdldFRhc2tNb2RlbCgpLCB3aXphcmQpOworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLnRhc2suV2l6YXJkVGFzayNnZXRXaXphcmRQYWdlKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgeworICAgICAgICB0aGlzLmNvbXAgPSBuZXcgTGljZW5zZUNvbXBvc2l0ZShwYXJlbnQsIGdldFRhc2tNb2RlbCgpLCB3aXphcmQpOwogCi0JCXdpemFyZC5zZXRUaXRsZSgiTGljZW5zZSBUZXJtcyIpOwotCQl3aXphcmQuc2V0RGVzY3JpcHRpb24oIlJldmlldyBhbmQgYWNjZXB0IExpY2Vuc2UgVGVybXMiKTsKLQkJd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihTZXJ2ZXJVaUltYWdlcy5ERVNDX1dJWkJfU0VSVkVSKTsKLQkJcmV0dXJuIGNvbXA7Ci0JfQorICAgICAgICB3aXphcmQuc2V0VGl0bGUoIkxpY2Vuc2UgVGVybXMiKTsKKyAgICAgICAgd2l6YXJkLnNldERlc2NyaXB0aW9uKCJSZXZpZXcgYW5kIGFjY2VwdCBMaWNlbnNlIFRlcm1zIik7CisgICAgICAgIHdpemFyZC5zZXRJbWFnZURlc2NyaXB0b3IoU2VydmVyVWlJbWFnZXMuREVTQ19XSVpCX1NFUlZFUik7CisgICAgICAgIHJldHVybiB0aGlzLmNvbXA7CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJdHJ5IHsKLQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoU2VydmVyTGljZW5zZVJ1bnRpbWVXaXphcmRGcmFnbWVudC5MSUNFTlNFX0FDQ0VQVCk7Ci0JCQlpZiAoYiAhPSBudWxsICYmIGIuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJvb2xlYW4gYiA9IChCb29sZWFuKSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoU2VydmVyTGljZW5zZVJ1bnRpbWVXaXphcmRGcmFnbWVudC5MSUNFTlNFX0FDQ0VQVCk7CisgICAgICAgICAgICBpZiAoYiAhPSBudWxsICYmIGIuYm9vbGVhblZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL1NlcnZlclJ1bnRpbWVDb21wb3NpdGUuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9TZXJ2ZXJSdW50aW1lQ29tcG9zaXRlLmphdmEKaW5kZXggYTRhZjc0YS4uMTRlYzY4NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL1NlcnZlclJ1bnRpbWVDb21wb3NpdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvU2VydmVyUnVudGltZUNvbXBvc2l0ZS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTUzLDMxMSArNTQsMzEzIEBACiBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQogcHVibGljIGNsYXNzIFNlcnZlclJ1bnRpbWVDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewogCi0JcHJvdGVjdGVkIElSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZVdDOworICAgIHByb3RlY3RlZCBJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWVXQzsKIAotCXByb3RlY3RlZCBJU2VydmVyUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWU7CisgICAgcHJvdGVjdGVkIElTZXJ2ZXJSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZTsKIAotCXByb3RlY3RlZCBJV2l6YXJkSGFuZGxlIHdpemFyZDsKKyAgICBwcm90ZWN0ZWQgSVdpemFyZEhhbmRsZSB3aXphcmQ7CiAKLQlwcm90ZWN0ZWQgVGV4dCBpbnN0YWxsRGlyOworICAgIHByb3RlY3RlZCBUZXh0IGluc3RhbGxEaXI7CiAKLQlwcm90ZWN0ZWQgVGV4dCBuYW1lOworICAgIHByb3RlY3RlZCBUZXh0IG5hbWU7CiAKLQlwcm90ZWN0ZWQgQ29tYm8gdm1Db21ibzsKKyAgICBwcm90ZWN0ZWQgQ29tYm8gdm1Db21ibzsKIAotCXByb3RlY3RlZCBMaXN0PElWTUluc3RhbGw+IGluc3RhbGxlZEpSRXM7CisgICAgcHJvdGVjdGVkIExpc3Q8SVZNSW5zdGFsbD4gaW5zdGFsbGVkSlJFczsKIAotCXByb3RlY3RlZCBTdHJpbmdbXSBqcmVOYW1lczsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nW10ganJlTmFtZXM7CiAKLQlwcm90ZWN0ZWQgSUluc3RhbGxhYmxlUnVudGltZSBpcjsKKyAgICBwcm90ZWN0ZWQgSUluc3RhbGxhYmxlUnVudGltZSBpcjsKIAotCXByb3RlY3RlZCBMYWJlbCBpbnN0YWxsTGFiZWw7CisgICAgcHJvdGVjdGVkIExhYmVsIGluc3RhbGxMYWJlbDsKIAotCXByb3RlY3RlZCBCdXR0b24gaW5zdGFsbDsKKyAgICBwcm90ZWN0ZWQgQnV0dG9uIGluc3RhbGw7CiAKLQlwcml2YXRlIENvbWJvIHZlcnNpb25Db21ibzsKKyAgICBwcm90ZWN0ZWQgU2VydmVyUnVudGltZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCwgU3RyaW5nIHdpemFyZFRpdGxlLCBTdHJpbmcgd2l6YXJkRGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcyhwYXJlbnQsIHdpemFyZCwgd2l6YXJkVGl0bGUsIHdpemFyZERlc2NyaXB0aW9uLCBTZXJ2ZXJVaUltYWdlcy5ERVNDX1dJWkJfU0VSVkVSKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgU2VydmVyUnVudGltZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCwgU3RyaW5nIHdpemFyZFRpdGxlLAotCQkJU3RyaW5nIHdpemFyZERlc2NyaXB0aW9uKSB7Ci0JCXRoaXMocGFyZW50LCB3aXphcmQsIHdpemFyZFRpdGxlLCB3aXphcmREZXNjcmlwdGlvbiwgU2VydmVyVWlJbWFnZXMuREVTQ19XSVpCX1NFUlZFUik7Ci0JfQorICAgIHByb3RlY3RlZCBTZXJ2ZXJSdW50aW1lQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIElXaXphcmRIYW5kbGUgd2l6YXJkLCBTdHJpbmcgd2l6YXJkVGl0bGUsIFN0cmluZyB3aXphcmREZXNjcmlwdGlvbiwKKyAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcikgeworICAgICAgICBzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKKyAgICAgICAgdGhpcy53aXphcmQgPSB3aXphcmQ7CiAKLQlwcm90ZWN0ZWQgU2VydmVyUnVudGltZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCwgU3RyaW5nIHdpemFyZFRpdGxlLAotCQkJU3RyaW5nIHdpemFyZERlc2NyaXB0aW9uLCBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKKyAgICAgICAgd2l6YXJkLnNldFRpdGxlKHdpemFyZFRpdGxlKTsKKyAgICAgICAgd2l6YXJkLnNldERlc2NyaXB0aW9uKHdpemFyZERlc2NyaXB0aW9uKTsKKyAgICAgICAgd2l6YXJkLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3IpOwogCi0JCXdpemFyZC5zZXRUaXRsZSh3aXphcmRUaXRsZSk7Ci0JCXdpemFyZC5zZXREZXNjcmlwdGlvbih3aXphcmREZXNjcmlwdGlvbik7Ci0JCXdpemFyZC5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yKTsKKyAgICAgICAgY3JlYXRlQ29udHJvbCgpOworICAgIH0KIAotCQljcmVhdGVDb250cm9sKCk7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIHNldFJ1bnRpbWUoSVJ1bnRpbWVXb3JraW5nQ29weSBuZXdSdW50aW1lKSB7CisgICAgICAgIGlmIChuZXdSdW50aW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucnVudGltZVdDID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMucnVudGltZSA9IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnJ1bnRpbWVXQyA9IG5ld1J1bnRpbWU7CisgICAgICAgICAgICB0aGlzLnJ1bnRpbWUgPSAoSVNlcnZlclJ1bnRpbWVXb3JraW5nQ29weSkgbmV3UnVudGltZS5sb2FkQWRhcHRlcihJU2VydmVyUnVudGltZVdvcmtpbmdDb3B5LmNsYXNzLCBudWxsKTsKKyAgICAgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgc2V0UnVudGltZShJUnVudGltZVdvcmtpbmdDb3B5IG5ld1J1bnRpbWUpIHsKLQkJaWYgKG5ld1J1bnRpbWUgPT0gbnVsbCkgewotCQkJcnVudGltZVdDID0gbnVsbDsKLQkJCXJ1bnRpbWUgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcnVudGltZVdDID0gbmV3UnVudGltZTsKLQkJCXJ1bnRpbWUgPSAoSVNlcnZlclJ1bnRpbWVXb3JraW5nQ29weSkgbmV3UnVudGltZS5sb2FkQWRhcHRlcihJU2VydmVyUnVudGltZVdvcmtpbmdDb3B5LmNsYXNzLCBudWxsKTsKLQkJfQorICAgICAgICBpZiAodGhpcy5ydW50aW1lV0MgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5pciA9IG51bGw7CisgICAgICAgICAgICB0aGlzLmluc3RhbGwuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICB0aGlzLmluc3RhbGxMYWJlbC5zZXRUZXh0KCIiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuaXIgPSBTZXJ2ZXJQbHVnaW4uZmluZEluc3RhbGxhYmxlUnVudGltZSh0aGlzLnJ1bnRpbWVXQy5nZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOworICAgICAgICB9CiAKLQkJaWYgKHJ1bnRpbWVXQyA9PSBudWxsKSB7Ci0JCQlpciA9IG51bGw7Ci0JCQlpbnN0YWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJaW5zdGFsbExhYmVsLnNldFRleHQoIiIpOwotCQl9IGVsc2UgewotCQkJaXIgPSBTZXJ2ZXJQbHVnaW4uZmluZEluc3RhbGxhYmxlUnVudGltZShydW50aW1lV0MuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpKTsKLQkJfQorICAgICAgICBpbml0KCk7CisgICAgICAgIHZhbGlkYXRlKCk7CisgICAgfQogCi0JCWluaXQoKTsKLQkJdmFsaWRhdGUoKTsKLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKKyAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisgICAgICAgIHNldExheW91dChsYXlvdXQpOworICAgICAgICBzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKIAotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2woKSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlzZXRMYXlvdXQobGF5b3V0KTsKLQkJc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisgICAgICAgIExhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKyAgICAgICAgbGFiZWwuc2V0VGV4dChTZXJ2ZXJVaVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygicnVudGltZU5hbWUiKSk7CisgICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKyAgICAgICAgZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CisgICAgICAgIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CiAKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFNlcnZlclVpUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJydW50aW1lTmFtZSIpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7CisgICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKyAgICAgICAgdGhpcy5uYW1lLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIHRoaXMubmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CiAKLQkJbmFtZSA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCW5hbWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlydW50aW1lV0Muc2V0TmFtZShuYW1lLmdldFRleHQoKSk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJSdW50aW1lQ29tcG9zaXRlLnRoaXMucnVudGltZVdDLnNldE5hbWUoU2VydmVyUnVudGltZUNvbXBvc2l0ZS50aGlzLm5hbWUuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKIAotCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoU2VydmVyVWlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImluc3RhbGxEaXIiKSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKKyAgICAgICAgbGFiZWwuc2V0VGV4dChTZXJ2ZXJVaVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiaW5zdGFsbERpciIpKTsKKyAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworICAgICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKyAgICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKIAotCQlpbnN0YWxsRGlyID0gbmV3IFRleHQodGhpcywgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJaW5zdGFsbERpci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlpbnN0YWxsRGlyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXJ1bnRpbWVXQy5zZXRMb2NhdGlvbihuZXcgUGF0aChpbnN0YWxsRGlyLmdldFRleHQoKSkpOwotCQkJCXZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0pOworICAgICAgICB0aGlzLmluc3RhbGxEaXIgPSBuZXcgVGV4dCh0aGlzLCBTV1QuQk9SREVSKTsKKyAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworICAgICAgICB0aGlzLmluc3RhbGxEaXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgdGhpcy5pbnN0YWxsRGlyLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKIAotCQlCdXR0b24gYnJvd3NlID0gU1dUVXRpbC5jcmVhdGVCdXR0b24odGhpcywgU2VydmVyVWlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImJyb3dzZSIpKTsKLQkJYnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZSkgewotCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKFNlcnZlclJ1bnRpbWVDb21wb3NpdGUudGhpcy5nZXRTaGVsbCgpKTsKLQkJCQlkaWFsb2cuc2V0TWVzc2FnZShTZXJ2ZXJVaVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygic2VsZWN0SW5zdGFsbERpciIpKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChpbnN0YWxsRGlyLmdldFRleHQoKSk7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJCQlpbnN0YWxsRGlyLnNldFRleHQoc2VsZWN0ZWREaXJlY3RvcnkpOwotCQkJCX0KLQkJCX0KLQkJfSk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJSdW50aW1lQ29tcG9zaXRlLnRoaXMucnVudGltZVdDLnNldExvY2F0aW9uKG5ldyBQYXRoKFNlcnZlclJ1bnRpbWVDb21wb3NpdGUudGhpcy5pbnN0YWxsRGlyLmdldFRleHQoKSkpOworICAgICAgICAgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0vLwkJQ29tcG9zaXRlIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5CT1JERVIpOwotLy8JCUdyaWRMYXlvdXQgY29uZmlnTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLS8vCQljb25maWdMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0vLwkJY29uZmlndXJhdGlvbi5zZXRMYXlvdXQoY29uZmlnTGF5b3V0KTsKLS8vCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0vLwkJY29uZmlndXJhdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotLy8KLS8vCQlMYWJlbCB2ZXJzaW9uTGFiZWwgPSBuZXcgTGFiZWwoY29uZmlndXJhdGlvbiwgU1dULk5PTkUpOwotLy8JCXZlcnNpb25MYWJlbC5zZXRUZXh0KFNlcnZlclVpUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJ2ZXJzaW9uIikpOwotLy8JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLS8vCQl2ZXJzaW9uTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLS8vCi0vLwkJdmVyc2lvbkNvbWJvID0gbmV3IENvbWJvKGNvbmZpZ3VyYXRpb24sIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLS8vCi0vLwkJTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0vLwkJZm9yIChTZXJ2ZXJWaXJnb0hhbmRsZXIgdmVyc2lvbiA6IFNlcnZlclZlcnNpb25BZGFwdGVyLkFMTF9IQU5ETEVSUykgewotLy8JCQluYW1lcy5hZGQodmVyc2lvbi5nZXROYW1lKCkpOwotLy8JCX0KLS8vCQl2ZXJzaW9uQ29tYm8uc2V0SXRlbXMobmFtZXMudG9BcnJheShuZXcgU3RyaW5nW10ge30pKTsKLS8vCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0vLwotLy8JCXZlcnNpb25Db21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotLy8KLS8vCQl2ZXJzaW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0vLwkJCQlpbnQgc2VsID0gdmVyc2lvbkNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0vLwkJCQlydW50aW1lLnNldFZpcmdvVmVyc2lvbihTZXJ2ZXJWZXJzaW9uQWRhcHRlci5BTExfSEFORExFUlNbc2VsXSk7Ci0vLwkJCQl2YWxpZGF0ZSgpOwotLy8JCQl9Ci0vLwotLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotLy8JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0vLwkJCX0KLS8vCQl9KTsKKyAgICAgICAgQnV0dG9uIGJyb3dzZSA9IFNXVFV0aWwuY3JlYXRlQnV0dG9uKHRoaXMsIFNlcnZlclVpUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJicm93c2UiKSk7CisgICAgICAgIGJyb3dzZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKIAotCQl1cGRhdGVKUkVzKCk7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlKSB7CisgICAgICAgICAgICAgICAgRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coU2VydmVyUnVudGltZUNvbXBvc2l0ZS50aGlzLmdldFNoZWxsKCkpOworICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRNZXNzYWdlKFNlcnZlclVpUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJzZWxlY3RJbnN0YWxsRGlyIikpOworICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRGaWx0ZXJQYXRoKFNlcnZlclJ1bnRpbWVDb21wb3NpdGUudGhpcy5pbnN0YWxsRGlyLmdldFRleHQoKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGVkRGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWREaXJlY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJSdW50aW1lQ29tcG9zaXRlLnRoaXMuaW5zdGFsbERpci5zZXRUZXh0KHNlbGVjdGVkRGlyZWN0b3J5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCS8vIEpESyBsb2NhdGlvbgotCQlsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoU2VydmVyVWlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImluc3RhbGxlZEpSRSIpKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgLy8gQ29tcG9zaXRlIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5CT1JERVIpOworICAgICAgICAvLyBHcmlkTGF5b3V0IGNvbmZpZ0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisgICAgICAgIC8vIGNvbmZpZ0xheW91dC5udW1Db2x1bW5zID0gMjsKKyAgICAgICAgLy8gY29uZmlndXJhdGlvbi5zZXRMYXlvdXQoY29uZmlnTGF5b3V0KTsKKyAgICAgICAgLy8gZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOworICAgICAgICAvLyBjb25maWd1cmF0aW9uLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIC8vCisgICAgICAgIC8vIExhYmVsIHZlcnNpb25MYWJlbCA9IG5ldyBMYWJlbChjb25maWd1cmF0aW9uLCBTV1QuTk9ORSk7CisgICAgICAgIC8vIHZlcnNpb25MYWJlbC5zZXRUZXh0KFNlcnZlclVpUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCJ2ZXJzaW9uIikpOworICAgICAgICAvLyBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CisgICAgICAgIC8vIHZlcnNpb25MYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICAvLworICAgICAgICAvLyB2ZXJzaW9uQ29tYm8gPSBuZXcgQ29tYm8oY29uZmlndXJhdGlvbiwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOworICAgICAgICAvLworICAgICAgICAvLyBMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgLy8gZm9yIChTZXJ2ZXJWaXJnb0hhbmRsZXIgdmVyc2lvbiA6IFNlcnZlclZlcnNpb25BZGFwdGVyLkFMTF9IQU5ETEVSUykgeworICAgICAgICAvLyBuYW1lcy5hZGQodmVyc2lvbi5nZXROYW1lKCkpOworICAgICAgICAvLyB9CisgICAgICAgIC8vIHZlcnNpb25Db21iby5zZXRJdGVtcyhuYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbXSB7fSkpOworICAgICAgICAvLyBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisgICAgICAgIC8vCisgICAgICAgIC8vIHZlcnNpb25Db21iby5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICAvLworICAgICAgICAvLyB2ZXJzaW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgeworICAgICAgICAvLyBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgIC8vIGludCBzZWwgPSB2ZXJzaW9uQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKyAgICAgICAgLy8gcnVudGltZS5zZXRWaXJnb1ZlcnNpb24oU2VydmVyVmVyc2lvbkFkYXB0ZXIuQUxMX0hBTkRMRVJTW3NlbF0pOworICAgICAgICAvLyB2YWxpZGF0ZSgpOworICAgICAgICAvLyB9CisgICAgICAgIC8vCisgICAgICAgIC8vIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgIC8vIHdpZGdldFNlbGVjdGVkKGUpOworICAgICAgICAvLyB9CisgICAgICAgIC8vIH0pOwogCi0JCXZtQ29tYm8gPSBuZXcgQ29tYm8odGhpcywgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQl2bUNvbWJvLnNldEl0ZW1zKGpyZU5hbWVzKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQl2bUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIHVwZGF0ZUpSRXMoKTsKIAotCQl2bUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnQgc2VsID0gdm1Db21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gbnVsbDsKLQkJCQlpZiAoc2VsID4gMCkgewotCQkJCQl2bUluc3RhbGwgPSBpbnN0YWxsZWRKUkVzLmdldChzZWwgLSAxKTsKLQkJCQl9CisgICAgICAgIC8vIEpESyBsb2NhdGlvbgorICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7CisgICAgICAgIGxhYmVsLnNldFRleHQoU2VydmVyVWlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImluc3RhbGxlZEpSRSIpKTsKKyAgICAgICAgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOworICAgICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKyAgICAgICAgbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKIAotCQkJCXJ1bnRpbWUuc2V0Vk1JbnN0YWxsKHZtSW5zdGFsbCk7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KKyAgICAgICAgdGhpcy52bUNvbWJvID0gbmV3IENvbWJvKHRoaXMsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKKyAgICAgICAgdGhpcy52bUNvbWJvLnNldEl0ZW1zKHRoaXMuanJlTmFtZXMpOworICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7CisgICAgICAgIHRoaXMudm1Db21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwogCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKKyAgICAgICAgdGhpcy52bUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKIAotCQlCdXR0b24gYnV0dG9uID0gU1dUVXRpbC5jcmVhdGVCdXR0b24odGhpcywgU2VydmVyVWlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImluc3RhbGxlZEpSRXMiKSk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyBjdXJyZW50Vk0gPSB2bUNvbWJvLmdldFRleHQoKTsKLQkJCQlpZiAoc2hvd1ByZWZlcmVuY2VQYWdlKCkpIHsKLQkJCQkJdXBkYXRlSlJFcygpOwotCQkJCQl2bUNvbWJvLnNldEl0ZW1zKGpyZU5hbWVzKTsKLQkJCQkJdm1Db21iby5zZXRUZXh0KGN1cnJlbnRWTSk7Ci0JCQkJCWlmICh2bUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gLTEpIHsKLQkJCQkJCXZtQ29tYm8uc2VsZWN0KDApOwotCQkJCQl9Ci0JCQkJCXZhbGlkYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBpbnQgc2VsID0gU2VydmVyUnVudGltZUNvbXBvc2l0ZS50aGlzLnZtQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKyAgICAgICAgICAgICAgICBJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHNlbCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdm1JbnN0YWxsID0gU2VydmVyUnVudGltZUNvbXBvc2l0ZS50aGlzLmluc3RhbGxlZEpSRXMuZ2V0KHNlbCAtIDEpOworICAgICAgICAgICAgICAgIH0KIAotCQlpbml0KCk7Ci0JCXZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgU2VydmVyUnVudGltZUNvbXBvc2l0ZS50aGlzLnJ1bnRpbWUuc2V0Vk1JbnN0YWxsKHZtSW5zdGFsbCk7CisgICAgICAgICAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KIAotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRoaXMpOworICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICB3aWRnZXRTZWxlY3RlZChlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQkJbmFtZS5mb3JjZUZvY3VzKCk7Ci0JfQorICAgICAgICBCdXR0b24gYnV0dG9uID0gU1dUVXRpbC5jcmVhdGVCdXR0b24odGhpcywgU2VydmVyVWlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoImluc3RhbGxlZEpSRXMiKSk7CisgICAgICAgIGJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKIAotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUpSRXMoKSB7Ci0JCS8vIGdldCBhbGwgaW5zdGFsbGVkIEpWTXMKLQkJaW5zdGFsbGVkSlJFcyA9IG5ldyBBcnJheUxpc3Q8SVZNSW5zdGFsbD4oKTsKLQkJSVZNSW5zdGFsbFR5cGVbXSB2bUluc3RhbGxUeXBlcyA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGVzKCk7Ci0JCWludCBzaXplID0gdm1JbnN0YWxsVHlwZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSB2bUluc3RhbGxUeXBlc1tpXS5nZXRWTUluc3RhbGxzKCk7Ci0JCQlpbnQgc2l6ZTIgPSB2bUluc3RhbGxzLmxlbmd0aDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewotCQkJCWluc3RhbGxlZEpSRXMuYWRkKHZtSW5zdGFsbHNbal0pOwotCQkJfQotCQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFZNID0gU2VydmVyUnVudGltZUNvbXBvc2l0ZS50aGlzLnZtQ29tYm8uZ2V0VGV4dCgpOworICAgICAgICAgICAgICAgIGlmIChzaG93UHJlZmVyZW5jZVBhZ2UoKSkgeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVKUkVzKCk7CisgICAgICAgICAgICAgICAgICAgIFNlcnZlclJ1bnRpbWVDb21wb3NpdGUudGhpcy52bUNvbWJvLnNldEl0ZW1zKFNlcnZlclJ1bnRpbWVDb21wb3NpdGUudGhpcy5qcmVOYW1lcyk7CisgICAgICAgICAgICAgICAgICAgIFNlcnZlclJ1bnRpbWVDb21wb3NpdGUudGhpcy52bUNvbWJvLnNldFRleHQoY3VycmVudFZNKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNlcnZlclJ1bnRpbWVDb21wb3NpdGUudGhpcy52bUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlclJ1bnRpbWVDb21wb3NpdGUudGhpcy52bUNvbWJvLnNlbGVjdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQkJLy8gZ2V0IG5hbWVzCi0JCXNpemUgPSBpbnN0YWxsZWRKUkVzLnNpemUoKTsKLQkJanJlTmFtZXMgPSBuZXcgU3RyaW5nW3NpemUgKyAxXTsKLQkJanJlTmFtZXNbMF0gPSBTZXJ2ZXJVaVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygicnVudGltZURlZmF1bHRKUkUiKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlWTUluc3RhbGwgdm1JbnN0YWxsID0gaW5zdGFsbGVkSlJFcy5nZXQoaSk7Ci0JCQlqcmVOYW1lc1tpICsgMV0gPSB2bUluc3RhbGwuZ2V0TmFtZSgpOwotCQl9Ci0JfQorICAgICAgICBpbml0KCk7CisgICAgICAgIHZhbGlkYXRlKCk7CiAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93UHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCVN0cmluZyBpZCA9ICJvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkucHJlZmVyZW5jZXMuVk1QcmVmZXJlbmNlUGFnZSI7Ci0JCVByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByZWZlcmVuY2VNYW5hZ2VyKCk7Ci0JCUlQcmVmZXJlbmNlTm9kZSBub2RlID0gbWFuYWdlci5maW5kKCJvcmcuZWNsaXBzZS5qZHQudWkucHJlZmVyZW5jZXMuSmF2YUJhc2VQcmVmZXJlbmNlUGFnZSIpLmZpbmRTdWJOb2RlKGlkKTsKLQkJUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlcjIgPSBuZXcgUHJlZmVyZW5jZU1hbmFnZXIoKTsKLQkJbWFuYWdlcjIuYWRkVG9Sb290KG5vZGUpOwotCQlQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IG5ldyBQcmVmZXJlbmNlRGlhbG9nKGdldFNoZWxsKCksIG1hbmFnZXIyKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlyZXR1cm4gKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKTsKLQl9CisgICAgICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQodGhpcyk7CiAKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlpZiAobmFtZSA9PSBudWxsIHx8IHJ1bnRpbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9CisgICAgICAgIHRoaXMubmFtZS5mb3JjZUZvY3VzKCk7CisgICAgfQogCi0JCWlmIChydW50aW1lV0MuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCW5hbWUuc2V0VGV4dChydW50aW1lV0MuZ2V0TmFtZSgpKTsKLQkJfSBlbHNlIHsKLQkJCW5hbWUuc2V0VGV4dCgiIik7Ci0JCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKUkVzKCkgeworICAgICAgICAvLyBnZXQgYWxsIGluc3RhbGxlZCBKVk1zCisgICAgICAgIHRoaXMuaW5zdGFsbGVkSlJFcyA9IG5ldyBBcnJheUxpc3Q8SVZNSW5zdGFsbD4oKTsKKyAgICAgICAgSVZNSW5zdGFsbFR5cGVbXSB2bUluc3RhbGxUeXBlcyA9IEphdmFSdW50aW1lLmdldFZNSW5zdGFsbFR5cGVzKCk7CisgICAgICAgIGludCBzaXplID0gdm1JbnN0YWxsVHlwZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgSVZNSW5zdGFsbFtdIHZtSW5zdGFsbHMgPSB2bUluc3RhbGxUeXBlc1tpXS5nZXRWTUluc3RhbGxzKCk7CisgICAgICAgICAgICBpbnQgc2l6ZTIgPSB2bUluc3RhbGxzLmxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgeworICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFsbGVkSlJFcy5hZGQodm1JbnN0YWxsc1tqXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAocnVudGltZVdDLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJaW5zdGFsbERpci5zZXRUZXh0KHJ1bnRpbWVXQy5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnN0YWxsRGlyLnNldFRleHQoIiIpOwotCQl9CisgICAgICAgIC8vIGdldCBuYW1lcworICAgICAgICBzaXplID0gdGhpcy5pbnN0YWxsZWRKUkVzLnNpemUoKTsKKyAgICAgICAgdGhpcy5qcmVOYW1lcyA9IG5ldyBTdHJpbmdbc2l6ZSArIDFdOworICAgICAgICB0aGlzLmpyZU5hbWVzWzBdID0gU2VydmVyVWlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInJ1bnRpbWVEZWZhdWx0SlJFIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IHRoaXMuaW5zdGFsbGVkSlJFcy5nZXQoaSk7CisgICAgICAgICAgICB0aGlzLmpyZU5hbWVzW2kgKyAxXSA9IHZtSW5zdGFsbC5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICB9CiAKLS8vCQl1cGRhdGVDb25maWd1cmF0aW9uKCk7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1ByZWZlcmVuY2VQYWdlKCkgeworICAgICAgICBTdHJpbmcgaWQgPSAib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLnByZWZlcmVuY2VzLlZNUHJlZmVyZW5jZVBhZ2UiOworICAgICAgICBQcmVmZXJlbmNlTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlTWFuYWdlcigpOworICAgICAgICBJUHJlZmVyZW5jZU5vZGUgbm9kZSA9IG1hbmFnZXIuZmluZCgib3JnLmVjbGlwc2UuamR0LnVpLnByZWZlcmVuY2VzLkphdmFCYXNlUHJlZmVyZW5jZVBhZ2UiKS5maW5kU3ViTm9kZShpZCk7CisgICAgICAgIFByZWZlcmVuY2VNYW5hZ2VyIG1hbmFnZXIyID0gbmV3IFByZWZlcmVuY2VNYW5hZ2VyKCk7CisgICAgICAgIG1hbmFnZXIyLmFkZFRvUm9vdChub2RlKTsKKyAgICAgICAgUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBuZXcgUHJlZmVyZW5jZURpYWxvZyhnZXRTaGVsbCgpLCBtYW5hZ2VyMik7CisgICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKKyAgICAgICAgcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LOworICAgIH0KIAotCQkvLyBzZXQgc2VsZWN0aW9uCi0JCWlmIChydW50aW1lLmlzVXNpbmdEZWZhdWx0SlJFKCkpIHsKLQkJCXZtQ29tYm8uc2VsZWN0KDApOwotCQl9IGVsc2UgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJaW50IHNpemUgPSBpbnN0YWxsZWRKUkVzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVZNSW5zdGFsbCB2bUluc3RhbGwgPSBpbnN0YWxsZWRKUkVzLmdldChpKTsKLQkJCQlpZiAodm1JbnN0YWxsLmVxdWFscyhydW50aW1lLmdldFZNSW5zdGFsbCgpKSkgewotCQkJCQl2bUNvbWJvLnNlbGVjdChpICsgMSk7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJdm1Db21iby5zZWxlY3QoMCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgaWYgKHRoaXMubmFtZSA9PSBudWxsIHx8IHRoaXMucnVudGltZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotLy8JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbmZpZ3VyYXRpb24oKSB7Ci0vLwkJaW50IHYgPSAwOwotLy8JCWZvciAoU2VydmVyVmlyZ29IYW5kbGVyIHZlcnNpb24gOiBTZXJ2ZXJWZXJzaW9uQWRhcHRlci5BTExfSEFORExFUlMpIHsKLS8vCQkJaWYgKHZlcnNpb24uaXNIYW5kbGVyRm9yKHJ1bnRpbWVXQykpIHsKLS8vCQkJCXZlcnNpb25Db21iby5zZWxlY3Qodik7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8JCQl2Kys7Ci0vLwkJfQotLy8JfQorICAgICAgICBpZiAodGhpcy5ydW50aW1lV0MuZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZS5zZXRUZXh0KHRoaXMucnVudGltZVdDLmdldE5hbWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLm5hbWUuc2V0VGV4dCgiIik7CisgICAgICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotCQlpZiAocnVudGltZSA9PSBudWxsKSB7Ci0JCQl3aXphcmQuc2V0TWVzc2FnZSgiIiwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7Ci0JCQlyZXR1cm47Ci0JCX0KKyAgICAgICAgaWYgKHRoaXMucnVudGltZVdDLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5pbnN0YWxsRGlyLnNldFRleHQodGhpcy5ydW50aW1lV0MuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5pbnN0YWxsRGlyLnNldFRleHQoIiIpOworICAgICAgICB9CiAKLQkJSVN0YXR1cyBzdGF0dXMgPSBydW50aW1lV0MudmFsaWRhdGUobnVsbCk7Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkgewotCQkJd2l6YXJkLnNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLQkJfSBlbHNlIGlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKLQkJfSBlbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCXdpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCX0gZWxzZSB7Ci0JCQl3aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKLQkJfQotCQl3aXphcmQudXBkYXRlKCk7Ci0vLwkJdXBkYXRlQ29uZmlndXJhdGlvbigpOwotCX0KKyAgICAgICAgLy8gdXBkYXRlQ29uZmlndXJhdGlvbigpOworCisgICAgICAgIC8vIHNldCBzZWxlY3Rpb24KKyAgICAgICAgaWYgKHRoaXMucnVudGltZS5pc1VzaW5nRGVmYXVsdEpSRSgpKSB7CisgICAgICAgICAgICB0aGlzLnZtQ29tYm8uc2VsZWN0KDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgaW50IHNpemUgPSB0aGlzLmluc3RhbGxlZEpSRXMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBJVk1JbnN0YWxsIHZtSW5zdGFsbCA9IHRoaXMuaW5zdGFsbGVkSlJFcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHZtSW5zdGFsbC5lcXVhbHModGhpcy5ydW50aW1lLmdldFZNSW5zdGFsbCgpKSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnZtQ29tYm8uc2VsZWN0KGkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnZtQ29tYm8uc2VsZWN0KDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbmZpZ3VyYXRpb24oKSB7CisgICAgLy8gaW50IHYgPSAwOworICAgIC8vIGZvciAoU2VydmVyVmlyZ29IYW5kbGVyIHZlcnNpb24gOiBTZXJ2ZXJWZXJzaW9uQWRhcHRlci5BTExfSEFORExFUlMpIHsKKyAgICAvLyBpZiAodmVyc2lvbi5pc0hhbmRsZXJGb3IocnVudGltZVdDKSkgeworICAgIC8vIHZlcnNpb25Db21iby5zZWxlY3Qodik7CisgICAgLy8gYnJlYWs7CisgICAgLy8gfQorICAgIC8vIHYrKzsKKyAgICAvLyB9CisgICAgLy8gfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7CisgICAgICAgIGlmICh0aGlzLnJ1bnRpbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy53aXphcmQuc2V0TWVzc2FnZSgiIiwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBJU3RhdHVzIHN0YXR1cyA9IHRoaXMucnVudGltZVdDLnZhbGlkYXRlKG51bGwpOworICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMud2l6YXJkLnNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMuaXNPSygpKSB7CisgICAgICAgICAgICB0aGlzLndpemFyZC5zZXRNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pOworICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykgeworICAgICAgICAgICAgdGhpcy53aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy53aXphcmQuc2V0TWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLndpemFyZC51cGRhdGUoKTsKKyAgICAgICAgLy8gdXBkYXRlQ29uZmlndXJhdGlvbigpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9TZXJ2ZXJVaUltYWdlcy5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL1NlcnZlclVpSW1hZ2VzLmphdmEKaW5kZXggODlhZTJkMC4uZjJiYWU1NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL1NlcnZlclVpSW1hZ2VzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL1NlcnZlclVpSW1hZ2VzLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWk7CiAKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CkBAIC0yOSwxNjUgKzMwLDE2MyBAQAogICogUFJPRF8gTWlzYyBpbWFnZXMgTUlTQ18gV2hlcmUgYXJlIHRoZSBpbWFnZXM/IFRoZSBpbWFnZXMgKHR5cGljYWxseSBnaWZzKSBhcmUgZm91bmQgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhpcwogICogcGx1Z2luIGNsYXNzLiBUaGlzIG1heSBtZWFuIHRoZSBzYW1lIHBhY2thZ2UgZGlyZWN0b3J5IGFzIHRoZSBwYWNrYWdlIGhvbGRpbmcgdGhpcyBjbGFzcy4gVGhlIGltYWdlcyBhcmUgZGVjbGFyZWQKICAqIHVzaW5nIDxjb2RlPnRoaXMuZ2V0Q2xhc3MoKTwvY29kZT4gdG8gZW5zdXJlIHRoZXkgYXJlIGxvb2tlZCB1cCB2aWEgdGhpcyBwbHVnaW4gY2xhc3MuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnkKICAqLwogcHVibGljIGNsYXNzIFNlcnZlclVpSW1hZ2VzIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1BBVEhfUFJFRklYID0gImljb25zL2Z1bGwvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9QQVRIX1BSRUZJWCA9ICJpY29ucy9mdWxsLyI7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUkVGSVggPSBTZXJ2ZXJVaVBsdWdpbi5QTFVHSU5fSUQgKyAnLic7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJFRklYID0gU2VydmVyVWlQbHVnaW4uUExVR0lOX0lEICsgJy4nOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5BTUVfUFJFRklYX0xFTkdUSCA9IE5BTUVfUFJFRklYLmxlbmd0aCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOQU1FX1BSRUZJWF9MRU5HVEggPSBOQU1FX1BSRUZJWC5sZW5ndGgoKTsKIAotCS8qIERlY2xhcmUgQ29tbW9uIHBhdGhzICovCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIElDT05fQkFTRV9VUkwgPSBudWxsOworICAgIC8qIERlY2xhcmUgQ29tbW9uIHBhdGhzICovCisgICAgcHJpdmF0ZSBzdGF0aWMgVVJMIElDT05fQkFTRV9VUkwgPSBudWxsOwogCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCUlDT05fQkFTRV9VUkwgPSBuZXcgVVJMKFNlcnZlclVpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpLCBJQ09OX1BBVEhfUFJFRklYKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZlclVpUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KKyAgICBzdGF0aWMgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSUNPTl9CQVNFX1VSTCA9IG5ldyBVUkwoU2VydmVyVWlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIiksIElDT05fUEFUSF9QUkVGSVgpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2VydmVyVWlQbHVnaW4ubG9nKGUpOworICAgICAgICB9CisgICAgfQogCi0JLyoqIEEgdGFibGUgb2YgYWxsIHRoZSA8Y29kZT5JbWFnZURlc2NyaXB0b3I8L2NvZGU+cy4gKi8KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBJbWFnZURlc2NyaXB0b3I+IGltYWdlRGVzY3JpcHRvcnM7CisgICAgLyoqIEEgdGFibGUgb2YgYWxsIHRoZSA8Y29kZT5JbWFnZURlc2NyaXB0b3I8L2NvZGU+cy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBJbWFnZURlc2NyaXB0b3I+IGltYWdlRGVzY3JpcHRvcnM7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQl9TRVJWRVIgPSBOQU1FX1BSRUZJWCArICJzcHJpbmdzb3VyY2Vfd2l6LnBuZyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJfU0VSVkVSID0gTkFNRV9QUkVGSVggKyAic3ByaW5nc291cmNlX3dpei5wbmciOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJfVklSR09fU0VSVkVSID0gTkFNRV9QUkVGSVggKyAidmlyZ29fd2l6LnBuZyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJfVklSR09fU0VSVkVSID0gTkFNRV9QUkVGSVggKyAidmlyZ29fd2l6LnBuZyI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1BPUlQgPSBOQU1FX1BSRUZJWCArICJwb3J0X29iai5naWYiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUE9SVCA9IE5BTUVfUFJFRklYICsgInBvcnRfb2JqLmdpZiI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1ZJUkdPID0gTkFNRV9QUkVGSVggKyAidmlyZ29fb2JqLnBuZyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9WSVJHTyA9IE5BTUVfUFJFRklYICsgInZpcmdvX29iai5wbmciOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9WSVJHT19MSUIgPSBOQU1FX1BSRUZJWCArICJ2aXJnb19vYmpfbGliLnBuZyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9WSVJHT19MSUIgPSBOQU1FX1BSRUZJWCArICJ2aXJnb19vYmpfbGliLnBuZyI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1ZJUkdPX0ZJTEUgPSBOQU1FX1BSRUZJWCArICJ2aXJnb19vYmpfZmlsZS5wbmciOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVklSR09fRklMRSA9IE5BTUVfUFJFRklYICsgInZpcmdvX29ial9maWxlLnBuZyI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfVklSR09fT1ZFUiA9IE5BTUVfUFJFRklYICsgInZpcmdvX292ZXIucG5nIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfVklSR09fT1ZFUiA9IE5BTUVfUFJFRklYICsgInZpcmdvX292ZXIucG5nIjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQlVORExFID0gTkFNRV9QUkVGSVggKyAiYnVuZGxlX29iai5naWYiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQlVORExFID0gTkFNRV9QUkVGSVggKyAiYnVuZGxlX29iai5naWYiOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9CVU5ETEVfU1JDID0gTkFNRV9QUkVGSVggKyAiYnVuZGxlX3NyY19vYmouZ2lmIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0JVTkRMRV9TUkMgPSBOQU1FX1BSRUZJWCArICJidW5kbGVfc3JjX29iai5naWYiOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9MSUIgPSBOQU1FX1BSRUZJWCArICJsaWJfb2JqLmdpZiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9MSUIgPSBOQU1FX1BSRUZJWCArICJsaWJfb2JqLmdpZiI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0ZJTEUgPSBOQU1FX1BSRUZJWCArICJmaWxlX29iai5naWYiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRklMRSA9IE5BTUVfUFJFRklYICsgImZpbGVfb2JqLmdpZiI7CiAKLQkvLyBVc2UgSVBhdGggYW5kIHRvT1NTdHJpbmcgdG8gYnVpbGQgdGhlIG5hbWVzIHRvIGVuc3VyZSB0aGV5IGhhdmUgdGhlIHNsYXNoZXMgY29ycmVjdAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBPQkpFQ1QgPSAib2JqMTYvIjsgLy9iYXNpYyBjb2xvcnMgLSBzaXplIDE2eDE2CisgICAgLy8gVXNlIElQYXRoIGFuZCB0b09TU3RyaW5nIHRvIGJ1aWxkIHRoZSBuYW1lcyB0byBlbnN1cmUgdGhleSBoYXZlIHRoZSBzbGFzaGVzIGNvcnJlY3QKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgT0JKRUNUID0gIm9iajE2LyI7IC8vIGJhc2ljIGNvbG9ycyAtIHNpemUgMTZ4MTYKIAotCS8vIFVzZSBJUGF0aCBhbmQgdG9PU1N0cmluZyB0byBidWlsZCB0aGUgbmFtZXMgdG8gZW5zdXJlIHRoZXkgaGF2ZSB0aGUgc2xhc2hlcyBjb3JyZWN0Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE9WRVIgPSAib3ZlcjA4LyI7IC8vYmFzaWMgY29sb3JzIC0gc2l6ZSAxNngxNgorICAgIC8vIFVzZSBJUGF0aCBhbmQgdG9PU1N0cmluZyB0byBidWlsZCB0aGUgbmFtZXMgdG8gZW5zdXJlIHRoZXkgaGF2ZSB0aGUgc2xhc2hlcyBjb3JyZWN0CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE9WRVIgPSAib3ZlcjA4LyI7IC8vIGJhc2ljIGNvbG9ycyAtIHNpemUgMTZ4MTYKIAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBXSVpCQU4gPSAid2l6YmFuLyI7IC8vYmFzaWMgY29sb3JzIC0gc2l6ZSAxNngxNgorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBXSVpCQU4gPSAid2l6YmFuLyI7IC8vIGJhc2ljIGNvbG9ycyAtIHNpemUgMTZ4MTYKIAotCS8vcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE9WUiA9ICJvdnIxNi8iOyAvL2Jhc2ljIGNvbG9ycyAtIHNpemUgN3g4CisgICAgLy8gcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE9WUiA9ICJvdnIxNi8iOyAvL2Jhc2ljIGNvbG9ycyAtIHNpemUgN3g4CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1dJWkJfU0VSVkVSID0gY3JlYXRlTWFuYWdlZChXSVpCQU4sIElNR19XSVpCX1NFUlZFUik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19XSVpCX1NFUlZFUiA9IGNyZWF0ZU1hbmFnZWQoV0laQkFOLCBJTUdfV0laQl9TRVJWRVIpOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19XSVpCX1ZJUkdPX1NFUlZFUiA9IGNyZWF0ZU1hbmFnZWQoV0laQkFOLCBJTUdfV0laQl9WSVJHT19TRVJWRVIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfV0laQl9WSVJHT19TRVJWRVIgPSBjcmVhdGVNYW5hZ2VkKFdJWkJBTiwgSU1HX1dJWkJfVklSR09fU0VSVkVSKTsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfT0JKX1ZJUkdPX0xJQiA9IGNyZWF0ZU1hbmFnZWQoT0JKRUNULCBJTUdfT0JKX1ZJUkdPX0xJQik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19PQkpfVklSR09fTElCID0gY3JlYXRlTWFuYWdlZChPQkpFQ1QsIElNR19PQkpfVklSR09fTElCKTsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfT0JKX1ZJUkdPX0ZJTEUgPSBjcmVhdGVNYW5hZ2VkKE9CSkVDVCwgSU1HX09CSl9WSVJHT19GSUxFKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX09CSl9WSVJHT19GSUxFID0gY3JlYXRlTWFuYWdlZChPQkpFQ1QsIElNR19PQkpfVklSR09fRklMRSk7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX09CSl9WSVJHT19PVkVSID0gY3JlYXRlTWFuYWdlZChPVkVSLCBJTUdfT0JKX1ZJUkdPKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX09CSl9WSVJHT19PVkVSID0gY3JlYXRlTWFuYWdlZChPVkVSLCBJTUdfT0JKX1ZJUkdPKTsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfT0JKX1BPUlQgPSBjcmVhdGVNYW5hZ2VkKE9CSkVDVCwgSU1HX09CSl9QT1JUKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX09CSl9QT1JUID0gY3JlYXRlTWFuYWdlZChPQkpFQ1QsIElNR19PQkpfUE9SVCk7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX09CSl9WSVJHTyA9IGNyZWF0ZU1hbmFnZWQoT0JKRUNULCBJTUdfT0JKX1ZJUkdPKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX09CSl9WSVJHTyA9IGNyZWF0ZU1hbmFnZWQoT0JKRUNULCBJTUdfT0JKX1ZJUkdPKTsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfT0JKX0JVTkRMRSA9IGNyZWF0ZU1hbmFnZWQoT0JKRUNULCBJTUdfT0JKX0JVTkRMRSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19PQkpfQlVORExFID0gY3JlYXRlTWFuYWdlZChPQkpFQ1QsIElNR19PQkpfQlVORExFKTsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfT0JKX0JVTkRMRV9TUkMgPSBjcmVhdGVNYW5hZ2VkKE9CSkVDVCwgSU1HX09CSl9CVU5ETEVfU1JDKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX09CSl9CVU5ETEVfU1JDID0gY3JlYXRlTWFuYWdlZChPQkpFQ1QsIElNR19PQkpfQlVORExFX1NSQyk7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX09CSl9MSUIgPSBjcmVhdGVNYW5hZ2VkKE9CSkVDVCwgSU1HX09CSl9MSUIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfT0JKX0xJQiA9IGNyZWF0ZU1hbmFnZWQoT0JKRUNULCBJTUdfT0JKX0xJQik7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX09CSl9GSUxFID0gY3JlYXRlTWFuYWdlZChPQkpFQ1QsIElNR19PQkpfRklMRSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19PQkpfRklMRSA9IGNyZWF0ZU1hbmFnZWQoT0JKRUNULCBJTUdfT0JKX0ZJTEUpOwogCi0JLyoKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIGluaXRpYWxpemUgdGhlIGltYWdlIHJlZ2lzdHJ5IGZyb20gdGhlIEJlYW5zVUlQbHVnaW4KLQkgKiBjbGFzcy4KLQkgKi8KLQkvKiBwYWNrYWdlICovc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkoSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSkgewotCQlmb3IgKFN0cmluZyBrZXkgOiBpbWFnZURlc2NyaXB0b3JzLmtleVNldCgpKSB7Ci0JCQlyZWdpc3RyeS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3JzLmdldChrZXkpKTsKLQkJfQotCX0KKyAgICAvKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gaW5pdGlhbGl6ZSB0aGUgaW1hZ2UgcmVnaXN0cnkgZnJvbSB0aGUgQmVhbnNVSVBsdWdpbiBjbGFzcy4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUltYWdlUmVnaXN0cnkoSW1hZ2VSZWdpc3RyeSByZWdpc3RyeSkgeworICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBpbWFnZURlc2NyaXB0b3JzLmtleVNldCgpKSB7CisgICAgICAgICAgICByZWdpc3RyeS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3JzLmdldChrZXkpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHtAbGluayBJbWFnZX0gaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIFNlcnZlclVpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBJbWFnZX0gaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIFNlcnZlclVpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7CisgICAgfQogCi0JLyoqCi0JICogU2V0cyB0aGUgdGhyZWUgaW1hZ2UgZGVzY3JpcHRvcnMgZm9yIGVuYWJsZWQsIGRpc2FibGVkLCBhbmQgaG92ZXJlZCB0byBhbiBhY3Rpb24uIFRoZSBhY3Rpb25zIGFyZSByZXRyaWV2ZWQgZnJvbQotCSAqIHRoZSAqdG9vbDE2IGZvbGRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFRvb2xJbWFnZURlc2NyaXB0b3JzKElBY3Rpb24gYWN0aW9uLCBTdHJpbmcgaWNvbk5hbWUpIHsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9ycyhhY3Rpb24sICJ0b29sMTYiLCBpY29uTmFtZSk7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRocmVlIGltYWdlIGRlc2NyaXB0b3JzIGZvciBlbmFibGVkLCBkaXNhYmxlZCwgYW5kIGhvdmVyZWQgdG8gYW4gYWN0aW9uLiBUaGUgYWN0aW9ucyBhcmUgcmV0cmlldmVkIGZyb20KKyAgICAgKiB0aGUgKnRvb2wxNiBmb2xkZXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUb29sSW1hZ2VEZXNjcmlwdG9ycyhJQWN0aW9uIGFjdGlvbiwgU3RyaW5nIGljb25OYW1lKSB7CisgICAgICAgIHNldEltYWdlRGVzY3JpcHRvcnMoYWN0aW9uLCAidG9vbDE2IiwgaWNvbk5hbWUpOworICAgIH0KIAotCS8qKgotCSAqIFNldHMgdGhlIHRocmVlIGltYWdlIGRlc2NyaXB0b3JzIGZvciBlbmFibGVkLCBkaXNhYmxlZCwgYW5kIGhvdmVyZWQgdG8gYW4gYWN0aW9uLiBUaGUgYWN0aW9ucyBhcmUgcmV0cmlldmVkIGZyb20KLQkgKiB0aGUgKmxjbDE2IGZvbGRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldExvY2FsSW1hZ2VEZXNjcmlwdG9ycyhJQWN0aW9uIGFjdGlvbiwgU3RyaW5nIGljb25OYW1lKSB7Ci0JCXNldEltYWdlRGVzY3JpcHRvcnMoYWN0aW9uLCAibGNsMTYiLCBpY29uTmFtZSk7Ci0JfQorICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRocmVlIGltYWdlIGRlc2NyaXB0b3JzIGZvciBlbmFibGVkLCBkaXNhYmxlZCwgYW5kIGhvdmVyZWQgdG8gYW4gYWN0aW9uLiBUaGUgYWN0aW9ucyBhcmUgcmV0cmlldmVkIGZyb20KKyAgICAgKiB0aGUgKmxjbDE2IGZvbGRlcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldExvY2FsSW1hZ2VEZXNjcmlwdG9ycyhJQWN0aW9uIGFjdGlvbiwgU3RyaW5nIGljb25OYW1lKSB7CisgICAgICAgIHNldEltYWdlRGVzY3JpcHRvcnMoYWN0aW9uLCAibGNsMTYiLCBpY29uTmFtZSk7CisgICAgfQogCi0JLy8tLS0tIEhlbHBlciBtZXRob2RzIHRvIGFjY2VzcyBpY29ucyBvbiB0aGUgZmlsZSBzeXN0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIC0tLS0gSGVscGVyIG1ldGhvZHMgdG8gYWNjZXNzIGljb25zIG9uIHRoZSBmaWxlIHN5c3RlbSAtLS0tLS0tLS0tLS0tLS0tLS0tCiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldEltYWdlRGVzY3JpcHRvcnMoSUFjdGlvbiBhY3Rpb24sIFN0cmluZyB0eXBlLCBTdHJpbmcgcmVsUGF0aCkgewotCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGNyZWF0ZSgiZSIgKyB0eXBlLCByZWxQYXRoKSk7Ci0JCXRyeSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaWQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChtYWtlSWNvbkZpbGVVUkwoImQiICsgdHlwZSwgcmVsUGF0aCkpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlhY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoaWQpOwotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJU2VydmVyVWlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9ycyhJQWN0aW9uIGFjdGlvbiwgU3RyaW5nIHR5cGUsIFN0cmluZyByZWxQYXRoKSB7CisgICAgICAgIGFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoY3JlYXRlKCJlIiArIHR5cGUsIHJlbFBhdGgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvciBpZCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG1ha2VJY29uRmlsZVVSTCgiZCIgKyB0eXBlLCByZWxQYXRoKSk7CisgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTZXJ2ZXJVaVBsdWdpbi5sb2coZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgY3JlYXRlTWFuYWdlZChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIHJlc3VsdCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG1ha2VJY29uRmlsZVVSTChwcmVmaXgsCi0JCQkJCW5hbWUuc3Vic3RyaW5nKE5BTUVfUFJFRklYX0xFTkdUSCkpKTsKLQkJCWlmIChpbWFnZURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbWFnZURlc2NyaXB0b3I+KCk7Ci0JCQl9Ci0JCQlpbWFnZURlc2NyaXB0b3JzLnB1dChuYW1lLCByZXN1bHQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZlclVpUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0JfQorICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGVNYW5hZ2VkKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgcmVzdWx0ID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobWFrZUljb25GaWxlVVJMKHByZWZpeCwgbmFtZS5zdWJzdHJpbmcoTkFNRV9QUkVGSVhfTEVOR1RIKSkpOworICAgICAgICAgICAgaWYgKGltYWdlRGVzY3JpcHRvcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGltYWdlRGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEltYWdlRGVzY3JpcHRvcj4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltYWdlRGVzY3JpcHRvcnMucHV0KG5hbWUsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2VydmVyVWlQbHVnaW4ubG9nKGUpOworICAgICAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgY3JlYXRlKFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobWFrZUljb25GaWxlVVJMKHByZWZpeCwgbmFtZSkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJU2VydmVyVWlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQl9CisgICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG1ha2VJY29uRmlsZVVSTChwcmVmaXgsIG5hbWUpKTsKKyAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFNlcnZlclVpUGx1Z2luLmxvZyhlKTsKKyAgICAgICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIG1ha2VJY29uRmlsZVVSTChTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCWlmIChJQ09OX0JBU0VfVVJMID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBNYWxmb3JtZWRVUkxFeGNlcHRpb24oKTsKLQkJfQorICAgIHByaXZhdGUgc3RhdGljIFVSTCBtYWtlSWNvbkZpbGVVUkwoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICBpZiAoSUNPTl9CQVNFX1VSTCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFsZm9ybWVkVVJMRXhjZXB0aW9uKCk7CisgICAgICAgIH0KIAotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwcmVmaXgpOwotCQlidWZmZXIuYXBwZW5kKCcvJykuYXBwZW5kKG5hbWUpOwotCQlyZXR1cm4gbmV3IFVSTChJQ09OX0JBU0VfVVJMLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQorICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwcmVmaXgpOworICAgICAgICBidWZmZXIuYXBwZW5kKCcvJykuYXBwZW5kKG5hbWUpOworICAgICAgICByZXR1cm4gbmV3IFVSTChJQ09OX0JBU0VfVVJMLCBidWZmZXIudG9TdHJpbmcoKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL1NlcnZlclVpUGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvU2VydmVyVWlQbHVnaW4uamF2YQppbmRleCAwZjZkNDdhLi40OWRlNjg3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvU2VydmVyVWlQbHVnaW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvU2VydmVyVWlQbHVnaW4uamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aTsKIAogaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247CkBAIC0yMiwxNTQgKzIzLDE1MyBAQAogCiAvKioKICAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJVaVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewogCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkiOworICAgIC8vIFRoZSBwbHVnLWluIElECisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpIjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9OQU1FID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLm1lc3NhZ2VzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfTkFNRSA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5tZXNzYWdlcyI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPU0lUT1JZX1BBR0VfSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnNlcnZlci51aS5jb25maWd1cmF0aW9uLmVkaXRvci5yZXBvc2l0b3J5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPU0lUT1JZX1BBR0VfSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnNlcnZlci51aS5jb25maWd1cmF0aW9uLmVkaXRvci5yZXBvc2l0b3J5IjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRE9XTkxPQURfTUVTU0FHRV9LRVkgPSBQTFVHSU5fSUQgKyAiLi5kb3dubG9hZC5tZXNzYWdlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0RPV05MT0FEX01FU1NBR0VfS0VZID0gUExVR0lOX0lEICsgIi4uZG93bmxvYWQubWVzc2FnZSI7CiAKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmVyVWlQbHVnaW4gcGx1Z2luOworICAgIC8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKKyAgICBwcml2YXRlIHN0YXRpYyBTZXJ2ZXJVaVBsdWdpbiBwbHVnaW47CiAKLQkvKiogUmVzb3VyY2UgYnVuZGxlICovCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKKyAgICAvKiogUmVzb3VyY2UgYnVuZGxlICovCisgICAgcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKIAotCS8vTmF0dXJhbGx5LCB0aGlzIGlzbid0IHB1YmxpYyBpbiBXU1QuLnNpZ2guCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1NUX1NFUlZFUl9WSUVXX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyc1ZpZXciOworICAgIC8vIE5hdHVyYWxseSwgdGhpcyBpc24ndCBwdWJsaWMgaW4gV1NULi5zaWdoLgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTVF9TRVJWRVJfVklFV19JRCA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLlNlcnZlcnNWaWV3IjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTVF9FRElUT1JfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5lZGl0b3IuU2VydmVyRWRpdG9yIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU1RfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwuZWRpdG9yLlNlcnZlckVkaXRvciI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRFRkFDVFNfQlJPV1NFUl9WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLkFydGVmYWN0c0Jyb3dzZXJWaWV3IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRFRkFDVFNfQlJPV1NFUl9WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLkFydGVmYWN0c0Jyb3dzZXJWaWV3IjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVEVGQUNUU19ERVRBSUxfVklFV19JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS5BcnRlZmFjdHNEZXRhaWxWaWV3IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRFRkFDVFNfREVUQUlMX1ZJRVdfSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkuQXJ0ZWZhY3RzRGV0YWlsVmlldyI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX09VVExJTkVfVklFV19JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS5PdXRsaW5lVmlldyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRV9PVVRMSU5FX1ZJRVdfSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkuT3V0bGluZVZpZXciOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLlByb3BlcnRpZXNWaWV3IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX1ZJRVdfSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkuUHJvcGVydGllc1ZpZXciOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19DT05URU5UX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLnByb3BlcnRpZXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfQ09OVEVOVF9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS5wcm9wZXJ0aWVzIjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQVRURU5FRF9QUk9QRVJUSUVTX0NPTlRFTlRfSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkuZmxhdHRlbmVkUHJvcGVydGllcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBVFRFTkVEX1BST1BFUlRJRVNfQ09OVEVOVF9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS5mbGF0dGVuZWRQcm9wZXJ0aWVzIjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLkxvZ1ZpZXciOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19WSUVXX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLkxvZ1ZpZXciOwogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0NPTlRFTlRfSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkubG9ncyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0NPTlRFTlRfSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkubG9ncyI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX0FSVEVGQUNUU19DT05URU5UX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLnJ1bnRpbWVBcnRlZmFjdHMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUVfQVJURUZBQ1RTX0NPTlRFTlRfSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkucnVudGltZUFydGVmYWN0cyI7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX0ZMQVRURU5FRF9BUlRFRkFDVFNfQ09OVEVOVF9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS5mbGF0dGVuZWRSdW50aW1lQXJ0ZWZhY3RzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX0ZMQVRURU5FRF9BUlRFRkFDVFNfQ09OVEVOVF9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS5mbGF0dGVuZWRSdW50aW1lQXJ0ZWZhY3RzIjsKIAotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJVaVBsdWdpbigpIHsKLQl9CisgICAgLyoqCisgICAgICogVGhlIGNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIFNlcnZlclVpUGx1Z2luKCkgeworICAgIH0KIAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShSRVNPVVJDRV9OQU1FKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlwbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0RGVmYXVsdChQUkVGX0RPV05MT0FEX01FU1NBR0VfS0VZLCBmYWxzZSk7CisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnN0YXJ0KGNvbnRleHQpOworICAgICAgICBwbHVnaW4gPSB0aGlzOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShSRVNPVVJDRV9OQU1FKTsKKyAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VCdW5kbGUgPSBudWxsOworICAgICAgICB9CisgICAgICAgIHBsdWdpbi5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXREZWZhdWx0KFBSRUZfRE9XTkxPQURfTUVTU0FHRV9LRVksIGZhbHNlKTsKIAotCQlTZXJ2ZXJQcm9qZWN0TWFuYWdlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZVByb2plY3RzKCk7Ci0JfQorICAgICAgICBTZXJ2ZXJQcm9qZWN0TWFuYWdlci5nZXRJbnN0YW5jZSgpLnVwZGF0ZVByb2plY3RzKCk7CisgICAgfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9CisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwbHVnaW4gPSBudWxsOworICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KEltYWdlUmVnaXN0cnkgcmVnKSB7Ci0JCVNlcnZlclVpSW1hZ2VzLmluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KHJlZyk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KEltYWdlUmVnaXN0cnkgcmVnKSB7CisgICAgICAgIFNlcnZlclVpSW1hZ2VzLmluaXRpYWxpemVJbWFnZVJlZ2lzdHJ5KHJlZyk7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICogCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJVaVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2VydmVyVWlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKKyAgICAgICAgcmV0dXJuIHBsdWdpbjsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgeworICAgICAgICBnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7CisgICAgfQogCi0JLyoqCi0JICogV3JpdGVzIHRoZSBtZXNzYWdlIHRvIHRoZSBwbHVnLWluJ3MgbG9nCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIHdyaXRlIHRvIHRoZSBsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gY3JlYXRlRXJyb3JTdGF0dXMobWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgdG8gdGhlIHBsdWctaW4ncyBsb2cKKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSB0ZXh0IHRvIHdyaXRlIHRvIHRoZSBsb2cKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAgICAgIElTdGF0dXMgc3RhdHVzID0gY3JlYXRlRXJyb3JTdGF0dXMobWVzc2FnZSwgZXhjZXB0aW9uKTsKKyAgICAgICAgZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGNyZWF0ZUVycm9yU3RhdHVzKCJJbnRlcm5hbCBFcnJvciIsIGV4Y2VwdGlvbikpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleGNlcHRpb24pIHsKKyAgICAgICAgZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhjcmVhdGVFcnJvclN0YXR1cygiSW50ZXJuYWwgRXJyb3IiLCBleGNlcHRpb24pKTsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IDxjb2RlPklTdGF0dXM8L2NvZGU+IGZvciB0aGlzIHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJbWVzc2FnZSA9ICIiOwotCQl9Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgMCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyA8Y29kZT5JU3RhdHVzPC9jb2RlPiBmb3IgdGhpcyBwbHVnLWluCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIDAsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJU3RyaW5nIGJ1bmRsZVN0cmluZzsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlidW5kbGVTdHJpbmcgPSBidW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCWxvZyhlKTsKLQkJCQlidW5kbGVTdHJpbmcgPSAiISIgKyBrZXkgKyAiISI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlidW5kbGVTdHJpbmcgPSAiISIgKyBrZXkgKyAiISI7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZVN0cmluZzsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwgb3IgJ2tleScgaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKKyAgICAgICAgU3RyaW5nIGJ1bmRsZVN0cmluZzsKKyAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7CisgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBidW5kbGVTdHJpbmcgPSBidW5kbGUuZ2V0U3RyaW5nKGtleSk7CisgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZyhlKTsKKyAgICAgICAgICAgICAgICBidW5kbGVTdHJpbmcgPSAiISIgKyBrZXkgKyAiISI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidW5kbGVTdHJpbmcgPSAiISIgKyBrZXkgKyAiISI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1bmRsZVN0cmluZzsKKyAgICB9CiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIGZpbmFsIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlQnVuZGxlOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL1ZpcmdvTGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvVmlyZ29MYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAuamF2YQppbmRleCBlMGQyYmJiLi4yN2E3N2UxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvVmlyZ29MYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvVmlyZ29MYXVuY2hDb25maWd1cmF0aW9uVGFiR3JvdXAuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLkFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwOwpAQCAtMjYsMjAgKzI3LDIwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBWaXJnb0xhdW5jaENvbmZpZ3VyYXRpb25UYWJHcm91cCBleHRlbmRzIEFic3RyYWN0TGF1bmNoQ29uZmlndXJhdGlvblRhYkdyb3VwIHsKIAotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2cgZGlhbG9nLCBTdHJpbmcgbW9kZSkgewotCQlJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdIHRhYnMgPSBuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbNl07Ci0JCXRhYnNbMF0gPSBuZXcgU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYihuZXcgU3RyaW5nW10geyBTZXJ2ZXJDb3JlUGx1Z2luLlZJUkdPX1NFUlZFUl9JRCB9KTsKLQkJdGFic1swXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXRhYnNbMV0gPSBuZXcgSmF2YUFyZ3VtZW50c1RhYigpOwotCQl0YWJzWzFdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1syXSA9IG5ldyBKYXZhQ2xhc3NwYXRoVGFiKCk7Ci0JCXRhYnNbMl0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOwotCQl0YWJzWzNdID0gbmV3IFNvdXJjZUxvb2t1cFRhYigpOwotCQl0YWJzWzNdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1s0XSA9IG5ldyBFbnZpcm9ubWVudFRhYigpOwotCQl0YWJzWzRdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKLQkJdGFic1s1XSA9IG5ldyBDb21tb25UYWIoKTsKLQkJdGFic1s1XS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7Ci0JCXNldFRhYnModGFicyk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVRhYnMoSUxhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2cgZGlhbG9nLCBTdHJpbmcgbW9kZSkgeworICAgICAgICBJTGF1bmNoQ29uZmlndXJhdGlvblRhYltdIHRhYnMgPSBuZXcgSUxhdW5jaENvbmZpZ3VyYXRpb25UYWJbNl07CisgICAgICAgIHRhYnNbMF0gPSBuZXcgU2VydmVyTGF1bmNoQ29uZmlndXJhdGlvblRhYihuZXcgU3RyaW5nW10geyBTZXJ2ZXJDb3JlUGx1Z2luLlZJUkdPX1NFUlZFUl9JRCB9KTsKKyAgICAgICAgdGFic1swXS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7CisgICAgICAgIHRhYnNbMV0gPSBuZXcgSmF2YUFyZ3VtZW50c1RhYigpOworICAgICAgICB0YWJzWzFdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKKyAgICAgICAgdGFic1syXSA9IG5ldyBKYXZhQ2xhc3NwYXRoVGFiKCk7CisgICAgICAgIHRhYnNbMl0uc2V0TGF1bmNoQ29uZmlndXJhdGlvbkRpYWxvZyhkaWFsb2cpOworICAgICAgICB0YWJzWzNdID0gbmV3IFNvdXJjZUxvb2t1cFRhYigpOworICAgICAgICB0YWJzWzNdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKKyAgICAgICAgdGFic1s0XSA9IG5ldyBFbnZpcm9ubWVudFRhYigpOworICAgICAgICB0YWJzWzRdLnNldExhdW5jaENvbmZpZ3VyYXRpb25EaWFsb2coZGlhbG9nKTsKKyAgICAgICAgdGFic1s1XSA9IG5ldyBDb21tb25UYWIoKTsKKyAgICAgICAgdGFic1s1XS5zZXRMYXVuY2hDb25maWd1cmF0aW9uRGlhbG9nKGRpYWxvZyk7CisgICAgICAgIHNldFRhYnModGFicyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL1ZpcmdvU2VydmVyUnVudGltZVdpemFyZEZyYWdtZW50LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvVmlyZ29TZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YQppbmRleCBlOTdhODdlLi43NmY1Mzk5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvVmlyZ29TZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvVmlyZ29TZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKQEAgLTI1LDQ3ICsyNiw0NiBAQAogICovCiBwdWJsaWMgY2xhc3MgVmlyZ29TZXJ2ZXJSdW50aW1lV2l6YXJkRnJhZ21lbnQgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCB7CiAKLQlwcm90ZWN0ZWQgU2VydmVyUnVudGltZUNvbXBvc2l0ZSBjb21wOworICAgIHByb3RlY3RlZCBTZXJ2ZXJSdW50aW1lQ29tcG9zaXRlIGNvbXA7CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21wb3NpdGUoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCUlSdW50aW1lV29ya2luZ0NvcHkgcnVudGltZSA9IChJUnVudGltZVdvcmtpbmdDb3B5KSBnZXRUYXNrTW9kZWwoKS5nZXRPYmplY3QoVGFza01vZGVsLlRBU0tfUlVOVElNRSk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKKyAgICAgICAgSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gKElSdW50aW1lV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKIAotCQlpZiAocnVudGltZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSVN0YXR1cyBzdGF0dXMgPSBydW50aW1lLnZhbGlkYXRlKG51bGwpOwotCQlyZXR1cm4gKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpOwotCX0KKyAgICAgICAgaWYgKHJ1bnRpbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIElTdGF0dXMgc3RhdHVzID0gcnVudGltZS52YWxpZGF0ZShudWxsKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1I7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgSVdpemFyZEhhbmRsZSB3aXphcmQpIHsKLQkJU3RyaW5nIHdpemFyZFRpdGxlID0gU2VydmVyVWlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInZpcmdvV2l6YXJkVGl0bGUiKTsKLQkJU3RyaW5nIHdpemFyZERlc2NyaXB0aW9uID0gU2VydmVyVWlQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoInZpcmdvV2l6YXJkRGVzY3JpcHRpb24iKTsKLQkJY29tcCA9IG5ldyBTZXJ2ZXJSdW50aW1lQ29tcG9zaXRlKHBhcmVudCwgd2l6YXJkLCB3aXphcmRUaXRsZSwgd2l6YXJkRGVzY3JpcHRpb24sCi0JCQkJU2VydmVyVWlJbWFnZXMuREVTQ19XSVpCX1ZJUkdPX1NFUlZFUik7Ci0JCXJldHVybiBjb21wOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBJV2l6YXJkSGFuZGxlIHdpemFyZCkgeworICAgICAgICBTdHJpbmcgd2l6YXJkVGl0bGUgPSBTZXJ2ZXJVaVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygidmlyZ29XaXphcmRUaXRsZSIpOworICAgICAgICBTdHJpbmcgd2l6YXJkRGVzY3JpcHRpb24gPSBTZXJ2ZXJVaVBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygidmlyZ29XaXphcmREZXNjcmlwdGlvbiIpOworICAgICAgICB0aGlzLmNvbXAgPSBuZXcgU2VydmVyUnVudGltZUNvbXBvc2l0ZShwYXJlbnQsIHdpemFyZCwgd2l6YXJkVGl0bGUsIHdpemFyZERlc2NyaXB0aW9uLCBTZXJ2ZXJVaUltYWdlcy5ERVNDX1dJWkJfVklSR09fU0VSVkVSKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29tcDsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbnRlcigpIHsKLQkJaWYgKGNvbXAgIT0gbnVsbCkgewotCQkJSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gKElSdW50aW1lV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKLQkJCWNvbXAuc2V0UnVudGltZShydW50aW1lKTsKLQkJfQotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBlbnRlcigpIHsKKyAgICAgICAgaWYgKHRoaXMuY29tcCAhPSBudWxsKSB7CisgICAgICAgICAgICBJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOworICAgICAgICAgICAgdGhpcy5jb21wLnNldFJ1bnRpbWUocnVudGltZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBleGl0KCkgewotCQlJUnVudGltZVdvcmtpbmdDb3B5IHJ1bnRpbWUgPSAoSVJ1bnRpbWVXb3JraW5nQ29weSkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KFRhc2tNb2RlbC5UQVNLX1JVTlRJTUUpOwotCQlJUGF0aCBwYXRoID0gcnVudGltZS5nZXRMb2NhdGlvbigpOwotCQlpZiAocnVudGltZS52YWxpZGF0ZShudWxsKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpIHsKLQkJCVNlcnZlckNvcmVQbHVnaW4uc2V0UHJlZmVyZW5jZSgibG9jYXRpb24iICsgcnVudGltZS5nZXRSdW50aW1lVHlwZSgpLmdldElkKCksIHBhdGgudG9TdHJpbmcoKSk7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhpdCgpIHsKKyAgICAgICAgSVJ1bnRpbWVXb3JraW5nQ29weSBydW50aW1lID0gKElSdW50aW1lV29ya2luZ0NvcHkpIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChUYXNrTW9kZWwuVEFTS19SVU5USU1FKTsKKyAgICAgICAgSVBhdGggcGF0aCA9IHJ1bnRpbWUuZ2V0TG9jYXRpb24oKTsKKyAgICAgICAgaWYgKHJ1bnRpbWUudmFsaWRhdGUobnVsbCkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SKSB7CisgICAgICAgICAgICBTZXJ2ZXJDb3JlUGx1Z2luLnNldFByZWZlcmVuY2UoImxvY2F0aW9uIiArIHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpLCBwYXRoLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2FjdGlvbnMvT3BlbkJ1bmRsZU1hbmlmZXN0QWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvYWN0aW9ucy9PcGVuQnVuZGxlTWFuaWZlc3RBY3Rpb24uamF2YQppbmRleCBiNWI0MjUwLi5mMTkwZDRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvYWN0aW9ucy9PcGVuQnVuZGxlTWFuaWZlc3RBY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvYWN0aW9ucy9PcGVuQnVuZGxlTWFuaWZlc3RBY3Rpb24uamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5hY3Rpb25zOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CkBAIC0yMSwzMyArMjIsMzMgQEAKIAogLyoqCiAgKiBPcGVuIHRoZSBtYW5pZmVzdCBmb3IgdGhlIHN1cHBsaWVkIGJ1bmRsZS4KLSAqIAorICoKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCiAgKiBAc2luY2UgMS4wLjAKICAqLwogcHVibGljIGNsYXNzIE9wZW5CdW5kbGVNYW5pZmVzdEFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7CiAKLQlMb2NhbEJ1bmRsZUFydGVmYWN0IGFydGVmYWN0OworICAgIExvY2FsQnVuZGxlQXJ0ZWZhY3QgYXJ0ZWZhY3Q7CiAKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gaGVyZQotCX0KKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7CisgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYXJ0ZWZhY3QgIT0gbnVsbCkgewotCQkJQnVuZGxlTWFuaWZlc3RFZGl0b3Iub3BlbkV4dGVybmFsUGx1Z2luKGFydGVmYWN0LmdldEZpbGUoKSwgQnVuZGxlTW9kZWxVdGlsaXR5LkZfTUFOSUZFU1RfRlApOwotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgeworICAgICAgICBpZiAodGhpcy5hcnRlZmFjdCAhPSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdEVkaXRvci5vcGVuRXh0ZXJuYWxQbHVnaW4odGhpcy5hcnRlZmFjdC5nZXRGaWxlKCksIEJ1bmRsZU1vZGVsVXRpbGl0eS5GX01BTklGRVNUX0ZQKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIExvY2FsQnVuZGxlQXJ0ZWZhY3QpIHsKLQkJCQkJYXJ0ZWZhY3QgPSAoTG9jYWxCdW5kbGVBcnRlZmFjdCkgb2JqOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworICAgICAgICBpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBMb2NhbEJ1bmRsZUFydGVmYWN0KSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJ0ZWZhY3QgPSAoTG9jYWxCdW5kbGVBcnRlZmFjdCkgb2JqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2FjdGlvbnMvT3BlblByb2plY3RNYW5pZmVzdEFjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2FjdGlvbnMvT3BlblByb2plY3RNYW5pZmVzdEFjdGlvbi5qYXZhCmluZGV4IGFmMjQyNDIuLmQ4MTdmYzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9hY3Rpb25zL09wZW5Qcm9qZWN0TWFuaWZlc3RBY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvYWN0aW9ucy9PcGVuUHJvamVjdE1hbmlmZXN0QWN0aW9uLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkuYWN0aW9uczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwpAQCAtMzcsNjIgKzM4LDYwIEBACiAKIC8qKgogICogQWN0aW9uIGltcGxlbWVudGF0aW9uIHRoYXQgb3BlbnMgYSBNQU5JRkVTVC5NRiBvciBwYXIueG1sIGZpbGUgb2YgdGhlIHNlbGVjdGVkIG1vZHVsZS4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCiBwdWJsaWMgY2xhc3MgT3BlblByb2plY3RNYW5pZmVzdEFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7CiAKLQlwcml2YXRlIElNb2R1bGUgc2VsZWN0ZWRNb2R1bGU7CisgICAgcHJpdmF0ZSBJTW9kdWxlIHNlbGVjdGVkTW9kdWxlOwogCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUKLQl9CisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgeworICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHNlbGVjdGVkTW9kdWxlLmdldFByb2plY3QoKTsKLQkJaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQlvcGVuUmVzb3VyY2UoQnVuZGxlTWFuaWZlc3RVdGlscy5sb2NhdGVNYW5pZmVzdChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCksIGZhbHNlKSk7Ci0JCX0gZWxzZSBpZiAoRmFjZXRVdGlscy5pc1BhclByb2plY3QocHJvamVjdCkpIHsKLQkJCW9wZW5SZXNvdXJjZShwcm9qZWN0LmZpbmRNZW1iZXIoQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLk1BTklGRVNUX0ZJTEVfTE9DQVRJT04pKTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKEZhY2V0VXRpbHMuaGFzTmF0dXJlKHByb2plY3QsIEphdmFDb3JlLk5BVFVSRV9JRCkKLQkJCQkJCSYmIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldChwcm9qZWN0LCBGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKSkgewotCQkJCQlvcGVuUmVzb3VyY2UoQnVuZGxlTWFuaWZlc3RVdGlscy5sb2NhdGVNYW5pZmVzdChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCksIGZhbHNlKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkJIlByb2JsZW0gb2NjdXJyZWQgd2hpbGUgb3BlbmVpbmcgcHJvamVjdCBtYW5pZmVzdC4iLCBlKSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CisgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSB0aGlzLnNlbGVjdGVkTW9kdWxlLmdldFByb2plY3QoKTsKKyAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNCdW5kbGVQcm9qZWN0KHByb2plY3QpKSB7CisgICAgICAgICAgICBvcGVuUmVzb3VyY2UoQnVuZGxlTWFuaWZlc3RVdGlscy5sb2NhdGVNYW5pZmVzdChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCksIGZhbHNlKSk7CisgICAgICAgIH0gZWxzZSBpZiAoRmFjZXRVdGlscy5pc1BhclByb2plY3QocHJvamVjdCkpIHsKKyAgICAgICAgICAgIG9wZW5SZXNvdXJjZShwcm9qZWN0LmZpbmRNZW1iZXIoQnVuZGxlTWFuaWZlc3RDb3JlUGx1Z2luLk1BTklGRVNUX0ZJTEVfTE9DQVRJT04pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKEZhY2V0VXRpbHMuaGFzTmF0dXJlKHByb2plY3QsIEphdmFDb3JlLk5BVFVSRV9JRCkKKyAgICAgICAgICAgICAgICAgICAgJiYgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuaGFzUHJvamVjdEZhY2V0KHByb2plY3QsIEZhY2V0Q29yZVBsdWdpbi5XRUJfRkFDRVRfSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIG9wZW5SZXNvdXJjZShCdW5kbGVNYW5pZmVzdFV0aWxzLmxvY2F0ZU1hbmlmZXN0KEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQsICJQcm9ibGVtIG9jY3VycmVkIHdoaWxlIG9wZW5laW5nIHByb2plY3QgbWFuaWZlc3QuIiwgZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIG9wZW5SZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCXRyeSB7Ci0JCQkJSURFLm9wZW5FZGl0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCksIChJRmlsZSkgcmVzb3VyY2UpOwotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJCSJQcm9ibGVtIG9jY3VycmVkIHdoaWxlIG9wZW5pbmcgcHJvamVjdCBtYW5pZmVzdC4iLCBlKSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHJpdmF0ZSB2b2lkIG9wZW5SZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSURFLm9wZW5FZGl0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCksIChJRmlsZSkgcmVzb3VyY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgIlByb2JsZW0gb2NjdXJyZWQgd2hpbGUgb3BlbmluZyBwcm9qZWN0IG1hbmlmZXN0LiIsIGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkTW9kdWxlID0gbnVsbDsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlPYmplY3Qgb2JqID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7Ci0JCQkJCU1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIG9iajsKLQkJCQkJc2VsZWN0ZWRNb2R1bGUgPSBtcy5tb2R1bGVbbXMubW9kdWxlLmxlbmd0aCAtIDFdOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworICAgICAgICB0aGlzLnNlbGVjdGVkTW9kdWxlID0gbnVsbDsKKyAgICAgICAgaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBPYmplY3Qgb2JqID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgTW9kdWxlU2VydmVyKSB7CisgICAgICAgICAgICAgICAgICAgIE1vZHVsZVNlcnZlciBtcyA9IChNb2R1bGVTZXJ2ZXIpIG9iajsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1vZHVsZSA9IG1zLm1vZHVsZVttcy5tb2R1bGUubGVuZ3RoIC0gMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvYWN0aW9ucy9PcGVuU2VydmVyUHJvamVjdEZpbGVBY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9hY3Rpb25zL09wZW5TZXJ2ZXJQcm9qZWN0RmlsZUFjdGlvbi5qYXZhCmluZGV4IDhkYmI2MDIuLjRiNzk0ZjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9hY3Rpb25zL09wZW5TZXJ2ZXJQcm9qZWN0RmlsZUFjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9hY3Rpb25zL09wZW5TZXJ2ZXJQcm9qZWN0RmlsZUFjdGlvbi5qYXZhCkBAIC05LDYgKzksNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkuYWN0aW9uczsKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKQEAgLTM5LDExMSArNDAsOTcgQEAKICAqIDxwPgogICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkOyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KICAqIDwvcD4KLSAqIAorICoKICAqIEBhdXRob3IgT3RoZXJzCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgogICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KICAqLwogcHVibGljIGNsYXNzIE9wZW5TZXJ2ZXJQcm9qZWN0RmlsZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIHsKIAotCS8qKgotCSAqIFRoZSBpZCBvZiB0aGlzIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IFBsYXRmb3JtVUkuUExVR0lOX0lEICsgIi5PcGVuRmlsZUFjdGlvbiI7Ly8kTk9OLU5MUy0xJAorICAgIC8qKgorICAgICAqIFRoZSBpZCBvZiB0aGlzIGFjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IFBsYXRmb3JtVUkuUExVR0lOX0lEICsgIi5PcGVuRmlsZUFjdGlvbiI7Ly8kTk9OLU5MUy0xJAogCi0JLyoqCi0JICogVGhlIGVkaXRvciB0byBvcGVuLgotCSAqLwotCXByaXZhdGUgZmluYWwgSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzY3JpcHRvcjsKKyAgICBwcml2YXRlIGZpbmFsIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UyOwogCi0JcHJpdmF0ZSBmaW5hbCBJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlMjsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiB0aGF0IHdpbGwgb3BlbiBlZGl0b3JzIG9uIHRoZSB0aGVuLXNlbGVjdGVkIGZpbGUgcmVzb3VyY2VzLiBFcXVpdmFsZW50IHRvCisgICAgICogPGNvZGU+T3BlbkZpbGVBY3Rpb24ocGFnZSxudWxsKTwvY29kZT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFnZSB0aGUgd29ya2JlbmNoIHBhZ2UgaW4gd2hpY2ggdG8gb3BlbiB0aGUgZWRpdG9yCisgICAgICovCisgICAgcHVibGljIE9wZW5TZXJ2ZXJQcm9qZWN0RmlsZUFjdGlvbihJV29ya2JlbmNoUGFnZSBwYWdlKSB7CisgICAgICAgIHRoaXMocGFnZSwgbnVsbCk7CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhY3Rpb24gdGhhdCB3aWxsIG9wZW4gZWRpdG9ycyBvbiB0aGUgdGhlbi1zZWxlY3RlZCBmaWxlIHJlc291cmNlcy4gRXF1aXZhbGVudCB0bwotCSAqIDxjb2RlPk9wZW5GaWxlQWN0aW9uKHBhZ2UsbnVsbCk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYWdlCi0JICogICAgICAgICAgICB0aGUgd29ya2JlbmNoIHBhZ2UgaW4gd2hpY2ggdG8gb3BlbiB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIE9wZW5TZXJ2ZXJQcm9qZWN0RmlsZUFjdGlvbihJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCXRoaXMocGFnZSwgbnVsbCk7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIHRoYXQgd2lsbCBvcGVuIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGVkaXRvciBvbiB0aGUgdGhlbi1zZWxlY3RlZCBmaWxlIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWdlIHRoZSB3b3JrYmVuY2ggcGFnZSBpbiB3aGljaCB0byBvcGVuIHRoZSBlZGl0b3IKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgZWRpdG9yIGRlc2NyaXB0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuc3BlY2lmaWVkCisgICAgICovCisgICAgcHVibGljIE9wZW5TZXJ2ZXJQcm9qZWN0RmlsZUFjdGlvbihJV29ya2JlbmNoUGFnZSBwYWdlLCBJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgICAgICAgIHN1cGVyKCJPcGVuIExpbmtlZCBGaWxlIik7CisgICAgICAgIHRoaXMud29ya2JlbmNoUGFnZTIgPSBwYWdlOworICAgICAgICBzZXRUZXh0KGRlc2NyaXB0b3IgPT0gbnVsbCA/IElERVdvcmtiZW5jaE1lc3NhZ2VzLk9wZW5GaWxlQWN0aW9uX3RleHQgOiBkZXNjcmlwdG9yLmdldExhYmVsKCkpOworICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIElJREVIZWxwQ29udGV4dElkcy5PUEVOX0ZJTEVfQUNUSU9OKTsKKyAgICAgICAgc2V0VG9vbFRpcFRleHQoSURFV29ya2JlbmNoTWVzc2FnZXMuT3BlbkZpbGVBY3Rpb25fdG9vbFRpcCk7CisgICAgICAgIHNldElkKElEKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiB0aGF0IHdpbGwgb3BlbiBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpZmllZCBlZGl0b3Igb24gdGhlIHRoZW4tc2VsZWN0ZWQgZmlsZSByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIHBhZ2UKLQkgKiAgICAgICAgICAgIHRoZSB3b3JrYmVuY2ggcGFnZSBpbiB3aGljaCB0byBvcGVuIHRoZSBlZGl0b3IKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqICAgICAgICAgICAgdGhlIGVkaXRvciBkZXNjcmlwdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bnNwZWNpZmllZAotCSAqLwotCXB1YmxpYyBPcGVuU2VydmVyUHJvamVjdEZpbGVBY3Rpb24oSVdvcmtiZW5jaFBhZ2UgcGFnZSwgSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlzdXBlcigiT3BlbiBMaW5rZWQgRmlsZSIpOwotCQl0aGlzLndvcmtiZW5jaFBhZ2UyID0gcGFnZTsKLQkJc2V0VGV4dChkZXNjcmlwdG9yID09IG51bGwgPyBJREVXb3JrYmVuY2hNZXNzYWdlcy5PcGVuRmlsZUFjdGlvbl90ZXh0IDogZGVzY3JpcHRvci5nZXRMYWJlbCgpKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBJSURFSGVscENvbnRleHRJZHMuT1BFTl9GSUxFX0FDVElPTik7Ci0JCXNldFRvb2xUaXBUZXh0KElERVdvcmtiZW5jaE1lc3NhZ2VzLk9wZW5GaWxlQWN0aW9uX3Rvb2xUaXApOwotCQlzZXRJZChJRCk7Ci0JCXRoaXMuZWRpdG9yRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5PcGVuU3lzdGVtRWRpdG9yQWN0aW9uI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKyAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CisgICAgICAgIHJldHVybiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uCisgICAgICAgICAgICAmJiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2plY3RGaWxlUmVmZXJlbmNlIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSB8fCBlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyRmlsZSk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLk9wZW5TeXN0ZW1FZGl0b3JBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3QgZWxlbWVudCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJcmV0dXJuIHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCQkmJiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2plY3RGaWxlUmVmZXJlbmNlIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSB8fCBlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyRmlsZSk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5PcGVuU3lzdGVtRWRpdG9yQWN0aW9uI3J1bigpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgUHJvamVjdEZpbGVSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgICAgICBvcGVuRmlsZSgoKFByb2plY3RGaWxlUmVmZXJlbmNlKSBuZXh0KS5nZXRXb3Jrc3BhY2VGaWxlKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0IGluc3RhbmNlb2YgSUZpbGUpIHsKKyAgICAgICAgICAgICAgICBvcGVuRmlsZSgoSUZpbGUpIG5leHQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0IGluc3RhbmNlb2YgU2VydmVyRmlsZVNlbGVjdGlvbikgeworICAgICAgICAgICAgICAgIG9wZW5GaWxlKChTZXJ2ZXJGaWxlU2VsZWN0aW9uKSBuZXh0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCBpbnN0YW5jZW9mIFNlcnZlckZpbGUpIHsKKyAgICAgICAgICAgICAgICBvcGVuRmlsZSgoKFNlcnZlckZpbGUpIG5leHQpLmdldEZpbGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuT3BlblN5c3RlbUVkaXRvckFjdGlvbiNydW4oKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIFByb2plY3RGaWxlUmVmZXJlbmNlKSB7Ci0JCQkJb3BlbkZpbGUoKChQcm9qZWN0RmlsZVJlZmVyZW5jZSkgbmV4dCkuZ2V0V29ya3NwYWNlRmlsZSgpKTsKLQkJCX0gZWxzZSBpZiAobmV4dCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJb3BlbkZpbGUoKElGaWxlKSBuZXh0KTsKLQkJCX0gZWxzZSBpZiAobmV4dCBpbnN0YW5jZW9mIFNlcnZlckZpbGVTZWxlY3Rpb24pIHsKLQkJCQlvcGVuRmlsZSgoU2VydmVyRmlsZVNlbGVjdGlvbikgbmV4dCk7Ci0JCQl9IGVsc2UgaWYgKG5leHQgaW5zdGFuY2VvZiBTZXJ2ZXJGaWxlKSB7Ci0JCQkJb3BlbkZpbGUoKChTZXJ2ZXJGaWxlKSBuZXh0KS5nZXRGaWxlKCkpOwotCQkJfQotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIG9wZW5GaWxlKFNlcnZlckZpbGVTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisgICAgICAgIElFZGl0b3JQYXJ0IG9wZW5FZGl0b3IgPSBvcGVuRmlsZShzZWxlY3Rpb24uZ2V0RmlsZSgpKTsKKyAgICAgICAgaWYgKG9wZW5FZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgeworICAgICAgICAgICAgKChJVGV4dEVkaXRvcikgb3BlbkVkaXRvcikuc2VsZWN0QW5kUmV2ZWFsKHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIG9wZW5GaWxlKFNlcnZlckZpbGVTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlFZGl0b3JQYXJ0IG9wZW5FZGl0b3IgPSBvcGVuRmlsZShzZWxlY3Rpb24uZ2V0RmlsZSgpKTsKLQkJaWYgKG9wZW5FZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJKChJVGV4dEVkaXRvcikgb3BlbkVkaXRvcikuc2VsZWN0QW5kUmV2ZWFsKHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJRWRpdG9yUGFydCBvcGVuRmlsZShJRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlJRWRpdG9yRGVzY3JpcHRvciBkZWZhdWx0RWRpdG9yID0gd29ya2JlbmNoUGFnZTIuZ2V0V29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRFZGl0b3JSZWdpc3RyeSgpCi0JCQkJCS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCWlmIChkZWZhdWx0RWRpdG9yID09IG51bGwpIHsKLQkJCQlkZWZhdWx0RWRpdG9yID0gd29ya2JlbmNoUGFnZTIuZ2V0V29ya2JlbmNoV2luZG93KCkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEVkaXRvclJlZ2lzdHJ5KCkKLQkJCQkJCS5nZXREZWZhdWx0RWRpdG9yKCJmYWtlLnR4dCIpOwotCQkJfQotCQkJaWYgKGRlZmF1bHRFZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IG9wZW5FZGl0b3IgPSB3b3JrYmVuY2hQYWdlMi5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSksIGRlZmF1bHRFZGl0b3IuZ2V0SWQoKSk7Ci0JCQkJcmV0dXJuIG9wZW5FZGl0b3I7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCURpYWxvZ1V0aWwub3BlbkVycm9yKHdvcmtiZW5jaFBhZ2UyLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCUlERVdvcmtiZW5jaE1lc3NhZ2VzLk9wZW5TeXN0ZW1FZGl0b3JBY3Rpb25fZGlhbG9nVGl0bGUsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgcHVibGljIElFZGl0b3JQYXJ0IG9wZW5GaWxlKElGaWxlIGZpbGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElFZGl0b3JEZXNjcmlwdG9yIGRlZmF1bHRFZGl0b3IgPSB0aGlzLndvcmtiZW5jaFBhZ2UyLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCkuZ2V0RGVmYXVsdEVkaXRvcigKKyAgICAgICAgICAgICAgICBmaWxlLmdldE5hbWUoKSk7CisgICAgICAgICAgICBpZiAoZGVmYXVsdEVkaXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVmYXVsdEVkaXRvciA9IHRoaXMud29ya2JlbmNoUGFnZTIuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXREZWZhdWx0RWRpdG9yKCJmYWtlLnR4dCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlZmF1bHRFZGl0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIElFZGl0b3JQYXJ0IG9wZW5FZGl0b3IgPSB0aGlzLndvcmtiZW5jaFBhZ2UyLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgZGVmYXVsdEVkaXRvci5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3BlbkVkaXRvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgRGlhbG9nVXRpbC5vcGVuRXJyb3IodGhpcy53b3JrYmVuY2hQYWdlMi5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBJREVXb3JrYmVuY2hNZXNzYWdlcy5PcGVuU3lzdGVtRWRpdG9yQWN0aW9uX2RpYWxvZ1RpdGxlLAorICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZWRlcGxveUJ1bmRsZUFjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2FjdGlvbnMvUmVkZXBsb3lCdW5kbGVBY3Rpb24uamF2YQppbmRleCA5OWU1NmNhLi40MTMwNDlmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvYWN0aW9ucy9SZWRlcGxveUJ1bmRsZUFjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9hY3Rpb25zL1JlZGVwbG95QnVuZGxlQWN0aW9uLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkuYWN0aW9uczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CkBAIC0zMCw3NyArMzEsNzcgQEAKIAogLyoqCiAgKiBBY3Rpb24gaW1wbGVtZW50YXRpb24gdGhhdCByZWRlcGxveXMgdGhlIHNlbGVjdGVkIG1vZHVsZSBvciBidW5kbGUKLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCiBwdWJsaWMgY2xhc3MgUmVkZXBsb3lCdW5kbGVBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewogCi0JcHJpdmF0ZSBJTW9kdWxlIHNlbGVjdGVkTW9kdWxlOworICAgIHByaXZhdGUgSU1vZHVsZSBzZWxlY3RlZE1vZHVsZTsKIAotCXByaXZhdGUgSVNlcnZlciBzZXJ2ZXI7CisgICAgcHJpdmF0ZSBJU2VydmVyIHNlcnZlcjsKIAotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJLy8gbm90aGluZyB0byBkbyBoZXJlCi0JfQorICAgIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKKyAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlCisgICAgfQogCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CisgICAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7CiAKLQkJaWYgKHNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgewotCQkJcmV0dXJuOwotCQl9CisgICAgICAgIGlmICh0aGlzLnNlcnZlci5nZXRTZXJ2ZXJTdGF0ZSgpICE9IElTZXJ2ZXIuU1RBVEVfU1RBUlRFRCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJSm9iIHB1Ymxpc2hKb2IgPSBuZXcgSm9iKCJSZWRlcGxveSBvZiBtb2R1bGUgJyIgKyBzZWxlY3RlZE1vZHVsZS5nZXROYW1lKCkgKyAiJyIpIHsKKyAgICAgICAgSm9iIHB1Ymxpc2hKb2IgPSBuZXcgSm9iKCJSZWRlcGxveSBvZiBtb2R1bGUgJyIgKyB0aGlzLnNlbGVjdGVkTW9kdWxlLmdldE5hbWUoKSArICInIikgewogCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlJU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91ciA9IChJU2VydmVyQmVoYXZpb3VyKSBzZXJ2ZXIubG9hZEFkYXB0ZXIoSVNlcnZlckJlaGF2aW91ci5jbGFzcywgbnVsbCk7Ci0JCQkJLy8gUEFSIHNlbGVjdGVkCi0JCQkJaWYgKEZhY2V0Q29yZVBsdWdpbi5QQVJfRkFDRVRfSUQuZXF1YWxzKHNlbGVjdGVkTW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKSkgewotCQkJCQliZWhhdmlvdXIuZ2V0U2VydmVyRGVwbG95ZXIoKS5yZWRlcGxveShzZWxlY3RlZE1vZHVsZSk7Ci0JCQkJfQotCQkJCS8vIEJ1bmRsZSBzZWxlY3RlZAotCQkJCWVsc2UgaWYgKEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQuZXF1YWxzKHNlbGVjdGVkTW9kdWxlLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpKSkgewotCQkJCQlMaXN0PElNb2R1bGU+IG1vZHVsZXMgPSBBcnJheXMuYXNMaXN0KHNlcnZlci5nZXRNb2R1bGVzKCkpOwotCQkJCQlpZiAobW9kdWxlcy5jb250YWlucyhzZWxlY3RlZE1vZHVsZSkpIHsKLQkJCQkJCS8vIFNpbmdsZSBkZXBsb3llZCBtb2R1bGUKLQkJCQkJCWJlaGF2aW91ci5nZXRTZXJ2ZXJEZXBsb3llcigpLnJlZGVwbG95KHNlbGVjdGVkTW9kdWxlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBtb2R1bGVzKSB7Ci0JCQkJCQkJTGlzdDxJTW9kdWxlPiBjaGlsZE1vZHVsZXMgPSBBcnJheXMuYXNMaXN0KHNlcnZlci5nZXRDaGlsZE1vZHVsZXMobmV3IElNb2R1bGVbXSB7IG1vZHVsZSB9LAotCQkJCQkJCQkJbnVsbCkpOwotCQkJCQkJCWlmIChjaGlsZE1vZHVsZXMuY29udGFpbnMoc2VsZWN0ZWRNb2R1bGUpCi0JCQkJCQkJCQkmJiBGYWNldENvcmVQbHVnaW4uUEFSX0ZBQ0VUX0lELmVxdWFscyhtb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpKSB7Ci0JCQkJCQkJCWJlaGF2aW91ci5nZXRTZXJ2ZXJEZXBsb3llcigpLnJlZnJlc2gobW9kdWxlLCBzZWxlY3RlZE1vZHVsZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIFdlYiBtb2R1bGUgc2VsZWN0ZWQKLQkJCQllbHNlIGlmIChGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lELmVxdWFscyhzZWxlY3RlZE1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpIHsKLQkJCQkJYmVoYXZpb3VyLmdldFNlcnZlckRlcGxveWVyKCkucmVkZXBsb3koc2VsZWN0ZWRNb2R1bGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJcHVibGlzaEpvYi5zZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOwotCQlwdWJsaXNoSm9iLnNjaGVkdWxlKCk7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKyAgICAgICAgICAgICAgICBJU2VydmVyQmVoYXZpb3VyIGJlaGF2aW91ciA9IChJU2VydmVyQmVoYXZpb3VyKSBSZWRlcGxveUJ1bmRsZUFjdGlvbi50aGlzLnNlcnZlci5sb2FkQWRhcHRlcihJU2VydmVyQmVoYXZpb3VyLmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgICAgICAvLyBQQVIgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICBpZiAoRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRC5lcXVhbHMoUmVkZXBsb3lCdW5kbGVBY3Rpb24udGhpcy5zZWxlY3RlZE1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3VyLmdldFNlcnZlckRlcGxveWVyKCkucmVkZXBsb3koUmVkZXBsb3lCdW5kbGVBY3Rpb24udGhpcy5zZWxlY3RlZE1vZHVsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEJ1bmRsZSBzZWxlY3RlZAorICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQuZXF1YWxzKFJlZGVwbG95QnVuZGxlQWN0aW9uLnRoaXMuc2VsZWN0ZWRNb2R1bGUuZ2V0TW9kdWxlVHlwZSgpLmdldElkKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8SU1vZHVsZT4gbW9kdWxlcyA9IEFycmF5cy5hc0xpc3QoUmVkZXBsb3lCdW5kbGVBY3Rpb24udGhpcy5zZXJ2ZXIuZ2V0TW9kdWxlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vZHVsZXMuY29udGFpbnMoUmVkZXBsb3lCdW5kbGVBY3Rpb24udGhpcy5zZWxlY3RlZE1vZHVsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmdsZSBkZXBsb3llZCBtb2R1bGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW91ci5nZXRTZXJ2ZXJEZXBsb3llcigpLnJlZGVwbG95KFJlZGVwbG95QnVuZGxlQWN0aW9uLnRoaXMuc2VsZWN0ZWRNb2R1bGUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJTW9kdWxlIG1vZHVsZSA6IG1vZHVsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PElNb2R1bGU+IGNoaWxkTW9kdWxlcyA9IEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZGVwbG95QnVuZGxlQWN0aW9uLnRoaXMuc2VydmVyLmdldENoaWxkTW9kdWxlcyhuZXcgSU1vZHVsZVtdIHsgbW9kdWxlIH0sIG51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRNb2R1bGVzLmNvbnRhaW5zKFJlZGVwbG95QnVuZGxlQWN0aW9uLnRoaXMuc2VsZWN0ZWRNb2R1bGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEZhY2V0Q29yZVBsdWdpbi5QQVJfRkFDRVRfSUQuZXF1YWxzKG1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3VyLmdldFNlcnZlckRlcGxveWVyKCkucmVmcmVzaChtb2R1bGUsIFJlZGVwbG95QnVuZGxlQWN0aW9uLnRoaXMuc2VsZWN0ZWRNb2R1bGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBXZWIgbW9kdWxlIHNlbGVjdGVkCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoRmFjZXRDb3JlUGx1Z2luLldFQl9GQUNFVF9JRC5lcXVhbHMoUmVkZXBsb3lCdW5kbGVBY3Rpb24udGhpcy5zZWxlY3RlZE1vZHVsZS5nZXRNb2R1bGVUeXBlKCkuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3VyLmdldFNlcnZlckRlcGxveWVyKCkucmVkZXBsb3koUmVkZXBsb3lCdW5kbGVBY3Rpb24udGhpcy5zZWxlY3RlZE1vZHVsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBwdWJsaXNoSm9iLnNldFByaW9yaXR5KEpvYi5JTlRFUkFDVElWRSk7CisgICAgICAgIHB1Ymxpc2hKb2Iuc2NoZWR1bGUoKTsKIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3RlZE1vZHVsZSA9IG51bGw7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgewotCQkJCQlNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBvYmo7Ci0JCQkJCXRoaXMuc2VydmVyID0gbXMuc2VydmVyOwotCQkJCQl0aGlzLnNlbGVjdGVkTW9kdWxlID0gbXMubW9kdWxlW21zLm1vZHVsZS5sZW5ndGggLSAxXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKyAgICAgICAgdGhpcy5zZWxlY3RlZE1vZHVsZSA9IG51bGw7CisgICAgICAgIGlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1vZHVsZVNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICBNb2R1bGVTZXJ2ZXIgbXMgPSAoTW9kdWxlU2VydmVyKSBvYmo7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyID0gbXMuc2VydmVyOworICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTW9kdWxlID0gbXMubW9kdWxlW21zLm1vZHVsZS5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24uamF2YQppbmRleCAwYjgwOWJkLi41MzRlNDU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZWRpdG9yL0FydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2VkaXRvci9BcnRlZmFjdE9yZGVyRWRpdG9yU2VjdGlvbi5qYXZhCkBAIC02NCwyNTYgKzY0LDI0NiBAQAogICovCiBwdWJsaWMgY2xhc3MgQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24gZXh0ZW5kcyBTZXJ2ZXJFZGl0b3JTZWN0aW9uIHsKIAotCS8qKgotCSAqIEFuIG9wZXJhdGlvbiB1c2VkIGZvciBtYWtpbmcgb3JkZXJpbmcgY2hhbmdlcyBpbiB0aGUgVUksIHRyaWdnZXJpbmcgZGlydHkgc3RhdGUgYW5kIHN1cHBvcnRpbmcgVU5ETy4KLQkgKgotCSAqIENoYW5nZXMgYXJlIGFwcGxpZWQgdG8gdGhlIHNlcnZlciBvbmx5IHdoZW4gdGhlIGVkaXRvciBpcyBzYXZlZCB1c2luZyBhIGRpZmZlcmVudCBvcGVyYXRpb24sIHNlZQotCSAqIHtAbGluayBBcnRlZmFjdE9yZGVyRWRpdG9yU2VjdGlvbiNkb1NhdmUoSVByb2dyZXNzTW9uaXRvcil9Ci0JICovCi0JcHJpdmF0ZSBjbGFzcyBNb2RpZnlBcnRlZmFjdE9yZGVyRWRpdG9yQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0T3BlcmF0aW9uIHsKKyAgICAvKioKKyAgICAgKiBBbiBvcGVyYXRpb24gdXNlZCBmb3IgbWFraW5nIG9yZGVyaW5nIGNoYW5nZXMgaW4gdGhlIFVJLCB0cmlnZ2VyaW5nIGRpcnR5IHN0YXRlIGFuZCBzdXBwb3J0aW5nIFVORE8uCisgICAgICoKKyAgICAgKiBDaGFuZ2VzIGFyZSBhcHBsaWVkIHRvIHRoZSBzZXJ2ZXIgb25seSB3aGVuIHRoZSBlZGl0b3IgaXMgc2F2ZWQgdXNpbmcgYSBkaWZmZXJlbnQgb3BlcmF0aW9uLCBzZWUKKyAgICAgKiB7QGxpbmsgQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24jZG9TYXZlKElQcm9ncmVzc01vbml0b3IpfQorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgTW9kaWZ5QXJ0ZWZhY3RPcmRlckVkaXRvckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdE9wZXJhdGlvbiB7CiAKLQkJcHJpdmF0ZSBMaXN0PElNb2R1bGU+IG9sZE9yZGVyOworICAgICAgICBwcml2YXRlIExpc3Q8SU1vZHVsZT4gb2xkT3JkZXI7CiAKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0PElNb2R1bGU+IG5ld09yZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8SU1vZHVsZT4gbmV3T3JkZXI7CiAKLQkJTW9kaWZ5QXJ0ZWZhY3RPcmRlckVkaXRvckNvbW1hbmQoTGlzdDxJTW9kdWxlPiBuZXdPcmRlcikgewotCQkJc3VwZXIoIk1vZGlmeSBhcnRlZmFjdCBvcmRlciBpbiBlZGl0b3IgVUkiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5uZXdPcmRlciA9IG5ld09yZGVyOwotCQl9CisgICAgICAgIE1vZGlmeUFydGVmYWN0T3JkZXJFZGl0b3JDb21tYW5kKExpc3Q8SU1vZHVsZT4gbmV3T3JkZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKCJNb2RpZnkgYXJ0ZWZhY3Qgb3JkZXIgaW4gZWRpdG9yIFVJIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHRoaXMubmV3T3JkZXIgPSBuZXdPcmRlcjsKKyAgICAgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCXRoaXMub2xkT3JkZXIgPSBBcnRlZmFjdE9yZGVyRWRpdG9yU2VjdGlvbi50aGlzLm9yZGVyZWRNb2R1bGVzOwotCQkJQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24udGhpcy5vcmRlcmVkTW9kdWxlcyA9IHRoaXMubmV3T3JkZXI7Ci0JCQlBcnRlZmFjdE9yZGVyRWRpdG9yU2VjdGlvbi50aGlzLmJ1bmRsZVRhYmxlVmlld2VyLnNldElucHV0KEFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uLnRoaXMub3JkZXJlZE1vZHVsZXMpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgdGhpcy5vbGRPcmRlciA9IEFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uLnRoaXMub3JkZXJlZE1vZHVsZXM7CisgICAgICAgICAgICBBcnRlZmFjdE9yZGVyRWRpdG9yU2VjdGlvbi50aGlzLm9yZGVyZWRNb2R1bGVzID0gdGhpcy5uZXdPcmRlcjsKKyAgICAgICAgICAgIEFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uLnRoaXMuYnVuZGxlVGFibGVWaWV3ZXIuc2V0SW5wdXQoQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24udGhpcy5vcmRlcmVkTW9kdWxlcyk7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKKyAgICAgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCXJldHVybiBleGVjdXRlKG1vbml0b3IsIGluZm8pOwotCQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBleGVjdXRlKG1vbml0b3IsIGluZm8pOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24udGhpcy5vcmRlcmVkTW9kdWxlcyA9IHRoaXMub2xkT3JkZXI7Ci0JCQl0aGlzLm9sZE9yZGVyID0gbnVsbDsKLQkJCUFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uLnRoaXMuYnVuZGxlVGFibGVWaWV3ZXIuc2V0SW5wdXQoQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24udGhpcy5vcmRlcmVkTW9kdWxlcyk7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBBcnRlZmFjdE9yZGVyRWRpdG9yU2VjdGlvbi50aGlzLm9yZGVyZWRNb2R1bGVzID0gdGhpcy5vbGRPcmRlcjsKKyAgICAgICAgICAgIHRoaXMub2xkT3JkZXIgPSBudWxsOworICAgICAgICAgICAgQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24udGhpcy5idW5kbGVUYWJsZVZpZXdlci5zZXRJbnB1dChBcnRlZmFjdE9yZGVyRWRpdG9yU2VjdGlvbi50aGlzLm9yZGVyZWRNb2R1bGVzKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworICAgICAgICB9CiAKLQl9CisgICAgfQogCi0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXJXb3JraW5nQ29weTsKKyAgICBwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldvcmtpbmdDb3B5OwogCi0JLy8gcmVwcmVzZW50cyB0aGUgbW9kZWwgZm9yIHRoZSB0YWJsZQotCXByaXZhdGUgTGlzdDxJTW9kdWxlPiBvcmRlcmVkTW9kdWxlczsKKyAgICAvLyByZXByZXNlbnRzIHRoZSBtb2RlbCBmb3IgdGhlIHRhYmxlCisgICAgcHJpdmF0ZSBMaXN0PElNb2R1bGU+IG9yZGVyZWRNb2R1bGVzOwogCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7CiAKLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKKyAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKIAotCXByaXZhdGUgVGFibGUgYnVuZGxlVGFibGU7CisgICAgcHJpdmF0ZSBUYWJsZSBidW5kbGVUYWJsZTsKIAotCXByaXZhdGUgVGFibGVWaWV3ZXIgYnVuZGxlVGFibGVWaWV3ZXI7CisgICAgcHJpdmF0ZSBUYWJsZVZpZXdlciBidW5kbGVUYWJsZVZpZXdlcjsKIAotCXByaXZhdGUgQnV0dG9uIHVwQnV0dG9uOworICAgIHByaXZhdGUgQnV0dG9uIHVwQnV0dG9uOwogCi0JcHJpdmF0ZSBCdXR0b24gZG93bkJ1dHRvbjsKKyAgICBwcml2YXRlIEJ1dHRvbiBkb3duQnV0dG9uOwogCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQl0aGlzLmxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICB0aGlzLmxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CiAKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24udGhpcy51cGRhdGluZykgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcgPSB0cnVlOwotCQkJCWlmIChvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLklTZXJ2ZXIuUFJPUEVSVFlfQVJURUZBQ1RfT1JERVIKLQkJCQkJCS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCWluaXRpYWxpemUoKTsKLQkJCQl9Ci0JCQkJQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24udGhpcy51cGRhdGluZyA9IGZhbHNlOwotCQkJfQotCQl9OwotCQl0aGlzLnNlcnZlcldvcmtpbmdDb3B5LmFkZENvbmZpZ3VyYXRpb25DaGFuZ2VMaXN0ZW5lcih0aGlzLmxpc3RlbmVyKTsKLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKEFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBcnRlZmFjdE9yZGVyRWRpdG9yU2VjdGlvbi50aGlzLnVwZGF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAob3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5JU2VydmVyLlBST1BFUlRZX0FSVEVGQUNUX09SREVSLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBcnRlZmFjdE9yZGVyRWRpdG9yU2VjdGlvbi50aGlzLnVwZGF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHRoaXMuc2VydmVyV29ya2luZ0NvcHkuYWRkQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMubGlzdGVuZXIpOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVTZWN0aW9uKHBhcmVudCk7Ci0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBnZXRGb3JtVG9vbGtpdChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICAgICAgc3VwZXIuY3JlYXRlU2VjdGlvbihwYXJlbnQpOworICAgICAgICBGb3JtVG9vbGtpdCB0b29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7CiAKLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5FWFBBTkRFRAotCQkJCXwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBTZWN0aW9uLkRFU0NSSVBUSU9OIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5GT0NVU19USVRMRSk7Ci0JCXNlY3Rpb24uc2V0VGV4dChNZXNzYWdlcy5BcnRlZmFjdE9yZGVyRWRpdG9yU2VjdGlvbl90aXRsZSk7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb25fZGVzY3JpcHRpb24pOwotCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKKyAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5FWFBBTkRFRCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSCisgICAgICAgICAgICB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKKyAgICAgICAgc2VjdGlvbi5zZXRUZXh0KE1lc3NhZ2VzLkFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uX3RpdGxlKTsKKyAgICAgICAgc2VjdGlvbi5zZXREZXNjcmlwdGlvbihNZXNzYWdlcy5BcnRlZmFjdE9yZGVyRWRpdG9yU2VjdGlvbl9kZXNjcmlwdGlvbik7CisgICAgICAgIHNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwogCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMLCB0cnVlLCB0cnVlKSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7CisgICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKKyAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOworICAgICAgICBsYXlvdXQubnVtQ29sdW1ucyA9IDI7CisgICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSA1OworICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAxOworICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKKyAgICAgICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTsKKyAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMLCB0cnVlLCB0cnVlKSk7CisgICAgICAgIHRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7CisgICAgICAgIHNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7CiAKLQkJdGhpcy5idW5kbGVUYWJsZSA9IHRvb2xraXQuY3JlYXRlVGFibGUoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWludCBtb2R1bGVzTnVtYmVyID0gdGhpcy5zZXJ2ZXIuZ2V0TW9kdWxlcygpLmxlbmd0aDsKLQkJZGF0YS5oZWlnaHRIaW50ID0gdGhpcy5idW5kbGVUYWJsZS5nZXRJdGVtSGVpZ2h0KCkgKiBNYXRoLm1pbihNYXRoLm1heCg1LCBtb2R1bGVzTnVtYmVyKSwgMTApCi0JCQkJKyB0aGlzLmJ1bmRsZVRhYmxlLmdldEJvcmRlcldpZHRoKCkgKiAyOwotCQl0aGlzLmJ1bmRsZVRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRoaXMuYnVuZGxlVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGhpcy5idW5kbGVUYWJsZSk7Ci0JCXRoaXMuYnVuZGxlVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdGhpcy5idW5kbGVUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCkpOworICAgICAgICB0aGlzLmJ1bmRsZVRhYmxlID0gdG9vbGtpdC5jcmVhdGVUYWJsZShjb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTik7CisgICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKKyAgICAgICAgaW50IG1vZHVsZXNOdW1iZXIgPSB0aGlzLnNlcnZlci5nZXRNb2R1bGVzKCkubGVuZ3RoOworICAgICAgICBkYXRhLmhlaWdodEhpbnQgPSB0aGlzLmJ1bmRsZVRhYmxlLmdldEl0ZW1IZWlnaHQoKSAqIE1hdGgubWluKE1hdGgubWF4KDUsIG1vZHVsZXNOdW1iZXIpLCAxMCkgKyB0aGlzLmJ1bmRsZVRhYmxlLmdldEJvcmRlcldpZHRoKCkgKiAyOworICAgICAgICB0aGlzLmJ1bmRsZVRhYmxlLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIHRoaXMuYnVuZGxlVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGhpcy5idW5kbGVUYWJsZSk7CisgICAgICAgIHRoaXMuYnVuZGxlVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKKyAgICAgICAgdGhpcy5idW5kbGVUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKFNlcnZlclVJQ29yZS5nZXRMYWJlbFByb3ZpZGVyKCkpOwogCi0JCXRoaXMuYnVuZGxlVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworICAgICAgICB0aGlzLmJ1bmRsZVRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKIAotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVCdXR0b25zKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgdXBkYXRlQnV0dG9ucyhldmVudC5nZXRTZWxlY3Rpb24oKSk7CisgICAgICAgICAgICB9CiAKLQkJfSk7CisgICAgICAgIH0pOwogCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisgICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSkpOworICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CisgICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwogCi0JCXRoaXMudXBCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLkFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uX3VwX2J1dHRvbiwgU1dULlBVU0gpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXRoaXMudXBCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGhpcy51cEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKyAgICAgICAgdGhpcy51cEJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb25fdXBfYnV0dG9uLCBTV1QuUFVTSCk7CisgICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKKyAgICAgICAgdGhpcy51cEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICB0aGlzLnVwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewogCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIEFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uLnRoaXMuYnVuZGxlVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlMaXN0PElNb2R1bGU+IGFsbE1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KEFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uLnRoaXMub3JkZXJlZE1vZHVsZXMpOworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBBcnRlZmFjdE9yZGVyRWRpdG9yU2VjdGlvbi50aGlzLmJ1bmRsZVRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOworICAgICAgICAgICAgICAgIExpc3Q8SU1vZHVsZT4gYWxsTW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24udGhpcy5vcmRlcmVkTW9kdWxlcyk7CiAKLQkJCQlmb3IgKElNb2R1bGUgYU1vZHVsZSA6IChMaXN0PElNb2R1bGU+KSBzZWxlY3Rpb24udG9MaXN0KCkpIHsKLQkJCQkJaW50IGluZGV4ID0gYWxsTW9kdWxlcy5pbmRleE9mKGFNb2R1bGUpOwotCQkJCQlhbGxNb2R1bGVzLnJlbW92ZShhTW9kdWxlKTsKLQkJCQkJYWxsTW9kdWxlcy5hZGQoaW5kZXggLSAxLCBhTW9kdWxlKTsKLQkJCQl9CisgICAgICAgICAgICAgICAgZm9yIChJTW9kdWxlIGFNb2R1bGUgOiAoTGlzdDxJTW9kdWxlPikgc2VsZWN0aW9uLnRvTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGFsbE1vZHVsZXMuaW5kZXhPZihhTW9kdWxlKTsKKyAgICAgICAgICAgICAgICAgICAgYWxsTW9kdWxlcy5yZW1vdmUoYU1vZHVsZSk7CisgICAgICAgICAgICAgICAgICAgIGFsbE1vZHVsZXMuYWRkKGluZGV4IC0gMSwgYU1vZHVsZSk7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJZXhlY3V0ZShuZXcgTW9kaWZ5QXJ0ZWZhY3RPcmRlckVkaXRvckNvbW1hbmQoYWxsTW9kdWxlcykpOwotCQkJCXVwZGF0ZUJ1dHRvbnMoc2VsZWN0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuZG93bkJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb25fZG93bl9idXR0b24sCi0JCQkJU1dULlBVU0gpOwotCQl0aGlzLmRvd25CdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGhpcy5kb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworICAgICAgICAgICAgICAgIGV4ZWN1dGUobmV3IE1vZGlmeUFydGVmYWN0T3JkZXJFZGl0b3JDb21tYW5kKGFsbE1vZHVsZXMpKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVCdXR0b25zKHNlbGVjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmRvd25CdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLkFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uX2Rvd25fYnV0dG9uLCBTV1QuUFVTSCk7CisgICAgICAgIHRoaXMuZG93bkJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICB0aGlzLmRvd25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CiAKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24udGhpcy5idW5kbGVUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCUxpc3Q8SU1vZHVsZT4gYWxsTW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oQXJ0ZWZhY3RPcmRlckVkaXRvclNlY3Rpb24udGhpcy5vcmRlcmVkTW9kdWxlcyk7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIEFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uLnRoaXMuYnVuZGxlVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgTGlzdDxJTW9kdWxlPiBhbGxNb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPihBcnRlZmFjdE9yZGVyRWRpdG9yU2VjdGlvbi50aGlzLm9yZGVyZWRNb2R1bGVzKTsKIAotCQkJCUxpc3Q8SU1vZHVsZT4gcmV2ZXJzZWRTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJQ29sbGVjdGlvbnMucmV2ZXJzZShyZXZlcnNlZFNlbGVjdGlvbik7CisgICAgICAgICAgICAgICAgTGlzdDxJTW9kdWxlPiByZXZlcnNlZFNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZT4oc2VsZWN0aW9uLnRvTGlzdCgpKTsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKHJldmVyc2VkU2VsZWN0aW9uKTsKIAotCQkJCWZvciAoSU1vZHVsZSBhTW9kdWxlIDogcmV2ZXJzZWRTZWxlY3Rpb24pIHsKLQkJCQkJaW50IGluZGV4ID0gYWxsTW9kdWxlcy5pbmRleE9mKGFNb2R1bGUpOwotCQkJCQlhbGxNb2R1bGVzLnJlbW92ZShhTW9kdWxlKTsKLQkJCQkJYWxsTW9kdWxlcy5hZGQoaW5kZXggKyAxLCBhTW9kdWxlKTsKLQkJCQl9CisgICAgICAgICAgICAgICAgZm9yIChJTW9kdWxlIGFNb2R1bGUgOiByZXZlcnNlZFNlbGVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBhbGxNb2R1bGVzLmluZGV4T2YoYU1vZHVsZSk7CisgICAgICAgICAgICAgICAgICAgIGFsbE1vZHVsZXMucmVtb3ZlKGFNb2R1bGUpOworICAgICAgICAgICAgICAgICAgICBhbGxNb2R1bGVzLmFkZChpbmRleCArIDEsIGFNb2R1bGUpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCWV4ZWN1dGUobmV3IE1vZGlmeUFydGVmYWN0T3JkZXJFZGl0b3JDb21tYW5kKGFsbE1vZHVsZXMpKTsKLQkJCQl1cGRhdGVCdXR0b25zKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQlpbml0aWFsaXplKCk7Ci0JfQorICAgICAgICAgICAgICAgIGV4ZWN1dGUobmV3IE1vZGlmeUFydGVmYWN0T3JkZXJFZGl0b3JDb21tYW5kKGFsbE1vZHVsZXMpKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVCdXR0b25zKHNlbGVjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBpbml0aWFsaXplKCk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBTZXJ2ZXJFZGl0b3JTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh0aGlzLnNlcnZlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMubGlzdGVuZXIpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgU2VydmVyRWRpdG9yU2VjdGlvbiNkaXNwb3NlKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICBpZiAodGhpcy5zZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5zZXJ2ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzLmxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIEBzZWUgU2VydmVyRWRpdG9yU2VjdGlvbiNpbml0KElFZGl0b3JTaXRlLCBJRWRpdG9ySW5wdXQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7CisgICAgLyoqCisgICAgICogQHNlZSBTZXJ2ZXJFZGl0b3JTZWN0aW9uI2luaXQoSUVkaXRvclNpdGUsIElFZGl0b3JJbnB1dCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgeworICAgICAgICBzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKIAotCQl0aGlzLnNlcnZlcldvcmtpbmdDb3B5ID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgdGhpcy5zZXJ2ZXIubG9hZEFkYXB0ZXIoSVNlcnZlcldvcmtpbmdDb3B5LmNsYXNzLAotCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICB0aGlzLnNlcnZlcldvcmtpbmdDb3B5ID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgdGhpcy5zZXJ2ZXIubG9hZEFkYXB0ZXIoSVNlcnZlcldvcmtpbmdDb3B5LmNsYXNzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKIAotCQlhZGRDb25maWd1cmF0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQl9CisgICAgICAgIGFkZENvbmZpZ3VyYXRpb25DaGFuZ2VMaXN0ZW5lcigpOworICAgIH0KIAotCS8qKgotCSAqIEluaXRpYWxpemUgbW9kZWwgYW5kIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZmluYWwgTGlzdDxTdHJpbmc+IG9yZGVyZWRBcnRlZmFjdHMgPSB0aGlzLnNlcnZlcldvcmtpbmdDb3B5LmdldENvbmZpZ3VyYXRpb24oKS5nZXRBcnRlZmFjdE9yZGVyKCk7CisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBtb2RlbCBhbmQgdmlldy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgeworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gb3JkZXJlZEFydGVmYWN0cyA9IHRoaXMuc2VydmVyV29ya2luZ0NvcHkuZ2V0Q29uZmlndXJhdGlvbigpLmdldEFydGVmYWN0T3JkZXIoKTsKIAotCQl0aGlzLm9yZGVyZWRNb2R1bGVzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHRoaXMuc2VydmVyLmdldE1vZHVsZXMoKSkpOworICAgICAgICB0aGlzLm9yZGVyZWRNb2R1bGVzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHRoaXMuc2VydmVyLmdldE1vZHVsZXMoKSkpOwogCi0JCS8vIHNvcnQgdGhlIG1vZHVsZXMgYWNjb3JkaW5nIHRoZSBvcmRlciBkZWZpbmVkIGluIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbgotCQlDb2xsZWN0aW9ucy5zb3J0KHRoaXMub3JkZXJlZE1vZHVsZXMsIG5ldyBqYXZhLnV0aWwuQ29tcGFyYXRvcjxJTW9kdWxlPigpIHsKKyAgICAgICAgLy8gc29ydCB0aGUgbW9kdWxlcyBhY2NvcmRpbmcgdGhlIG9yZGVyIGRlZmluZWQgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5vcmRlcmVkTW9kdWxlcywgbmV3IGphdmEudXRpbC5Db21wYXJhdG9yPElNb2R1bGU+KCkgewogCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoSU1vZHVsZSBvMSwgSU1vZHVsZSBvMikgewotCQkJCUludGVnZXIgbTEgPSBvcmRlcmVkQXJ0ZWZhY3RzLmNvbnRhaW5zKG8xLmdldElkKCkpCi0JCQkJCQk/IG9yZGVyZWRBcnRlZmFjdHMuaW5kZXhPZihvMS5nZXRJZCgpKQotCQkJCQkJOiBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCQlJbnRlZ2VyIG0yID0gb3JkZXJlZEFydGVmYWN0cy5jb250YWlucyhvMi5nZXRJZCgpKQotCQkJCQkJPyBvcmRlcmVkQXJ0ZWZhY3RzLmluZGV4T2YobzIuZ2V0SWQoKSkKLQkJCQkJCTogSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQkJcmV0dXJuIG0xLmNvbXBhcmVUbyhtMik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmJ1bmRsZVRhYmxlVmlld2VyLnNldElucHV0KHRoaXMub3JkZXJlZE1vZHVsZXMpOwotCX0KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShJTW9kdWxlIG8xLCBJTW9kdWxlIG8yKSB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBtMSA9IG9yZGVyZWRBcnRlZmFjdHMuY29udGFpbnMobzEuZ2V0SWQoKSkgPyBvcmRlcmVkQXJ0ZWZhY3RzLmluZGV4T2YobzEuZ2V0SWQoKSkgOiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIG0yID0gb3JkZXJlZEFydGVmYWN0cy5jb250YWlucyhvMi5nZXRJZCgpKSA/IG9yZGVyZWRBcnRlZmFjdHMuaW5kZXhPZihvMi5nZXRJZCgpKSA6IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybiBtMS5jb21wYXJlVG8obTIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdGhpcy5idW5kbGVUYWJsZVZpZXdlci5zZXRJbnB1dCh0aGlzLm9yZGVyZWRNb2R1bGVzKTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgdXBkYXRlQnV0dG9ucyhJU2VsZWN0aW9uIHNlbGVjdGlvbnMpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbnM7Ci0JCUxpc3Q8SU1vZHVsZT4gc2VsZWN0ZWRNb2R1bGVzID0gc3MudG9MaXN0KCk7CisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1dHRvbnMoSVNlbGVjdGlvbiBzZWxlY3Rpb25zKSB7CisgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb25zOworICAgICAgICBMaXN0PElNb2R1bGU+IHNlbGVjdGVkTW9kdWxlcyA9IHNzLnRvTGlzdCgpOwogCi0JCUxpc3Q8SU1vZHVsZT4gYWxsTW9kdWxlcyA9IHRoaXMub3JkZXJlZE1vZHVsZXM7CisgICAgICAgIExpc3Q8SU1vZHVsZT4gYWxsTW9kdWxlcyA9IHRoaXMub3JkZXJlZE1vZHVsZXM7CiAKLQkJZmluYWwgaW50IGxvd2VyQm91bmQgPSBhbGxNb2R1bGVzLnNpemUoKSAtIDE7Ci0JCWJvb2xlYW4gaW5pdGlhbFN0YXRlID0gIXNlbGVjdGlvbnMuaXNFbXB0eSgpICYmICFhbGxNb2R1bGVzLmlzRW1wdHkoKTsKLQkJYm9vbGVhbiBjYW5Nb3ZlVXAgPSBpbml0aWFsU3RhdGU7Ci0JCWJvb2xlYW4gY2FuTW92ZURvd24gPSBpbml0aWFsU3RhdGU7CisgICAgICAgIGZpbmFsIGludCBsb3dlckJvdW5kID0gYWxsTW9kdWxlcy5zaXplKCkgLSAxOworICAgICAgICBib29sZWFuIGluaXRpYWxTdGF0ZSA9ICFzZWxlY3Rpb25zLmlzRW1wdHkoKSAmJiAhYWxsTW9kdWxlcy5pc0VtcHR5KCk7CisgICAgICAgIGJvb2xlYW4gY2FuTW92ZVVwID0gaW5pdGlhbFN0YXRlOworICAgICAgICBib29sZWFuIGNhbk1vdmVEb3duID0gaW5pdGlhbFN0YXRlOwogCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRNb2R1bGVzLnNpemUoKSAmJiBpbml0aWFsU3RhdGU7IGkrKykgewotCQkJSU1vZHVsZSBvYmogPSBzZWxlY3RlZE1vZHVsZXMuZ2V0KGkpOwotCQkJaW50IGluZGV4ID0gYWxsTW9kdWxlcy5pbmRleE9mKG9iaik7Ci0JCQljYW5Nb3ZlVXAgPSBjYW5Nb3ZlVXAgJiYgaW5kZXggPiAwOwotCQkJY2FuTW92ZURvd24gPSBjYW5Nb3ZlRG93biAmJiBpbmRleCA8IGxvd2VyQm91bmQ7Ci0JCX0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZE1vZHVsZXMuc2l6ZSgpICYmIGluaXRpYWxTdGF0ZTsgaSsrKSB7CisgICAgICAgICAgICBJTW9kdWxlIG9iaiA9IHNlbGVjdGVkTW9kdWxlcy5nZXQoaSk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBhbGxNb2R1bGVzLmluZGV4T2Yob2JqKTsKKyAgICAgICAgICAgIGNhbk1vdmVVcCA9IGNhbk1vdmVVcCAmJiBpbmRleCA+IDA7CisgICAgICAgICAgICBjYW5Nb3ZlRG93biA9IGNhbk1vdmVEb3duICYmIGluZGV4IDwgbG93ZXJCb3VuZDsKKyAgICAgICAgfQogCi0JCXRoaXMudXBCdXR0b24uc2V0RW5hYmxlZChjYW5Nb3ZlVXApOwotCQl0aGlzLmRvd25CdXR0b24uc2V0RW5hYmxlZChjYW5Nb3ZlRG93bik7Ci0JfQorICAgICAgICB0aGlzLnVwQnV0dG9uLnNldEVuYWJsZWQoY2FuTW92ZVVwKTsKKyAgICAgICAgdGhpcy5kb3duQnV0dG9uLnNldEVuYWJsZWQoY2FuTW92ZURvd24pOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTGlzdDxTdHJpbmc+IGFydGVmYWN0T3JkZXIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChPYmplY3QgbW9kdWxlIDogdGhpcy5vcmRlcmVkTW9kdWxlcykgewotCQkJYXJ0ZWZhY3RPcmRlci5hZGQoKChJTW9kdWxlKSBtb2R1bGUpLmdldElkKCkpOwotCQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworICAgICAgICBMaXN0PFN0cmluZz4gYXJ0ZWZhY3RPcmRlciA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBmb3IgKE9iamVjdCBtb2R1bGUgOiB0aGlzLm9yZGVyZWRNb2R1bGVzKSB7CisgICAgICAgICAgICBhcnRlZmFjdE9yZGVyLmFkZCgoKElNb2R1bGUpIG1vZHVsZSkuZ2V0SWQoKSk7CisgICAgICAgIH0KIAotCQlpZiAoIXRoaXMuc2VydmVyV29ya2luZ0NvcHkuZ2V0QXJ0ZWZhY3RPcmRlcigpLmVxdWFscyhhcnRlZmFjdE9yZGVyKSkgewotCQkJdGhpcy51cGRhdGluZyA9IHRydWU7Ci0JCQlleGVjdXRlKG5ldyBNb2RpZnlBcnRlZmFjdE9yZGVyQ29tbWFuZCh0aGlzLnNlcnZlcldvcmtpbmdDb3B5LCBhcnRlZmFjdE9yZGVyKSk7Ci0JCQl0aGlzLnVwZGF0aW5nID0gZmFsc2U7Ci0JCX0KLQl9CisgICAgICAgIGlmICghdGhpcy5zZXJ2ZXJXb3JraW5nQ29weS5nZXRBcnRlZmFjdE9yZGVyKCkuZXF1YWxzKGFydGVmYWN0T3JkZXIpKSB7CisgICAgICAgICAgICB0aGlzLnVwZGF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIGV4ZWN1dGUobmV3IE1vZGlmeUFydGVmYWN0T3JkZXJDb21tYW5kKHRoaXMuc2VydmVyV29ya2luZ0NvcHksIGFydGVmYWN0T3JkZXIpKTsKKyAgICAgICAgICAgIHRoaXMudXBkYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2VkaXRvci9NZXNzYWdlcy5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2VkaXRvci9NZXNzYWdlcy5qYXZhCmluZGV4IDBlODVhNjIuLjcwYzZhM2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvTWVzc2FnZXMuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZWRpdG9yL01lc3NhZ2VzLmphdmEKQEAgLTEwNyw2ICsxMDcsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uX3VwX2J1dHRvbjsKIAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFydGVmYWN0T3JkZXJFZGl0b3JTZWN0aW9uX2Rvd25fYnV0dG9uOworCiAgICAgc3RhdGljIHsKICAgICAgICAgLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKICAgICAgICAgTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2VkaXRvci9SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLmphdmEKaW5kZXggNTJmMGM1MS4uOWVhNjA4OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2VkaXRvci9SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZWRpdG9yL1JlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS5qYXZhCkBAIC0xNTcsNyArMTU3LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CiAKLSAgICAgICAgc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKKyAgICAgICAgdGhpcy5zaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwogCiAgICAgICAgIEZvcm1Ub29sa2l0IHRvb2xraXQgPSBnZXRGb3JtVG9vbGtpdChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKIApAQCAtMTg5LDI3ICsxODksMjcgQEAKICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewogICAgICAgICBzdXBlci5kaXNwb3NlKCk7CiAKLSAgICAgICAgaWYgKHNlcnZlcldDICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlcnZlcldDLnJlbW92ZUNvbmZpZ3VyYXRpb25DaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eUxpc3RlbmVyKTsKKyAgICAgICAgaWYgKHRoaXMuc2VydmVyV0MgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5zZXJ2ZXJXQy5yZW1vdmVDb25maWd1cmF0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5wcm9wZXJ0eUxpc3RlbmVyKTsKICAgICAgICAgfQotICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLnJlbW92ZUpvYkNoYW5nZUxpc3RlbmVyKGpvYkxpc3RlbmVyKTsKLSAgICAgICAgU2VydmVyQ29yZVBsdWdpbi5nZXRBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCkucmVtb3ZlQnVuZGxlUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyKHJlcG9zaXRvcnlMaXN0ZW5lcik7CisgICAgICAgIEpvYi5nZXRKb2JNYW5hZ2VyKCkucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIodGhpcy5qb2JMaXN0ZW5lcik7CisgICAgICAgIFNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLnJlbW92ZUJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlcG9zaXRvcnlMaXN0ZW5lcik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKICAgICAgICAgc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7CiAKLSAgICAgICAgSVNlcnZlcldvcmtpbmdDb3B5IHRzID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyLmxvYWRBZGFwdGVyKElTZXJ2ZXJXb3JraW5nQ29weS5jbGFzcywgbnVsbCk7Ci0gICAgICAgIHNlcnZlcldDID0gdHM7CisgICAgICAgIElTZXJ2ZXJXb3JraW5nQ29weSB0cyA9IChJU2VydmVyV29ya2luZ0NvcHkpIHRoaXMuc2VydmVyLmxvYWRBZGFwdGVyKElTZXJ2ZXJXb3JraW5nQ29weS5jbGFzcywgbnVsbCk7CisgICAgICAgIHRoaXMuc2VydmVyV0MgPSB0czsKICAgICAgICAgYWRkTGlzdGVuZXJzKCk7CiAgICAgICAgIGluaXRpYWxpemUoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLSAgICAgICAgaWYgKHNlYXJjaFJlc3VsdFRhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlYXJjaFJlc3VsdFRhYmxlLnNldEZvY3VzKCk7CisgICAgICAgIGlmICh0aGlzLnNlYXJjaFJlc3VsdFRhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0VGFibGUuc2V0Rm9jdXMoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjI4LDEwICsyMjgsMTAgQEAKICAgICAgICAgdG9vbGtpdC5wYWludEJvcmRlcnNGb3IobGVmdENvbXBvc2l0ZSk7CiAgICAgICAgIGxlZnRTZWN0aW9uLnNldENsaWVudChsZWZ0Q29tcG9zaXRlKTsKIAotICAgICAgICBzZWFyY2hUZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KGxlZnRDb21wb3NpdGUsIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV80KTsKKyAgICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KGxlZnRDb21wb3NpdGUsIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV80KTsKICAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotICAgICAgICBzZWFyY2hUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIHNlYXJjaFRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUxpc3RlbmVyKCkgeworICAgICAgICB0aGlzLnNlYXJjaFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgdGhpcy5zZWFyY2hUZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlMaXN0ZW5lcigpIHsKIAogICAgICAgICAgICAgcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7CiAgICAgICAgICAgICAgICAgaWYgKGUuY2hhcmFjdGVyID09IFNXVC5DUiB8fCBlLmNoYXJhY3RlciA9PSBTV1QuTEYpIHsKQEAgLTI0OCw4ICsyNDgsOCBAQAogICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CiAgICAgICAgIHNlYXJjaEJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwogCi0gICAgICAgIHNlYXJjaEJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHNlYXJjaEJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX1NlYXJjaCwgU1dULlBVU0gpOwotICAgICAgICBzZWFyY2hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisgICAgICAgIHRoaXMuc2VhcmNoQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oc2VhcmNoQnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfU2VhcmNoLCBTV1QuUFVTSCk7CisgICAgICAgIHRoaXMuc2VhcmNoQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKQEAgLTI1OCw1NyArMjU4LDU4IEBACiAgICAgICAgIH0pOwogICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CiAgICAgICAgIGRhdGEud2lkdGhIaW50ID0gMTAwOwotICAgICAgICBzZWFyY2hCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgdGhpcy5zZWFyY2hCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKIAotICAgICAgICBzZWFyY2hSZXN1bHRUYWJsZSA9IHRvb2xraXQuY3JlYXRlVHJlZShsZWZ0Q29tcG9zaXRlLCBTV1QuVl9TQ1JPTEwgfCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQ0hFQ0spOworICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdFRhYmxlID0gdG9vbGtpdC5jcmVhdGVUcmVlKGxlZnRDb21wb3NpdGUsIFNXVC5WX1NDUk9MTCB8IFNXVC5NVUxUSSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5DSEVDSyk7CiAKLSAgICAgICAgc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHNlYXJjaFJlc3VsdFRhYmxlKTsKLSAgICAgICAgc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHNlYXJjaFJlc3VsdENvbnRlbnRQcm92aWRlcik7Ci0gICAgICAgIHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIoY29sb3JlZFJlc3Bvc2l0b3J5TGFiZWxQcm92aWRlcik7Ci0gICAgICAgIHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnNldElucHV0KHRoaXMpOyAvLyBhY3RpdmF0ZSBjb250ZW50IHByb3ZpZGVyCi0gICAgICAgIHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgUmVwb3NpdG9yeVZpZXdlclNvcnRlcigpKTsKLSAgICAgICAgc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgeworICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyID0gbmV3IENoZWNrYm94VHJlZVZpZXdlcih0aGlzLnNlYXJjaFJlc3VsdFRhYmxlKTsKKyAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIodGhpcy5zZWFyY2hSZXN1bHRDb250ZW50UHJvdmlkZXIpOworICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIodGhpcy5jb2xvcmVkUmVzcG9zaXRvcnlMYWJlbFByb3ZpZGVyKTsKKyAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5zZXRJbnB1dCh0aGlzKTsgLy8gYWN0aXZhdGUgY29udGVudCBwcm92aWRlcgorICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgUmVwb3NpdG9yeVZpZXdlclNvcnRlcigpKTsKKyAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7CiAKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgICAgICBoYW5kbGVDaGVja1N0YXRlQ2hhbmdlKGV2ZW50KTsKLSAgICAgICAgICAgICAgICBkb3dubG9hZEJ1dHRvbi5zZXRFbmFibGVkKHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpLmxlbmd0aCA+IDApOworICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLmRvd25sb2FkQnV0dG9uLnNldEVuYWJsZWQoCisgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpLmxlbmd0aCA+IDApOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKLSAgICAgICAgc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuYWRkVHJlZUxpc3RlbmVyKG5ldyBJVHJlZVZpZXdlckxpc3RlbmVyKCkgeworICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmFkZFRyZWVMaXN0ZW5lcihuZXcgSVRyZWVWaWV3ZXJMaXN0ZW5lcigpIHsKIAogICAgICAgICAgICAgcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewogICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBlbGVtZW50ID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmIChzZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5nZXRHcmF5ZWQoZWxlbWVudCkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgQnVzeUluZGljYXRvci5zaG93V2hpbGUoc2hlbGwuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgaWYgKFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmdldEdyYXllZChlbGVtZW50KSA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5zaGVsbC5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN1YnRyZWVDaGVja2VkKGVsZW1lbnQsIHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmdldENoZWNrZWQoZWxlbWVudCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdWJ0cmVlQ2hlY2tlZChlbGVtZW50LCBSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5zZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5nZXRDaGVja2VkKGVsZW1lbnQpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSk7Ci0gICAgICAgIHJlZ2lzdGVyQ29udGV4dE1lbnUoc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIpOworICAgICAgICByZWdpc3RlckNvbnRleHRNZW51KHRoaXMuc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIpOwogCiAgICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKICAgICAgICAgZGF0YS5oZWlnaHRIaW50ID0gMTIwOwotICAgICAgICBzZWFyY2hSZXN1bHRUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotICAgICAgICBzZWFyY2hSZXN1bHRUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKyAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdFRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOworICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLnRoaXMuc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQXJ0ZWZhY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuYXlsc2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpY2Vuc2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLmFuYXlsc2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLmxpY2Vuc2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuYXlsc2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaWNlbnNlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLnRoaXMuYW5heWxzZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLmxpY2Vuc2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0zMjgsNyArMzI5LDkgQEAKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25FdmVudCkgewotICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhzZWFyY2hSZXN1bHRDb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMoc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuZ2V0SW5wdXQoKSkpOworICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cygKKyAgICAgICAgICAgICAgICAgICAgUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLnRoaXMuc2VhcmNoUmVzdWx0Q29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLnRoaXMuc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuZ2V0SW5wdXQoKSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKIApAQCAtMzQwLDIyICszNDMsMjIgQEAKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25FdmVudCkgewotICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhuZXcgT2JqZWN0WzBdKTsKKyAgICAgICAgICAgICAgICBSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5zZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMobmV3IE9iamVjdFswXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogCiAgICAgICAgIC8vIGluc2VydCB2ZXJ0aWNhbCBzcGFjZSB0byBtYWtlIHRoZSBkb3dubG9hZCBidXR0b24gc3RhbmQgb3V0CiAgICAgICAgIHRvb2xraXQuY3JlYXRlTGFiZWwoYnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfMTApOwogCi0gICAgICAgIGFuYXlsc2VCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9BbmFseXNlLCBTV1QuUFVTSCk7Ci0gICAgICAgIGFuYXlsc2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGFuYXlsc2VCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgYW5heWxzZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfQW5hbHlzZVNlbGVjdGVkKTsKLSAgICAgICAgYW5heWxzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKyAgICAgICAgdGhpcy5hbmF5bHNlQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfQW5hbHlzZSwgU1dULlBVU0gpOworICAgICAgICB0aGlzLmFuYXlsc2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIHRoaXMuYW5heWxzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICB0aGlzLmFuYXlsc2VCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX0FuYWx5c2VTZWxlY3RlZCk7CisgICAgICAgIHRoaXMuYW5heWxzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25FdmVudCkgewotICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5zZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBcnRlZmFjdCkgewpAQCAtMzY1LDE1ICszNjgsMTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiAKLSAgICAgICAgbGljZW5zZUJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX1ZpZXdMaWNlbnNlLCBTV1QuUFVTSCk7Ci0gICAgICAgIGxpY2Vuc2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIGxpY2Vuc2VCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgbGljZW5zZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfT3BlbkxpY2Vuc2UpOwotICAgICAgICBsaWNlbnNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworICAgICAgICB0aGlzLmxpY2Vuc2VCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9WaWV3TGljZW5zZSwgU1dULlBVU0gpOworICAgICAgICB0aGlzLmxpY2Vuc2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIHRoaXMubGljZW5zZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICB0aGlzLmxpY2Vuc2VCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX09wZW5MaWNlbnNlKTsKKyAgICAgICAgdGhpcy5saWNlbnNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlbGVjdGlvbkV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwogICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlicmFyeUFydGVmYWN0KSB7CkBAIC0zODgsMTYgKzM5MSwxNiBAQAogICAgICAgICAvLyBpbnNlcnQgdmVydGljYWwgc3BhY2UgdG8gbWFrZSB0aGUgZG93bmxvYWQgYnV0dG9uIHN0YW5kIG91dAogICAgICAgICB0b29sa2l0LmNyZWF0ZUxhYmVsKGJ1dHRvbkNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCiAKLSAgICAgICAgZG93bmxvYWRCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9Eb3dubG9hZCwgU1dULlBVU0gpOwotICAgICAgICBkb3dubG9hZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgZG93bmxvYWRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgZG93bmxvYWRCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX0Rvd25sb2FkU2VsZWN0ZWQpOwotICAgICAgICBkb3dubG9hZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKyAgICAgICAgdGhpcy5kb3dubG9hZEJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX0Rvd25sb2FkLCBTV1QuUFVTSCk7CisgICAgICAgIHRoaXMuZG93bmxvYWRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIHRoaXMuZG93bmxvYWRCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgdGhpcy5kb3dubG9hZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfRG93bmxvYWRTZWxlY3RlZCk7CisgICAgICAgIHRoaXMuZG93bmxvYWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CiAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgc2VsZWN0aW9uRXZlbnQpIHsKICAgICAgICAgICAgICAgICBTZXQ8QXJ0ZWZhY3Q+IGFydGlmYWN0cyA9IG5ldyBMaW5rZWRIYXNoU2V0PEFydGVmYWN0PigpOwotICAgICAgICAgICAgICAgIE9iamVjdFtdIHNlbGVjdGlvbnMgPSBzZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSBzZWxlY3Rpb25zID0gUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLnRoaXMuc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7CiAgICAgICAgICAgICAgICAgZm9yIChPYmplY3Qgc2VsZWN0aW9uIDogc2VsZWN0aW9ucykgewogICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUFydGVmYWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdHMuYWRkKChBcnRlZmFjdCkgc2VsZWN0aW9uKTsKQEAgLTQwNywxMCArNDEwLDEwIEBACiAgICAgICAgICAgICAgICAgYm9vbGVhbiBzaG93RGlhbG9nID0gU2VydmVyVWlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oU2VydmVyVWlQbHVnaW4uUExVR0lOX0lEICsgIi5kb3dubG9hZC5tZXNzYWdlIik7IC8vJE5PTi1OTFMtMSQKIAogICAgICAgICAgICAgICAgIGlmICghc2hvd0RpYWxvZykgewotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBkaWFsb2cgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5vcGVuT2tDYW5jZWxDb25maXJtKHNoZWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX0Rvd25sb2FkQnVuZGxlc0FuZExpYnJhcmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9Eb3dubG9hZFRyaWdnZXJNZXNzYWdlLCBNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfRG9udFNob3dEaWFsb2csIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyVWlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLCBTZXJ2ZXJVaVBsdWdpbi5QTFVHSU5fSUQgKyAiLmRvd25sb2FkLm1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBkaWFsb2cgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5vcGVuT2tDYW5jZWxDb25maXJtKFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLnNoZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX0Rvd25sb2FkQnVuZGxlc0FuZExpYnJhcmllcywgTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX0Rvd25sb2FkVHJpZ2dlck1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfRG9udFNob3dEaWFsb2csIGZhbHNlLCBTZXJ2ZXJVaVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJVaVBsdWdpbi5QTFVHSU5fSUQgKyAiLmRvd25sb2FkLm1lc3NhZ2UiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSAhPSBXaW5kb3cuT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQyMiwxMyArNDI1LDEzIEBACiAgICAgICAgICAgICAgICAgU2V0PElSdW50aW1lPiBydW50aW1lcyA9IG5ldyBIYXNoU2V0PElSdW50aW1lPigpOwogICAgICAgICAgICAgICAgIHJ1bnRpbWVzLmFkZChnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkpOwogICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlQcm92aXNpb25pbmdKb2Igb3BlcmF0aW9uID0gbmV3IFJlcG9zaXRvcnlQcm92aXNpb25pbmdKb2IocnVudGltZXMsIFJlcG9zaXRvcnlVdGlscy5yZXNvbHZlRGVwZW5kZW5jaWVzKGFydGlmYWN0cywgZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFNvdXJjZXNDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLmRvd25sb2FkU291cmNlc0NoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKICAgICAgICAgICAgICAgICBvcGVyYXRpb24uc2V0UHJvcGVydHkoSVByb2dyZXNzQ29uc3RhbnRzLklDT05fUFJPUEVSVFksIFNlcnZlclVpSW1hZ2VzLkRFU0NfT0JKX0JVTkRMRSk7CiAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLnNjaGVkdWxlKCk7CiAKICAgICAgICAgICAgICAgICAvLyByZXNldCBjaGVja2VkIHN0YXRlCi0gICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKG5ldyBPYmplY3RbMF0pOwotICAgICAgICAgICAgICAgIGRvd25sb2FkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhuZXcgT2JqZWN0WzBdKTsKKyAgICAgICAgICAgICAgICBSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5kb3dubG9hZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiAKQEAgLTQ0MiwxMCArNDQ1LDEwIEBACiAgICAgICAgIHdyYXBwZWRDb21wb3NpdGUuc2V0TGF5b3V0KHR3TGF5b3V0KTsKICAgICAgICAgR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmdyYWIodHJ1ZSwgZmFsc2UpLnNwYW4oMiwgMSkuYXBwbHlUbyh3cmFwcGVkQ29tcG9zaXRlKTsKIAotICAgICAgICBkb3dubG9hZFNvdXJjZXNDaGVja2JveCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHdyYXBwZWRDb21wb3NpdGUsIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9Eb3dubG9hZFNvdXJjZUphcnMsIFNXVC5DSEVDSwotICAgICAgICAgICAgfCBTV1QuV1JBUCk7Ci0gICAgICAgIGRvd25sb2FkU291cmNlc0NoZWNrYm94LnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgZG93bmxvYWRTb3VyY2VzQ2hlY2tib3guc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkxFRlQsIFRhYmxlV3JhcERhdGEuVE9QKSk7CisgICAgICAgIHRoaXMuZG93bmxvYWRTb3VyY2VzQ2hlY2tib3ggPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbih3cmFwcGVkQ29tcG9zaXRlLCBNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfRG93bmxvYWRTb3VyY2VKYXJzLAorICAgICAgICAgICAgU1dULkNIRUNLIHwgU1dULldSQVApOworICAgICAgICB0aGlzLmRvd25sb2FkU291cmNlc0NoZWNrYm94LnNldFNlbGVjdGlvbih0cnVlKTsKKyAgICAgICAgdGhpcy5kb3dubG9hZFNvdXJjZXNDaGVja2JveC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuTEVGVCwgVGFibGVXcmFwRGF0YS5UT1ApKTsKIAogICAgICAgICBMaW5rIHJlcG9MaW5rID0gbmV3IExpbmsod3JhcHBlZENvbXBvc2l0ZSwgU1dULldSQVApOwogICAgICAgICByZXBvTGluay5zZXRUZXh0KE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9Tb3VyY2VSZXBvc01lc3NhZ2UpOwpAQCAtNDU4LDEyICs0NjEsMTIgQEAKICAgICAgICAgfSk7CiAgICAgICAgIHJlcG9MaW5rLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5MRUZULCBUYWJsZVdyYXBEYXRhLlRPUCkpOwogCi0gICAgICAgIHVwZGF0ZSA9IG5ldyBMaW5rKHdyYXBwZWRDb21wb3NpdGUsIFNXVC5XUkFQKTsKLSAgICAgICAgdXBkYXRlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworICAgICAgICB0aGlzLnVwZGF0ZSA9IG5ldyBMaW5rKHdyYXBwZWRDb21wb3NpdGUsIFNXVC5XUkFQKTsKKyAgICAgICAgdGhpcy51cGRhdGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CiAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIGlmIChNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihzaGVsbCwgTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX1VwZGF0ZUxvY2FsQnVuZGxlcywKKyAgICAgICAgICAgICAgICBpZiAoTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLnRoaXMuc2hlbGwsIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9VcGRhdGVMb2NhbEJ1bmRsZXMsCiAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9Db25maXJtSW5kZXhNZXNzYWdlKSkgewogICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJDb3JlUGx1Z2luLmdldEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKS51cGRhdGUoKTsKICAgICAgICAgICAgICAgICB9CkBAIC00NzEsNyArNDc0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiAgICAgICAgIHNldFJlcG9zaXRvcnlEYXRlU3RyaW5nKCk7Ci0gICAgICAgIHVwZGF0ZS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuTEVGVCwgVGFibGVXcmFwRGF0YS5UT1ApKTsKKyAgICAgICAgdGhpcy51cGRhdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkxFRlQsIFRhYmxlV3JhcERhdGEuVE9QKSk7CiAKICAgICAgICAgSHlwZXJsaW5rIGRpc2NsYWltZXIgPSB0b29sa2l0LmNyZWF0ZUh5cGVybGluayh3cmFwcGVkQ29tcG9zaXRlLCBNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfRmlyZXdhbGxDb25maWd1cmVNZXNzYWdlLCBTV1QuV1JBUCk7CiAgICAgICAgIGRpc2NsYWltZXIuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7CkBAIC00OTcsNyArNTAwLDcgQEAKICAgICBwcml2YXRlIHZvaWQgc2V0UmVwb3NpdG9yeURhdGVTdHJpbmcoKSB7CiAgICAgICAgIERhdGUgZGF0ZSA9IFNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmdldEFydGVmYWN0UmVwb3NpdG9yeURhdGUoKTsKICAgICAgICAgU3RyaW5nIGRhdGVTdHJpbmcgPSBkYXRlRm9ybWF0LmZvcm1hdChkYXRlKTsKLSAgICAgICAgdXBkYXRlLnNldFRleHQoTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX1VwZGF0ZVVSTCArIGRhdGVTdHJpbmcgKyAiKSIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIHRoaXMudXBkYXRlLnNldFRleHQoTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX1VwZGF0ZVVSTCArIGRhdGVTdHJpbmcgKyAiKSIpOyAvLyROT04tTkxTLTEkCiAgICAgfQogCiAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCkgewpAQCAtNTMwLDE0ICs1MzMsMTQgQEAKICAgICAgICAgY29tcG9zaXRlMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKICAgICAgICAgdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlMik7CiAKLSAgICAgICAgcmVwb3NpdG9yeVRhYmxlVmlld2VyID0gbmV3IENvbW1vblZpZXdlcihTZXJ2ZXJVaVBsdWdpbi5BUlRFRkFDVFNfQlJPV1NFUl9WSUVXX0lELCBjb21wb3NpdGUyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0gICAgICAgIHJlcG9zaXRvcnlUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFJlcG9zaXRvcnlWaWV3ZXJTb3J0ZXIoKSk7CisgICAgICAgIHRoaXMucmVwb3NpdG9yeVRhYmxlVmlld2VyID0gbmV3IENvbW1vblZpZXdlcihTZXJ2ZXJVaVBsdWdpbi5BUlRFRkFDVFNfQlJPV1NFUl9WSUVXX0lELCBjb21wb3NpdGUyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7CisgICAgICAgIHRoaXMucmVwb3NpdG9yeVRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgUmVwb3NpdG9yeVZpZXdlclNvcnRlcigpKTsKIAotICAgICAgICByZWdpc3RlckNvbnRleHRNZW51KHJlcG9zaXRvcnlUYWJsZVZpZXdlcik7CisgICAgICAgIHJlZ2lzdGVyQ29udGV4dE1lbnUodGhpcy5yZXBvc2l0b3J5VGFibGVWaWV3ZXIpOwogCiAgICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKICAgICAgICAgZGF0YS5oZWlnaHRIaW50ID0gMTIwOwotICAgICAgICByZXBvc2l0b3J5VGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIHRoaXMucmVwb3NpdG9yeVRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwogCiAgICAgICAgIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZTIsIFNXVC5OT05FKTsKICAgICAgICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCB0cnVlKSk7CkBAIC01NDYsMTAgKzU0OSwxMCBAQAogCiAgICAgICAgIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKICAgICAgICAgZGF0YS53aWR0aEhpbnQgPSAxMDA7Ci0gICAgICAgIHJlZnJlc2hCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9SZWZyZXNoLCBTV1QuUFVTSCk7Ci0gICAgICAgIHJlZnJlc2hCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgcmVmcmVzaEJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfUmVmcmVzaE1lc3NhZ2UpOwotICAgICAgICByZWZyZXNoQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworICAgICAgICB0aGlzLnJlZnJlc2hCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9SZWZyZXNoLCBTV1QuUFVTSCk7CisgICAgICAgIHRoaXMucmVmcmVzaEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICB0aGlzLnJlZnJlc2hCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX1JlZnJlc2hNZXNzYWdlKTsKKyAgICAgICAgdGhpcy5yZWZyZXNoQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlbGVjdGlvbkV2ZW50KSB7CkBAIC01NTcsMTAgKzU2MCwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9KTsKIAotICAgICAgICBkb3dubG9hZFNvdXJjZXNCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9JbnN0YWxsU291cmNlcywgU1dULlBVU0gpOwotICAgICAgICBkb3dubG9hZFNvdXJjZXNCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLSAgICAgICAgZG93bmxvYWRTb3VyY2VzQnV0dG9uLnNldFRvb2xUaXBUZXh0KE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9JbnN0YWxsU291cmNlc01lc3NhZ2UpOwotICAgICAgICBkb3dubG9hZFNvdXJjZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisgICAgICAgIHRoaXMuZG93bmxvYWRTb3VyY2VzQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfSW5zdGFsbFNvdXJjZXMsIFNXVC5QVVNIKTsKKyAgICAgICAgdGhpcy5kb3dubG9hZFNvdXJjZXNCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgdGhpcy5kb3dubG9hZFNvdXJjZXNCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX0luc3RhbGxTb3VyY2VzTWVzc2FnZSk7CisgICAgICAgIHRoaXMuZG93bmxvYWRTb3VyY2VzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlbGVjdGlvbkV2ZW50KSB7CkBAIC01NzEsMTQgKzU3NCwxNCBAQAogICAgICAgICAvLyBpbnNlcnQgdmVydGljYWwgc3BhY2UgdG8gbWFrZSB0aGUgZG93bmxvYWQgYnV0dG9uIHN0YW5kIG91dAogICAgICAgICB0b29sa2l0LmNyZWF0ZUxhYmVsKGJ1dHRvbkNvbXBvc2l0ZSwgTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlXzQwKTsKIAotICAgICAgICBvcGVuTWFuaWZlc3RCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9PcGVuTWFuaWZlc3QsIFNXVC5QVVNIKTsKLSAgICAgICAgb3Blbk1hbmlmZXN0QnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0gICAgICAgIG9wZW5NYW5pZmVzdEJ1dHRvbi5zZXRUb29sVGlwVGV4dChNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfT3Blbk1hbmlmZXN0TWVzc2FnZSk7Ci0gICAgICAgIG9wZW5NYW5pZmVzdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKyAgICAgICAgdGhpcy5vcGVuTWFuaWZlc3RCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9PcGVuTWFuaWZlc3QsIFNXVC5QVVNIKTsKKyAgICAgICAgdGhpcy5vcGVuTWFuaWZlc3RCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgdGhpcy5vcGVuTWFuaWZlc3RCdXR0b24uc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX09wZW5NYW5pZmVzdE1lc3NhZ2UpOworICAgICAgICB0aGlzLm9wZW5NYW5pZmVzdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBzZWxlY3Rpb25FdmVudCkgewotICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gcmVwb3NpdG9yeVRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOworICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLnRoaXMucmVwb3NpdG9yeVRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwogICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKQEAgLTU4OSwxNyArNTkyLDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogCi0gICAgICAgIG9wZW5NYW5pZmVzdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgcmVwb3NpdG9yeVRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKKyAgICAgICAgdGhpcy5vcGVuTWFuaWZlc3RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIHRoaXMucmVwb3NpdG9yeVRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKIAogICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwogICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5NYW5pZmVzdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLnRoaXMub3Blbk1hbmlmZXN0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVuTWFuaWZlc3RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5vcGVuTWFuaWZlc3RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC02MzEsMTIgKzYzNCwxMiBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZWZyZXNoQnVuZGxlUmVwb3NpdG9yeSgpIHsKLSAgICAgICAgUmVmcmVzaEJ1bmRsZUpvYi5leGVjdXRlKHNoZWxsLCBnZXRTZXJ2ZXIoKS5nZXRSdW50aW1lKCkpOworICAgICAgICBSZWZyZXNoQnVuZGxlSm9iLmV4ZWN1dGUodGhpcy5zaGVsbCwgZ2V0U2VydmVyKCkuZ2V0UnVudGltZSgpKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBkb3dubG9hZFNvdXJjZXMoKSB7CiAgICAgICAgIFNldDxBcnRlZmFjdD4gYXJ0aWZhY3RzID0gbmV3IExpbmtlZEhhc2hTZXQ8QXJ0ZWZhY3Q+KCk7Ci0gICAgICAgIEFydGVmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gUmVwb3NpdG9yeVV0aWxzLmdldFJlcG9zaXRvcnlDb250ZW50cyhzZXJ2ZXIuZ2V0UnVudGltZSgpKTsKKyAgICAgICAgQXJ0ZWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBSZXBvc2l0b3J5VXRpbHMuZ2V0UmVwb3NpdG9yeUNvbnRlbnRzKHRoaXMuc2VydmVyLmdldFJ1bnRpbWUoKSk7CiAgICAgICAgIGZvciAoSUFydGVmYWN0VHlwZWQgYnVuZGxlIDogcmVwb3NpdG9yeS5nZXRCdW5kbGVzKCkpIHsKICAgICAgICAgICAgIGlmIChidW5kbGUgaW5zdGFuY2VvZiBMb2NhbEJ1bmRsZUFydGVmYWN0KSB7CiAgICAgICAgICAgICAgICAgaWYgKCEoKExvY2FsQnVuZGxlQXJ0ZWZhY3QpIGJ1bmRsZSkuaXNTb3VyY2VEb3dubG9hZGVkKCkpIHsKQEAgLTY1Miw3ICs2NTUsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDaGVja1N0YXRlQ2hhbmdlKGZpbmFsIENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgQnVzeUluZGljYXRvci5zaG93V2hpbGUoc2hlbGwuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHRoaXMuc2hlbGwuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7CiAKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICBib29sZWFuIHN0YXRlID0gZXZlbnQuZ2V0Q2hlY2tlZCgpOwpAQCAtNjY2LDEwMCArNjY5LDEwMyBAQAogICAgICAgICAvLyBjaGVja2VkIHN0YXRlIGlzIHNldCBsYXppbHkgb24gZXhwYW5kLCBkb24ndCBzZXQgaXQgaWYgY29udGFpbmVyIGlzCiAgICAgICAgIC8vIGNvbGxhcHNlZAogCi0gICAgICAgIE9iamVjdFtdIG1lbWJlcnMgPSBzZWFyY2hSZXN1bHRDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oY29udGFpbmVyKTsKKyAgICAgICAgT2JqZWN0W10gbWVtYmVycyA9IHRoaXMuc2VhcmNoUmVzdWx0Q29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKGNvbnRhaW5lcik7CiAgICAgICAgIGZvciAoaW50IGkgPSBtZW1iZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCA9IG1lbWJlcnNbaV07Ci0gICAgICAgICAgICBib29sZWFuIGVsZW1lbnRHcmF5Q2hlY2tlZCA9IHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmdldEdyYXllZChlbGVtZW50KSB8fCBzZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5nZXRDaGVja2VkKGVsZW1lbnQpOworICAgICAgICAgICAgYm9vbGVhbiBlbGVtZW50R3JheUNoZWNrZWQgPSB0aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmdldEdyYXllZChlbGVtZW50KSB8fCB0aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmdldENoZWNrZWQoZWxlbWVudCk7CiAgICAgICAgICAgICBpZiAoc3RhdGUpIHsKLSAgICAgICAgICAgICAgICBzZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOwotICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnNldEdyYXllZChlbGVtZW50LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOworICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuc2V0R3JheWVkKGVsZW1lbnQsIGZhbHNlKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuc2V0R3JheUNoZWNrZWQoZWxlbWVudCwgZmFsc2UpOworICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuc2V0R3JheUNoZWNrZWQoZWxlbWVudCwgZmFsc2UpOwogICAgICAgICAgICAgfSAvLyB1bmNoZWNrZWQgc3RhdGUgb25seQogICAgICAgICAgICAgICAvLyBuZWVkcwotICAgICAgICAgICAgaWYgKChzdGF0ZSB8fCBlbGVtZW50R3JheUNoZWNrZWQpKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUgfHwgZWxlbWVudEdyYXlDaGVja2VkKSB7CiAgICAgICAgICAgICAgICAgc2V0U3VidHJlZUNoZWNrZWQoZWxlbWVudCwgc3RhdGUsIHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBhcmVudFN0YXRlKE9iamVjdCBjaGlsZCkgewotICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCB8fCBzZWFyY2hSZXN1bHRDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KGNoaWxkKSA9PSBudWxsKSB7CisgICAgICAgIGlmIChjaGlsZCA9PSBudWxsIHx8IHRoaXMuc2VhcmNoUmVzdWx0Q29udGVudFByb3ZpZGVyLmdldFBhcmVudChjaGlsZCkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIE9iamVjdCBwYXJlbnQgPSBzZWFyY2hSZXN1bHRDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KGNoaWxkKTsKKyAgICAgICAgT2JqZWN0IHBhcmVudCA9IHRoaXMuc2VhcmNoUmVzdWx0Q29udGVudFByb3ZpZGVyLmdldFBhcmVudChjaGlsZCk7CiAgICAgICAgIGJvb2xlYW4gY2hpbGRDaGVja2VkID0gZmFsc2U7Ci0gICAgICAgIE9iamVjdFtdIG1lbWJlcnMgPSBzZWFyY2hSZXN1bHRDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKKyAgICAgICAgT2JqZWN0W10gbWVtYmVycyA9IHRoaXMuc2VhcmNoUmVzdWx0Q29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudCk7CiAgICAgICAgIGZvciAoaW50IGkgPSBtZW1iZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBpZiAoc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZChtZW1iZXJzW2ldKSB8fCBzZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5nZXRHcmF5ZWQobWVtYmVyc1tpXSkpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmdldENoZWNrZWQobWVtYmVyc1tpXSkgfHwgdGhpcy5zZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5nZXRHcmF5ZWQobWVtYmVyc1tpXSkpIHsKICAgICAgICAgICAgICAgICBjaGlsZENoZWNrZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnNldEdyYXlDaGVja2VkKHBhcmVudCwgY2hpbGRDaGVja2VkKTsKKyAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5zZXRHcmF5Q2hlY2tlZChwYXJlbnQsIGNoaWxkQ2hlY2tlZCk7CiAgICAgICAgIHVwZGF0ZVBhcmVudFN0YXRlKHBhcmVudCk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotICAgICAgICBwcm9wZXJ0eUxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CisgICAgICAgIHRoaXMucHJvcGVydHlMaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewogCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAKLSAgICAgICAgc2VydmVyV0MuYWRkQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TGlzdGVuZXIpOwotICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmFkZEpvYkNoYW5nZUxpc3RlbmVyKGpvYkxpc3RlbmVyKTsKKyAgICAgICAgdGhpcy5zZXJ2ZXJXQy5hZGRDb25maWd1cmF0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5wcm9wZXJ0eUxpc3RlbmVyKTsKKyAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcih0aGlzLmpvYkxpc3RlbmVyKTsKIAotICAgICAgICByZXBvc2l0b3J5TGlzdGVuZXIgPSBuZXcgSUJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgdGhpcy5yZXBvc2l0b3J5TGlzdGVuZXIgPSBuZXcgSUJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lcigpIHsKIAogICAgICAgICAgICAgcHVibGljIHZvaWQgYnVuZGxlUmVwb3NpdG9yeUNoYW5nZWQoSVJ1bnRpbWUgcnVudGltZSkgewogICAgICAgICAgICAgICAgIHJlZnJlc2hWaWV3ZXJzKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07Ci0gICAgICAgIFNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmFkZEJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lcihyZXBvc2l0b3J5TGlzdGVuZXIpOworICAgICAgICBTZXJ2ZXJDb3JlUGx1Z2luLmdldEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKS5hZGRCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIodGhpcy5yZXBvc2l0b3J5TGlzdGVuZXIpOwogCiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VhcmNoKCkgewotICAgICAgICBTdHJpbmcgc2VhcmNoID0gc2VhcmNoVGV4dC5nZXRUZXh0KCk7Ci0gICAgICAgIHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnNldElucHV0KFJlcG9zaXRvcnlVdGlscy5zZWFyY2hGb3JBcnRpZmFjdHMoc2VhcmNoKSk7Ci0gICAgICAgIHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMik7CisgICAgICAgIFN0cmluZyBzZWFyY2ggPSB0aGlzLnNlYXJjaFRleHQuZ2V0VGV4dCgpOworICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnNldElucHV0KFJlcG9zaXRvcnlVdGlscy5zZWFyY2hGb3JBcnRpZmFjdHMoc2VhcmNoKSk7CisgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0VGFibGVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgyKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotICAgICAgICBpZiAoc2VhcmNoUmVzdWx0VGFibGUgPT0gbnVsbCkgeworICAgICAgICBpZiAodGhpcy5zZWFyY2hSZXN1bHRUYWJsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgc2VhcmNoUmVzdWx0VGFibGUucmVtb3ZlQWxsKCk7CisgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0VGFibGUucmVtb3ZlQWxsKCk7CiAgICAgICAgIHNldEVycm9yTWVzc2FnZShudWxsKTsKICAgICAgICAgaW5pdGlhbGl6ZVZpZXdlcnMoKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmlld2VycygpIHsKLSAgICAgICAgc2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHRoaXMuc2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CiAKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVwb3NpdG9yeVRhYmxlVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICFyZXBvc2l0b3J5VGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5VGFibGVWaWV3ZXIuc2V0SW5wdXQoZ2V0U2VydmVyKCkpOwotICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5VGFibGVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgyKTsKKyAgICAgICAgICAgICAgICBpZiAoUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLnRoaXMucmVwb3NpdG9yeVRhYmxlVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmICFSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5yZXBvc2l0b3J5VGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5yZXBvc2l0b3J5VGFibGVWaWV3ZXIuc2V0SW5wdXQoZ2V0U2VydmVyKCkpOworICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5yZXBvc2l0b3J5VGFibGVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgyKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICFzZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnJlZnJlc2godHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMik7CisgICAgICAgICAgICAgICAgaWYgKFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmICFSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5zZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnJlZnJlc2godHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9KTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlld2VycygpIHsKLSAgICAgICAgc2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHRoaXMuc2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CiAKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVwb3NpdG9yeVRhYmxlVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICFyZXBvc2l0b3J5VGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHJlcG9zaXRvcnlUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeVRhYmxlVmlld2VyLnJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeVRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICBzZWFyY2hSZXN1bHRUYWJsZVZpZXdlci5yZWZyZXNoKHRydWUpOworICAgICAgICAgICAgICAgIGlmIChSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5yZXBvc2l0b3J5VGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgIVJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLnJlcG9zaXRvcnlUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLnRoaXMucmVwb3NpdG9yeVRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5yZXBvc2l0b3J5VGFibGVWaWV3ZXIucmVmcmVzaCgpOworICAgICAgICAgICAgICAgICAgICBSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5yZXBvc2l0b3J5VGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLnNlYXJjaFJlc3VsdFRhYmxlVmlld2VyLnJlZnJlc2godHJ1ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9KTsKQEAgLTc3NCwxMCArNzgwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hWaWV3ZXJzKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRKb2IoKSBpbnN0YW5jZW9mIEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIuQXJ0ZWZhY3RSZXBvc2l0b3J5VXBkYXRlSm9iKSB7Ci0gICAgICAgICAgICAgICAgc2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLnRoaXMuc2hlbGwuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CiAKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZSAhPSBudWxsICYmICF1cGRhdGUuaXNEaXNwb3NlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLnRoaXMudXBkYXRlICE9IG51bGwgJiYgIVJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS50aGlzLnVwZGF0ZS5pc0Rpc3Bvc2VkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRSZXBvc2l0b3J5RGF0ZVN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC03OTksOCArODA1LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewogICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgICByZXBvc2l0b3J5VGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbCwgdHJ1ZSk7Ci0gICAgICAgIHJlcG9zaXRvcnlUYWJsZVZpZXdlci5leHBhbmRUb0xldmVsKHNlbC5nZXRGaXJzdEVsZW1lbnQoKSwgQWJzdHJhY3RUcmVlVmlld2VyLkFMTF9MRVZFTFMpOworICAgICAgICB0aGlzLnJlcG9zaXRvcnlUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsLCB0cnVlKTsKKyAgICAgICAgdGhpcy5yZXBvc2l0b3J5VGFibGVWaWV3ZXIuZXhwYW5kVG9MZXZlbChzZWwuZ2V0Rmlyc3RFbGVtZW50KCksIEFic3RyYWN0VHJlZVZpZXdlci5BTExfTEVWRUxTKTsKICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIENvbG9yZWRSZXNwb3NpdG9yeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBSdW50aW1lTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElDb2xvclByb3ZpZGVyIHsKQEAgLTgxMCw3ICs4MTYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIENvbG9yIGdldEZvcmVncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIEFydGVmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gUmVwb3NpdG9yeVV0aWxzLmdldFJlcG9zaXRvcnlDb250ZW50cyhzZXJ2ZXIuZ2V0UnVudGltZSgpKTsKKyAgICAgICAgICAgIEFydGVmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gUmVwb3NpdG9yeVV0aWxzLmdldFJlcG9zaXRvcnlDb250ZW50cyhSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UudGhpcy5zZXJ2ZXIuZ2V0UnVudGltZSgpKTsKICAgICAgICAgICAgIGlmIChyZXBvc2l0b3J5ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEFydGVmYWN0ICYmIHJlcG9zaXRvcnkuY29udGFpbnMoKElBcnRlZmFjdCkgZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0RBUktfR1JBWSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZWRpdG9yL1NlcnZlckRlcGxveUVkaXRvclNlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvU2VydmVyRGVwbG95RWRpdG9yU2VjdGlvbi5qYXZhCmluZGV4IGU3N2NjOWUuLjg2M2M0ZTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvU2VydmVyRGVwbG95RWRpdG9yU2VjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvU2VydmVyRGVwbG95RWRpdG9yU2VjdGlvbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLmVkaXRvcjsKIAogaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKQEAgLTQ2LDIwMCArNDcsMjAxIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJEZXBsb3lFZGl0b3JTZWN0aW9uIGV4dGVuZHMgU2VydmVyRWRpdG9yU2VjdGlvbiB7CiAKLQlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldvcmtpbmdDb3B5OworICAgIHByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyV29ya2luZ0NvcHk7CiAKLQlwcm90ZWN0ZWQgVGV4dCBwb3J0OworICAgIHByb3RlY3RlZCBUZXh0IHBvcnQ7CiAKLQlwcm90ZWN0ZWQgVGV4dCB0aW1lb3V0OworICAgIHByb3RlY3RlZCBUZXh0IHRpbWVvdXQ7CiAKLQlwcm90ZWN0ZWQgVGV4dCB1c2VybmFtZTsKKyAgICBwcm90ZWN0ZWQgVGV4dCB1c2VybmFtZTsKIAotCXByb3RlY3RlZCBUZXh0IHBhc3N3b3JkOworICAgIHByb3RlY3RlZCBUZXh0IHBhc3N3b3JkOwogCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRpbmc7CiAKLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKKyAgICBwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKIAotCXByb3RlY3RlZCB2b2lkIGFkZENvbmZpZ3VyYXRpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodXBkYXRpbmcpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJaWYgKElTZXJ2ZXIuUFJPUEVSVFlfTUJFQU5fU0VSVkVSX1BBU1NXT1JELmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJcGFzc3dvcmQuc2V0VGV4dChldmVudC5nZXROZXdWYWx1ZSgpLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAoSVNlcnZlci5QUk9QRVJUWV9ERVBMT1lfVElNRU9VVC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCXRpbWVvdXQuc2V0VGV4dChldmVudC5nZXROZXdWYWx1ZSgpLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAoSVNlcnZlci5QUk9QRVJUWV9NQkVBTl9TRVJWRVJfUE9SVC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCXBvcnQuc2V0VGV4dChldmVudC5nZXROZXdWYWx1ZSgpLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAoSVNlcnZlci5QUk9QRVJUWV9NQkVBTl9TRVJWRVJfVVNFUk5BTUUuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQl1c2VybmFtZS5zZXRUZXh0KGV2ZW50LmdldE5ld1ZhbHVlKCkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCXNlcnZlcldvcmtpbmdDb3B5LmFkZENvbmZpZ3VyYXRpb25DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIGFkZENvbmZpZ3VyYXRpb25DaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgdGhpcy5saXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IGdldEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOworICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJEZXBsb3lFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZXJ2ZXJEZXBsb3lFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChJU2VydmVyLlBST1BFUlRZX01CRUFOX1NFUlZFUl9QQVNTV09SRC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIFNlcnZlckRlcGxveUVkaXRvclNlY3Rpb24udGhpcy5wYXNzd29yZC5zZXRUZXh0KGV2ZW50LmdldE5ld1ZhbHVlKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChJU2VydmVyLlBST1BFUlRZX0RFUExPWV9USU1FT1VULmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgU2VydmVyRGVwbG95RWRpdG9yU2VjdGlvbi50aGlzLnRpbWVvdXQuc2V0VGV4dChldmVudC5nZXROZXdWYWx1ZSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNlcnZlci5QUk9QRVJUWV9NQkVBTl9TRVJWRVJfUE9SVC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIFNlcnZlckRlcGxveUVkaXRvclNlY3Rpb24udGhpcy5wb3J0LnNldFRleHQoZXZlbnQuZ2V0TmV3VmFsdWUoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElTZXJ2ZXIuUFJPUEVSVFlfTUJFQU5fU0VSVkVSX1VTRVJOQU1FLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgU2VydmVyRGVwbG95RWRpdG9yU2VjdGlvbi50aGlzLnVzZXJuYW1lLnNldFRleHQoZXZlbnQuZ2V0TmV3VmFsdWUoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2VydmVyRGVwbG95RWRpdG9yU2VjdGlvbi50aGlzLnVwZGF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHRoaXMuc2VydmVyV29ya2luZ0NvcHkuYWRkQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKHRoaXMubGlzdGVuZXIpOworICAgIH0KIAotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkVYUEFOREVECi0JCQkJfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKLQkJc2VjdGlvbi5zZXRUZXh0KCJEZXBsb3llciBDb250cm9sIik7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oIkNvbmZpZ3VyZSB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBzZXJ2ZXIgRGVwbG95ZXIgQ29udHJvbC4iKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIHN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKKyAgICAgICAgRm9ybVRvb2xraXQgdG9vbGtpdCA9IGdldEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwogCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDU7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDE1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbXBvc2l0ZSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbXBvc2l0ZSk7CisgICAgICAgIFNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuRVhQQU5ERUQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUgorICAgICAgICAgICAgfCBTZWN0aW9uLkRFU0NSSVBUSU9OIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5GT0NVU19USVRMRSk7CisgICAgICAgIHNlY3Rpb24uc2V0VGV4dCgiRGVwbG95ZXIgQ29udHJvbCIpOworICAgICAgICBzZWN0aW9uLnNldERlc2NyaXB0aW9uKCJDb25maWd1cmUgdGhlIGNvbW11bmljYXRpb24gd2l0aCB0aGUgc2VydmVyIERlcGxveWVyIENvbnRyb2wuIik7CisgICAgICAgIHNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwogCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOworICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisgICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKKyAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7CisgICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDEwOworICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKKyAgICAgICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTU7CisgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKyAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKKyAgICAgICAgdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKKyAgICAgICAgc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKIAotCQlMYWJlbCBwb3J0TGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIlBvcnQ6Iik7Ci0JCXBvcnRMYWJlbC5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoSUZvcm1Db2xvcnMuVElUTEUpKTsKLQkJcG9ydCA9IHRvb2xraXQuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsKLQkJcG9ydC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlwb3J0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmICh1cGRhdGluZykgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWdldE1hbmFnZWRGb3JtKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5yZW1vdmVNZXNzYWdlcyhwb3J0KTsKLQkJCQlpbnQgbmV3UG9ydCA9IC0xOwotCQkJCXRyeSB7Ci0JCQkJCW5ld1BvcnQgPSBJbnRlZ2VyLnZhbHVlT2YocG9ydC5nZXRUZXh0KCkpOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJZ2V0TWFuYWdlZEZvcm0oKS5nZXRNZXNzYWdlTWFuYWdlcigpLmFkZE1lc3NhZ2UoIk1BTEZPUk1FRC1QT1JUIiwgIlBvcnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIsCi0JCQkJCQkJbnVsbCwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUiwgcG9ydCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQlleGVjdXRlKG5ldyBNb2RpZnlEZXBsb3llclBvcnRDb21tYW5kKHNlcnZlcldvcmtpbmdDb3B5LCBuZXdQb3J0KSk7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfSk7CisgICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKIAotCQlMYWJlbCB0aW1lb3V0TGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIlRpbWVvdXQ6Iik7Ci0JCXRpbWVvdXRMYWJlbC5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoSUZvcm1Db2xvcnMuVElUTEUpKTsKLQkJdGltZW91dCA9IHRvb2xraXQuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsKLQkJdGltZW91dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0aW1lb3V0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmICh1cGRhdGluZykgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWdldE1hbmFnZWRGb3JtKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5yZW1vdmVNZXNzYWdlcyh0aW1lb3V0KTsKLQkJCQlJbnRlZ2VyIG5ld1RpbWVvdXQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW5ld1RpbWVvdXQgPSBJbnRlZ2VyLnZhbHVlT2YodGltZW91dC5nZXRUZXh0KCkpOwotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJZ2V0TWFuYWdlZEZvcm0oKS5nZXRNZXNzYWdlTWFuYWdlcigpLmFkZE1lc3NhZ2UoIk1BTEZPUk1FRC1USU1FT1VUIiwKLQkJCQkJCQkiVGltZW91dCBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIiwgbnVsbCwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUiwgdGltZW91dCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKG5ld1RpbWVvdXQgPCA1KSB7Ci0JCQkJCWdldE1hbmFnZWRGb3JtKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5hZGRNZXNzYWdlKCJJTlZBTElELVRJTUVPVVQiLCAiVGltZW91dCBjYW5ub3QgYmUgbGVzcyB0aGFuIDUiLAotCQkJCQkJCW51bGwsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IsIHRpbWVvdXQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQlleGVjdXRlKG5ldyBNb2RpZnlEZXBsb3llclRpbWVvdXRDb21tYW5kKHNlcnZlcldvcmtpbmdDb3B5LCBuZXdUaW1lb3V0KSk7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfSk7CisgICAgICAgIExhYmVsIHBvcnRMYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiUG9ydDoiKTsKKyAgICAgICAgcG9ydExhYmVsLnNldEZvcmVncm91bmQodG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRDb2xvcihJRm9ybUNvbG9ycy5USVRMRSkpOworICAgICAgICB0aGlzLnBvcnQgPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7CisgICAgICAgIHRoaXMucG9ydC5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICB0aGlzLnBvcnQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewogCi0vLwkJTGFiZWwgdXNlcm5hbWVMYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiVXNlcm5hbWU6Iik7Ci0vLwkJdXNlcm5hbWVMYWJlbC5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoSUZvcm1Db2xvcnMuVElUTEUpKTsKLS8vCQl1c2VybmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsKLS8vCQl1c2VybmFtZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotLy8JCXVzZXJuYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLS8vCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0vLwkJCQlpZiAodXBkYXRpbmcpCi0vLwkJCQkJcmV0dXJuOwotLy8JCQkJdXBkYXRpbmcgPSB0cnVlOwotLy8JCQkJZXhlY3V0ZShuZXcgTW9kaWZ5RGVwbG95ZXJVc2VybmFtZUNvbW1hbmQoc2VydmVyV29ya2luZ0NvcHksIHVzZXJuYW1lLmdldFRleHQoKSkpOwotLy8JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLS8vCQkJfQotLy8JCX0pOwotLy8KLS8vCQlMYWJlbCBwYXNzd29yZExhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChjb21wb3NpdGUsICJQYXNzd29yZDoiKTsKLS8vCQlwYXNzd29yZExhYmVsLnNldEZvcmVncm91bmQodG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRDb2xvcihJRm9ybUNvbG9ycy5USVRMRSkpOwotLy8JCXBhc3N3b3JkID0gdG9vbGtpdC5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIsIFNXVC5QQVNTV09SRCk7Ci0vLwkJcGFzc3dvcmQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLS8vCQlwYXNzd29yZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotLy8JCQkJaWYgKHVwZGF0aW5nKQotLy8JCQkJCXJldHVybjsKLS8vCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLS8vCQkJCWV4ZWN1dGUobmV3IE1vZGlmeURlcGxveWVyUGFzc3dvcmRDb21tYW5kKHNlcnZlcldvcmtpbmdDb3B5LCBwYXNzd29yZC5nZXRUZXh0KCkpKTsKLS8vCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0vLwkJCX0KLS8vCQl9KTsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJEZXBsb3lFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZXRNYW5hZ2VkRm9ybSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkucmVtb3ZlTWVzc2FnZXMoU2VydmVyRGVwbG95RWRpdG9yU2VjdGlvbi50aGlzLnBvcnQpOworICAgICAgICAgICAgICAgIGludCBuZXdQb3J0ID0gLTE7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbmV3UG9ydCA9IEludGVnZXIudmFsdWVPZihTZXJ2ZXJEZXBsb3lFZGl0b3JTZWN0aW9uLnRoaXMucG9ydC5nZXRUZXh0KCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0TWFuYWdlZEZvcm0oKS5nZXRNZXNzYWdlTWFuYWdlcigpLmFkZE1lc3NhZ2UoIk1BTEZPUk1FRC1QT1JUIiwgIlBvcnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIsIG51bGwsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJEZXBsb3lFZGl0b3JTZWN0aW9uLnRoaXMucG9ydCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOworICAgICAgICAgICAgICAgIFNlcnZlckRlcGxveUVkaXRvclNlY3Rpb24udGhpcy51cGRhdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgZXhlY3V0ZShuZXcgTW9kaWZ5RGVwbG95ZXJQb3J0Q29tbWFuZChTZXJ2ZXJEZXBsb3lFZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyV29ya2luZ0NvcHksIG5ld1BvcnQpKTsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJEZXBsb3lFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQkJaW5pdGlhbGl6ZSgpOwotCX0KKyAgICAgICAgTGFiZWwgdGltZW91dExhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChjb21wb3NpdGUsICJUaW1lb3V0OiIpOworICAgICAgICB0aW1lb3V0TGFiZWwuc2V0Rm9yZWdyb3VuZCh0b29sa2l0LmdldENvbG9ycygpLmdldENvbG9yKElGb3JtQ29sb3JzLlRJVExFKSk7CisgICAgICAgIHRoaXMudGltZW91dCA9IHRvb2xraXQuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsKKyAgICAgICAgdGhpcy50aW1lb3V0LnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIHRoaXMudGltZW91dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CiAKLQkvKioKLQkgKiBAc2VlIFNlcnZlckVkaXRvclNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlzZXJ2ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoU2VydmVyRGVwbG95RWRpdG9yU2VjdGlvbi50aGlzLnVwZGF0aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ2V0TWFuYWdlZEZvcm0oKS5nZXRNZXNzYWdlTWFuYWdlcigpLnJlbW92ZU1lc3NhZ2VzKFNlcnZlckRlcGxveUVkaXRvclNlY3Rpb24udGhpcy50aW1lb3V0KTsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIG5ld1RpbWVvdXQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG5ld1RpbWVvdXQgPSBJbnRlZ2VyLnZhbHVlT2YoU2VydmVyRGVwbG95RWRpdG9yU2VjdGlvbi50aGlzLnRpbWVvdXQuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICAgICAgICAgIGdldE1hbmFnZWRGb3JtKCkuZ2V0TWVzc2FnZU1hbmFnZXIoKS5hZGRNZXNzYWdlKCJNQUxGT1JNRUQtVElNRU9VVCIsICJUaW1lb3V0IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgSU1lc3NhZ2VQcm92aWRlci5FUlJPUiwgU2VydmVyRGVwbG95RWRpdG9yU2VjdGlvbi50aGlzLnRpbWVvdXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChuZXdUaW1lb3V0IDwgNSkgeworICAgICAgICAgICAgICAgICAgICBnZXRNYW5hZ2VkRm9ybSgpLmdldE1lc3NhZ2VNYW5hZ2VyKCkuYWRkTWVzc2FnZSgiSU5WQUxJRC1USU1FT1VUIiwgIlRpbWVvdXQgY2Fubm90IGJlIGxlc3MgdGhhbiA1IiwgbnVsbCwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlckRlcGxveUVkaXRvclNlY3Rpb24udGhpcy50aW1lb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTZXJ2ZXJEZXBsb3lFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGV4ZWN1dGUobmV3IE1vZGlmeURlcGxveWVyVGltZW91dENvbW1hbmQoU2VydmVyRGVwbG95RWRpdG9yU2VjdGlvbi50aGlzLnNlcnZlcldvcmtpbmdDb3B5LCBuZXdUaW1lb3V0KSk7CisgICAgICAgICAgICAgICAgU2VydmVyRGVwbG95RWRpdG9yU2VjdGlvbi50aGlzLnVwZGF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JLyoqCi0JICogQHNlZSBTZXJ2ZXJFZGl0b3JTZWN0aW9uI2luaXQoSUVkaXRvclNpdGUsIElFZGl0b3JJbnB1dCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJc2VydmVyV29ya2luZ0NvcHkgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXIubG9hZEFkYXB0ZXIoSVNlcnZlcldvcmtpbmdDb3B5LmNsYXNzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYWRkQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JfQorICAgICAgICAvLyBMYWJlbCB1c2VybmFtZUxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChjb21wb3NpdGUsICJVc2VybmFtZToiKTsKKyAgICAgICAgLy8gdXNlcm5hbWVMYWJlbC5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoSUZvcm1Db2xvcnMuVElUTEUpKTsKKyAgICAgICAgLy8gdXNlcm5hbWUgPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7CisgICAgICAgIC8vIHVzZXJuYW1lLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIC8vIHVzZXJuYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKyAgICAgICAgLy8gcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisgICAgICAgIC8vIGlmICh1cGRhdGluZykKKyAgICAgICAgLy8gcmV0dXJuOworICAgICAgICAvLyB1cGRhdGluZyA9IHRydWU7CisgICAgICAgIC8vIGV4ZWN1dGUobmV3IE1vZGlmeURlcGxveWVyVXNlcm5hbWVDb21tYW5kKHNlcnZlcldvcmtpbmdDb3B5LCB1c2VybmFtZS5nZXRUZXh0KCkpKTsKKyAgICAgICAgLy8gdXBkYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgLy8gfQorICAgICAgICAvLyB9KTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTGFiZWwgcGFzc3dvcmRMYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiUGFzc3dvcmQ6Iik7CisgICAgICAgIC8vIHBhc3N3b3JkTGFiZWwuc2V0Rm9yZWdyb3VuZCh0b29sa2l0LmdldENvbG9ycygpLmdldENvbG9yKElGb3JtQ29sb3JzLlRJVExFKSk7CisgICAgICAgIC8vIHBhc3N3b3JkID0gdG9vbGtpdC5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIsIFNXVC5QQVNTV09SRCk7CisgICAgICAgIC8vIHBhc3N3b3JkLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIC8vIHBhc3N3b3JkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKyAgICAgICAgLy8gcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisgICAgICAgIC8vIGlmICh1cGRhdGluZykKKyAgICAgICAgLy8gcmV0dXJuOworICAgICAgICAvLyB1cGRhdGluZyA9IHRydWU7CisgICAgICAgIC8vIGV4ZWN1dGUobmV3IE1vZGlmeURlcGxveWVyUGFzc3dvcmRDb21tYW5kKHNlcnZlcldvcmtpbmdDb3B5LCBwYXNzd29yZC5nZXRUZXh0KCkpKTsKKyAgICAgICAgLy8gdXBkYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgLy8gfQorICAgICAgICAvLyB9KTsKIAotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGZpZWxkcyBpbiB0aGlzIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl1cGRhdGluZyA9IHRydWU7Ci0JCXRoaXMucG9ydC5zZXRUZXh0KCIiICsgc2VydmVyV29ya2luZ0NvcHkuZ2V0TUJlYW5TZXJ2ZXJQb3J0KCkpOwotCQl0aGlzLnRpbWVvdXQuc2V0VGV4dCgiIiArIHNlcnZlcldvcmtpbmdDb3B5LmdldERlcGxveVRpbWVvdXQoKSk7Ci0vLwkJdGhpcy51c2VybmFtZS5zZXRUZXh0KHNlcnZlcldvcmtpbmdDb3B5LmdldERlcGxveWVyVXNlcm5hbWUoKSk7Ci0vLwkJdGhpcy5wYXNzd29yZC5zZXRUZXh0KHNlcnZlcldvcmtpbmdDb3B5LmdldERlcGxveWVyUGFzc3dvcmQoKSk7Ci0JCXVwZGF0aW5nID0gZmFsc2U7Ci0JfQorICAgICAgICBpbml0aWFsaXplKCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXNbXSBnZXRTYXZlU3RhdHVzKCkgewotCQkvLyB0aGlzIGVycm9ycyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFzIHRoZSBwb3J0IGFuZCB0aW1lb3V0IGNvbnRyb2xzIG5vdyBwcmV2ZW50IHRoZSB1c2VyCi0JCS8vIGZyb20gZW50ZXJpbmcgaW52YWxpZCB2YWx1ZXMuCi0JCXRyeSB7Ci0JCQlJbnRlZ2VyLnZhbHVlT2YocG9ydC5nZXRUZXh0KCkpOwotCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQlyZXR1cm4gbmV3IElTdGF0dXNbXSB7IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyVWlQbHVnaW4uUExVR0lOX0lELCAiJyIgKyBwb3J0LmdldFRleHQoKQotCQkJCQkrICInIGlzIG5vdCBhIHZhbGlkIHBvcnQgbnVtYmVyIikgfTsKLQkJfQotCQl0cnkgewotCQkJSW50ZWdlci52YWx1ZU9mKHRpbWVvdXQuZ2V0VGV4dCgpKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJcmV0dXJuIG5ldyBJU3RhdHVzW10geyBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclVpUGx1Z2luLlBMVUdJTl9JRCwgIiciICsgdGltZW91dC5nZXRUZXh0KCkKLQkJCQkJKyAiJyBpcyBub3QgYSB2YWxpZCB0aW1lb3V0IikgfTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U2F2ZVN0YXR1cygpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIFNlcnZlckVkaXRvclNlY3Rpb24jZGlzcG9zZSgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgaWYgKHRoaXMuc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcy5saXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIFNlcnZlckVkaXRvclNlY3Rpb24jaW5pdChJRWRpdG9yU2l0ZSwgSUVkaXRvcklucHV0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7CisgICAgICAgIHN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOworICAgICAgICB0aGlzLnNlcnZlcldvcmtpbmdDb3B5ID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgdGhpcy5zZXJ2ZXIubG9hZEFkYXB0ZXIoSVNlcnZlcldvcmtpbmdDb3B5LmNsYXNzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKyAgICAgICAgYWRkQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgZmllbGRzIGluIHRoaXMgZWRpdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIHRoaXMudXBkYXRpbmcgPSB0cnVlOworICAgICAgICB0aGlzLnBvcnQuc2V0VGV4dCgiIiArIHRoaXMuc2VydmVyV29ya2luZ0NvcHkuZ2V0TUJlYW5TZXJ2ZXJQb3J0KCkpOworICAgICAgICB0aGlzLnRpbWVvdXQuc2V0VGV4dCgiIiArIHRoaXMuc2VydmVyV29ya2luZ0NvcHkuZ2V0RGVwbG95VGltZW91dCgpKTsKKyAgICAgICAgLy8gdGhpcy51c2VybmFtZS5zZXRUZXh0KHNlcnZlcldvcmtpbmdDb3B5LmdldERlcGxveWVyVXNlcm5hbWUoKSk7CisgICAgICAgIC8vIHRoaXMucGFzc3dvcmQuc2V0VGV4dChzZXJ2ZXJXb3JraW5nQ29weS5nZXREZXBsb3llclBhc3N3b3JkKCkpOworICAgICAgICB0aGlzLnVwZGF0aW5nID0gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElTdGF0dXNbXSBnZXRTYXZlU3RhdHVzKCkgeworICAgICAgICAvLyB0aGlzIGVycm9ycyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFzIHRoZSBwb3J0IGFuZCB0aW1lb3V0IGNvbnRyb2xzIG5vdyBwcmV2ZW50IHRoZSB1c2VyCisgICAgICAgIC8vIGZyb20gZW50ZXJpbmcgaW52YWxpZCB2YWx1ZXMuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnRlZ2VyLnZhbHVlT2YodGhpcy5wb3J0LmdldFRleHQoKSk7CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSVN0YXR1c1tdIHsgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJVaVBsdWdpbi5QTFVHSU5fSUQsICInIiArIHRoaXMucG9ydC5nZXRUZXh0KCkgKyAiJyBpcyBub3QgYSB2YWxpZCBwb3J0IG51bWJlciIpIH07CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEludGVnZXIudmFsdWVPZih0aGlzLnRpbWVvdXQuZ2V0VGV4dCgpKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJU3RhdHVzW10geyBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlclVpUGx1Z2luLlBMVUdJTl9JRCwgIiciICsgdGhpcy50aW1lb3V0LmdldFRleHQoKSArICInIGlzIG5vdCBhIHZhbGlkIHRpbWVvdXQiKSB9OworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5nZXRTYXZlU3RhdHVzKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2VkaXRvci9TZXJ2ZXJPdXRsaW5lUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2VkaXRvci9TZXJ2ZXJPdXRsaW5lUGFnZS5qYXZhCmluZGV4IDJlNDgxNmMuLmZjZjYxNWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvU2VydmVyT3V0bGluZVBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZWRpdG9yL1NlcnZlck91dGxpbmVQYWdlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkuZWRpdG9yOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwpAQCAtNDgsMTIyICs0OSwxMTggQEAKIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCiBwdWJsaWMgY2xhc3MgU2VydmVyT3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgewogCi0JcHJpdmF0ZSBDb21tb25WaWV3ZXIgY29udGVudE91dGxpbmVWaWV3ZXI7CisgICAgcHJpdmF0ZSBDb21tb25WaWV3ZXIgY29udGVudE91dGxpbmVWaWV3ZXI7CiAKLQlwcm90ZWN0ZWQgT2JqZWN0IGlucHV0OworICAgIHByb3RlY3RlZCBPYmplY3QgaW5wdXQ7CiAKLQlmaW5hbCBTZXJ2ZXJFZGl0b3IgZWRpdG9yOworICAgIGZpbmFsIFNlcnZlckVkaXRvciBlZGl0b3I7CiAKLQlwdWJsaWMgU2VydmVyT3V0bGluZVBhZ2UoU2VydmVyRWRpdG9yIGVkaXRvcikgewotCQl0aGlzLmVkaXRvciA9IGVkaXRvcjsKLQl9CisgICAgcHVibGljIFNlcnZlck91dGxpbmVQYWdlKFNlcnZlckVkaXRvciBlZGl0b3IpIHsKKyAgICAgICAgdGhpcy5lZGl0b3IgPSBlZGl0b3I7CisgICAgfQogCi0JcHJpdmF0ZSBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gTXVsdGlQYWdlRWRpdG9yUGFydC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0QWN0aXZlRWRpdG9yIiwgbmV3IENsYXNzW10ge30pOwotCQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCQlPYmplY3QgcmVzdWx0ID0gbWV0aG9kLmludm9rZShlZGl0b3IsIG5ldyBPYmplY3RbXSB7fSk7Ci0JCQlyZXR1cm4gKElFZGl0b3JQYXJ0KSByZXN1bHQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KKyAgICBwcml2YXRlIElFZGl0b3JQYXJ0IGdldEFjdGl2ZUVkaXRvcigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBNdWx0aVBhZ2VFZGl0b3JQYXJ0LmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRBY3RpdmVFZGl0b3IiLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBtZXRob2QuaW52b2tlKHRoaXMuZWRpdG9yLCBuZXcgT2JqZWN0W10ge30pOworICAgICAgICAgICAgcmV0dXJuIChJRWRpdG9yUGFydCkgcmVzdWx0OworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZSNnZXRDb250cm9sKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gY29udGVudE91dGxpbmVWaWV3ZXIuZ2V0Q29udHJvbCgpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZSNnZXRDb250cm9sKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50T3V0bGluZVZpZXdlci5nZXRDb250cm9sKCk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZVBhZ2UjZ2V0VHJlZVZpZXdlcigpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgZ2V0VHJlZVZpZXdlcigpIHsKLQkJcmV0dXJuIGNvbnRlbnRPdXRsaW5lVmlld2VyOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZSNnZXRUcmVlVmlld2VyKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVHJlZVZpZXdlciBnZXRUcmVlVmlld2VyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50T3V0bGluZVZpZXdlcjsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworICAgICAgICBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7CiAKLQkJY29udGVudE91dGxpbmVWaWV3ZXIgPSBuZXcgQ29tbW9uVmlld2VyKFNlcnZlclVpUGx1Z2luLlJVTlRJTUVfT1VUTElORV9WSUVXX0lELCBwYXJlbnQsIFNXVC5NVUxUSQotCQkJCXwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJLy9jb250ZW50T3V0bGluZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldElucHV0KGVkaXRvcik7CisgICAgICAgIHRoaXMuY29udGVudE91dGxpbmVWaWV3ZXIgPSBuZXcgQ29tbW9uVmlld2VyKFNlcnZlclVpUGx1Z2luLlJVTlRJTUVfT1VUTElORV9WSUVXX0lELCBwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7CisgICAgICAgIC8vIGNvbnRlbnRPdXRsaW5lVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgdGhpcy5jb250ZW50T3V0bGluZVZpZXdlci5zZXRJbnB1dCh0aGlzLmVkaXRvcik7CiAKLQkJY29udGVudE91dGxpbmVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgeworICAgICAgICB0aGlzLmNvbnRlbnRPdXRsaW5lVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKIAotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0VHJlZVZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBUcmVlU2VsZWN0aW9uKSB7Ci0JCQkJCVRyZWVTZWxlY3Rpb24gdHJlZVNlbCA9IChUcmVlU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJCWlmICh0cmVlU2VsLmdldFBhdGhzKCkubGVuZ3RoID4gMCkgewotCQkJCQkJVHJlZVBhdGggZmlyc3RQYXRoID0gdHJlZVNlbC5nZXRQYXRocygpWzBdOwotCQkJCQkJaWYgKGZpcnN0UGF0aC5nZXRGaXJzdFNlZ21lbnQoKSBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCQkJSUVkaXRvclBhcnQgbmV3UGFydCA9IChJRWRpdG9yUGFydCkgZmlyc3RQYXRoLmdldEZpcnN0U2VnbWVudCgpOwotCQkJCQkJCWlmIChnZXRBY3RpdmVFZGl0b3IoKSAhPSBuZXdQYXJ0KSB7Ci0JCQkJCQkJCWVkaXRvci5zZXRBY3RpdmVFZGl0b3IobmV3UGFydCk7Ci0JCQkJCQkJfQotCQkJCQkJCUxpc3Q8T2JqZWN0PiBsZWFmTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCQkJCWZvciAoVHJlZVBhdGggcGF0aCA6IHRyZWVTZWwuZ2V0UGF0aHMoKSkgewotCQkJCQkJCQlsZWFmTGlzdC5hZGQocGF0aC5nZXRMYXN0U2VnbWVudCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGxlYWZMaXN0LnNpemUoKSA+IDApIHsKLQkJCQkJCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBwYWdlTGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgbmV3UGFydC5nZXRBZGFwdGVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIuY2xhc3MpOwotCQkJCQkJCQlpZiAocGFnZUxpc3RlbmVyIGluc3RhbmNlb2YgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgewotCQkJCQkJCQkJcGFnZUxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChnZXRUcmVlVmlld2VyKCksCi0JCQkJCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxlYWZMaXN0KSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHNlbC5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCQllZGl0b3Iuc2V0QWN0aXZlRWRpdG9yKChJRWRpdG9yUGFydCkgc2VsLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldFNvcnRlcihuZXcgQXJ0ZWZhY3RTaWduYXR1cmVTb3J0ZXIoKSk7Ci0JCXJlZ2lzdGVyQ29udGV4dE1lbnUoY29udGVudE91dGxpbmVWaWV3ZXIpOwotCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgVHJlZVNlbGVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICBUcmVlU2VsZWN0aW9uIHRyZWVTZWwgPSAoVHJlZVNlbGVjdGlvbikgc2VsZWN0aW9uOworICAgICAgICAgICAgICAgICAgICBpZiAodHJlZVNlbC5nZXRQYXRocygpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVQYXRoIGZpcnN0UGF0aCA9IHRyZWVTZWwuZ2V0UGF0aHMoKVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFBhdGguZ2V0Rmlyc3RTZWdtZW50KCkgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFZGl0b3JQYXJ0IG5ld1BhcnQgPSAoSUVkaXRvclBhcnQpIGZpcnN0UGF0aC5nZXRGaXJzdFNlZ21lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0QWN0aXZlRWRpdG9yKCkgIT0gbmV3UGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJPdXRsaW5lUGFnZS50aGlzLmVkaXRvci5zZXRBY3RpdmVFZGl0b3IobmV3UGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiBsZWFmTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoVHJlZVBhdGggcGF0aCA6IHRyZWVTZWwuZ2V0UGF0aHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFmTGlzdC5hZGQocGF0aC5nZXRMYXN0U2VnbWVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlYWZMaXN0LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBwYWdlTGlzdGVuZXIgPSBuZXdQYXJ0LmdldEFkYXB0ZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lci5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlTGlzdGVuZXIgaW5zdGFuY2VvZiBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KGdldFRyZWVWaWV3ZXIoKSwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obGVhZkxpc3QpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlck91dGxpbmVQYWdlLnRoaXMuZWRpdG9yLnNldEFjdGl2ZUVkaXRvcigoSUVkaXRvclBhcnQpIHNlbC5nZXRGaXJzdEVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmNvbnRlbnRPdXRsaW5lVmlld2VyLnNldFNvcnRlcihuZXcgQXJ0ZWZhY3RTaWduYXR1cmVTb3J0ZXIoKSk7CisgICAgICAgIHJlZ2lzdGVyQ29udGV4dE1lbnUodGhpcy5jb250ZW50T3V0bGluZVZpZXdlcik7CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJDb250ZXh0TWVudShTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlNZW51TWFuYWdlciBtYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0JCU1lbnUgbWVudSA9IG1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoIlNvbWV0aGluZyIsIG1hbmFnZXIsIHZpZXdlcik7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQ29udGV4dE1lbnUoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKKyAgICAgICAgTWVudU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigpOworICAgICAgICBNZW51IG1lbnUgPSBtYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOworICAgICAgICB2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7CisgICAgICAgIGdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KCJTb21ldGhpbmciLCBtYW5hZ2VyLCB2aWV3ZXIpOworICAgIH0KIAotCWNsYXNzIFNvcnRpbmdBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgIGNsYXNzIFNvcnRpbmdBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewogCi0JCXByaXZhdGUgYm9vbGVhbiBzb3J0aW5nT247CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBzb3J0aW5nT247CiAKLQkJcHVibGljIFNvcnRpbmdBY3Rpb24oKSB7Ci0JCQlzdXBlcigpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBJSGVscENvbnRleHRJZHMuT1VUTElORV9TT1JUX0FDVElPTik7Ci0JCQlzZXRUZXh0KFBERVVJTWVzc2FnZXMuUERFTXVsdGlQYWdlQ29udGVudE91dGxpbmVfU29ydGluZ0FjdGlvbl9sYWJlbCk7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoUERFUGx1Z2luSW1hZ2VzLkRFU0NfQUxQSEFCX1NPUlRfQ08pOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUERFUGx1Z2luSW1hZ2VzLkRFU0NfQUxQSEFCX1NPUlRfQ09fRElTQUJMRUQpOwotCQkJc2V0VG9vbFRpcFRleHQoUERFVUlNZXNzYWdlcy5QREVNdWx0aVBhZ2VDb250ZW50T3V0bGluZV9Tb3J0aW5nQWN0aW9uX3Rvb2x0aXApOwotCQkJc2V0RGVzY3JpcHRpb24oUERFVUlNZXNzYWdlcy5QREVNdWx0aVBhZ2VDb250ZW50T3V0bGluZV9Tb3J0aW5nQWN0aW9uX2Rlc2NyaXB0aW9uKTsKLQkJCXNldENoZWNrZWQoc29ydGluZ09uKTsKLQkJfQorICAgICAgICBwdWJsaWMgU29ydGluZ0FjdGlvbigpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIElIZWxwQ29udGV4dElkcy5PVVRMSU5FX1NPUlRfQUNUSU9OKTsKKyAgICAgICAgICAgIHNldFRleHQoUERFVUlNZXNzYWdlcy5QREVNdWx0aVBhZ2VDb250ZW50T3V0bGluZV9Tb3J0aW5nQWN0aW9uX2xhYmVsKTsKKyAgICAgICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihQREVQbHVnaW5JbWFnZXMuREVTQ19BTFBIQUJfU09SVF9DTyk7CisgICAgICAgICAgICBzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihQREVQbHVnaW5JbWFnZXMuREVTQ19BTFBIQUJfU09SVF9DT19ESVNBQkxFRCk7CisgICAgICAgICAgICBzZXRUb29sVGlwVGV4dChQREVVSU1lc3NhZ2VzLlBERU11bHRpUGFnZUNvbnRlbnRPdXRsaW5lX1NvcnRpbmdBY3Rpb25fdG9vbHRpcCk7CisgICAgICAgICAgICBzZXREZXNjcmlwdGlvbihQREVVSU1lc3NhZ2VzLlBERU11bHRpUGFnZUNvbnRlbnRPdXRsaW5lX1NvcnRpbmdBY3Rpb25fZGVzY3JpcHRpb24pOworICAgICAgICAgICAgc2V0Q2hlY2tlZCh0aGlzLnNvcnRpbmdPbik7CisgICAgICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJc2V0Q2hlY2tlZChpc0NoZWNrZWQoKSk7Ci0JCQl2YWx1ZUNoYW5nZWQoaXNDaGVja2VkKCkpOwotCQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBzZXRDaGVja2VkKGlzQ2hlY2tlZCgpKTsKKyAgICAgICAgICAgIHZhbHVlQ2hhbmdlZChpc0NoZWNrZWQoKSk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgdmFsdWVDaGFuZ2VkKGZpbmFsIGJvb2xlYW4gb24pIHsKLQkJCXNvcnRpbmdPbiA9IG9uOwotCQkJUERFUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJLnNldFZhbHVlKCJQREVNdWx0aVBhZ2VDb250ZW50T3V0bGluZS5Tb3J0aW5nQWN0aW9uLmlzQ2hlY2tlZCIsIG9uKTsgLy8kTk9OLU5MUy0xJAotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCB2YWx1ZUNoYW5nZWQoZmluYWwgYm9vbGVhbiBvbikgeworICAgICAgICAgICAgdGhpcy5zb3J0aW5nT24gPSBvbjsKKyAgICAgICAgICAgIFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoIlBERU11bHRpUGFnZUNvbnRlbnRPdXRsaW5lLlNvcnRpbmdBY3Rpb24uaXNDaGVja2VkIiwgb24pOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KIAotCX0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZWRpdG9yL1N0YXJ0dXBFZGl0b3JTZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZWRpdG9yL1N0YXJ0dXBFZGl0b3JTZWN0aW9uLmphdmEKaW5kZXggZmU2MDBmZS4uNGY1MWRiOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2VkaXRvci9TdGFydHVwRWRpdG9yU2VjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvU3RhcnR1cEVkaXRvclNlY3Rpb24uamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5lZGl0b3I7CiAKIGltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlRXZlbnQ7CkBAIC00MCwxNTIgKzQxLDE1NyBAQAogCiAvKioKICAqIHtAbGluayBTZXJ2ZXJFZGl0b3JTZWN0aW9ufSBzZWN0aW9uIHRoYXQgYWxsb3dzIHRvIGNvbmZpZ3VyZSBzb21lIHN0YXJ0dXAgcGFyYW1ldGVycwotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAYXV0aG9yIExlbyBEb3MgU2FudG9zCiAgKiBAc2luY2UgMS4wLjEKICAqLwogcHVibGljIGNsYXNzIFN0YXJ0dXBFZGl0b3JTZWN0aW9uIGV4dGVuZHMgU2VydmVyRWRpdG9yU2VjdGlvbiB7CiAKLQlwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldvcmtpbmdDb3B5OworICAgIHByb3RlY3RlZCBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyV29ya2luZ0NvcHk7CiAKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZzsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZzsKIAotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOworICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwogCi0JcHJpdmF0ZSBCdXR0b24gdGFpbExvZ0ZpbGVzOworICAgIHByaXZhdGUgQnV0dG9uIHRhaWxMb2dGaWxlczsKIAotCXByaXZhdGUgQnV0dG9uIGNsZWFuU3RhcnR1cDsKKyAgICBwcml2YXRlIEJ1dHRvbiBjbGVhblN0YXJ0dXA7CiAKLQlwcml2YXRlIFRleHQgbWF4UGVybVNpemVGaWVsZDsKKyAgICBwcml2YXRlIFRleHQgbWF4UGVybVNpemVGaWVsZDsKIAotCXByb3RlY3RlZCB2b2lkIGFkZENvbmZpZ3VyYXRpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAodXBkYXRpbmcpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJaWYgKElTZXJ2ZXIuUFJPUEVSVFlfVEFJTF9MT0dfRklMRVMuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQl0YWlsTG9nRmlsZXMuc2V0U2VsZWN0aW9uKEJvb2xlYW4udmFsdWVPZihldmVudC5nZXROZXdWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKLQkJCQl9IGVsc2UgaWYgKElTZXJ2ZXIuUFJPUEVSVFlfQ0xFQU5fU1RBUlRVUC5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQkJCWNsZWFuU3RhcnR1cC5zZXRTZWxlY3Rpb24oQm9vbGVhbi52YWx1ZU9mKGV2ZW50LmdldE5ld1ZhbHVlKCkudG9TdHJpbmcoKSkpOwotCQkJCX0gZWxzZSBpZiAoSVNlcnZlci5QUk9QRVJUWV9NQVhfUEVSTV9TSVpFLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJbWF4UGVybVNpemVGaWVsZC5zZXRUZXh0KGV2ZW50LmdldE5ld1ZhbHVlKCkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCXNlcnZlcldvcmtpbmdDb3B5LmFkZENvbmZpZ3VyYXRpb25DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIGFkZENvbmZpZ3VyYXRpb25DaGFuZ2VMaXN0ZW5lcigpIHsKKyAgICAgICAgdGhpcy5saXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IGdldEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOworICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworICAgICAgICAgICAgICAgIGlmIChTdGFydHVwRWRpdG9yU2VjdGlvbi50aGlzLnVwZGF0aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RhcnR1cEVkaXRvclNlY3Rpb24udGhpcy51cGRhdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKElTZXJ2ZXIuUFJPUEVSVFlfVEFJTF9MT0dfRklMRVMuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBTdGFydHVwRWRpdG9yU2VjdGlvbi50aGlzLnRhaWxMb2dGaWxlcy5zZXRTZWxlY3Rpb24oQm9vbGVhbi52YWx1ZU9mKGV2ZW50LmdldE5ld1ZhbHVlKCkudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNlcnZlci5QUk9QRVJUWV9DTEVBTl9TVEFSVFVQLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhcnR1cEVkaXRvclNlY3Rpb24udGhpcy5jbGVhblN0YXJ0dXAuc2V0U2VsZWN0aW9uKEJvb2xlYW4udmFsdWVPZihldmVudC5nZXROZXdWYWx1ZSgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElTZXJ2ZXIuUFJPUEVSVFlfTUFYX1BFUk1fU0laRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0YXJ0dXBFZGl0b3JTZWN0aW9uLnRoaXMubWF4UGVybVNpemVGaWVsZC5zZXRUZXh0KGV2ZW50LmdldE5ld1ZhbHVlKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0YXJ0dXBFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdGhpcy5zZXJ2ZXJXb3JraW5nQ29weS5hZGRDb25maWd1cmF0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5saXN0ZW5lcik7CisgICAgfQogCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuRVhQQU5ERUQKLQkJCQl8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IEV4cGFuZGFibGVDb21wb3NpdGUuRk9DVVNfVElUTEUpOwotCQlzZWN0aW9uLnNldFRleHQoIlNlcnZlciBTdGFydHVwIENvbmZpZ3VyYXRpb24iKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbigiU3BlY2lmeSBzdGFydHVwIG9wdGlvbnMuIENoYW5naW5nIGEgc2V0dGluZyByZXF1aXJlcyBhIHNlcnZlciByZXN0YXJ0LiIpOwotCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICAgICAgc3VwZXIuY3JlYXRlU2VjdGlvbihwYXJlbnQpOworICAgICAgICBGb3JtVG9vbGtpdCB0b29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7CiAKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKKyAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5FWFBBTkRFRCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSCisgICAgICAgICAgICB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKKyAgICAgICAgc2VjdGlvbi5zZXRUZXh0KCJTZXJ2ZXIgU3RhcnR1cCBDb25maWd1cmF0aW9uIik7CisgICAgICAgIHNlY3Rpb24uc2V0RGVzY3JpcHRpb24oIlNwZWNpZnkgc3RhcnR1cCBvcHRpb25zLiBDaGFuZ2luZyBhIHNldHRpbmcgcmVxdWlyZXMgYSBzZXJ2ZXIgcmVzdGFydC4iKTsKKyAgICAgICAgc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7CiAKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKKyAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOworICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisgICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKKyAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7CisgICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDEwOworICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKKyAgICAgICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTU7CisgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKyAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKKyAgICAgICAgdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKKyAgICAgICAgc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKIAotCQl0YWlsTG9nRmlsZXMgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICJUYWlsIGFwcGxpY2F0aW9uIHRyYWNlIGZpbGVzIGludG8gQ29uc29sZSB2aWV3IiwgU1dULkNIRUNLKTsKLQkJdGFpbExvZ0ZpbGVzLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhaWxMb2dGaWxlcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKyAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKIAotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IE1vZGlmeVRhaWxMb2dGaWxlc0NvbW1hbmQoc2VydmVyV29ya2luZ0NvcHksIHRhaWxMb2dGaWxlcy5nZXRTZWxlY3Rpb24oKSkpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOworICAgICAgICB0aGlzLnRhaWxMb2dGaWxlcyA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgIlRhaWwgYXBwbGljYXRpb24gdHJhY2UgZmlsZXMgaW50byBDb25zb2xlIHZpZXciLCBTV1QuQ0hFQ0spOworICAgICAgICB0aGlzLnRhaWxMb2dGaWxlcy5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICB0aGlzLnRhaWxMb2dGaWxlcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKIAotCQljbGVhblN0YXJ0dXAgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICJTdGFydCBzZXJ2ZXIgd2l0aCAtY2xlYW4gb3B0aW9uIiwgU1dULkNIRUNLKTsKLQkJY2xlYW5TdGFydHVwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNsZWFuU3RhcnR1cC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIGlmIChTdGFydHVwRWRpdG9yU2VjdGlvbi50aGlzLnVwZGF0aW5nKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RhcnR1cEVkaXRvclNlY3Rpb24udGhpcy51cGRhdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgZXhlY3V0ZShuZXcgTW9kaWZ5VGFpbExvZ0ZpbGVzQ29tbWFuZChTdGFydHVwRWRpdG9yU2VjdGlvbi50aGlzLnNlcnZlcldvcmtpbmdDb3B5LAorICAgICAgICAgICAgICAgICAgICBTdGFydHVwRWRpdG9yU2VjdGlvbi50aGlzLnRhaWxMb2dGaWxlcy5nZXRTZWxlY3Rpb24oKSkpOworICAgICAgICAgICAgICAgIFN0YXJ0dXBFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICh1cGRhdGluZykgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQlleGVjdXRlKG5ldyBNb2RpZnlDbGVhblN0YXJ0dXBDb21tYW5kKHNlcnZlcldvcmtpbmdDb3B5LCBjbGVhblN0YXJ0dXAuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJfQotCQl9KTsKKyAgICAgICAgdGhpcy5jbGVhblN0YXJ0dXAgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsICJTdGFydCBzZXJ2ZXIgd2l0aCAtY2xlYW4gb3B0aW9uIiwgU1dULkNIRUNLKTsKKyAgICAgICAgdGhpcy5jbGVhblN0YXJ0dXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgdGhpcy5jbGVhblN0YXJ0dXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CiAKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICAgICAgaWYgKFN0YXJ0dXBFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdGFydHVwRWRpdG9yU2VjdGlvbi50aGlzLnVwZGF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBleGVjdXRlKG5ldyBNb2RpZnlDbGVhblN0YXJ0dXBDb21tYW5kKFN0YXJ0dXBFZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyV29ya2luZ0NvcHksCisgICAgICAgICAgICAgICAgICAgIFN0YXJ0dXBFZGl0b3JTZWN0aW9uLnRoaXMuY2xlYW5TdGFydHVwLmdldFNlbGVjdGlvbigpKSk7CisgICAgICAgICAgICAgICAgU3RhcnR1cEVkaXRvclNlY3Rpb24udGhpcy51cGRhdGluZyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKIAotCQlMYWJlbCBtYXhQZXJtU2l6ZUxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChjb21wb3NpdGUsICItWFg6TWF4UGVybVNpemU9Iik7Ci0JCW1heFBlcm1TaXplTGFiZWwuc2V0Rm9yZWdyb3VuZCh0b29sa2l0LmdldENvbG9ycygpLmdldENvbG9yKElGb3JtQ29sb3JzLlRJVExFKSk7Ci0JCW1heFBlcm1TaXplRmllbGQgPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7Ci0JCW1heFBlcm1TaXplRmllbGQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbWF4UGVybVNpemVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAodXBkYXRpbmcpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgTW9kaWZ5TWF4UGVybVNpemVDb21tYW5kKHNlcnZlcldvcmtpbmdDb3B5LCBtYXhQZXJtU2l6ZUZpZWxkLmdldFRleHQoKSkpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOworICAgICAgICBkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7CiAKLQkJdG9vbGtpdC5jcmVhdGVMYWJlbChjb21wb3NpdGUsICIiKTsKKyAgICAgICAgTGFiZWwgbWF4UGVybVNpemVMYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiLVhYOk1heFBlcm1TaXplPSIpOworICAgICAgICBtYXhQZXJtU2l6ZUxhYmVsLnNldEZvcmVncm91bmQodG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRDb2xvcihJRm9ybUNvbG9ycy5USVRMRSkpOworICAgICAgICB0aGlzLm1heFBlcm1TaXplRmllbGQgPSB0b29sa2l0LmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7CisgICAgICAgIHRoaXMubWF4UGVybVNpemVGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICB0aGlzLm1heFBlcm1TaXplRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewogCi0JCWluaXRpYWxpemUoKTsKLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoU3RhcnR1cEVkaXRvclNlY3Rpb24udGhpcy51cGRhdGluZykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0YXJ0dXBFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGV4ZWN1dGUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBNb2RpZnlNYXhQZXJtU2l6ZUNvbW1hbmQoU3RhcnR1cEVkaXRvclNlY3Rpb24udGhpcy5zZXJ2ZXJXb3JraW5nQ29weSwgU3RhcnR1cEVkaXRvclNlY3Rpb24udGhpcy5tYXhQZXJtU2l6ZUZpZWxkLmdldFRleHQoKSkpOworICAgICAgICAgICAgICAgIFN0YXJ0dXBFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQkvKioKLQkgKiBAc2VlIFNlcnZlckVkaXRvclNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHNlcnZlciAhPSBudWxsKSB7Ci0JCQlzZXJ2ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9CisgICAgICAgIHRvb2xraXQuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiIik7CiAKLQkvKioKLQkgKiBAc2VlIFNlcnZlckVkaXRvclNlY3Rpb24jaW5pdChJRWRpdG9yU2l0ZSwgSUVkaXRvcklucHV0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlzZXJ2ZXJXb3JraW5nQ29weSA9IChJU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlci5sb2FkQWRhcHRlcihJU2VydmVyV29ya2luZ0NvcHkuY2xhc3MsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhZGRDb25maWd1cmF0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQl9CisgICAgICAgIGluaXRpYWxpemUoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBmaWVsZHMgaW4gdGhpcyBlZGl0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdXBkYXRpbmcgPSB0cnVlOwotCQl0aGlzLnRhaWxMb2dGaWxlcy5zZXRTZWxlY3Rpb24oc2VydmVyV29ya2luZ0NvcHkuc2hvdWxkVGFpbFRyYWNlRmlsZXMoKSk7Ci0JCXRoaXMuY2xlYW5TdGFydHVwLnNldFNlbGVjdGlvbihzZXJ2ZXJXb3JraW5nQ29weS5zaG91bGRDbGVhblN0YXJ0dXAoKSk7Ci0JCXRoaXMubWF4UGVybVNpemVGaWVsZC5zZXRUZXh0KHNlcnZlcldvcmtpbmdDb3B5LmdldE1heFBlcm1TaXplKCkpOwotCQl1cGRhdGluZyA9IGZhbHNlOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIFNlcnZlckVkaXRvclNlY3Rpb24jZGlzcG9zZSgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgaWYgKHRoaXMuc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcy5saXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIFNlcnZlckVkaXRvclNlY3Rpb24jaW5pdChJRWRpdG9yU2l0ZSwgSUVkaXRvcklucHV0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7CisgICAgICAgIHN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOworICAgICAgICB0aGlzLnNlcnZlcldvcmtpbmdDb3B5ID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgdGhpcy5zZXJ2ZXIubG9hZEFkYXB0ZXIoSVNlcnZlcldvcmtpbmdDb3B5LmNsYXNzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKyAgICAgICAgYWRkQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgZmllbGRzIGluIHRoaXMgZWRpdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIHRoaXMudXBkYXRpbmcgPSB0cnVlOworICAgICAgICB0aGlzLnRhaWxMb2dGaWxlcy5zZXRTZWxlY3Rpb24odGhpcy5zZXJ2ZXJXb3JraW5nQ29weS5zaG91bGRUYWlsVHJhY2VGaWxlcygpKTsKKyAgICAgICAgdGhpcy5jbGVhblN0YXJ0dXAuc2V0U2VsZWN0aW9uKHRoaXMuc2VydmVyV29ya2luZ0NvcHkuc2hvdWxkQ2xlYW5TdGFydHVwKCkpOworICAgICAgICB0aGlzLm1heFBlcm1TaXplRmllbGQuc2V0VGV4dCh0aGlzLnNlcnZlcldvcmtpbmdDb3B5LmdldE1heFBlcm1TaXplKCkpOworICAgICAgICB0aGlzLnVwZGF0aW5nID0gZmFsc2U7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZWRpdG9yL1N0YXRpY1Jlc291cmNlc0VkaXRvclNlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi5qYXZhCmluZGV4IGRkNDUyMzguLjdiY2ZjMDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLmVkaXRvcjsKIAogaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKQEAgLTE4LDcgKzE5LDYgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSUlucHV0VmFsaWRhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSW5wdXREaWFsb2c7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CkBAIC01NSwzMDAgKzU2LDMxNSBAQAogCiAvKioKICAqIHtAbGluayBTZXJ2ZXJFZGl0b3JTZWN0aW9ufSBzZWN0aW9uIHRoYXQgYWxsb3dzIHRvIGNvbmZpZ3VyZSB0aGUgSk1YIGRlcGxveWVyIGNyZWRlbnRpYWxzCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBhdXRob3IgU3RlZmZlbiBQaW5nZWwKICAqIEBzaW5jZSAxLjEuMwogICovCiBwdWJsaWMgY2xhc3MgU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbiBleHRlbmRzIFNlcnZlckVkaXRvclNlY3Rpb24gewogCi0JcHJvdGVjdGVkIElTZXJ2ZXJXb3JraW5nQ29weSBzZXJ2ZXJXb3JraW5nQ29weTsKKyAgICBwcm90ZWN0ZWQgSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlcldvcmtpbmdDb3B5OwogCi0JcHJpdmF0ZSBUYWJsZSBmaWxlbmFtZVRhYmxlOworICAgIHByaXZhdGUgVGFibGUgZmlsZW5hbWVUYWJsZTsKIAotCXByaXZhdGUgVGFibGVWaWV3ZXIgZmlsZW5hbWVzVGFibGVWaWV3ZXI7CisgICAgcHJpdmF0ZSBUYWJsZVZpZXdlciBmaWxlbmFtZXNUYWJsZVZpZXdlcjsKIAotCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKKyAgICBwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247CiAKLQlwcml2YXRlIEJ1dHRvbiBkZWxldGVCdXR0b247CisgICAgcHJpdmF0ZSBCdXR0b24gZGVsZXRlQnV0dG9uOwogCi0JcHJpdmF0ZSBCdXR0b24gdXBCdXR0b247CisgICAgcHJpdmF0ZSBCdXR0b24gdXBCdXR0b247CiAKLQlwcml2YXRlIEJ1dHRvbiBkb3duQnV0dG9uOworICAgIHByaXZhdGUgQnV0dG9uIGRvd25CdXR0b247CiAKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZzsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGluZzsKIAotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOworICAgIHByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwogCi0JcHJpdmF0ZSBTdGF0aWNGaWxlbmFtZXNDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOworICAgIHByaXZhdGUgU3RhdGljRmlsZW5hbWVzQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKIAotCXByb3RlY3RlZCB2b2lkIGFkZENvbmZpZ3VyYXRpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJbGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoSVNlcnZlcldvcmtpbmdDb3B5LlBST1BFUlRZX1NUQVRJQ19GSUxFTkFNRVMuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlmaWxlbmFtZXNUYWJsZVZpZXdlci5zZXRJbnB1dChzZXJ2ZXIpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJc2VydmVyV29ya2luZ0NvcHkuYWRkQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKCkgeworICAgICAgICB0aGlzLmxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7CiAKLQlwdWJsaWMgdm9pZCBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlU2VjdGlvbihwYXJlbnQpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gZ2V0Rm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgaWYgKG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUuSVNlcnZlci5QUk9QRVJUWV9TVEFUSUNfRklMRU5BTUVTLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi50aGlzLmZpbGVuYW1lc1RhYmxlVmlld2VyLnNldElucHV0KFN0YXRpY1Jlc291cmNlc0VkaXRvclNlY3Rpb24udGhpcy5zZXJ2ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdGhpcy5zZXJ2ZXJXb3JraW5nQ29weS5hZGRDb25maWd1cmF0aW9uQ2hhbmdlTGlzdGVuZXIodGhpcy5saXN0ZW5lcik7CisgICAgfQogCi0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIEV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRSB8IEV4cGFuZGFibGVDb21wb3NpdGUuRVhQQU5ERUQKLQkJCQl8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IEV4cGFuZGFibGVDb21wb3NpdGUuRk9DVVNfVElUTEUpOwotCQlzZWN0aW9uLnNldFRleHQoIlJlZGVwbG95IEJlaGF2aW9yIik7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oIkNvbmZpZ3VyZSBzZXJ2ZXIgcmVkZXBsb3kgYW5kIHJlZnJlc2ggYmVoYXZpb3Igb24gY2hhbmdlcyB0byBwcm9qZWN0IHJlc291cmNlcy5cblxuRGVmaW5lIHBhdHRlcm5zIGZvciBmaWxlcyB0aGF0IHNob3VsZCBiZSBjb3BpZWQgaW50byB0aGUgc2VydmVyIHdpdGhvdXQgcmVkZXBsb3lpbmcgdGhlIGJ1bmRsZSBvciBhcHBsaWNhdGlvbi4gU3ByaW5nIFhNTCBjb25maWd1cmF0aW9uIGZpbGVzIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4iKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIHN1cGVyLmNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKKyAgICAgICAgRm9ybVRvb2xraXQgdG9vbGtpdCA9IGdldEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwogCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gNTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMTA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKKyAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5FWFBBTkRFRCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSCisgICAgICAgICAgICB8IFNlY3Rpb24uREVTQ1JJUFRJT04gfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkZPQ1VTX1RJVExFKTsKKyAgICAgICAgc2VjdGlvbi5zZXRUZXh0KCJSZWRlcGxveSBCZWhhdmlvciIpOworICAgICAgICBzZWN0aW9uLnNldERlc2NyaXB0aW9uKAorICAgICAgICAgICAgIkNvbmZpZ3VyZSBzZXJ2ZXIgcmVkZXBsb3kgYW5kIHJlZnJlc2ggYmVoYXZpb3Igb24gY2hhbmdlcyB0byBwcm9qZWN0IHJlc291cmNlcy5cblxuRGVmaW5lIHBhdHRlcm5zIGZvciBmaWxlcyB0aGF0IHNob3VsZCBiZSBjb3BpZWQgaW50byB0aGUgc2VydmVyIHdpdGhvdXQgcmVkZXBsb3lpbmcgdGhlIGJ1bmRsZSBvciBhcHBsaWNhdGlvbi4gU3ByaW5nIFhNTCBjb25maWd1cmF0aW9uIGZpbGVzIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4iKTsKKyAgICAgICAgc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMKSk7CiAKLQkJZmlsZW5hbWVUYWJsZSA9IHRvb2xraXQuY3JlYXRlVGFibGUoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULlZfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhlaWdodEhpbnQgPSAxMzA7Ci0JCWZpbGVuYW1lVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZmlsZW5hbWVzVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoZmlsZW5hbWVUYWJsZSk7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBTdGF0aWNGaWxlbmFtZXNDb250ZW50UHJvdmlkZXIoKTsKLQkJZmlsZW5hbWVzVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCWZpbGVuYW1lc1RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEZpbGVuYW1lTGFiZWxQcm92aWRlcigpKTsKKyAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOworICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisgICAgICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsKKyAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDU7CisgICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDE7CisgICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OworICAgICAgICBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxMDsKKyAgICAgICAgY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOworICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOworICAgICAgICB0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOworICAgICAgICBzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwogCi0JCWZpbGVuYW1lc1RhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlkZWxldGVCdXR0b24uc2V0RW5hYmxlZChvYmogIT0gbnVsbCk7Ci0JCQkJdXBkYXRlQnV0dG9ucyhvYmopOwotCQkJfQotCQl9KTsKKyAgICAgICAgdGhpcy5maWxlbmFtZVRhYmxlID0gdG9vbGtpdC5jcmVhdGVUYWJsZShjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOworICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7CisgICAgICAgIGRhdGEuaGVpZ2h0SGludCA9IDEzMDsKKyAgICAgICAgdGhpcy5maWxlbmFtZVRhYmxlLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIHRoaXMuZmlsZW5hbWVzVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGhpcy5maWxlbmFtZVRhYmxlKTsKKyAgICAgICAgdGhpcy5jb250ZW50UHJvdmlkZXIgPSBuZXcgU3RhdGljRmlsZW5hbWVzQ29udGVudFByb3ZpZGVyKCk7CisgICAgICAgIHRoaXMuZmlsZW5hbWVzVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHRoaXMuY29udGVudFByb3ZpZGVyKTsKKyAgICAgICAgdGhpcy5maWxlbmFtZXNUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBGaWxlbmFtZUxhYmVsUHJvdmlkZXIoKSk7CiAKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgYnV0dG9uTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0JCWJ1dHRvbkxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWJ1dHRvbkxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkxheW91dCk7Ci0JCUdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5hcHBseVRvKGJ1dHRvbkNvbXBvc2l0ZSk7CisgICAgICAgIHRoaXMuZmlsZW5hbWVzVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewogCi0JCWFkZEJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgIkFkZCIsIFNXVC5QVVNIKTsKLQkJR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmFwcGx5VG8oYWRkQnV0dG9uKTsKLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKHVwZGF0aW5nKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgeworICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi50aGlzLmRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKG9iaiAhPSBudWxsKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVCdXR0b25zKG9iaik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCQkJSW5wdXREaWFsb2cgZGlhbG9nID0gbmV3IElucHV0RGlhbG9nKAotCQkJCQkJZ2V0U2hlbGwoKSwKLQkJCQkJCSJOZXcgZmlsZW5hbWUgcGF0dGVybiIsCi0JCQkJCQkiRW50ZXIgYSBuZXcgZmlsZW5hbWUgcGF0dGVybiBmb3Igc3RhdGljIHJlc291cmNlcyAod2lsZGNhcmRzIHN1Y2ggYXMgJyonIGFuZCAnPycgYXJlIHN1cHBvcnRlZCk6IiwKLQkJCQkJCSIiLCBuZXcgSUlucHV0VmFsaWRhdG9yKCkgeworICAgICAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKKyAgICAgICAgR3JpZExheW91dCBidXR0b25MYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKKyAgICAgICAgYnV0dG9uTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKKyAgICAgICAgYnV0dG9uTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisgICAgICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uTGF5b3V0KTsKKyAgICAgICAgR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmFwcGx5VG8oYnV0dG9uQ29tcG9zaXRlKTsKIAotCQkJCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQkJCQlpZiAoIVN0cmluZ1V0aWxzLmlzTm90QmxhbmsobmV3VGV4dCkpIHsKLQkJCQkJCQkJCXJldHVybiAiUGF0dGVybiBjYW4ndCBiZSBlbXB0eSI7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gRGlhbG9nLk9LKSB7Ci0JCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJTGlzdDxPYmplY3Q+IGZpbGVuYW1lcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihBcnJheXMuYXNMaXN0KGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhzZXJ2ZXIpKSk7Ci0JCQkJCWZpbGVuYW1lcy5hZGQoZGlhbG9nLmdldFZhbHVlKCkpOwotCQkJCQlleGVjdXRlKG5ldyBNb2RpZnlTdGF0aWNSZXNvdXJjZXNDb21tYW5kKHNlcnZlcldvcmtpbmdDb3B5LCBTdHJpbmdVdGlscy5qb2luKGZpbGVuYW1lcywgIiwiKSkpOwotCQkJCQlmaWxlbmFtZXNUYWJsZVZpZXdlci5zZXRJbnB1dChzZXJ2ZXIpOwotCQkJCQlmaWxlbmFtZXNUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGlhbG9nLmdldFZhbHVlKCkpKTsKLQkJCQkJLy8gdXBkYXRlIGJ1dHRvbnMKLQkJCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOworICAgICAgICB0aGlzLmFkZEJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgIkFkZCIsIFNXVC5QVVNIKTsKKyAgICAgICAgR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmFwcGx5VG8odGhpcy5hZGRCdXR0b24pOworICAgICAgICB0aGlzLmFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKIAotCQlkZWxldGVCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsICJEZWxldGUiLCBTV1QuUFVTSCk7Ci0JCUdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5hcHBseVRvKGRlbGV0ZUJ1dHRvbik7Ci0JCWRlbGV0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU9iamVjdCBzZWxlY3RlZEFydGVmYWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZmlsZW5hbWVzVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmICh1cGRhdGluZykgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXVwZGF0aW5nID0gdHJ1ZTsKLQkJCQlMaXN0PE9iamVjdD4gZmlsZW5hbWVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KEFycmF5cy5hc0xpc3QoY29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKHNlcnZlcikpKTsKLQkJCQlmaWxlbmFtZXMucmVtb3ZlKHNlbGVjdGVkQXJ0ZWZhY3QpOwotCQkJCWV4ZWN1dGUobmV3IE1vZGlmeVN0YXRpY1Jlc291cmNlc0NvbW1hbmQoc2VydmVyV29ya2luZ0NvcHksIFN0cmluZ1V0aWxzLmpvaW4oZmlsZW5hbWVzLCAiLCIpKSk7Ci0JCQkJZmlsZW5hbWVzVGFibGVWaWV3ZXIuc2V0SW5wdXQoc2VydmVyKTsKLQkJCQkvLyB1cGRhdGUgYnV0dG9ucwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICAgICAgaWYgKFN0YXRpY1Jlc291cmNlc0VkaXRvclNlY3Rpb24udGhpcy51cGRhdGluZykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogCi0JCXVwQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiVXAiLCBTV1QuUFVTSCk7Ci0JCUdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5hcHBseVRvKHVwQnV0dG9uKTsKLQkJdXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRBcnRlZmFjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZpbGVuYW1lc1RhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlMaXN0PE9iamVjdD4gbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCW1vZHVsZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKHNlcnZlcikpKTsKLQkJCQlpbnQgaW5kZXggPSBtb2R1bGVzLmluZGV4T2Yoc2VsZWN0ZWRBcnRlZmFjdCk7Ci0JCQkJbW9kdWxlcy5yZW1vdmUoc2VsZWN0ZWRBcnRlZmFjdCk7Ci0JCQkJbW9kdWxlcy5hZGQoaW5kZXggLSAxLCBzZWxlY3RlZEFydGVmYWN0KTsKLQkJCQlpZiAodXBkYXRpbmcpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgTW9kaWZ5U3RhdGljUmVzb3VyY2VzQ29tbWFuZChzZXJ2ZXJXb3JraW5nQ29weSwgU3RyaW5nVXRpbHMuam9pbihtb2R1bGVzLCAiLCIpKSk7Ci0JCQkJZmlsZW5hbWVzVGFibGVWaWV3ZXIuc2V0SW5wdXQoc2VydmVyKTsKLQkJCQl1cGRhdGVCdXR0b25zKHNlbGVjdGVkQXJ0ZWZhY3QpOwotCQkJCXVwZGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOworICAgICAgICAgICAgICAgIElucHV0RGlhbG9nIGRpYWxvZyA9IG5ldyBJbnB1dERpYWxvZyhnZXRTaGVsbCgpLCAiTmV3IGZpbGVuYW1lIHBhdHRlcm4iLAorICAgICAgICAgICAgICAgICAgICAiRW50ZXIgYSBuZXcgZmlsZW5hbWUgcGF0dGVybiBmb3Igc3RhdGljIHJlc291cmNlcyAod2lsZGNhcmRzIHN1Y2ggYXMgJyonIGFuZCAnPycgYXJlIHN1cHBvcnRlZCk6IiwgIiIsIG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7CiAKLQkJZG93bkJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgIkRvd24iLCBTV1QuUFVTSCk7Ci0JCUdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5hcHBseVRvKGRvd25CdXR0b24pOwotCQlkb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkQXJ0ZWZhY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmaWxlbmFtZXNUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJTGlzdDxPYmplY3Q+IG1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQltb2R1bGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhzZXJ2ZXIpKSk7Ci0JCQkJaW50IGluZGV4ID0gbW9kdWxlcy5pbmRleE9mKHNlbGVjdGVkQXJ0ZWZhY3QpOwotCQkJCW1vZHVsZXMucmVtb3ZlKHNlbGVjdGVkQXJ0ZWZhY3QpOwotCQkJCW1vZHVsZXMuYWRkKGluZGV4ICsgMSwgc2VsZWN0ZWRBcnRlZmFjdCk7Ci0JCQkJaWYgKHVwZGF0aW5nKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJdXBkYXRpbmcgPSB0cnVlOwotCQkJCWV4ZWN1dGUobmV3IE1vZGlmeVN0YXRpY1Jlc291cmNlc0NvbW1hbmQoc2VydmVyV29ya2luZ0NvcHksIFN0cmluZ1V0aWxzLmpvaW4obW9kdWxlcywgIiwiKSkpOwotCQkJCWZpbGVuYW1lc1RhYmxlVmlld2VyLnNldElucHV0KHNlcnZlcik7Ci0JCQkJdXBkYXRlQnV0dG9ucyhzZWxlY3RlZEFydGVmYWN0KTsKLQkJCQl1cGRhdGluZyA9IGZhbHNlOwotCQkJfQotCQl9KTsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzTm90QmxhbmsobmV3VGV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhdHRlcm4gY2FuJ3QgYmUgZW1wdHkiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKKyAgICAgICAgICAgICAgICAgICAgU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi50aGlzLnVwZGF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGZpbGVuYW1lcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi50aGlzLmNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyKSkpOworICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZXMuYWRkKGRpYWxvZy5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZShuZXcgTW9kaWZ5U3RhdGljUmVzb3VyY2VzQ29tbWFuZChTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyV29ya2luZ0NvcHksIFN0cmluZ1V0aWxzLmpvaW4oZmlsZW5hbWVzLCAiLCIpKSk7CisgICAgICAgICAgICAgICAgICAgIFN0YXRpY1Jlc291cmNlc0VkaXRvclNlY3Rpb24udGhpcy5maWxlbmFtZXNUYWJsZVZpZXdlci5zZXRJbnB1dChTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi50aGlzLmZpbGVuYW1lc1RhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihkaWFsb2cuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYnV0dG9ucworICAgICAgICAgICAgICAgICAgICBTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCUZvcm1UZXh0IHJlc3RvcmVEZWZhdWx0ID0gdG9vbGtpdC5jcmVhdGVGb3JtVGV4dChjb21wb3NpdGUsIHRydWUpOwotCQlyZXN0b3JlRGVmYXVsdC5zZXRUZXh0KCI8Zm9ybT48cD48YSBocmVmPVwiZXhwb3J0YnVuZGxlXCI+UmVzdG9yZSBkZWZhdWx0PC9hPiBmaWxlbmFtZSBwYXR0ZXJuPC9wPjwvZm9ybT4iLAotCQkJCXRydWUsIGZhbHNlKTsKLQkJcmVzdG9yZURlZmF1bHQuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl1cGRhdGluZyA9IHRydWU7Ci0JCQkJZXhlY3V0ZShuZXcgTW9kaWZ5U3RhdGljUmVzb3VyY2VzQ29tbWFuZChzZXJ2ZXJXb3JraW5nQ29weSwgSVNlcnZlcldvcmtpbmdDb3B5LkRFRkFVTFRfU1RBVElDX0ZJTEVOQU1FUykpOwotCQkJCWZpbGVuYW1lc1RhYmxlVmlld2VyLnNldElucHV0KHNlcnZlcik7Ci0JCQkJdXBkYXRpbmcgPSBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JCXVwZGF0ZUVuYWJsZW1lbnQoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KKyAgICAgICAgdGhpcy5kZWxldGVCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsICJEZWxldGUiLCBTV1QuUFVTSCk7CisgICAgICAgIEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5hcHBseVRvKHRoaXMuZGVsZXRlQnV0dG9uKTsKKyAgICAgICAgdGhpcy5kZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CiAKLQlwcml2YXRlIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmaWxlbmFtZXNUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkQXJ0ZWZhY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCXVwZGF0ZUJ1dHRvbnMoc2VsZWN0ZWRBcnRlZmFjdCk7Ci0JfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGVkQXJ0ZWZhY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMuZmlsZW5hbWVzVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGlmIChTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiBmaWxlbmFtZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi50aGlzLmNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyKSkpOworICAgICAgICAgICAgICAgIGZpbGVuYW1lcy5yZW1vdmUoc2VsZWN0ZWRBcnRlZmFjdCk7CisgICAgICAgICAgICAgICAgZXhlY3V0ZShuZXcgTW9kaWZ5U3RhdGljUmVzb3VyY2VzQ29tbWFuZChTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyV29ya2luZ0NvcHksIFN0cmluZ1V0aWxzLmpvaW4oZmlsZW5hbWVzLCAiLCIpKSk7CisgICAgICAgICAgICAgICAgU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi50aGlzLmZpbGVuYW1lc1RhYmxlVmlld2VyLnNldElucHV0KFN0YXRpY1Jlc291cmNlc0VkaXRvclNlY3Rpb24udGhpcy5zZXJ2ZXIpOworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBidXR0b25zCisgICAgICAgICAgICAgICAgU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi50aGlzLnVwZGF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1dHRvbnMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlMaXN0PE9iamVjdD4gbW9kdWxlcyA9IEFycmF5cy5hc0xpc3QoY29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKHNlcnZlcikpOwotCQkJaW50IGluZGV4ID0gbW9kdWxlcy5pbmRleE9mKG9iaik7Ci0JCQl1cEJ1dHRvbi5zZXRFbmFibGVkKGluZGV4ID4gMCk7Ci0JCQlkb3duQnV0dG9uLnNldEVuYWJsZWQoaW5kZXggPCBtb2R1bGVzLnNpemUoKSAtIDEpOwotCQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl1cEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWRvd25CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlkZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9CisgICAgICAgIHRoaXMudXBCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsICJVcCIsIFNXVC5QVVNIKTsKKyAgICAgICAgR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmFwcGx5VG8odGhpcy51cEJ1dHRvbik7CisgICAgICAgIHRoaXMudXBCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CiAKLQlwcml2YXRlIHZvaWQgdXBkYXRlRW5hYmxlbWVudCgpIHsKLQkJYWRkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBPYmplY3Qgc2VsZWN0ZWRBcnRlZmFjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIFN0YXRpY1Jlc291cmNlc0VkaXRvclNlY3Rpb24udGhpcy5maWxlbmFtZXNUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgTGlzdDxPYmplY3Q+IG1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgICAgICAgICBtb2R1bGVzLmFkZEFsbCgKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMuY29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKFN0YXRpY1Jlc291cmNlc0VkaXRvclNlY3Rpb24udGhpcy5zZXJ2ZXIpKSk7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gbW9kdWxlcy5pbmRleE9mKHNlbGVjdGVkQXJ0ZWZhY3QpOworICAgICAgICAgICAgICAgIG1vZHVsZXMucmVtb3ZlKHNlbGVjdGVkQXJ0ZWZhY3QpOworICAgICAgICAgICAgICAgIG1vZHVsZXMuYWRkKGluZGV4IC0gMSwgc2VsZWN0ZWRBcnRlZmFjdCk7CisgICAgICAgICAgICAgICAgaWYgKFN0YXRpY1Jlc291cmNlc0VkaXRvclNlY3Rpb24udGhpcy51cGRhdGluZykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN0YXRpY1Jlc291cmNlc0VkaXRvclNlY3Rpb24udGhpcy51cGRhdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgZXhlY3V0ZShuZXcgTW9kaWZ5U3RhdGljUmVzb3VyY2VzQ29tbWFuZChTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyV29ya2luZ0NvcHksIFN0cmluZ1V0aWxzLmpvaW4obW9kdWxlcywgIiwiKSkpOworICAgICAgICAgICAgICAgIFN0YXRpY1Jlc291cmNlc0VkaXRvclNlY3Rpb24udGhpcy5maWxlbmFtZXNUYWJsZVZpZXdlci5zZXRJbnB1dChTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVCdXR0b25zKHNlbGVjdGVkQXJ0ZWZhY3QpOworICAgICAgICAgICAgICAgIFN0YXRpY1Jlc291cmNlc0VkaXRvclNlY3Rpb24udGhpcy51cGRhdGluZyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKIAotCS8qKgotCSAqIEBzZWUgU2VydmVyRWRpdG9yU2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoc2VydmVyICE9IG51bGwpIHsKLQkJCXNlcnZlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KKyAgICAgICAgdGhpcy5kb3duQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiRG93biIsIFNXVC5QVVNIKTsKKyAgICAgICAgR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmFwcGx5VG8odGhpcy5kb3duQnV0dG9uKTsKKyAgICAgICAgdGhpcy5kb3duQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewogCi0JLyoqCi0JICogQHNlZSBTZXJ2ZXJFZGl0b3JTZWN0aW9uI2luaXQoSUVkaXRvclNpdGUsIElFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJc2VydmVyV29ya2luZ0NvcHkgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXIubG9hZEFkYXB0ZXIoSVNlcnZlcldvcmtpbmdDb3B5LmNsYXNzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYWRkQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IHNlbGVjdGVkQXJ0ZWZhY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMuZmlsZW5hbWVzVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiBtb2R1bGVzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgICAgICAgICAgICAgbW9kdWxlcy5hZGRBbGwoCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi50aGlzLmNvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyKSkpOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IG1vZHVsZXMuaW5kZXhPZihzZWxlY3RlZEFydGVmYWN0KTsKKyAgICAgICAgICAgICAgICBtb2R1bGVzLnJlbW92ZShzZWxlY3RlZEFydGVmYWN0KTsKKyAgICAgICAgICAgICAgICBtb2R1bGVzLmFkZChpbmRleCArIDEsIHNlbGVjdGVkQXJ0ZWZhY3QpOworICAgICAgICAgICAgICAgIGlmIChTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGV4ZWN1dGUobmV3IE1vZGlmeVN0YXRpY1Jlc291cmNlc0NvbW1hbmQoU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi50aGlzLnNlcnZlcldvcmtpbmdDb3B5LCBTdHJpbmdVdGlscy5qb2luKG1vZHVsZXMsICIsIikpKTsKKyAgICAgICAgICAgICAgICBTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMuZmlsZW5hbWVzVGFibGVWaWV3ZXIuc2V0SW5wdXQoU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi50aGlzLnNlcnZlcik7CisgICAgICAgICAgICAgICAgdXBkYXRlQnV0dG9ucyhzZWxlY3RlZEFydGVmYWN0KTsKKyAgICAgICAgICAgICAgICBTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBmaWVsZHMgaW4gdGhpcyBlZGl0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdXBkYXRpbmcgPSB0cnVlOwotCQlmaWxlbmFtZXNUYWJsZVZpZXdlci5zZXRJbnB1dChzZXJ2ZXIpOwotCQlkZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXVwZGF0aW5nID0gZmFsc2U7Ci0JfQorICAgICAgICBGb3JtVGV4dCByZXN0b3JlRGVmYXVsdCA9IHRvb2xraXQuY3JlYXRlRm9ybVRleHQoY29tcG9zaXRlLCB0cnVlKTsKKyAgICAgICAgcmVzdG9yZURlZmF1bHQuc2V0VGV4dCgiPGZvcm0+PHA+PGEgaHJlZj1cImV4cG9ydGJ1bmRsZVwiPlJlc3RvcmUgZGVmYXVsdDwvYT4gZmlsZW5hbWUgcGF0dGVybjwvcD48L2Zvcm0+IiwgdHJ1ZSwgZmFsc2UpOworICAgICAgICByZXN0b3JlRGVmYXVsdC5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKIAotCWNsYXNzIFN0YXRpY0ZpbGVuYW1lc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7CisgICAgICAgICAgICAgICAgU3RhdGljUmVzb3VyY2VzRWRpdG9yU2VjdGlvbi50aGlzLnVwZGF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBleGVjdXRlKG5ldyBNb2RpZnlTdGF0aWNSZXNvdXJjZXNDb21tYW5kKFN0YXRpY1Jlc291cmNlc0VkaXRvclNlY3Rpb24udGhpcy5zZXJ2ZXJXb3JraW5nQ29weSwKKyAgICAgICAgICAgICAgICAgICAgSVNlcnZlcldvcmtpbmdDb3B5LkRFRkFVTFRfU1RBVElDX0ZJTEVOQU1FUykpOworICAgICAgICAgICAgICAgIFN0YXRpY1Jlc291cmNlc0VkaXRvclNlY3Rpb24udGhpcy5maWxlbmFtZXNUYWJsZVZpZXdlci5zZXRJbnB1dChTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMuc2VydmVyKTsKKyAgICAgICAgICAgICAgICBTdGF0aWNSZXNvdXJjZXNFZGl0b3JTZWN0aW9uLnRoaXMudXBkYXRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHVwZGF0ZUVuYWJsZW1lbnQoKTsKKyAgICAgICAgaW5pdGlhbGl6ZSgpOworICAgIH0KIAotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9CisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7CisgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5maWxlbmFtZXNUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgT2JqZWN0IHNlbGVjdGVkQXJ0ZWZhY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7CisgICAgICAgIHVwZGF0ZUJ1dHRvbnMoc2VsZWN0ZWRBcnRlZmFjdCk7CisgICAgfQogCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVCdXR0b25zKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgTGlzdDxPYmplY3Q+IG1vZHVsZXMgPSBBcnJheXMuYXNMaXN0KHRoaXMuY29udGVudFByb3ZpZGVyLmdldEVsZW1lbnRzKHRoaXMuc2VydmVyKSk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBtb2R1bGVzLmluZGV4T2Yob2JqKTsKKyAgICAgICAgICAgIHRoaXMudXBCdXR0b24uc2V0RW5hYmxlZChpbmRleCA+IDApOworICAgICAgICAgICAgdGhpcy5kb3duQnV0dG9uLnNldEVuYWJsZWQoaW5kZXggPCBtb2R1bGVzLnNpemUoKSAtIDEpOworICAgICAgICAgICAgdGhpcy5kZWxldGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMudXBCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICB0aGlzLmRvd25CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICB0aGlzLmRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KIAotCQl9CisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUVuYWJsZW1lbnQoKSB7CisgICAgICAgIHRoaXMuYWRkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgIHVwZGF0ZUJ1dHRvbnMoKTsKKyAgICB9CiAKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgaW5wdXRFbGVtZW50OwotCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSBkbVNlcnZlciA9IChJU2VydmVyV29ya2luZ0NvcHkpIHNlcnZlci5sb2FkQWRhcHRlcihJU2VydmVyV29ya2luZ0NvcHkuY2xhc3MsIG51bGwpOwotCQkJCVN0cmluZ1tdIGZpbGVuYW1lcyA9IFN0cmluZ1V0aWxzLnNwbGl0KGRtU2VydmVyLmdldFN0YXRpY0ZpbGVuYW1lUGF0dGVybnMoKSwgIiwiKTsKLQkJCQlyZXR1cm4gZmlsZW5hbWVzOworICAgIC8qKgorICAgICAqIEBzZWUgU2VydmVyRWRpdG9yU2VjdGlvbiNkaXNwb3NlKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICBpZiAodGhpcy5zZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5zZXJ2ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzLmxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KIAotCQkJfQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIFNlcnZlckVkaXRvclNlY3Rpb24jaW5pdChJRWRpdG9yU2l0ZSwgSUVkaXRvcklucHV0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7CisgICAgICAgIHN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOworICAgICAgICB0aGlzLnNlcnZlcldvcmtpbmdDb3B5ID0gKElTZXJ2ZXJXb3JraW5nQ29weSkgdGhpcy5zZXJ2ZXIubG9hZEFkYXB0ZXIoSVNlcnZlcldvcmtpbmdDb3B5LmNsYXNzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKyAgICAgICAgYWRkQ29uZmlndXJhdGlvbkNoYW5nZUxpc3RlbmVyKCk7CisgICAgfQogCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJcmV0dXJuIGdldEVsZW1lbnRzKHBhcmVudEVsZW1lbnQpOwotCQl9CisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgZmllbGRzIGluIHRoaXMgZWRpdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIHRoaXMudXBkYXRpbmcgPSB0cnVlOworICAgICAgICB0aGlzLmZpbGVuYW1lc1RhYmxlVmlld2VyLnNldElucHV0KHRoaXMuc2VydmVyKTsKKyAgICAgICAgdGhpcy5kZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIHRoaXMudXBkYXRpbmcgPSBmYWxzZTsKKyAgICB9CiAKLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CisgICAgY2xhc3MgU3RhdGljRmlsZW5hbWVzQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewogCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICB9CiAKLQl9CisgICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewogCi0JY2xhc3MgRmlsZW5hbWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBTZXJ2ZXJVaUltYWdlcy5nZXRJbWFnZShTZXJ2ZXJVaUltYWdlcy5JTUdfT0JKX0ZJTEUpOwotCQl9CisgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CisgICAgICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgeworICAgICAgICAgICAgICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGlucHV0RWxlbWVudDsKKyAgICAgICAgICAgICAgICBJU2VydmVyV29ya2luZ0NvcHkgZG1TZXJ2ZXIgPSAoSVNlcnZlcldvcmtpbmdDb3B5KSBzZXJ2ZXIubG9hZEFkYXB0ZXIoSVNlcnZlcldvcmtpbmdDb3B5LmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBmaWxlbmFtZXMgPSBTdHJpbmdVdGlscy5zcGxpdChkbVNlcnZlci5nZXRTdGF0aWNGaWxlbmFtZVBhdHRlcm5zKCksICIsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lczsKIAotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOworICAgICAgICB9CiAKLQl9CisgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRzKHBhcmVudEVsZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBjbGFzcyBGaWxlbmFtZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gU2VydmVyVWlJbWFnZXMuZ2V0SW1hZ2UoU2VydmVyVWlJbWFnZXMuSU1HX09CSl9GSUxFKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2VkaXRvci9WaXJnb0VkaXRvckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZWRpdG9yL1ZpcmdvRWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCA0NjgzZjZhLi5hMzE5ZGQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZWRpdG9yL1ZpcmdvRWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZWRpdG9yL1ZpcmdvRWRpdG9yQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtNiw2ICs2LDcgQEAKICAqIDwvY29weXJpZ2h0PgogICoKICAqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLmVkaXRvcjsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CkBAIC0yNiw2MCArMjcsNjAgQEAKICAqLwogcHVibGljIGNsYXNzIFZpcmdvRWRpdG9yQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgPT0gSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcyAmJiBhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBTZXJ2ZXJFZGl0b3IpIHsKLQkJCWlmIChnZXRWaXJnb1NlcnZlcigoSUVkaXRvclBhcnQpIGFkYXB0YWJsZU9iamVjdCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgU2VydmVyT3V0bGluZVBhZ2UoKFNlcnZlckVkaXRvcikgYWRhcHRhYmxlT2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgeworICAgICAgICBpZiAoYWRhcHRlclR5cGUgPT0gSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcyAmJiBhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBTZXJ2ZXJFZGl0b3IpIHsKKyAgICAgICAgICAgIGlmIChnZXRWaXJnb1NlcnZlcigoSUVkaXRvclBhcnQpIGFkYXB0YWJsZU9iamVjdCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyT3V0bGluZVBhZ2UoKFNlcnZlckVkaXRvcikgYWRhcHRhYmxlT2JqZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZ2V0VmlyZ29TZXJ2ZXIoSUVkaXRvclBhcnQgcGFydCkgewotCQlJU2VydmVyIHNlcnZlciA9IGdldFNlcnZlcihwYXJ0KTsKLQkJaWYgKFNlcnZlclByb2plY3QuaXNWaXJnbyhzZXJ2ZXIpKSB7Ci0JCQlyZXR1cm4gc2VydmVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIElTZXJ2ZXIgZ2V0VmlyZ29TZXJ2ZXIoSUVkaXRvclBhcnQgcGFydCkgeworICAgICAgICBJU2VydmVyIHNlcnZlciA9IGdldFNlcnZlcihwYXJ0KTsKKyAgICAgICAgaWYgKFNlcnZlclByb2plY3QuaXNWaXJnbyhzZXJ2ZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gc2VydmVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgSVNlcnZlciBnZXRTZXJ2ZXIoSUVkaXRvclBhcnQgcGFydCkgewotCQlpZiAocGFydCBpbnN0YW5jZW9mIFNlcnZlckVkaXRvcikgewotCQkJTWV0aG9kIG1ldGhvZDsKLQkJCXRyeSB7Ci0JCQkJbWV0aG9kID0gTXVsdGlQYWdlRWRpdG9yUGFydC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0QWN0aXZlRWRpdG9yIiwgbmV3IENsYXNzW10ge30pOwotCQkJCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQkJCU9iamVjdCByZXN1bHQgPSBtZXRob2QuaW52b2tlKHBhcnQsIG5ldyBPYmplY3RbXSB7fSk7Ci0JCQkJaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFNlcnZlckVkaXRvclBhcnQpIHsKLQkJCQkJSVNlcnZlcldvcmtpbmdDb3B5IHNlcnZlckVkaXRvciA9ICgoU2VydmVyRWRpdG9yUGFydCkgcmVzdWx0KS5nZXRTZXJ2ZXIoKTsKLQkJCQkJaWYgKHNlcnZlckVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCQlJU2VydmVyIHNlcnZlciA9IHNlcnZlckVkaXRvci5nZXRPcmlnaW5hbCgpOwotCQkJCQkJcmV0dXJuIHNlcnZlcjsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgcHVibGljIHN0YXRpYyBJU2VydmVyIGdldFNlcnZlcihJRWRpdG9yUGFydCBwYXJ0KSB7CisgICAgICAgIGlmIChwYXJ0IGluc3RhbmNlb2YgU2VydmVyRWRpdG9yKSB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBNdWx0aVBhZ2VFZGl0b3JQYXJ0LmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRBY3RpdmVFZGl0b3IiLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG1ldGhvZC5pbnZva2UocGFydCwgbmV3IE9iamVjdFtdIHt9KTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgU2VydmVyRWRpdG9yUGFydCkgeworICAgICAgICAgICAgICAgICAgICBJU2VydmVyV29ya2luZ0NvcHkgc2VydmVyRWRpdG9yID0gKChTZXJ2ZXJFZGl0b3JQYXJ0KSByZXN1bHQpLmdldFNlcnZlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRWRpdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElTZXJ2ZXIgc2VydmVyID0gc2VydmVyRWRpdG9yLmdldE9yaWdpbmFsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpCi0JICovCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7IElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MgfTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXJMaXN0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGFzc1tdIHsgSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcyB9OworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2VkaXRvci9WaXJnb1JlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2VkaXRvci9WaXJnb1JlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZS5qYXZhCmluZGV4IDNhMWNkNzguLmFkMTczODggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvVmlyZ29SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZWRpdG9yL1ZpcmdvUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkuZWRpdG9yOwogCiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwpAQCAtMTYsMjEgKzE3LDIxIEBACiAKIC8qKgogICoge0BsaW5rIFNlcnZlckVkaXRvclBhcnR9IHRoYXQgYWxsb3dzIHRvIGJyb3dzZSB0aGUgbG9jYWwgYW5kIHJlbW90ZSBidW5kbGUgcmVwb3NpdG9yeS4KLSAqIAorICoKICAqIEBhdXRob3IgVGVycnkgSG9uCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAxLjAuMAogICovCiBwdWJsaWMgY2xhc3MgVmlyZ29SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UgZXh0ZW5kcyBSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UgewogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEltYWdlIGdldEZvcm1JbWFnZSgpIHsKLQkJcmV0dXJuIFNlcnZlclVpSW1hZ2VzLmdldEltYWdlKFNlcnZlclVpSW1hZ2VzLklNR19PQkpfVklSR08pOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgSW1hZ2UgZ2V0Rm9ybUltYWdlKCkgeworICAgICAgICByZXR1cm4gU2VydmVyVWlJbWFnZXMuZ2V0SW1hZ2UoU2VydmVyVWlJbWFnZXMuSU1HX09CSl9WSVJHTyk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZXJ2ZXJOYW1lKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuVmlyZ29TZXJ2ZXJOYW1lOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7CisgICAgICAgIHJldHVybiBNZXNzYWdlcy5WaXJnb1NlcnZlck5hbWU7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZWRpdG9yL1dlYlVpVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvV2ViVWlVdGlscy5qYXZhCmluZGV4IDU0MTYzZGYuLjM1YzU1Y2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvV2ViVWlVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9lZGl0b3IvV2ViVWlVdGlscy5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLmVkaXRvcjsKIAogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKQEAgLTMwLDQzICszMSw0MCBAQAogQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKIHB1YmxpYyBjbGFzcyBXZWJVaVV0aWxzIHsKIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuVXJsKFN0cmluZyBsb2NhdGlvbikgewotCQlvcGVuVXJsKGxvY2F0aW9uLCAwKTsKLQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW5VcmwoU3RyaW5nIGxvY2F0aW9uKSB7CisgICAgICAgIG9wZW5VcmwobG9jYXRpb24sIDApOworICAgIH0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgb3BlblVybChTdHJpbmcgbG9jYXRpb24sIGludCBjdXN0b21GbGFncykgewotCQl0cnkgewotCQkJVVJMIHVybCA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBvcGVuVXJsKFN0cmluZyBsb2NhdGlvbiwgaW50IGN1c3RvbUZsYWdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVUkwgdXJsID0gbnVsbDsKIAotCQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQl1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLQkJCX0KLQkJCWlmIChXZWJCcm93c2VyUHJlZmVyZW5jZS5nZXRCcm93c2VyQ2hvaWNlKCkgPT0gV2ViQnJvd3NlclByZWZlcmVuY2UuRVhURVJOQUwpIHsKLQkJCQl0cnkgewotCQkJCQlJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgc3VwcG9ydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QnJvd3NlclN1cHBvcnQoKTsKLQkJCQkJc3VwcG9ydC5nZXRFeHRlcm5hbEJyb3dzZXIoKS5vcGVuVVJMKHVybCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUlXZWJCcm93c2VyIGJyb3dzZXIgPSBudWxsOwotCQkJCWludCBmbGFncyA9IGN1c3RvbUZsYWdzOwotCQkJCWlmIChXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzSW50ZXJuYWxXZWJCcm93c2VyQXZhaWxhYmxlKCkpIHsKLQkJCQkJZmxhZ3MgfD0gSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LkFTX0VESVRPUiB8IElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5MT0NBVElPTl9CQVIKLQkJCQkJCQl8IElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5OQVZJR0FUSU9OX0JBUjsKLQkJCQl9IGVsc2UgewotCQkJCQlmbGFncyB8PSBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuQVNfRVhURVJOQUwgfCBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTE9DQVRJT05fQkFSCi0JCQkJCQkJfCBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTkFWSUdBVElPTl9CQVI7Ci0JCQkJfQorICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChXZWJCcm93c2VyUHJlZmVyZW5jZS5nZXRCcm93c2VyQ2hvaWNlKCkgPT0gV2ViQnJvd3NlclByZWZlcmVuY2UuRVhURVJOQUwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgc3VwcG9ydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QnJvd3NlclN1cHBvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5nZXRFeHRlcm5hbEJyb3dzZXIoKS5vcGVuVVJMKHVybCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIElXZWJCcm93c2VyIGJyb3dzZXIgPSBudWxsOworICAgICAgICAgICAgICAgIGludCBmbGFncyA9IGN1c3RvbUZsYWdzOworICAgICAgICAgICAgICAgIGlmIChXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzSW50ZXJuYWxXZWJCcm93c2VyQXZhaWxhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LkFTX0VESVRPUiB8IElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5MT0NBVElPTl9CQVIgfCBJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuTkFWSUdBVElPTl9CQVI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LkFTX0VYVEVSTkFMIHwgSVdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LkxPQ0FUSU9OX0JBUiB8IElXb3JrYmVuY2hCcm93c2VyU3VwcG9ydC5OQVZJR0FUSU9OX0JBUjsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlTdHJpbmcgZ2VuZXJhdGVkSWQgPSAib3JnLmVjbGlwc2UubXlseW4ud2ViLmJyb3dzZXItIiArIENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCk7Ci0JCQkJYnJvd3NlciA9IFdvcmtiZW5jaEJyb3dzZXJTdXBwb3J0LmdldEluc3RhbmNlKCkuY3JlYXRlQnJvd3NlcihmbGFncywgZ2VuZXJhdGVkSWQsIG51bGwsIG51bGwpOwotCQkJCWJyb3dzZXIub3BlblVSTCh1cmwpOwotCQkJfQotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCAiQnJvd3NlciBpbml0IGVycm9yIiwKLQkJCQkJIkJyb3dzZXIgY291bGQgbm90IGJlIGluaXRpYXRlZCIpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgICAgICAgICAgICAgIFN0cmluZyBnZW5lcmF0ZWRJZCA9ICJvcmcuZWNsaXBzZS5teWx5bi53ZWIuYnJvd3Nlci0iICsgQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKTsKKyAgICAgICAgICAgICAgICBicm93c2VyID0gV29ya2JlbmNoQnJvd3NlclN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5jcmVhdGVCcm93c2VyKGZsYWdzLCBnZW5lcmF0ZWRJZCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgYnJvd3Nlci5vcGVuVVJMKHVybCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksICJCcm93c2VyIGluaXQgZXJyb3IiLCAiQnJvd3NlciBjb3VsZCBub3QgYmUgaW5pdGlhdGVkIik7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9maWx0ZXJzL0J1bmRsZUFydGVmYWN0RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZmlsdGVycy9CdW5kbGVBcnRlZmFjdEZpbHRlci5qYXZhCmluZGV4IDdjNTdkZDcuLjRkNTk4MWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9maWx0ZXJzL0J1bmRsZUFydGVmYWN0RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2ZpbHRlcnMvQnVuZGxlQXJ0ZWZhY3RGaWx0ZXIuamF2YQpAQCAtMTcsMTggKzE3LDE4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvamVjdHMuUHJvamVjdEJ1bmRsZVJvb3Q7CiAKIC8qKgotICogCisgKgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKLSAqIAorICoKICAqLwogcHVibGljIGNsYXNzIEJ1bmRsZUFydGVmYWN0RmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXIjc2VsZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoIShlbGVtZW50IGluc3RhbmNlb2YgUHJvamVjdEJ1bmRsZUNvbnRhaW5lcikgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgUHJvamVjdEJ1bmRsZVJvb3QpKTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlciNzZWxlY3Qob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsCisgICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuICEoZWxlbWVudCBpbnN0YW5jZW9mIFByb2plY3RCdW5kbGVDb250YWluZXIpICYmICEoZWxlbWVudCBpbnN0YW5jZW9mIFByb2plY3RCdW5kbGVSb290KTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZmlsdGVycy9GaWx0ZXJBY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9maWx0ZXJzL0ZpbHRlckFjdGlvbi5qYXZhCmluZGV4IGRjODgyNzQuLmU3MzA3YzYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9maWx0ZXJzL0ZpbHRlckFjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9maWx0ZXJzL0ZpbHRlckFjdGlvbi5qYXZhCkBAIC0yMyw3NCArMjMsNzAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS52aWV3cy5BcnRlZmFjdENvbW1vblZpZXc7CiAKIC8qKgotICogCisgKgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKLSAqIAorICoKICAqLwogcHVibGljIGNsYXNzIEZpbHRlckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CiAKLQlBcnRlZmFjdENvbW1vblZpZXcgbmF2aWdhdG9yOworICAgIEFydGVmYWN0Q29tbW9uVmlldyBuYXZpZ2F0b3I7CiAKLQlTdHJpbmcgaWQ7CisgICAgU3RyaW5nIGlkOwogCi0JLyoKLQkgKiBAc2VlIEFjdGlvbiNhY3Rpb25QZXJmb3JtZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUlOYXZpZ2F0b3JGaWx0ZXJTZXJ2aWNlIGFjdGl2YXRpb25TZXJ2aWNlID0gbmF2aWdhdG9yLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCkuZ2V0RmlsdGVyU2VydmljZSgpOwotCQlJQ29tbW9uRmlsdGVyRGVzY3JpcHRvcltdIHZpc2libGVGaWx0ZXJEZXNjcmlwdG9ycyA9IGFjdGl2YXRpb25TZXJ2aWNlLmdldFZpc2libGVGaWx0ZXJEZXNjcmlwdG9ycygpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWN0aXZlSURzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlmb3IgKElDb21tb25GaWx0ZXJEZXNjcmlwdG9yIGZpbHRlckRlc2NyaXB0b3IgOiB2aXNpYmxlRmlsdGVyRGVzY3JpcHRvcnMpIHsKLQkJCVN0cmluZyBmaWx0ZXJJRCA9IGZpbHRlckRlc2NyaXB0b3IuZ2V0SWQoKTsKLQkJCWJvb2xlYW4gYWN0aXZlID0gYWN0aXZhdGlvblNlcnZpY2UuaXNBY3RpdmUoZmlsdGVySUQpOwotCQkJaWYgKGFjdGl2ZSkgewotCQkJCWFjdGl2ZUlEcy5hZGQoZmlsdGVySUQpOwotCQkJfQotCQl9Ci0JCWlmIChpc0NoZWNrZWQoKSkgewotCQkJYWN0aXZlSURzLnJlbW92ZShpZCk7Ci0JCX0gZWxzZSB7Ci0JCQlhY3RpdmVJRHMuYWRkKGlkKTsKLQkJfQotCQlTdHJpbmdbXSBpZHMgPSBhY3RpdmVJRHMudG9BcnJheShuZXcgU3RyaW5nW2FjdGl2ZUlEcy5zaXplKCldKTsKLQkJYWN0aXZhdGlvblNlcnZpY2UuYWN0aXZhdGVGaWx0ZXJJZHNBbmRVcGRhdGVWaWV3ZXIoaWRzKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIEFjdGlvbiNhY3Rpb25QZXJmb3JtZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIElOYXZpZ2F0b3JGaWx0ZXJTZXJ2aWNlIGFjdGl2YXRpb25TZXJ2aWNlID0gdGhpcy5uYXZpZ2F0b3IuZ2V0TmF2aWdhdG9yQ29udGVudFNlcnZpY2UoKS5nZXRGaWx0ZXJTZXJ2aWNlKCk7CisgICAgICAgIElDb21tb25GaWx0ZXJEZXNjcmlwdG9yW10gdmlzaWJsZUZpbHRlckRlc2NyaXB0b3JzID0gYWN0aXZhdGlvblNlcnZpY2UuZ2V0VmlzaWJsZUZpbHRlckRlc2NyaXB0b3JzKCk7CisgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBhY3RpdmVJRHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoSUNvbW1vbkZpbHRlckRlc2NyaXB0b3IgZmlsdGVyRGVzY3JpcHRvciA6IHZpc2libGVGaWx0ZXJEZXNjcmlwdG9ycykgeworICAgICAgICAgICAgU3RyaW5nIGZpbHRlcklEID0gZmlsdGVyRGVzY3JpcHRvci5nZXRJZCgpOworICAgICAgICAgICAgYm9vbGVhbiBhY3RpdmUgPSBhY3RpdmF0aW9uU2VydmljZS5pc0FjdGl2ZShmaWx0ZXJJRCk7CisgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlSURzLmFkZChmaWx0ZXJJRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzQ2hlY2tlZCgpKSB7CisgICAgICAgICAgICBhY3RpdmVJRHMucmVtb3ZlKHRoaXMuaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWN0aXZlSURzLmFkZCh0aGlzLmlkKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSBpZHMgPSBhY3RpdmVJRHMudG9BcnJheShuZXcgU3RyaW5nW2FjdGl2ZUlEcy5zaXplKCldKTsKKyAgICAgICAgYWN0aXZhdGlvblNlcnZpY2UuYWN0aXZhdGVGaWx0ZXJJZHNBbmRVcGRhdGVWaWV3ZXIoaWRzKTsKKyAgICB9CiAKLQlwcml2YXRlIEZpbHRlckFjdGlvbihBcnRlZmFjdENvbW1vblZpZXcgdmlld2VyLCBTdHJpbmcgaWQsIEltYWdlRGVzY3JpcHRvciBpbWFnZSkgewotCQlzdXBlcigiIiwgQVNfQ0hFQ0tfQk9YKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLm5hdmlnYXRvciA9IHZpZXdlcjsKLQkJdGhpcy5pZCA9IGlkOwotCQlJQ29tbW9uRmlsdGVyRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gdmlld2VyLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCkKLQkJCQkuZ2V0RmlsdGVyU2VydmljZSgpCi0JCQkJLmdldFZpc2libGVGaWx0ZXJEZXNjcmlwdG9ycygpOwotCQlmb3IgKElDb21tb25GaWx0ZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgewotCQkJaWYgKGRlc2NyaXB0b3IuZ2V0SWQoKS5lcXVhbHMoaWQpKSB7Ci0JCQkJc2V0VGV4dCgiU2hvdyAiICsgZGVzY3JpcHRvci5nZXROYW1lKCkpOwotCQkJCXNldERlc2NyaXB0aW9uKCJTaG93ICIgKyBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCXNldFRvb2xUaXBUZXh0KCJTaG93ICIgKyBkZXNjcmlwdG9yLmdldE5hbWUoKSArICIgaW4gdGhlIGxpc3Qgb2YgYXJ0aWZhY3RzLiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXNldEltYWdlRGVzY3JpcHRvcihpbWFnZSk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKGltYWdlKTsKKyAgICBwcml2YXRlIEZpbHRlckFjdGlvbihBcnRlZmFjdENvbW1vblZpZXcgdmlld2VyLCBTdHJpbmcgaWQsIEltYWdlRGVzY3JpcHRvciBpbWFnZSkgeworICAgICAgICBzdXBlcigiIiwgQVNfQ0hFQ0tfQk9YKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB0aGlzLm5hdmlnYXRvciA9IHZpZXdlcjsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICBJQ29tbW9uRmlsdGVyRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gdmlld2VyLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCkuZ2V0RmlsdGVyU2VydmljZSgpLmdldFZpc2libGVGaWx0ZXJEZXNjcmlwdG9ycygpOworICAgICAgICBmb3IgKElDb21tb25GaWx0ZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgOiBkZXNjcmlwdG9ycykgeworICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0SWQoKS5lcXVhbHMoaWQpKSB7CisgICAgICAgICAgICAgICAgc2V0VGV4dCgiU2hvdyAiICsgZGVzY3JpcHRvci5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHNldERlc2NyaXB0aW9uKCJTaG93ICIgKyBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCkpOworICAgICAgICAgICAgICAgIHNldFRvb2xUaXBUZXh0KCJTaG93ICIgKyBkZXNjcmlwdG9yLmdldE5hbWUoKSArICIgaW4gdGhlIGxpc3Qgb2YgYXJ0aWZhY3RzLiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihpbWFnZSk7CisgICAgICAgIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKGltYWdlKTsKIAotCQlJTmF2aWdhdG9yRmlsdGVyU2VydmljZSBhY3RpdmF0aW9uU2VydmljZSA9IG5hdmlnYXRvci5nZXROYXZpZ2F0b3JDb250ZW50U2VydmljZSgpLmdldEZpbHRlclNlcnZpY2UoKTsKLQkJYm9vbGVhbiBhY3RpdmUgPSBhY3RpdmF0aW9uU2VydmljZS5pc0FjdGl2ZShpZCk7Ci0JCXNldENoZWNrZWQoIWFjdGl2ZSk7Ci0JfQorICAgICAgICBJTmF2aWdhdG9yRmlsdGVyU2VydmljZSBhY3RpdmF0aW9uU2VydmljZSA9IHRoaXMubmF2aWdhdG9yLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCkuZ2V0RmlsdGVyU2VydmljZSgpOworICAgICAgICBib29sZWFuIGFjdGl2ZSA9IGFjdGl2YXRpb25TZXJ2aWNlLmlzQWN0aXZlKGlkKTsKKyAgICAgICAgc2V0Q2hlY2tlZCghYWN0aXZlKTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIEZpbHRlckFjdGlvbltdIGNyZWF0ZVNldChBcnRlZmFjdENvbW1vblZpZXcgdmlld2VyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyQWN0aW9uW10geyBjcmVhdGVCdW5kbGVGaWx0ZXIodmlld2VyKSwgY3JlYXRlTGlicmFyeUZpbHRlcih2aWV3ZXIpIH07Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgRmlsdGVyQWN0aW9uW10gY3JlYXRlU2V0KEFydGVmYWN0Q29tbW9uVmlldyB2aWV3ZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJBY3Rpb25bXSB7IGNyZWF0ZUJ1bmRsZUZpbHRlcih2aWV3ZXIpLCBjcmVhdGVMaWJyYXJ5RmlsdGVyKHZpZXdlcikgfTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIEZpbHRlckFjdGlvbiBjcmVhdGVCdW5kbGVGaWx0ZXIoQXJ0ZWZhY3RDb21tb25WaWV3IHZpZXdlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlckFjdGlvbih2aWV3ZXIsICJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS5maWx0ZXJCdW5kbGVzIiwKLQkJCQlKYXZhUGx1Z2luSW1hZ2VzLkRFU0NfT0JKU19FWFRKQVIpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIEZpbHRlckFjdGlvbiBjcmVhdGVCdW5kbGVGaWx0ZXIoQXJ0ZWZhY3RDb21tb25WaWV3IHZpZXdlcikgeworICAgICAgICByZXR1cm4gbmV3IEZpbHRlckFjdGlvbih2aWV3ZXIsICJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS5maWx0ZXJCdW5kbGVzIiwgSmF2YVBsdWdpbkltYWdlcy5ERVNDX09CSlNfRVhUSkFSKTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIEZpbHRlckFjdGlvbiBjcmVhdGVMaWJyYXJ5RmlsdGVyKEFydGVmYWN0Q29tbW9uVmlldyB2aWV3ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJBY3Rpb24odmlld2VyLCAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkuZmlsdGVyTGlicmFyaWVzIiwKLQkJCQlTZXJ2ZXJVaUltYWdlcy5ERVNDX09CSl9WSVJHT19MSUIpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIEZpbHRlckFjdGlvbiBjcmVhdGVMaWJyYXJ5RmlsdGVyKEFydGVmYWN0Q29tbW9uVmlldyB2aWV3ZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJBY3Rpb24odmlld2VyLCAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkuZmlsdGVyTGlicmFyaWVzIiwgU2VydmVyVWlJbWFnZXMuREVTQ19PQkpfVklSR09fTElCKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZmlsdGVycy9MaWJyYXJ5QXJ0ZWZhY3RGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9maWx0ZXJzL0xpYnJhcnlBcnRlZmFjdEZpbHRlci5qYXZhCmluZGV4IDQ0NDlkMzIuLjBiOWNmZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9maWx0ZXJzL0xpYnJhcnlBcnRlZmFjdEZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9maWx0ZXJzL0xpYnJhcnlBcnRlZmFjdEZpbHRlci5qYXZhCkBAIC0xOSwyMyArMTksMjIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm9qZWN0cy5Qcm9qZWN0RmlsZVJlZmVyZW5jZTsKIAogLyoqCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgotICogCisgKgogICovCiBwdWJsaWMgY2xhc3MgTGlicmFyeUFydGVmYWN0RmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJHT19MSUJfRVhUID0gImxpYmQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJHT19MSUJfRVhUID0gImxpYmQiOwogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlciNzZWxlY3Qob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuICghKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9qZWN0RmlsZUNvbnRhaW5lcikgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgUHJvamVjdEZpbGVSZWZlcmVuY2UpCi0JCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgTG9jYWxMaWJyYXJ5QXJ0ZWZhY3QpICYmICEoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlICYmICgoSUZpbGUpIGVsZW1lbnQpLmdldEZpbGVFeHRlbnNpb24oKQotCQkJCS5lcXVhbHMoVklSR09fTElCX0VYVCkpKTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlciNzZWxlY3Qob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsCisgICAgICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuICEoZWxlbWVudCBpbnN0YW5jZW9mIFByb2plY3RGaWxlQ29udGFpbmVyKSAmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9qZWN0RmlsZVJlZmVyZW5jZSkgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgTG9jYWxMaWJyYXJ5QXJ0ZWZhY3QpCisgICAgICAgICAgICAmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSAmJiAoKElGaWxlKSBlbGVtZW50KS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFZJUkdPX0xJQl9FWFQpKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9maWx0ZXJzL1ZpcmdvU2VydmVyRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvZmlsdGVycy9WaXJnb1NlcnZlckZpbHRlci5qYXZhCmluZGV4IDg2ZGQ1MmEuLmQ4ODFlMjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9maWx0ZXJzL1ZpcmdvU2VydmVyRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL2ZpbHRlcnMvVmlyZ29TZXJ2ZXJGaWx0ZXIuamF2YQpAQCAtMTgsMTkgKzE4LDE4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvamVjdHMuU2VydmVyUHJvamVjdDsKIAogLyoqCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgotICogCisgKgogICovCiBwdWJsaWMgY2xhc3MgVmlyZ29TZXJ2ZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlciNzZWxlY3Qob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsIGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpCi0JCQkJJiYgIUZhY2V0VXRpbHMuaGFzTmF0dXJlKChJUHJvamVjdCkgZWxlbWVudCwgU2VydmVyUHJvamVjdC5TRVJWRVJfUFJPSkVDVF9JRCk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXIjc2VsZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LAorICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgIHJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QgJiYgIUZhY2V0VXRpbHMuaGFzTmF0dXJlKChJUHJvamVjdCkgZWxlbWVudCwgU2VydmVyUHJvamVjdC5TRVJWRVJfUFJPSkVDVF9JRCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvUnVudGltZVByZWZlcmVuY2VQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9SdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQppbmRleCBhMGFjZmQ2Li4wNjMxZGFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9SdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9SdW50aW1lUHJlZmVyZW5jZVBhZ2UuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Cb29sZWFuRmllbGRFZGl0b3I7CkBAIC0yNCw2NiArMjUsNjggQEAKIAogLyoqCiAgKiB7QGxpbmsgUHJvcGVydHlQYWdlfSB0byBjb25maWd1cmUgbG9hZGluZyBvZiBjbGFzcyBhbmQgcmVzb3VyY2UgbmFtZXMgZnJvbSB0aGUgcmVwb3NpdG9yeSBpbmRleAotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMi4zLjAKICAqLwogcHVibGljIGNsYXNzIFJ1bnRpbWVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7CiAKLQlwcml2YXRlIEJvb2xlYW5GaWVsZEVkaXRvciBib29sZWFuRWRpdG9yOworICAgIHByaXZhdGUgQm9vbGVhbkZpZWxkRWRpdG9yIGJvb2xlYW5FZGl0b3I7CiAKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewogCi0JCUNvbXBvc2l0ZSBlbnRyeVRhYmxlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKKyAgICAgICAgQ29tcG9zaXRlIGVudHJ5VGFibGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwogCi0JCS8vIENyZWF0ZSBhIGRhdGEgdGhhdCB0YWtlcyB1cCB0aGUgZXh0cmEgc3BhY2UgaW4gdGhlIGRpYWxvZyAuCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZW50cnlUYWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICAvLyBDcmVhdGUgYSBkYXRhIHRoYXQgdGFrZXMgdXAgdGhlIGV4dHJhIHNwYWNlIGluIHRoZSBkaWFsb2cgLgorICAgICAgICBHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7CisgICAgICAgIGRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7CisgICAgICAgIGVudHJ5VGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKIAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWVudHJ5VGFibGUuc2V0TGF5b3V0KGxheW91dCk7CisgICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKKyAgICAgICAgZW50cnlUYWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKIAotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChlbnRyeVRhYmxlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIlVzZSB0aGlzIHByZWZlcmVuY2UgcGFnZSB0byBlbmFibGUgbG9hZGluZyBvZiBjbGFzcyBhbmQgcmVzb3VyY2UgbmFtZXNcbiIKLQkJCQkrICJmcm9tIHRoZSBCdW5kbGUgUmVwb3NpdG9yeSBJbmRleCBzbyB0aGF0IHRoZXkgd2lsbCBiZSBpbmNsdWRlZCBpbiBzZWFyY2hlcy4iKTsKKyAgICAgICAgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZW50cnlUYWJsZSwgU1dULk5PTkUpOworICAgICAgICBsYWJlbC5zZXRUZXh0KCJVc2UgdGhpcyBwcmVmZXJlbmNlIHBhZ2UgdG8gZW5hYmxlIGxvYWRpbmcgb2YgY2xhc3MgYW5kIHJlc291cmNlIG5hbWVzXG4iCisgICAgICAgICAgICArICJmcm9tIHRoZSBCdW5kbGUgUmVwb3NpdG9yeSBJbmRleCBzbyB0aGF0IHRoZXkgd2lsbCBiZSBpbmNsdWRlZCBpbiBzZWFyY2hlcy4iKTsKIAotCQlDb21wb3NpdGUgcmFkaW9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGVudHJ5VGFibGUsIFNXVC5OT05FKTsKLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworICAgICAgICBDb21wb3NpdGUgcmFkaW9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGVudHJ5VGFibGUsIFNXVC5OT05FKTsKKyAgICAgICAgcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwogCi0JCS8vIENyZWF0ZSBhIGRhdGEgdGhhdCB0YWtlcyB1cCB0aGUgZXh0cmEgc3BhY2UgaW4gdGhlIGRpYWxvZy4KLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisgICAgICAgIC8vIENyZWF0ZSBhIGRhdGEgdGhhdCB0YWtlcyB1cCB0aGUgZXh0cmEgc3BhY2UgaW4gdGhlIGRpYWxvZy4KKyAgICAgICAgcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CiAKLQkJQ29tcG9zaXRlIHJhZGlvQ29tcG9zaXRlMiA9IG5ldyBDb21wb3NpdGUocmFkaW9Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMzsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDM7Ci0JCXJhZGlvQ29tcG9zaXRlMi5zZXRMYXlvdXQobGF5b3V0KTsKLQkJcmFkaW9Db21wb3NpdGUyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlib29sZWFuRWRpdG9yID0gbmV3IEJvb2xlYW5GaWVsZEVkaXRvcihTZXJ2ZXJDb3JlUGx1Z2luLlBSRUZfTE9BRF9DTEFTU0VTX0tFWSwgIkxvYWQgY2xhc3MgYW5kIHJlc291cmNlIG5hbWVzIiwKLQkJCQlyYWRpb0NvbXBvc2l0ZTIpOwotCQlib29sZWFuRWRpdG9yLnNldFBhZ2UodGhpcyk7Ci0JCWJvb2xlYW5FZGl0b3Iuc2V0UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJYm9vbGVhbkVkaXRvci5sb2FkKCk7CisgICAgICAgIENvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZTIgPSBuZXcgQ29tcG9zaXRlKHJhZGlvQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisgICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDM7CisgICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAzOworICAgICAgICByYWRpb0NvbXBvc2l0ZTIuc2V0TGF5b3V0KGxheW91dCk7CisgICAgICAgIHJhZGlvQ29tcG9zaXRlMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKyAgICAgICAgdGhpcy5ib29sZWFuRWRpdG9yID0gbmV3IEJvb2xlYW5GaWVsZEVkaXRvcihTZXJ2ZXJDb3JlUGx1Z2luLlBSRUZfTE9BRF9DTEFTU0VTX0tFWSwgIkxvYWQgY2xhc3MgYW5kIHJlc291cmNlIG5hbWVzIiwgcmFkaW9Db21wb3NpdGUyKTsKKyAgICAgICAgdGhpcy5ib29sZWFuRWRpdG9yLnNldFBhZ2UodGhpcyk7CisgICAgICAgIHRoaXMuYm9vbGVhbkVkaXRvci5zZXRQcmVmZXJlbmNlU3RvcmUoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOworICAgICAgICB0aGlzLmJvb2xlYW5FZGl0b3IubG9hZCgpOwogCi0JCUxhYmVsIG5vdGVMYWJlbCA9IG5ldyBMYWJlbChyYWRpb0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlub3RlTGFiZWwuc2V0VGV4dCgiTm90ZTogZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBpbmNyZWFzZSBtZW1vcnkgY29uc3VtcHRpb24uXG5DaGFuZ2luZyB0aGUgc2V0dGluZyByZXF1aXJlcyBhIHJlc3RhcnQgdG8gdGFrZSBlZmZlY3QuIik7CisgICAgICAgIExhYmVsIG5vdGVMYWJlbCA9IG5ldyBMYWJlbChyYWRpb0NvbXBvc2l0ZSwgU1dULk5PTkUpOworICAgICAgICBub3RlTGFiZWwuc2V0VGV4dCgiTm90ZTogZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBpbmNyZWFzZSBtZW1vcnkgY29uc3VtcHRpb24uXG5DaGFuZ2luZyB0aGUgc2V0dGluZyByZXF1aXJlcyBhIHJlc3RhcnQgdG8gdGFrZSBlZmZlY3QuIik7CiAKLQkJcmV0dXJuIGVudHJ5VGFibGU7CisgICAgICAgIHJldHVybiBlbnRyeVRhYmxlOwogCi0JfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgcHJlZmVyZW5jZSBzdG9yZSB3ZSB3aXNoIHRvIHVzZQotCQlzZXRQcmVmZXJlbmNlU3RvcmUoU2VydmVyQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHByZWZlcmVuY2Ugc3RvcmUgd2Ugd2lzaCB0byB1c2UKKyAgICAgICAgc2V0UHJlZmVyZW5jZVN0b3JlKFNlcnZlckNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWJvb2xlYW5FZGl0b3IubG9hZERlZmF1bHQoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgeworICAgICAgICB0aGlzLmJvb2xlYW5FZGl0b3IubG9hZERlZmF1bHQoKTsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW5FZGl0b3Iuc3RvcmUoKTsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7CisgICAgICAgIHRoaXMuYm9vbGVhbkVkaXRvci5zdG9yZSgpOworICAgICAgICByZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL0FydGVmYWN0Q29udGFpbmVyc0NvbnRlbnRQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9BcnRlZmFjdENvbnRhaW5lcnNDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCBjMGE1ODIxLi44M2QxYmQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL0FydGVmYWN0Q29udGFpbmVyc0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvQXJ0ZWZhY3RDb250YWluZXJzQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTE4LDQxICsxOCw0MSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwogCiAvKioKLSAqIAorICoKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCi0gKiAKKyAqCiAgKi8KIHB1YmxpYyBjbGFzcyBBcnRlZmFjdENvbnRhaW5lcnNDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBHZW5lcmljVHJlZVByb3ZpZGVyIHsKIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlTZXJ2ZXJQcm9qZWN0IHByb2plY3QgPSBTZXJ2ZXJQcm9qZWN0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb2plY3QoKElTZXJ2ZXIpIGlucHV0RWxlbWVudCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0W10gY29udGFpbmVycyA9IHByb2plY3QuZ2V0Q29udGFpbmVycygpLnRvQXJyYXkobmV3IE9iamVjdFswXSk7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lcnM7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSB7Ci0JCQlyZXR1cm4gKChJU2VydmVyUHJvamVjdENvbnRhaW5lcikgaW5wdXRFbGVtZW50KS5nZXRNZW1iZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CisgICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKSB7CisgICAgICAgICAgICBTZXJ2ZXJQcm9qZWN0IHByb2plY3QgPSBTZXJ2ZXJQcm9qZWN0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb2plY3QoKElTZXJ2ZXIpIGlucHV0RWxlbWVudCwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gY29udGFpbmVycyA9IHByb2plY3QuZ2V0Q29udGFpbmVycygpLnRvQXJyYXkobmV3IE9iamVjdFswXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSB7CisgICAgICAgICAgICByZXR1cm4gKChJU2VydmVyUHJvamVjdENvbnRhaW5lcikgaW5wdXRFbGVtZW50KS5nZXRNZW1iZXJzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclByb2plY3RBcnRlZmFjdCkgewotCQkJcmV0dXJuICgoSVNlcnZlclByb2plY3RBcnRlZmFjdCkgZWxlbWVudCkuZ2V0Q29udGFpbmVyKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyUHJvamVjdENvbnRhaW5lcikgewotCQkJcmV0dXJuICgoSVNlcnZlclByb2plY3RDb250YWluZXIpIGVsZW1lbnQpLmdldFNlcnZlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyUHJvamVjdEFydGVmYWN0KSB7CisgICAgICAgICAgICByZXR1cm4gKChJU2VydmVyUHJvamVjdEFydGVmYWN0KSBlbGVtZW50KS5nZXRDb250YWluZXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSB7CisgICAgICAgICAgICByZXR1cm4gKChJU2VydmVyUHJvamVjdENvbnRhaW5lcikgZWxlbWVudCkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9GbGF0dGVuZWRBcnRlZmFjdHNDb250ZW50UHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvRmxhdHRlbmVkQXJ0ZWZhY3RzQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggMDhjOWNiMC4uZGNmNzEzYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9GbGF0dGVuZWRBcnRlZmFjdHNDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL0ZsYXR0ZW5lZEFydGVmYWN0c0NvbnRlbnRQcm92aWRlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb3ZpZGVyczsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLkFycmF5VXRpbHM7CkBAIC0xOSw1MiArMjAsNDMgQEAKIAogLyoqCiAgKiBDb21tb24gY29udGVudCBwcm92aWRlciBmb3IgcmVwb3NpdG9yeSBpbnN0YWxsYXRpb24gbm9kZXMuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgogICovCiBwdWJsaWMgY2xhc3MgRmxhdHRlbmVkQXJ0ZWZhY3RzQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgUnVudGltZUNvbnRhaW5lcnNDb250ZW50UHJvdmlkZXIgewogCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewogCi0JCS8qd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVtcy5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCQlzZXJ2ZXJzLmFkZCgoSVNlcnZlcikgbmV4dCk7Ci0JCQl9Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIExpYnJhcmllc05vZGUpIHsKLQkJCQlzZXJ2ZXJzLmFkZCgoKExpYnJhcmllc05vZGUpIG5leHQpLmdldFNlcnZlcigpKTsKLQkJCX0KLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSVNlcnZlclByb2plY3RDb250YWluZXIgfHwgbmV4dCBpbnN0YW5jZW9mIEFydGVmYWN0U2V0KSB7Ci0JCQkJY29udGFpbmVycy5hZGQobmV4dCk7Ci0JCQl9Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIElBcnRlZmFjdCB8fCBuZXh0IGluc3RhbmNlb2YgSVNlcnZlclByb2plY3RBcnRlZmFjdCkgewotCQkJCWFydGlmYWN0cy5hZGQobmV4dCk7Ci0JCQl9Ci0JCX0qLworICAgICAgICAvKgorICAgICAgICAgKiB3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7IE9iamVjdCBuZXh0ID0gaXRlbXMubmV4dCgpOyBpZiAobmV4dCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsgc2VydmVycy5hZGQoKElTZXJ2ZXIpCisgICAgICAgICAqIG5leHQpOyB9IGlmIChuZXh0IGluc3RhbmNlb2YgTGlicmFyaWVzTm9kZSkgeyBzZXJ2ZXJzLmFkZCgoKExpYnJhcmllc05vZGUpIG5leHQpLmdldFNlcnZlcigpKTsgfSBpZiAobmV4dAorICAgICAgICAgKiBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyIHx8IG5leHQgaW5zdGFuY2VvZiBBcnRlZmFjdFNldCkgeyBjb250YWluZXJzLmFkZChuZXh0KTsgfSBpZiAobmV4dAorICAgICAgICAgKiBpbnN0YW5jZW9mIElBcnRlZmFjdCB8fCBuZXh0IGluc3RhbmNlb2YgSVNlcnZlclByb2plY3RBcnRlZmFjdCkgeyBhcnRpZmFjdHMuYWRkKG5leHQpOyB9IH0KKyAgICAgICAgICovCiAKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGlucHV0RWxlbWVudDsKLQkJCVNlcnZlclByb2plY3QgcHJvamVjdCA9IFNlcnZlclByb2plY3RNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UHJvamVjdChzZXJ2ZXIpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCUlTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyW10gY29udGFpbmVycyA9IHByb2plY3QuZ2V0Q29udGFpbmVycygpLnRvQXJyYXkobmV3IElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyWzBdKTsKLQkJCQlPYmplY3RbXSBtZW1iZXJzID0gbmV3IE9iamVjdFswXTsKLQkJCQlmb3IgKElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyIGNvbnRhaW5lciA6IGNvbnRhaW5lcnMpIHsKLQkJCQkJT2JqZWN0W10gcm9vdHMgPSBjb250YWluZXIuZ2V0TWVtYmVycygpOwotCQkJCQltZW1iZXJzID0gQXJyYXlVdGlscy5hZGRBbGwobWVtYmVycywgcm9vdHMpOwotCQkJCX0KLQkJCQlyZXR1cm4gbWVtYmVyczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KTsKLQl9CisgICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKSB7CisgICAgICAgICAgICBJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBpbnB1dEVsZW1lbnQ7CisgICAgICAgICAgICBTZXJ2ZXJQcm9qZWN0IHByb2plY3QgPSBTZXJ2ZXJQcm9qZWN0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb2plY3Qoc2VydmVyKTsKKyAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJU2VydmVyUHJvamVjdENvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSBwcm9qZWN0LmdldENvbnRhaW5lcnMoKS50b0FycmF5KG5ldyBJU2VydmVyUHJvamVjdENvbnRhaW5lclswXSk7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gbWVtYmVycyA9IG5ldyBPYmplY3RbMF07CisgICAgICAgICAgICAgICAgZm9yIChJU2VydmVyUHJvamVjdENvbnRhaW5lciBjb250YWluZXIgOiBjb250YWluZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHJvb3RzID0gY29udGFpbmVyLmdldE1lbWJlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtYmVycyA9IEFycmF5VXRpbHMuYWRkQWxsKG1lbWJlcnMsIHJvb3RzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlcnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyUHJvamVjdEFydGVmYWN0KSB7Ci0JCQlyZXR1cm4gKChJU2VydmVyUHJvamVjdEFydGVmYWN0KSBlbGVtZW50KS5nZXRDb250YWluZXIoKS5nZXRTZXJ2ZXIoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgeworICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QpIHsKKyAgICAgICAgICAgIHJldHVybiAoKElTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QpIGVsZW1lbnQpLmdldENvbnRhaW5lcigpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5nZXRQYXJlbnQoZWxlbWVudCk7CisgICAgfQogCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9GbGF0dGVuZWRQcm9wZXJ0aWVzRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9GbGF0dGVuZWRQcm9wZXJ0aWVzRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IGJlYTQ5NzMuLjhmNmNhZTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvRmxhdHRlbmVkUHJvcGVydGllc0ZpbGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL0ZsYXR0ZW5lZFByb3BlcnRpZXNGaWxlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvdmlkZXJzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuQXJyYXlVdGlsczsKQEAgLTE1LDIyICsxNiwyMiBAQAogCiAvKioKICAqIENvbW1vbiBjb250ZW50IHByb3ZpZGVyIGZvciB2aWV3cyBvbiBzZXJ2ZXIgY29udGVudC4KLSAqIAorICoKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCiAgKi8KIHB1YmxpYyBjbGFzcyBGbGF0dGVuZWRQcm9wZXJ0aWVzRmlsZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIFByb3BlcnRpZXNGaWxlQ29udGVudFByb3ZpZGVyIHsKIAotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IHN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7Ci0JCQlPYmplY3RbXSByZXR1cm5lZCA9IG5ldyBPYmplY3RbMF07Ci0JCQlmb3IgKE9iamVjdCBvYmplY3QgOiBlbGVtZW50cykgewotCQkJCU9iamVjdFtdIGZpbGVTZWxlY3Rpb24gPSBzdXBlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCQkJCXJldHVybmVkID0gQXJyYXlVdGlscy5hZGRBbGwocmV0dXJuZWQsIGZpbGVTZWxlY3Rpb24pOwotCQkJfQotCQkJcmV0dXJuIHJldHVybmVkOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRFbGVtZW50cyhpbnB1dEVsZW1lbnQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgeworICAgICAgICAgICAgT2JqZWN0W10gZWxlbWVudHMgPSBzdXBlci5nZXRFbGVtZW50cyhpbnB1dEVsZW1lbnQpOworICAgICAgICAgICAgT2JqZWN0W10gcmV0dXJuZWQgPSBuZXcgT2JqZWN0WzBdOworICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogZWxlbWVudHMpIHsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSBmaWxlU2VsZWN0aW9uID0gc3VwZXIuZ2V0RWxlbWVudHMob2JqZWN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm5lZCA9IEFycmF5VXRpbHMuYWRkQWxsKHJldHVybmVkLCBmaWxlU2VsZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXR1cm5lZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KTsKKyAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9HZW5lcmljVHJlZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL0dlbmVyaWNUcmVlUHJvdmlkZXIuamF2YQppbmRleCAzZWU1YTg0Li44YWU5MDBiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL0dlbmVyaWNUcmVlUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL0dlbmVyaWNUcmVlUHJvdmlkZXIuamF2YQpAQCAtMTgsNTkgKzE4LDU5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CiAKIC8qKgotICogCisgKgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKLSAqIAorICoKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyaWNUcmVlUHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudDsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gbmV3IE9iamVjdFtdIHt9OwotCQkJZm9yIChPYmplY3Qgb2JqZWN0IDogY29sbGVjdGlvbikgewotCQkJCWVsZW1lbnRzID0gQXJyYXlVdGlscy5hZGRBbGwoZWxlbWVudHMsIGdldEVsZW1lbnRzKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnRzOwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbikgeworICAgICAgICAgICAgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudDsKKyAgICAgICAgICAgIE9iamVjdFtdIGVsZW1lbnRzID0gbmV3IE9iamVjdFtdIHt9OworICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogY29sbGVjdGlvbikgeworICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gQXJyYXlVdGlscy5hZGRBbGwoZWxlbWVudHMsIGdldEVsZW1lbnRzKG9iamVjdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LAorICAgICAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRzKHBhcmVudEVsZW1lbnQpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRzKHBhcmVudEVsZW1lbnQpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvSW5zdGFsbGVkQnVuZGxlc0FuZExpYnJhcmllc0NvbnRlbnRQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9JbnN0YWxsZWRCdW5kbGVzQW5kTGlicmFyaWVzQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggNjFlM2I0Zi4uMmZjNzYxMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9JbnN0YWxsZWRCdW5kbGVzQW5kTGlicmFyaWVzQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9JbnN0YWxsZWRCdW5kbGVzQW5kTGlicmFyaWVzQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvdmlkZXJzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvamVjdHMuSVNlcnZlclByb2plY3RDb250YWluZXI7CkBAIC0xNSwzMCArMTYsMzAgQEAKIAogLyoqCiAgKiBDb21tb24gY29udGVudCBwcm92aWRlciBmb3IgcmVwb3NpdG9yeSBpbnN0YWxsYXRpb24gbm9kZXMuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgogICovCiBwdWJsaWMgY2xhc3MgSW5zdGFsbGVkQnVuZGxlc0FuZExpYnJhcmllc0NvbnRlbnRQcm92aWRlciBleHRlbmRzIFJ1bnRpbWVDb250YWluZXJzQ29udGVudFByb3ZpZGVyIHsKIAotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IExpYnJhcmllc05vZGUoKElTZXJ2ZXIpIGlucHV0RWxlbWVudCkgfTsKLQkJfQotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgTGlicmFyaWVzTm9kZSkgewotCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKCgoTGlicmFyaWVzTm9kZSkgaW5wdXRFbGVtZW50KS5nZXRTZXJ2ZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CisgICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFtdIHsgbmV3IExpYnJhcmllc05vZGUoKElTZXJ2ZXIpIGlucHV0RWxlbWVudCkgfTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgTGlicmFyaWVzTm9kZSkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKCgoTGlicmFyaWVzTm9kZSkgaW5wdXRFbGVtZW50KS5nZXRTZXJ2ZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaWJyYXJpZXNOb2RlKSB7Ci0JCQlyZXR1cm4gKChMaWJyYXJpZXNOb2RlKSBlbGVtZW50KS5nZXRTZXJ2ZXIoKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSB7Ci0JCQlyZXR1cm4gbmV3IExpYnJhcmllc05vZGUoKChJU2VydmVyUHJvamVjdENvbnRhaW5lcikgZWxlbWVudCkuZ2V0U2VydmVyKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlicmFyaWVzTm9kZSkgeworICAgICAgICAgICAgcmV0dXJuICgoTGlicmFyaWVzTm9kZSkgZWxlbWVudCkuZ2V0U2VydmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyUHJvamVjdENvbnRhaW5lcikgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMaWJyYXJpZXNOb2RlKCgoSVNlcnZlclByb2plY3RDb250YWluZXIpIGVsZW1lbnQpLmdldFNlcnZlcigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UGFyZW50KGVsZW1lbnQpOworICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL0xpYnJhcmllc05vZGUuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvTGlicmFyaWVzTm9kZS5qYXZhCmluZGV4IDc1MWU0ZTguLjNiYmZhODkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvTGlicmFyaWVzTm9kZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvTGlicmFyaWVzTm9kZS5qYXZhCkBAIC0xNiwyNyArMTYsMjggQEAKIC8qKgogICogUmVwcmVzZW50cyBhIG5vZGUgKG1heSBvciBtYXkgbm90IGJlIGV4cHJlc3NlZCBkaXJlY3RseSBpbiB0cmVlKSB0byByZXByZXNlbnQgYWxsIGxpYnJhcmllcyAoZS5nLiBub3Qgb24gYQogICogcGVyLXJlcG9zaXRvcnkgYmFzaXMpIHdpdGhpbiBhIGdpdmVuIHNlcnZlciBpbnN0YWxsYXRpb24uCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgotICogCisgKgogICovCiBwdWJsaWMgY2xhc3MgTGlicmFyaWVzTm9kZSB7Ci0JcHJpdmF0ZSBmaW5hbCBJU2VydmVyIHNlcnZlcjsKIAotCXB1YmxpYyBMaWJyYXJpZXNOb2RlKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2VydmVyID0gc2VydmVyOwotCX0KKyAgICBwcml2YXRlIGZpbmFsIElTZXJ2ZXIgc2VydmVyOwogCi0JcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gc2VydmVyOwotCX0KKyAgICBwdWJsaWMgTGlicmFyaWVzTm9kZShJU2VydmVyIHNlcnZlcikgeworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQlyZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBMaWJyYXJpZXNOb2RlICYmICgoTGlicmFyaWVzTm9kZSkgb3RoZXIpLnNlcnZlci5lcXVhbHMoc2VydmVyKTsKLQl9CisgICAgcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgcmV0dXJuIG90aGVyIGluc3RhbmNlb2YgTGlicmFyaWVzTm9kZSAmJiAoKExpYnJhcmllc05vZGUpIG90aGVyKS5zZXJ2ZXIuZXF1YWxzKHRoaXMuc2VydmVyKTsKKyAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9Mb2dGaWxlQ29udGVudFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL0xvZ0ZpbGVDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCBiZDkzY2ZlLi44YzEwNzNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL0xvZ0ZpbGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL0xvZ0ZpbGVDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMTcsNTIgKzE3LDUyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CiAKIC8qKgotICogCisgKgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKLSAqIAorICoKICAqLwogcHVibGljIGNsYXNzIExvZ0ZpbGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBTZXJ2ZXJGaWxlQ29udGVudFByb3ZpZGVyIHsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gTE9HX0lOQ0xVREVfRVhUUyA9IG5ldyBTdHJpbmdbXSB7ICJsb2ciIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMT0dfSU5DTFVERV9FWFRTID0gbmV3IFN0cmluZ1tdIHsgImxvZyIgfTsKIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvdmlkZXJzLlNlcnZlckZpbGVDb250ZW50UHJvdmlkZXIjZ2V0U2VydmVyRGlyZWN0b3JpZXMob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZ1tdIGdldFNlcnZlckRpcmVjdG9yaWVzKElTZXJ2ZXIgc2VydmVyKSB7Ci0JCUlTZXJ2ZXJSdW50aW1lUHJvdmlkZXIgcHJvdmlkZXIgPSBSdW50aW1lUHJvdmlkZXJzLmdldFJ1bnRpbWVQcm92aWRlcihzZXJ2ZXIuZ2V0UnVudGltZSgpKTsKLQkJcmV0dXJuIHByb3ZpZGVyLmdldFNlcnZlckxvZ0RpcmVjdG9yaWVzKCk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvdmlkZXJzLlNlcnZlckZpbGVDb250ZW50UHJvdmlkZXIjZ2V0U2VydmVyRGlyZWN0b3JpZXMob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZlckRpcmVjdG9yaWVzKElTZXJ2ZXIgc2VydmVyKSB7CisgICAgICAgIElTZXJ2ZXJSdW50aW1lUHJvdmlkZXIgcHJvdmlkZXIgPSBSdW50aW1lUHJvdmlkZXJzLmdldFJ1bnRpbWVQcm92aWRlcihzZXJ2ZXIuZ2V0UnVudGltZSgpKTsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmdldFNlcnZlckxvZ0RpcmVjdG9yaWVzKCk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm92aWRlcnMuU2VydmVyRmlsZUNvbnRlbnRQcm92aWRlciNnZXRCYXNlRGlyZWN0b3J5KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBTZXJ2ZXJQcm9qZWN0LkxPR19XT1JLU1BBQ0VfRElSOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb3ZpZGVycy5TZXJ2ZXJGaWxlQ29udGVudFByb3ZpZGVyI2dldEJhc2VEaXJlY3RvcnkoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZURpcmVjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIFNlcnZlclByb2plY3QuTE9HX1dPUktTUEFDRV9ESVI7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm92aWRlcnMuU2VydmVyRmlsZUNvbnRlbnRQcm92aWRlciNnZXRJbmNsdWRlRXh0ZW5zaW9ucygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gTE9HX0lOQ0xVREVfRVhUUzsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm92aWRlcnMuU2VydmVyRmlsZUNvbnRlbnRQcm92aWRlciNnZXRJbmNsdWRlRXh0ZW5zaW9ucygpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVFeHRlbnNpb25zKCkgeworICAgICAgICByZXR1cm4gTE9HX0lOQ0xVREVfRVhUUzsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb3ZpZGVycy5TZXJ2ZXJGaWxlQ29udGVudFByb3ZpZGVyI2dldEV4Y2x1ZGVFeHRlbnNpb25zKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZUV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb3ZpZGVycy5TZXJ2ZXJGaWxlQ29udGVudFByb3ZpZGVyI2dldEV4Y2x1ZGVFeHRlbnNpb25zKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZUV4dGVuc2lvbnMoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvdmlkZXJzLlNlcnZlckZpbGVDb250ZW50UHJvdmlkZXIjaXNJbmNsdWRlTm9FeHRlbnNpb24oKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSW5jbHVkZU5vRXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvdmlkZXJzLlNlcnZlckZpbGVDb250ZW50UHJvdmlkZXIjaXNJbmNsdWRlTm9FeHRlbnNpb24oKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZU5vRXh0ZW5zaW9uKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9Qcm9wZXJ0aWVzRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9Qcm9wZXJ0aWVzRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDhhZjBkMWQuLjQ5M2EzNjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvUHJvcGVydGllc0ZpbGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1Byb3BlcnRpZXNGaWxlQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvdmlkZXJzOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKQEAgLTI2LDExNyArMjcsMTEzIEBACiAKIC8qKgogICogQ29tbW9uIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHZpZXdzIG9uIHNlcnZlciBjb250ZW50LgotICogCisgKgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKICAqLwogcHVibGljIGNsYXNzIFByb3BlcnRpZXNGaWxlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgU2VydmVyRmlsZUNvbnRlbnRQcm92aWRlciB7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0VYVCA9ICJwcm9wZXJ0aWVzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0VYVCA9ICJwcm9wZXJ0aWVzIjsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPUEVSVElFU19JTkNMVURFX0VYVFMgPSBudWxsOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPUEVSVElFU19JTkNMVURFX0VYVFMgPSBudWxsOwogCi0JLy9TaG91bGQgYmUgbnVsbCBvciBzaG91bGQgd2UgaGlkZSB4bWwsIGV0Yz8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBST1BFUlRJRVNfRVhDTFVERV9FWFRTID0gbmV3IFN0cmluZ1tdIHsgImphciIsICJwbGFuIiwgImxpYmQiIH07CisgICAgLy8gU2hvdWxkIGJlIG51bGwgb3Igc2hvdWxkIHdlIGhpZGUgeG1sLCBldGM/CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUk9QRVJUSUVTX0VYQ0xVREVfRVhUUyA9IG5ldyBTdHJpbmdbXSB7ICJqYXIiLCAicGxhbiIsICJsaWJkIiB9OwogCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlckZpbGUgJiYgIShpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJGaWxlU2VsZWN0aW9uKSkgewotCQkJU2VydmVyRmlsZSBzZXJ2ZXJGaWxlID0gKFNlcnZlckZpbGUpIGlucHV0RWxlbWVudDsKLQkJCUlGaWxlIGZpbGUgPSBzZXJ2ZXJGaWxlLmdldEZpbGUoKTsKLQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwKLQkJCQkJJiYgZmlsZS5nZXRMb2NhdGlvbigpLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoUFJPUEVSVElFU19FWFQpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIG9zU3RyaW5nID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCQkJQnVmZmVyZWRSZWFkZXIgYnVmZmVyZWRSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIob3NTdHJpbmcpKTsKLQkJCQkJTGlzdDxTZXJ2ZXJGaWxlU2VsZWN0aW9uPiBsaW5lcyA9IG5ldyBBcnJheUxpc3Q8U2VydmVyRmlsZVNlbGVjdGlvbj4oKTsKLQkJCQkJU3RyaW5nIHJlYWRMaW5lID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJaW50IG9mZnNldCA9IDA7Ci0JCQkJCXdoaWxlIChyZWFkTGluZSAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgcG9zRXF1YWxzID0gcmVhZExpbmUuaW5kZXhPZigiPSIpICsgMTsKLQkJCQkJCWlmIChyZWFkTGluZS5lbmRzV2l0aCgiXFwiKSkgewotCQkJCQkJCVN0cmluZyBuZXh0TGluZSA9IGJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJCQkJaW50IGxpbmVDb3VudCA9IDE7Ci0JCQkJCQkJd2hpbGUgKG5leHRMaW5lLmVuZHNXaXRoKCJcXCIpKSB7Ci0JCQkJCQkJCXJlYWRMaW5lICs9IG5leHRMaW5lOwotCQkJCQkJCQluZXh0TGluZSA9IGJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJCQkJCWxpbmVDb3VudCsrOwotCQkJCQkJCX0KLQkJCQkJCQlyZWFkTGluZSArPSBuZXh0TGluZTsKLQkJCQkJCQlTdHJpbmcgY2xlYW5MaW5lID0gcmVhZExpbmUucmVwbGFjZUFsbCgiXFxcXCIsICIiKTsKLQkJCQkJCQlTZXJ2ZXJGaWxlU2VsZWN0aW9uIHNlcnZlckZpbGVTZWxlY3Rpb24gPSBuZXcgU2VydmVyRmlsZVNlbGVjdGlvbihzZXJ2ZXJGaWxlLmdldFNlcnZlcigpLAotCQkJCQkJCQkJZmlsZSwgY2xlYW5MaW5lLCBvZmZzZXQgKyBwb3NFcXVhbHMsIHJlYWRMaW5lLmxlbmd0aCgpICsgbGluZUNvdW50IC0gcG9zRXF1YWxzLAotCQkJCQkJCQkJbGluZXMuc2l6ZSgpICsgMSk7Ci0JCQkJCQkJbGluZXMuYWRkKHNlcnZlckZpbGVTZWxlY3Rpb24pOwotCQkJCQkJCW9mZnNldCArPSBsaW5lQ291bnQ7Ci0JCQkJCQl9IGVsc2UgaWYgKCFyZWFkTGluZS5zdGFydHNXaXRoKCIjIikgJiYgIVN0cmluZ1V0aWxzLmlzQmxhbmsocmVhZExpbmUpCi0JCQkJCQkJCSYmICFyZWFkTGluZS5lbmRzV2l0aCgiXFwiKSkgewotCQkJCQkJCVNlcnZlckZpbGVTZWxlY3Rpb24gc2VydmVyRmlsZVNlbGVjdGlvbiA9IG5ldyBTZXJ2ZXJGaWxlU2VsZWN0aW9uKHNlcnZlckZpbGUuZ2V0U2VydmVyKCksCi0JCQkJCQkJCQlmaWxlLCByZWFkTGluZSwgb2Zmc2V0ICsgcG9zRXF1YWxzLCByZWFkTGluZS5sZW5ndGgoKSAtIHBvc0VxdWFscywgbGluZXMuc2l6ZSgpICsgMSk7Ci0JCQkJCQkJbGluZXMuYWRkKHNlcnZlckZpbGVTZWxlY3Rpb24pOwotCQkJCQkJfQotCQkJCQkJb2Zmc2V0ICs9IHJlYWRMaW5lLmxlbmd0aCgpICsgMTsKLQkJCQkJCXJlYWRMaW5lID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJfQotCQkJCQlidWZmZXJlZFJlYWRlci5jbG9zZSgpOwotCQkJCQlyZXR1cm4gbGluZXMudG9BcnJheSgpOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vZG9uJ3QgcmVhbGx5IGNhcmUKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vZG9uJ3QgcmVhbGx5IGNhcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CisgICAgICAgIGlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJGaWxlICYmICEoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgU2VydmVyRmlsZVNlbGVjdGlvbikpIHsKKyAgICAgICAgICAgIFNlcnZlckZpbGUgc2VydmVyRmlsZSA9IChTZXJ2ZXJGaWxlKSBpbnB1dEVsZW1lbnQ7CisgICAgICAgICAgICBJRmlsZSBmaWxlID0gc2VydmVyRmlsZS5nZXRGaWxlKCk7CisgICAgICAgICAgICBpZiAoZmlsZS5nZXRMb2NhdGlvbigpLmdldEZpbGVFeHRlbnNpb24oKSAhPSBudWxsICYmIGZpbGUuZ2V0TG9jYXRpb24oKS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFBST1BFUlRJRVNfRVhUKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvc1N0cmluZyA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKG9zU3RyaW5nKSk7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8U2VydmVyRmlsZVNlbGVjdGlvbj4gbGluZXMgPSBuZXcgQXJyYXlMaXN0PFNlcnZlckZpbGVTZWxlY3Rpb24+KCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWFkTGluZSA9IGJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZExpbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc0VxdWFscyA9IHJlYWRMaW5lLmluZGV4T2YoIj0iKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZExpbmUuZW5kc1dpdGgoIlxcIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmV4dExpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lQ291bnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0TGluZS5lbmRzV2l0aCgiXFwiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkTGluZSArPSBuZXh0TGluZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExpbmUgPSBidWZmZXJlZFJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZExpbmUgKz0gbmV4dExpbmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsZWFuTGluZSA9IHJlYWRMaW5lLnJlcGxhY2VBbGwoIlxcXFwiLCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyRmlsZVNlbGVjdGlvbiBzZXJ2ZXJGaWxlU2VsZWN0aW9uID0gbmV3IFNlcnZlckZpbGVTZWxlY3Rpb24oc2VydmVyRmlsZS5nZXRTZXJ2ZXIoKSwgZmlsZSwgY2xlYW5MaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKyBwb3NFcXVhbHMsIHJlYWRMaW5lLmxlbmd0aCgpICsgbGluZUNvdW50IC0gcG9zRXF1YWxzLCBsaW5lcy5zaXplKCkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5hZGQoc2VydmVyRmlsZVNlbGVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGxpbmVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlYWRMaW5lLnN0YXJ0c1dpdGgoIiMiKSAmJiAhU3RyaW5nVXRpbHMuaXNCbGFuayhyZWFkTGluZSkgJiYgIXJlYWRMaW5lLmVuZHNXaXRoKCJcXCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyRmlsZVNlbGVjdGlvbiBzZXJ2ZXJGaWxlU2VsZWN0aW9uID0gbmV3IFNlcnZlckZpbGVTZWxlY3Rpb24oc2VydmVyRmlsZS5nZXRTZXJ2ZXIoKSwgZmlsZSwgcmVhZExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArIHBvc0VxdWFscywgcmVhZExpbmUubGVuZ3RoKCkgLSBwb3NFcXVhbHMsIGxpbmVzLnNpemUoKSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFkZChzZXJ2ZXJGaWxlU2VsZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSByZWFkTGluZS5sZW5ndGgoKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkTGluZSA9IGJ1ZmZlcmVkUmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWRSZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVzLnRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCByZWFsbHkgY2FyZQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmVhbGx5IGNhcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJGaWxlICYmICEoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlckZpbGVTZWxlY3Rpb24pKSB7Ci0JCQlJRmlsZSBmaWxlID0gKChTZXJ2ZXJGaWxlKSBlbGVtZW50KS5maWxlOwotCQkJcmV0dXJuIGZpbGUuZ2V0TG9jYXRpb24oKS5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbAotCQkJCQkmJiBmaWxlLmdldExvY2F0aW9uKCkuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhQUk9QRVJUSUVTX0VYVCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgeworICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlckZpbGUgJiYgIShlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyRmlsZVNlbGVjdGlvbikpIHsKKyAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoKFNlcnZlckZpbGUpIGVsZW1lbnQpLmZpbGU7CisgICAgICAgICAgICByZXR1cm4gZmlsZS5nZXRMb2NhdGlvbigpLmdldEZpbGVFeHRlbnNpb24oKSAhPSBudWxsICYmIGZpbGUuZ2V0TG9jYXRpb24oKS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFBST1BFUlRJRVNfRVhUKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm92aWRlcnMuU2VydmVyRmlsZUNvbnRlbnRQcm92aWRlciNnZXRTZXJ2ZXJEaXJlY3RvcmllcyhvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nW10gZ2V0U2VydmVyRGlyZWN0b3JpZXMoSVNlcnZlciBzZXJ2ZXIpIHsKLQkJSVNlcnZlclJ1bnRpbWVQcm92aWRlciBwcm92aWRlciA9IFJ1bnRpbWVQcm92aWRlcnMuZ2V0UnVudGltZVByb3ZpZGVyKHNlcnZlci5nZXRSdW50aW1lKCkpOwotCQlyZXR1cm4gcHJvdmlkZXIuZ2V0U2VydmVyUHJvcGVydGllc0RpcmVjdG9yaWVzKCk7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvdmlkZXJzLlNlcnZlckZpbGVDb250ZW50UHJvdmlkZXIjZ2V0U2VydmVyRGlyZWN0b3JpZXMob3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXIpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZ1tdIGdldFNlcnZlckRpcmVjdG9yaWVzKElTZXJ2ZXIgc2VydmVyKSB7CisgICAgICAgIElTZXJ2ZXJSdW50aW1lUHJvdmlkZXIgcHJvdmlkZXIgPSBSdW50aW1lUHJvdmlkZXJzLmdldFJ1bnRpbWVQcm92aWRlcihzZXJ2ZXIuZ2V0UnVudGltZSgpKTsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmdldFNlcnZlclByb3BlcnRpZXNEaXJlY3RvcmllcygpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvdmlkZXJzLlNlcnZlckZpbGVDb250ZW50UHJvdmlkZXIjZ2V0QmFzZURpcmVjdG9yeSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRCYXNlRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gU2VydmVyUHJvamVjdC5QUk9QRVJUSUVTX0RJUjsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm92aWRlcnMuU2VydmVyRmlsZUNvbnRlbnRQcm92aWRlciNnZXRCYXNlRGlyZWN0b3J5KCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VEaXJlY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBTZXJ2ZXJQcm9qZWN0LlBST1BFUlRJRVNfRElSOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvdmlkZXJzLlNlcnZlckZpbGVDb250ZW50UHJvdmlkZXIjZ2V0SW5jbHVkZUV4dGVuc2lvbnMoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmdbXSBnZXRJbmNsdWRlRXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIFBST1BFUlRJRVNfSU5DTFVERV9FWFRTOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb3ZpZGVycy5TZXJ2ZXJGaWxlQ29udGVudFByb3ZpZGVyI2dldEluY2x1ZGVFeHRlbnNpb25zKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZUV4dGVuc2lvbnMoKSB7CisgICAgICAgIHJldHVybiBQUk9QRVJUSUVTX0lOQ0xVREVfRVhUUzsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb3ZpZGVycy5TZXJ2ZXJGaWxlQ29udGVudFByb3ZpZGVyI2dldEV4Y2x1ZGVFeHRlbnNpb25zKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZUV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBQUk9QRVJUSUVTX0VYQ0xVREVfRVhUUzsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm92aWRlcnMuU2VydmVyRmlsZUNvbnRlbnRQcm92aWRlciNnZXRFeGNsdWRlRXh0ZW5zaW9ucygpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVFeHRlbnNpb25zKCkgeworICAgICAgICByZXR1cm4gUFJPUEVSVElFU19FWENMVURFX0VYVFM7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm92aWRlcnMuU2VydmVyRmlsZUNvbnRlbnRQcm92aWRlciNpc0luY2x1ZGVOb0V4dGVuc2lvbigpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlTm9FeHRlbnNpb24oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm92aWRlcnMuU2VydmVyRmlsZUNvbnRlbnRQcm92aWRlciNpc0luY2x1ZGVOb0V4dGVuc2lvbigpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlTm9FeHRlbnNpb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9SZXBvc2l0b3J5Q29udGVudFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1JlcG9zaXRvcnlDb250ZW50UHJvdmlkZXIuamF2YQppbmRleCAyZDU5YTFlLi4xZGE3NDk4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1JlcG9zaXRvcnlDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1JlcG9zaXRvcnlDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm92aWRlcnM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0zMCw3NyArMzEsNzcgQEAKIC8qKgogICogQ29tbW9uIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHJlcG9zaXRvcnkgaW5zdGFsbGF0aW9uIG5vZGVzLiAoTm90IGN1cnJlbnRseSB1c2VkLCBidXQgY291bGQgYmUgdXNlZCBpbiBjYXNlcyB3aGVyZSB3ZQogICogZG9uJ3Qgd2FudCB0byBjcmVhdGUgc2VydmVyIHNpZGUgcHJvamVjdHMuKQotICogCisgKgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICovCiBwdWJsaWMgY2xhc3MgUmVwb3NpdG9yeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKIAotCXByaXZhdGUgQXJ0ZWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnk7CisgICAgcHJpdmF0ZSBBcnRlZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeTsKIAotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBpbnB1dEVsZW1lbnQ7Ci0JCQlyZXBvc2l0b3J5ID0gUmVwb3NpdG9yeVV0aWxzLmdldFJlcG9zaXRvcnlDb250ZW50cyhzZXJ2ZXIuZ2V0UnVudGltZSgpKTsKLQkJCXJlcG9zaXRvcnkuc2V0U2VydmVyKHNlcnZlcik7Ci0JCQlMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCU1hcDxGaWxlLCBBcnRlZmFjdFJlcG9zaXRvcnk+IHNldEZvckZpbGUgPSBuZXcgSGFzaE1hcDxGaWxlLCBBcnRlZmFjdFJlcG9zaXRvcnk+KCk7CisgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKyAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKKyAgICAgICAgICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGlucHV0RWxlbWVudDsKKyAgICAgICAgICAgIHRoaXMucmVwb3NpdG9yeSA9IFJlcG9zaXRvcnlVdGlscy5nZXRSZXBvc2l0b3J5Q29udGVudHMoc2VydmVyLmdldFJ1bnRpbWUoKSk7CisgICAgICAgICAgICB0aGlzLnJlcG9zaXRvcnkuc2V0U2VydmVyKHNlcnZlcik7CisgICAgICAgICAgICBMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgICAgIE1hcDxGaWxlLCBBcnRlZmFjdFJlcG9zaXRvcnk+IHNldEZvckZpbGUgPSBuZXcgSGFzaE1hcDxGaWxlLCBBcnRlZmFjdFJlcG9zaXRvcnk+KCk7CiAKLQkJCWZvciAoSUFydGVmYWN0IGJ1bmRsZSA6IHJlcG9zaXRvcnkuZ2V0QWxsQXJ0ZWZhY3RzKCkuZ2V0QXJ0ZWZhY3RzKCkpIHsKLQkJCQlpZiAoYnVuZGxlIGluc3RhbmNlb2YgSUxvY2FsQXJ0ZWZhY3QpIHsKLQkJCQkJRmlsZSBmaWxlID0gKChJTG9jYWxBcnRlZmFjdCkgYnVuZGxlKS5nZXRGaWxlKCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQlpZiAoZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0TmFtZSgpLmVxdWFscygic3Vic3lzdGVtcyIpKSB7Ci0JCQkJCQlmaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHNldEZvckZpbGUuY29udGFpbnNLZXkoZmlsZSkpIHsKLQkJCQkJCXNldEZvckZpbGUuZ2V0KGZpbGUpLmFkZChidW5kbGUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJQXJ0ZWZhY3RSZXBvc2l0b3J5IGxvY2FsUmVwb3NpdG9yeSA9IG5ldyBMb2NhbEFydGVmYWN0UmVwb3NpdG9yeShmaWxlKTsKLQkJCQkJCWxvY2FsUmVwb3NpdG9yeS5zZXRTZXJ2ZXIoc2VydmVyKTsKLQkJCQkJCWxvY2FsUmVwb3NpdG9yeS5hZGQoYnVuZGxlKTsKLQkJCQkJCXNldEZvckZpbGUucHV0KGZpbGUsIGxvY2FsUmVwb3NpdG9yeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKEFydGVmYWN0UmVwb3NpdG9yeSByZXBvcyA6IHNldEZvckZpbGUudmFsdWVzKCkpIHsKLQkJCQlpZiAocmVwb3MuZ2V0QnVuZGxlU2V0KCkuZ2V0QXJ0ZWZhY3RzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKHJlcG9zLmdldEJ1bmRsZVNldCgpKTsKLQkJCQl9Ci0JCQkJaWYgKHJlcG9zLmdldExpYnJhcnlTZXQoKS5nZXRBcnRlZmFjdHMoKS5pdGVyYXRvcigpLmhhc05leHQoKSkgewotCQkJCQljaGlsZHJlbi5hZGQocmVwb3MuZ2V0TGlicmFyeVNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KKyAgICAgICAgICAgIGZvciAoSUFydGVmYWN0IGJ1bmRsZSA6IHRoaXMucmVwb3NpdG9yeS5nZXRBbGxBcnRlZmFjdHMoKS5nZXRBcnRlZmFjdHMoKSkgeworICAgICAgICAgICAgICAgIGlmIChidW5kbGUgaW5zdGFuY2VvZiBJTG9jYWxBcnRlZmFjdCkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSAoKElMb2NhbEFydGVmYWN0KSBidW5kbGUpLmdldEZpbGUoKS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmdldFBhcmVudEZpbGUoKS5nZXROYW1lKCkuZXF1YWxzKCJzdWJzeXN0ZW1zIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc2V0Rm9yRmlsZS5jb250YWluc0tleShmaWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9yRmlsZS5nZXQoZmlsZSkuYWRkKGJ1bmRsZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnRlZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5ID0gbmV3IExvY2FsQXJ0ZWZhY3RSZXBvc2l0b3J5KGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxSZXBvc2l0b3J5LnNldFNlcnZlcihzZXJ2ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxSZXBvc2l0b3J5LmFkZChidW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0Rm9yRmlsZS5wdXQoZmlsZSwgbG9jYWxSZXBvc2l0b3J5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoQXJ0ZWZhY3RSZXBvc2l0b3J5IHJlcG9zIDogc2V0Rm9yRmlsZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgIGlmIChyZXBvcy5nZXRCdW5kbGVTZXQoKS5nZXRBcnRlZmFjdHMoKS5pdGVyYXRvcigpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQocmVwb3MuZ2V0QnVuZGxlU2V0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmVwb3MuZ2V0TGlicmFyeVNldCgpLmdldEFydGVmYWN0cygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFkZChyZXBvcy5nZXRMaWJyYXJ5U2V0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07CisgICAgfQogCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQXJ0ZWZhY3RTZXQpIHsKLQkJCXJldHVybiAoKEFydGVmYWN0U2V0KSBwYXJlbnRFbGVtZW50KS50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQorICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgeworICAgICAgICBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEFydGVmYWN0U2V0KSB7CisgICAgICAgICAgICByZXR1cm4gKChBcnRlZmFjdFNldCkgcGFyZW50RWxlbWVudCkudG9BcnJheSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOworICAgIH0KIAotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0ZWZhY3QpIHsKLQkJCUFydGVmYWN0IGFydGVmYWN0ID0gKEFydGVmYWN0KSBlbGVtZW50OwotCQkJcmV0dXJuIGFydGVmYWN0LmdldFNldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgeworICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFydGVmYWN0KSB7CisgICAgICAgICAgICBBcnRlZmFjdCBhcnRlZmFjdCA9IChBcnRlZmFjdCkgZWxlbWVudDsKKyAgICAgICAgICAgIHJldHVybiBhcnRlZmFjdC5nZXRTZXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQl9CisgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7CisgICAgfQogCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9CisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQl9CisgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisgICAgfQogCi0JcHVibGljIEFydGVmYWN0UmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgewotCQlyZXR1cm4gcmVwb3NpdG9yeTsKLQl9CisgICAgcHVibGljIEFydGVmYWN0UmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZXBvc2l0b3J5OworICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1JlcG9zaXRvcnlQYWdlQ29udGVudFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1JlcG9zaXRvcnlQYWdlQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggNTBmZjNkMS4uYWM3MTFiOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9SZXBvc2l0b3J5UGFnZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvUmVwb3NpdG9yeVBhZ2VDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm92aWRlcnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5lZGl0b3IuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlOwpAQCAtMTUsMjUgKzE2LDI1IEBACiAKIC8qKgogICogQ29tbW9uIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHJlcG9zaXRvcnkgaW5zdGFsbGF0aW9uIG5vZGVzLgotICogCisgKgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKICAqLwogcHVibGljIGNsYXNzIFJlcG9zaXRvcnlQYWdlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgRmxhdHRlbmVkQXJ0ZWZhY3RzQ29udGVudFByb3ZpZGVyIHsKIAotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gKChSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2UpIGlucHV0RWxlbWVudCkuZ2V0U2VydmVyKCkuZ2V0T3JpZ2luYWwoKTsKLQkJCXJldHVybiBzdXBlci5nZXRFbGVtZW50cyhzZXJ2ZXIpOwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlKSB7CisgICAgICAgICAgICBJU2VydmVyIHNlcnZlciA9ICgoUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlKSBpbnB1dEVsZW1lbnQpLmdldFNlcnZlcigpLmdldE9yaWdpbmFsKCk7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RWxlbWVudHMoc2VydmVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIFJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZTsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBSZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2U7CisgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvUmVwb3NpdG9yeVNlYXJjaFJlc3VsdENvbnRlbnRQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9SZXBvc2l0b3J5U2VhcmNoUmVzdWx0Q29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggMzVmYjgyMi4uNzc1ODFmMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9SZXBvc2l0b3J5U2VhcmNoUmVzdWx0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9SZXBvc2l0b3J5U2VhcmNoUmVzdWx0Q29udGVudFByb3ZpZGVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvdmlkZXJzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKQEAgLTIxLDM3ICsyMiwzNyBAQAogICovCiBwdWJsaWMgY2xhc3MgUmVwb3NpdG9yeVNlYXJjaFJlc3VsdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKIAotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgfQogCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQXJ0ZWZhY3RTZXQpIHsKLQkJCUFydGVmYWN0U2V0IGFydGVmYWN0cyA9IChBcnRlZmFjdFNldCkgcGFyZW50RWxlbWVudDsKLQkJCXJldHVybiBhcnRlZmFjdHMudG9BcnJheSgpOwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKKyAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBBcnRlZmFjdFNldCkgeworICAgICAgICAgICAgQXJ0ZWZhY3RTZXQgYXJ0ZWZhY3RzID0gKEFydGVmYWN0U2V0KSBwYXJlbnRFbGVtZW50OworICAgICAgICAgICAgcmV0dXJuIGFydGVmYWN0cy50b0FycmF5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07CisgICAgfQogCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFydGVmYWN0UmVwb3NpdG9yeSkgewotCQkJQXJ0ZWZhY3RSZXBvc2l0b3J5IGFydGVmYWN0UmVwb3NpdG9yeSA9IChBcnRlZmFjdFJlcG9zaXRvcnkpIGlucHV0RWxlbWVudDsKLQkJCXJldHVybiBuZXcgT2JqZWN0W10geyBhcnRlZmFjdFJlcG9zaXRvcnkuZ2V0QnVuZGxlU2V0KCksIGFydGVmYWN0UmVwb3NpdG9yeS5nZXRMaWJyYXJ5U2V0KCkgfTsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9CisgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKyAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFydGVmYWN0UmVwb3NpdG9yeSkgeworICAgICAgICAgICAgQXJ0ZWZhY3RSZXBvc2l0b3J5IGFydGVmYWN0UmVwb3NpdG9yeSA9IChBcnRlZmFjdFJlcG9zaXRvcnkpIGlucHV0RWxlbWVudDsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W10geyBhcnRlZmFjdFJlcG9zaXRvcnkuZ2V0QnVuZGxlU2V0KCksIGFydGVmYWN0UmVwb3NpdG9yeS5nZXRMaWJyYXJ5U2V0KCkgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKKyAgICB9CiAKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFydGVmYWN0U2V0KSB7Ci0JCQlyZXR1cm4gKChBcnRlZmFjdFNldCkgZWxlbWVudCkuZ2V0UmVwb3NpdG9yeSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgeworICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFydGVmYWN0U2V0KSB7CisgICAgICAgICAgICByZXR1cm4gKChBcnRlZmFjdFNldCkgZWxlbWVudCkuZ2V0UmVwb3NpdG9yeSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotCX0KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQl9CisgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1J1bnRpbWVBY3Rpb25Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9SdW50aW1lQWN0aW9uUHJvdmlkZXIuamF2YQppbmRleCA3NmZhNWQ3Li5jM2JmNjE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1J1bnRpbWVBY3Rpb25Qcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvUnVudGltZUFjdGlvblByb3ZpZGVyLmphdmEKQEAgLTM0LDgzICszNCw4MyBAQAogLyoqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucyNPcGVuQWN0aW9uUHJvdmlkZXIKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCi0gKiAKKyAqCiAgKi8KIHB1YmxpYyBjbGFzcyBSdW50aW1lQWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25BY3Rpb25Qcm92aWRlciB7CiAKLQlwcml2YXRlIE9wZW5TZXJ2ZXJQcm9qZWN0RmlsZUFjdGlvbiBvcGVuRmlsZUFjdGlvbjsKKyAgICBwcml2YXRlIE9wZW5TZXJ2ZXJQcm9qZWN0RmlsZUFjdGlvbiBvcGVuRmlsZUFjdGlvbjsKIAotCXByaXZhdGUgSUNvbW1vblZpZXdlcldvcmtiZW5jaFNpdGUgdmlld1NpdGUgPSBudWxsOworICAgIHByaXZhdGUgSUNvbW1vblZpZXdlcldvcmtiZW5jaFNpdGUgdmlld1NpdGUgPSBudWxsOwogCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRyaWJ1dGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gY29udHJpYnV0ZSA9IGZhbHNlOwogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBhQ29uZmlnKSB7Ci0JCWlmIChhQ29uZmlnLmdldFZpZXdTaXRlKCkgaW5zdGFuY2VvZiBJQ29tbW9uVmlld2VyV29ya2JlbmNoU2l0ZSkgewotCQkJdmlld1NpdGUgPSAoSUNvbW1vblZpZXdlcldvcmtiZW5jaFNpdGUpIGFDb25maWcuZ2V0Vmlld1NpdGUoKTsKLQkJCW9wZW5GaWxlQWN0aW9uID0gbmV3IE9wZW5TZXJ2ZXJQcm9qZWN0RmlsZUFjdGlvbih2aWV3U2l0ZS5nZXRQYWdlKCkpOwotCQkJY29udHJpYnV0ZSA9IHRydWU7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZSBhQ29uZmlnKSB7CisgICAgICAgIGlmIChhQ29uZmlnLmdldFZpZXdTaXRlKCkgaW5zdGFuY2VvZiBJQ29tbW9uVmlld2VyV29ya2JlbmNoU2l0ZSkgeworICAgICAgICAgICAgdGhpcy52aWV3U2l0ZSA9IChJQ29tbW9uVmlld2VyV29ya2JlbmNoU2l0ZSkgYUNvbmZpZy5nZXRWaWV3U2l0ZSgpOworICAgICAgICAgICAgdGhpcy5vcGVuRmlsZUFjdGlvbiA9IG5ldyBPcGVuU2VydmVyUHJvamVjdEZpbGVBY3Rpb24odGhpcy52aWV3U2l0ZS5nZXRQYWdlKCkpOworICAgICAgICAgICAgdGhpcy5jb250cmlidXRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgYU1lbnUpIHsKLQkJaWYgKCFjb250cmlidXRlIHx8IGdldENvbnRleHQoKS5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgYU1lbnUpIHsKKyAgICAgICAgaWYgKCF0aGlzLmNvbnRyaWJ1dGUgfHwgZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpOwogCi0JCW9wZW5GaWxlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQkJaWYgKG9wZW5GaWxlQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQlhTWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBvcGVuRmlsZUFjdGlvbik7Ci0JCX0KLQkJYWRkT3BlbldpdGhNZW51KGFNZW51KTsKLQl9CisgICAgICAgIHRoaXMub3BlbkZpbGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOworICAgICAgICBpZiAodGhpcy5vcGVuRmlsZUFjdGlvbi5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgYU1lbnUuaW5zZXJ0QWZ0ZXIoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfT1BFTiwgdGhpcy5vcGVuRmlsZUFjdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgYWRkT3BlbldpdGhNZW51KGFNZW51KTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyB0aGVBY3Rpb25CYXJzKSB7Ci0JCWlmICghY29udHJpYnV0ZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlvcGVuRmlsZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCQl0aGVBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSUNvbW1vbkFjdGlvbkNvbnN0YW50cy5PUEVOLCBvcGVuRmlsZUFjdGlvbik7Ci0JCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyB0aGVBY3Rpb25CYXJzKSB7CisgICAgICAgIGlmICghdGhpcy5jb250cmlidXRlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgIGlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEgJiYgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgSUZpbGUpIHsKKyAgICAgICAgICAgIHRoaXMub3BlbkZpbGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOworICAgICAgICAgICAgdGhlQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElDb21tb25BY3Rpb25Db25zdGFudHMuT1BFTiwgdGhpcy5vcGVuRmlsZUFjdGlvbik7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgYWRkT3BlbldpdGhNZW51KElNZW51TWFuYWdlciBhTWVudSkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpOworICAgIHByaXZhdGUgdm9pZCBhZGRPcGVuV2l0aE1lbnUoSU1lbnVNYW5hZ2VyIGFNZW51KSB7CisgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCk7CiAKLQkJaWYgKHNzID09IG51bGwgfHwgc3Muc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybjsKLQkJfQorICAgICAgICBpZiAoc3MgPT0gbnVsbCB8fCBzcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJT2JqZWN0IG8gPSBzcy5nZXRGaXJzdEVsZW1lbnQoKTsKKyAgICAgICAgT2JqZWN0IG8gPSBzcy5nZXRGaXJzdEVsZW1lbnQoKTsKIAotCQkvLyBmaXJzdCB0cnkgSVJlc291cmNlCi0JCUlBZGFwdGFibGUgb3BlbmFibGUgPSAoSUFkYXB0YWJsZSkgQWRhcHRhYmlsaXR5VXRpbGl0eS5nZXRBZGFwdGVyKG8sIElSZXNvdXJjZS5jbGFzcyk7Ci0JCS8vIG90aGVyd2lzZSB0cnkgUmVzb3VyY2VNYXBwaW5nCi0JCWlmIChvcGVuYWJsZSA9PSBudWxsKSB7Ci0JCQlvcGVuYWJsZSA9IChJQWRhcHRhYmxlKSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIobywgUmVzb3VyY2VNYXBwaW5nLmNsYXNzKTsKLQkJfSBlbHNlIGlmICgoKElSZXNvdXJjZSkgb3BlbmFibGUpLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuRklMRSkgewotCQkJb3BlbmFibGUgPSBudWxsOwotCQl9CisgICAgICAgIC8vIGZpcnN0IHRyeSBJUmVzb3VyY2UKKyAgICAgICAgSUFkYXB0YWJsZSBvcGVuYWJsZSA9IChJQWRhcHRhYmxlKSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIobywgSVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgLy8gb3RoZXJ3aXNlIHRyeSBSZXNvdXJjZU1hcHBpbmcKKyAgICAgICAgaWYgKG9wZW5hYmxlID09IG51bGwpIHsKKyAgICAgICAgICAgIG9wZW5hYmxlID0gKElBZGFwdGFibGUpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcihvLCBSZXNvdXJjZU1hcHBpbmcuY2xhc3MpOworICAgICAgICB9IGVsc2UgaWYgKCgoSVJlc291cmNlKSBvcGVuYWJsZSkuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKSB7CisgICAgICAgICAgICBvcGVuYWJsZSA9IG51bGw7CisgICAgICAgIH0KIAotCQlpZiAob3BlbmFibGUgIT0gbnVsbCkgewotCQkJLy8gQ3JlYXRlIGEgbWVudSBmbHlvdXQuCi0JCQlJTWVudU1hbmFnZXIgc3VibWVudSA9IG5ldyBNZW51TWFuYWdlcihXb3JrYmVuY2hOYXZpZ2F0b3JNZXNzYWdlcy5PcGVuQWN0aW9uUHJvdmlkZXJfT3BlbldpdGhNZW51X2xhYmVsLAotCQkJCQlJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOX1dJVEgpOwotCQkJc3VibWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX1RPUCkpOwotCQkJc3VibWVudS5hZGQobmV3IE9wZW5XaXRoTWVudSh2aWV3U2l0ZS5nZXRQYWdlKCksIG9wZW5hYmxlKSk7Ci0JCQlzdWJtZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfQURESVRJT05TKSk7CisgICAgICAgIGlmIChvcGVuYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYSBtZW51IGZseW91dC4KKyAgICAgICAgICAgIElNZW51TWFuYWdlciBzdWJtZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFdvcmtiZW5jaE5hdmlnYXRvck1lc3NhZ2VzLk9wZW5BY3Rpb25Qcm92aWRlcl9PcGVuV2l0aE1lbnVfbGFiZWwsCisgICAgICAgICAgICAgICAgSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfT1BFTl9XSVRIKTsKKyAgICAgICAgICAgIHN1Ym1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9UT1ApKTsKKyAgICAgICAgICAgIHN1Ym1lbnUuYWRkKG5ldyBPcGVuV2l0aE1lbnUodGhpcy52aWV3U2l0ZS5nZXRQYWdlKCksIG9wZW5hYmxlKSk7CisgICAgICAgICAgICBzdWJtZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfQURESVRJT05TKSk7CiAKLQkJCS8vIEFkZCB0aGUgc3VibWVudS4KLQkJCWlmIChzdWJtZW51LmdldEl0ZW1zKCkubGVuZ3RoID4gMiAmJiBzdWJtZW51LmlzRW5hYmxlZCgpKSB7Ci0JCQkJYU1lbnUuYXBwZW5kVG9Hcm91cChJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOX1dJVEgsIHN1Ym1lbnUpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgLy8gQWRkIHRoZSBzdWJtZW51LgorICAgICAgICAgICAgaWYgKHN1Ym1lbnUuZ2V0SXRlbXMoKS5sZW5ndGggPiAyICYmIHN1Ym1lbnUuaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBhTWVudS5hcHBlbmRUb0dyb3VwKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX09QRU5fV0lUSCwgc3VibWVudSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1J1bnRpbWVDb250YWluZXJzQ29udGVudFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1J1bnRpbWVDb250YWluZXJzQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggOWZlYTkzYi4uMjVlZWE3YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9SdW50aW1lQ29udGFpbmVyc0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvUnVudGltZUNvbnRhaW5lcnNDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMjAsNTYgKzIwLDU2IEBACiAKIHB1YmxpYyBjbGFzcyBSdW50aW1lQ29udGFpbmVyc0NvbnRlbnRQcm92aWRlciBleHRlbmRzIEdlbmVyaWNUcmVlUHJvdmlkZXIgewogCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGlucHV0RWxlbWVudDsKLQkJCWlmIChTZXJ2ZXJQcm9qZWN0LmlzVmlyZ28oc2VydmVyKSkgewotCQkJCVNlcnZlclByb2plY3QgcHJvamVjdCA9IFNlcnZlclByb2plY3RNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UHJvamVjdChzZXJ2ZXIpOwotCQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHByb2plY3QuZ2V0QXJ0ZWZhY3RTZXRzKCkudG9BcnJheShuZXcgT2JqZWN0WzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSB7Ci0JCQlyZXR1cm4gKChJU2VydmVyUHJvamVjdENvbnRhaW5lcikgaW5wdXRFbGVtZW50KS5nZXRNZW1iZXJzKCk7Ci0JCX0KLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEFydGVmYWN0U2V0KSB7Ci0JCQlBcnRlZmFjdFNldCBhcnRlZmFjdFNldCA9IChBcnRlZmFjdFNldCkgaW5wdXRFbGVtZW50OwotCQkJSVNlcnZlciBzZXJ2ZXIgPSBhcnRlZmFjdFNldC5nZXRSZXBvc2l0b3J5KCkuZ2V0U2VydmVyKCk7Ci0JCQlTZXJ2ZXJQcm9qZWN0IHByb2plY3QgPSBTZXJ2ZXJQcm9qZWN0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb2plY3Qoc2VydmVyKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlJU2VydmVyUHJvamVjdENvbnRhaW5lciBjb250YWluZXIgPSBwcm9qZWN0LmdldENvbnRhaW5lcihhcnRlZmFjdFNldCk7Ci0JCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBjb250YWluZXIuZ2V0TWVtYmVycygpOwotCQkJCX0KLQkJCQlyZXR1cm4gYXJ0ZWZhY3RTZXQudG9BcnJheSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRFbGVtZW50cyhpbnB1dEVsZW1lbnQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgeworICAgICAgICAgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgaW5wdXRFbGVtZW50OworICAgICAgICAgICAgaWYgKFNlcnZlclByb2plY3QuaXNWaXJnbyhzZXJ2ZXIpKSB7CisgICAgICAgICAgICAgICAgU2VydmVyUHJvamVjdCBwcm9qZWN0ID0gU2VydmVyUHJvamVjdE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0KHNlcnZlcik7CisgICAgICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvamVjdC5nZXRBcnRlZmFjdFNldHMoKS50b0FycmF5KG5ldyBPYmplY3RbMF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclByb2plY3RDb250YWluZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoKElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSBpbnB1dEVsZW1lbnQpLmdldE1lbWJlcnMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQXJ0ZWZhY3RTZXQpIHsKKyAgICAgICAgICAgIEFydGVmYWN0U2V0IGFydGVmYWN0U2V0ID0gKEFydGVmYWN0U2V0KSBpbnB1dEVsZW1lbnQ7CisgICAgICAgICAgICBJU2VydmVyIHNlcnZlciA9IGFydGVmYWN0U2V0LmdldFJlcG9zaXRvcnkoKS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgICAgIFNlcnZlclByb2plY3QgcHJvamVjdCA9IFNlcnZlclByb2plY3RNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UHJvamVjdChzZXJ2ZXIpOworICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyIGNvbnRhaW5lciA9IHByb2plY3QuZ2V0Q29udGFpbmVyKGFydGVmYWN0U2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5nZXRNZW1iZXJzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBhcnRlZmFjdFNldC50b0FycmF5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyUHJvamVjdENvbnRhaW5lcikgewotCQkJcmV0dXJuICgoSVNlcnZlclByb2plY3RDb250YWluZXIpIGVsZW1lbnQpLmdldFNlcnZlcigpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclByb2plY3RBcnRlZmFjdCkgewotCQkJcmV0dXJuICgoSVNlcnZlclByb2plY3RBcnRlZmFjdCkgZWxlbWVudCkuZ2V0Q29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclByb2plY3RDb250YWluZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoKElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSBlbGVtZW50KS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QpIHsKKyAgICAgICAgICAgIHJldHVybiAoKElTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QpIGVsZW1lbnQpLmdldENvbnRhaW5lcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXB1YmxpYyBJU2VydmVyIGdldFNlcnZlcihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCXJldHVybiAoSVNlcnZlcikgZWxlbWVudDsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSB7Ci0JCQlyZXR1cm4gKChJU2VydmVyUHJvamVjdENvbnRhaW5lcikgZWxlbWVudCkuZ2V0U2VydmVyKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyUHJvamVjdEFydGVmYWN0KSB7Ci0JCQlyZXR1cm4gKChJU2VydmVyUHJvamVjdEFydGVmYWN0KSBlbGVtZW50KS5nZXRDb250YWluZXIoKS5nZXRTZXJ2ZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgcHVibGljIElTZXJ2ZXIgZ2V0U2VydmVyKE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgeworICAgICAgICAgICAgcmV0dXJuIChJU2VydmVyKSBlbGVtZW50OworICAgICAgICB9CisgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclByb2plY3RDb250YWluZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoKElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSBlbGVtZW50KS5nZXRTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QpIHsKKyAgICAgICAgICAgIHJldHVybiAoKElTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QpIGVsZW1lbnQpLmdldENvbnRhaW5lcigpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvUnVudGltZUZ1bGxMYWJlbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1J1bnRpbWVGdWxsTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IGEyYjdkNzguLjAxOWEzZTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvUnVudGltZUZ1bGxMYWJlbFByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9SdW50aW1lRnVsbExhYmVsUHJvdmlkZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5pbnRlcm5hbC51aS5wcm92aWRlcnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKQEAgLTI0LDQ0ICsyNSw0MSBAQAogICovCiBwdWJsaWMgY2xhc3MgUnVudGltZUZ1bGxMYWJlbFByb3ZpZGVyIGV4dGVuZHMgUnVudGltZUxhYmVsUHJvdmlkZXIgewogCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclByb2plY3RBcnRlZmFjdCkgewotCQkJcmV0dXJuIGdldFRleHQoKChJU2VydmVyUHJvamVjdEFydGVmYWN0KSBlbGVtZW50KS5nZXRDb250YWluZXIoKSkgKyAiIC0gIgotCQkJCQkrIGdldFRleHQoKChJU2VydmVyUHJvamVjdEFydGVmYWN0KSBlbGVtZW50KS5nZXRBcnRlZmFjdCgpKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSB7Ci0JCQlyZXR1cm4gZ2V0VGV4dCgoKElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSBlbGVtZW50KS5nZXRTZXJ2ZXIoKSkgKyAiIC0gIgotCQkJCQkrIGdldFRleHQoKChJU2VydmVyUHJvamVjdENvbnRhaW5lcikgZWxlbWVudCkuZ2V0QXJ0ZWZhY3RTZXQoKSk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaWJyYXJpZXNOb2RlKSB7Ci0JCQlyZXR1cm4gZ2V0VGV4dCgoKExpYnJhcmllc05vZGUpIGVsZW1lbnQpLmdldFNlcnZlcigpKSArICIgIgotCQkJCQkrIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9CdW5kbGVzQW5kTGlicmFyaWVzOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCXJldHVybiAoKElGaWxlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRlZmFjdFNldCkgewotCQkJQXJ0ZWZhY3RTZXQgc2V0ID0gKEFydGVmYWN0U2V0KSBlbGVtZW50OwotCQkJU3RyaW5nIGxhYmVsID0gc2V0LmdldEFydGVmYWN0VHlwZSgpLmdldFBsdXJhbExhYmVsKCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExvY2FsQXJ0ZWZhY3RTZXQpIHsKLQkJCQlsYWJlbCA9ICgoTG9jYWxBcnRlZmFjdFNldCkgZWxlbWVudCkuZ2V0UmVsYXRpdmVQYXRoKCkgKyAiIFsiICsgbGFiZWwgKyAiXSI7Ci0JCQl9Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBcnRlZmFjdCkgewotCQkJSUFydGVmYWN0IHZlcnNpb24gPSAoSUFydGVmYWN0KSBlbGVtZW50OwotCQkJU3RyaW5nQnVpbGRlciBsID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCWlmICh2ZXJzaW9uLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJbC5hcHBlbmQodmVyc2lvbi5nZXROYW1lKCkpOwotCQkJCWwuYXBwZW5kKCIgLSAiKTsKLQkJCX0KLQkJCWwuYXBwZW5kKHZlcnNpb24uZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJbC5hcHBlbmQoIiAoIik7Ci0JCQlsLmFwcGVuZCh2ZXJzaW9uLmdldFZlcnNpb24oKSk7Ci0JCQlsLmFwcGVuZCgiKSIpOwotCQkJcmV0dXJuIGwudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclByb2plY3RBcnRlZmFjdCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFRleHQoKChJU2VydmVyUHJvamVjdEFydGVmYWN0KSBlbGVtZW50KS5nZXRDb250YWluZXIoKSkgKyAiIC0gIiArIGdldFRleHQoKChJU2VydmVyUHJvamVjdEFydGVmYWN0KSBlbGVtZW50KS5nZXRBcnRlZmFjdCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VGV4dCgoKElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSBlbGVtZW50KS5nZXRTZXJ2ZXIoKSkgKyAiIC0gIiArIGdldFRleHQoKChJU2VydmVyUHJvamVjdENvbnRhaW5lcikgZWxlbWVudCkuZ2V0QXJ0ZWZhY3RTZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaWJyYXJpZXNOb2RlKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VGV4dCgoKExpYnJhcmllc05vZGUpIGVsZW1lbnQpLmdldFNlcnZlcigpKSArICIgIiArIE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9CdW5kbGVzQW5kTGlicmFyaWVzOworICAgICAgICB9CisgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoKElGaWxlKSBlbGVtZW50KS5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRlZmFjdFNldCkgeworICAgICAgICAgICAgQXJ0ZWZhY3RTZXQgc2V0ID0gKEFydGVmYWN0U2V0KSBlbGVtZW50OworICAgICAgICAgICAgU3RyaW5nIGxhYmVsID0gc2V0LmdldEFydGVmYWN0VHlwZSgpLmdldFBsdXJhbExhYmVsKCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExvY2FsQXJ0ZWZhY3RTZXQpIHsKKyAgICAgICAgICAgICAgICBsYWJlbCA9ICgoTG9jYWxBcnRlZmFjdFNldCkgZWxlbWVudCkuZ2V0UmVsYXRpdmVQYXRoKCkgKyAiIFsiICsgbGFiZWwgKyAiXSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGFiZWw7CisgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBcnRlZmFjdCkgeworICAgICAgICAgICAgSUFydGVmYWN0IHZlcnNpb24gPSAoSUFydGVmYWN0KSBlbGVtZW50OworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBsID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uLmdldE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbC5hcHBlbmQodmVyc2lvbi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGwuYXBwZW5kKCIgLSAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGwuYXBwZW5kKHZlcnNpb24uZ2V0U3ltYm9saWNOYW1lKCkpOworICAgICAgICAgICAgbC5hcHBlbmQoIiAoIik7CisgICAgICAgICAgICBsLmFwcGVuZCh2ZXJzaW9uLmdldFZlcnNpb24oKSk7CisgICAgICAgICAgICBsLmFwcGVuZCgiKSIpOworICAgICAgICAgICAgcmV0dXJuIGwudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvUnVudGltZUxhYmVsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvUnVudGltZUxhYmVsUHJvdmlkZXIuamF2YQppbmRleCAwNzFhYWIyLi43ZTIwZTFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1J1bnRpbWVMYWJlbFByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9SdW50aW1lTGFiZWxQcm92aWRlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb3ZpZGVyczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwpAQCAtMzcsODAgKzM4LDgwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBSdW50aW1lTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewogCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclByb2plY3RBcnRlZmFjdCkgewotCQkJcmV0dXJuIGdldEltYWdlKCgoSVNlcnZlclByb2plY3RBcnRlZmFjdCkgZWxlbWVudCkuZ2V0QXJ0ZWZhY3QoKSk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyUHJvamVjdENvbnRhaW5lcikgewotCQkJcmV0dXJuIGdldEltYWdlKCgoSVNlcnZlclByb2plY3RDb250YWluZXIpIGVsZW1lbnQpLmdldEFydGVmYWN0U2V0KCkpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvamVjdEZpbGVSZWZlcmVuY2UpIHsKLQkJCXJldHVybiBTZXJ2ZXJVaUltYWdlcy5nZXRJbWFnZShTZXJ2ZXJVaUltYWdlcy5JTUdfT0JKX1ZJUkdPKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFydGVmYWN0U2V0KSB7Ci0JCQlBcnRlZmFjdFR5cGUgYXJ0ZWZhY3RUeXBlID0gKChJQXJ0ZWZhY3RUeXBlZCkgZWxlbWVudCkuZ2V0QXJ0ZWZhY3RUeXBlKCk7Ci0JCQlpZiAoYXJ0ZWZhY3RUeXBlID09IEFydGVmYWN0VHlwZS5CVU5ETEUpIHsKLQkJCQlyZXR1cm4gUERFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KFBERVBsdWdpbkltYWdlcy5ERVNDX0pBUl9MSUJfT0JKKTsKLQkJCX0gZWxzZSBpZiAoYXJ0ZWZhY3RUeXBlID09IEFydGVmYWN0VHlwZS5MSUJSQVJZKSB7Ci0JCQkJcmV0dXJuIFNlcnZlclVpSW1hZ2VzLmdldEltYWdlKFNlcnZlclVpSW1hZ2VzLklNR19PQkpfVklSR09fTElCKTsKLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpfRklMRSk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQXJ0ZWZhY3RUeXBlZCkgewotCQkJQXJ0ZWZhY3RUeXBlIGFydGVmYWN0VHlwZSA9ICgoSUFydGVmYWN0VHlwZWQpIGVsZW1lbnQpLmdldEFydGVmYWN0VHlwZSgpOwotCQkJaWYgKGFydGVmYWN0VHlwZSA9PSBBcnRlZmFjdFR5cGUuQlVORExFKSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMb2NhbEJ1bmRsZUFydGVmYWN0ICYmICgoTG9jYWxCdW5kbGVBcnRlZmFjdCkgZWxlbWVudCkuaXNTb3VyY2VEb3dubG9hZGVkKCkpIHsKLQkJCQkJcmV0dXJuIEphdmFQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQoSmF2YVBsdWdpbkltYWdlcy5ERVNDX09CSlNfRVhUSkFSX1dTUkMpOwotCQkJCX0KLQkJCQlyZXR1cm4gSmF2YVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChKYXZhUGx1Z2luSW1hZ2VzLkRFU0NfT0JKU19FWFRKQVIpOwotCQkJfSBlbHNlIGlmIChhcnRlZmFjdFR5cGUgPT0gQXJ0ZWZhY3RUeXBlLkxJQlJBUlkpIHsKLQkJCQlyZXR1cm4gU2VydmVyVWlJbWFnZXMuZ2V0SW1hZ2UoU2VydmVyVWlJbWFnZXMuSU1HX09CSl9WSVJHT19GSUxFKTsKLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpYnJhcmllc05vZGUpIHsKLQkJCXJldHVybiBTZXJ2ZXJVaUltYWdlcy5nZXRJbWFnZShTZXJ2ZXJVaUltYWdlcy5JTUdfT0JKX0xJQik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGVsZW1lbnQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyUHJvamVjdEFydGVmYWN0KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2UoKChJU2VydmVyUHJvamVjdEFydGVmYWN0KSBlbGVtZW50KS5nZXRBcnRlZmFjdCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2UoKChJU2VydmVyUHJvamVjdENvbnRhaW5lcikgZWxlbWVudCkuZ2V0QXJ0ZWZhY3RTZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9qZWN0RmlsZVJlZmVyZW5jZSkgeworICAgICAgICAgICAgcmV0dXJuIFNlcnZlclVpSW1hZ2VzLmdldEltYWdlKFNlcnZlclVpSW1hZ2VzLklNR19PQkpfVklSR08pOworICAgICAgICB9CisgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0ZWZhY3RTZXQpIHsKKyAgICAgICAgICAgIEFydGVmYWN0VHlwZSBhcnRlZmFjdFR5cGUgPSAoKElBcnRlZmFjdFR5cGVkKSBlbGVtZW50KS5nZXRBcnRlZmFjdFR5cGUoKTsKKyAgICAgICAgICAgIGlmIChhcnRlZmFjdFR5cGUgPT0gQXJ0ZWZhY3RUeXBlLkJVTkRMRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBQREVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfSkFSX0xJQl9PQkopOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcnRlZmFjdFR5cGUgPT0gQXJ0ZWZhY3RUeXBlLkxJQlJBUlkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU2VydmVyVWlJbWFnZXMuZ2V0SW1hZ2UoU2VydmVyVWlJbWFnZXMuSU1HX09CSl9WSVJHT19MSUIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKKyAgICAgICAgICAgIHJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSl9GSUxFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBcnRlZmFjdFR5cGVkKSB7CisgICAgICAgICAgICBBcnRlZmFjdFR5cGUgYXJ0ZWZhY3RUeXBlID0gKChJQXJ0ZWZhY3RUeXBlZCkgZWxlbWVudCkuZ2V0QXJ0ZWZhY3RUeXBlKCk7CisgICAgICAgICAgICBpZiAoYXJ0ZWZhY3RUeXBlID09IEFydGVmYWN0VHlwZS5CVU5ETEUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExvY2FsQnVuZGxlQXJ0ZWZhY3QgJiYgKChMb2NhbEJ1bmRsZUFydGVmYWN0KSBlbGVtZW50KS5pc1NvdXJjZURvd25sb2FkZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSmF2YVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChKYXZhUGx1Z2luSW1hZ2VzLkRFU0NfT0JKU19FWFRKQVJfV1NSQyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBKYXZhUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KEphdmFQbHVnaW5JbWFnZXMuREVTQ19PQkpTX0VYVEpBUik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFydGVmYWN0VHlwZSA9PSBBcnRlZmFjdFR5cGUuTElCUkFSWSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTZXJ2ZXJVaUltYWdlcy5nZXRJbWFnZShTZXJ2ZXJVaUltYWdlcy5JTUdfT0JKX1ZJUkdPX0ZJTEUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlicmFyaWVzTm9kZSkgeworICAgICAgICAgICAgcmV0dXJuIFNlcnZlclVpSW1hZ2VzLmdldEltYWdlKFNlcnZlclVpSW1hZ2VzLklNR19PQkpfTElCKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlclByb2plY3RBcnRlZmFjdCkgewotCQkJcmV0dXJuIGdldFRleHQoKChJU2VydmVyUHJvamVjdEFydGVmYWN0KSBlbGVtZW50KS5nZXRBcnRlZmFjdCgpKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSB7Ci0JCQlyZXR1cm4gZ2V0VGV4dCgoKElTZXJ2ZXJQcm9qZWN0Q29udGFpbmVyKSBlbGVtZW50KS5nZXRBcnRlZmFjdFNldCgpKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIExpYnJhcmllc05vZGUpIHsKLQkJCXJldHVybiBNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfQnVuZGxlc0FuZExpYnJhcmllczsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlyZXR1cm4gKChJRmlsZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0ZWZhY3RTZXQpIHsKLQkJCUFydGVmYWN0U2V0IHNldCA9IChBcnRlZmFjdFNldCkgZWxlbWVudDsKLQkJCVN0cmluZyBsYWJlbCA9IHNldC5nZXRBcnRlZmFjdFR5cGUoKS5nZXRQbHVyYWxMYWJlbCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMb2NhbEFydGVmYWN0U2V0KSB7Ci0JCQkJbGFiZWwgPSAoKExvY2FsQXJ0ZWZhY3RTZXQpIGVsZW1lbnQpLmdldFJlbGF0aXZlUGF0aCgpICsgIiBbIiArIGxhYmVsICsgIl0iOwotCQkJfQotCQkJcmV0dXJuIGxhYmVsOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQXJ0ZWZhY3QpIHsKLQkJCUlBcnRlZmFjdCB2ZXJzaW9uID0gKElBcnRlZmFjdCkgZWxlbWVudDsKLQkJCVN0cmluZ0J1aWxkZXIgbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQlpZiAodmVyc2lvbi5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCWwuYXBwZW5kKHZlcnNpb24uZ2V0TmFtZSgpKTsKLQkJCQlsLmFwcGVuZCgiIC0gIik7Ci0JCQl9Ci0JCQlsLmFwcGVuZCh2ZXJzaW9uLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCWwuYXBwZW5kKCIgKCIpOwotCQkJbC5hcHBlbmQodmVyc2lvbi5nZXRWZXJzaW9uKCkpOwotCQkJbC5hcHBlbmQoIikiKTsKLQkJCXJldHVybiBsLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRUZXh0KCgoSVNlcnZlclByb2plY3RBcnRlZmFjdCkgZWxlbWVudCkuZ2V0QXJ0ZWZhY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyUHJvamVjdENvbnRhaW5lcikgeworICAgICAgICAgICAgcmV0dXJuIGdldFRleHQoKChJU2VydmVyUHJvamVjdENvbnRhaW5lcikgZWxlbWVudCkuZ2V0QXJ0ZWZhY3RTZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaWJyYXJpZXNOb2RlKSB7CisgICAgICAgICAgICByZXR1cm4gTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX0J1bmRsZXNBbmRMaWJyYXJpZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgeworICAgICAgICAgICAgcmV0dXJuICgoSUZpbGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFydGVmYWN0U2V0KSB7CisgICAgICAgICAgICBBcnRlZmFjdFNldCBzZXQgPSAoQXJ0ZWZhY3RTZXQpIGVsZW1lbnQ7CisgICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBzZXQuZ2V0QXJ0ZWZhY3RUeXBlKCkuZ2V0UGx1cmFsTGFiZWwoKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTG9jYWxBcnRlZmFjdFNldCkgeworICAgICAgICAgICAgICAgIGxhYmVsID0gKChMb2NhbEFydGVmYWN0U2V0KSBlbGVtZW50KS5nZXRSZWxhdGl2ZVBhdGgoKSArICIgWyIgKyBsYWJlbCArICJdIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsYWJlbDsKKyAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFydGVmYWN0KSB7CisgICAgICAgICAgICBJQXJ0ZWZhY3QgdmVyc2lvbiA9IChJQXJ0ZWZhY3QpIGVsZW1lbnQ7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgaWYgKHZlcnNpb24uZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsLmFwcGVuZCh2ZXJzaW9uLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgbC5hcHBlbmQoIiAtICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbC5hcHBlbmQodmVyc2lvbi5nZXRTeW1ib2xpY05hbWUoKSk7CisgICAgICAgICAgICBsLmFwcGVuZCgiICgiKTsKKyAgICAgICAgICAgIGwuYXBwZW5kKHZlcnNpb24uZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgICAgIGwuYXBwZW5kKCIpIik7CisgICAgICAgICAgICByZXR1cm4gbC50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9TZXJ2ZXJGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1NlcnZlckZpbGUuamF2YQppbmRleCBlZjg4MzQ1Li44MDA4NTU1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1NlcnZlckZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1NlcnZlckZpbGUuamF2YQpAQCAtMTUsMjYgKzE1LDI2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CiAKIC8qKgotICogCisgKgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKLSAqIAorICoKICAqLwogcHVibGljIGNsYXNzIFNlcnZlckZpbGUgewogCi0JcHJvdGVjdGVkIGZpbmFsIElGaWxlIGZpbGU7CisgICAgcHJvdGVjdGVkIGZpbmFsIElGaWxlIGZpbGU7CiAKLQlwcml2YXRlIGZpbmFsIElTZXJ2ZXIgc2VydmVyOworICAgIHByaXZhdGUgZmluYWwgSVNlcnZlciBzZXJ2ZXI7CiAKLQlwdWJsaWMgU2VydmVyRmlsZShJU2VydmVyIHNlcnZlciwgSUZpbGUgZmlsZSkgewotCQl0aGlzLnNlcnZlciA9IHNlcnZlcjsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQl9CisgICAgcHVibGljIFNlcnZlckZpbGUoSVNlcnZlciBzZXJ2ZXIsIElGaWxlIGZpbGUpIHsKKyAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgfQogCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBmaWxlOwotCX0KKyAgICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmlsZTsKKyAgICB9CiAKLQlwdWJsaWMgSVNlcnZlciBnZXRTZXJ2ZXIoKSB7Ci0JCXJldHVybiBzZXJ2ZXI7Ci0JfQorICAgIHB1YmxpYyBJU2VydmVyIGdldFNlcnZlcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2VydmVyOworICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1NlcnZlckZpbGVDb250ZW50UHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvU2VydmVyRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDI5ZTFkMTkuLmQzMTYxYTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvU2VydmVyRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvU2VydmVyRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb3ZpZGVyczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0yNSw4MyArMjYsODMgQEAKIAogLyoqCiAgKiBDb21tb24gY29udGVudCBwcm92aWRlciBmb3Igdmlld3Mgb24gc2VydmVyIGNvbnRlbnQuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyRmlsZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEdlbmVyaWNUcmVlUHJvdmlkZXIgewogCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKLQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGlucHV0RWxlbWVudDsKLQkJCVNlcnZlclByb2plY3QgcHJvamVjdCA9IFNlcnZlclByb2plY3RNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UHJvamVjdChzZXJ2ZXIpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCUxpc3Q8U2VydmVyRmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PFNlcnZlckZpbGU+KCk7Ci0JCQkJZm9yIChTdHJpbmcgc2VydmVyRGlyIDogZ2V0U2VydmVyRGlyZWN0b3JpZXMoc2VydmVyKSkgewotCQkJCQlJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0V29ya3NwYWNlUHJvamVjdCgpLmdldEZvbGRlcihnZXRCYXNlRGlyZWN0b3J5KCkgKyAiLyIgKyBzZXJ2ZXJEaXIpOwotCQkJCQl0cnkgewotCQkJCQkJSVJlc291cmNlW10gbWVtYmVycyA9IGZvbGRlci5tZW1iZXJzKCk7Ci0JCQkJCQlmb3IgKElSZXNvdXJjZSByZXNvdXJjZSA6IG1lbWJlcnMpIHsKLQkJCQkJCQlpZiAoaXNJbmNsdWRlVHlwZShyZXNvdXJjZSkpIHsKLQkJCQkJCQkJZmlsZXMuYWRkKG5ldyBTZXJ2ZXJGaWxlKHNlcnZlciwgKElGaWxlKSByZXNvdXJjZSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoZS5nZXRTdGF0dXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZpbGVzLnRvQXJyYXkobmV3IE9iamVjdFtmaWxlcy5zaXplKCldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKKyAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKKyAgICAgICAgICAgIElTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGlucHV0RWxlbWVudDsKKyAgICAgICAgICAgIFNlcnZlclByb2plY3QgcHJvamVjdCA9IFNlcnZlclByb2plY3RNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0UHJvamVjdChzZXJ2ZXIpOworICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExpc3Q8U2VydmVyRmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PFNlcnZlckZpbGU+KCk7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgc2VydmVyRGlyIDogZ2V0U2VydmVyRGlyZWN0b3JpZXMoc2VydmVyKSkgeworICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0V29ya3NwYWNlUHJvamVjdCgpLmdldEZvbGRlcihnZXRCYXNlRGlyZWN0b3J5KCkgKyAiLyIgKyBzZXJ2ZXJEaXIpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlW10gbWVtYmVycyA9IGZvbGRlci5tZW1iZXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElSZXNvdXJjZSByZXNvdXJjZSA6IG1lbWJlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbmNsdWRlVHlwZShyZXNvdXJjZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMuYWRkKG5ldyBTZXJ2ZXJGaWxlKHNlcnZlciwgKElGaWxlKSByZXNvdXJjZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoZS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVzLnRvQXJyYXkobmV3IE9iamVjdFtmaWxlcy5zaXplKCldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KTsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGVUeXBlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJU3RyaW5nIGV4dCA9IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmIChleHQgPT0gbnVsbCkgewotCQkJCXJldHVybiBpc0luY2x1ZGVOb0V4dGVuc2lvbigpOwotCQkJfQotCQkJaWYgKGdldEluY2x1ZGVFeHRlbnNpb25zKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBBcnJheVV0aWxzLmNvbnRhaW5zKGdldEluY2x1ZGVFeHRlbnNpb25zKCksIGV4dCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0RXhjbHVkZUV4dGVuc2lvbnMoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuICFBcnJheVV0aWxzLmNvbnRhaW5zKGdldEV4Y2x1ZGVFeHRlbnNpb25zKCksIGV4dCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZVR5cGUoSVJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7CisgICAgICAgICAgICBTdHJpbmcgZXh0ID0gcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpOworICAgICAgICAgICAgaWYgKGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlzSW5jbHVkZU5vRXh0ZW5zaW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ2V0SW5jbHVkZUV4dGVuc2lvbnMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5VXRpbHMuY29udGFpbnMoZ2V0SW5jbHVkZUV4dGVuc2lvbnMoKSwgZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRFeGNsdWRlRXh0ZW5zaW9ucygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIUFycmF5VXRpbHMuY29udGFpbnMoZ2V0RXhjbHVkZUV4dGVuc2lvbnMoKSwgZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEJhc2VEaXJlY3RvcnkoKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEJhc2VEaXJlY3RvcnkoKTsKIAotCS8qKgotCSAqIElmIG5vdCBudWxsIG9ubHkgZmlsZXMgd2l0aCBpbmNsdWRlIGV4dGVuc2lvbnMgd2lsbCBiZSBhZGRlZC4gTm90ZTogZXhjbHVkZWQgZmlsZXMgd2lsbCBiZSBpZ25vcmVkIGluIHRoaXMgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0SW5jbHVkZUV4dGVuc2lvbnMoKTsKKyAgICAvKioKKyAgICAgKiBJZiBub3QgbnVsbCBvbmx5IGZpbGVzIHdpdGggaW5jbHVkZSBleHRlbnNpb25zIHdpbGwgYmUgYWRkZWQuIE5vdGU6IGV4Y2x1ZGVkIGZpbGVzIHdpbGwgYmUgaWdub3JlZCBpbiB0aGlzIGNhc2UuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldEluY2x1ZGVFeHRlbnNpb25zKCk7CiAKLQkvKioKLQkgKiBJZiBub3QgbnVsbCBmaWxlcyB3aXRoIGV4dGVuc2lvbnMgd2lsbCBub3QgYmUgYWRkZWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldEV4Y2x1ZGVFeHRlbnNpb25zKCk7CisgICAgLyoqCisgICAgICogSWYgbm90IG51bGwgZmlsZXMgd2l0aCBleHRlbnNpb25zIHdpbGwgbm90IGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRFeGNsdWRlRXh0ZW5zaW9ucygpOwogCi0JcHVibGljIGFic3RyYWN0IFN0cmluZ1tdIGdldFNlcnZlckRpcmVjdG9yaWVzKElTZXJ2ZXIgc2VydmVyKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U2VydmVyRGlyZWN0b3JpZXMoSVNlcnZlciBzZXJ2ZXIpOwogCi0JLyoqCi0JICogU2hvdWxkIGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZSBleHRlbnNpb25zIGJlIGluY2x1ZGVkPwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzSW5jbHVkZU5vRXh0ZW5zaW9uKCk7CisgICAgLyoqCisgICAgICogU2hvdWxkIGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZSBleHRlbnNpb25zIGJlIGluY2x1ZGVkPworICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzSW5jbHVkZU5vRXh0ZW5zaW9uKCk7CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlckZpbGUpIHsKLQkJCXJldHVybiAoKFNlcnZlckZpbGUpIGVsZW1lbnQpLmdldFNlcnZlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgeworICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlckZpbGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFNlcnZlckZpbGUpIGVsZW1lbnQpLmdldFNlcnZlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlciAmJiBTZXJ2ZXJQcm9qZWN0LmlzVmlyZ28oKElTZXJ2ZXIpIGVsZW1lbnQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgeworICAgICAgICByZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIgJiYgU2VydmVyUHJvamVjdC5pc1ZpcmdvKChJU2VydmVyKSBlbGVtZW50KTsKKyAgICB9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9TZXJ2ZXJGaWxlTGFiZWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9TZXJ2ZXJGaWxlTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IGI0ZTg0MzAuLjU5ZWY1NzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvU2VydmVyRmlsZUxhYmVsUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcHJvdmlkZXJzL1NlcnZlckZpbGVMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTI0LDc3ICsyNCw3OCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLlNlcnZlclVpSW1hZ2VzOwogCiAvKioKLSAqIAorICoKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCi0gKiAKKyAqCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJGaWxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9SRUdFWFAgPSAib3JnXFwuZWNsaXBzZVxcLnZpcmdvXFwufFxcLnByb3BlcnRpZXMiOwogCi0JV29ya2JlbmNoTGFiZWxQcm92aWRlciBkZWxlZ2F0ZSA9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9SRUdFWFAgPSAib3JnXFwuZWNsaXBzZVxcLnZpcmdvXFwufFxcLnByb3BlcnRpZXMiOwogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSBlbGVtZW50OwotCQkJcmV0dXJuIGZpbGUuZ2V0TmFtZSgpLnJlcGxhY2VBbGwoUkVNT1ZFX1JFR0VYUCwgIiIpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsZSkgewotCQkJRmlsZSBmaWxlID0gKEZpbGUpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gZmlsZS5nZXROYW1lKCkucmVwbGFjZUFsbChSRU1PVkVfUkVHRVhQLCAiIik7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJGaWxlU2VsZWN0aW9uKSB7Ci0JCQlJRmlsZSB3b3Jrc3BhY2VGaWxlID0gKChTZXJ2ZXJGaWxlKSBlbGVtZW50KS5nZXRGaWxlKCk7Ci0JCQlTdHJpbmcgbGluZSA9ICgoU2VydmVyRmlsZVNlbGVjdGlvbikgZWxlbWVudCkuZ2V0TGluZSgpOwotCQkJaWYgKHdvcmtzcGFjZUZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwgJiYgd29ya3NwYWNlRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJwcm9wZXJ0aWVzIikpIHsKLQkJCQlTdHJpbmcgd29ya3NwYWNlTmFtZSA9IHdvcmtzcGFjZUZpbGUuZ2V0TmFtZSgpOwotCQkJCWlmICh3b3Jrc3BhY2VGaWxlLmdldExvY2F0aW9uKCkudG9Qb3J0YWJsZVN0cmluZygpLmNvbnRhaW5zKCJyZXBvc2l0b3J5IikpIHsKLQkJCQkJbGluZSArPSAiIFtVc2VyXSI7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGxpbmU7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJGaWxlKSB7Ci0JCQlJRmlsZSB3b3Jrc3BhY2VGaWxlID0gKChTZXJ2ZXJGaWxlKSBlbGVtZW50KS5nZXRGaWxlKCk7Ci0JCQlTdHJpbmcgc2VydmVyTmFtZSA9IHdvcmtzcGFjZUZpbGUuZ2V0TG9jYXRpb24oKS5sYXN0U2VnbWVudCgpOwotCQkJaWYgKHdvcmtzcGFjZUZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwgJiYgd29ya3NwYWNlRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJwcm9wZXJ0aWVzIikpIHsKLQkJCQlpZiAod29ya3NwYWNlRmlsZS5nZXRMb2NhdGlvbigpLnRvUG9ydGFibGVTdHJpbmcoKS5jb250YWlucygicmVwb3NpdG9yeSIpKSB7Ci0JCQkJCXNlcnZlck5hbWUgKz0gIiBbVXNlcl0iOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzZXJ2ZXJOYW1lLnJlcGxhY2VBbGwoUkVNT1ZFX1JFR0VYUCwgIiIpOwotCQl9Ci0JCXJldHVybiBkZWxlZ2F0ZS5nZXRUZXh0KGVsZW1lbnQpOwotCX0KKyAgICBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyIGRlbGVnYXRlID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyRmlsZVNlbGVjdGlvbikgewotCQkJcmV0dXJuIERlYnVnUGx1Z2luSW1hZ2VzLmdldEltYWdlKElEZWJ1Z1VJQ29uc3RhbnRzLklNR19PQkpTX1ZBUklBQkxFKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlckZpbGUpIHsKLQkJCXJldHVybiBnZXRJbWFnZSgoKFNlcnZlckZpbGUpIGVsZW1lbnQpLmdldEZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGRlbGVnYXRlLmdldEltYWdlKGVsZW1lbnQpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKKyAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIGVsZW1lbnQ7CisgICAgICAgICAgICByZXR1cm4gZmlsZS5nZXROYW1lKCkucmVwbGFjZUFsbChSRU1PVkVfUkVHRVhQLCAiIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlKSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSAoRmlsZSkgZWxlbWVudDsKKyAgICAgICAgICAgIHJldHVybiBmaWxlLmdldE5hbWUoKS5yZXBsYWNlQWxsKFJFTU9WRV9SRUdFWFAsICIiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlckZpbGVTZWxlY3Rpb24pIHsKKyAgICAgICAgICAgIElGaWxlIHdvcmtzcGFjZUZpbGUgPSAoKFNlcnZlckZpbGUpIGVsZW1lbnQpLmdldEZpbGUoKTsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lID0gKChTZXJ2ZXJGaWxlU2VsZWN0aW9uKSBlbGVtZW50KS5nZXRMaW5lKCk7CisgICAgICAgICAgICBpZiAod29ya3NwYWNlRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCAmJiB3b3Jrc3BhY2VGaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoInByb3BlcnRpZXMiKSkgeworICAgICAgICAgICAgICAgIHdvcmtzcGFjZUZpbGUuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICh3b3Jrc3BhY2VGaWxlLmdldExvY2F0aW9uKCkudG9Qb3J0YWJsZVN0cmluZygpLmNvbnRhaW5zKCJyZXBvc2l0b3J5IikpIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZSArPSAiIFtVc2VyXSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJGaWxlKSB7CisgICAgICAgICAgICBJRmlsZSB3b3Jrc3BhY2VGaWxlID0gKChTZXJ2ZXJGaWxlKSBlbGVtZW50KS5nZXRGaWxlKCk7CisgICAgICAgICAgICBTdHJpbmcgc2VydmVyTmFtZSA9IHdvcmtzcGFjZUZpbGUuZ2V0TG9jYXRpb24oKS5sYXN0U2VnbWVudCgpOworICAgICAgICAgICAgaWYgKHdvcmtzcGFjZUZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpICE9IG51bGwgJiYgd29ya3NwYWNlRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJwcm9wZXJ0aWVzIikpIHsKKyAgICAgICAgICAgICAgICBpZiAod29ya3NwYWNlRmlsZS5nZXRMb2NhdGlvbigpLnRvUG9ydGFibGVTdHJpbmcoKS5jb250YWlucygicmVwb3NpdG9yeSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlck5hbWUgKz0gIiBbVXNlcl0iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJOYW1lLnJlcGxhY2VBbGwoUkVNT1ZFX1JFR0VYUCwgIiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmdldFRleHQoZWxlbWVudCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgZGVjb3JhdGUoT2JqZWN0IGVsZW1lbnQsIElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJGaWxlKSB7Ci0JCQlTZXJ2ZXJGaWxlIHNlcnZlckZpbGUgPSAoU2VydmVyRmlsZSkgZWxlbWVudDsKLQkJCVN0cmluZyBzdWZmaXggPSAiIFsiICsgc2VydmVyRmlsZS5nZXRTZXJ2ZXIoKSArICJdIC0gIiArIHNlcnZlckZpbGUuZ2V0RmlsZSgpLmdldExvY2F0aW9uKCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlckZpbGVTZWxlY3Rpb24pIHsKLQkJCQlzdWZmaXggKz0gIiAjIiArICgoU2VydmVyRmlsZVNlbGVjdGlvbikgZWxlbWVudCkuZ2V0SXRlbSgpOwotCQkJfQotCQkJZGVjb3JhdGlvbi5hZGRTdWZmaXgoc3VmZml4KTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJGaWxlU2VsZWN0aW9uKSkgewotCQkJCWRlY29yYXRpb24uYWRkT3ZlcmxheShTZXJ2ZXJVaUltYWdlcy5ERVNDX09CSl9WSVJHT19PVkVSLCBJRGVjb3JhdGlvbi5UT1BfTEVGVCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2ZXJGaWxlU2VsZWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gRGVidWdQbHVnaW5JbWFnZXMuZ2V0SW1hZ2UoSURlYnVnVUlDb25zdGFudHMuSU1HX09CSlNfVkFSSUFCTEUpOworICAgICAgICB9CisgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyRmlsZSkgeworICAgICAgICAgICAgcmV0dXJuIGdldEltYWdlKCgoU2VydmVyRmlsZSkgZWxlbWVudCkuZ2V0RmlsZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRJbWFnZShlbGVtZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgeworICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlckZpbGUpIHsKKyAgICAgICAgICAgIFNlcnZlckZpbGUgc2VydmVyRmlsZSA9IChTZXJ2ZXJGaWxlKSBlbGVtZW50OworICAgICAgICAgICAgU3RyaW5nIHN1ZmZpeCA9ICIgWyIgKyBzZXJ2ZXJGaWxlLmdldFNlcnZlcigpICsgIl0gLSAiICsgc2VydmVyRmlsZS5nZXRGaWxlKCkuZ2V0TG9jYXRpb24oKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2VydmVyRmlsZVNlbGVjdGlvbikgeworICAgICAgICAgICAgICAgIHN1ZmZpeCArPSAiICMiICsgKChTZXJ2ZXJGaWxlU2VsZWN0aW9uKSBlbGVtZW50KS5nZXRJdGVtKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWNvcmF0aW9uLmFkZFN1ZmZpeChzdWZmaXgpOworICAgICAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZlckZpbGVTZWxlY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgZGVjb3JhdGlvbi5hZGRPdmVybGF5KFNlcnZlclVpSW1hZ2VzLkRFU0NfT0JKX1ZJUkdPX09WRVIsIElEZWNvcmF0aW9uLlRPUF9MRUZUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvU2VydmVyRmlsZVNlbGVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9TZXJ2ZXJGaWxlU2VsZWN0aW9uLmphdmEKaW5kZXggY2Y0YzE3Mi4uM2I3Y2U0YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9TZXJ2ZXJGaWxlU2VsZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9TZXJ2ZXJGaWxlU2VsZWN0aW9uLmphdmEKQEAgLTE2LDYwICsxNiw2MSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwogCiAvKioKLSAqIAorICoKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCi0gKiAKKyAqCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJGaWxlU2VsZWN0aW9uIGV4dGVuZHMgU2VydmVyRmlsZSB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGluZTsKIAotCXByaXZhdGUgZmluYWwgaW50IG9mZnNldDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBsaW5lOwogCi0JcHJpdmF0ZSBmaW5hbCBpbnQgbGVuZ3RoOworICAgIHByaXZhdGUgZmluYWwgaW50IG9mZnNldDsKIAotCXByaXZhdGUgZmluYWwgaW50IGl0ZW07CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGVuZ3RoOwogCi0JcHVibGljIFNlcnZlckZpbGVTZWxlY3Rpb24oSVNlcnZlciBzZXJ2ZXIsIElGaWxlIGZpbGUsIFN0cmluZyBsaW5lLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBpdGVtKSB7Ci0JCXN1cGVyKHNlcnZlciwgZmlsZSk7Ci0JCXRoaXMubGluZSA9IGxpbmU7Ci0JCXRoaXMub2Zmc2V0ID0gc3RhcnQ7Ci0JCXRoaXMubGVuZ3RoID0gZW5kOwotCQl0aGlzLml0ZW0gPSBpdGVtOwotCX0KKyAgICBwcml2YXRlIGZpbmFsIGludCBpdGVtOwogCi0JcHVibGljIFN0cmluZyBnZXRMaW5lKCkgewotCQlyZXR1cm4gbGluZTsKLQl9CisgICAgcHVibGljIFNlcnZlckZpbGVTZWxlY3Rpb24oSVNlcnZlciBzZXJ2ZXIsIElGaWxlIGZpbGUsIFN0cmluZyBsaW5lLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBpdGVtKSB7CisgICAgICAgIHN1cGVyKHNlcnZlciwgZmlsZSk7CisgICAgICAgIHRoaXMubGluZSA9IGxpbmU7CisgICAgICAgIHRoaXMub2Zmc2V0ID0gc3RhcnQ7CisgICAgICAgIHRoaXMubGVuZ3RoID0gZW5kOworICAgICAgICB0aGlzLml0ZW0gPSBpdGVtOworICAgIH0KIAotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gb2Zmc2V0OwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldExpbmUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmxpbmU7CisgICAgfQogCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQorICAgIHB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgeworICAgICAgICByZXR1cm4gdGhpcy5vZmZzZXQ7CisgICAgfQogCi0JcHVibGljIGludCBnZXRJdGVtKCkgewotCQlyZXR1cm4gaXRlbTsKLQl9CisgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmxlbmd0aDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmaWxlLmhhc2hDb2RlKCkgKyBvZmZzZXQgKyAyNzEwMyAqIGxlbmd0aDsKLQl9CisgICAgcHVibGljIGludCBnZXRJdGVtKCkgeworICAgICAgICByZXR1cm4gdGhpcy5pdGVtOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFyZykgewotCQlpZiAoYXJnIGluc3RhbmNlb2YgU2VydmVyRmlsZVNlbGVjdGlvbikgewotCQkJU2VydmVyRmlsZVNlbGVjdGlvbiBvdGhlciA9IChTZXJ2ZXJGaWxlU2VsZWN0aW9uKSBhcmc7Ci0JCQlyZXR1cm4gT2JqZWN0VXRpbHMuZXF1YWxzKGZpbGUsIG90aGVyLmZpbGUpICYmIGl0ZW0gPT0gb3RoZXIuaXRlbTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmlsZS5oYXNoQ29kZSgpICsgdGhpcy5vZmZzZXQgKyAyNzEwMyAqIHRoaXMubGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFyZykgeworICAgICAgICBpZiAoYXJnIGluc3RhbmNlb2YgU2VydmVyRmlsZVNlbGVjdGlvbikgeworICAgICAgICAgICAgU2VydmVyRmlsZVNlbGVjdGlvbiBvdGhlciA9IChTZXJ2ZXJGaWxlU2VsZWN0aW9uKSBhcmc7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0VXRpbHMuZXF1YWxzKHRoaXMuZmlsZSwgb3RoZXIuZmlsZSkgJiYgdGhpcy5pdGVtID09IG90aGVyLml0ZW07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9wcm92aWRlcnMvU2ltcGxlQnVuZGxlTGFiZWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9TaW1wbGVCdW5kbGVMYWJlbFByb3ZpZGVyLmphdmEKaW5kZXggMmJlZTIzNS4uZTcwZjkxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9TaW1wbGVCdW5kbGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3Byb3ZpZGVycy9TaW1wbGVCdW5kbGVMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTE4LDExICsxOCwxMSBAQAogICovCiBwdWJsaWMgY2xhc3MgU2ltcGxlQnVuZGxlTGFiZWxQcm92aWRlciBleHRlbmRzIFJ1bnRpbWVMYWJlbFByb3ZpZGVyIHsKIAotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QpIHsKLQkJCXJldHVybiAoKElTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QpIGVsZW1lbnQpLmdldEFydGVmYWN0KCkuZ2V0U2lnbmF0dXJlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QpIHsKKyAgICAgICAgICAgIHJldHVybiAoKElTZXJ2ZXJQcm9qZWN0QXJ0ZWZhY3QpIGVsZW1lbnQpLmdldEFydGVmYWN0KCkuZ2V0U2lnbmF0dXJlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3JlcG9zaXRvcnkvUmVmcmVzaEJ1bmRsZUpvYi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3JlcG9zaXRvcnkvUmVmcmVzaEJ1bmRsZUpvYi5qYXZhCmluZGV4IDFiMjA3NmIuLmZjNjNhYmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9yZXBvc2l0b3J5L1JlZnJlc2hCdW5kbGVKb2IuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvcmVwb3NpdG9yeS9SZWZyZXNoQnVuZGxlSm9iLmphdmEKQEAgLTMxLDMwICszMSwzMCBAQAogICogQGF1dGhvciBMZW8gRG9zIFNhbnRvcwogICovCiBwdWJsaWMgY2xhc3MgUmVmcmVzaEJ1bmRsZUpvYiBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JcHJpdmF0ZSBmaW5hbCBJUnVudGltZSBydW50aW1lOwogCi0JUmVmcmVzaEJ1bmRsZUpvYihJUnVudGltZSBydW50aW1lKSB7Ci0JCXRoaXMucnVudGltZSA9IHJ1bnRpbWU7Ci0JfQorICAgIHByaXZhdGUgZmluYWwgSVJ1bnRpbWUgcnVudGltZTsKIAotCXB1YmxpYyB2b2lkIHJ1bihmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCW1vbml0b3Iuc3ViVGFzayhNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfUmVmcmVzaGluZ0J1bmRsZXNNZXNzYWdlKTsKLQkJaWYgKFJlcG9zaXRvcnlVdGlscy5kb2VzUnVudGltZVN1cHBvcnRSZXBvc2l0b3JpZXMocnVudGltZSkpIHsKLQkJCVNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLnJlZnJlc2hCdW5kbGVSZXBvc2l0b3J5KHJ1bnRpbWUpOwotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCX0KKyAgICBSZWZyZXNoQnVuZGxlSm9iKElSdW50aW1lIHJ1bnRpbWUpIHsKKyAgICAgICAgdGhpcy5ydW50aW1lID0gcnVudGltZTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIHZvaWQgZXhlY3V0ZShTaGVsbCBzaGVsbCwgSVJ1bnRpbWUgcnVudGltZSkgewotCQlSZWZyZXNoQnVuZGxlSm9iIGpvYiA9IG5ldyBSZWZyZXNoQnVuZGxlSm9iKHJ1bnRpbWUpOwotCQl0cnkgewotCQkJSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7Ci0JCQljb250ZXh0LnJ1bih0cnVlLCB0cnVlLCBqb2IpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUxKSB7Ci0JCQlTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoCi0JCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVyQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJIsVwcm9ibGVtIG9jY3VycmVkIHdoaWxlIHVwZGF0aW5nIHJlcG9zaXRvcnkiLCBlMSkpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CisgICAgcHVibGljIHZvaWQgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgbW9uaXRvci5zdWJUYXNrKE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9SZWZyZXNoaW5nQnVuZGxlc01lc3NhZ2UpOworICAgICAgICBpZiAoUmVwb3NpdG9yeVV0aWxzLmRvZXNSdW50aW1lU3VwcG9ydFJlcG9zaXRvcmllcyh0aGlzLnJ1bnRpbWUpKSB7CisgICAgICAgICAgICBTZXJ2ZXJDb3JlUGx1Z2luLmdldEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKS5yZWZyZXNoQnVuZGxlUmVwb3NpdG9yeSh0aGlzLnJ1bnRpbWUpOworICAgICAgICB9CisgICAgICAgIG1vbml0b3IuZG9uZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlKFNoZWxsIHNoZWxsLCBJUnVudGltZSBydW50aW1lKSB7CisgICAgICAgIFJlZnJlc2hCdW5kbGVKb2Igam9iID0gbmV3IFJlZnJlc2hCdW5kbGVKb2IocnVudGltZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJUnVubmFibGVDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKTsKKyAgICAgICAgICAgIGNvbnRleHQucnVuKHRydWUsIHRydWUsIGpvYik7CisgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgIFN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKKyAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlckNvcmVQbHVnaW4uUExVR0lOX0lELCAi77+9cHJvYmxlbSBvY2N1cnJlZCB3aGlsZSB1cGRhdGluZyByZXBvc2l0b3J5IiwgZTEpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9zb3J0ZXJzL0FydGVmYWN0U2lnbmF0dXJlU29ydGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvc29ydGVycy9BcnRlZmFjdFNpZ25hdHVyZVNvcnRlci5qYXZhCmluZGV4IDg1Mjg0ODYuLjk3NzBjNmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9zb3J0ZXJzL0FydGVmYWN0U2lnbmF0dXJlU29ydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3NvcnRlcnMvQXJ0ZWZhY3RTaWduYXR1cmVTb3J0ZXIuamF2YQpAQCAtMTcsMjYgKzE3LDI2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvamVjdHMuUHJvamVjdEJ1bmRsZVJvb3Q7CiAKIC8qKgotICogCisgKgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKLSAqIAorICoKICAqLwogcHVibGljIGNsYXNzIEFydGVmYWN0U2lnbmF0dXJlU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAwOwotCX0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpZiAoZTEgaW5zdGFuY2VvZiBQcm9qZWN0QnVuZGxlUm9vdCAmJiBlMiBpbnN0YW5jZW9mIFByb2plY3RCdW5kbGVSb290KSB7Ci0JCQlyZXR1cm4gY29tcGFyZSh2aWV3ZXIsICgoUHJvamVjdEJ1bmRsZVJvb3QpIGUxKS5nZXRBcnRlZmFjdCgpLAotCQkJCQkoKFByb2plY3RCdW5kbGVSb290KSBlMikuZ2V0QXJ0ZWZhY3QoKSk7Ci0JCX0KLQkJaWYgKGUxIGluc3RhbmNlb2YgQXJ0ZWZhY3QgJiYgZTIgaW5zdGFuY2VvZiBBcnRlZmFjdCkgewotCQkJcmV0dXJuICgoQXJ0ZWZhY3QpIGUxKS5nZXRTaWduYXR1cmUoKS5jb21wYXJlVG8oKChBcnRlZmFjdCkgZTIpLmdldFNpZ25hdHVyZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgY2F0ZWdvcnkoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7CisgICAgICAgIGlmIChlMSBpbnN0YW5jZW9mIFByb2plY3RCdW5kbGVSb290ICYmIGUyIGluc3RhbmNlb2YgUHJvamVjdEJ1bmRsZVJvb3QpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlKHZpZXdlciwgKChQcm9qZWN0QnVuZGxlUm9vdCkgZTEpLmdldEFydGVmYWN0KCksICgoUHJvamVjdEJ1bmRsZVJvb3QpIGUyKS5nZXRBcnRlZmFjdCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZTEgaW5zdGFuY2VvZiBBcnRlZmFjdCAmJiBlMiBpbnN0YW5jZW9mIEFydGVmYWN0KSB7CisgICAgICAgICAgICByZXR1cm4gKChBcnRlZmFjdCkgZTEpLmdldFNpZ25hdHVyZSgpLmNvbXBhcmVUbygoKEFydGVmYWN0KSBlMikuZ2V0U2lnbmF0dXJlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9zb3J0ZXJzL1JlcG9zaXRvcnlWaWV3ZXJTb3J0ZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS9pbnRlcm5hbC91aS9zb3J0ZXJzL1JlcG9zaXRvcnlWaWV3ZXJTb3J0ZXIuamF2YQppbmRleCAxODU1NWVhLi5mYTNlNjBiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvaW50ZXJuYWwvdWkvc29ydGVycy9SZXBvc2l0b3J5Vmlld2VyU29ydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL2ludGVybmFsL3VpL3NvcnRlcnMvUmVwb3NpdG9yeVZpZXdlclNvcnRlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnNvcnRlcnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKQEAgLTIyLDI4ICsyMywyOCBAQAogICovCiBwdWJsaWMgY2xhc3MgUmVwb3NpdG9yeVZpZXdlclNvcnRlciBleHRlbmRzIEFydGVmYWN0U2lnbmF0dXJlU29ydGVyIHsKIAotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgY2F0ZWdvcnkoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaW50IGNhdGVnb3J5ID0gMDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQXJ0ZWZhY3RUeXBlZCkgewotCQkJSUFydGVmYWN0VHlwZWQgdHlwZWQgPSAoSUFydGVmYWN0VHlwZWQpIGVsZW1lbnQ7Ci0JCQljYXRlZ29yeSA9IHR5cGVkLmdldEFydGVmYWN0VHlwZSgpLmdldE9yZGVyaW5nKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRlZmFjdFNldCkgewotCQkJY2F0ZWdvcnkgKz0gMTA7Ci0JCX0KLQkJaWYgKGNhdGVnb3J5ID4gMCkgewotCQkJcmV0dXJuIGNhdGVnb3J5OwotCQl9Ci0JCXJldHVybiBzdXBlci5jYXRlZ29yeShlbGVtZW50KTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjYXRlZ29yeShPYmplY3QgZWxlbWVudCkgeworICAgICAgICBpbnQgY2F0ZWdvcnkgPSAwOworICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBcnRlZmFjdFR5cGVkKSB7CisgICAgICAgICAgICBJQXJ0ZWZhY3RUeXBlZCB0eXBlZCA9IChJQXJ0ZWZhY3RUeXBlZCkgZWxlbWVudDsKKyAgICAgICAgICAgIGNhdGVnb3J5ID0gdHlwZWQuZ2V0QXJ0ZWZhY3RUeXBlKCkuZ2V0T3JkZXJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFydGVmYWN0U2V0KSB7CisgICAgICAgICAgICBjYXRlZ29yeSArPSAxMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2F0ZWdvcnkgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gY2F0ZWdvcnk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmNhdGVnb3J5KGVsZW1lbnQpOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpZiAoZTEgaW5zdGFuY2VvZiBMb2NhbEFydGVmYWN0U2V0ICYmIGUyIGluc3RhbmNlb2YgTG9jYWxBcnRlZmFjdFNldCkgewotCQkJcmV0dXJuICgoSUxvY2FsRW50aXR5KSBlMSkuZ2V0RmlsZSgpLmNvbXBhcmVUbygoKElMb2NhbEVudGl0eSkgZTIpLmdldEZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKKyAgICAgICAgaWYgKGUxIGluc3RhbmNlb2YgTG9jYWxBcnRlZmFjdFNldCAmJiBlMiBpbnN0YW5jZW9mIExvY2FsQXJ0ZWZhY3RTZXQpIHsKKyAgICAgICAgICAgIHJldHVybiAoKElMb2NhbEVudGl0eSkgZTEpLmdldEZpbGUoKS5jb21wYXJlVG8oKChJTG9jYWxFbnRpdHkpIGUyKS5nZXRGaWxlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS9TZXJ2ZXJFZGl0b3JQYWdlQ29udGVudFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvdWkvU2VydmVyRWRpdG9yUGFnZUNvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IGFmZjM5NTYuLmUyZDk0YTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS9TZXJ2ZXJFZGl0b3JQYWdlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL3VpL1NlcnZlckVkaXRvclBhZ2VDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aTsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKQEAgLTIxLDg4ICsyMiw4OCBAQAogCiAvKioKICAqIEdlbmVyaWMgc3VwcG9ydCBmb3Igc2VydmVyIHBhZ2VzLiBTaG91bGQgd29yayB3aXRoIGFsbCBXVFAgc2VydmVycy4KLSAqIAorICoKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCiAgKi8KIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCiBwdWJsaWMgY2xhc3MgU2VydmVyRWRpdG9yUGFnZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKIAotCXByaXZhdGUgSUVkaXRvclBhcnRbXSBwYWdlUGFydHM7CisgICAgcHJpdmF0ZSBJRWRpdG9yUGFydFtdIHBhZ2VQYXJ0czsKIAotCXByaXZhdGUgU2VydmVyRWRpdG9yIGVkaXRvcjsKKyAgICBwcml2YXRlIFNlcnZlckVkaXRvciBlZGl0b3I7CiAKLQlwdWJsaWMgU2VydmVyRWRpdG9yUGFnZUNvbnRlbnRQcm92aWRlcigpIHsKLQl9CisgICAgcHVibGljIFNlcnZlckVkaXRvclBhZ2VDb250ZW50UHJvdmlkZXIoKSB7CisgICAgfQogCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIFNlcnZlckVkaXRvcikgewotCQkJZWRpdG9yID0gKFNlcnZlckVkaXRvcikgbmV3SW5wdXQ7Ci0JCQlwYWdlUGFydHMgPSBuZXcgSUVkaXRvclBhcnRbZ2V0UGFnZUNvdW50KCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlUGFydHMubGVuZ3RoOyBpKyspIHsKLQkJCQlwYWdlUGFydHNbaV0gPSBnZXRFZGl0b3IoaSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisgICAgICAgIGlmIChuZXdJbnB1dCBpbnN0YW5jZW9mIFNlcnZlckVkaXRvcikgeworICAgICAgICAgICAgdGhpcy5lZGl0b3IgPSAoU2VydmVyRWRpdG9yKSBuZXdJbnB1dDsKKyAgICAgICAgICAgIHRoaXMucGFnZVBhcnRzID0gbmV3IElFZGl0b3JQYXJ0W2dldFBhZ2VDb3VudCgpXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5wYWdlUGFydHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0aGlzLnBhZ2VQYXJ0c1tpXSA9IGdldEVkaXRvcihpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQgPT0gZWRpdG9yICYmIHBhZ2VQYXJ0cy5sZW5ndGggPiAwOwotCX0KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgeworICAgICAgICByZXR1cm4gZWxlbWVudCA9PSB0aGlzLmVkaXRvciAmJiB0aGlzLnBhZ2VQYXJ0cy5sZW5ndGggPiAwOworICAgIH0KIAotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWZvciAoSUVkaXRvclBhcnQgcGFydCA6IHBhZ2VQYXJ0cykgewotCQkJaWYgKHBhcnQgPT0gZWxlbWVudCkgewotCQkJCXJldHVybiBlZGl0b3I7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgIGZvciAoSUVkaXRvclBhcnQgcGFydCA6IHRoaXMucGFnZVBhcnRzKSB7CisgICAgICAgICAgICBpZiAocGFydCA9PSBlbGVtZW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgPT0gZWRpdG9yKSB7Ci0JCQlyZXR1cm4gcGFnZVBhcnRzOwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworICAgICAgICBpZiAoaW5wdXRFbGVtZW50ID09IHRoaXMuZWRpdG9yKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5wYWdlUGFydHM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07CisgICAgfQogCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50ID09IGVkaXRvcikgewotCQkJcmV0dXJuIHBhZ2VQYXJ0czsKLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9CisgICAgcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7CisgICAgICAgIGlmIChwYXJlbnRFbGVtZW50ID09IHRoaXMuZWRpdG9yKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5wYWdlUGFydHM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07CisgICAgfQogCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KKyAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgfQogCi0JcHJpdmF0ZSBJRWRpdG9yUGFydCBnZXRFZGl0b3IoaW50IGluZGV4KSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gTXVsdGlQYWdlRWRpdG9yUGFydC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0RWRpdG9yIiwgbmV3IENsYXNzW10geyBJbnRlZ2VyLlRZUEUgfSk7Ci0JCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCU9iamVjdCByZXN1bHQgPSBtZXRob2QuaW52b2tlKGVkaXRvciwgbmV3IE9iamVjdFtdIHsgaW5kZXggfSk7Ci0JCQlyZXR1cm4gKElFZGl0b3JQYXJ0KSByZXN1bHQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KKyAgICBwcml2YXRlIElFZGl0b3JQYXJ0IGdldEVkaXRvcihpbnQgaW5kZXgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBNdWx0aVBhZ2VFZGl0b3JQYXJ0LmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRFZGl0b3IiLCBuZXcgQ2xhc3NbXSB7IEludGVnZXIuVFlQRSB9KTsKKyAgICAgICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgT2JqZWN0IHJlc3VsdCA9IG1ldGhvZC5pbnZva2UodGhpcy5lZGl0b3IsIG5ldyBPYmplY3RbXSB7IGluZGV4IH0pOworICAgICAgICAgICAgcmV0dXJuIChJRWRpdG9yUGFydCkgcmVzdWx0OworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIGludCBnZXRQYWdlQ291bnQoKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gTXVsdGlQYWdlRWRpdG9yUGFydC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0UGFnZUNvdW50IiwgbmV3IENsYXNzW10ge30pOwotCQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCQlPYmplY3QgcmVzdWx0ID0gbWV0aG9kLmludm9rZShlZGl0b3IsIG5ldyBPYmplY3RbXSB7fSk7Ci0JCQlyZXR1cm4gKEludGVnZXIpIHJlc3VsdDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQorICAgIHByaXZhdGUgaW50IGdldFBhZ2VDb3VudCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBNdWx0aVBhZ2VFZGl0b3JQYXJ0LmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRQYWdlQ291bnQiLCBuZXcgQ2xhc3NbXSB7fSk7CisgICAgICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIE9iamVjdCByZXN1bHQgPSBtZXRob2QuaW52b2tlKHRoaXMuZWRpdG9yLCBuZXcgT2JqZWN0W10ge30pOworICAgICAgICAgICAgcmV0dXJuIChJbnRlZ2VyKSByZXN1bHQ7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvdWkvU2VydmVyRWRpdG9yUGFnZUxhYmVsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS9TZXJ2ZXJFZGl0b3JQYWdlTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IGExNzQ2ZWQuLmYwZjhlZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS9TZXJ2ZXJFZGl0b3JQYWdlTGFiZWxQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS9TZXJ2ZXJFZGl0b3JQYWdlTGFiZWxQcm92aWRlci5qYXZhCkBAIC0yMyw0MiArMjMsNDIgQEAKICAqLwogcHVibGljIGNsYXNzIFNlcnZlckVkaXRvclBhZ2VMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIgewogCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgeworICAgICAgICAgICAgcmV0dXJuICgoSUVkaXRvclBhcnQpIGVsZW1lbnQpLmdldFRpdGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCXJldHVybiBQREVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfUEFHRV9PQkopOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgeworICAgICAgICAgICAgcmV0dXJuIFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldChQREVQbHVnaW5JbWFnZXMuREVTQ19QQUdFX09CSik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS92aWV3cy9BcnRlZmFjdENvbW1vblZpZXcuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS92aWV3cy9BcnRlZmFjdENvbW1vblZpZXcuamF2YQppbmRleCAzNmQwYjE3Li4xOWUyNDJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvdWkvdmlld3MvQXJ0ZWZhY3RDb21tb25WaWV3LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL3VpL3ZpZXdzL0FydGVmYWN0Q29tbW9uVmlldy5qYXZhCkBAIC0yNiw3NSArMjYsNzYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVNlcnZlcjsKIAogLyoqCi0gKiAKKyAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC51aS52aWV3cy5kZXBlbmRlbmNpZXMuRGVwZW5kZW5jaWVzVmlldwogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKLSAqIAorICoKICAqLwogQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKIHB1YmxpYyBjbGFzcyBBcnRlZmFjdENvbW1vblZpZXcgZXh0ZW5kcyBDb21tb25WaWV3IHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfQUNUSU9OX0dST1VQID0gImZpbHRlcnMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfQUNUSU9OX0dST1VQID0gImZpbHRlcnMiOwogCi0JcHJpdmF0ZSBJQnVuZGxlUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyIHJlcG9zaXRvcnlMaXN0ZW5lcjsKKyAgICBwcml2YXRlIElCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIgcmVwb3NpdG9yeUxpc3RlbmVyOwogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uTmF2aWdhdG9yI2NyZWF0ZVBhcnRDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgYVBhcmVudCkgeworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvciNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGFQYXJlbnQpIHsKIAotCQlzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChhUGFyZW50KTsKLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlJVG9vbEJhck1hbmFnZXIgbWFuYWdlciA9IGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKKyAgICAgICAgc3VwZXIuY3JlYXRlUGFydENvbnRyb2woYVBhcmVudCk7CisgICAgICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKKyAgICAgICAgSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7CiAKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihGSUxURVJfQUNUSU9OX0dST1VQKSk7Ci0JCUZpbHRlckFjdGlvbltdIGZpbHRlckFjdGlvbnMgPSBGaWx0ZXJBY3Rpb24uY3JlYXRlU2V0KHRoaXMpOwotCQlmb3IgKEZpbHRlckFjdGlvbiBhY3Rpb24gOiBmaWx0ZXJBY3Rpb25zKSB7Ci0JCQltYW5hZ2VyLmFwcGVuZFRvR3JvdXAoRklMVEVSX0FDVElPTl9HUk9VUCwgYWN0aW9uKTsKLQkJfQorICAgICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKEZJTFRFUl9BQ1RJT05fR1JPVVApKTsKKyAgICAgICAgRmlsdGVyQWN0aW9uW10gZmlsdGVyQWN0aW9ucyA9IEZpbHRlckFjdGlvbi5jcmVhdGVTZXQodGhpcyk7CisgICAgICAgIGZvciAoRmlsdGVyQWN0aW9uIGFjdGlvbiA6IGZpbHRlckFjdGlvbnMpIHsKKyAgICAgICAgICAgIG1hbmFnZXIuYXBwZW5kVG9Hcm91cChGSUxURVJfQUNUSU9OX0dST1VQLCBhY3Rpb24pOworICAgICAgICB9CiAKLQkJcmVwb3NpdG9yeUxpc3RlbmVyID0gbmV3IElCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBidW5kbGVSZXBvc2l0b3J5Q2hhbmdlZChJUnVudGltZSBydW50aW1lKSB7Ci0JCQkJcmVmcmVzaFZpZXcoKTsKLQkJCX0KLQkJfTsKLQkJU2VydmVyQ29yZVBsdWdpbi5nZXRBcnRlZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCkuYWRkQnVuZGxlUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyKHJlcG9zaXRvcnlMaXN0ZW5lcik7Ci0JfQorICAgICAgICB0aGlzLnJlcG9zaXRvcnlMaXN0ZW5lciA9IG5ldyBJQnVuZGxlUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyKCkgewogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS52aWV3cy5Db21tb25WaWV3I3JlZnJlc2hBbGwoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hBbGwoKSB7Ci0JCWZvciAoSVNlcnZlciBzZXJ2ZXIgOiBnZXRTZXJ2ZXJzKCkpIHsKLQkJCVJlZnJlc2hCdW5kbGVKb2IuZXhlY3V0ZShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgc2VydmVyLmdldFJ1bnRpbWUoKSk7Ci0JCQlTZXJ2ZXJQcm9qZWN0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb2plY3Qoc2VydmVyKS5yZWZyZXNoKCk7Ci0JCX0KLQkJc3VwZXIucmVmcmVzaEFsbCgpOwotCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJ1bmRsZVJlcG9zaXRvcnlDaGFuZ2VkKElSdW50aW1lIHJ1bnRpbWUpIHsKKyAgICAgICAgICAgICAgICByZWZyZXNoVmlldygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBTZXJ2ZXJDb3JlUGx1Z2luLmdldEFydGVmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKS5hZGRCdW5kbGVSZXBvc2l0b3J5Q2hhbmdlTGlzdGVuZXIodGhpcy5yZXBvc2l0b3J5TGlzdGVuZXIpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkudmlld3MuQ29tbW9uVmlldyNnZXRMaXN0Q29udGVudElkKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RDb250ZW50SWQoKSB7Ci0JCXJldHVybiBTZXJ2ZXJVaVBsdWdpbi5SVU5USU1FX0ZMQVRURU5FRF9BUlRFRkFDVFNfQ09OVEVOVF9JRDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS52aWV3cy5Db21tb25WaWV3I3JlZnJlc2hBbGwoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hBbGwoKSB7CisgICAgICAgIGZvciAoSVNlcnZlciBzZXJ2ZXIgOiBnZXRTZXJ2ZXJzKCkpIHsKKyAgICAgICAgICAgIFJlZnJlc2hCdW5kbGVKb2IuZXhlY3V0ZShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgc2VydmVyLmdldFJ1bnRpbWUoKSk7CisgICAgICAgICAgICBTZXJ2ZXJQcm9qZWN0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb2plY3Qoc2VydmVyKS5yZWZyZXNoKCk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIucmVmcmVzaEFsbCgpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkudmlld3MuQ29tbW9uVmlldyNnZXRUcmVlQ29udGVudElkKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRyZWVDb250ZW50SWQoKSB7Ci0JCXJldHVybiBTZXJ2ZXJVaVBsdWdpbi5SVU5USU1FX0FSVEVGQUNUU19DT05URU5UX0lEOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLnZpZXdzLkNvbW1vblZpZXcjZ2V0TGlzdENvbnRlbnRJZCgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0Q29udGVudElkKCkgeworICAgICAgICByZXR1cm4gU2VydmVyVWlQbHVnaW4uUlVOVElNRV9GTEFUVEVORURfQVJURUZBQ1RTX0NPTlRFTlRfSUQ7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS52aWV3cy5Db21tb25WaWV3I2dldFZpZXdJZCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaWV3SWQoKSB7Ci0JCXJldHVybiBTZXJ2ZXJVaVBsdWdpbi5BUlRFRkFDVFNfREVUQUlMX1ZJRVdfSUQ7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkudmlld3MuQ29tbW9uVmlldyNnZXRUcmVlQ29udGVudElkKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRyZWVDb250ZW50SWQoKSB7CisgICAgICAgIHJldHVybiBTZXJ2ZXJVaVBsdWdpbi5SVU5USU1FX0FSVEVGQUNUU19DT05URU5UX0lEOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkudmlld3MuQ29tbW9uVmlldyNnZXRWaWV3SWQoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Vmlld0lkKCkgeworICAgICAgICByZXR1cm4gU2VydmVyVWlQbHVnaW4uQVJURUZBQ1RTX0RFVEFJTF9WSUVXX0lEOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS92aWV3cy9Db21tb25WaWV3LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvdWkvdmlld3MvQ29tbW9uVmlldy5qYXZhCmluZGV4IDg4NjFkM2QuLjk5YzU4ZmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS92aWV3cy9Db21tb25WaWV3LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL3VpL3ZpZXdzL0NvbW1vblZpZXcuamF2YQpAQCAtNTMsMzUzICs1MywzNTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLmVkaXRvci5TZXJ2ZXJFZGl0b3I7CiAKIC8qKgotICogCisgKgogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKLSAqIAorICoKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1vblZpZXcgZXh0ZW5kcyBDb21tb25OYXZpZ2F0b3IgaW1wbGVtZW50cyBJU2VsZWN0aW9uTGlzdGVuZXIgewogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPV19WSUVXX0xJU1QgPSAic2hvd1ZpZXdMaXN0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX1ZJRVdfTElTVCA9ICJzaG93Vmlld0xpc3QiOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVfQUNUSU9OX0dST1VQID0gInRyZWUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkVFX0FDVElPTl9HUk9VUCA9ICJ0cmVlIjsKIAotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFydCBjdXJyZW50UGFydDsKKyAgICBwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgY3VycmVudFBhcnQ7CiAKLQlwcm90ZWN0ZWQgZmluYWwgSUxhYmVsUHJvdmlkZXIgdGl0bGVMYWJlbFByb3ZpZGVyID0gbmV3IFJ1bnRpbWVGdWxsTGFiZWxQcm92aWRlcigpOworICAgIHByb3RlY3RlZCBmaW5hbCBJTGFiZWxQcm92aWRlciB0aXRsZUxhYmVsUHJvdmlkZXIgPSBuZXcgUnVudGltZUZ1bGxMYWJlbFByb3ZpZGVyKCk7CiAKLQlSdW50aW1lQ29udGFpbmVyc0NvbnRlbnRQcm92aWRlciBjb250YWluZXJQcm92aWRlciA9IG5ldyBSdW50aW1lQ29udGFpbmVyc0NvbnRlbnRQcm92aWRlcigpOworICAgIFJ1bnRpbWVDb250YWluZXJzQ29udGVudFByb3ZpZGVyIGNvbnRhaW5lclByb3ZpZGVyID0gbmV3IFJ1bnRpbWVDb250YWluZXJzQ29udGVudFByb3ZpZGVyKCk7CiAKLQlwcml2YXRlIExpc3Q8SVNlcnZlcj4gc2VydmVycyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CisgICAgcHJpdmF0ZSBMaXN0PElTZXJ2ZXI+IHNlcnZlcnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfQUNUSU9OX0dST1VQID0gInJlZnJlc2giOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIX0FDVElPTl9HUk9VUCA9ICJyZWZyZXNoIjsKIAotCXByaXZhdGUgUmVmcmVzaEFydGVmYWN0c0FjdGlvbiByZWZyZXNoQWN0aW9uOworICAgIHByaXZhdGUgUmVmcmVzaEFydGVmYWN0c0FjdGlvbiByZWZyZXNoQWN0aW9uOwogCi0JcHJpdmF0ZSBib29sZWFuIHNob3dMaXN0OworICAgIHByaXZhdGUgYm9vbGVhbiBzaG93TGlzdDsKIAotCS8qKgotCSAqIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrIHRvIGRldGVybWluZSB0aGUgbGFzdCB2aWV3IHRoYXQgd2FzIGFjdGl2YXRlZCBieSB0aGUgdXNlciBpbiBvcmRlciB0byBkZXRlcm1pbmUgYQotCSAqIHNlbnNpYmxlIGlucHV0IGZvciBhbnkgbmV3bHkgYWN0aXZhdGVkIHZpZXdzLgotCSAqLwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgbGFzdFBhcnRIaW50OworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrIHRvIGRldGVybWluZSB0aGUgbGFzdCB2aWV3IHRoYXQgd2FzIGFjdGl2YXRlZCBieSB0aGUgdXNlciBpbiBvcmRlciB0byBkZXRlcm1pbmUgYQorICAgICAqIHNlbnNpYmxlIGlucHV0IGZvciBhbnkgbmV3bHkgYWN0aXZhdGVkIHZpZXdzLgorICAgICAqLworICAgIHByaXZhdGUgSVdvcmtiZW5jaFBhcnQgbGFzdFBhcnRIaW50OwogCi0JY2xhc3MgU2hvd0xpc3RBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlwdWJsaWMgU2hvd0xpc3RBY3Rpb24oKSB7Ci0JCQlzdXBlcigiIiwgQVNfUkFESU9fQlVUVE9OKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0VGV4dChQREVVSU1lc3NhZ2VzLkRlcGVuZGVuY2llc1ZpZXdfU2hvd0xpc3RBY3Rpb25fbGFiZWwpOwotCQkJc2V0RGVzY3JpcHRpb24oUERFVUlNZXNzYWdlcy5EZXBlbmRlbmNpZXNWaWV3X1Nob3dMaXN0QWN0aW9uX2Rlc2NyaXB0aW9uKTsKLQkJCXNldFRvb2xUaXBUZXh0KFBERVVJTWVzc2FnZXMuRGVwZW5kZW5jaWVzVmlld19TaG93TGlzdEFjdGlvbl90b29sdGlwKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihQREVQbHVnaW5JbWFnZXMuREVTQ19GTEFUX0xBWU9VVCk7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihQREVQbHVnaW5JbWFnZXMuREVTQ19GTEFUX0xBWU9VVF9ESVNBQkxFRCk7Ci0JCX0KKyAgICBjbGFzcyBTaG93TGlzdEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CiAKLQkJLyoKLQkJICogQHNlZSBBY3Rpb24jYWN0aW9uUGVyZm9ybWVkCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKGlzQ2hlY2tlZCgpKSB7Ci0JCQkJaWYgKG1lbWVudG8gIT0gbnVsbCkgewotCQkJCQltZW1lbnRvLnB1dEJvb2xlYW4oU0hPV19WSUVXX0xJU1QsIHRydWUpOwotCQkJCX0KLQkJCQlzaG93TGlzdCA9IHRydWU7Ci0JCQkJdXBkYXRlQWN0aXZhdGlvbnMoKTsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgcHVibGljIFNob3dMaXN0QWN0aW9uKCkgeworICAgICAgICAgICAgc3VwZXIoIiIsIEFTX1JBRElPX0JVVFRPTik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHNldFRleHQoUERFVUlNZXNzYWdlcy5EZXBlbmRlbmNpZXNWaWV3X1Nob3dMaXN0QWN0aW9uX2xhYmVsKTsKKyAgICAgICAgICAgIHNldERlc2NyaXB0aW9uKFBERVVJTWVzc2FnZXMuRGVwZW5kZW5jaWVzVmlld19TaG93TGlzdEFjdGlvbl9kZXNjcmlwdGlvbik7CisgICAgICAgICAgICBzZXRUb29sVGlwVGV4dChQREVVSU1lc3NhZ2VzLkRlcGVuZGVuY2llc1ZpZXdfU2hvd0xpc3RBY3Rpb25fdG9vbHRpcCk7CisgICAgICAgICAgICBzZXRJbWFnZURlc2NyaXB0b3IoUERFUGx1Z2luSW1hZ2VzLkRFU0NfRkxBVF9MQVlPVVQpOworICAgICAgICAgICAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUERFUGx1Z2luSW1hZ2VzLkRFU0NfRkxBVF9MQVlPVVRfRElTQUJMRUQpOworICAgICAgICB9CiAKLQljbGFzcyBTaG93VHJlZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisgICAgICAgIC8qCisgICAgICAgICAqIEBzZWUgQWN0aW9uI2FjdGlvblBlcmZvcm1lZAorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChDb21tb25WaWV3LnRoaXMubWVtZW50byAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIENvbW1vblZpZXcudGhpcy5tZW1lbnRvLnB1dEJvb2xlYW4oU0hPV19WSUVXX0xJU1QsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb21tb25WaWV3LnRoaXMuc2hvd0xpc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIHVwZGF0ZUFjdGl2YXRpb25zKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkJcHVibGljIFNob3dUcmVlQWN0aW9uKCkgewotCQkJc3VwZXIoIiIsIEFTX1JBRElPX0JVVFRPTik7IC8vJE5PTi1OTFMtMSQKLQkJCXNldFRleHQoUERFVUlNZXNzYWdlcy5EZXBlbmRlbmNpZXNWaWV3X1Nob3dUcmVlQWN0aW9uX2xhYmVsKTsKLQkJCXNldERlc2NyaXB0aW9uKFBERVVJTWVzc2FnZXMuRGVwZW5kZW5jaWVzVmlld19TaG93VHJlZUFjdGlvbl9kZXNjcmlwdGlvbik7Ci0JCQlzZXRUb29sVGlwVGV4dChQREVVSU1lc3NhZ2VzLkRlcGVuZGVuY2llc1ZpZXdfU2hvd1RyZWVBY3Rpb25fdG9vbHRpcCk7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoUERFUGx1Z2luSW1hZ2VzLkRFU0NfSElFUkFSQ0hJQ0FMX0xBWU9VVCk7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihQREVQbHVnaW5JbWFnZXMuREVTQ19ISUVSQVJDSElDQUxfTEFZT1VUX0RJU0FCTEVEKTsKLQkJfQorICAgIGNsYXNzIFNob3dUcmVlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKIAotCQkvKgotCQkgKiBAc2VlIEFjdGlvbiNhY3Rpb25QZXJmb3JtZWQKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoaXNDaGVja2VkKCkpIHsKLQkJCQlpZiAobWVtZW50byAhPSBudWxsKSB7Ci0JCQkJCW1lbWVudG8ucHV0Qm9vbGVhbihTSE9XX1ZJRVdfTElTVCwgZmFsc2UpOwotCQkJCX0KLQkJCQlzaG93TGlzdCA9IGZhbHNlOwotCQkJCXVwZGF0ZUFjdGl2YXRpb25zKCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBTaG93VHJlZUFjdGlvbigpIHsKKyAgICAgICAgICAgIHN1cGVyKCIiLCBBU19SQURJT19CVVRUT04pOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBzZXRUZXh0KFBERVVJTWVzc2FnZXMuRGVwZW5kZW5jaWVzVmlld19TaG93VHJlZUFjdGlvbl9sYWJlbCk7CisgICAgICAgICAgICBzZXREZXNjcmlwdGlvbihQREVVSU1lc3NhZ2VzLkRlcGVuZGVuY2llc1ZpZXdfU2hvd1RyZWVBY3Rpb25fZGVzY3JpcHRpb24pOworICAgICAgICAgICAgc2V0VG9vbFRpcFRleHQoUERFVUlNZXNzYWdlcy5EZXBlbmRlbmNpZXNWaWV3X1Nob3dUcmVlQWN0aW9uX3Rvb2x0aXApOworICAgICAgICAgICAgc2V0SW1hZ2VEZXNjcmlwdG9yKFBERVBsdWdpbkltYWdlcy5ERVNDX0hJRVJBUkNISUNBTF9MQVlPVVQpOworICAgICAgICAgICAgc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUERFUGx1Z2luSW1hZ2VzLkRFU0NfSElFUkFSQ0hJQ0FMX0xBWU9VVF9ESVNBQkxFRCk7CisgICAgICAgIH0KIAotCWNsYXNzIFJlZnJlc2hBcnRlZmFjdHNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworICAgICAgICAvKgorICAgICAgICAgKiBAc2VlIEFjdGlvbiNhY3Rpb25QZXJmb3JtZWQKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpZiAoaXNDaGVja2VkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVmlldy50aGlzLm1lbWVudG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBDb21tb25WaWV3LnRoaXMubWVtZW50by5wdXRCb29sZWFuKFNIT1dfVklFV19MSVNULCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbW1vblZpZXcudGhpcy5zaG93TGlzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHVwZGF0ZUFjdGl2YXRpb25zKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkJcHVibGljIFJlZnJlc2hBcnRlZmFjdHNBY3Rpb24oKSB7Ci0JCQlzdXBlcigiIiwgQVNfUFVTSF9CVVRUT04pOyAvLyROT04tTkxTLTEkCi0JCQlzZXRUZXh0KE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9SZWZyZXNoKTsKLQkJCXNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLlJlcG9zaXRvcnlCcm93c2VyRWRpdG9yUGFnZV9SZWZyZXNoTWVzc2FnZSk7Ci0JCQlzZXRUb29sVGlwVGV4dChNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfUmVmcmVzaE1lc3NhZ2UpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFBERVBsdWdpbkltYWdlcy5ERVNDX1JFRlJFU0gpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUERFUGx1Z2luSW1hZ2VzLkRFU0NfUkVGUkVTSF9ESVNBQkxFRCk7Ci0JCX0KKyAgICBjbGFzcyBSZWZyZXNoQXJ0ZWZhY3RzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKIAotCQkvKgotCQkgKiBAc2VlIEFjdGlvbiNhY3Rpb25QZXJmb3JtZWQKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlyZWZyZXNoQWxsKCk7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBSZWZyZXNoQXJ0ZWZhY3RzQWN0aW9uKCkgeworICAgICAgICAgICAgc3VwZXIoIiIsIEFTX1BVU0hfQlVUVE9OKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgc2V0VGV4dChNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfUmVmcmVzaCk7CisgICAgICAgICAgICBzZXREZXNjcmlwdGlvbihNZXNzYWdlcy5SZXBvc2l0b3J5QnJvd3NlckVkaXRvclBhZ2VfUmVmcmVzaE1lc3NhZ2UpOworICAgICAgICAgICAgc2V0VG9vbFRpcFRleHQoTWVzc2FnZXMuUmVwb3NpdG9yeUJyb3dzZXJFZGl0b3JQYWdlX1JlZnJlc2hNZXNzYWdlKTsKKyAgICAgICAgICAgIHNldEltYWdlRGVzY3JpcHRvcihQREVQbHVnaW5JbWFnZXMuREVTQ19SRUZSRVNIKTsKKyAgICAgICAgICAgIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFBERVBsdWdpbkltYWdlcy5ERVNDX1JFRlJFU0hfRElTQUJMRUQpOworICAgICAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbW9uVmlld2VyIGNyZWF0ZUNvbW1vblZpZXdlck9iamVjdChDb21wb3NpdGUgYVBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbW1vblZpZXdlcihnZXRWaWV3SWQoKSwgYVBhcmVudCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQl9CisgICAgICAgIC8qCisgICAgICAgICAqIEBzZWUgQWN0aW9uI2FjdGlvblBlcmZvcm1lZAorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIHJlZnJlc2hBbGwoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaWV3KCkgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0Q29tbW9uVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZ2V0Q29tbW9uVmlld2VyKCkuc2V0SW5wdXQoZ2V0Q29tbW9uVmlld2VyKCkuZ2V0SW5wdXQoKSk7Ci0JCQkJZ2V0Q29tbW9uVmlld2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ29tbW9uVmlld2VyIGNyZWF0ZUNvbW1vblZpZXdlck9iamVjdChDb21wb3NpdGUgYVBhcmVudCkgeworICAgICAgICByZXR1cm4gbmV3IENvbW1vblZpZXdlcihnZXRWaWV3SWQoKSwgYVBhcmVudCwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3IjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBhUGFyZW50KSB7Ci0JCWZvciAoSVZpZXdSZWZlcmVuY2Ugdmlld1JlZmVyZW5jZSA6IGdldFZpZXdTaXRlKCkuZ2V0UGFnZSgpLmdldFZpZXdSZWZlcmVuY2VzKCkpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSB2aWV3UmVmZXJlbmNlLmdldFBhcnQoZmFsc2UpOwotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBTZXJ2ZXJzVmlldzIgJiYgcGFydCAhPSB0aGlzKSB7Ci0JCQkJbGFzdFBhcnRIaW50ID0gcGFydDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobGFzdFBhcnRIaW50ID09IG51bGwpIHsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGdldFZpZXdTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIFNlcnZlckVkaXRvcikgewotCQkJCWxhc3RQYXJ0SGludCA9IGVkaXRvcjsKLQkJCX0KLQkJfQorICAgIHByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaWV3KCkgeworICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewogCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRDb21tb25WaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBnZXRDb21tb25WaWV3ZXIoKS5zZXRJbnB1dChnZXRDb21tb25WaWV3ZXIoKS5nZXRJbnB1dCgpKTsKKyAgICAgICAgICAgICAgICBnZXRDb21tb25WaWV3ZXIoKS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQogCi0JCWlmIChpc1N1cHBvcnRzTGlzdFRyZWUoKSkgewotCQkJc2hvd0xpc3QgPSBmYWxzZTsKLQkJCWlmIChnZXRNZW1lbnRvKCkgIT0gbnVsbCkgewotCQkJCUJvb2xlYW4gdmFsdWUgPSBnZXRNZW1lbnRvKCkuZ2V0Qm9vbGVhbihTSE9XX1ZJRVdfTElTVCk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJc2hvd0xpc3QgPSB2YWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlTaG93VHJlZUFjdGlvbiBzaG93VHJlZUFjdGlvbiA9IG5ldyBTaG93VHJlZUFjdGlvbigpOwotCQkJc2hvd1RyZWVBY3Rpb24uc2V0Q2hlY2tlZCghc2hvd0xpc3QpOwotCQkJU2hvd0xpc3RBY3Rpb24gc2hvd0xpc3RBY3Rpb24gPSBuZXcgU2hvd0xpc3RBY3Rpb24oKTsKLQkJCXNob3dMaXN0QWN0aW9uLnNldENoZWNrZWQoc2hvd0xpc3QpOwotCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihUUkVFX0FDVElPTl9HUk9VUCkpOwotCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigicHJlc2VudGF0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JCQltYW5hZ2VyLmFwcGVuZFRvR3JvdXAoInByZXNlbnRhdGlvbiIsIHNob3dUcmVlQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJbWFuYWdlci5hcHBlbmRUb0dyb3VwKCJwcmVzZW50YXRpb24iLCBzaG93TGlzdEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvciNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGFQYXJlbnQpIHsKKyAgICAgICAgZm9yIChJVmlld1JlZmVyZW5jZSB2aWV3UmVmZXJlbmNlIDogZ2V0Vmlld1NpdGUoKS5nZXRQYWdlKCkuZ2V0Vmlld1JlZmVyZW5jZXMoKSkgeworICAgICAgICAgICAgSVdvcmtiZW5jaFBhcnQgcGFydCA9IHZpZXdSZWZlcmVuY2UuZ2V0UGFydChmYWxzZSk7CisgICAgICAgICAgICBpZiAocGFydCBpbnN0YW5jZW9mIFNlcnZlcnNWaWV3MiAmJiBwYXJ0ICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmxhc3RQYXJ0SGludCA9IHBhcnQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMubGFzdFBhcnRIaW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IGdldFZpZXdTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOworICAgICAgICAgICAgaWYgKGVkaXRvciBpbnN0YW5jZW9mIFNlcnZlckVkaXRvcikgeworICAgICAgICAgICAgICAgIHRoaXMubGFzdFBhcnRIaW50ID0gZWRpdG9yOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJc3VwZXIuY3JlYXRlUGFydENvbnRyb2woYVBhcmVudCk7CisgICAgICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKKyAgICAgICAgSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7CiAKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihSRUZSRVNIX0FDVElPTl9HUk9VUCkpOwotCQlyZWZyZXNoQWN0aW9uID0gbmV3IFJlZnJlc2hBcnRlZmFjdHNBY3Rpb24oKTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJbWFuYWdlci5hcHBlbmRUb0dyb3VwKFJFRlJFU0hfQUNUSU9OX0dST1VQLCByZWZyZXNoQWN0aW9uKTsKKyAgICAgICAgaWYgKGlzU3VwcG9ydHNMaXN0VHJlZSgpKSB7CisgICAgICAgICAgICB0aGlzLnNob3dMaXN0ID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoZ2V0TWVtZW50bygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBCb29sZWFuIHZhbHVlID0gZ2V0TWVtZW50bygpLmdldEJvb2xlYW4oU0hPV19WSUVXX0xJU1QpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0xpc3QgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTaG93VHJlZUFjdGlvbiBzaG93VHJlZUFjdGlvbiA9IG5ldyBTaG93VHJlZUFjdGlvbigpOworICAgICAgICAgICAgc2hvd1RyZWVBY3Rpb24uc2V0Q2hlY2tlZCghdGhpcy5zaG93TGlzdCk7CisgICAgICAgICAgICBTaG93TGlzdEFjdGlvbiBzaG93TGlzdEFjdGlvbiA9IG5ldyBTaG93TGlzdEFjdGlvbigpOworICAgICAgICAgICAgc2hvd0xpc3RBY3Rpb24uc2V0Q2hlY2tlZCh0aGlzLnNob3dMaXN0KTsKKyAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoVFJFRV9BQ1RJT05fR1JPVVApKTsKKyAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInByZXNlbnRhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgbWFuYWdlci5hcHBlbmRUb0dyb3VwKCJwcmVzZW50YXRpb24iLCBzaG93VHJlZUFjdGlvbik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIG1hbmFnZXIuYXBwZW5kVG9Hcm91cCgicHJlc2VudGF0aW9uIiwgc2hvd0xpc3RBY3Rpb24pOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KIAotCQlnZXRDb21tb25WaWV3ZXIoKS5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgc3VwZXIuY3JlYXRlUGFydENvbnRyb2woYVBhcmVudCk7CiAKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCWZpbmFsIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCQlPcGVuU2VydmVyUHJvamVjdEZpbGVBY3Rpb24gZmlsZUFjdGlvbiA9IG5ldyBPcGVuU2VydmVyUHJvamVjdEZpbGVBY3Rpb24oZ2V0U2l0ZSgpLmdldFBhZ2UoKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkgewotCQkJCQkJCXJldHVybiBzZWw7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCWlmIChmaWxlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzZWwpKSB7Ci0JCQkJCQlmaWxlQWN0aW9uLnJ1bigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdXBkYXRlQWN0aXZhdGlvbnMoKTsKKyAgICAgICAgbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihSRUZSRVNIX0FDVElPTl9HUk9VUCkpOworICAgICAgICB0aGlzLnJlZnJlc2hBY3Rpb24gPSBuZXcgUmVmcmVzaEFydGVmYWN0c0FjdGlvbigpOworICAgICAgICB0aGlzLnJlZnJlc2hBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIG1hbmFnZXIuYXBwZW5kVG9Hcm91cChSRUZSRVNIX0FDVElPTl9HUk9VUCwgdGhpcy5yZWZyZXNoQWN0aW9uKTsKIAotCQlnZXRWaWV3U2l0ZSgpLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIobmV3IElQYXJ0TGlzdGVuZXIoKSB7CisgICAgICAgIGdldENvbW1vblZpZXdlcigpLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewogCi0JCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBPcGVuU2VydmVyUHJvamVjdEZpbGVBY3Rpb24gZmlsZUFjdGlvbiA9IG5ldyBPcGVuU2VydmVyUHJvamVjdEZpbGVBY3Rpb24oZ2V0U2l0ZSgpLmdldFBhZ2UoKSkgewogCi0JCQlwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzZWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlQWN0aW9uLnJ1bigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdXBkYXRlQWN0aXZhdGlvbnMoKTsKIAotCQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQl9CisgICAgICAgIGdldFZpZXdTaXRlKCkuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcihuZXcgSVBhcnRMaXN0ZW5lcigpIHsKIAotCQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKKyAgICAgICAgICAgIH0KIAotCQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkJaWYgKHBhcnQgPT0gQ29tbW9uVmlldy50aGlzKSB7Ci0JCQkJCWFjdGl2YXRlZCgpOwotCQkJCX0KLQkJCX0KLQkJfSk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0RGVhY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgeworICAgICAgICAgICAgfQogCi0JCWFjdGl2YXRlZCgpOwotCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgeworICAgICAgICAgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCkgewotCQlTdHJpbmcgdGl0bGUgPSAiKE5vIFNlbGVjdGlvbikiOwotCQlPYmplY3QgaW5wdXQgPSBnZXRDb21tb25WaWV3ZXIoKS5nZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiAhc2VydmVycy5pc0VtcHR5KCkpIHsKLQkJCXRpdGxlID0gdGl0bGVMYWJlbFByb3ZpZGVyLmdldFRleHQoaW5wdXQpOwotCQl9Ci0JCXNldENvbnRlbnREZXNjcmlwdGlvbih0aXRsZSk7Ci0JfQorICAgICAgICAgICAgcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7CisgICAgICAgICAgICB9CiAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIElTZWxlY3Rpb25MaXN0ZW5lci4KLQkgKiBOb3RpZnkgdGhlIGN1cnJlbnQgcGFnZSB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbCkgewotCQlMaXN0PElTZXJ2ZXI+IGxhc3RTZXJ2ZXJzID0gc2VydmVyczsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBTZXJ2ZXJzVmlldzIgJiYgcGFydCAhPSB0aGlzKSB7Ci0JCQlpZiAoc2VsIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCWxhc3RQYXJ0SGludCA9IHBhcnQ7Ci0JCQkJSXRlcmF0b3I8T2JqZWN0PiBpdGVtcyA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsKS5pdGVyYXRvcigpOwotCQkJCXNlcnZlcnMgPSBuZXcgQXJyYXlMaXN0PElTZXJ2ZXI+KCk7Ci0JCQkJd2hpbGUgKGl0ZW1zLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgbmV4dCA9IGl0ZW1zLm5leHQoKTsKLQkJCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBJU2VydmVyKSB7Ci0JCQkJCQlJU2VydmVyIHNlcnZlciA9IChJU2VydmVyKSBuZXh0OwotCQkJCQkJaWYgKFNlcnZlclByb2plY3QuaXNWaXJnbyhzZXJ2ZXIpKSB7Ci0JCQkJCQkJc2VydmVycy5hZGQoc2VydmVyKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXNlcnZlcnMuZXF1YWxzKGxhc3RTZXJ2ZXJzKSkgewotCQkJCQl1cGRhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQlJU2VydmVyIHZpcmdvU2VydmVyID0gVmlyZ29FZGl0b3JBZGFwdGVyRmFjdG9yeS5nZXRWaXJnb1NlcnZlcigoSUVkaXRvclBhcnQpIHBhcnQpOwotCQkJaWYgKHZpcmdvU2VydmVyICE9IG51bGwpIHsKLQkJCQlzZXJ2ZXJzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh2aXJnb1NlcnZlcik7Ci0JCQkJbGFzdFBhcnRIaW50ID0gcGFydDsKLQkJCQlpZiAoIXNlcnZlcnMuZXF1YWxzKGxhc3RTZXJ2ZXJzKSkgewotCQkJCQl1cGRhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0JCXJlZnJlc2hBY3Rpb24uc2V0RW5hYmxlZCghc2VydmVycy5pc0VtcHR5KCkpOwotCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgeworICAgICAgICAgICAgICAgIGlmIChwYXJ0ID09IENvbW1vblZpZXcudGhpcykgeworICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQlnZXRDb21tb25WaWV3ZXIoKS5zZXRJbnB1dChzZXJ2ZXJzKTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRFbmFibGVkKCFnZXRTZXJ2ZXJzKCkuaXNFbXB0eSgpKTsKLQkJZ2V0Q29tbW9uVmlld2VyKCkucmVmcmVzaCgpOwotCX0KKyAgICAgICAgYWN0aXZhdGVkKCk7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uTmF2aWdhdG9yI3NhdmVTdGF0ZShvcmcuZWNsaXBzZS51aS5JTWVtZW50bykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsKLQkJc3VwZXIuc2F2ZVN0YXRlKGFNZW1lbnRvKTsKLQkJaWYgKGlzU3VwcG9ydHNMaXN0VHJlZSgpKSB7Ci0JCQlhTWVtZW50by5wdXRCb29sZWFuKFNIT1dfVklFV19MSVNULCBzaG93TGlzdCk7Ci0JCX0KLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCkgeworICAgICAgICBTdHJpbmcgdGl0bGUgPSAiKE5vIFNlbGVjdGlvbikiOworICAgICAgICBPYmplY3QgaW5wdXQgPSBnZXRDb21tb25WaWV3ZXIoKS5nZXRJbnB1dCgpOworICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiAhdGhpcy5zZXJ2ZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGl0bGUgPSB0aGlzLnRpdGxlTGFiZWxQcm92aWRlci5nZXRUZXh0KGlucHV0KTsKKyAgICAgICAgfQorICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24odGl0bGUpOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvciNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZSwgb3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1NpdGUgc2l0ZSwgSU1lbWVudG8gbWVtZW50bykgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc2l0ZS5nZXRQYWdlKCkuYWRkUG9zdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5pbml0KHNpdGUsIG1lbWVudG8pOwotCX0KKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElTZWxlY3Rpb25MaXN0ZW5lci4gTm90aWZ5IHRoZSBjdXJyZW50IHBhZ2UgdGhhdCB0aGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWwpIHsKKyAgICAgICAgTGlzdDxJU2VydmVyPiBsYXN0U2VydmVycyA9IHRoaXMuc2VydmVyczsKKyAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBTZXJ2ZXJzVmlldzIgJiYgcGFydCAhPSB0aGlzKSB7CisgICAgICAgICAgICBpZiAoc2VsIGluc3RhbmNlb2YgU3RydWN0dXJlZFNlbGVjdGlvbikgeworICAgICAgICAgICAgICAgIHRoaXMubGFzdFBhcnRIaW50ID0gcGFydDsKKyAgICAgICAgICAgICAgICBJdGVyYXRvcjxPYmplY3Q+IGl0ZW1zID0gKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXJzID0gbmV3IEFycmF5TGlzdDxJU2VydmVyPigpOworICAgICAgICAgICAgICAgIHdoaWxlIChpdGVtcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG5leHQgPSBpdGVtcy5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0IGluc3RhbmNlb2YgSVNlcnZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJQcm9qZWN0LmlzVmlyZ28oc2VydmVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVycy5hZGQoc2VydmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2VydmVycy5lcXVhbHMobGFzdFNlcnZlcnMpKSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKKyAgICAgICAgICAgIElTZXJ2ZXIgdmlyZ29TZXJ2ZXIgPSBWaXJnb0VkaXRvckFkYXB0ZXJGYWN0b3J5LmdldFZpcmdvU2VydmVyKChJRWRpdG9yUGFydCkgcGFydCk7CisgICAgICAgICAgICBpZiAodmlyZ29TZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVycyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodmlyZ29TZXJ2ZXIpOworICAgICAgICAgICAgICAgIHRoaXMubGFzdFBhcnRIaW50ID0gcGFydDsKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2VydmVycy5lcXVhbHMobGFzdFNlcnZlcnMpKSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1cGRhdGVDb250ZW50RGVzY3JpcHRpb24oKTsKKyAgICAgICAgdGhpcy5yZWZyZXNoQWN0aW9uLnNldEVuYWJsZWQoIXRoaXMuc2VydmVycy5pc0VtcHR5KCkpOworICAgIH0KIAotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgb24gSVdvcmtiZW5jaFBhcnQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJY3VycmVudFBhcnQgPSBudWxsOwotCQlsYXN0UGFydEhpbnQgPSBudWxsOwotCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7CisgICAgICAgIGdldENvbW1vblZpZXdlcigpLnNldElucHV0KHRoaXMuc2VydmVycyk7CisgICAgICAgIHRoaXMucmVmcmVzaEFjdGlvbi5zZXRFbmFibGVkKCFnZXRTZXJ2ZXJzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgZ2V0Q29tbW9uVmlld2VyKCkucmVmcmVzaCgpOworICAgIH0KIAotCXB1YmxpYyBMaXN0PElTZXJ2ZXI+IGdldFNlcnZlcnMoKSB7Ci0JCXJldHVybiBzZXJ2ZXJzOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3Ijc2F2ZVN0YXRlKG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBhTWVtZW50bykgeworICAgICAgICBzdXBlci5zYXZlU3RhdGUoYU1lbWVudG8pOworICAgICAgICBpZiAoaXNTdXBwb3J0c0xpc3RUcmVlKCkpIHsKKyAgICAgICAgICAgIGFNZW1lbnRvLnB1dEJvb2xlYW4oU0hPV19WSUVXX0xJU1QsIHRoaXMuc2hvd0xpc3QpOworICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEFsbCgpIHsKLQkJZm9yIChJU2VydmVyIHNlcnZlciA6IGdldFNlcnZlcnMoKSkgewotCQkJU2VydmVyUHJvamVjdCBwcm9qZWN0ID0gU2VydmVyUHJvamVjdE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0KHNlcnZlcik7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJcHJvamVjdC5yZWZyZXNoRGlyZWN0b3JpZXMoKTsKLQkJCX0KLQkJfQotCQlyZWZyZXNoVmlldygpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1NpdGUsIG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUsIElNZW1lbnRvIG1lbWVudG8pIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7CisgICAgICAgIHNpdGUuZ2V0UGFnZSgpLmFkZFBvc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgc3VwZXIuaW5pdChzaXRlLCBtZW1lbnRvKTsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dMaXN0KCkgewotCQlyZXR1cm4gaXNTdXBwb3J0c0xpc3RUcmVlKCkgJiYgc2hvd0xpc3Q7Ci0JfQorICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gSVdvcmtiZW5jaFBhcnQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgc3VwZXIuZGlzcG9zZSgpOworICAgICAgICBnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgdGhpcy5jdXJyZW50UGFydCA9IG51bGw7CisgICAgICAgIHRoaXMubGFzdFBhcnRIaW50ID0gbnVsbDsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFRyZWVDb250ZW50SWQoKTsKKyAgICBwdWJsaWMgTGlzdDxJU2VydmVyPiBnZXRTZXJ2ZXJzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zZXJ2ZXJzOworICAgIH0KIAotCS8qKgotCSAqIE1heSByZXR1cm4gbnVsbCBpbiB3aGljaCBjYXNlIHdlIHdvbid0IHNob3cgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RDb250ZW50SWQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQWxsKCkgeworICAgICAgICBmb3IgKElTZXJ2ZXIgc2VydmVyIDogZ2V0U2VydmVycygpKSB7CisgICAgICAgICAgICBTZXJ2ZXJQcm9qZWN0IHByb2plY3QgPSBTZXJ2ZXJQcm9qZWN0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb2plY3Qoc2VydmVyKTsKKyAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwcm9qZWN0LnJlZnJlc2hEaXJlY3RvcmllcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlZnJlc2hWaWV3KCk7CisgICAgfQogCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWaWV3SWQoKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Nob3dMaXN0KCkgeworICAgICAgICByZXR1cm4gaXNTdXBwb3J0c0xpc3RUcmVlKCkgJiYgdGhpcy5zaG93TGlzdDsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1N1cHBvcnRzTGlzdFRyZWUoKSB7Ci0JCXJldHVybiBnZXRMaXN0Q29udGVudElkKCkgIT0gbnVsbDsKLQl9CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRUcmVlQ29udGVudElkKCk7CiAKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBY3RpdmF0aW9ucygpIHsKLQkJSU5hdmlnYXRvckFjdGl2YXRpb25TZXJ2aWNlIGFjdGl2YXRpb25TZXJ2aWNlID0gZ2V0Q29tbW9uVmlld2VyKCkuZ2V0TmF2aWdhdG9yQ29udGVudFNlcnZpY2UoKQotCQkJCS5nZXRBY3RpdmF0aW9uU2VydmljZSgpOwotCQlpZiAoIWlzU3VwcG9ydHNMaXN0VHJlZSgpKSB7Ci0JCQlhY3RpdmF0aW9uU2VydmljZS5hY3RpdmF0ZUV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHsgZ2V0VHJlZUNvbnRlbnRJZCgpIH0sIGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChpc1Nob3dMaXN0KCkpIHsKLQkJCQlhY3RpdmF0aW9uU2VydmljZS5kZWFjdGl2YXRlRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyBnZXRUcmVlQ29udGVudElkKCkgfSwgZmFsc2UpOwotCQkJCWFjdGl2YXRpb25TZXJ2aWNlLmFjdGl2YXRlRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyBnZXRMaXN0Q29udGVudElkKCkgfSwgZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlhY3RpdmF0aW9uU2VydmljZS5kZWFjdGl2YXRlRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyBnZXRMaXN0Q29udGVudElkKCkgfSwgZmFsc2UpOwotCQkJCWFjdGl2YXRpb25TZXJ2aWNlLmFjdGl2YXRlRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyBnZXRUcmVlQ29udGVudElkKCkgfSwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIE1heSByZXR1cm4gbnVsbCBpbiB3aGljaCBjYXNlIHdlIHdvbid0IHNob3cgbGlzdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RDb250ZW50SWQoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlZCgpIHsKLQkJaWYgKGxhc3RQYXJ0SGludCBpbnN0YW5jZW9mIFNlcnZlcnNWaWV3MikgewotCQkJc2VsZWN0aW9uQ2hhbmdlZChsYXN0UGFydEhpbnQsICgoU2VydmVyc1ZpZXcyKSBsYXN0UGFydEhpbnQpLmdldENvbW1vblZpZXdlcigpLmdldFNlbGVjdGlvbigpKTsKLQkJfSBlbHNlIGlmIChsYXN0UGFydEhpbnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJSVNlcnZlciB2aXJnb1NlcnZlciA9IFZpcmdvRWRpdG9yQWRhcHRlckZhY3RvcnkuZ2V0VmlyZ29TZXJ2ZXIoKElFZGl0b3JQYXJ0KSBsYXN0UGFydEhpbnQpOwotCQkJaWYgKHZpcmdvU2VydmVyICE9IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkKGxhc3RQYXJ0SGludCwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWaWV3SWQoKTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzU3VwcG9ydHNMaXN0VHJlZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldExpc3RDb250ZW50SWQoKSAhPSBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUFjdGl2YXRpb25zKCkgeworICAgICAgICBJTmF2aWdhdG9yQWN0aXZhdGlvblNlcnZpY2UgYWN0aXZhdGlvblNlcnZpY2UgPSBnZXRDb21tb25WaWV3ZXIoKS5nZXROYXZpZ2F0b3JDb250ZW50U2VydmljZSgpLmdldEFjdGl2YXRpb25TZXJ2aWNlKCk7CisgICAgICAgIGlmICghaXNTdXBwb3J0c0xpc3RUcmVlKCkpIHsKKyAgICAgICAgICAgIGFjdGl2YXRpb25TZXJ2aWNlLmFjdGl2YXRlRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyBnZXRUcmVlQ29udGVudElkKCkgfSwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGlzU2hvd0xpc3QoKSkgeworICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TZXJ2aWNlLmRlYWN0aXZhdGVFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IGdldFRyZWVDb250ZW50SWQoKSB9LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgYWN0aXZhdGlvblNlcnZpY2UuYWN0aXZhdGVFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IGdldExpc3RDb250ZW50SWQoKSB9LCBmYWxzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFjdGl2YXRpb25TZXJ2aWNlLmRlYWN0aXZhdGVFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IGdldExpc3RDb250ZW50SWQoKSB9LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgYWN0aXZhdGlvblNlcnZpY2UuYWN0aXZhdGVFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7IGdldFRyZWVDb250ZW50SWQoKSB9LCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZWQoKSB7CisgICAgICAgIGlmICh0aGlzLmxhc3RQYXJ0SGludCBpbnN0YW5jZW9mIFNlcnZlcnNWaWV3MikgeworICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCh0aGlzLmxhc3RQYXJ0SGludCwgKChTZXJ2ZXJzVmlldzIpIHRoaXMubGFzdFBhcnRIaW50KS5nZXRDb21tb25WaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKSk7CisgICAgICAgIH0gZWxzZSBpZiAodGhpcy5sYXN0UGFydEhpbnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgeworICAgICAgICAgICAgSVNlcnZlciB2aXJnb1NlcnZlciA9IFZpcmdvRWRpdG9yQWRhcHRlckZhY3RvcnkuZ2V0VmlyZ29TZXJ2ZXIoKElFZGl0b3JQYXJ0KSB0aGlzLmxhc3RQYXJ0SGludCk7CisgICAgICAgICAgICBpZiAodmlyZ29TZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlbGVjdGlvbkNoYW5nZWQodGhpcy5sYXN0UGFydEhpbnQsIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS92aWV3cy9Mb2dGaWxlQ29tbW9uVmlldy5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL3VpL3ZpZXdzL0xvZ0ZpbGVDb21tb25WaWV3LmphdmEKaW5kZXggNDcyMGU4Yy4uNWM3MWI1MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL3VpL3ZpZXdzL0xvZ0ZpbGVDb21tb25WaWV3LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL3VpL3ZpZXdzL0xvZ0ZpbGVDb21tb25WaWV3LmphdmEKQEAgLTE2LDM1ICsxNiwzNSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmludGVybmFsLnVpLnByb2plY3RzLlNlcnZlclByb2plY3Q7CiAKIC8qKgotICogCisgKgogICogQHNlZSBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwudWkudmlld3MuZGVwZW5kZW5jaWVzLkRlcGVuZGVuY2llc1ZpZXcKICAqIEBhdXRob3IgTWlsZXMgUGFya2VyCi0gKiAKKyAqCiAgKi8KIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCiBwdWJsaWMgY2xhc3MgTG9nRmlsZUNvbW1vblZpZXcgZXh0ZW5kcyBTZXJ2ZXJGaWxlQ29tbW9uVmlldyB7CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLnZpZXdzLkNvbW1vblZpZXcjZ2V0Q29udGVudElkKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRyZWVDb250ZW50SWQoKSB7Ci0JCXJldHVybiBTZXJ2ZXJVaVBsdWdpbi5MT0dfQ09OVEVOVF9JRDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS52aWV3cy5Db21tb25WaWV3I2dldENvbnRlbnRJZCgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUcmVlQ29udGVudElkKCkgeworICAgICAgICByZXR1cm4gU2VydmVyVWlQbHVnaW4uTE9HX0NPTlRFTlRfSUQ7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS52aWV3cy5Db21tb25WaWV3I2dldFZpZXdJZCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaWV3SWQoKSB7Ci0JCXJldHVybiBTZXJ2ZXJVaVBsdWdpbi5MT0dfVklFV19JRDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS52aWV3cy5Db21tb25WaWV3I2dldFZpZXdJZCgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWaWV3SWQoKSB7CisgICAgICAgIHJldHVybiBTZXJ2ZXJVaVBsdWdpbi5MT0dfVklFV19JRDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLnZpZXdzLlNlcnZlckZpbGVDb21tb25WaWV3I2dldE1hbmFnZWREaXJzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nW10gZ2V0TWFuYWdlZERpcnMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBTZXJ2ZXJQcm9qZWN0LkxPR19XT1JLU1BBQ0VfRElSIH07Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkudmlld3MuU2VydmVyRmlsZUNvbW1vblZpZXcjZ2V0TWFuYWdlZERpcnMoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRNYW5hZ2VkRGlycygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7IFNlcnZlclByb2plY3QuTE9HX1dPUktTUEFDRV9ESVIgfTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvdWkvdmlld3MvUHJvcGVydGllc0ZpbGVDb21tb25WaWV3LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvdWkvdmlld3MvUHJvcGVydGllc0ZpbGVDb21tb25WaWV3LmphdmEKaW5kZXggYjEzYzE5NS4uMmZiZThlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9ydW50aW1lL3VpL3ZpZXdzL1Byb3BlcnRpZXNGaWxlQ29tbW9uVmlldy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS92aWV3cy9Qcm9wZXJ0aWVzRmlsZUNvbW1vblZpZXcuamF2YQpAQCAtMTYsNDUgKzE2LDQ1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuaW50ZXJuYWwudWkucHJvamVjdHMuU2VydmVyUHJvamVjdDsKIAogLyoqCi0gKiAKKyAqCiAgKiBAc2VlIG9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC51aS52aWV3cy5kZXBlbmRlbmNpZXMuRGVwZW5kZW5jaWVzVmlldwogICogQGF1dGhvciBNaWxlcyBQYXJrZXIKLSAqIAorICoKICAqLwogQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKIHB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzRmlsZUNvbW1vblZpZXcgZXh0ZW5kcyBTZXJ2ZXJGaWxlQ29tbW9uVmlldyB7CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLnZpZXdzLkNvbW1vblZpZXcjZ2V0VHJlZUNvbnRlbnRJZCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUcmVlQ29udGVudElkKCkgewotCQlyZXR1cm4gU2VydmVyVWlQbHVnaW4uUFJPUEVSVElFU19DT05URU5UX0lEOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLnZpZXdzLkNvbW1vblZpZXcjZ2V0VHJlZUNvbnRlbnRJZCgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUcmVlQ29udGVudElkKCkgeworICAgICAgICByZXR1cm4gU2VydmVyVWlQbHVnaW4uUFJPUEVSVElFU19DT05URU5UX0lEOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkudmlld3MuQ29tbW9uVmlldyNnZXRMaXN0Q29udGVudElkKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RDb250ZW50SWQoKSB7Ci0JCXJldHVybiBTZXJ2ZXJVaVBsdWdpbi5GTEFUVEVORURfUFJPUEVSVElFU19DT05URU5UX0lEOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLnZpZXdzLkNvbW1vblZpZXcjZ2V0TGlzdENvbnRlbnRJZCgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0Q29udGVudElkKCkgeworICAgICAgICByZXR1cm4gU2VydmVyVWlQbHVnaW4uRkxBVFRFTkVEX1BST1BFUlRJRVNfQ09OVEVOVF9JRDsKKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLnZpZXdzLkNvbW1vblZpZXcjZ2V0Vmlld0lkKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpZXdJZCgpIHsKLQkJcmV0dXJuIFNlcnZlclVpUGx1Z2luLlBST1BFUlRJRVNfVklFV19JRDsKLQl9CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS52aWV3cy5Db21tb25WaWV3I2dldFZpZXdJZCgpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRWaWV3SWQoKSB7CisgICAgICAgIHJldHVybiBTZXJ2ZXJVaVBsdWdpbi5QUk9QRVJUSUVTX1ZJRVdfSUQ7CisgICAgfQogCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS52aWV3cy5TZXJ2ZXJGaWxlQ29tbW9uVmlldyNnZXRNYW5hZ2VkRGlyc1tdKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nW10gZ2V0TWFuYWdlZERpcnMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBTZXJ2ZXJQcm9qZWN0LlBST1BFUlRJRVNfRElSIH07CisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS52aWV3cy5TZXJ2ZXJGaWxlQ29tbW9uVmlldyNnZXRNYW5hZ2VkRGlyc1tdKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0TWFuYWdlZERpcnMoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyBTZXJ2ZXJQcm9qZWN0LlBST1BFUlRJRVNfRElSIH07CiAKLQl9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3J1bnRpbWUvdWkvdmlld3MvU2VydmVyRmlsZUNvbW1vblZpZXcuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS92aWV3cy9TZXJ2ZXJGaWxlQ29tbW9uVmlldy5qYXZhCmluZGV4IDU0MzZhNjcuLjkxYmFlNmMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS92aWV3cy9TZXJ2ZXJGaWxlQ29tbW9uVmlldy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvcnVudGltZS91aS92aWV3cy9TZXJ2ZXJGaWxlQ29tbW9uVmlldy5qYXZhCkBAIC0zMywxMTggKzMzLDEyMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwogCiAvKioKLSAqIAorICoKICAqIEBzZWUgb3JnLmVjbGlwc2UucGRlLmludGVybmFsLnVpLnZpZXdzLmRlcGVuZGVuY2llcy5EZXBlbmRlbmNpZXNWaWV3CiAgKiBAYXV0aG9yIE1pbGVzIFBhcmtlcgotICogCisgKgogICovCiBAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQogcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlckZpbGVDb21tb25WaWV3IGV4dGVuZHMgQ29tbW9uVmlldyBpbXBsZW1lbnRzIElTZWxlY3Rpb25MaXN0ZW5lciB7CiAKLQlwcml2YXRlIENvbGxlY3Rpb248SUZpbGU+IGN1cnJlbnRGaWxlczsKKyAgICBwcml2YXRlIENvbGxlY3Rpb248SUZpbGU+IGN1cnJlbnRGaWxlczsKIAotCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUxpc3RlbmVyOworICAgIHByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUxpc3RlbmVyOwogCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQlib29sZWFuIGNoYW5nZTsKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIERlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7CiAKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCWlmIChjaGFuZ2UpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvL29ubHkgaW50ZXJlc3RlZCBpbiBjaGFuZ2VkIHJlc291cmNlcyAobm90IGFkZGVkIG9yIHJlbW92ZWQpCi0JCQlpZiAoZGVsdGEuZ2V0S2luZCgpICE9IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCS8vb25seSBpbnRlcmVzdGVkIGluIGNvbnRlbnQgY2hhbmdlcwotCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuQ09OVEVOVCkgPT0gMCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChjdXJyZW50RmlsZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJY2hhbmdlID0gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQorICAgICAgICBib29sZWFuIGNoYW5nZTsKIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbk5hdmlnYXRvciNjcmVhdGVQYXJ0Q29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIGFQYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlUGFydENvbnRyb2woYVBhcmVudCk7Ci0JCXJlc291cmNlTGlzdGVuZXIgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkvL3dlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gUE9TVF9DSEFOR0UgZXZlbnRzCi0JCQkJaWYgKGdldFNlcnZlcnMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJCWlmIChldmVudC5nZXRUeXBlKCkgIT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlJUmVzb3VyY2VEZWx0YSByb290RGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJCQlib29sZWFuIHJlZnJlc2ggPSBmYWxzZTsKLQkJCQkJLy9nZXQgdGhlIGRlbHRhLCBpZiBhbnksIGZvciB0aGUgZG9jdW1lbnRhdGlvbiBkaXJlY3RvcnkKLQkJCQkJZm9yIChJU2VydmVyIHNlcnZlciA6IGdldFNlcnZlcnMoKSkgewotCQkJCQkJU2VydmVyUHJvamVjdCBwcm9qZWN0ID0gU2VydmVyUHJvamVjdE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRQcm9qZWN0KHNlcnZlcik7Ci0JCQkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChTdHJpbmcgZGlyIDogZ2V0TWFuYWdlZERpcnMoKSkgewotCQkJCQkJCQlpZiAocHJvamVjdC5nZXRXb3Jrc3BhY2VQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJCQkJCQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldFdvcmtzcGFjZVByb2plY3QoKS5nZXRGb2xkZXIoZGlyKTsKLQkJCQkJCQkJCUlSZXNvdXJjZURlbHRhIGRvY0RlbHRhID0gcm9vdERlbHRhLmZpbmRNZW1iZXIoZm9sZGVyLmdldEZ1bGxQYXRoKCkpOwotCQkJCQkJCQkJaWYgKGRvY0RlbHRhID09IG51bGwpIHsKLQkJCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBEZWx0YVZpc2l0b3IoKTsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJZG9jRGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotCQkJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAodmlzaXRvci5jaGFuZ2UpIHsKLQkJCQkJCQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocmVmcmVzaCkgewotCQkJCQkJcmVmcmVzaFZpZXcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VMaXN0ZW5lcik7Ci0JCWN1cnJlbnRGaWxlcyA9IG5ldyBIYXNoU2V0PElGaWxlPigpOwotCX0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmNoYW5nZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG9ubHkgaW50ZXJlc3RlZCBpbiBjaGFuZ2VkIHJlc291cmNlcyAobm90IGFkZGVkIG9yIHJlbW92ZWQpCisgICAgICAgICAgICBpZiAoZGVsdGEuZ2V0S2luZCgpICE9IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG9ubHkgaW50ZXJlc3RlZCBpbiBjb250ZW50IGNoYW5nZXMKKyAgICAgICAgICAgIGlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7CisgICAgICAgICAgICBpZiAoU2VydmVyRmlsZUNvbW1vblZpZXcudGhpcy5jdXJyZW50RmlsZXMuY29udGFpbnMocmVzb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2UgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLnZpZXdzLkNvbW1vblZpZXcjdXBkYXRlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCWN1cnJlbnRGaWxlcyA9IG5ldyBIYXNoU2V0PElGaWxlPigpOwotCQlmb3IgKElTZXJ2ZXIgc2VydmVyIDogZ2V0U2VydmVycygpKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9ICgoSVRyZWVDb250ZW50UHJvdmlkZXIpIGdldENvbW1vblZpZXdlcigpLmdldENvbnRlbnRQcm92aWRlcigpKS5nZXRFbGVtZW50cyhzZXJ2ZXIpOwotCQkJZm9yIChPYmplY3Qgb2JqZWN0IDogZWxlbWVudHMpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU2VydmVyRmlsZVNlbGVjdGlvbikgewotCQkJCQljdXJyZW50RmlsZXMuYWRkKCgoU2VydmVyRmlsZVNlbGVjdGlvbikgb2JqZWN0KS5nZXRGaWxlKCkpOwotCQkJCX0KLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJY3VycmVudEZpbGVzLmFkZCgoSUZpbGUpIG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCX0KKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25OYXZpZ2F0b3IjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBhUGFyZW50KSB7CisgICAgICAgIHN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKGFQYXJlbnQpOworICAgICAgICB0aGlzLnJlc291cmNlTGlzdGVuZXIgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CiAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLnVpLnZpZXdzLkNvbW1vblZpZXcjZGlzcG9zZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUxpc3RlbmVyKTsKLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIFBPU1RfQ0hBTkdFIGV2ZW50cworICAgICAgICAgICAgICAgIGlmIChnZXRTZXJ2ZXJzKCkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpICE9IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlRGVsdGEgcm9vdERlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZWZyZXNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgZGVsdGEsIGlmIGFueSwgZm9yIHRoZSBkb2N1bWVudGF0aW9uIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICBmb3IgKElTZXJ2ZXIgc2VydmVyIDogZ2V0U2VydmVycygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9qZWN0IHByb2plY3QgPSBTZXJ2ZXJQcm9qZWN0TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb2plY3Qoc2VydmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBkaXIgOiBnZXRNYW5hZ2VkRGlycygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0LmdldFdvcmtzcGFjZVByb2plY3QoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0V29ya3NwYWNlUHJvamVjdCgpLmdldEZvbGRlcihkaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlRGVsdGEgZG9jRGVsdGEgPSByb290RGVsdGEuZmluZE1lbWJlcihmb2xkZXIuZ2V0RnVsbFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jRGVsdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IERlbHRhVmlzaXRvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2NEZWx0YS5hY2NlcHQodmlzaXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aXNpdG9yLmNoYW5nZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWZyZXNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoVmlldygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlc291cmNlTGlzdGVuZXIpOworICAgICAgICB0aGlzLmN1cnJlbnRGaWxlcyA9IG5ldyBIYXNoU2V0PElGaWxlPigpOworICAgIH0KIAotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRNYW5hZ2VkRGlycygpOworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUudWkudmlld3MuQ29tbW9uVmlldyN1cGRhdGUoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKKyAgICAgICAgdGhpcy5jdXJyZW50RmlsZXMgPSBuZXcgSGFzaFNldDxJRmlsZT4oKTsKKyAgICAgICAgZm9yIChJU2VydmVyIHNlcnZlciA6IGdldFNlcnZlcnMoKSkgeworICAgICAgICAgICAgT2JqZWN0W10gZWxlbWVudHMgPSAoKElUcmVlQ29udGVudFByb3ZpZGVyKSBnZXRDb21tb25WaWV3ZXIoKS5nZXRDb250ZW50UHJvdmlkZXIoKSkuZ2V0RWxlbWVudHMoc2VydmVyKTsKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iamVjdCA6IGVsZW1lbnRzKSB7CisgICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNlcnZlckZpbGVTZWxlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RmlsZXMuYWRkKCgoU2VydmVyRmlsZVNlbGVjdGlvbikgb2JqZWN0KS5nZXRGaWxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50RmlsZXMuYWRkKChJRmlsZSkgb2JqZWN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIudXBkYXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS51aS52aWV3cy5Db21tb25WaWV3I2Rpc3Bvc2UoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKKyAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5yZXNvdXJjZUxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0TWFuYWdlZERpcnMoKTsKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCBiYmFjYTZkLi40MzIxYmQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMudXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnRlc3RzLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0xLDQgKzEsMyBAQAotI1dlZCBNYXIgMDIgMTY6MDA6MDYgUFNUIDIwMTEKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQpAQCAtOCw2ICs3LDggQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFN1ZmZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQpAQCAtODIsMzUgKzgzLDM3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249NDgKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tZXRob2RfZGVjbGFyYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnk9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdW5pb25fdHlwZV9pbl9tdWx0aWNhdGNoPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCkBAIC0xMjEsMzAgKzEyNCwzMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbGFtYmRhX2JvZHk9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lcz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xMjAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0xCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZGlzYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvZmYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5lbmFibGluZ190YWc9QGZvcm1hdHRlclw6b24KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCkBAIC0xNTgsNyArMTYyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2ZpZWxkPWluc2VydApAQCAtMTY2LDEwICsxNzAsMTEgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZW1iZXI9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhY2thZ2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fdHlwZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfbGFiZWw9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfdHlwZV9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydApAQCAtMjE3LDYgKzIyMiw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0yMzUsMTIgKzI0MSwxNCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CkBAIC0yNjQsNiArMjcyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0CkBAIC0yOTEsNiArMzAwLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9sYW1iZGFfYXJyb3c9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CkBAIC0zMTksNiArMzI5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3RyeT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydApAQCAtMzI4LDYgKzMzOSw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0zNDMsMTUgKzM1NSwxNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTIwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9MTUwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj1zcGFjZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX29uX29mZl90YWdzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX29yX29wZXJhdG9yX211bHRpY2F0Y2g9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfb3V0ZXJfZXhwcmVzc2lvbnNfd2hlbl9uZXN0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YUZvcm1hdHRlcj1vcmcuZWNsaXBzZS5qZHQuY29yZS5kZWZhdWx0SmF2YUZvcm1hdHRlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnRlc3RzLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy51dGlsLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKaW5kZXggN2U3ZmU3My4uNmM5ODAxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnRlc3RzLnV0aWwvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMudXRpbC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0xLDcgKzEsNjUgQEAKK2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9uc19pbnRlcmZhY2VfbWV0aG9kcz10cnVlCitjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAuY29udmVydF9mdW5jdGlvbmFsX2ludGVyZmFjZXM9ZmFsc2UKK2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQorY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9ZmFsc2UKK2NsZWFudXAuaW5zZXJ0X2luZmVycmVkX3R5cGVfYXJndW1lbnRzPWZhbHNlCitjbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3R5cGVfYWJzdHJhY3RfaWZfbWlzc2luZ19tZXRob2Q9ZmFsc2UKK2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQorY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitjbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfcmVkdW5kYW50X3R5cGVfYXJndW1lbnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCitjbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQorY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCitjbGVhbnVwLnVzZV9hbm9ueW1vdXNfY2xhc3NfY3JlYXRpb249ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQorY2xlYW51cC51c2VfbGFtYmRhPXRydWUKK2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwLnVzZV90eXBlX2FyZ3VtZW50cz1mYWxzZQorY2xlYW51cF9wcm9maWxlPV9WaXJnbyBXZWIgU2VydmVyIC0gQ29kZSBDbGVhbiBVcAogY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCiBlZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9NeWx5biBiYXNlZCBvbiBFY2xpcHNlCitmb3JtYXR0ZXJfcHJvZmlsZT1fVmlyZ28gV2ViIFNlcnZlciAtIENvZGUgRm9ybWF0dGVyCiBmb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMgogaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKIG9yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Rlc3RzL3V0aWwvVmlyZ29JZGVUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS90ZXN0cy91dGlsL1ZpcmdvSWRlVGVzdENhc2UuamF2YQppbmRleCA5MjFkYzAzLi4xNzEwZmM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Rlc3RzL3V0aWwvVmlyZ29JZGVUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdGVzdHMvdXRpbC9WaXJnb0lkZVRlc3RDYXNlLmphdmEKQEAgLTQsNTcgKzQsNTcgQEAKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIC8qKgogICogRGVyaXZlZCBmcm9tIEFic3RyYWN0QmVhbnNDb3JlVGVzdENhc2UKLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBMZW8gRG9zIFNhbnRvcwogICogQGF1dGhvciBUZXJyeSBIb24KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFZpcmdvSWRlVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKLQlwcm90ZWN0ZWQgSVByb2plY3QgY3JlYXRlUHJlZGVmaW5lZFByb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gVmlyZ29JZGVUZXN0VXRpbC5jcmVhdGVQcmVkZWZpbmVkUHJvamVjdChwcm9qZWN0TmFtZSwgZ2V0QnVuZGxlTmFtZSgpKTsKLQl9CisgICAgcHJvdGVjdGVkIElQcm9qZWN0IGNyZWF0ZVByZWRlZmluZWRQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFZpcmdvSWRlVGVzdFV0aWwuY3JlYXRlUHJlZGVmaW5lZFByb2plY3QocHJvamVjdE5hbWUsIGdldEJ1bmRsZU5hbWUoKSk7CisgICAgfQogCi0JcHJvdGVjdGVkIElSZXNvdXJjZSBjcmVhdGVQcmVkZWZpbmVkUHJvamVjdEFuZEdldFJlc291cmNlKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHJlc291cmNlUGF0aCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBjcmVhdGVQcmVkZWZpbmVkUHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCS8vIFhYWCBkbyBhIHNlY29uZCBmdWxsIGJ1aWxkIHRvIGVuc3VyZSBtYXJrZXJzIGFyZSB1cC10by1kYXRlCi0JCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBudWxsKTsKKyAgICBwcm90ZWN0ZWQgSVJlc291cmNlIGNyZWF0ZVByZWRlZmluZWRQcm9qZWN0QW5kR2V0UmVzb3VyY2UoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgcmVzb3VyY2VQYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gY3JlYXRlUHJlZGVmaW5lZFByb2plY3QocHJvamVjdE5hbWUpOworICAgICAgICAvLyBYWFggZG8gYSBzZWNvbmQgZnVsbCBidWlsZCB0byBlbnN1cmUgbWFya2VycyBhcmUgdXAtdG8tZGF0ZQorICAgICAgICBwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbnVsbCk7CiAKLQkJSVJlc291cmNlIHJlc291cmNlID0gcHJvamVjdC5maW5kTWVtYmVyKHJlc291cmNlUGF0aCk7Ci0JCVZpcmdvSWRlVGVzdFV0aWwud2FpdEZvclJlc291cmNlKHJlc291cmNlKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KKyAgICAgICAgSVJlc291cmNlIHJlc291cmNlID0gcHJvamVjdC5maW5kTWVtYmVyKHJlc291cmNlUGF0aCk7CisgICAgICAgIFZpcmdvSWRlVGVzdFV0aWwud2FpdEZvclJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlOworICAgIH0KIAotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpOwogCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VXb3Jrc3BhY2VQYXRoKCkgewotCQlyZXR1cm4gVmlyZ29JZGVUZXN0VXRpbC5nZXRTb3VyY2VXb3Jrc3BhY2VQYXRoKGdldEJ1bmRsZU5hbWUoKSk7Ci0JfQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U291cmNlV29ya3NwYWNlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIFZpcmdvSWRlVGVzdFV0aWwuZ2V0U291cmNlV29ya3NwYWNlUGF0aChnZXRCdW5kbGVOYW1lKCkpOworICAgIH0KIAotCUBBZnRlcgotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVZpcmdvSWRlVGVzdFV0aWwuY2xlYW5VcFByb2plY3RzKCk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQorICAgIEBBZnRlcgorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFZpcmdvSWRlVGVzdFV0aWwuY2xlYW5VcFByb2plY3RzKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Rlc3RzL3V0aWwvVmlyZ29JZGVUZXN0VXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnRlc3RzLnV0aWwvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS90ZXN0cy91dGlsL1ZpcmdvSWRlVGVzdFV0aWwuamF2YQppbmRleCAzZWI5YjY5Li4yMmUzYjUxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMudXRpbC9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Rlc3RzL3V0aWwvVmlyZ29JZGVUZXN0VXRpbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy51dGlsL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdGVzdHMvdXRpbC9WaXJnb0lkZVRlc3RVdGlsLmphdmEKQEAgLTQsMTAgKzQsMTEgQEAKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTYyLDM3MSArNjMsMzcwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBWaXJnb0lkZVRlc3RVdGlsIHsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBFQ0xJUFNFXzNfNCA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZXBvc2l0b3J5IikgPT0gbnVsbDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gRUNMSVBTRV8zXzQgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVwb3NpdG9yeSIpID09IG51bGw7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gRUNMSVBTRV8zXzZfT1JfTEFURVI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEVDTElQU0VfM182X09SX0xBVEVSOwogCi0Jc3RhdGljIHsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3R5bGVkVGV4dC5jbGFzcy5nZXRNZXRob2QoInNldFRhYlN0b3BzIiwgaW50W10uY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCQlmb3VuZCA9IHRydWU7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJRUNMSVBTRV8zXzZfT1JfTEFURVIgPSBmb3VuZDsKLQl9CisgICAgc3RhdGljIHsKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3R5bGVkVGV4dC5jbGFzcy5nZXRNZXRob2QoInNldFRhYlN0b3BzIiwgaW50W10uY2xhc3MpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgRUNMSVBTRV8zXzZfT1JfTEFURVIgPSBmb3VuZDsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgV0FJVF9USU1FID0gMjAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgV0FJVF9USU1FID0gMjAwMDsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm9jYWxpemVYbWwoU3RyaW5nIG9yaWdpbmFsU2VydmVyWG1sKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihvcmlnaW5hbFNlcnZlclhtbCkpKTsKLQkJZG9jdW1lbnQubm9ybWFsaXplKCk7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fub2NhbGl6ZVhtbChTdHJpbmcgb3JpZ2luYWxTZXJ2ZXJYbWwpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKG9yaWdpbmFsU2VydmVyWG1sKSkpOworICAgICAgICBkb2N1bWVudC5ub3JtYWxpemUoKTsKIAotCQlUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLQkJU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKLQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpLCBuZXcgU3RyZWFtUmVzdWx0KHdyaXRlcikpOwotCQlyZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCkucmVwbGFjZSgiXFxzK1xcbiIsICJcXG4iKTsKLQl9CisgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOworICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOworICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSksIG5ldyBTdHJlYW1SZXN1bHQod3JpdGVyKSk7CisgICAgICAgIHJldHVybiB3cml0ZXIudG9TdHJpbmcoKS5yZXBsYWNlKCJcXHMrXFxuIiwgIlxcbiIpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhblVwUHJvamVjdHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7Ci0JCWRlbGV0ZUFsbFByb2plY3RzKCk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhblVwUHJvamVjdHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7CisgICAgICAgIGRlbGV0ZUFsbFByb2plY3RzKCk7CisgICAgfQogCi0JLyoqCi0JICogQ29weSBmaWxlIGZyb20gc3JjIChwYXRoIHRvIHRoZSBvcmlnaW5hbCBmaWxlKSB0byBkZXN0IChwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlKS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHkoRmlsZSBzcmMsIEZpbGUgZGVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0JCXRyeSB7Ci0JCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCk7Ci0JCQl0cnkgewotCQkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKLQkJCQlpbnQgbGVuOwotCQkJCXdoaWxlICgobGVuID0gaW4ucmVhZChidWYpKSA+IDApIHsKLQkJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbGVuKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCW91dC5jbG9zZSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBDb3B5IGZpbGUgZnJvbSBzcmMgKHBhdGggdG8gdGhlIG9yaWdpbmFsIGZpbGUpIHRvIGRlc3QgKHBhdGggdG8gdGhlIGRlc3RpbmF0aW9uIGZpbGUpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29weShGaWxlIHNyYywgRmlsZSBkZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZikpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBsZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogQ29weSB0aGUgZ2l2ZW4gc291cmNlIGRpcmVjdG9yeSAoYW5kIGFsbCBpdHMgY29udGVudHMpIHRvIHRoZSBnaXZlbiB0YXJnZXQgZGlyZWN0b3J5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29weURpcmVjdG9yeShGaWxlIHNvdXJjZSwgRmlsZSB0YXJnZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghdGFyZ2V0LmV4aXN0cygpKSB7Ci0JCQl0YXJnZXQubWtkaXJzKCk7Ci0JCX0KLQkJRmlsZVtdIGZpbGVzID0gc291cmNlLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoRmlsZSBzb3VyY2VDaGlsZCA6IGZpbGVzKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHNvdXJjZUNoaWxkLmdldE5hbWUoKTsKLQkJCWlmIChuYW1lLmVxdWFscygiLnN2biIpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlGaWxlIHRhcmdldENoaWxkID0gbmV3IEZpbGUodGFyZ2V0LCBuYW1lKTsKLQkJCWlmIChzb3VyY2VDaGlsZC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJY29weURpcmVjdG9yeShzb3VyY2VDaGlsZCwgdGFyZ2V0Q2hpbGQpOwotCQkJfSBlbHNlIHsKLQkJCQljb3B5KHNvdXJjZUNoaWxkLCB0YXJnZXRDaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogQ29weSB0aGUgZ2l2ZW4gc291cmNlIGRpcmVjdG9yeSAoYW5kIGFsbCBpdHMgY29udGVudHMpIHRvIHRoZSBnaXZlbiB0YXJnZXQgZGlyZWN0b3J5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29weURpcmVjdG9yeShGaWxlIHNvdXJjZSwgRmlsZSB0YXJnZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghdGFyZ2V0LmV4aXN0cygpKSB7CisgICAgICAgICAgICB0YXJnZXQubWtkaXJzKCk7CisgICAgICAgIH0KKyAgICAgICAgRmlsZVtdIGZpbGVzID0gc291cmNlLmxpc3RGaWxlcygpOworICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoRmlsZSBzb3VyY2VDaGlsZCA6IGZpbGVzKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHNvdXJjZUNoaWxkLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygiLnN2biIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaWxlIHRhcmdldENoaWxkID0gbmV3IEZpbGUodGFyZ2V0LCBuYW1lKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2VDaGlsZC5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgY29weURpcmVjdG9yeShzb3VyY2VDaGlsZCwgdGFyZ2V0Q2hpbGQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb3B5KHNvdXJjZUNoaWxkLCB0YXJnZXRDaGlsZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZVByZWRlZmluZWRQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGJ1bmRsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJSU9FeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QganAgPSBzZXRVcEphdmFQcm9qZWN0KHByb2plY3ROYW1lLCBidW5kbGVOYW1lKTsKLQkJVmlyZ29JZGVUZXN0VXRpbC5nZXRXb3Jrc3BhY2UoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIG51bGwpOwotCQlyZXR1cm4ganAuZ2V0UHJvamVjdCgpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZVByZWRlZmluZWRQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGJ1bmRsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIElKYXZhUHJvamVjdCBqcCA9IHNldFVwSmF2YVByb2plY3QocHJvamVjdE5hbWUsIGJ1bmRsZU5hbWUpOworICAgICAgICBWaXJnb0lkZVRlc3RVdGlsLmdldFdvcmtzcGFjZSgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbnVsbCk7CisgICAgICAgIHJldHVybiBqcC5nZXRQcm9qZWN0KCk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZVRlbXBEaXJlY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVtcERpcmVjdG9yeSgic3RzIiwgbnVsbCk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRGlyZWN0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVRlbXBEaXJlY3RvcnkoInN0cyIsIG51bGwpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRGlyZWN0b3J5KFN0cmluZyBwcmVmaXgsIFN0cmluZyBzdWZmaXgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgZmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUocHJlZml4LCBzdWZmaXgpOwotCQlmaWxlLmRlbGV0ZSgpOwotCQlmaWxlLm1rZGlycygpOwotCQlyZXR1cm4gZmlsZTsKLQl9CisgICAgcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZVRlbXBEaXJlY3RvcnkoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHN1ZmZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShwcmVmaXgsIHN1ZmZpeCk7CisgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgIGZpbGUubWtkaXJzKCk7CisgICAgICAgIHJldHVybiBmaWxlOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVBbGxQcm9qZWN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChJUHJvamVjdCBwcm9qZWN0IDogYWxsUHJvamVjdHMpIHsKLQkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCQlkZWxldGVQcm9qZWN0KHByb2plY3QsIHRydWUpOwotCQl9Ci0JCWdldFdvcmtzcGFjZSgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbnVsbCk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVBbGxQcm9qZWN0cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgSVByb2plY3RbXSBhbGxQcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKKyAgICAgICAgZm9yIChJUHJvamVjdCBwcm9qZWN0IDogYWxsUHJvamVjdHMpIHsKKyAgICAgICAgICAgIHByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7CisgICAgICAgICAgICBkZWxldGVQcm9qZWN0KHByb2plY3QsIHRydWUpOworICAgICAgICB9CisgICAgICAgIGdldFdvcmtzcGFjZSgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbnVsbCk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVByb2plY3QoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocHJvamVjdC5leGlzdHMoKSAmJiAhcHJvamVjdC5pc09wZW4oKSkgewotCQkJLy8gZm9yY2Ugb3BlbmluZyBzbyB0aGF0IHByb2plY3QgY2FuIGJlIGRlbGV0ZWQgd2l0aG91dCBsb2dnaW5nIChzZWUKLQkJCS8vIGJ1ZyAyMzYyOSkKLQkJCXByb2plY3Qub3BlbihudWxsKTsKLQkJfQotCQlkZWxldGVSZXNvdXJjZShwcm9qZWN0LCBmb3JjZSk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgIXByb2plY3QuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIC8vIGZvcmNlIG9wZW5pbmcgc28gdGhhdCBwcm9qZWN0IGNhbiBiZSBkZWxldGVkIHdpdGhvdXQgbG9nZ2luZyAoc2VlCisgICAgICAgICAgICAvLyBidWcgMjM2MjkpCisgICAgICAgICAgICBwcm9qZWN0Lm9wZW4obnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlUmVzb3VyY2UocHJvamVjdCwgZm9yY2UpOworICAgIH0KIAotCS8qKgotCSAqIERlbGV0ZSB0aGlzIHJlc291cmNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZGVsZXRlUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICghcmVzb3VyY2UuZXhpc3RzKCkgfHwgIXJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd2FpdEZvck1hbnVhbEJ1aWxkKCk7Ci0JCXdhaXRGb3JBdXRvQnVpbGQoKTsKLQkJQ29yZUV4Y2VwdGlvbiBsYXN0RXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc291cmNlLmRlbGV0ZShmb3JjZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJbGFzdEV4Y2VwdGlvbiA9IGU7Ci0JCQkvLyBqdXN0IHByaW50IGZvciBpbmZvCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIihDb3JlRXhjZXB0aW9uKTogIiArIGUuZ2V0TWVzc2FnZSgpICsgIiBSZXNvdXJjZSAiICsgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJLy8ganVzdCBwcmludCBmb3IgaW5mbwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKTogIiArIGlhZS5nZXRNZXNzYWdlKCkgKyAiLCByZXNvdXJjZSAiICsgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmICghZm9yY2UpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgcmV0cnlDb3VudCA9IDEwOyAvLyB3YWl0IDEgbWludXRlIGF0IG1vc3QKLQkJd2hpbGUgKHJlc291cmNlLmlzQWNjZXNzaWJsZSgpICYmIC0tcmV0cnlDb3VudCA+PSAwKSB7Ci0JCQl3YWl0Rm9yQXV0b0J1aWxkKCk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UuZGVsZXRlKHRydWUsIG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbGFzdEV4Y2VwdGlvbiA9IGU7Ci0JCQkJLy8ganVzdCBwcmludCBmb3IgaW5mbwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKENvcmVFeGNlcHRpb24pIFJldHJ5ICIgKyByZXRyeUNvdW50ICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpICsgIiwgcmVzb3VyY2UgIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJCS8vIGp1c3QgcHJpbnQgZm9yIGluZm8KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIihJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pIFJldHJ5ICIgKyByZXRyeUNvdW50ICsgIjogIiArIGlhZS5nZXRNZXNzYWdlKCkgKyAiLCByZXNvdXJjZSAiICsgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCX0KLQkJaWYgKCFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN5c3RlbS5lcnIucHJpbnRsbigiRmFpbGVkIHRvIGRlbGV0ZSAiICsgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxhc3RFeGNlcHRpb24gIT0gbnVsbCkgewotCQkJdGhyb3cgbGFzdEV4Y2VwdGlvbjsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBEZWxldGUgdGhpcyByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZVJlc291cmNlKElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBpZiAoIXJlc291cmNlLmV4aXN0cygpIHx8ICFyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdhaXRGb3JNYW51YWxCdWlsZCgpOworICAgICAgICB3YWl0Rm9yQXV0b0J1aWxkKCk7CisgICAgICAgIENvcmVFeGNlcHRpb24gbGFzdEV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNvdXJjZS5kZWxldGUoZm9yY2UsIG51bGwpOworICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxhc3RFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgLy8ganVzdCBwcmludCBmb3IgaW5mbworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIoQ29yZUV4Y2VwdGlvbik6ICIgKyBlLmdldE1lc3NhZ2UoKSArICIgUmVzb3VyY2UgIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgIC8vIGp1c3QgcHJpbnQgZm9yIGluZm8KKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbik6ICIgKyBpYWUuZ2V0TWVzc2FnZSgpICsgIiwgcmVzb3VyY2UgIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvcmNlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IHJldHJ5Q291bnQgPSAxMDsgLy8gd2FpdCAxIG1pbnV0ZSBhdCBtb3N0CisgICAgICAgIHdoaWxlIChyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSAmJiAtLXJldHJ5Q291bnQgPj0gMCkgeworICAgICAgICAgICAgd2FpdEZvckF1dG9CdWlsZCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc291cmNlLmRlbGV0ZSh0cnVlLCBudWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxhc3RFeGNlcHRpb24gPSBlOworICAgICAgICAgICAgICAgIC8vIGp1c3QgcHJpbnQgZm9yIGluZm8KKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIihDb3JlRXhjZXB0aW9uKSBSZXRyeSAiICsgcmV0cnlDb3VudCArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSArICIsIHJlc291cmNlICIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgICAgICAvLyBqdXN0IHByaW50IGZvciBpbmZvCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAiKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikgUmV0cnkgIiArIHJldHJ5Q291bnQgKyAiOiAiICsgaWFlLmdldE1lc3NhZ2UoKSArICIsIHJlc291cmNlICIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGYWlsZWQgdG8gZGVsZXRlICIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBpZiAobGFzdEV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBsYXN0RXhjZXB0aW9uOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldEJ1bmRsZVBhdGgoU3RyaW5nIHBsdWdpbklkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlVUkwgcGxhdGZvcm1VUkwgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQgCi0JCXJldHVybiBuZXcgRmlsZShGaWxlTG9jYXRvci50b0ZpbGVVUkwocGxhdGZvcm1VUkwpLmdldEZpbGUoKSk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRCdW5kbGVQYXRoKFN0cmluZyBwbHVnaW5JZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVVJMIHBsYXRmb3JtVVJMID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIHJldHVybiBuZXcgRmlsZShGaWxlTG9jYXRvci50b0ZpbGVVUkwocGxhdGZvcm1VUkwpLmdldEZpbGUoKSk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldEZpbGVQYXRoKFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIHNlZ21lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVVSTCBwbGF0Zm9ybVVSTCA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCkuZ2V0RW50cnkoc2VnbWVudCk7Ci0JCXJldHVybiBuZXcgRmlsZShGaWxlTG9jYXRvci50b0ZpbGVVUkwocGxhdGZvcm1VUkwpLmdldEZpbGUoKSk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRGaWxlUGF0aChTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBzZWdtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBVUkwgcGxhdGZvcm1VUkwgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpLmdldEVudHJ5KHNlZ21lbnQpOworICAgICAgICByZXR1cm4gbmV3IEZpbGUoRmlsZUxvY2F0b3IudG9GaWxlVVJMKHBsYXRmb3JtVVJMKS5nZXRGaWxlKCkpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1hcmtlck1lc3NhZ2VzKElNYXJrZXJbXSBtYXJrZXJzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlNYXJrZXIgY3Vyck1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IChTdHJpbmcpIGN1cnJNYXJrZXIuZ2V0QXR0cmlidXRlKCJtZXNzYWdlIik7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQlzYi5hcHBlbmQoIiwgIik7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQobWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1hcmtlck1lc3NhZ2VzKElNYXJrZXJbXSBtYXJrZXJzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIElNYXJrZXIgY3Vyck1hcmtlciA9IG1hcmtlcnNbaV07CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IChTdHJpbmcpIGN1cnJNYXJrZXIuZ2V0QXR0cmlidXRlKCJtZXNzYWdlIik7CisgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgT1MgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBwbHVnaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbkRpcmVjdG9yeVBhdGgoU3RyaW5nIGJ1bmRsZU5hbWUpIHsKLQkJdHJ5IHsKLQkJCVVSTCBwbGF0Zm9ybVVSTCA9IFBsYXRmb3JtLmdldEJ1bmRsZShidW5kbGVOYW1lKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkIAotCQkJcmV0dXJuIG5ldyBGaWxlKEZpbGVMb2NhdG9yLnRvRmlsZVVSTChwbGF0Zm9ybVVSTCkuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgT1MgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBwbHVnaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbkRpcmVjdG9yeVBhdGgoU3RyaW5nIGJ1bmRsZU5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVSTCBwbGF0Zm9ybVVSTCA9IFBsYXRmb3JtLmdldEJ1bmRsZShidW5kbGVOYW1lKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoRmlsZUxvY2F0b3IudG9GaWxlVVJMKHBsYXRmb3JtVVJMKS5nZXRGaWxlKCkpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdCkgewotCQlyZXR1cm4gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdCk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdCkgeworICAgICAgICByZXR1cm4gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdCk7CisgICAgfQogCi0JLyoqCi0JICogR2V0IGFuIElSZXNvdXJjZSBpbmRpY2F0ZWQgYnkgYSBnaXZlbiBwYXRoIHN0YXJ0aW5nIGF0IHRoZSB3b3Jrc3BhY2Ugcm9vdC4KLQkgKiA8cD4KLQkgKiBEaWZmZXJlbnQgdHlwZSBvZiByZXNvdXJjZSBpcyByZXR1cm5lZCBiYXNlZCBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBwYXRoIGFuZCB3aGV0aGVyIG9yIG5vdCBpdCBlbmRzIHdpdGggYSBwYXRoCi0JICogc2VwYXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlKElQYXRoIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPT0gMCkgewotCQkJCXJldHVybiByb290OwotCQkJfQotCQkJSVByb2plY3QgcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpOwotCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJCXJldHVybiBwcm9qZWN0OwotCQkJfQotCQkJaWYgKHBhdGguaGFzVHJhaWxpbmdTZXBhcmF0b3IoKSkgewotCQkJCXJldHVybiByb290LmdldEZvbGRlcihwYXRoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHJvb3QuZ2V0RmlsZShwYXRoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBHZXQgYW4gSVJlc291cmNlIGluZGljYXRlZCBieSBhIGdpdmVuIHBhdGggc3RhcnRpbmcgYXQgdGhlIHdvcmtzcGFjZSByb290LgorICAgICAqIDxwPgorICAgICAqIERpZmZlcmVudCB0eXBlIG9mIHJlc291cmNlIGlzIHJldHVybmVkIGJhc2VkIG9uIHRoZSBsZW5ndGggb2YgdGhlIHBhdGggYW5kIHdoZXRoZXIgb3Igbm90IGl0IGVuZHMgd2l0aCBhIHBhdGgKKyAgICAgKiBzZXBhcmF0b3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSVBhdGggcGF0aCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisgICAgICAgICAgICBpZiAocGF0aC5zZWdtZW50Q291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KHBhdGguc2VnbWVudCgwKSk7CisgICAgICAgICAgICBpZiAocGF0aC5zZWdtZW50Q291bnQoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb2plY3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGF0aC5oYXNUcmFpbGluZ1NlcGFyYXRvcigpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJvb3QuZ2V0Rm9sZGVyKHBhdGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcm9vdC5nZXRGaWxlKHBhdGgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogR2V0IGFuIElSZXNvdXJjZSBmcm9tIGEgcGF0aCBTdHJpbmcgc3RhcnRpbmcgYXQgdGhlIHdvcmtzcGFjZSByb290LgotCSAqIDxwPgotCSAqIERpZmZlcmVudCB0eXBlIG9mIHJlc291cmNlIGlzIHJldHVybmVkIGJhc2VkIG9uIHRoZSBsZW5ndGggb2YgdGhlIHBhdGggYW5kIHdoZXRoZXIgb3Igbm90IGl0IGVuZHMgd2l0aCBhIHBhdGgKLQkgKiBzZXBhcmF0b3IuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUgIiIgbGVuZ3RoID0gMCA9PiB0eXBlIG9mIHJlc291cmNlIGlzIElXb3Jrc3BhY2VSb290ICJmb28iIGxlbmd0aCA9IDEgPT4gdHlwZSBvZiByZXNvdXJjZSBpcyBJUHJvamVjdAotCSAqICJmb28vc3JjL0Zvby5qYXZhIiBsZW5ndGggPiAxIGFuZCBubyB0cmFpbGluZyAiLyIgPT4gdHlwZSBpcyBJRmlsZQotCSAqICJmb28vc3JjLyAgICAgICAgICBsZW5ndGggPiAxIGFuZCBhIHRyYWlsaW5nICIvIiA9PiB0eXBlIGlzIElGb2xkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShTdHJpbmcgcGF0aFRvRmlsZSkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2UoUGF0aC5ST09ULmFwcGVuZChwYXRoVG9GaWxlKSk7Ci0JfQorICAgIC8qKgorICAgICAqIEdldCBhbiBJUmVzb3VyY2UgZnJvbSBhIHBhdGggU3RyaW5nIHN0YXJ0aW5nIGF0IHRoZSB3b3Jrc3BhY2Ugcm9vdC4KKyAgICAgKiA8cD4KKyAgICAgKiBEaWZmZXJlbnQgdHlwZSBvZiByZXNvdXJjZSBpcyByZXR1cm5lZCBiYXNlZCBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBwYXRoIGFuZCB3aGV0aGVyIG9yIG5vdCBpdCBlbmRzIHdpdGggYSBwYXRoCisgICAgICogc2VwYXJhdG9yLgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlICIiIGxlbmd0aCA9IDAgPT4gdHlwZSBvZiByZXNvdXJjZSBpcyBJV29ya3NwYWNlUm9vdCAiZm9vIiBsZW5ndGggPSAxID0+IHR5cGUgb2YgcmVzb3VyY2UgaXMgSVByb2plY3QKKyAgICAgKiAiZm9vL3NyYy9Gb28uamF2YSIgbGVuZ3RoID4gMSBhbmQgbm8gdHJhaWxpbmcgIi8iID0+IHR5cGUgaXMgSUZpbGUgImZvby9zcmMvICAgICAgICAgIGxlbmd0aCA+IDEgYW5kIGEgdHJhaWxpbmcgIgorICAgICAqIC8iID0+IHR5cGUgaXMgSUZvbGRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlKFN0cmluZyBwYXRoVG9GaWxlKSB7CisgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZShQYXRoLlJPT1QuYXBwZW5kKHBhdGhUb0ZpbGUpKTsKKyAgICB9CiAKLQlzdGF0aWMgU3RyaW5nIGdldFNvdXJjZVdvcmtzcGFjZVBhdGgoU3RyaW5nIGJ1bmRsZU5hbWUpIHsKLQkJcmV0dXJuIGdldFBsdWdpbkRpcmVjdG9yeVBhdGgoYnVuZGxlTmFtZSkgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yICsgIndvcmtzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQl9CisgICAgc3RhdGljIFN0cmluZyBnZXRTb3VyY2VXb3Jrc3BhY2VQYXRoKFN0cmluZyBidW5kbGVOYW1lKSB7CisgICAgICAgIHJldHVybiBnZXRQbHVnaW5EaXJlY3RvcnlQYXRoKGJ1bmRsZU5hbWUpICsgamF2YS5pby5GaWxlLnNlcGFyYXRvciArICJ3b3Jrc3BhY2UiOyAvLyROT04tTkxTLTEkCisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSVdvcmtzcGFjZSB0aGlzIHRlc3Qgc3VpdGUgaXMgcnVubmluZyBvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJV29ya3NwYWNlIHRoaXMgdGVzdCBzdWl0ZSBpcyBydW5uaW5nIG9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7CisgICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewotCQlyZXR1cm4gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2VSb290IGdldFdvcmtzcGFjZVJvb3QoKSB7CisgICAgICAgIHJldHVybiBnZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVBbmRXYWl0Rm9yRWRpdG9yKGZpbmFsIElFZGl0b3JQYXJ0IGVkaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNhdmVBbmRXYWl0Rm9yRWRpdG9yKGZpbmFsIElFZGl0b3JQYXJ0IGVkaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CiAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQllZGl0b3IuZG9TYXZlKG51bGwpOwotCQkJfQotCQl9KTsKLQkJd2FpdEZvckVkaXRvcihlZGl0b3IpOwotCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBlZGl0b3IuZG9TYXZlKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgd2FpdEZvckVkaXRvcihlZGl0b3IpOworICAgIH0KIAotCXByaXZhdGUgc3RhdGljIElKYXZhUHJvamVjdCBzZXRVcEphdmFQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGJ1bmRsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLAotCQkJSU9FeGNlcHRpb24gewotCQlyZXR1cm4gVmlyZ29JZGVUZXN0VXRpbC5zZXRVcEphdmFQcm9qZWN0KHByb2plY3ROYW1lLCAiMS40IiwgZ2V0U291cmNlV29ya3NwYWNlUGF0aChidW5kbGVOYW1lKSk7IC8vJE5PTi1OTFMtMSQKLQl9CisgICAgcHJpdmF0ZSBzdGF0aWMgSUphdmFQcm9qZWN0IHNldFVwSmF2YVByb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgYnVuZGxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFZpcmdvSWRlVGVzdFV0aWwuc2V0VXBKYXZhUHJvamVjdChwcm9qZWN0TmFtZSwgIjEuNCIsIGdldFNvdXJjZVdvcmtzcGFjZVBhdGgoYnVuZGxlTmFtZSkpOyAvLyROT04tTkxTLTEkCisgICAgfQogCi0JcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3Qgc2V0VXBKYXZhUHJvamVjdChmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBjb21wbGlhbmNlLCBTdHJpbmcgc291cmNlV29ya3NwYWNlUGF0aCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBzZXRVcFByb2plY3QocHJvamVjdE5hbWUsIGNvbXBsaWFuY2UsIHNvdXJjZVdvcmtzcGFjZVBhdGgpOwotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCXJldHVybiBqYXZhUHJvamVjdDsKLQl9CisgICAgcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3Qgc2V0VXBKYXZhUHJvamVjdChmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBjb21wbGlhbmNlLCBTdHJpbmcgc291cmNlV29ya3NwYWNlUGF0aCkKKyAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IHNldFVwUHJvamVjdChwcm9qZWN0TmFtZSwgY29tcGxpYW5jZSwgc291cmNlV29ya3NwYWNlUGF0aCk7CisgICAgICAgIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKKyAgICAgICAgcmV0dXJuIGphdmFQcm9qZWN0OworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgSVByb2plY3Qgc2V0VXBQcm9qZWN0KGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGNvbXBsaWFuY2UsIFN0cmluZyBzb3VyY2VXb3Jrc3BhY2VQYXRoKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gY29weSBmaWxlcyBpbiBwcm9qZWN0IGZyb20gc291cmNlIHdvcmtzcGFjZSB0byB0YXJnZXQgd29ya3NwYWNlCi0JCVN0cmluZyB0YXJnZXRXb3Jrc3BhY2VQYXRoID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQljb3B5RGlyZWN0b3J5KG5ldyBGaWxlKHNvdXJjZVdvcmtzcGFjZVBhdGgsIHByb2plY3ROYW1lKSwgbmV3IEZpbGUodGFyZ2V0V29ya3NwYWNlUGF0aCwgcHJvamVjdE5hbWUpKTsKKyAgICBwdWJsaWMgc3RhdGljIElQcm9qZWN0IHNldFVwUHJvamVjdChmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBjb21wbGlhbmNlLCBTdHJpbmcgc291cmNlV29ya3NwYWNlUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY29weSBmaWxlcyBpbiBwcm9qZWN0IGZyb20gc291cmNlIHdvcmtzcGFjZSB0byB0YXJnZXQgd29ya3NwYWNlCisgICAgICAgIFN0cmluZyB0YXJnZXRXb3Jrc3BhY2VQYXRoID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0Q2Fub25pY2FsUGF0aCgpOworICAgICAgICBjb3B5RGlyZWN0b3J5KG5ldyBGaWxlKHNvdXJjZVdvcmtzcGFjZVBhdGgsIHByb2plY3ROYW1lKSwgbmV3IEZpbGUodGFyZ2V0V29ya3NwYWNlUGF0aCwgcHJvamVjdE5hbWUpKTsKIAotCQkvLyBjcmVhdGUgcHJvamVjdAotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlJV29ya3NwYWNlUnVubmFibGUgcG9wdWxhdGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQkJCXRyeSB7Ci0JCQkJCXByb2plY3Qub3BlbihudWxsKTsKLQkJCQl9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gd2FpdCBhbmQgdHJ5IGFnYWluIHRvIHdvcmstYXJvdW5kCi0JCQkJCS8vIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gKGJ1ZyAyODA0ODgpCi0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCQkJCXByb2plY3Qub3BlbihudWxsKTsKLQkJCQkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQlnZXRXb3Jrc3BhY2UoKS5ydW4ocG9wdWxhdGUsIG51bGwpOwotCQlyZXR1cm4gcHJvamVjdDsKLQl9CisgICAgICAgIC8vIGNyZWF0ZSBwcm9qZWN0CisgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7CisgICAgICAgIElXb3Jrc3BhY2VSdW5uYWJsZSBwb3B1bGF0ZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CiAKLQkvKioKLQkgKiBXYWl0IGZvciBhdXRvYnVpbGQgbm90aWZpY2F0aW9uIHRvIG9jY3VyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JBdXRvQnVpbGQoKSB7Ci0JCXdhaXRGb3JKb2JGYW1pbHkoUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxEKTsKLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcHJvamVjdC5jcmVhdGUobnVsbCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5vcGVuKG51bGwpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGFuZCB0cnkgYWdhaW4gdG8gd29yay1hcm91bmQKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiAoYnVnIDI4MDQ4OCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5vcGVuKG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGdldFdvcmtzcGFjZSgpLnJ1bihwb3B1bGF0ZSwgbnVsbCk7CisgICAgICAgIHJldHVybiBwcm9qZWN0OworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yRGlzcGxheSgpIHsKLQkJd2hpbGUgKERpc3BsYXkuZ2V0RGVmYXVsdCgpLnJlYWRBbmREaXNwYXRjaCgpKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9CisgICAgLyoqCisgICAgICogV2FpdCBmb3IgYXV0b2J1aWxkIG5vdGlmaWNhdGlvbiB0byBvY2N1cgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yQXV0b0J1aWxkKCkgeworICAgICAgICB3YWl0Rm9ySm9iRmFtaWx5KFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGaWxlRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCUlGaWxlIGZpbGUgPSBlZGl0b3JJbnB1dC5nZXRGaWxlKCk7Ci0JCXdhaXRGb3JSZXNvdXJjZShmaWxlKTsKLQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JEaXNwbGF5KCkgeworICAgICAgICB3aGlsZSAoRGlzcGxheS5nZXREZWZhdWx0KCkucmVhZEFuZERpc3BhdGNoKCkpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9ySm9iRmFtaWx5KE9iamVjdCBqb2JGYW1pbHkpIHsKLQkJYm9vbGVhbiB3YXNJbnRlcnJ1cHRlZCA9IGZhbHNlOwotCQlkbyB7Ci0JCQl0cnkgewotCQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihqb2JGYW1pbHksIG51bGwpOwotCQkJCXdhc0ludGVycnVwdGVkID0gZmFsc2U7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQl3YXNJbnRlcnJ1cHRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0gd2hpbGUgKHdhc0ludGVycnVwdGVkKTsKLQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIElGaWxlRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgZWRpdG9yLmdldEVkaXRvcklucHV0KCk7CisgICAgICAgIElGaWxlIGZpbGUgPSBlZGl0b3JJbnB1dC5nZXRGaWxlKCk7CisgICAgICAgIHdhaXRGb3JSZXNvdXJjZShmaWxlKTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FpdEZvck1hbnVhbEJ1aWxkKCkgewotCQl3YWl0Rm9ySm9iRmFtaWx5KFJlc291cmNlc1BsdWdpbi5GQU1JTFlfTUFOVUFMX0JVSUxEKTsKLQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JKb2JGYW1pbHkoT2JqZWN0IGpvYkZhbWlseSkgeworICAgICAgICBib29sZWFuIHdhc0ludGVycnVwdGVkID0gZmFsc2U7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKGpvYkZhbWlseSwgbnVsbCk7CisgICAgICAgICAgICAgICAgd2FzSW50ZXJydXB0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHdhc0ludGVycnVwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAod2FzSW50ZXJydXB0ZWQpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXdhaXRGb3JBdXRvQnVpbGQoKTsKLQkJd2FpdEZvck1hbnVhbEJ1aWxkKCk7Ci0JCXdhaXRGb3JKb2JGYW1pbHkoUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX1JFRlJFU0gpOwotCQl3YWl0Rm9ySm9iRmFtaWx5KFJlc291cmNlc1BsdWdpbi5GQU1JTFlfTUFOVUFMX1JFRlJFU0gpOwotCQlyZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yTWFudWFsQnVpbGQoKSB7CisgICAgICAgIHdhaXRGb3JKb2JGYW1pbHkoUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBdXRvQnVpbGRpbmcoYm9vbGVhbiBlbmFibGVkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiB3c2QgPSBnZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpOwotCQlpZiAoIXdzZC5pc0F1dG9CdWlsZGluZygpID09IGVuYWJsZWQpIHsKLQkJCXdzZC5zZXRBdXRvQnVpbGRpbmcoZW5hYmxlZCk7Ci0JCQlnZXRXb3Jrc3BhY2UoKS5zZXREZXNjcmlwdGlvbih3c2QpOwotCQl9Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yUmVzb3VyY2UoSVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIHdhaXRGb3JBdXRvQnVpbGQoKTsKKyAgICAgICAgd2FpdEZvck1hbnVhbEJ1aWxkKCk7CisgICAgICAgIHdhaXRGb3JKb2JGYW1pbHkoUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX1JFRlJFU0gpOworICAgICAgICB3YWl0Rm9ySm9iRmFtaWx5KFJlc291cmNlc1BsdWdpbi5GQU1JTFlfTUFOVUFMX1JFRlJFU0gpOworICAgICAgICByZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEF1dG9CdWlsZGluZyhib29sZWFuIGVuYWJsZWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgSVdvcmtzcGFjZURlc2NyaXB0aW9uIHdzZCA9IGdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgIGlmICghd3NkLmlzQXV0b0J1aWxkaW5nKCkgPT0gZW5hYmxlZCkgeworICAgICAgICAgICAgd3NkLnNldEF1dG9CdWlsZGluZyhlbmFibGVkKTsKKyAgICAgICAgICAgIGdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKHdzZCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCBiYmFjYTZkLi40MzIxYmQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTEsNCArMSwzIEBACi0jV2VkIE1hciAwMiAxNjowMDowNiBQU1QgMjAxMQogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9CkBAIC04LDYgKzcsOCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCkBAIC04MiwzNSArODMsMzcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTgwCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj00OAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbj0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeT04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2g9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKQEAgLTEyMSwzMCArMTI0LDMxIEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9sYW1iZGFfYm9keT1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTEyMAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2phdmFkb2NfYm91bmRhcmllcz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5wcmVzZXJ2ZV93aGl0ZV9zcGFjZV9iZXR3ZWVuX2NvZGVfYW5kX2xpbmVfY29tbWVudHM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5kaXNhYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9mZgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmVuYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvbgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKQEAgLTE1OCw3ICsxNjIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQ9aW5zZXJ0CkBAIC0xNjYsMTAgKzE3MCwxMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21lbWJlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZXRob2Q9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFja2FnZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl90eXBlPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9sYWJlbD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl90eXBlX2Fubm90YXRpb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0yMTcsNiArMjIyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTIzNSwxMiArMjQxLDE0IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKQEAgLTI2NCw2ICsyNzIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKQEAgLTI5MSw2ICszMDAsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTMxOSw2ICszMjksNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fdHJ5PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0CkBAIC0zMjgsNiArMzM5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKQEAgLTM0MywxNSArMzU1LDE3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xMjAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXNwYWNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2Vfb25fb2ZmX3RhZ3M9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfb3Jfb3BlcmF0b3JfbXVsdGljYXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9vdXRlcl9leHByZXNzaW9uc193aGVuX25lc3RlZD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhRm9ybWF0dGVyPW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRlZmF1bHRKYXZhRm9ybWF0dGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmluZGV4IDdlN2ZlNzMuLjZjOTgwMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0xLDcgKzEsNjUgQEAKK2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9uc19pbnRlcmZhY2VfbWV0aG9kcz10cnVlCitjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAuY29udmVydF9mdW5jdGlvbmFsX2ludGVyZmFjZXM9ZmFsc2UKK2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQorY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9ZmFsc2UKK2NsZWFudXAuaW5zZXJ0X2luZmVycmVkX3R5cGVfYXJndW1lbnRzPWZhbHNlCitjbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3R5cGVfYWJzdHJhY3RfaWZfbWlzc2luZ19tZXRob2Q9ZmFsc2UKK2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQorY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitjbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfcmVkdW5kYW50X3R5cGVfYXJndW1lbnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCitjbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQorY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCitjbGVhbnVwLnVzZV9hbm9ueW1vdXNfY2xhc3NfY3JlYXRpb249ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQorY2xlYW51cC51c2VfbGFtYmRhPXRydWUKK2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwLnVzZV90eXBlX2FyZ3VtZW50cz1mYWxzZQorY2xlYW51cF9wcm9maWxlPV9WaXJnbyBXZWIgU2VydmVyIC0gQ29kZSBDbGVhbiBVcAogY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCiBlZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9NeWx5biBiYXNlZCBvbiBFY2xpcHNlCitmb3JtYXR0ZXJfcHJvZmlsZT1fVmlyZ28gV2ViIFNlcnZlciAtIENvZGUgRm9ybWF0dGVyCiBmb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMgogaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKIG9yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS90ZXN0cy9CdW5kbGVNYW5pZmVzdEVkaXRvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Rlc3RzL0J1bmRsZU1hbmlmZXN0RWRpdG9yVGVzdC5qYXZhCmluZGV4IDEyZjUwZWUuLjcyZGRkODggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Rlc3RzL0J1bmRsZU1hbmlmZXN0RWRpdG9yVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Rlc3RzL0J1bmRsZU1hbmlmZXN0RWRpdG9yVGVzdC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0czsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTQwLDQ3ICs0MSw0NCBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlTWFuaWZlc3RFZGl0b3JUZXN0IHsKIAotCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZTsKKyAgICBwcml2YXRlIElXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2U7CiAKLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlhY3RpdmVQYWdlLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygwLCBhY3RpdmVQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKS5sZW5ndGgpOwotCX0KKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5hY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7CisgICAgICAgIHRoaXMuYWN0aXZlUGFnZS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdGhpcy5hY3RpdmVQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKS5sZW5ndGgpOworICAgIH0KIAotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFjdGl2ZVBhZ2UuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQl9CisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5hY3RpdmVQYWdlLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7CisgICAgfQogCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU3lzdGVtRmlsZUNvbnRleHRzRnJvbURvdFNldHRpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgc291cmNlID0gVmlyZ29JZGVUZXN0VXRpbC5nZXRGaWxlUGF0aChWaXJnb0lkZVRlc3RzUGx1Z2luLlBMVUdJTl9JRCwgIi90ZXN0ZGF0YS9idW5kbGUvbWFuaWZlc3QubWYiKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCUlGaWxlU3RvcmUgZmlsZSA9IEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKS5nZXRTdG9yZShwYXRoKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJLmdldEFjdGl2ZVBhZ2UoKQotCQkub3BlbkVkaXRvcihuZXcgRmlsZVN0b3JlRWRpdG9ySW5wdXQoZmlsZSksIEJ1bmRsZU1hbmlmZXN0RWRpdG9yLklEX0VESVRPUik7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU3lzdGVtRmlsZUNvbnRleHRzRnJvbURvdFNldHRpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgc291cmNlID0gVmlyZ29JZGVUZXN0VXRpbC5nZXRGaWxlUGF0aChWaXJnb0lkZVRlc3RzUGx1Z2luLlBMVUdJTl9JRCwgIi90ZXN0ZGF0YS9idW5kbGUvbWFuaWZlc3QubWYiKTsKKyAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKHNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIElGaWxlU3RvcmUgZmlsZSA9IEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKS5nZXRTdG9yZShwYXRoKTsKKyAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcihuZXcgRmlsZVN0b3JlRWRpdG9ySW5wdXQoZmlsZSksCisgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdEVkaXRvci5JRF9FRElUT1IpOwogCi0JCWFzc2VydEVxdWFscygxLCBhY3RpdmVQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKS5sZW5ndGgpOwotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBhY3RpdmVQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKVswXS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhCdW5kbGVNYW5pZmVzdEVkaXRvci5jbGFzcywgZWRpdG9yLmdldENsYXNzKCkpOwotCQlCdW5kbGVNYW5pZmVzdEVkaXRvciBwYXJFZGl0b3IgPSAoQnVuZGxlTWFuaWZlc3RFZGl0b3IpIGVkaXRvcjsKLQkJYXNzZXJ0RXF1YWxzKDQsIHBhckVkaXRvci5nZXRQYXJ0cygpLmxlbmd0aCk7Ci0JfQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdGhpcy5hY3RpdmVQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKS5sZW5ndGgpOworICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSB0aGlzLmFjdGl2ZVBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpWzBdLmdldEVkaXRvcih0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ1bmRsZU1hbmlmZXN0RWRpdG9yLmNsYXNzLCBlZGl0b3IuZ2V0Q2xhc3MoKSk7CisgICAgICAgIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIHBhckVkaXRvciA9IChCdW5kbGVNYW5pZmVzdEVkaXRvcikgZWRpdG9yOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcGFyRWRpdG9yLmdldFBhcnRzKCkubGVuZ3RoKTsKKyAgICB9CiAKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RPcGVuSW5EZWZhdWx0RWRpdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBWaXJnb0lkZVRlc3RVdGlsLmNyZWF0ZVByZWRlZmluZWRQcm9qZWN0KCJTaW1wbGVCdW5kbGVQcm9qZWN0IiwKLQkJCQlWaXJnb0lkZVRlc3RzUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCUlGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUpOwotCQlhc3NlcnRUcnVlKGVkaXRvciBpbnN0YW5jZW9mIEJ1bmRsZU1hbmlmZXN0RWRpdG9yKTsKLQkJYXNzZXJ0RmFsc2UoZWRpdG9yIGluc3RhbmNlb2YgUGFyTWFuaWZlc3RFZGl0b3IpOwotCQlWaXJnb0lkZVRlc3RVdGlsLmNsZWFuVXBQcm9qZWN0cygpOwotCX0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuSW5EZWZhdWx0RWRpdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBWaXJnb0lkZVRlc3RVdGlsLmNyZWF0ZVByZWRlZmluZWRQcm9qZWN0KCJTaW1wbGVCdW5kbGVQcm9qZWN0IiwgVmlyZ29JZGVUZXN0c1BsdWdpbi5QTFVHSU5fSUQpOworICAgICAgICBJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKCJzcmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKKyAgICAgICAgSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOworICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlZGl0b3IgaW5zdGFuY2VvZiBCdW5kbGVNYW5pZmVzdEVkaXRvcik7CisgICAgICAgIGFzc2VydEZhbHNlKGVkaXRvciBpbnN0YW5jZW9mIFBhck1hbmlmZXN0RWRpdG9yKTsKKyAgICAgICAgVmlyZ29JZGVUZXN0VXRpbC5jbGVhblVwUHJvamVjdHMoKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Rlc3RzL1Bhck1hbmlmZXN0RWRpdG9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdGVzdHMvUGFyTWFuaWZlc3RFZGl0b3JUZXN0LmphdmEKaW5kZXggZmU0YTY5NC4uYjIwOTRkOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdGVzdHMvUGFyTWFuaWZlc3RFZGl0b3JUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdGVzdHMvUGFyTWFuaWZlc3RFZGl0b3JUZXN0LmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnRlc3RzOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwpAQCAtMzMsNTUgKzM0LDQ5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQYXJNYW5pZmVzdEVkaXRvclRlc3QgewogCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlOworICAgIHByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZTsKIAotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCWFjdGl2ZVBhZ2UuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFjdGl2ZVBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpLmxlbmd0aCk7Ci0JfQorICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0aGlzLmFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKKyAgICAgICAgdGhpcy5hY3RpdmVQYWdlLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCB0aGlzLmFjdGl2ZVBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpLmxlbmd0aCk7CisgICAgfQogCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWN0aXZlUGFnZS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCX0KKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0aGlzLmFjdGl2ZVBhZ2UuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKKyAgICB9CiAKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTeXN0ZW1GaWxlQ29udGV4dHNGcm9tRG90U2V0dGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSBzb3VyY2UgPSBWaXJnb0lkZVRlc3RVdGlsLmdldEZpbGVQYXRoKFZpcmdvSWRlVGVzdHNQbHVnaW4uUExVR0lOX0lELAotCQkJCSIvdGVzdGRhdGEvcGFyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnBhci54bWwiKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCUlGaWxlU3RvcmUgZmlsZSA9IEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKS5nZXRTdG9yZShwYXRoKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJLmdldEFjdGl2ZVBhZ2UoKQotCQkub3BlbkVkaXRvcihuZXcgRmlsZVN0b3JlRWRpdG9ySW5wdXQoZmlsZSksIFBhck1hbmlmZXN0RWRpdG9yLklEX0VESVRPUik7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU3lzdGVtRmlsZUNvbnRleHRzRnJvbURvdFNldHRpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgc291cmNlID0gVmlyZ29JZGVUZXN0VXRpbC5nZXRGaWxlUGF0aChWaXJnb0lkZVRlc3RzUGx1Z2luLlBMVUdJTl9JRCwKKyAgICAgICAgICAgICIvdGVzdGRhdGEvcGFyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnBhci54bWwiKTsKKyAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKHNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIElGaWxlU3RvcmUgZmlsZSA9IEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKS5nZXRTdG9yZShwYXRoKTsKKyAgICAgICAgUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcihuZXcgRmlsZVN0b3JlRWRpdG9ySW5wdXQoZmlsZSksIFBhck1hbmlmZXN0RWRpdG9yLklEX0VESVRPUik7CiAKLQkJYXNzZXJ0RXF1YWxzKDEsIGFjdGl2ZVBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpLmxlbmd0aCk7Ci0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGFjdGl2ZVBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpWzBdLmdldEVkaXRvcih0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKFBhck1hbmlmZXN0RWRpdG9yLmNsYXNzLCBlZGl0b3IuZ2V0Q2xhc3MoKSk7Ci0JCVBhck1hbmlmZXN0RWRpdG9yIHBhckVkaXRvciA9IChQYXJNYW5pZmVzdEVkaXRvcikgZWRpdG9yOwotCQlhc3NlcnRFcXVhbHMoMywgcGFyRWRpdG9yLmdldFBhcnRzKCkubGVuZ3RoKTsKLQl9CisgICAgICAgIGFzc2VydEVxdWFscygxLCB0aGlzLmFjdGl2ZVBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpLmxlbmd0aCk7CisgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IHRoaXMuYWN0aXZlUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKClbMF0uZ2V0RWRpdG9yKHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoUGFyTWFuaWZlc3RFZGl0b3IuY2xhc3MsIGVkaXRvci5nZXRDbGFzcygpKTsKKyAgICAgICAgUGFyTWFuaWZlc3RFZGl0b3IgcGFyRWRpdG9yID0gKFBhck1hbmlmZXN0RWRpdG9yKSBlZGl0b3I7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBwYXJFZGl0b3IuZ2V0UGFydHMoKS5sZW5ndGgpOworICAgIH0KIAotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVN5c3RlbUZpbGVDb250ZXh0c0Zyb21QYXJYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSBzb3VyY2UgPSBWaXJnb0lkZVRlc3RVdGlsLmdldEZpbGVQYXRoKFZpcmdvSWRlVGVzdHNQbHVnaW4uUExVR0lOX0lELCAiL3Rlc3RkYXRhL3Bhci9wYXIueG1sIik7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChzb3VyY2UuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlJRmlsZVN0b3JlIGZpbGUgPSBFRlMuZ2V0TG9jYWxGaWxlU3lzdGVtKCkuZ2V0U3RvcmUocGF0aCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCS5nZXRBY3RpdmVQYWdlKCkKLQkJLm9wZW5FZGl0b3IobmV3IEZpbGVTdG9yZUVkaXRvcklucHV0KGZpbGUpLCBQYXJNYW5pZmVzdEVkaXRvci5JRF9FRElUT1IpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVN5c3RlbUZpbGVDb250ZXh0c0Zyb21QYXJYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBzb3VyY2UgPSBWaXJnb0lkZVRlc3RVdGlsLmdldEZpbGVQYXRoKFZpcmdvSWRlVGVzdHNQbHVnaW4uUExVR0lOX0lELCAiL3Rlc3RkYXRhL3Bhci9wYXIueG1sIik7CisgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChzb3VyY2UuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBJRmlsZVN0b3JlIGZpbGUgPSBFRlMuZ2V0TG9jYWxGaWxlU3lzdGVtKCkuZ2V0U3RvcmUocGF0aCk7CisgICAgICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLm9wZW5FZGl0b3IobmV3IEZpbGVTdG9yZUVkaXRvcklucHV0KGZpbGUpLCBQYXJNYW5pZmVzdEVkaXRvci5JRF9FRElUT1IpOwogCi0JCS8vIGZhaWxzIHNpbmNlIHRoZSBjb3JyZXNwb25kaW5nIE1BTklGRVNULk1GIGlzIG5vdCBmb3VuZAotCQlhc3NlcnRFcXVhbHMoMSwgYWN0aXZlUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCkubGVuZ3RoKTsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gYWN0aXZlUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKClbMF0uZ2V0RWRpdG9yKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoUGFyTWFuaWZlc3RFZGl0b3IuY2xhc3MsIGVkaXRvci5nZXRDbGFzcygpKTsKLQkJUGFyTWFuaWZlc3RFZGl0b3IgcGFyRWRpdG9yID0gKFBhck1hbmlmZXN0RWRpdG9yKSBlZGl0b3I7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJFZGl0b3IuZ2V0UGFydHMoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIk1pc3NpbmdSZXNvdXJjZVBhZ2UiLCBwYXJFZGl0b3IuZ2V0UGFydHMoKVswXS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JfQorICAgICAgICAvLyBmYWlscyBzaW5jZSB0aGUgY29ycmVzcG9uZGluZyBNQU5JRkVTVC5NRiBpcyBub3QgZm91bmQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRoaXMuYWN0aXZlUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCkubGVuZ3RoKTsKKyAgICAgICAgSUVkaXRvclBhcnQgZWRpdG9yID0gdGhpcy5hY3RpdmVQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKVswXS5nZXRFZGl0b3IodHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQYXJNYW5pZmVzdEVkaXRvci5jbGFzcywgZWRpdG9yLmdldENsYXNzKCkpOworICAgICAgICBQYXJNYW5pZmVzdEVkaXRvciBwYXJFZGl0b3IgPSAoUGFyTWFuaWZlc3RFZGl0b3IpIGVkaXRvcjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBhckVkaXRvci5nZXRQYXJ0cygpLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTWlzc2luZ1Jlc291cmNlUGFnZSIsIHBhckVkaXRvci5nZXRQYXJ0cygpWzBdLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Rlc3RzL1ZpcmdvSWRlVGVzdHNQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3Rlc3RzL1ZpcmdvSWRlVGVzdHNQbHVnaW4uamF2YQppbmRleCA3ODllMjNjLi4wMWZmMTE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS90ZXN0cy9WaXJnb0lkZVRlc3RzUGx1Z2luLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdGVzdHMvVmlyZ29JZGVUZXN0c1BsdWdpbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS50ZXN0czsKIAogLyoqCkBAIC0xNSw2ICsxNiw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBWaXJnb0lkZVRlc3RzUGx1Z2luIHsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUudGVzdHMiOwogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCBiYmFjYTZkLi40MzIxYmQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTEsNCArMSwzIEBACi0jV2VkIE1hciAwMiAxNjowMDowNiBQU1QgMjAxMQogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9CkBAIC04LDYgKzcsOCBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkU3VmZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCkBAIC04MiwzNSArODMsMzcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2Fubm90YXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTgwCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj00OAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX21ldGhvZF9kZWNsYXJhdGlvbj0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcmVzb3VyY2VzX2luX3RyeT04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl91bmlvbl90eXBlX2luX211bHRpY2F0Y2g9MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKQEAgLTEyMSwzMCArMTI0LDMxIEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9sYW1iZGFfYm9keT1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTEyMAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2Jsb2NrX2JvdW5kYXJpZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubmV3X2xpbmVzX2F0X2phdmFkb2NfYm91bmRhcmllcz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5wcmVzZXJ2ZV93aGl0ZV9zcGFjZV9iZXR3ZWVuX2NvZGVfYW5kX2xpbmVfY29tbWVudHM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5kaXNhYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9mZgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmVuYWJsaW5nX3RhZz1AZm9ybWF0dGVyXDpvbgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKQEAgLTE1OCw3ICsxNjIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQ9aW5zZXJ0CkBAIC0xNjYsMTAgKzE3MCwxMSBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21lbWJlcj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZXRob2Q9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFja2FnZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl90eXBlPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9sYWJlbD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl90eXBlX2Fubm90YXRpb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CkBAIC0yMTcsNiArMjIyLDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTIzNSwxMiArMjQxLDE0IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fdHJ5PWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fdHJ5X3Jlc291cmNlcz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKQEAgLTI2NCw2ICsyNzIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWRvIG5vdCBpbnNlcnQKQEAgLTI5MSw2ICszMDAsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2xhbWJkYV9hcnJvdz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKQEAgLTMxOSw2ICszMjksNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fdHJ5PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0CkBAIC0zMjgsNiArMzM5LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKQEAgLTM0MywxNSArMzU1LDE3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xMjAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXNwYWNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2Vfb25fb2ZmX3RhZ3M9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfb3Jfb3BlcmF0b3JfbXVsdGljYXRjaD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9vdXRlcl9leHByZXNzaW9uc193aGVuX25lc3RlZD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhRm9ybWF0dGVyPW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRlZmF1bHRKYXZhRm9ybWF0dGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmluZGV4IDdlN2ZlNzMuLjZjOTgwMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0xLDcgKzEsNjUgQEAKK2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9uc19pbnRlcmZhY2VfbWV0aG9kcz10cnVlCitjbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitjbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAuY29udmVydF9mdW5jdGlvbmFsX2ludGVyZmFjZXM9ZmFsc2UKK2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQorY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitjbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9ZmFsc2UKK2NsZWFudXAuaW5zZXJ0X2luZmVycmVkX3R5cGVfYXJndW1lbnRzPWZhbHNlCitjbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCitjbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQorY2xlYW51cC5tYWtlX3R5cGVfYWJzdHJhY3RfaWZfbWlzc2luZ19tZXRob2Q9ZmFsc2UKK2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQorY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCitjbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCitjbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfcmVkdW5kYW50X3R5cGVfYXJndW1lbnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCitjbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCitjbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQorY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCitjbGVhbnVwLnVzZV9hbm9ueW1vdXNfY2xhc3NfY3JlYXRpb249ZmFsc2UKK2NsZWFudXAudXNlX2Jsb2Nrcz10cnVlCitjbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQorY2xlYW51cC51c2VfbGFtYmRhPXRydWUKK2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPXRydWUKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PWZhbHNlCitjbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCitjbGVhbnVwLnVzZV90eXBlX2FyZ3VtZW50cz1mYWxzZQorY2xlYW51cF9wcm9maWxlPV9WaXJnbyBXZWIgU2VydmVyIC0gQ29kZSBDbGVhbiBVcAogY2xlYW51cF9zZXR0aW5nc192ZXJzaW9uPTIKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCiBlZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9NeWx5biBiYXNlZCBvbiBFY2xpcHNlCitmb3JtYXR0ZXJfcHJvZmlsZT1fVmlyZ28gV2ViIFNlcnZlciAtIENvZGUgRm9ybWF0dGVyCiBmb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMgogaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKIG9yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUltcG9ydExpYnJhcnlTZWN0aW9uVWlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUltcG9ydExpYnJhcnlTZWN0aW9uVWlUZXN0LmphdmEKaW5kZXggNTNiNGZjYy4uNjk3ODJlOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvblVpVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlSW1wb3J0TGlicmFyeVNlY3Rpb25VaVRlc3QuamF2YQpAQCAtOCwxMyArOCw5IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci5maW5kZXJzLlVJVGhyZWFkUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIucmVzdWx0cy5Wb2lkUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLndpZGdldHMuU1dUQm90QnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLndpZGdldHMuU1dUQm90U2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2lkZ2V0cy5TV1RCb3RUYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMuQWJzdHJhY3RNYW5pZmVzdFVpVGVzdENhc2U7CiAKIC8qKgpAQCAtMjIsODQgKzE4LDg4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvblVpVGVzdCBleHRlbmRzIEFic3RyYWN0TWFuaWZlc3RVaVRlc3RDYXNlIHsKIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTRUNUSU9OX0xBQkVMID0gIkltcG9ydCBMaWJyYXJ5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU0VDVElPTl9MQUJFTCA9ICJJbXBvcnQgTGlicmFyeSI7CiAKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOwotCQkJfQotCQl9KTsKLQkJYm90LmZsYXRCdXR0b25JblNlY3Rpb24oIkFkZC4uLiIsIFNFQ1RJT05fTEFCRUwpLmNsaWNrKCk7CisgICAgcHVibGljIHZvaWQgdGVzdEFkZEJ1dHRvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCdW5kbGVNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5CdW5kbGVNYW5pZmVzdEZpbGUoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOworICAgICAgICBVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgewogCi0JCVNXVEJvdFNoZWxsIGFkZERpYWxvZyA9IGJvdC5zaGVsbCgiTGlicmFyeSBTZWxlY3Rpb24iKTsKLQkJYXNzZXJ0VHJ1ZShhZGREaWFsb2cuaXNPcGVuKCkpOwotCQlhZGREaWFsb2cuY2xvc2UoKTsKLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdGhpcy5ib3QuZmxhdEJ1dHRvbkluU2VjdGlvbigiQWRkLi4uIiwgU0VDVElPTl9MQUJFTCkuY2xpY2soKTsKIAotCXB1YmxpYyB2b2lkIHRlc3REb3dubG9hZEJ1dHRvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBCdW5kbGVNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5CdW5kbGVNYW5pZmVzdEZpbGUoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotCQlVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW1hbmlmZXN0LnNldEFjdGl2ZVBhZ2UoQnVuZGxlRGVwZW5kZW5jaWVzUGFnZS5QQUdFX0lEKTsKLQkJCX0KLQkJfSk7CisgICAgICAgIFNXVEJvdFNoZWxsIGFkZERpYWxvZyA9IHRoaXMuYm90LnNoZWxsKCJMaWJyYXJ5IFNlbGVjdGlvbiIpOworICAgICAgICBhc3NlcnRUcnVlKGFkZERpYWxvZy5pc09wZW4oKSk7CisgICAgICAgIGFkZERpYWxvZy5jbG9zZSgpOworICAgIH0KIAotCQlTV1RCb3RUYWJsZSB0YWJsZSA9IGJvdC50YWJsZUluU2VjdGlvbihTRUNUSU9OX0xBQkVMKTsKLQkJaW50IGNvdW50ID0gdGFibGUucm93Q291bnQoKTsKLQkJYm90LmZsYXRCdXR0b25JblNlY3Rpb24oIkRvd25sb2FkLi4uIiwgU0VDVElPTl9MQUJFTCkuY2xpY2soKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG93bmxvYWRCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQnVuZGxlTWFuaWZlc3RFZGl0b3IgbWFuaWZlc3QgPSBvcGVuQnVuZGxlTWFuaWZlc3RGaWxlKCJzcmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKKyAgICAgICAgVUlUaHJlYWRSdW5uYWJsZS5zeW5jRXhlYyhuZXcgVm9pZFJlc3VsdCgpIHsKIAotCQlTV1RCb3RTaGVsbCBkb3dubG9hZERpYWxvZyA9IGJvdC5zaGVsbCgiTGlicmFyeSBTZWxlY3Rpb24iKTsKLQkJYXNzZXJ0VHJ1ZShkb3dubG9hZERpYWxvZy5pc09wZW4oKSk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKIAotCQlib3QudGFibGUoKS5zZWxlY3QoMCk7Ci0JCWJvdC5idXR0b24oIk9LIikuY2xpY2soKTsKLQkJYXNzZXJ0RXF1YWxzKGNvdW50ICsgMSwgdGFibGUucm93Q291bnQoKSk7Ci0JfQorICAgICAgICBTV1RCb3RUYWJsZSB0YWJsZSA9IHRoaXMuYm90LnRhYmxlSW5TZWN0aW9uKFNFQ1RJT05fTEFCRUwpOworICAgICAgICBpbnQgY291bnQgPSB0YWJsZS5yb3dDb3VudCgpOworICAgICAgICB0aGlzLmJvdC5mbGF0QnV0dG9uSW5TZWN0aW9uKCJEb3dubG9hZC4uLiIsIFNFQ1RJT05fTEFCRUwpLmNsaWNrKCk7CiAKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOwotCQkJfQotCQl9KTsKKyAgICAgICAgU1dUQm90U2hlbGwgZG93bmxvYWREaWFsb2cgPSB0aGlzLmJvdC5zaGVsbCgiTGlicmFyeSBTZWxlY3Rpb24iKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkb3dubG9hZERpYWxvZy5pc09wZW4oKSk7CiAKLQkJU1dUQm90QnV0dG9uIGJ1dHRvbiA9IGJvdC5mbGF0QnV0dG9uSW5TZWN0aW9uKCJSZW1vdmUiLCBTRUNUSU9OX0xBQkVMKTsKLQkJYXNzZXJ0RmFsc2UoYnV0dG9uLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgdGhpcy5ib3QudGFibGUoKS5zZWxlY3QoMCk7CisgICAgICAgIHRoaXMuYm90LmJ1dHRvbigiT0siKS5jbGljaygpOworICAgICAgICBhc3NlcnRFcXVhbHMoY291bnQgKyAxLCB0YWJsZS5yb3dDb3VudCgpKTsKKyAgICB9CiAKLQkJU1dUQm90VGFibGUgdGFibGUgPSBib3QudGFibGVJblNlY3Rpb24oU0VDVElPTl9MQUJFTCk7Ci0JCWludCBjb3VudCA9IHRhYmxlLnJvd0NvdW50KCk7Ci0JCWFzc2VydFRydWUoY291bnQgPiAwKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7CisgICAgICAgIFVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7CiAKLQkJdGFibGUuc2VsZWN0KDApOwotCQlhc3NlcnRUcnVlKGJ1dHRvbi5pc0VuYWJsZWQoKSk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKIAotCQlidXR0b24uY2xpY2soKTsKLQkJYXNzZXJ0RXF1YWxzKGNvdW50IC0gMSwgdGFibGUucm93Q291bnQoKSk7Ci0JfQorICAgICAgICBTV1RCb3RCdXR0b24gYnV0dG9uID0gdGhpcy5ib3QuZmxhdEJ1dHRvbkluU2VjdGlvbigiUmVtb3ZlIiwgU0VDVElPTl9MQUJFTCk7CisgICAgICAgIGFzc2VydEZhbHNlKGJ1dHRvbi5pc0VuYWJsZWQoKSk7CiAKLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydGllc0J1dHRvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBCdW5kbGVNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5CdW5kbGVNYW5pZmVzdEZpbGUoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotCQlVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW1hbmlmZXN0LnNldEFjdGl2ZVBhZ2UoQnVuZGxlRGVwZW5kZW5jaWVzUGFnZS5QQUdFX0lEKTsKLQkJCX0KLQkJfSk7CisgICAgICAgIFNXVEJvdFRhYmxlIHRhYmxlID0gdGhpcy5ib3QudGFibGVJblNlY3Rpb24oU0VDVElPTl9MQUJFTCk7CisgICAgICAgIGludCBjb3VudCA9IHRhYmxlLnJvd0NvdW50KCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnQgPiAwKTsKIAotCQlTV1RCb3RCdXR0b24gYnV0dG9uID0gYm90LmZsYXRCdXR0b25JblNlY3Rpb24oIlByb3BlcnRpZXMuLi4iLCBTRUNUSU9OX0xBQkVMKTsKLQkJYXNzZXJ0RmFsc2UoYnV0dG9uLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgdGFibGUuc2VsZWN0KDApOworICAgICAgICBhc3NlcnRUcnVlKGJ1dHRvbi5pc0VuYWJsZWQoKSk7CiAKLQkJU1dUQm90VGFibGUgdGFibGUgPSBib3QudGFibGVJblNlY3Rpb24oU0VDVElPTl9MQUJFTCk7Ci0JCVN0cmluZyB0ZXh0ID0gdGFibGUuZ2V0VGFibGVJdGVtKDApLmdldFRleHQoKTsKLQkJdGFibGUuc2VsZWN0KDApOwotCQlhc3NlcnRUcnVlKGJ1dHRvbi5pc0VuYWJsZWQoKSk7Ci0JCWJ1dHRvbi5jbGljaygpOworICAgICAgICBidXR0b24uY2xpY2soKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50IC0gMSwgdGFibGUucm93Q291bnQoKSk7CisgICAgfQogCi0JCVNXVEJvdFNoZWxsIHByb3BlcnRpZXNEaWFsb2cgPSBib3Quc2hlbGwodGV4dCk7Ci0JCWFzc2VydFRydWUocHJvcGVydGllc0RpYWxvZy5pc09wZW4oKSk7Ci0JCXByb3BlcnRpZXNEaWFsb2cuY2xvc2UoKTsKLQl9CisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXNCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQnVuZGxlTWFuaWZlc3RFZGl0b3IgbWFuaWZlc3QgPSBvcGVuQnVuZGxlTWFuaWZlc3RGaWxlKCJzcmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKKyAgICAgICAgVUlUaHJlYWRSdW5uYWJsZS5zeW5jRXhlYyhuZXcgVm9pZFJlc3VsdCgpIHsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1hbmlmZXN0LnNldEFjdGl2ZVBhZ2UoQnVuZGxlRGVwZW5kZW5jaWVzUGFnZS5QQUdFX0lEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgU1dUQm90QnV0dG9uIGJ1dHRvbiA9IHRoaXMuYm90LmZsYXRCdXR0b25JblNlY3Rpb24oIlByb3BlcnRpZXMuLi4iLCBTRUNUSU9OX0xBQkVMKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYnV0dG9uLmlzRW5hYmxlZCgpKTsKKworICAgICAgICBTV1RCb3RUYWJsZSB0YWJsZSA9IHRoaXMuYm90LnRhYmxlSW5TZWN0aW9uKFNFQ1RJT05fTEFCRUwpOworICAgICAgICBTdHJpbmcgdGV4dCA9IHRhYmxlLmdldFRhYmxlSXRlbSgwKS5nZXRUZXh0KCk7CisgICAgICAgIHRhYmxlLnNlbGVjdCgwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShidXR0b24uaXNFbmFibGVkKCkpOworICAgICAgICBidXR0b24uY2xpY2soKTsKKworICAgICAgICBTV1RCb3RTaGVsbCBwcm9wZXJ0aWVzRGlhbG9nID0gdGhpcy5ib3Quc2hlbGwodGV4dCk7CisgICAgICAgIGFzc2VydFRydWUocHJvcGVydGllc0RpYWxvZy5pc09wZW4oKSk7CisgICAgICAgIHByb3BlcnRpZXNEaWFsb2cuY2xvc2UoKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb25VaVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb25VaVRlc3QuamF2YQppbmRleCBjMTUyZTU2Li5iOTQ4MWRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUltcG9ydFBhY2thZ2VTZWN0aW9uVWlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvblVpVGVzdC5qYXZhCkBAIC04LDEzICs4LDkgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yczsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLmZpbmRlcnMuVUlUaHJlYWRSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci5yZXN1bHRzLlZvaWRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2lkZ2V0cy5TV1RCb3RCdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2lkZ2V0cy5TV1RCb3RTaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci53aWRnZXRzLlNXVEJvdFRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy5BYnN0cmFjdE1hbmlmZXN0VWlUZXN0Q2FzZTsKIAogLyoqCkBAIC0yMiw4NCArMTgsODggQEAKICAqLwogcHVibGljIGNsYXNzIEJ1bmRsZUltcG9ydFBhY2thZ2VTZWN0aW9uVWlUZXN0IGV4dGVuZHMgQWJzdHJhY3RNYW5pZmVzdFVpVGVzdENhc2UgewogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNFQ1RJT05fTEFCRUwgPSAiSW1wb3J0IFBhY2thZ2UiOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBTRUNUSU9OX0xBQkVMID0gIkltcG9ydCBQYWNrYWdlIjsKIAotCXB1YmxpYyB2b2lkIHRlc3RBZGRCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmluYWwgQnVuZGxlTWFuaWZlc3RFZGl0b3IgbWFuaWZlc3QgPSBvcGVuQnVuZGxlTWFuaWZlc3RGaWxlKCJzcmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKLQkJVUlUaHJlYWRSdW5uYWJsZS5zeW5jRXhlYyhuZXcgVm9pZFJlc3VsdCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQltYW5pZmVzdC5zZXRBY3RpdmVQYWdlKEJ1bmRsZURlcGVuZGVuY2llc1BhZ2UuUEFHRV9JRCk7Ci0JCQl9Ci0JCX0pOwotCQlib3QuZmxhdEJ1dHRvbkluU2VjdGlvbigiQWRkLi4uIiwgU0VDVElPTl9MQUJFTCkuY2xpY2soKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7CisgICAgICAgIFVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7CiAKLQkJU1dUQm90U2hlbGwgYWRkRGlhbG9nID0gYm90LnNoZWxsKCJQYWNrYWdlIFNlbGVjdGlvbiIpOwotCQlhc3NlcnRUcnVlKGFkZERpYWxvZy5pc09wZW4oKSk7Ci0JCWFkZERpYWxvZy5jbG9zZSgpOwotCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtYW5pZmVzdC5zZXRBY3RpdmVQYWdlKEJ1bmRsZURlcGVuZGVuY2llc1BhZ2UuUEFHRV9JRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmJvdC5mbGF0QnV0dG9uSW5TZWN0aW9uKCJBZGQuLi4iLCBTRUNUSU9OX0xBQkVMKS5jbGljaygpOwogCi0JcHVibGljIHZvaWQgdGVzdERvd25sb2FkQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOwotCQkJfQotCQl9KTsKKyAgICAgICAgU1dUQm90U2hlbGwgYWRkRGlhbG9nID0gdGhpcy5ib3Quc2hlbGwoIlBhY2thZ2UgU2VsZWN0aW9uIik7CisgICAgICAgIGFzc2VydFRydWUoYWRkRGlhbG9nLmlzT3BlbigpKTsKKyAgICAgICAgYWRkRGlhbG9nLmNsb3NlKCk7CisgICAgfQogCi0JCVNXVEJvdFRhYmxlIHRhYmxlID0gYm90LnRhYmxlSW5TZWN0aW9uKFNFQ1RJT05fTEFCRUwpOwotCQlpbnQgY291bnQgPSB0YWJsZS5yb3dDb3VudCgpOwotCQlib3QuZmxhdEJ1dHRvbkluU2VjdGlvbigiRG93bmxvYWQuLi4iLCBTRUNUSU9OX0xBQkVMKS5jbGljaygpOworICAgIHB1YmxpYyB2b2lkIHRlc3REb3dubG9hZEJ1dHRvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCdW5kbGVNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5CdW5kbGVNYW5pZmVzdEZpbGUoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOworICAgICAgICBVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgewogCi0JCVNXVEJvdFNoZWxsIGRvd25sb2FkRGlhbG9nID0gYm90LnNoZWxsKCJQYWNrYWdlIFNlbGVjdGlvbiIpOwotCQlhc3NlcnRUcnVlKGRvd25sb2FkRGlhbG9nLmlzT3BlbigpKTsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtYW5pZmVzdC5zZXRBY3RpdmVQYWdlKEJ1bmRsZURlcGVuZGVuY2llc1BhZ2UuUEFHRV9JRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCWJvdC50YWJsZSgpLnNlbGVjdCgwKTsKLQkJYm90LmJ1dHRvbigiT0siKS5jbGljaygpOwotCQlhc3NlcnRFcXVhbHMoY291bnQgKyAxLCB0YWJsZS5yb3dDb3VudCgpKTsKLQl9CisgICAgICAgIFNXVEJvdFRhYmxlIHRhYmxlID0gdGhpcy5ib3QudGFibGVJblNlY3Rpb24oU0VDVElPTl9MQUJFTCk7CisgICAgICAgIGludCBjb3VudCA9IHRhYmxlLnJvd0NvdW50KCk7CisgICAgICAgIHRoaXMuYm90LmZsYXRCdXR0b25JblNlY3Rpb24oIkRvd25sb2FkLi4uIiwgU0VDVElPTl9MQUJFTCkuY2xpY2soKTsKIAotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmluYWwgQnVuZGxlTWFuaWZlc3RFZGl0b3IgbWFuaWZlc3QgPSBvcGVuQnVuZGxlTWFuaWZlc3RGaWxlKCJzcmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKLQkJVUlUaHJlYWRSdW5uYWJsZS5zeW5jRXhlYyhuZXcgVm9pZFJlc3VsdCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQltYW5pZmVzdC5zZXRBY3RpdmVQYWdlKEJ1bmRsZURlcGVuZGVuY2llc1BhZ2UuUEFHRV9JRCk7Ci0JCQl9Ci0JCX0pOworICAgICAgICBTV1RCb3RTaGVsbCBkb3dubG9hZERpYWxvZyA9IHRoaXMuYm90LnNoZWxsKCJQYWNrYWdlIFNlbGVjdGlvbiIpOworICAgICAgICBhc3NlcnRUcnVlKGRvd25sb2FkRGlhbG9nLmlzT3BlbigpKTsKIAotCQlTV1RCb3RCdXR0b24gYnV0dG9uID0gYm90LmZsYXRCdXR0b25JblNlY3Rpb24oIlJlbW92ZSIsIFNFQ1RJT05fTEFCRUwpOwotCQlhc3NlcnRGYWxzZShidXR0b24uaXNFbmFibGVkKCkpOworICAgICAgICB0aGlzLmJvdC50YWJsZSgpLnNlbGVjdCgwKTsKKyAgICAgICAgdGhpcy5ib3QuYnV0dG9uKCJPSyIpLmNsaWNrKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhjb3VudCArIDEsIHRhYmxlLnJvd0NvdW50KCkpOworICAgIH0KIAotCQlTV1RCb3RUYWJsZSB0YWJsZSA9IGJvdC50YWJsZUluU2VjdGlvbihTRUNUSU9OX0xBQkVMKTsKLQkJaW50IGNvdW50ID0gdGFibGUucm93Q291bnQoKTsKLQkJYXNzZXJ0VHJ1ZShjb3VudCA+IDApOworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQnVuZGxlTWFuaWZlc3RFZGl0b3IgbWFuaWZlc3QgPSBvcGVuQnVuZGxlTWFuaWZlc3RGaWxlKCJzcmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKKyAgICAgICAgVUlUaHJlYWRSdW5uYWJsZS5zeW5jRXhlYyhuZXcgVm9pZFJlc3VsdCgpIHsKIAotCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCWFzc2VydFRydWUoYnV0dG9uLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtYW5pZmVzdC5zZXRBY3RpdmVQYWdlKEJ1bmRsZURlcGVuZGVuY2llc1BhZ2UuUEFHRV9JRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCWJ1dHRvbi5jbGljaygpOwotCQlhc3NlcnRFcXVhbHMoY291bnQgLSAxLCB0YWJsZS5yb3dDb3VudCgpKTsKLQl9CisgICAgICAgIFNXVEJvdEJ1dHRvbiBidXR0b24gPSB0aGlzLmJvdC5mbGF0QnV0dG9uSW5TZWN0aW9uKCJSZW1vdmUiLCBTRUNUSU9OX0xBQkVMKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYnV0dG9uLmlzRW5hYmxlZCgpKTsKIAotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0aWVzQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOwotCQkJfQotCQl9KTsKKyAgICAgICAgU1dUQm90VGFibGUgdGFibGUgPSB0aGlzLmJvdC50YWJsZUluU2VjdGlvbihTRUNUSU9OX0xBQkVMKTsKKyAgICAgICAgaW50IGNvdW50ID0gdGFibGUucm93Q291bnQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudCA+IDApOwogCi0JCVNXVEJvdEJ1dHRvbiBidXR0b24gPSBib3QuZmxhdEJ1dHRvbkluU2VjdGlvbigiUHJvcGVydGllcy4uLiIsIFNFQ1RJT05fTEFCRUwpOwotCQlhc3NlcnRGYWxzZShidXR0b24uaXNFbmFibGVkKCkpOworICAgICAgICB0YWJsZS5zZWxlY3QoMCk7CisgICAgICAgIGFzc2VydFRydWUoYnV0dG9uLmlzRW5hYmxlZCgpKTsKIAotCQlTV1RCb3RUYWJsZSB0YWJsZSA9IGJvdC50YWJsZUluU2VjdGlvbihTRUNUSU9OX0xBQkVMKTsKLQkJU3RyaW5nIHRleHQgPSB0YWJsZS5nZXRUYWJsZUl0ZW0oMCkuZ2V0VGV4dCgpOwotCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCWFzc2VydFRydWUoYnV0dG9uLmlzRW5hYmxlZCgpKTsKLQkJYnV0dG9uLmNsaWNrKCk7CisgICAgICAgIGJ1dHRvbi5jbGljaygpOworICAgICAgICBhc3NlcnRFcXVhbHMoY291bnQgLSAxLCB0YWJsZS5yb3dDb3VudCgpKTsKKyAgICB9CiAKLQkJU1dUQm90U2hlbGwgcHJvcGVydGllc0RpYWxvZyA9IGJvdC5zaGVsbCh0ZXh0KTsKLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0aWVzRGlhbG9nLmlzT3BlbigpKTsKLQkJcHJvcGVydGllc0RpYWxvZy5jbG9zZSgpOwotCX0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydGllc0J1dHRvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCdW5kbGVNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5CdW5kbGVNYW5pZmVzdEZpbGUoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOworICAgICAgICBVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBTV1RCb3RCdXR0b24gYnV0dG9uID0gdGhpcy5ib3QuZmxhdEJ1dHRvbkluU2VjdGlvbigiUHJvcGVydGllcy4uLiIsIFNFQ1RJT05fTEFCRUwpOworICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNFbmFibGVkKCkpOworCisgICAgICAgIFNXVEJvdFRhYmxlIHRhYmxlID0gdGhpcy5ib3QudGFibGVJblNlY3Rpb24oU0VDVElPTl9MQUJFTCk7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gdGFibGUuZ2V0VGFibGVJdGVtKDApLmdldFRleHQoKTsKKyAgICAgICAgdGFibGUuc2VsZWN0KDApOworICAgICAgICBhc3NlcnRUcnVlKGJ1dHRvbi5pc0VuYWJsZWQoKSk7CisgICAgICAgIGJ1dHRvbi5jbGljaygpOworCisgICAgICAgIFNXVEJvdFNoZWxsIHByb3BlcnRpZXNEaWFsb2cgPSB0aGlzLmJvdC5zaGVsbCh0ZXh0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wZXJ0aWVzRGlhbG9nLmlzT3BlbigpKTsKKyAgICAgICAgcHJvcGVydGllc0RpYWxvZy5jbG9zZSgpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVJbXBvcnRTZWN0aW9uVWlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUltcG9ydFNlY3Rpb25VaVRlc3QuamF2YQppbmRleCAwNjA3Mzg2Li4yZDE5NGZkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUltcG9ydFNlY3Rpb25VaVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUltcG9ydFNlY3Rpb25VaVRlc3QuamF2YQpAQCAtOCwxMyArOCw5IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci5maW5kZXJzLlVJVGhyZWFkUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIucmVzdWx0cy5Wb2lkUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLndpZGdldHMuU1dUQm90QnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLndpZGdldHMuU1dUQm90U2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2lkZ2V0cy5TV1RCb3RUYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMuQWJzdHJhY3RNYW5pZmVzdFVpVGVzdENhc2U7CiAKIC8qKgpAQCAtMjIsODQgKzE4LDg4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVJbXBvcnRTZWN0aW9uVWlUZXN0IGV4dGVuZHMgQWJzdHJhY3RNYW5pZmVzdFVpVGVzdENhc2UgewogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNFQ1RJT05fTEFCRUwgPSAiSW1wb3J0IEJ1bmRsZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNFQ1RJT05fTEFCRUwgPSAiSW1wb3J0IEJ1bmRsZSI7CiAKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOwotCQkJfQotCQl9KTsKLQkJYm90LmZsYXRCdXR0b25JblNlY3Rpb24oIkFkZC4uLiIsIFNFQ1RJT05fTEFCRUwpLmNsaWNrKCk7CisgICAgcHVibGljIHZvaWQgdGVzdEFkZEJ1dHRvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCdW5kbGVNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5CdW5kbGVNYW5pZmVzdEZpbGUoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOworICAgICAgICBVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgewogCi0JCVNXVEJvdFNoZWxsIGFkZERpYWxvZyA9IGJvdC5zaGVsbCgiQnVuZGxlIFNlbGVjdGlvbiIpOwotCQlhc3NlcnRUcnVlKGFkZERpYWxvZy5pc09wZW4oKSk7Ci0JCWFkZERpYWxvZy5jbG9zZSgpOwotCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtYW5pZmVzdC5zZXRBY3RpdmVQYWdlKEJ1bmRsZURlcGVuZGVuY2llc1BhZ2UuUEFHRV9JRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmJvdC5mbGF0QnV0dG9uSW5TZWN0aW9uKCJBZGQuLi4iLCBTRUNUSU9OX0xBQkVMKS5jbGljaygpOwogCi0JcHVibGljIHZvaWQgdGVzdERvd25sb2FkQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOwotCQkJfQotCQl9KTsKKyAgICAgICAgU1dUQm90U2hlbGwgYWRkRGlhbG9nID0gdGhpcy5ib3Quc2hlbGwoIkJ1bmRsZSBTZWxlY3Rpb24iKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhZGREaWFsb2cuaXNPcGVuKCkpOworICAgICAgICBhZGREaWFsb2cuY2xvc2UoKTsKKyAgICB9CiAKLQkJU1dUQm90VGFibGUgdGFibGUgPSBib3QudGFibGVJblNlY3Rpb24oU0VDVElPTl9MQUJFTCk7Ci0JCWludCBjb3VudCA9IHRhYmxlLnJvd0NvdW50KCk7Ci0JCWJvdC5mbGF0QnV0dG9uSW5TZWN0aW9uKCJEb3dubG9hZC4uLiIsIFNFQ1RJT05fTEFCRUwpLmNsaWNrKCk7CisgICAgcHVibGljIHZvaWQgdGVzdERvd25sb2FkQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7CisgICAgICAgIFVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7CiAKLQkJU1dUQm90U2hlbGwgZG93bmxvYWREaWFsb2cgPSBib3Quc2hlbGwoIkJ1bmRsZSBTZWxlY3Rpb24iKTsKLQkJYXNzZXJ0VHJ1ZShkb3dubG9hZERpYWxvZy5pc09wZW4oKSk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKIAotCQlib3QudGFibGUoKS5zZWxlY3QoMCk7Ci0JCWJvdC5idXR0b24oIk9LIikuY2xpY2soKTsKLQkJYXNzZXJ0RXF1YWxzKGNvdW50ICsgMSwgdGFibGUucm93Q291bnQoKSk7Ci0JfQorICAgICAgICBTV1RCb3RUYWJsZSB0YWJsZSA9IHRoaXMuYm90LnRhYmxlSW5TZWN0aW9uKFNFQ1RJT05fTEFCRUwpOworICAgICAgICBpbnQgY291bnQgPSB0YWJsZS5yb3dDb3VudCgpOworICAgICAgICB0aGlzLmJvdC5mbGF0QnV0dG9uSW5TZWN0aW9uKCJEb3dubG9hZC4uLiIsIFNFQ1RJT05fTEFCRUwpLmNsaWNrKCk7CiAKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOwotCQkJfQotCQl9KTsKKyAgICAgICAgU1dUQm90U2hlbGwgZG93bmxvYWREaWFsb2cgPSB0aGlzLmJvdC5zaGVsbCgiQnVuZGxlIFNlbGVjdGlvbiIpOworICAgICAgICBhc3NlcnRUcnVlKGRvd25sb2FkRGlhbG9nLmlzT3BlbigpKTsKIAotCQlTV1RCb3RCdXR0b24gYnV0dG9uID0gYm90LmZsYXRCdXR0b25JblNlY3Rpb24oIlJlbW92ZSIsIFNFQ1RJT05fTEFCRUwpOwotCQlhc3NlcnRGYWxzZShidXR0b24uaXNFbmFibGVkKCkpOworICAgICAgICB0aGlzLmJvdC50YWJsZSgpLnNlbGVjdCgwKTsKKyAgICAgICAgdGhpcy5ib3QuYnV0dG9uKCJPSyIpLmNsaWNrKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhjb3VudCArIDEsIHRhYmxlLnJvd0NvdW50KCkpOworICAgIH0KIAotCQlTV1RCb3RUYWJsZSB0YWJsZSA9IGJvdC50YWJsZUluU2VjdGlvbihTRUNUSU9OX0xBQkVMKTsKLQkJaW50IGNvdW50ID0gdGFibGUucm93Q291bnQoKTsKLQkJYXNzZXJ0VHJ1ZShjb3VudCA+IDApOworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQnVuZGxlTWFuaWZlc3RFZGl0b3IgbWFuaWZlc3QgPSBvcGVuQnVuZGxlTWFuaWZlc3RGaWxlKCJzcmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKKyAgICAgICAgVUlUaHJlYWRSdW5uYWJsZS5zeW5jRXhlYyhuZXcgVm9pZFJlc3VsdCgpIHsKIAotCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCWFzc2VydFRydWUoYnV0dG9uLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtYW5pZmVzdC5zZXRBY3RpdmVQYWdlKEJ1bmRsZURlcGVuZGVuY2llc1BhZ2UuUEFHRV9JRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCWJ1dHRvbi5jbGljaygpOwotCQlhc3NlcnRFcXVhbHMoY291bnQgLSAxLCB0YWJsZS5yb3dDb3VudCgpKTsKLQl9CisgICAgICAgIFNXVEJvdEJ1dHRvbiBidXR0b24gPSB0aGlzLmJvdC5mbGF0QnV0dG9uSW5TZWN0aW9uKCJSZW1vdmUiLCBTRUNUSU9OX0xBQkVMKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYnV0dG9uLmlzRW5hYmxlZCgpKTsKIAotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0aWVzQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOwotCQkJfQotCQl9KTsKKyAgICAgICAgU1dUQm90VGFibGUgdGFibGUgPSB0aGlzLmJvdC50YWJsZUluU2VjdGlvbihTRUNUSU9OX0xBQkVMKTsKKyAgICAgICAgaW50IGNvdW50ID0gdGFibGUucm93Q291bnQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudCA+IDApOwogCi0JCVNXVEJvdEJ1dHRvbiBidXR0b24gPSBib3QuZmxhdEJ1dHRvbkluU2VjdGlvbigiUHJvcGVydGllcy4uLiIsIFNFQ1RJT05fTEFCRUwpOwotCQlhc3NlcnRGYWxzZShidXR0b24uaXNFbmFibGVkKCkpOworICAgICAgICB0YWJsZS5zZWxlY3QoMCk7CisgICAgICAgIGFzc2VydFRydWUoYnV0dG9uLmlzRW5hYmxlZCgpKTsKIAotCQlTV1RCb3RUYWJsZSB0YWJsZSA9IGJvdC50YWJsZUluU2VjdGlvbihTRUNUSU9OX0xBQkVMKTsKLQkJU3RyaW5nIHRleHQgPSB0YWJsZS5nZXRUYWJsZUl0ZW0oMCkuZ2V0VGV4dCgpOwotCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCWFzc2VydFRydWUoYnV0dG9uLmlzRW5hYmxlZCgpKTsKLQkJYnV0dG9uLmNsaWNrKCk7CisgICAgICAgIGJ1dHRvbi5jbGljaygpOworICAgICAgICBhc3NlcnRFcXVhbHMoY291bnQgLSAxLCB0YWJsZS5yb3dDb3VudCgpKTsKKyAgICB9CiAKLQkJU1dUQm90U2hlbGwgcHJvcGVydGllc0RpYWxvZyA9IGJvdC5zaGVsbCh0ZXh0KTsKLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0aWVzRGlhbG9nLmlzT3BlbigpKTsKLQkJcHJvcGVydGllc0RpYWxvZy5jbG9zZSgpOwotCX0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydGllc0J1dHRvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCdW5kbGVNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5CdW5kbGVNYW5pZmVzdEZpbGUoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOworICAgICAgICBVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBTV1RCb3RCdXR0b24gYnV0dG9uID0gdGhpcy5ib3QuZmxhdEJ1dHRvbkluU2VjdGlvbigiUHJvcGVydGllcy4uLiIsIFNFQ1RJT05fTEFCRUwpOworICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNFbmFibGVkKCkpOworCisgICAgICAgIFNXVEJvdFRhYmxlIHRhYmxlID0gdGhpcy5ib3QudGFibGVJblNlY3Rpb24oU0VDVElPTl9MQUJFTCk7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gdGFibGUuZ2V0VGFibGVJdGVtKDApLmdldFRleHQoKTsKKyAgICAgICAgdGFibGUuc2VsZWN0KDApOworICAgICAgICBhc3NlcnRUcnVlKGJ1dHRvbi5pc0VuYWJsZWQoKSk7CisgICAgICAgIGJ1dHRvbi5jbGljaygpOworCisgICAgICAgIFNXVEJvdFNoZWxsIHByb3BlcnRpZXNEaWFsb2cgPSB0aGlzLmJvdC5zaGVsbCh0ZXh0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm9wZXJ0aWVzRGlhbG9nLmlzT3BlbigpKTsKKyAgICAgICAgcHJvcGVydGllc0RpYWxvZy5jbG9zZSgpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVMaWJyYXJ5U2VjdGlvblVpVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVMaWJyYXJ5U2VjdGlvblVpVGVzdC5qYXZhCmluZGV4IDI0YjMwMWQuLmJlNmFlYWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlTGlicmFyeVNlY3Rpb25VaVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUxpYnJhcnlTZWN0aW9uVWlUZXN0LmphdmEKQEAgLTgsMTMgKzgsOSBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzOwogCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIuZmluZGVycy5VSVRocmVhZFJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLnJlc3VsdHMuVm9pZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci53aWRnZXRzLlNXVEJvdEJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci53aWRnZXRzLlNXVEJvdFNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLndpZGdldHMuU1dUQm90VGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzLkFic3RyYWN0TWFuaWZlc3RVaVRlc3RDYXNlOwogCiAvKioKQEAgLTIyLDU2ICsxOCw1OSBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlTGlicmFyeVNlY3Rpb25VaVRlc3QgZXh0ZW5kcyBBYnN0cmFjdE1hbmlmZXN0VWlUZXN0Q2FzZSB7CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU0VDVElPTl9MQUJFTCA9ICJDbGFzc3BhdGgiOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBTRUNUSU9OX0xBQkVMID0gIkNsYXNzcGF0aCI7CiAKLQlwdWJsaWMgdm9pZCB0ZXN0TmV3QnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVSdW50aW1lUGFnZS5QQUdFX0lEKTsKLQkJCX0KLQkJfSk7Ci0JCWJvdC5mbGF0QnV0dG9uSW5TZWN0aW9uKCJOZXcuLi4iLCBTRUNUSU9OX0xBQkVMKS5jbGljaygpOworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQnVuZGxlTWFuaWZlc3RFZGl0b3IgbWFuaWZlc3QgPSBvcGVuQnVuZGxlTWFuaWZlc3RGaWxlKCJzcmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKKyAgICAgICAgVUlUaHJlYWRSdW5uYWJsZS5zeW5jRXhlYyhuZXcgVm9pZFJlc3VsdCgpIHsKIAotCQlTV1RCb3RTaGVsbCBuZXdEaWFsb2cgPSBib3Quc2hlbGwoIk5ldyBMaWJyYXJ5Iik7Ci0JCWFzc2VydFRydWUobmV3RGlhbG9nLmlzT3BlbigpKTsKLQkJbmV3RGlhbG9nLmNsb3NlKCk7Ci0JfQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIG1hbmlmZXN0LnNldEFjdGl2ZVBhZ2UoQnVuZGxlUnVudGltZVBhZ2UuUEFHRV9JRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmJvdC5mbGF0QnV0dG9uSW5TZWN0aW9uKCJOZXcuLi4iLCBTRUNUSU9OX0xBQkVMKS5jbGljaygpOwogCi0JcHVibGljIHZvaWQgdGVzdEFkZEJ1dHRvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBCdW5kbGVNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5CdW5kbGVNYW5pZmVzdEZpbGUoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotCQlVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW1hbmlmZXN0LnNldEFjdGl2ZVBhZ2UoQnVuZGxlUnVudGltZVBhZ2UuUEFHRV9JRCk7Ci0JCQl9Ci0JCX0pOwotCQlib3QuZmxhdEJ1dHRvbkluU2VjdGlvbigiQWRkLi4uIiwgU0VDVElPTl9MQUJFTCkuY2xpY2soKTsKKyAgICAgICAgU1dUQm90U2hlbGwgbmV3RGlhbG9nID0gdGhpcy5ib3Quc2hlbGwoIk5ldyBMaWJyYXJ5Iik7CisgICAgICAgIGFzc2VydFRydWUobmV3RGlhbG9nLmlzT3BlbigpKTsKKyAgICAgICAgbmV3RGlhbG9nLmNsb3NlKCk7CisgICAgfQogCi0JCVNXVEJvdFNoZWxsIGFkZERpYWxvZyA9IGJvdC5zaGVsbCgiSkFSIFNlbGVjdGlvbiIpOwotCQlhc3NlcnRUcnVlKGFkZERpYWxvZy5pc09wZW4oKSk7Ci0JCWFkZERpYWxvZy5jbG9zZSgpOwotCX0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7CisgICAgICAgIFVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7CiAKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVSdW50aW1lUGFnZS5QQUdFX0lEKTsKLQkJCX0KLQkJfSk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVSdW50aW1lUGFnZS5QQUdFX0lEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHRoaXMuYm90LmZsYXRCdXR0b25JblNlY3Rpb24oIkFkZC4uLiIsIFNFQ1RJT05fTEFCRUwpLmNsaWNrKCk7CiAKLQkJU1dUQm90QnV0dG9uIGJ1dHRvbiA9IGJvdC5mbGF0QnV0dG9uSW5TZWN0aW9uKCJSZW1vdmUiLCBTRUNUSU9OX0xBQkVMKTsKLQkJYXNzZXJ0RmFsc2UoYnV0dG9uLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgU1dUQm90U2hlbGwgYWRkRGlhbG9nID0gdGhpcy5ib3Quc2hlbGwoIkpBUiBTZWxlY3Rpb24iKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhZGREaWFsb2cuaXNPcGVuKCkpOworICAgICAgICBhZGREaWFsb2cuY2xvc2UoKTsKKyAgICB9CiAKLQkJU1dUQm90VGFibGUgdGFibGUgPSBib3QudGFibGVJblNlY3Rpb24oU0VDVElPTl9MQUJFTCk7Ci0JCWludCBjb3VudCA9IHRhYmxlLnJvd0NvdW50KCk7Ci0JCWFzc2VydFRydWUoY291bnQgPiAwKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7CisgICAgICAgIFVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7CiAKLQkJdGFibGUuc2VsZWN0KDApOwotCQlhc3NlcnRUcnVlKGJ1dHRvbi5pc0VuYWJsZWQoKSk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVSdW50aW1lUGFnZS5QQUdFX0lEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQkJYnV0dG9uLmNsaWNrKCk7Ci0JCWFzc2VydEVxdWFscyhjb3VudCAtIDEsIHRhYmxlLnJvd0NvdW50KCkpOwotCX0KKyAgICAgICAgU1dUQm90QnV0dG9uIGJ1dHRvbiA9IHRoaXMuYm90LmZsYXRCdXR0b25JblNlY3Rpb24oIlJlbW92ZSIsIFNFQ1RJT05fTEFCRUwpOworICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNFbmFibGVkKCkpOworCisgICAgICAgIFNXVEJvdFRhYmxlIHRhYmxlID0gdGhpcy5ib3QudGFibGVJblNlY3Rpb24oU0VDVElPTl9MQUJFTCk7CisgICAgICAgIGludCBjb3VudCA9IHRhYmxlLnJvd0NvdW50KCk7CisgICAgICAgIGFzc2VydFRydWUoY291bnQgPiAwKTsKKworICAgICAgICB0YWJsZS5zZWxlY3QoMCk7CisgICAgICAgIGFzc2VydFRydWUoYnV0dG9uLmlzRW5hYmxlZCgpKTsKKworICAgICAgICBidXR0b24uY2xpY2soKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50IC0gMSwgdGFibGUucm93Q291bnQoKSk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZU92ZXJ2aWV3UGFnZVVpVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVPdmVydmlld1BhZ2VVaVRlc3QuamF2YQppbmRleCA4YzFlNTg4Li45MGRhODdjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZU92ZXJ2aWV3UGFnZVVpVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlT3ZlcnZpZXdQYWdlVWlUZXN0LmphdmEKQEAgLTgsMTEgKzgsOSBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzOwogCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIuZmluZGVycy5VSVRocmVhZFJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLnJlc3VsdHMuVm9pZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci53aWRnZXRzLlNXVEJvdFNoZWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy5BYnN0cmFjdE1hbmlmZXN0VWlUZXN0Q2FzZTsKIAogLyoqCkBAIC0yMCw1NiArMTgsNjAgQEAKICAqLwogcHVibGljIGNsYXNzIEJ1bmRsZU92ZXJ2aWV3UGFnZVVpVGVzdCBleHRlbmRzIEFic3RyYWN0TWFuaWZlc3RVaVRlc3RDYXNlIHsKIAotCS8qCi0JICogVGhlc2UgdGVzdHMgd2lsbCBmYWlsIGJlY2F1c2UgdGhlIGxpbmtzIHdlIGFyZSBzZWFyY2hpbmcgZm9yIGFyZSBHQyBkcmF3bgotCSAqIGFuZCB0aGVyZWZvcmUgbm90IHdpZGdldHMvY29udHJvbHMuIFRoaXMgdGVzdCBjYXNlIGhhcyBiZWVuIGNvbW1lbnRlZCBvdXQKLQkgKiBmcm9tIHRoZSBBbGxTd3Rib3REcml2ZW5UZXN0cyBzdWl0ZS4KLQkgKi8KKyAgICAvKgorICAgICAqIFRoZXNlIHRlc3RzIHdpbGwgZmFpbCBiZWNhdXNlIHRoZSBsaW5rcyB3ZSBhcmUgc2VhcmNoaW5nIGZvciBhcmUgR0MgZHJhd24gYW5kIHRoZXJlZm9yZSBub3Qgd2lkZ2V0cy9jb250cm9scy4KKyAgICAgKiBUaGlzIHRlc3QgY2FzZSBoYXMgYmVlbiBjb21tZW50ZWQgb3V0IGZyb20gdGhlIEFsbFN3dGJvdERyaXZlblRlc3RzIHN1aXRlLgorICAgICAqLwogCi0JcHVibGljIHZvaWQgdGVzdEV4cG9ydEJ1bmRsZUh5cGVybGluaygpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBCdW5kbGVNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5CdW5kbGVNYW5pZmVzdEZpbGUoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotCQlVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW1hbmlmZXN0LnNldEFjdGl2ZVBhZ2UoQnVuZGxlT3ZlcnZpZXdQYWdlLlBBR0VfSUQpOwotCQkJfQotCQl9KTsKLQkJYm90Lmh5cGVybGluaygiRXhwb3J0IEJ1bmRsZSIpLmNsaWNrKCk7CisgICAgcHVibGljIHZvaWQgdGVzdEV4cG9ydEJ1bmRsZUh5cGVybGluaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCdW5kbGVNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5CdW5kbGVNYW5pZmVzdEZpbGUoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOworICAgICAgICBVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgewogCi0JCVNXVEJvdFNoZWxsIGV4cG9ydERpYWxvZyA9IGJvdC5zaGVsbCgiQnVuZGxlIEV4cG9ydCBXaXphcmQiKTsKLQkJYXNzZXJ0VHJ1ZShleHBvcnREaWFsb2cuaXNPcGVuKCkpOwotCQlleHBvcnREaWFsb2cuY2xvc2UoKTsKLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVPdmVydmlld1BhZ2UuUEFHRV9JRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmJvdC5oeXBlcmxpbmsoIkV4cG9ydCBCdW5kbGUiKS5jbGljaygpOwogCi0JcHVibGljIHZvaWQgdGVzdERlcGVuZGVuY2llc0h5cGVybGluaygpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBCdW5kbGVNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5CdW5kbGVNYW5pZmVzdEZpbGUoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotCQlVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW1hbmlmZXN0LnNldEFjdGl2ZVBhZ2UoQnVuZGxlT3ZlcnZpZXdQYWdlLlBBR0VfSUQpOwotCQkJfQotCQl9KTsKLQkJYm90Lmh5cGVybGluaygiRGVwZW5kZW5jaWVzIikuY2xpY2soKTsKKyAgICAgICAgU1dUQm90U2hlbGwgZXhwb3J0RGlhbG9nID0gdGhpcy5ib3Quc2hlbGwoIkJ1bmRsZSBFeHBvcnQgV2l6YXJkIik7CisgICAgICAgIGFzc2VydFRydWUoZXhwb3J0RGlhbG9nLmlzT3BlbigpKTsKKyAgICAgICAgZXhwb3J0RGlhbG9nLmNsb3NlKCk7CisgICAgfQogCi0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKG1hbmlmZXN0LmZpbmRQYWdlKEJ1bmRsZURlcGVuZGVuY2llc1BhZ2UuUEFHRV9JRCksIG1hbmlmZXN0LmdldEFjdGl2ZUVkaXRvcigpKTsKLQkJCX0KLQkJfSk7Ci0JfQorICAgIHB1YmxpYyB2b2lkIHRlc3REZXBlbmRlbmNpZXNIeXBlcmxpbmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQnVuZGxlTWFuaWZlc3RFZGl0b3IgbWFuaWZlc3QgPSBvcGVuQnVuZGxlTWFuaWZlc3RGaWxlKCJzcmMvTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKKyAgICAgICAgVUlUaHJlYWRSdW5uYWJsZS5zeW5jRXhlYyhuZXcgVm9pZFJlc3VsdCgpIHsKIAotCXB1YmxpYyB2b2lkIHRlc3RSdW50aW1lSHlwZXJsaW5rKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZSgic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVPdmVydmlld1BhZ2UuUEFHRV9JRCk7Ci0JCQl9Ci0JCX0pOwotCQlib3QuaHlwZXJsaW5rKCJSdW50aW1lIikuY2xpY2soKTsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBtYW5pZmVzdC5zZXRBY3RpdmVQYWdlKEJ1bmRsZU92ZXJ2aWV3UGFnZS5QQUdFX0lEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHRoaXMuYm90Lmh5cGVybGluaygiRGVwZW5kZW5jaWVzIikuY2xpY2soKTsKIAotCQlVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFzc2VydEVxdWFscyhtYW5pZmVzdC5maW5kUGFnZShCdW5kbGVSdW50aW1lUGFnZS5QQUdFX0lEKSwgbWFuaWZlc3QuZ2V0QWN0aXZlRWRpdG9yKCkpOwotCQkJfQotCQl9KTsKLQl9CisgICAgICAgIFVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobWFuaWZlc3QuZmluZFBhZ2UoQnVuZGxlRGVwZW5kZW5jaWVzUGFnZS5QQUdFX0lEKSwgbWFuaWZlc3QuZ2V0QWN0aXZlRWRpdG9yKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUh5cGVybGluaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCdW5kbGVNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5CdW5kbGVNYW5pZmVzdEZpbGUoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOworICAgICAgICBVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShCdW5kbGVPdmVydmlld1BhZ2UuUEFHRV9JRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmJvdC5oeXBlcmxpbmsoIlJ1bnRpbWUiKS5jbGljaygpOworCisgICAgICAgIFVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobWFuaWZlc3QuZmluZFBhZ2UoQnVuZGxlUnVudGltZVBhZ2UuUEFHRV9JRCksIG1hbmlmZXN0LmdldEFjdGl2ZUVkaXRvcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL1BhckRlcGVuZGVuY2llc1NlY3Rpb25VaVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGFyRGVwZW5kZW5jaWVzU2VjdGlvblVpVGVzdC5qYXZhCmluZGV4IGYxZWVmOTYuLmU1MmFjM2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGFyRGVwZW5kZW5jaWVzU2VjdGlvblVpVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGFyRGVwZW5kZW5jaWVzU2VjdGlvblVpVGVzdC5qYXZhCkBAIC04LDEzICs4LDkgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yczsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLmZpbmRlcnMuVUlUaHJlYWRSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci5yZXN1bHRzLlZvaWRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2lkZ2V0cy5TV1RCb3RCdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2lkZ2V0cy5TV1RCb3RTaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci53aWRnZXRzLlNXVEJvdFRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy5BYnN0cmFjdE1hbmlmZXN0VWlUZXN0Q2FzZTsKIAogLyoqCkBAIC0yMiw0MiArMTgsNDQgQEAKICAqLwogcHVibGljIGNsYXNzIFBhckRlcGVuZGVuY2llc1NlY3Rpb25VaVRlc3QgZXh0ZW5kcyBBYnN0cmFjdE1hbmlmZXN0VWlUZXN0Q2FzZSB7CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU0VDVElPTl9MQUJFTCA9ICJOZXN0ZWQgQnVuZGxlcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNFQ1RJT05fTEFCRUwgPSAiTmVzdGVkIEJ1bmRsZXMiOwogCi0JcHVibGljIHZvaWQgdGVzdEFkZEJ1dHRvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBQYXJNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5QYXJNYW5pZmVzdEZpbGUoIk1FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShQYXJYbWxFZGl0b3JQYWdlLklEX0VESVRPUik7Ci0JCQl9Ci0JCX0pOwotCQlib3QuZmxhdEJ1dHRvbkluU2VjdGlvbigiQWRkLi4uIiwgU0VDVElPTl9MQUJFTCkuY2xpY2soKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQnV0dG9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFBhck1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gb3BlblBhck1hbmlmZXN0RmlsZSgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKKyAgICAgICAgVUlUaHJlYWRSdW5uYWJsZS5zeW5jRXhlYyhuZXcgVm9pZFJlc3VsdCgpIHsKIAotCQlTV1RCb3RTaGVsbCBhZGREaWFsb2cgPSBib3Quc2hlbGwoIkJ1bmRsZSBTZWxlY3Rpb24iKTsKLQkJYXNzZXJ0VHJ1ZShhZGREaWFsb2cuaXNPcGVuKCkpOwotCQlhZGREaWFsb2cuY2xvc2UoKTsKLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShQYXJYbWxFZGl0b3JQYWdlLklEX0VESVRPUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmJvdC5mbGF0QnV0dG9uSW5TZWN0aW9uKCJBZGQuLi4iLCBTRUNUSU9OX0xBQkVMKS5jbGljaygpOwogCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUJ1dHRvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBQYXJNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IG9wZW5QYXJNYW5pZmVzdEZpbGUoIk1FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCVVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFZvaWRSZXN1bHQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShQYXJYbWxFZGl0b3JQYWdlLklEX0VESVRPUik7Ci0JCQl9Ci0JCX0pOworICAgICAgICBTV1RCb3RTaGVsbCBhZGREaWFsb2cgPSB0aGlzLmJvdC5zaGVsbCgiQnVuZGxlIFNlbGVjdGlvbiIpOworICAgICAgICBhc3NlcnRUcnVlKGFkZERpYWxvZy5pc09wZW4oKSk7CisgICAgICAgIGFkZERpYWxvZy5jbG9zZSgpOworICAgIH0KIAotCQlTV1RCb3RCdXR0b24gYnV0dG9uID0gYm90LmZsYXRCdXR0b25JblNlY3Rpb24oIlJlbW92ZSIsIFNFQ1RJT05fTEFCRUwpOwotCQlhc3NlcnRGYWxzZShidXR0b24uaXNFbmFibGVkKCkpOworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCdXR0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGFyTWFuaWZlc3RFZGl0b3IgbWFuaWZlc3QgPSBvcGVuUGFyTWFuaWZlc3RGaWxlKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOworICAgICAgICBVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBWb2lkUmVzdWx0KCkgewogCi0JCVNXVEJvdFRhYmxlIHRhYmxlID0gYm90LnRhYmxlSW5TZWN0aW9uKFNFQ1RJT05fTEFCRUwpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGFibGUucm93Q291bnQoKSk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgbWFuaWZlc3Quc2V0QWN0aXZlUGFnZShQYXJYbWxFZGl0b3JQYWdlLklEX0VESVRPUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JCXRhYmxlLnNlbGVjdCgwKTsKLQkJYXNzZXJ0VHJ1ZShidXR0b24uaXNFbmFibGVkKCkpOworICAgICAgICBTV1RCb3RCdXR0b24gYnV0dG9uID0gdGhpcy5ib3QuZmxhdEJ1dHRvbkluU2VjdGlvbigiUmVtb3ZlIiwgU0VDVElPTl9MQUJFTCk7CisgICAgICAgIGFzc2VydEZhbHNlKGJ1dHRvbi5pc0VuYWJsZWQoKSk7CiAKLQkJYnV0dG9uLmNsaWNrKCk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5yb3dDb3VudCgpKTsKLQkJYXNzZXJ0RmFsc2UoYnV0dG9uLmlzRW5hYmxlZCgpKTsKLQl9CisgICAgICAgIFNXVEJvdFRhYmxlIHRhYmxlID0gdGhpcy5ib3QudGFibGVJblNlY3Rpb24oU0VDVElPTl9MQUJFTCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB0YWJsZS5yb3dDb3VudCgpKTsKKworICAgICAgICB0YWJsZS5zZWxlY3QoMCk7CisgICAgICAgIGFzc2VydFRydWUoYnV0dG9uLmlzRW5hYmxlZCgpKTsKKworICAgICAgICBidXR0b24uY2xpY2soKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLnJvd0NvdW50KCkpOworICAgICAgICBhc3NlcnRGYWxzZShidXR0b24uaXNFbmFibGVkKCkpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvdGVzdHMvQWJzdHJhY3RNYW5pZmVzdFVpVGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3Rlc3RzL0Fic3RyYWN0TWFuaWZlc3RVaVRlc3RDYXNlLmphdmEKaW5kZXggNjFjYmE5MS4uMWI1M2U2MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvdGVzdHMvQWJzdHJhY3RNYW5pZmVzdFVpVGVzdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS90ZXN0cy9BYnN0cmFjdE1hbmlmZXN0VWlUZXN0Q2FzZS5qYXZhCkBAIC04LDIxICs4LDE4IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UucGRlLmludGVybmFsLnVpLmVkaXRvci5wbHVnaW4uTWFuaWZlc3RFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LmVjbGlwc2UuZmluZGVyLndpZGdldHMuU1dUQm90RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLlNXVEJvdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLmV4Y2VwdGlvbnMuV2lkZ2V0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIuZmluZGVycy5VSVRocmVhZFJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLnJlc3VsdHMuUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLnV0aWxzLlNXVFV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7CkBAIC00MCw3NSArMzcsNzYgQEAKICAqLwogcHVibGljIGNsYXNzIEFic3RyYWN0TWFuaWZlc3RVaVRlc3RDYXNlIGV4dGVuZHMgU1dUQm90VGVzdENhc2UgewogCi0JcHVibGljIFZpcmdvSWRlVGVzdEJvdCBib3Q7CisgICAgcHVibGljIFZpcmdvSWRlVGVzdEJvdCBib3Q7CiAKLQlwcm90ZWN0ZWQgSVByb2plY3QgY3JlYXRlUHJlZGVmaW5lZFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gVmlyZ29JZGVUZXN0VXRpbC5jcmVhdGVQcmVkZWZpbmVkUHJvamVjdChwcm9qZWN0TmFtZSwgZ2V0QnVuZGxlTmFtZSgpKTsKLQl9CisgICAgcHJvdGVjdGVkIElQcm9qZWN0IGNyZWF0ZVByZWRlZmluZWRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFZpcmdvSWRlVGVzdFV0aWwuY3JlYXRlUHJlZGVmaW5lZFByb2plY3QocHJvamVjdE5hbWUsIGdldEJ1bmRsZU5hbWUoKSk7CisgICAgfQogCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCdW5kbGVOYW1lKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cyI7Ci0JfQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJvcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMiOworICAgIH0KIAotCXByb3RlY3RlZCBCdW5kbGVNYW5pZmVzdEVkaXRvciBvcGVuQnVuZGxlTWFuaWZlc3RGaWxlKFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gY3JlYXRlUHJlZGVmaW5lZFByb2plY3QoIlNpbXBsZUJ1bmRsZVByb2plY3QiKTsKLQkJQnVuZGxlTWFuaWZlc3RFZGl0b3IgbWFuaWZlc3QgPSAoQnVuZGxlTWFuaWZlc3RFZGl0b3IpIG9wZW5NYW5pZmVzdEVkaXRvcihwcm9qZWN0LCBwYXRoKTsKLQkJcmV0dXJuIG1hbmlmZXN0OwotCX0KKyAgICBwcm90ZWN0ZWQgQnVuZGxlTWFuaWZlc3RFZGl0b3Igb3BlbkJ1bmRsZU1hbmlmZXN0RmlsZShTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGNyZWF0ZVByZWRlZmluZWRQcm9qZWN0KCJTaW1wbGVCdW5kbGVQcm9qZWN0Iik7CisgICAgICAgIEJ1bmRsZU1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gKEJ1bmRsZU1hbmlmZXN0RWRpdG9yKSBvcGVuTWFuaWZlc3RFZGl0b3IocHJvamVjdCwgcGF0aCk7CisgICAgICAgIHJldHVybiBtYW5pZmVzdDsKKyAgICB9CiAKLQlwcml2YXRlIE1hbmlmZXN0RWRpdG9yIG9wZW5NYW5pZmVzdEVkaXRvcihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcGF0aCkgewotCQlmaW5hbCBJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKHBhdGgpOwotCQlhc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOworICAgIHByaXZhdGUgTWFuaWZlc3RFZGl0b3Igb3Blbk1hbmlmZXN0RWRpdG9yKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIGZpbmFsIElGaWxlIGZpbGUgPSBwcm9qZWN0LmdldEZpbGUocGF0aCk7CisgICAgICAgIGFzc2VydFRydWUoZmlsZS5leGlzdHMoKSk7CiAKLQkJcmV0dXJuIFVJVGhyZWFkUnVubmFibGUuc3luY0V4ZWMobmV3IFJlc3VsdDxNYW5pZmVzdEVkaXRvcj4oKSB7Ci0JCQlwdWJsaWMgTWFuaWZlc3RFZGl0b3IgcnVuKCkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlhc3NlcnROb3ROdWxsKCJFeHBlY3RlZCBhY3RpdmUgd29ya2JlbmNoIHdpbmRvdyIsIHdpbmRvdyk7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiRXhwZWN0ZWQgYWN0aXZlIHdvcmtiZW5jaCBwYWdlIiwgcGFnZSk7CisgICAgICAgIHJldHVybiBVSVRocmVhZFJ1bm5hYmxlLnN5bmNFeGVjKG5ldyBSZXN1bHQ8TWFuaWZlc3RFZGl0b3I+KCkgewogCi0JCQkJdHJ5IHsKLQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSk7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNYW5pZmVzdEVkaXRvcikgewotCQkJCQkJcmV0dXJuICgoTWFuaWZlc3RFZGl0b3IpIGVkaXRvcik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWZhaWwoIkNvdWxkIG5vdCBvcGVuIGEgbWFuaWZlc3QgZWRpdG9yLiIpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JfQorICAgICAgICAgICAgcHVibGljIE1hbmlmZXN0RWRpdG9yIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRXhwZWN0ZWQgYWN0aXZlIHdvcmtiZW5jaCB3aW5kb3ciLCB3aW5kb3cpOworICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkV4cGVjdGVkIGFjdGl2ZSB3b3JrYmVuY2ggcGFnZSIsIHBhZ2UpOwogCi0JcHJvdGVjdGVkIFBhck1hbmlmZXN0RWRpdG9yIG9wZW5QYXJNYW5pZmVzdEZpbGUoU3RyaW5nIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBjcmVhdGVQcmVkZWZpbmVkUHJvamVjdCgiU2ltcGxlUGFyUHJvamVjdCIpOwotCQlQYXJNYW5pZmVzdEVkaXRvciBtYW5pZmVzdCA9IChQYXJNYW5pZmVzdEVkaXRvcikgb3Blbk1hbmlmZXN0RWRpdG9yKHByb2plY3QsIHBhdGgpOwotCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvciA9IElERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWFuaWZlc3RFZGl0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoTWFuaWZlc3RFZGl0b3IpIGVkaXRvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgiQ291bGQgbm90IG9wZW4gYSBtYW5pZmVzdCBlZGl0b3IuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib3QgPSBuZXcgVmlyZ29JZGVUZXN0Qm90KCk7Ci0JCXRyeSB7Ci0JCQlib3Qudmlld0J5VGl0bGUoIldlbGNvbWUiKS5jbG9zZSgpOwotCQl9IGNhdGNoIChXaWRnZXROb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlhc3NlcnRGYWxzZSgiU1dUQm90IHRlc3RzIGNhbiBub3QgcnVuIGluIHRoZSBVSSB0aHJlYWQuIiwgU1dUVXRpbHMuaXNVSVRocmVhZCgpKTsKKyAgICBwcm90ZWN0ZWQgUGFyTWFuaWZlc3RFZGl0b3Igb3BlblBhck1hbmlmZXN0RmlsZShTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGNyZWF0ZVByZWRlZmluZWRQcm9qZWN0KCJTaW1wbGVQYXJQcm9qZWN0Iik7CisgICAgICAgIFBhck1hbmlmZXN0RWRpdG9yIG1hbmlmZXN0ID0gKFBhck1hbmlmZXN0RWRpdG9yKSBvcGVuTWFuaWZlc3RFZGl0b3IocHJvamVjdCwgcGF0aCk7CisgICAgICAgIHJldHVybiBtYW5pZmVzdDsKKyAgICB9CiAKLQkJLy8gdHJpZ2dlciBhcnRlZmFjdCByZXBvIGluaXRpYWxpemF0aW9uCi0JCVNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmdldEFydGVmYWN0UmVwb3NpdG9yeSgpOwotCQl3aGlsZSAoIVNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmlzQXJ0ZWZhY3RSZXBvc2l0b3J5SW5pdGlhbGl6ZWQoKSkgewotCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5ib3QgPSBuZXcgVmlyZ29JZGVUZXN0Qm90KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLmJvdC52aWV3QnlUaXRsZSgiV2VsY29tZSIpLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKFdpZGdldE5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICB9CisgICAgICAgIGFzc2VydEZhbHNlKCJTV1RCb3QgdGVzdHMgY2FuIG5vdCBydW4gaW4gdGhlIFVJIHRocmVhZC4iLCBTV1RVdGlscy5pc1VJVGhyZWFkKCkpOwogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdDw/IGV4dGVuZHMgU1dUQm90RWRpdG9yPiBlZGl0b3JzID0gYm90LmVkaXRvcnMoKTsKLQkJZm9yIChTV1RCb3RFZGl0b3IgZWRpdG9yIDogZWRpdG9ycykgewotCQkJZWRpdG9yLmNsb3NlKCk7Ci0JCX0KLQkJVmlyZ29JZGVUZXN0VXRpbC5kZWxldGVBbGxQcm9qZWN0cygpOwotCX0KKyAgICAgICAgLy8gdHJpZ2dlciBhcnRlZmFjdCByZXBvIGluaXRpYWxpemF0aW9uCisgICAgICAgIFNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmdldEFydGVmYWN0UmVwb3NpdG9yeSgpOworICAgICAgICB3aGlsZSAoIVNlcnZlckNvcmVQbHVnaW4uZ2V0QXJ0ZWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmlzQXJ0ZWZhY3RSZXBvc2l0b3J5SW5pdGlhbGl6ZWQoKSkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0PD8gZXh0ZW5kcyBTV1RCb3RFZGl0b3I+IGVkaXRvcnMgPSB0aGlzLmJvdC5lZGl0b3JzKCk7CisgICAgICAgIGZvciAoU1dUQm90RWRpdG9yIGVkaXRvciA6IGVkaXRvcnMpIHsKKyAgICAgICAgICAgIGVkaXRvci5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIFZpcmdvSWRlVGVzdFV0aWwuZGVsZXRlQWxsUHJvamVjdHMoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS90ZXN0cy9BbGxWaXJnb0lkZVVpVGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3Rlc3RzL0FsbFZpcmdvSWRlVWlUZXN0cy5qYXZhCmluZGV4IDg3ZGIwNDUuLjZmM2NhNjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3Rlc3RzL0FsbFZpcmdvSWRlVWlUZXN0cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3Rlc3RzL0FsbFZpcmdvSWRlVWlUZXN0cy5qYXZhCkBAIC04LDEwICs4LDggQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKK3BhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnMuQnVuZGxlSW1wb3J0TGlicmFyeVNlY3Rpb25VaVRlc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnMuQnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb25VaVRlc3Q7CkBAIC0yMSwyMiArMTksMjUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkud2l6YXJkcy5OZXdCdW5kbGVQcm9qZWN0V2l6YXJkVWlUZXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS53aXphcmRzLk5ld1BhclByb2plY3RXaXphcmRVaVRlc3Q7CiAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCiAvKioKICAqIEBhdXRob3IgTGVvIERvcyBTYW50b3MKICAqLwogcHVibGljIGNsYXNzIEFsbFZpcmdvSWRlVWlUZXN0cyB7CiAKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsVmlyZ29JZGVVaVRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCdW5kbGVMaWJyYXJ5U2VjdGlvblVpVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCdW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvblVpVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCdW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvblVpVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCdW5kbGVJbXBvcnRTZWN0aW9uVWlUZXN0LmNsYXNzKTsKLQkJLy8gc3VpdGUuYWRkVGVzdFN1aXRlKEJ1bmRsZU92ZXJ2aWV3UGFnZVVpVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQYXJEZXBlbmRlbmNpZXNTZWN0aW9uVWlUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5ld0J1bmRsZVByb2plY3RXaXphcmRVaVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTmV3UGFyUHJvamVjdFdpemFyZFVpVGVzdC5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9CisgICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgeworICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFZpcmdvSWRlVWlUZXN0cy5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQnVuZGxlTGlicmFyeVNlY3Rpb25VaVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQnVuZGxlSW1wb3J0TGlicmFyeVNlY3Rpb25VaVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb25VaVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQnVuZGxlSW1wb3J0U2VjdGlvblVpVGVzdC5jbGFzcyk7CisgICAgICAgIC8vIHN1aXRlLmFkZFRlc3RTdWl0ZShCdW5kbGVPdmVydmlld1BhZ2VVaVRlc3QuY2xhc3MpOworICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoUGFyRGVwZW5kZW5jaWVzU2VjdGlvblVpVGVzdC5jbGFzcyk7CisgICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShOZXdCdW5kbGVQcm9qZWN0V2l6YXJkVWlUZXN0LmNsYXNzKTsKKyAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKE5ld1BhclByb2plY3RXaXphcmRVaVRlc3QuY2xhc3MpOworICAgICAgICByZXR1cm4gc3VpdGU7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS90ZXN0cy9TZXJ2ZXJJZGVVaVRlc3RQbHVnaW4uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3Rlc3RzL1NlcnZlcklkZVVpVGVzdFBsdWdpbi5qYXZhCmluZGV4IDZjNTI3NDQuLjc1Y2Y1NjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3Rlc3RzL1NlcnZlcklkZVVpVGVzdFBsdWdpbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3Rlc3RzL1NlcnZlcklkZVVpVGVzdFBsdWdpbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0czsKIAogLyoqCkBAIC0xNSw2ICsxNiw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJJZGVVaVRlc3RQbHVnaW4gewogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cyI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cyI7CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3Rlc3RzL3V0aWwvSW5TZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS90ZXN0cy91dGlsL0luU2VjdGlvbi5qYXZhCmluZGV4IDE5MDM1YjEuLmFiOTA5NjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3Rlc3RzL3V0aWwvSW5TZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvdGVzdHMvdXRpbC9JblNlY3Rpb24uamF2YQpAQCAtNCwxOSArNCwxNCBAQAogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAorICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy51dGlsOwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLm1hdGNoZXJzLldpZGdldE1hdGNoZXJGYWN0b3J5LndpdGhNbmVtb25pYzsKLQogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci5maW5kZXJzLlBhdGhHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIubWF0Y2hlcnMuQWJzdHJhY3RNYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLnV0aWxzLlNXVFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLnV0aWxzLlRyZWVQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKIGltcG9ydCBvcmcuaGFtY3Jlc3QuRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmhhbWNyZXN0LkZhY3Rvcnk7CkBAIC0yNyw0MiArMjIsNDIgQEAKICAqLwogcHVibGljIGNsYXNzIEluU2VjdGlvbjxUIGV4dGVuZHMgV2lkZ2V0PiBleHRlbmRzIEFic3RyYWN0TWF0Y2hlcjxUPiB7CiAKLQlARmFjdG9yeQotCXB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBXaWRnZXQ+IE1hdGNoZXI8VD4gaW5TZWN0aW9uKE1hdGNoZXI8Pz4gbWF0Y2hlcikgewotCQlyZXR1cm4gbmV3IEluU2VjdGlvbjxUPihtYXRjaGVyKTsKLQl9CisgICAgQEZhY3RvcnkKKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgV2lkZ2V0PiBNYXRjaGVyPFQ+IGluU2VjdGlvbihNYXRjaGVyPD8+IG1hdGNoZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJblNlY3Rpb248VD4obWF0Y2hlcik7CisgICAgfQogCi0JQEZhY3RvcnkKLQlwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgV2lkZ2V0PiBNYXRjaGVyPFQ+IGluU2VjdGlvbihTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCXJldHVybiBuZXcgSW5TZWN0aW9uPFQ+KGxhYmVsVGV4dCk7Ci0JfQorICAgIEBGYWN0b3J5CisgICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIFdpZGdldD4gTWF0Y2hlcjxUPiBpblNlY3Rpb24oU3RyaW5nIGxhYmVsVGV4dCkgeworICAgICAgICByZXR1cm4gbmV3IEluU2VjdGlvbjxUPihsYWJlbFRleHQpOworICAgIH0KIAotCXByaXZhdGUgZmluYWwgTWF0Y2hlcjw/PiBtYXRjaGVyOworICAgIHByaXZhdGUgZmluYWwgTWF0Y2hlcjw/PiBtYXRjaGVyOwogCi0JSW5TZWN0aW9uKE1hdGNoZXI8Pz4gbWF0Y2hlcikgewotCQl0aGlzLm1hdGNoZXIgPSBtYXRjaGVyOwotCX0KKyAgICBJblNlY3Rpb24oTWF0Y2hlcjw/PiBtYXRjaGVyKSB7CisgICAgICAgIHRoaXMubWF0Y2hlciA9IG1hdGNoZXI7CisgICAgfQogCi0JSW5TZWN0aW9uKFN0cmluZyBsYWJlbFRleHQpIHsKLQkJbWF0Y2hlciA9IHdpdGhNbmVtb25pYyhsYWJlbFRleHQpOwotCX0KKyAgICBJblNlY3Rpb24oU3RyaW5nIGxhYmVsVGV4dCkgeworICAgICAgICB0aGlzLm1hdGNoZXIgPSB3aXRoTW5lbW9uaWMobGFiZWxUZXh0KTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBkZXNjcmliZVRvKERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCWRlc2NyaXB0aW9uLmFwcGVuZFRleHQoImluIHNlY3Rpb24gKCIpLmFwcGVuZERlc2NyaXB0aW9uT2YobWF0Y2hlcikuYXBwZW5kVGV4dCgiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9CisgICAgcHVibGljIHZvaWQgZGVzY3JpYmVUbyhEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgeworICAgICAgICBkZXNjcmlwdGlvbi5hcHBlbmRUZXh0KCJpbiBzZWN0aW9uICgiKS5hcHBlbmREZXNjcmlwdGlvbk9mKHRoaXMubWF0Y2hlcikuYXBwZW5kVGV4dCgiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkb01hdGNoKE9iamVjdCBpdGVtKSB7Ci0JCVdpZGdldCBwcmV2aW91c1dpZGdldCA9IFNXVFV0aWxzLnByZXZpb3VzV2lkZ2V0KChXaWRnZXQpIGl0ZW0pOwotCQlUcmVlUGF0aCBwYXRoID0gbmV3IFBhdGhHZW5lcmF0b3IoKS5nZXRQYXRoKChXaWRnZXQpIGl0ZW0pOwotCQlpbnQgc2VnbWVudENvdW50ID0gcGF0aC5nZXRTZWdtZW50Q291bnQoKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzZWdtZW50Q291bnQ7IGkrKykgewotCQkJcHJldmlvdXNXaWRnZXQgPSAoV2lkZ2V0KSBwYXRoLmdldFNlZ21lbnQoc2VnbWVudENvdW50IC0gaSAtIDEpOwotCQkJaWYgKChwcmV2aW91c1dpZGdldCBpbnN0YW5jZW9mIFNlY3Rpb24pICYmIG1hdGNoZXIubWF0Y2hlcyhwcmV2aW91c1dpZGdldCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGRvTWF0Y2goT2JqZWN0IGl0ZW0pIHsKKyAgICAgICAgV2lkZ2V0IHByZXZpb3VzV2lkZ2V0ID0gU1dUVXRpbHMucHJldmlvdXNXaWRnZXQoKFdpZGdldCkgaXRlbSk7CisgICAgICAgIFRyZWVQYXRoIHBhdGggPSBuZXcgUGF0aEdlbmVyYXRvcigpLmdldFBhdGgoKFdpZGdldCkgaXRlbSk7CisgICAgICAgIGludCBzZWdtZW50Q291bnQgPSBwYXRoLmdldFNlZ21lbnRDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNlZ21lbnRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBwcmV2aW91c1dpZGdldCA9IChXaWRnZXQpIHBhdGguZ2V0U2VnbWVudChzZWdtZW50Q291bnQgLSBpIC0gMSk7CisgICAgICAgICAgICBpZiAocHJldmlvdXNXaWRnZXQgaW5zdGFuY2VvZiBTZWN0aW9uICYmIHRoaXMubWF0Y2hlci5tYXRjaGVzKHByZXZpb3VzV2lkZ2V0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3Rlc3RzL3V0aWwvU1dUQm90SHlwZXJsaW5rLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS90ZXN0cy91dGlsL1NXVEJvdEh5cGVybGluay5qYXZhCmluZGV4IDRiZTUzZWUuLmJhMjFjMWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3Rlc3RzL3V0aWwvU1dUQm90SHlwZXJsaW5rLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvdGVzdHMvdXRpbC9TV1RCb3RIeXBlcmxpbmsuamF2YQpAQCAtNCwxNyArNCwxMyBAQAogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAorICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy51dGlsOwogCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIuUmVmZXJlbmNlQnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIuU1dUQm90V2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLmV4Y2VwdGlvbnMuV2lkZ2V0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2lkZ2V0cy5BYnN0cmFjdFNXVEJvdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci53aWRnZXRzLkFic3RyYWN0U1dUQm90Q29udHJvbDsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKIGltcG9ydCBvcmcuaGFtY3Jlc3QuU2VsZkRlc2NyaWJpbmc7CiAKQEAgLTI0LDE3ICsyMCwxNyBAQAogQFNXVEJvdFdpZGdldChjbGFzeiA9IEh5cGVybGluay5jbGFzcywgcHJlZmVycmVkTmFtZSA9ICJoeXBlcmxpbmsiLCByZWZlcmVuY2VCeSA9IHsgUmVmZXJlbmNlQnkuTU5FTU9OSUMgfSkKIHB1YmxpYyBjbGFzcyBTV1RCb3RIeXBlcmxpbmsgZXh0ZW5kcyBBYnN0cmFjdFNXVEJvdENvbnRyb2w8SHlwZXJsaW5rPiB7CiAKLQlwdWJsaWMgU1dUQm90SHlwZXJsaW5rKEh5cGVybGluayB3KSB0aHJvd3MgV2lkZ2V0Tm90Rm91bmRFeGNlcHRpb24gewotCQlzdXBlcih3KTsKLQl9CisgICAgcHVibGljIFNXVEJvdEh5cGVybGluayhIeXBlcmxpbmsgdykgdGhyb3dzIFdpZGdldE5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIodyk7CisgICAgfQogCi0JcHVibGljIFNXVEJvdEh5cGVybGluayhIeXBlcmxpbmsgdywgU2VsZkRlc2NyaWJpbmcgZGVzY3JpcHRpb24pIHRocm93cyBXaWRnZXROb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHcsIGRlc2NyaXB0aW9uKTsKLQl9CisgICAgcHVibGljIFNXVEJvdEh5cGVybGluayhIeXBlcmxpbmsgdywgU2VsZkRlc2NyaWJpbmcgZGVzY3JpcHRpb24pIHRocm93cyBXaWRnZXROb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKHcsIGRlc2NyaXB0aW9uKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RTV1RCb3Q8SHlwZXJsaW5rPiBjbGljaygpIHsKLQkJcmV0dXJuIGNsaWNrKHRydWUpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWJzdHJhY3RTV1RCb3Q8SHlwZXJsaW5rPiBjbGljaygpIHsKKyAgICAgICAgcmV0dXJuIGNsaWNrKHRydWUpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvdGVzdHMvdXRpbC9WaXJnb0lkZVRlc3RCb3QuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3Rlc3RzL3V0aWwvVmlyZ29JZGVUZXN0Qm90LmphdmEKaW5kZXggMjQ0MzAwNC4uYjQ3YWZhYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvdGVzdHMvdXRpbC9WaXJnb0lkZVRlc3RCb3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS90ZXN0cy91dGlsL1ZpcmdvSWRlVGVzdEJvdC5qYXZhCkBAIC00LDI3ICs0LDE4IEBACiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCisgKgogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy51dGlsOwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLm1hdGNoZXJzLldpZGdldE1hdGNoZXJGYWN0b3J5LmFsbE9mOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci5tYXRjaGVycy5XaWRnZXRNYXRjaGVyRmFjdG9yeS53aWRnZXRPZlR5cGU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLm1hdGNoZXJzLldpZGdldE1hdGNoZXJGYWN0b3J5LndpdGhNbmVtb25pYzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIubWF0Y2hlcnMuV2lkZ2V0TWF0Y2hlckZhY3Rvcnkud2l0aFN0eWxlOworcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMudXRpbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5lY2xpcHNlLmZpbmRlci5TV1RXb3JrYmVuY2hCb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2lkZ2V0cy5TV1RCb3RCdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2lkZ2V0cy5TV1RCb3RSYWRpbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci53aWRnZXRzLlNXVEJvdFRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLndpZGdldHMuU1dUQm90VHJlZTsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKIGltcG9ydCBvcmcuaGFtY3Jlc3QuTWF0Y2hlcjsKIApAQCAtMzMsNzAgKzI0LDY4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBWaXJnb0lkZVRlc3RCb3QgZXh0ZW5kcyBTV1RXb3JrYmVuY2hCb3QgewogCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFNXVEJvdEJ1dHRvbiBidXR0b25JblNlY3Rpb24oU3RyaW5nIG1uZW1vbmljVGV4dCwgU3RyaW5nIGluU2VjdGlvbikgewotCQlNYXRjaGVyPFdpZGdldD4gbWF0Y2hlciA9IGFsbE9mKHdpZGdldE9mVHlwZShCdXR0b24uY2xhc3MpLCB3aXRoTW5lbW9uaWMobW5lbW9uaWNUZXh0KSwKLQkJCQlJblNlY3Rpb24uaW5TZWN0aW9uKGluU2VjdGlvbikpOwotCQlyZXR1cm4gbmV3IFNXVEJvdEJ1dHRvbigoQnV0dG9uKSB3aWRnZXQobWF0Y2hlciwgMCksIG1hdGNoZXIpOwotCX0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgU1dUQm90QnV0dG9uIGJ1dHRvbkluU2VjdGlvbihTdHJpbmcgbW5lbW9uaWNUZXh0LCBTdHJpbmcgaW5TZWN0aW9uKSB7CisgICAgICAgIE1hdGNoZXI8V2lkZ2V0PiBtYXRjaGVyID0gYWxsT2Yod2lkZ2V0T2ZUeXBlKEJ1dHRvbi5jbGFzcyksIHdpdGhNbmVtb25pYyhtbmVtb25pY1RleHQpLCBJblNlY3Rpb24uaW5TZWN0aW9uKGluU2VjdGlvbikpOworICAgICAgICByZXR1cm4gbmV3IFNXVEJvdEJ1dHRvbigoQnV0dG9uKSB3aWRnZXQobWF0Y2hlciwgMCksIG1hdGNoZXIpOworICAgIH0KIAotCXB1YmxpYyBTV1RCb3RCdXR0b24gZmxhdEJ1dHRvbihTdHJpbmcgbW5lbW9uaWNUZXh0KSB7Ci0JCXJldHVybiBmbGF0QnV0dG9uKG1uZW1vbmljVGV4dCwgMCk7Ci0JfQorICAgIHB1YmxpYyBTV1RCb3RCdXR0b24gZmxhdEJ1dHRvbihTdHJpbmcgbW5lbW9uaWNUZXh0KSB7CisgICAgICAgIHJldHVybiBmbGF0QnV0dG9uKG1uZW1vbmljVGV4dCwgMCk7CisgICAgfQogCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFNXVEJvdEJ1dHRvbiBmbGF0QnV0dG9uKFN0cmluZyBtbmVtb25pY1RleHQsIGludCBpbmRleCkgewotCQlNYXRjaGVyPFdpZGdldD4gbWF0Y2hlciA9IGFsbE9mKHdpZGdldE9mVHlwZShCdXR0b24uY2xhc3MpLCB3aXRoTW5lbW9uaWMobW5lbW9uaWNUZXh0KSwKLQkJCQl3aXRoU3R5bGUoU1dULkZMQVQsICJTV1QuRkxBVCIpKTsKLQkJcmV0dXJuIG5ldyBTV1RCb3RCdXR0b24oKEJ1dHRvbikgd2lkZ2V0KG1hdGNoZXIsIGluZGV4KSwgbWF0Y2hlcik7Ci0JfQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBTV1RCb3RCdXR0b24gZmxhdEJ1dHRvbihTdHJpbmcgbW5lbW9uaWNUZXh0LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgTWF0Y2hlcjxXaWRnZXQ+IG1hdGNoZXIgPSBhbGxPZih3aWRnZXRPZlR5cGUoQnV0dG9uLmNsYXNzKSwgd2l0aE1uZW1vbmljKG1uZW1vbmljVGV4dCksIHdpdGhTdHlsZShTV1QuRkxBVCwgIlNXVC5GTEFUIikpOworICAgICAgICByZXR1cm4gbmV3IFNXVEJvdEJ1dHRvbigoQnV0dG9uKSB3aWRnZXQobWF0Y2hlciwgaW5kZXgpLCBtYXRjaGVyKTsKKyAgICB9CiAKLQlwdWJsaWMgU1dUQm90QnV0dG9uIGZsYXRCdXR0b25JblNlY3Rpb24oU3RyaW5nIG1uZW1vbmljVGV4dCwgU3RyaW5nIGluU2VjdGlvbikgewotCQlyZXR1cm4gZmxhdEJ1dHRvbkluU2VjdGlvbihtbmVtb25pY1RleHQsIGluU2VjdGlvbiwgMCk7Ci0JfQorICAgIHB1YmxpYyBTV1RCb3RCdXR0b24gZmxhdEJ1dHRvbkluU2VjdGlvbihTdHJpbmcgbW5lbW9uaWNUZXh0LCBTdHJpbmcgaW5TZWN0aW9uKSB7CisgICAgICAgIHJldHVybiBmbGF0QnV0dG9uSW5TZWN0aW9uKG1uZW1vbmljVGV4dCwgaW5TZWN0aW9uLCAwKTsKKyAgICB9CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgU1dUQm90QnV0dG9uIGZsYXRCdXR0b25JblNlY3Rpb24oU3RyaW5nIG1uZW1vbmljVGV4dCwgU3RyaW5nIGluU2VjdGlvbiwgaW50IGluZGV4KSB7Ci0JCU1hdGNoZXI8V2lkZ2V0PiBtYXRjaGVyID0gYWxsT2Yod2lkZ2V0T2ZUeXBlKEJ1dHRvbi5jbGFzcyksIHdpdGhNbmVtb25pYyhtbmVtb25pY1RleHQpLAotCQkJCUluU2VjdGlvbi5pblNlY3Rpb24oaW5TZWN0aW9uKSwgd2l0aFN0eWxlKFNXVC5GTEFULCAiU1dULkZMQVQiKSk7Ci0JCXJldHVybiBuZXcgU1dUQm90QnV0dG9uKChCdXR0b24pIHdpZGdldChtYXRjaGVyLCBpbmRleCksIG1hdGNoZXIpOwotCX0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgU1dUQm90QnV0dG9uIGZsYXRCdXR0b25JblNlY3Rpb24oU3RyaW5nIG1uZW1vbmljVGV4dCwgU3RyaW5nIGluU2VjdGlvbiwgaW50IGluZGV4KSB7CisgICAgICAgIE1hdGNoZXI8V2lkZ2V0PiBtYXRjaGVyID0gYWxsT2Yod2lkZ2V0T2ZUeXBlKEJ1dHRvbi5jbGFzcyksIHdpdGhNbmVtb25pYyhtbmVtb25pY1RleHQpLCBJblNlY3Rpb24uaW5TZWN0aW9uKGluU2VjdGlvbiksCisgICAgICAgICAgICB3aXRoU3R5bGUoU1dULkZMQVQsICJTV1QuRkxBVCIpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTV1RCb3RCdXR0b24oKEJ1dHRvbikgd2lkZ2V0KG1hdGNoZXIsIGluZGV4KSwgbWF0Y2hlcik7CisgICAgfQogCi0JcHVibGljIFNXVEJvdEh5cGVybGluayBoeXBlcmxpbmsoU3RyaW5nIG1uZW1vbmljVGV4dCkgewotCQlyZXR1cm4gaHlwZXJsaW5rKG1uZW1vbmljVGV4dCwgMCk7Ci0JfQorICAgIHB1YmxpYyBTV1RCb3RIeXBlcmxpbmsgaHlwZXJsaW5rKFN0cmluZyBtbmVtb25pY1RleHQpIHsKKyAgICAgICAgcmV0dXJuIGh5cGVybGluayhtbmVtb25pY1RleHQsIDApOworICAgIH0KIAotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBTV1RCb3RIeXBlcmxpbmsgaHlwZXJsaW5rKFN0cmluZyBtbmVtb25pY1RleHQsIGludCBpbmRleCkgewotCQlNYXRjaGVyPFdpZGdldD4gbWF0Y2hlciA9IGFsbE9mKHdpZGdldE9mVHlwZShIeXBlcmxpbmsuY2xhc3MpLCB3aXRoTW5lbW9uaWMobW5lbW9uaWNUZXh0KSk7Ci0JCXJldHVybiBuZXcgU1dUQm90SHlwZXJsaW5rKChIeXBlcmxpbmspIHdpZGdldChtYXRjaGVyLCBpbmRleCksIG1hdGNoZXIpOwotCX0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgU1dUQm90SHlwZXJsaW5rIGh5cGVybGluayhTdHJpbmcgbW5lbW9uaWNUZXh0LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgTWF0Y2hlcjxXaWRnZXQ+IG1hdGNoZXIgPSBhbGxPZih3aWRnZXRPZlR5cGUoSHlwZXJsaW5rLmNsYXNzKSwgd2l0aE1uZW1vbmljKG1uZW1vbmljVGV4dCkpOworICAgICAgICByZXR1cm4gbmV3IFNXVEJvdEh5cGVybGluaygoSHlwZXJsaW5rKSB3aWRnZXQobWF0Y2hlciwgaW5kZXgpLCBtYXRjaGVyKTsKKyAgICB9CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgU1dUQm90UmFkaW8gcmFkaW9JblNlY3Rpb24oU3RyaW5nIG1uZW1vbmljVGV4dCwgU3RyaW5nIGluU2VjdGlvbikgewotCQlNYXRjaGVyPFdpZGdldD4gbWF0Y2hlciA9IGFsbE9mKHdpZGdldE9mVHlwZShCdXR0b24uY2xhc3MpLCB3aXRoTW5lbW9uaWMobW5lbW9uaWNUZXh0KSwKLQkJCQlJblNlY3Rpb24uaW5TZWN0aW9uKGluU2VjdGlvbiksIHdpdGhTdHlsZShTV1QuUkFESU8sICJTV1QuUkFESU8iKSk7Ci0JCXJldHVybiBuZXcgU1dUQm90UmFkaW8oKEJ1dHRvbikgd2lkZ2V0KG1hdGNoZXIsIDApLCBtYXRjaGVyKTsKLQl9CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFNXVEJvdFJhZGlvIHJhZGlvSW5TZWN0aW9uKFN0cmluZyBtbmVtb25pY1RleHQsIFN0cmluZyBpblNlY3Rpb24pIHsKKyAgICAgICAgTWF0Y2hlcjxXaWRnZXQ+IG1hdGNoZXIgPSBhbGxPZih3aWRnZXRPZlR5cGUoQnV0dG9uLmNsYXNzKSwgd2l0aE1uZW1vbmljKG1uZW1vbmljVGV4dCksIEluU2VjdGlvbi5pblNlY3Rpb24oaW5TZWN0aW9uKSwKKyAgICAgICAgICAgIHdpdGhTdHlsZShTV1QuUkFESU8sICJTV1QuUkFESU8iKSk7CisgICAgICAgIHJldHVybiBuZXcgU1dUQm90UmFkaW8oKEJ1dHRvbikgd2lkZ2V0KG1hdGNoZXIsIDApLCBtYXRjaGVyKTsKKyAgICB9CiAKLQlwdWJsaWMgU1dUQm90VGFibGUgdGFibGVJblNlY3Rpb24oU3RyaW5nIGluU2VjdGlvbikgewotCQlyZXR1cm4gdGFibGVJblNlY3Rpb24oaW5TZWN0aW9uLCAwKTsKLQl9CisgICAgcHVibGljIFNXVEJvdFRhYmxlIHRhYmxlSW5TZWN0aW9uKFN0cmluZyBpblNlY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIHRhYmxlSW5TZWN0aW9uKGluU2VjdGlvbiwgMCk7CisgICAgfQogCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFNXVEJvdFRhYmxlIHRhYmxlSW5TZWN0aW9uKFN0cmluZyBpblNlY3Rpb24sIGludCBpbmRleCkgewotCQlNYXRjaGVyPFdpZGdldD4gbWF0Y2hlciA9IGFsbE9mKHdpZGdldE9mVHlwZShUYWJsZS5jbGFzcyksIEluU2VjdGlvbi5pblNlY3Rpb24oaW5TZWN0aW9uKSk7Ci0JCXJldHVybiBuZXcgU1dUQm90VGFibGUoKFRhYmxlKSB3aWRnZXQobWF0Y2hlciwgaW5kZXgpLCBtYXRjaGVyKTsKLQl9CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFNXVEJvdFRhYmxlIHRhYmxlSW5TZWN0aW9uKFN0cmluZyBpblNlY3Rpb24sIGludCBpbmRleCkgeworICAgICAgICBNYXRjaGVyPFdpZGdldD4gbWF0Y2hlciA9IGFsbE9mKHdpZGdldE9mVHlwZShUYWJsZS5jbGFzcyksIEluU2VjdGlvbi5pblNlY3Rpb24oaW5TZWN0aW9uKSk7CisgICAgICAgIHJldHVybiBuZXcgU1dUQm90VGFibGUoKFRhYmxlKSB3aWRnZXQobWF0Y2hlciwgaW5kZXgpLCBtYXRjaGVyKTsKKyAgICB9CiAKLQlwdWJsaWMgU1dUQm90VHJlZSB0cmVlSW5TZWN0aW9uKFN0cmluZyBpblNlY3Rpb24pIHsKLQkJcmV0dXJuIHRyZWVJblNlY3Rpb24oaW5TZWN0aW9uLCAwKTsKLQl9CisgICAgcHVibGljIFNXVEJvdFRyZWUgdHJlZUluU2VjdGlvbihTdHJpbmcgaW5TZWN0aW9uKSB7CisgICAgICAgIHJldHVybiB0cmVlSW5TZWN0aW9uKGluU2VjdGlvbiwgMCk7CisgICAgfQogCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFNXVEJvdFRyZWUgdHJlZUluU2VjdGlvbihTdHJpbmcgaW5TZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJTWF0Y2hlcjxXaWRnZXQ+IG1hdGNoZXIgPSBhbGxPZih3aWRnZXRPZlR5cGUoVHJlZS5jbGFzcyksIEluU2VjdGlvbi5pblNlY3Rpb24oaW5TZWN0aW9uKSk7Ci0JCXJldHVybiBuZXcgU1dUQm90VHJlZSgoVHJlZSkgd2lkZ2V0KG1hdGNoZXIsIGluZGV4KSwgbWF0Y2hlcik7Ci0JfQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBTV1RCb3RUcmVlIHRyZWVJblNlY3Rpb24oU3RyaW5nIGluU2VjdGlvbiwgaW50IGluZGV4KSB7CisgICAgICAgIE1hdGNoZXI8V2lkZ2V0PiBtYXRjaGVyID0gYWxsT2Yod2lkZ2V0T2ZUeXBlKFRyZWUuY2xhc3MpLCBJblNlY3Rpb24uaW5TZWN0aW9uKGluU2VjdGlvbikpOworICAgICAgICByZXR1cm4gbmV3IFNXVEJvdFRyZWUoKFRyZWUpIHdpZGdldChtYXRjaGVyLCBpbmRleCksIG1hdGNoZXIpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9OZXdCdW5kbGVQcm9qZWN0V2l6YXJkVWlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld0J1bmRsZVByb2plY3RXaXphcmRVaVRlc3QuamF2YQppbmRleCBjZTU5MGFhLi41OGJiMjBiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld0J1bmRsZVByb2plY3RXaXphcmRVaVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld0J1bmRsZVByb2plY3RXaXphcmRVaVRlc3QuamF2YQpAQCAtOCwxNCArOCwxMCBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS53aXphcmRzOwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLnN3dGJvdC5zd3QuZmluZGVyLndhaXRzLkNvbmRpdGlvbnMuc2hlbGxDbG9zZXM7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3QuZWNsaXBzZS5maW5kZXIud2lkZ2V0cy5TV1RCb3RFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2lkZ2V0cy5TV1RCb3RCdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2lkZ2V0cy5TV1RCb3RTaGVsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldDsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2luZ1NldE1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKQEAgLTI3LDY1ICsyMyw2NSBAQAogICovCiBwdWJsaWMgY2xhc3MgTmV3QnVuZGxlUHJvamVjdFdpemFyZFVpVGVzdCBleHRlbmRzIEFic3RyYWN0TWFuaWZlc3RVaVRlc3RDYXNlIHsKIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiQnVuZGxlUHJvamVjdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJCdW5kbGVQcm9qZWN0IjsKIAotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0Q3JlYXRpb24oKSB7Ci0JCWJvdC5tZW51KCJGaWxlIikubWVudSgiTmV3IikubWVudSgiUHJvamVjdC4uLiIpLmNsaWNrKCk7Ci0JCVNXVEJvdFNoZWxsIHdpemFyZCA9IGJvdC5zaGVsbCgiTmV3IFByb2plY3QiKTsKLQkJd2l6YXJkLmFjdGl2YXRlKCk7Ci0JCWJvdC50cmVlKCkuZXhwYW5kTm9kZSgiVmlyZ28iKS5zZWxlY3QoIkJ1bmRsZSBQcm9qZWN0Iik7CisgICAgcHVibGljIHZvaWQgdGVzdFByb2plY3RDcmVhdGlvbigpIHsKKyAgICAgICAgdGhpcy5ib3QubWVudSgiRmlsZSIpLm1lbnUoIk5ldyIpLm1lbnUoIlByb2plY3QuLi4iKS5jbGljaygpOworICAgICAgICBTV1RCb3RTaGVsbCB3aXphcmQgPSB0aGlzLmJvdC5zaGVsbCgiTmV3IFByb2plY3QiKTsKKyAgICAgICAgd2l6YXJkLmFjdGl2YXRlKCk7CisgICAgICAgIHRoaXMuYm90LnRyZWUoKS5leHBhbmROb2RlKCJWaXJnbyIpLnNlbGVjdCgiQnVuZGxlIFByb2plY3QiKTsKIAotCQlTV1RCb3RCdXR0b24gbmV4dCA9IGJvdC5idXR0b24oIk5leHQgPiIpOwotCQluZXh0LmNsaWNrKCk7Ci0JCWFzc2VydEZhbHNlKG5leHQuaXNFbmFibGVkKCkpOworICAgICAgICBTV1RCb3RCdXR0b24gbmV4dCA9IHRoaXMuYm90LmJ1dHRvbigiTmV4dCA+Iik7CisgICAgICAgIG5leHQuY2xpY2soKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobmV4dC5pc0VuYWJsZWQoKSk7CiAKLQkJYm90LnRleHRXaXRoTGFiZWwoIlByb2plY3QgbmFtZToiKS5zZXRUZXh0KFBST0pFQ1RfTkFNRSk7Ci0JCWFzc2VydFRydWUobmV4dC5pc0VuYWJsZWQoKSk7Ci0JCW5leHQuY2xpY2soKTsKKyAgICAgICAgdGhpcy5ib3QudGV4dFdpdGhMYWJlbCgiUHJvamVjdCBuYW1lOiIpLnNldFRleHQoUFJPSkVDVF9OQU1FKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuZXh0LmlzRW5hYmxlZCgpKTsKKyAgICAgICAgbmV4dC5jbGljaygpOwogCi0JCVNXVEJvdEJ1dHRvbiBmaW5pc2ggPSBib3QuYnV0dG9uKCJGaW5pc2giKTsKLQkJYXNzZXJ0VHJ1ZShmaW5pc2guaXNFbmFibGVkKCkpOwotCQlmaW5pc2guY2xpY2soKTsKLQkJYm90LndhaXRVbnRpbChzaGVsbENsb3Nlcyh3aXphcmQpLCAxNTAwMCk7CisgICAgICAgIFNXVEJvdEJ1dHRvbiBmaW5pc2ggPSB0aGlzLmJvdC5idXR0b24oIkZpbmlzaCIpOworICAgICAgICBhc3NlcnRUcnVlKGZpbmlzaC5pc0VuYWJsZWQoKSk7CisgICAgICAgIGZpbmlzaC5jbGljaygpOworICAgICAgICB0aGlzLmJvdC53YWl0VW50aWwoc2hlbGxDbG9zZXMod2l6YXJkKSwgMTUwMDApOwogCi0JCVNXVEJvdEVkaXRvciBlZGl0b3IgPSBib3QuZWRpdG9yQnlJZChCdW5kbGVNYW5pZmVzdEVkaXRvci5JRF9FRElUT1IpOwotCQkvLyBPY2Nhc2lvbmFsIGZhaWx1cmUuIENhdXNlZCBieSByYWNlIGNvbmRpdGlvbj8KLQkJYXNzZXJ0RXF1YWxzKFBST0pFQ1RfTkFNRSwgZWRpdG9yLmdldFRpdGxlKCkpOwotCX0KKyAgICAgICAgU1dUQm90RWRpdG9yIGVkaXRvciA9IHRoaXMuYm90LmVkaXRvckJ5SWQoQnVuZGxlTWFuaWZlc3RFZGl0b3IuSURfRURJVE9SKTsKKyAgICAgICAgLy8gT2NjYXNpb25hbCBmYWlsdXJlLiBDYXVzZWQgYnkgcmFjZSBjb25kaXRpb24/CisgICAgICAgIGFzc2VydEVxdWFscyhQUk9KRUNUX05BTUUsIGVkaXRvci5nZXRUaXRsZSgpKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdENyZWF0aW9uV2l0aFdvcmtpbmdTZXRzKCkgewotCQlmaW5hbCBJV29ya2luZ1NldE1hbmFnZXIgbWFuYWdlciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2luZ1NldE1hbmFnZXIoKTsKLQkJSVdvcmtpbmdTZXQgbmV3U2V0ID0gbWFuYWdlci5jcmVhdGVXb3JraW5nU2V0KCJUZXN0aW5nIiwgbmV3IElBZGFwdGFibGVbMF0pOwotCQluZXdTZXQuc2V0SWQoIm9yZy5lY2xpcHNlLmpkdC51aS5KYXZhV29ya2luZ1NldFBhZ2UiKTsKLQkJbWFuYWdlci5hZGRXb3JraW5nU2V0KG5ld1NldCk7Ci0JCWFzc2VydFRydWUobmV3U2V0LmdldEVsZW1lbnRzKCkubGVuZ3RoID09IDApOworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0Q3JlYXRpb25XaXRoV29ya2luZ1NldHMoKSB7CisgICAgICAgIGZpbmFsIElXb3JraW5nU2V0TWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpOworICAgICAgICBJV29ya2luZ1NldCBuZXdTZXQgPSBtYW5hZ2VyLmNyZWF0ZVdvcmtpbmdTZXQoIlRlc3RpbmciLCBuZXcgSUFkYXB0YWJsZVswXSk7CisgICAgICAgIG5ld1NldC5zZXRJZCgib3JnLmVjbGlwc2UuamR0LnVpLkphdmFXb3JraW5nU2V0UGFnZSIpOworICAgICAgICBtYW5hZ2VyLmFkZFdvcmtpbmdTZXQobmV3U2V0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuZXdTZXQuZ2V0RWxlbWVudHMoKS5sZW5ndGggPT0gMCk7CiAKLQkJYm90Lm1lbnUoIkZpbGUiKS5tZW51KCJOZXciKS5tZW51KCJQcm9qZWN0Li4uIikuY2xpY2soKTsKLQkJU1dUQm90U2hlbGwgd2l6YXJkID0gYm90LnNoZWxsKCJOZXcgUHJvamVjdCIpOwotCQl3aXphcmQuYWN0aXZhdGUoKTsKLQkJYm90LnRyZWUoKS5leHBhbmROb2RlKCJWaXJnbyIpLnNlbGVjdCgiQnVuZGxlIFByb2plY3QiKTsKKyAgICAgICAgdGhpcy5ib3QubWVudSgiRmlsZSIpLm1lbnUoIk5ldyIpLm1lbnUoIlByb2plY3QuLi4iKS5jbGljaygpOworICAgICAgICBTV1RCb3RTaGVsbCB3aXphcmQgPSB0aGlzLmJvdC5zaGVsbCgiTmV3IFByb2plY3QiKTsKKyAgICAgICAgd2l6YXJkLmFjdGl2YXRlKCk7CisgICAgICAgIHRoaXMuYm90LnRyZWUoKS5leHBhbmROb2RlKCJWaXJnbyIpLnNlbGVjdCgiQnVuZGxlIFByb2plY3QiKTsKIAotCQlTV1RCb3RCdXR0b24gbmV4dCA9IGJvdC5idXR0b24oIk5leHQgPiIpOwotCQluZXh0LmNsaWNrKCk7Ci0JCWFzc2VydEZhbHNlKG5leHQuaXNFbmFibGVkKCkpOworICAgICAgICBTV1RCb3RCdXR0b24gbmV4dCA9IHRoaXMuYm90LmJ1dHRvbigiTmV4dCA+Iik7CisgICAgICAgIG5leHQuY2xpY2soKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobmV4dC5pc0VuYWJsZWQoKSk7CiAKLQkJYm90LnRleHRXaXRoTGFiZWwoIlByb2plY3QgbmFtZToiKS5zZXRUZXh0KFBST0pFQ1RfTkFNRSk7Ci0JCWJvdC5jaGVja0JveEluR3JvdXAoIldvcmtpbmcgc2V0cyIpLnNlbGVjdCgpOwotCQlib3QuYnV0dG9uKCJTZWxlY3QuLi4iKS5jbGljaygpOwotCQlib3QudGFibGUoKS5nZXRUYWJsZUl0ZW0oIlRlc3RpbmciKS5jaGVjaygpOwotCQlib3QuYnV0dG9uKCJPSyIpLmNsaWNrKCk7Ci0JCWFzc2VydFRydWUobmV4dC5pc0VuYWJsZWQoKSk7Ci0JCW5leHQuY2xpY2soKTsKKyAgICAgICAgdGhpcy5ib3QudGV4dFdpdGhMYWJlbCgiUHJvamVjdCBuYW1lOiIpLnNldFRleHQoUFJPSkVDVF9OQU1FKTsKKyAgICAgICAgdGhpcy5ib3QuY2hlY2tCb3hJbkdyb3VwKCJXb3JraW5nIHNldHMiKS5zZWxlY3QoKTsKKyAgICAgICAgdGhpcy5ib3QuYnV0dG9uKCJTZWxlY3QuLi4iKS5jbGljaygpOworICAgICAgICB0aGlzLmJvdC50YWJsZSgpLmdldFRhYmxlSXRlbSgiVGVzdGluZyIpLmNoZWNrKCk7CisgICAgICAgIHRoaXMuYm90LmJ1dHRvbigiT0siKS5jbGljaygpOworICAgICAgICBhc3NlcnRUcnVlKG5leHQuaXNFbmFibGVkKCkpOworICAgICAgICBuZXh0LmNsaWNrKCk7CiAKLQkJU1dUQm90QnV0dG9uIGZpbmlzaCA9IGJvdC5idXR0b24oIkZpbmlzaCIpOwotCQlhc3NlcnRUcnVlKGZpbmlzaC5pc0VuYWJsZWQoKSk7Ci0JCWZpbmlzaC5jbGljaygpOwotCQlib3Qud2FpdFVudGlsKHNoZWxsQ2xvc2VzKHdpemFyZCkpOworICAgICAgICBTV1RCb3RCdXR0b24gZmluaXNoID0gdGhpcy5ib3QuYnV0dG9uKCJGaW5pc2giKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaW5pc2guaXNFbmFibGVkKCkpOworICAgICAgICBmaW5pc2guY2xpY2soKTsKKyAgICAgICAgdGhpcy5ib3Qud2FpdFVudGlsKHNoZWxsQ2xvc2VzKHdpemFyZCkpOwogCi0JCUlXb3JraW5nU2V0IHRlc3RpbmdTZXQgPSBtYW5hZ2VyLmdldFdvcmtpbmdTZXQoIlRlc3RpbmciKTsKLQkJSUFkYXB0YWJsZVtdIGVsZW1lbnRzID0gdGVzdGluZ1NldC5nZXRFbGVtZW50cygpOwotCQlhc3NlcnRUcnVlKGVsZW1lbnRzLmxlbmd0aCA9PSAxKTsKLQkJbWFuYWdlci5yZW1vdmVXb3JraW5nU2V0KHRlc3RpbmdTZXQpOwotCX0KKyAgICAgICAgSVdvcmtpbmdTZXQgdGVzdGluZ1NldCA9IG1hbmFnZXIuZ2V0V29ya2luZ1NldCgiVGVzdGluZyIpOworICAgICAgICBJQWRhcHRhYmxlW10gZWxlbWVudHMgPSB0ZXN0aW5nU2V0LmdldEVsZW1lbnRzKCk7CisgICAgICAgIGFzc2VydFRydWUoZWxlbWVudHMubGVuZ3RoID09IDEpOworICAgICAgICBtYW5hZ2VyLnJlbW92ZVdvcmtpbmdTZXQodGVzdGluZ1NldCk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld1BhclByb2plY3RXaXphcmRVaVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3UGFyUHJvamVjdFdpemFyZFVpVGVzdC5qYXZhCmluZGV4IGFlMWEwY2EuLjg4ZWI5YTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3UGFyUHJvamVjdFdpemFyZFVpVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3UGFyUHJvamVjdFdpemFyZFVpVGVzdC5qYXZhCkBAIC04LDE0ICs4LDEwIEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLndpemFyZHM7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uuc3d0Ym90LnN3dC5maW5kZXIud2FpdHMuQ29uZGl0aW9ucy5zaGVsbENsb3NlczsKLQogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dGJvdC5lY2xpcHNlLmZpbmRlci53aWRnZXRzLlNXVEJvdEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci53aWRnZXRzLlNXVEJvdEJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Rib3Quc3d0LmZpbmRlci53aWRnZXRzLlNXVEJvdFNoZWxsOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JraW5nU2V0TWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwpAQCAtMjcsNjUgKzIzLDY1IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBOZXdQYXJQcm9qZWN0V2l6YXJkVWlUZXN0IGV4dGVuZHMgQWJzdHJhY3RNYW5pZmVzdFVpVGVzdENhc2UgewogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJQYXJQcm9qZWN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIlBhclByb2plY3QiOwogCi0JcHVibGljIHZvaWQgdGVzdFByb2plY3RDcmVhdGlvbigpIHsKLQkJYm90Lm1lbnUoIkZpbGUiKS5tZW51KCJOZXciKS5tZW51KCJQcm9qZWN0Li4uIikuY2xpY2soKTsKLQkJU1dUQm90U2hlbGwgd2l6YXJkID0gYm90LnNoZWxsKCJOZXcgUHJvamVjdCIpOwotCQl3aXphcmQuYWN0aXZhdGUoKTsKLQkJYm90LnRyZWUoKS5leHBhbmROb2RlKCJWaXJnbyIpLnNlbGVjdCgiUEFSIFByb2plY3QiKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdENyZWF0aW9uKCkgeworICAgICAgICB0aGlzLmJvdC5tZW51KCJGaWxlIikubWVudSgiTmV3IikubWVudSgiUHJvamVjdC4uLiIpLmNsaWNrKCk7CisgICAgICAgIFNXVEJvdFNoZWxsIHdpemFyZCA9IHRoaXMuYm90LnNoZWxsKCJOZXcgUHJvamVjdCIpOworICAgICAgICB3aXphcmQuYWN0aXZhdGUoKTsKKyAgICAgICAgdGhpcy5ib3QudHJlZSgpLmV4cGFuZE5vZGUoIlZpcmdvIikuc2VsZWN0KCJQQVIgUHJvamVjdCIpOwogCi0JCVNXVEJvdEJ1dHRvbiBuZXh0ID0gYm90LmJ1dHRvbigiTmV4dCA+Iik7Ci0JCW5leHQuY2xpY2soKTsKLQkJYXNzZXJ0RmFsc2UobmV4dC5pc0VuYWJsZWQoKSk7CisgICAgICAgIFNXVEJvdEJ1dHRvbiBuZXh0ID0gdGhpcy5ib3QuYnV0dG9uKCJOZXh0ID4iKTsKKyAgICAgICAgbmV4dC5jbGljaygpOworICAgICAgICBhc3NlcnRGYWxzZShuZXh0LmlzRW5hYmxlZCgpKTsKIAotCQlib3QudGV4dFdpdGhMYWJlbCgiUHJvamVjdCBuYW1lOiIpLnNldFRleHQoUFJPSkVDVF9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShuZXh0LmlzRW5hYmxlZCgpKTsKLQkJbmV4dC5jbGljaygpOworICAgICAgICB0aGlzLmJvdC50ZXh0V2l0aExhYmVsKCJQcm9qZWN0IG5hbWU6Iikuc2V0VGV4dChQUk9KRUNUX05BTUUpOworICAgICAgICBhc3NlcnRUcnVlKG5leHQuaXNFbmFibGVkKCkpOworICAgICAgICBuZXh0LmNsaWNrKCk7CiAKLQkJU1dUQm90QnV0dG9uIGZpbmlzaCA9IGJvdC5idXR0b24oIkZpbmlzaCIpOwotCQlhc3NlcnRUcnVlKGZpbmlzaC5pc0VuYWJsZWQoKSk7Ci0JCWZpbmlzaC5jbGljaygpOwotCQlib3Qud2FpdFVudGlsKHNoZWxsQ2xvc2VzKHdpemFyZCksIDE1MDAwKTsKKyAgICAgICAgU1dUQm90QnV0dG9uIGZpbmlzaCA9IHRoaXMuYm90LmJ1dHRvbigiRmluaXNoIik7CisgICAgICAgIGFzc2VydFRydWUoZmluaXNoLmlzRW5hYmxlZCgpKTsKKyAgICAgICAgZmluaXNoLmNsaWNrKCk7CisgICAgICAgIHRoaXMuYm90LndhaXRVbnRpbChzaGVsbENsb3Nlcyh3aXphcmQpLCAxNTAwMCk7CiAKLQkJU1dUQm90RWRpdG9yIGVkaXRvciA9IGJvdC5lZGl0b3JCeUlkKFBhck1hbmlmZXN0RWRpdG9yLklEX0VESVRPUik7Ci0JCS8vIE9jY2FzaW9uYWwgZmFpbHVyZS4gQ2F1c2VkIGJ5IHJhY2UgY29uZGl0aW9uPwotCQlhc3NlcnRFcXVhbHMoUFJPSkVDVF9OQU1FLCBlZGl0b3IuZ2V0VGl0bGUoKSk7Ci0JfQorICAgICAgICBTV1RCb3RFZGl0b3IgZWRpdG9yID0gdGhpcy5ib3QuZWRpdG9yQnlJZChQYXJNYW5pZmVzdEVkaXRvci5JRF9FRElUT1IpOworICAgICAgICAvLyBPY2Nhc2lvbmFsIGZhaWx1cmUuIENhdXNlZCBieSByYWNlIGNvbmRpdGlvbj8KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBST0pFQ1RfTkFNRSwgZWRpdG9yLmdldFRpdGxlKCkpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0Q3JlYXRpb25XaXRoV29ya2luZ1NldHMoKSB7Ci0JCWZpbmFsIElXb3JraW5nU2V0TWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpOwotCQlJV29ya2luZ1NldCBuZXdTZXQgPSBtYW5hZ2VyLmNyZWF0ZVdvcmtpbmdTZXQoIlRlc3RpbmciLCBuZXcgSUFkYXB0YWJsZVswXSk7Ci0JCW5ld1NldC5zZXRJZCgib3JnLmVjbGlwc2UuamR0LnVpLkphdmFXb3JraW5nU2V0UGFnZSIpOwotCQltYW5hZ2VyLmFkZFdvcmtpbmdTZXQobmV3U2V0KTsKLQkJYXNzZXJ0VHJ1ZShuZXdTZXQuZ2V0RWxlbWVudHMoKS5sZW5ndGggPT0gMCk7CisgICAgcHVibGljIHZvaWQgdGVzdFByb2plY3RDcmVhdGlvbldpdGhXb3JraW5nU2V0cygpIHsKKyAgICAgICAgZmluYWwgSVdvcmtpbmdTZXRNYW5hZ2VyIG1hbmFnZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCk7CisgICAgICAgIElXb3JraW5nU2V0IG5ld1NldCA9IG1hbmFnZXIuY3JlYXRlV29ya2luZ1NldCgiVGVzdGluZyIsIG5ldyBJQWRhcHRhYmxlWzBdKTsKKyAgICAgICAgbmV3U2V0LnNldElkKCJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVdvcmtpbmdTZXRQYWdlIik7CisgICAgICAgIG1hbmFnZXIuYWRkV29ya2luZ1NldChuZXdTZXQpOworICAgICAgICBhc3NlcnRUcnVlKG5ld1NldC5nZXRFbGVtZW50cygpLmxlbmd0aCA9PSAwKTsKIAotCQlib3QubWVudSgiRmlsZSIpLm1lbnUoIk5ldyIpLm1lbnUoIlByb2plY3QuLi4iKS5jbGljaygpOwotCQlTV1RCb3RTaGVsbCB3aXphcmQgPSBib3Quc2hlbGwoIk5ldyBQcm9qZWN0Iik7Ci0JCXdpemFyZC5hY3RpdmF0ZSgpOwotCQlib3QudHJlZSgpLmV4cGFuZE5vZGUoIlZpcmdvIikuc2VsZWN0KCJQQVIgUHJvamVjdCIpOworICAgICAgICB0aGlzLmJvdC5tZW51KCJGaWxlIikubWVudSgiTmV3IikubWVudSgiUHJvamVjdC4uLiIpLmNsaWNrKCk7CisgICAgICAgIFNXVEJvdFNoZWxsIHdpemFyZCA9IHRoaXMuYm90LnNoZWxsKCJOZXcgUHJvamVjdCIpOworICAgICAgICB3aXphcmQuYWN0aXZhdGUoKTsKKyAgICAgICAgdGhpcy5ib3QudHJlZSgpLmV4cGFuZE5vZGUoIlZpcmdvIikuc2VsZWN0KCJQQVIgUHJvamVjdCIpOwogCi0JCVNXVEJvdEJ1dHRvbiBuZXh0ID0gYm90LmJ1dHRvbigiTmV4dCA+Iik7Ci0JCW5leHQuY2xpY2soKTsKLQkJYXNzZXJ0RmFsc2UobmV4dC5pc0VuYWJsZWQoKSk7CisgICAgICAgIFNXVEJvdEJ1dHRvbiBuZXh0ID0gdGhpcy5ib3QuYnV0dG9uKCJOZXh0ID4iKTsKKyAgICAgICAgbmV4dC5jbGljaygpOworICAgICAgICBhc3NlcnRGYWxzZShuZXh0LmlzRW5hYmxlZCgpKTsKIAotCQlib3QudGV4dFdpdGhMYWJlbCgiUHJvamVjdCBuYW1lOiIpLnNldFRleHQoUFJPSkVDVF9OQU1FKTsKLQkJYm90LmNoZWNrQm94SW5Hcm91cCgiV29ya2luZyBzZXRzIikuc2VsZWN0KCk7Ci0JCWJvdC5idXR0b24oIlNlbGVjdC4uLiIpLmNsaWNrKCk7Ci0JCWJvdC50YWJsZSgpLmdldFRhYmxlSXRlbSgiVGVzdGluZyIpLmNoZWNrKCk7Ci0JCWJvdC5idXR0b24oIk9LIikuY2xpY2soKTsKLQkJYXNzZXJ0VHJ1ZShuZXh0LmlzRW5hYmxlZCgpKTsKLQkJbmV4dC5jbGljaygpOworICAgICAgICB0aGlzLmJvdC50ZXh0V2l0aExhYmVsKCJQcm9qZWN0IG5hbWU6Iikuc2V0VGV4dChQUk9KRUNUX05BTUUpOworICAgICAgICB0aGlzLmJvdC5jaGVja0JveEluR3JvdXAoIldvcmtpbmcgc2V0cyIpLnNlbGVjdCgpOworICAgICAgICB0aGlzLmJvdC5idXR0b24oIlNlbGVjdC4uLiIpLmNsaWNrKCk7CisgICAgICAgIHRoaXMuYm90LnRhYmxlKCkuZ2V0VGFibGVJdGVtKCJUZXN0aW5nIikuY2hlY2soKTsKKyAgICAgICAgdGhpcy5ib3QuYnV0dG9uKCJPSyIpLmNsaWNrKCk7CisgICAgICAgIGFzc2VydFRydWUobmV4dC5pc0VuYWJsZWQoKSk7CisgICAgICAgIG5leHQuY2xpY2soKTsKIAotCQlTV1RCb3RCdXR0b24gZmluaXNoID0gYm90LmJ1dHRvbigiRmluaXNoIik7Ci0JCWFzc2VydFRydWUoZmluaXNoLmlzRW5hYmxlZCgpKTsKLQkJZmluaXNoLmNsaWNrKCk7Ci0JCWJvdC53YWl0VW50aWwoc2hlbGxDbG9zZXMod2l6YXJkKSk7CisgICAgICAgIFNXVEJvdEJ1dHRvbiBmaW5pc2ggPSB0aGlzLmJvdC5idXR0b24oIkZpbmlzaCIpOworICAgICAgICBhc3NlcnRUcnVlKGZpbmlzaC5pc0VuYWJsZWQoKSk7CisgICAgICAgIGZpbmlzaC5jbGljaygpOworICAgICAgICB0aGlzLmJvdC53YWl0VW50aWwoc2hlbGxDbG9zZXMod2l6YXJkKSk7CiAKLQkJSVdvcmtpbmdTZXQgdGVzdGluZ1NldCA9IG1hbmFnZXIuZ2V0V29ya2luZ1NldCgiVGVzdGluZyIpOwotCQlJQWRhcHRhYmxlW10gZWxlbWVudHMgPSB0ZXN0aW5nU2V0LmdldEVsZW1lbnRzKCk7Ci0JCWFzc2VydFRydWUoZWxlbWVudHMubGVuZ3RoID09IDEpOwotCQltYW5hZ2VyLnJlbW92ZVdvcmtpbmdTZXQodGVzdGluZ1NldCk7Ci0JfQorICAgICAgICBJV29ya2luZ1NldCB0ZXN0aW5nU2V0ID0gbWFuYWdlci5nZXRXb3JraW5nU2V0KCJUZXN0aW5nIik7CisgICAgICAgIElBZGFwdGFibGVbXSBlbGVtZW50cyA9IHRlc3RpbmdTZXQuZ2V0RWxlbWVudHMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbGVtZW50cy5sZW5ndGggPT0gMSk7CisgICAgICAgIG1hbmFnZXIucmVtb3ZlV29ya2luZ1NldCh0ZXN0aW5nU2V0KTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmluZGV4IGJiYWNhNmQuLjQzMjFiZDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMSw0ICsxLDMgQEAKLSNXZWQgTWFyIDAyIDE2OjAwOjA2IFBTVCAyMDExCiBlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KQEAgLTgsNiArNyw4IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRTdWZmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKQEAgLTgyLDM1ICs4MywzNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYW5ub3RhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9ODAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTQ4CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTgwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9yZXNvdXJjZXNfaW5fdHJ5PTgwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0wCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3VuaW9uX3R5cGVfaW5fbXVsdGljYXRjaD0xNgogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQpAQCAtMTIxLDMwICsxMjQsMzEgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2xhbWJkYV9ib2R5PWVuZF9vZl9saW5lCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXM9ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9jb21tZW50cz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9MTIwCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5uZXdfbGluZXNfYXRfYmxvY2tfYm91bmRhcmllcz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5uZXdfbGluZXNfYXRfamF2YWRvY19ib3VuZGFyaWVzPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LnByZXNlcnZlX3doaXRlX3NwYWNlX2JldHdlZW5fY29kZV9hbmRfbGluZV9jb21tZW50cz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmRpc2FibGluZ190YWc9QGZvcm1hdHRlclw6b2ZmCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZW5hYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9uCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQpAQCAtMTU4LDcgKzE2Miw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9maWVsZD1pbnNlcnQKQEAgLTE2NiwxMCArMTcwLDExIEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWVtYmVyPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21ldGhvZD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYWNrYWdlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3R5cGU9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2xhYmVsPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX3R5cGVfYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKQEAgLTIxNyw2ICsyMjIsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfbGFtYmRhX2Fycm93PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydApAQCAtMjM1LDEyICsyNDEsMTQgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydApAQCAtMjY0LDYgKzI3Miw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydApAQCAtMjkxLDYgKzMwMCw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfbGFtYmRhX2Fycm93PWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydApAQCAtMzE5LDYgKzMyOSw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl90cnk9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKQEAgLTMyOCw2ICszMzksNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydApAQCAtMzQzLDE1ICszNTUsMTcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTEyMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTE1MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9c3BhY2UKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV9vbl9vZmZfdGFncz1mYWxzZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9vcl9vcGVyYXRvcl9tdWx0aWNhdGNoPXRydWUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX291dGVyX2V4cHJlc3Npb25zX3doZW5fbmVzdGVkPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFGb3JtYXR0ZXI9b3JnLmVjbGlwc2UuamR0LmNvcmUuZGVmYXVsdEphdmFGb3JtYXR0ZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKaW5kZXggN2U3ZmU3My4uNmM5ODAxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTEsNyArMSw2NSBAQAorY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQorY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQorY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKK2NsZWFudXAuYWRkX21pc3NpbmdfbWV0aG9kcz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQorY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCitjbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zX2ludGVyZmFjZV9tZXRob2RzPXRydWUKK2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKK2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitjbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X2Z1bmN0aW9uYWxfaW50ZXJmYWNlcz1mYWxzZQorY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCitjbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKK2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlX2NoYW5nZXNfb25seT1mYWxzZQorY2xlYW51cC5pbnNlcnRfaW5mZXJyZWRfdHlwZV9hcmd1bWVudHM9ZmFsc2UKK2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQorY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKK2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCitjbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQorY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCitjbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitjbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKK2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCitjbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCitjbGVhbnVwLnJlbW92ZV9yZWR1bmRhbnRfdHlwZV9hcmd1bWVudHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKK2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQorY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz10cnVlCitjbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitjbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK2NsZWFudXAudXNlX2Fub255bW91c19jbGFzc19jcmVhdGlvbj1mYWxzZQorY2xlYW51cC51c2VfYmxvY2tzPXRydWUKK2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCitjbGVhbnVwLnVzZV9sYW1iZGE9dHJ1ZQorY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9dHJ1ZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9ZmFsc2UKK2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQorY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKK2NsZWFudXAudXNlX3R5cGVfYXJndW1lbnRzPWZhbHNlCitjbGVhbnVwX3Byb2ZpbGU9X1ZpcmdvIFdlYiBTZXJ2ZXIgLSBDb2RlIENsZWFuIFVwCiBjbGVhbnVwX3NldHRpbmdzX3ZlcnNpb249MgogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKIGVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X015bHluIGJhc2VkIG9uIEVjbGlwc2UKK2Zvcm1hdHRlcl9wcm9maWxlPV9WaXJnbyBXZWIgU2VydmVyIC0gQ29kZSBGb3JtYXR0ZXIKIGZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEyCiBpbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAogb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ludGVybmFsL3VpL1ZpcmdvUGVyc3BlY3RpdmUuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL2ludGVybmFsL3VpL1ZpcmdvUGVyc3BlY3RpdmUuamF2YQppbmRleCBlZTMxZDg0Li5kZWIwZmQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS9pbnRlcm5hbC91aS9WaXJnb1BlcnNwZWN0aXZlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvaW50ZXJuYWwvdWkvVmlyZ29QZXJzcGVjdGl2ZS5qYXZhCkBAIC0xOSwxOSArMTksMTkgQEAKIAogcHVibGljIGNsYXNzIFZpcmdvUGVyc3BlY3RpdmUgaW1wbGVtZW50cyBJUGVyc3BlY3RpdmVGYWN0b3J5IHsKIAotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCS8vIEluaXRpYWxseSBoaWRlIGVkaXRvciB1bmxlc3MgYSBzZXJ2ZXIgZWRpdG9yIGlzIG9wZW4uLgotCQlib29sZWFuIGhpZGVFZGl0b3IgPSB0cnVlOwotCQlJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmIChhY3RpdmVXb3JrYmVuY2hXaW5kb3cgIT0gbnVsbCAmJiBhY3RpdmVXb3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpICE9IG51bGwpIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gYWN0aXZlV29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKElFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlIDogZWRpdG9yUmVmZXJlbmNlcykgewotCQkJCWlmIChyZWZlcmVuY2UuZ2V0SWQoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuZWRpdG9yIikpIHsKLQkJCQkJaGlkZUVkaXRvciA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKCFoaWRlRWRpdG9yKTsKLQl9CisgICAgcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKKyAgICAgICAgLy8gSW5pdGlhbGx5IGhpZGUgZWRpdG9yIHVubGVzcyBhIHNlcnZlciBlZGl0b3IgaXMgb3Blbi4uCisgICAgICAgIGJvb2xlYW4gaGlkZUVkaXRvciA9IHRydWU7CisgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKKyAgICAgICAgaWYgKGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyAhPSBudWxsICYmIGFjdGl2ZVdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSBhY3RpdmVXb3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKKyAgICAgICAgICAgIGZvciAoSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgOiBlZGl0b3JSZWZlcmVuY2VzKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZS5nZXRJZCgpLmVxdWFscygib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5lZGl0b3IiKSkgeworICAgICAgICAgICAgICAgICAgICBoaWRlRWRpdG9yID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsYXlvdXQuc2V0RWRpdG9yQXJlYVZpc2libGUoIWhpZGVFZGl0b3IpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL1NlcnZlcklkZVVpUGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9TZXJ2ZXJJZGVVaVBsdWdpbi5qYXZhCmluZGV4IDgxNWEzNjcuLjA2YWUxYjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL1NlcnZlcklkZVVpUGx1Z2luLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvU2VydmVySWRlVWlQbHVnaW4uamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWk7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKQEAgLTI0LDg5ICsyNSw4NSBAQAogCiAvKioKICAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJJZGVVaVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewogCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpIjsKKyAgICAvLyBUaGUgcGx1Zy1pbiBJRAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUudWkiOwogCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIFNlcnZlcklkZVVpUGx1Z2luIHBsdWdpbjsKKyAgICAvLyBUaGUgc2hhcmVkIGluc3RhbmNlCisgICAgcHJpdmF0ZSBzdGF0aWMgU2VydmVySWRlVWlQbHVnaW4gcGx1Z2luOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICogCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2ZXJJZGVVaVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2VydmVySWRlVWlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKKyAgICAgICAgcmV0dXJuIHBsdWdpbjsKKyAgICB9CiAKLQlwcml2YXRlIEZvcm1Db2xvcnMgZm9ybUNvbG9yczsKKyAgICBwcml2YXRlIEZvcm1Db2xvcnMgZm9ybUNvbG9yczsKIAotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBTZXJ2ZXJJZGVVaVBsdWdpbigpIHsKLQl9CisgICAgLyoqCisgICAgICogVGhlIGNvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIFNlcnZlcklkZVVpUGx1Z2luKCkgeworICAgIH0KIAotCXB1YmxpYyB2b2lkIGxvZyhFeGNlcHRpb24gZSkgewotCQlnZXRMb2coKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJJZGVVaVBsdWdpbi5QTFVHSU5fSUQsICJVbmV4cGVjdGVkIGVycm9yIiwgZSkpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBsb2coRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELCAiVW5leHBlY3RlZCBlcnJvciIsIGUpKTsKKyAgICB9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlCi0JICogb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQKLQkgKiApCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCUJ1bmRsZUNvbG9yTWFuYWdlci5pbml0aWFsaXplRGVmYXVsdHMoUERFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQorICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCApCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc3RhcnQoY29udGV4dCk7CisgICAgICAgIHBsdWdpbiA9IHRoaXM7CisgICAgICAgIEJ1bmRsZUNvbG9yTWFuYWdlci5pbml0aWFsaXplRGVmYXVsdHMoUERFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7CisgICAgfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZQotCSAqIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQKLQkgKiApCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCApCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwbHVnaW4gPSBudWxsOworICAgICAgICBzdXBlci5zdG9wKGNvbnRleHQpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHBhdGgpIHsKLQkJSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5ID0gZ2V0RGVmYXVsdCgpLmdldEltYWdlUmVnaXN0cnkoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChwYXRoKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZURlc2NyaXB0b3IocGF0aCk7Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJfQotCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UodHJ1ZSk7Ci0JCQlpbWFnZVJlZ2lzdHJ5LnB1dChwYXRoLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBwYXRoKSB7CisgICAgICAgIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCk7CisgICAgICAgIEltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQocGF0aCk7CisgICAgICAgIGlmIChpbWFnZSA9PSBudWxsKSB7CisgICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHBhdGgpOworICAgICAgICAgICAgaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltYWdlID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKHRydWUpOworICAgICAgICAgICAgaW1hZ2VSZWdpc3RyeS5wdXQocGF0aCwgaW1hZ2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbWFnZTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCAiaWNvbnMvIiArIHBhdGgpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCAiaWNvbnMvIiArIHBhdGgpOworICAgIH0KIAotCXB1YmxpYyBGb3JtQ29sb3JzIGdldEZvcm1Db2xvcnMoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWlmIChmb3JtQ29sb3JzID09IG51bGwpIHsKLQkJCWZvcm1Db2xvcnMgPSBuZXcgRm9ybUNvbG9ycyhkaXNwbGF5KTsKLQkJCWZvcm1Db2xvcnMubWFya1NoYXJlZCgpOwotCQl9Ci0JCXJldHVybiBmb3JtQ29sb3JzOwotCX0KKyAgICBwdWJsaWMgRm9ybUNvbG9ycyBnZXRGb3JtQ29sb3JzKERpc3BsYXkgZGlzcGxheSkgeworICAgICAgICBpZiAodGhpcy5mb3JtQ29sb3JzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZm9ybUNvbG9ycyA9IG5ldyBGb3JtQ29sb3JzKGRpc3BsYXkpOworICAgICAgICAgICAgdGhpcy5mb3JtQ29sb3JzLm1hcmtTaGFyZWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5mb3JtQ29sb3JzOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvU3RhdHVzSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvU3RhdHVzSGFuZGxlci5qYXZhCmluZGV4IDJhOGY5NDcuLjhkMWIyNjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL1N0YXR1c0hhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9TdGF0dXNIYW5kbGVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CkBAIC0xNyw4ICsxOCw4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTdGF0dXNIYW5kbGVyIHsKIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJU2VydmVySWRlVWlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7CisgICAgICAgIFNlcnZlcklkZVVpUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQWJzdHJhY3RJbXBvcnRTZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0Fic3RyYWN0SW1wb3J0U2VjdGlvbi5qYXZhCmluZGV4IDI5ZGE3Y2IuLjkxZGZmMDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQWJzdHJhY3RJbXBvcnRTZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9BYnN0cmFjdEltcG9ydFNlY3Rpb24uamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CkBAIC01MywzMTUgKzU0LDMxOCBAQAogLyoqCiAgKiBBYnN0cmFjdCBjbGFzcyB3aXRoIGNvbW1vbiBmdW5jdGlvbmFsaXR5IGZvciBFY2xpcHNlIEZvcm1zIHNlY3Rpb25zIHRoYXQgZGlzcGxheSBhbmQgZWRpdCBhIGxpc3Qgb2YgYXJ0aWZhY3RzIC0tCiAgKiBJbXBvcnQgUGFja2FnZSwgSW1wb3J0IEJ1bmRsZSwgYW5kIEltcG9ydCBMaWJyYXJ5LiBPcmlnaW5hbGx5IGJhc2VkIG9uIDxjb2RlPlBERVNlY3Rpb248L2NvZGU+LgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEltcG9ydFNlY3Rpb24gZXh0ZW5kcyBUYWJsZVNlY3Rpb24gaW1wbGVtZW50cyBJTW9kZWxDaGFuZ2VkTGlzdGVuZXIgewogCi0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIGZWaWV3ZXI7CisgICAgcHJvdGVjdGVkIFRhYmxlVmlld2VyIGZWaWV3ZXI7CiAKLQlwcml2YXRlIEFjdGlvbiBmQWRkQWN0aW9uOworICAgIHByaXZhdGUgQWN0aW9uIGZBZGRBY3Rpb247CiAKLQlwcml2YXRlIEFjdGlvbiBmUmVtb3ZlQWN0aW9uOworICAgIHByaXZhdGUgQWN0aW9uIGZSZW1vdmVBY3Rpb247CiAKLQlwcml2YXRlIEFjdGlvbiBmUHJvcGVydGllc0FjdGlvbjsKKyAgICBwcml2YXRlIEFjdGlvbiBmUHJvcGVydGllc0FjdGlvbjsKIAotCXB1YmxpYyBBYnN0cmFjdEltcG9ydFNlY3Rpb24oUERFRm9ybVBhZ2UgcGFnZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzKHBhZ2UsIHBhcmVudCwgU2VjdGlvbi5ERVNDUklQVElPTiwgbmV3IFN0cmluZ1tdIHsgUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9hZGQsCi0JCQkJUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9yZW1vdmUsIFBERVVJTWVzc2FnZXMuSW1wb3J0UGFja2FnZVNlY3Rpb25fcHJvcGVydGllcyB9KTsKLQl9CisgICAgcHVibGljIEFic3RyYWN0SW1wb3J0U2VjdGlvbihQREVGb3JtUGFnZSBwYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIHRoaXMocGFnZSwgcGFyZW50LCBTZWN0aW9uLkRFU0NSSVBUSU9OLCBuZXcgU3RyaW5nW10geyBQREVVSU1lc3NhZ2VzLkltcG9ydFBhY2thZ2VTZWN0aW9uX2FkZCwgUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9yZW1vdmUsCisgICAgICAgICAgICBQREVVSU1lc3NhZ2VzLkltcG9ydFBhY2thZ2VTZWN0aW9uX3Byb3BlcnRpZXMgfSk7CisgICAgfQogCi0JcHVibGljIEFic3RyYWN0SW1wb3J0U2VjdGlvbihQREVGb3JtUGFnZSBmb3JtUGFnZSwgQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmdbXSBidXR0b25MYWJlbHMpIHsKLQkJc3VwZXIoZm9ybVBhZ2UsIHBhcmVudCwgc3R5bGUsIHRydWUsIGJ1dHRvbkxhYmVscyk7Ci0JfQorICAgIHB1YmxpYyBBYnN0cmFjdEltcG9ydFNlY3Rpb24oUERFRm9ybVBhZ2UgZm9ybVBhZ2UsIENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nW10gYnV0dG9uTGFiZWxzKSB7CisgICAgICAgIHN1cGVyKGZvcm1QYWdlLCBwYXJlbnQsIHN0eWxlLCB0cnVlLCBidXR0b25MYWJlbHMpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNsaWVudChTZWN0aW9uIHNlY3Rpb24sIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc2VjdGlvbi5zZXRUZXh0KFBERVVJTWVzc2FnZXMuSW1wb3J0UGFja2FnZVNlY3Rpb25fcmVxdWlyZWQpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKFBERVVJTWVzc2FnZXMuSW1wb3J0UGFja2FnZVNlY3Rpb25fZGVzYyk7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2xpZW50KFNlY3Rpb24gc2VjdGlvbiwgRm9ybVRvb2xraXQgdG9vbGtpdCkgeworICAgICAgICBzZWN0aW9uLnNldFRleHQoUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9yZXF1aXJlZCk7CisgICAgICAgIHNlY3Rpb24uc2V0RGVzY3JpcHRpb24oUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9kZXNjKTsKIAotCQlDb21wb3NpdGUgY29udGFpbmVyID0gY3JlYXRlQ2xpZW50Q29udGFpbmVyKHNlY3Rpb24sIDIsIHRvb2xraXQpOwotCQljcmVhdGVWaWV3ZXJQYXJ0Q29udHJvbChjb250YWluZXIsIFNXVC5NVUxUSSwgMiwgdG9vbGtpdCk7Ci0JCVRhYmxlUGFydCB0YWJsZVBhcnQgPSBnZXRUYWJsZVBhcnQoKTsKLQkJZlZpZXdlciA9IHRhYmxlUGFydC5nZXRUYWJsZVZpZXdlcigpOwotCQlmVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihnZXRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWZWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihnZXRMYWJlbFByb3ZpZGVyKCkpOwotCQlmVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJCVN0cmluZyBzMSA9IGUxLnRvU3RyaW5nKCk7Ci0JCQkJU3RyaW5nIHMyID0gZTIudG9TdHJpbmcoKTsKLQkJCQlpZiAoczEuaW5kZXhPZigiICIpICE9IC0xKSB7Ci0JCQkJCXMxID0gczEuc3Vic3RyaW5nKDAsIHMxLmluZGV4T2YoIiAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKHMyLmluZGV4T2YoIiAiKSAhPSAtMSkgewotCQkJCQlzMiA9IHMyLnN1YnN0cmluZygwLCBzMi5pbmRleE9mKCIgIikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgczEsIHMyKTsKLQkJCX0KLQkJfSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbnRhaW5lcik7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbnRhaW5lcik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZUNsZWFyR3JpZExheW91dChmYWxzZSwgMSkpOwotCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQltYWtlQWN0aW9ucygpOworICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyID0gY3JlYXRlQ2xpZW50Q29udGFpbmVyKHNlY3Rpb24sIDIsIHRvb2xraXQpOworICAgICAgICBjcmVhdGVWaWV3ZXJQYXJ0Q29udHJvbChjb250YWluZXIsIFNXVC5NVUxUSSwgMiwgdG9vbGtpdCk7CisgICAgICAgIFRhYmxlUGFydCB0YWJsZVBhcnQgPSBnZXRUYWJsZVBhcnQoKTsKKyAgICAgICAgdGhpcy5mVmlld2VyID0gdGFibGVQYXJ0LmdldFRhYmxlVmlld2VyKCk7CisgICAgICAgIHRoaXMuZlZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZ2V0Q29udGVudFByb3ZpZGVyKCkpOworICAgICAgICB0aGlzLmZWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihnZXRMYWJlbFByb3ZpZGVyKCkpOworICAgICAgICB0aGlzLmZWaWV3ZXIuc2V0Q29tcGFyYXRvcihuZXcgVmlld2VyQ29tcGFyYXRvcigpIHsKIAotCQlJQnVuZGxlTW9kZWwgbW9kZWwgPSBnZXRCdW5kbGVNb2RlbCgpOwotCQlmVmlld2VyLnNldElucHV0KG1vZGVsKTsKLQkJbW9kZWwuYWRkTW9kZWxDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgeworICAgICAgICAgICAgICAgIFN0cmluZyBzMSA9IGUxLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHMyID0gZTIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoczEuaW5kZXhPZigiICIpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHMxID0gczEuc3Vic3RyaW5nKDAsIHMxLmluZGV4T2YoIiAiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHMyLmluZGV4T2YoIiAiKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBzMiA9IHMyLnN1YnN0cmluZygwLCBzMi5pbmRleE9mKCIgIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgczEsIHMyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbnRhaW5lcik7CisgICAgICAgIHNlY3Rpb24uc2V0Q2xpZW50KGNvbnRhaW5lcik7CisgICAgICAgIHNlY3Rpb24uc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZUNsZWFyR3JpZExheW91dChmYWxzZSwgMSkpOworICAgICAgICBzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworICAgICAgICBtYWtlQWN0aW9ucygpOwogCi0JcHJvdGVjdGVkIGFic3RyYWN0IElUYWJsZUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpOworICAgICAgICBJQnVuZGxlTW9kZWwgbW9kZWwgPSBnZXRCdW5kbGVNb2RlbCgpOworICAgICAgICB0aGlzLmZWaWV3ZXIuc2V0SW5wdXQobW9kZWwpOworICAgICAgICBtb2RlbC5hZGRNb2RlbENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgdXBkYXRlQnV0dG9ucygpOworICAgIH0KIAotCXByb3RlY3RlZCBhYnN0cmFjdCBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBJVGFibGVMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKTsKIAotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGRvR2xvYmFsQWN0aW9uKFN0cmluZyBhY3Rpb25JZCkgeworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpOwogCi0JCWlmICghaXNFZGl0YWJsZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBkb0dsb2JhbEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsKIAotCQlpZiAoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKSB7Ci0JCQloYW5kbGVSZW1vdmUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhY3Rpb25JZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSkpIHsKLQkJCS8vIGRlbGV0ZSBoZXJlIGFuZCBsZXQgdGhlIGVkaXRvciB0cmFuc2ZlcgotCQkJLy8gdGhlIHNlbGVjdGlvbiB0byB0aGUgY2xpcGJvYXJkCi0JCQloYW5kbGVSZW1vdmUoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSkpIHsKLQkJCWRvUGFzdGUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgICAgIGlmICghaXNFZGl0YWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUlCdW5kbGVNb2RlbCBtb2RlbCA9IGdldEJ1bmRsZU1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQltb2RlbC5yZW1vdmVNb2RlbENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQorICAgICAgICBpZiAoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKSB7CisgICAgICAgICAgICBoYW5kbGVSZW1vdmUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChhY3Rpb25JZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgIC8vIGRlbGV0ZSBoZXJlIGFuZCBsZXQgdGhlIGVkaXRvciB0cmFuc2ZlcgorICAgICAgICAgICAgLy8gdGhlIHNlbGVjdGlvbiB0byB0aGUgY2xpcGJvYXJkCisgICAgICAgICAgICBoYW5kbGVSZW1vdmUoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgIGRvUGFzdGUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCkgewotCQlnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgSUJ1bmRsZU1vZGVsIG1vZGVsID0gZ2V0QnVuZGxlTW9kZWwoKTsKKyAgICAgICAgaWYgKG1vZGVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1vZGVsLnJlbW92ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQlPYmplY3RbXSBzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKTsKLQkJaW50IHNpemUgPSBzZWxlY3RlZC5sZW5ndGg7Ci0JCVRhYmxlUGFydCB0YWJsZVBhcnQgPSBnZXRUYWJsZVBhcnQoKTsKLQkJdGFibGVQYXJ0LnNldEJ1dHRvbkVuYWJsZWQoZ2V0QWRkSW5kZXgoKSwgaXNFZGl0YWJsZSgpKTsKLQkJdGFibGVQYXJ0LnNldEJ1dHRvbkVuYWJsZWQoZ2V0UmVtb3ZlSW5kZXgoKSwgaXNFZGl0YWJsZSgpICYmIHNpemUgPiAwKTsKLQkJdGFibGVQYXJ0LnNldEJ1dHRvbkVuYWJsZWQoZ2V0UHJvcGVydGllc0luZGV4KCksIHNob3VsZEVuYWJsZVByb3BlcnRpZXMoc2VsZWN0ZWQpKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwpIHsKKyAgICAgICAgZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLnNldFNlbGVjdGlvbihzZWwpOworICAgICAgICB1cGRhdGVCdXR0b25zKCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uU2VsZWN0ZWQoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA9PSBnZXRBZGRJbmRleCgpKSB7Ci0JCQloYW5kbGVBZGQoKTsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSBnZXRSZW1vdmVJbmRleCgpKSB7Ci0JCQloYW5kbGVSZW1vdmUoKTsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSBnZXRQcm9wZXJ0aWVzSW5kZXgoKSkgewotCQkJaGFuZGxlT3BlblByb3BlcnRpZXMoKTsKLQkJfQotCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgeworICAgICAgICBPYmplY3RbXSBzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuZlZpZXdlci5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOworICAgICAgICBpbnQgc2l6ZSA9IHNlbGVjdGVkLmxlbmd0aDsKKyAgICAgICAgVGFibGVQYXJ0IHRhYmxlUGFydCA9IGdldFRhYmxlUGFydCgpOworICAgICAgICB0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZChnZXRBZGRJbmRleCgpLCBpc0VkaXRhYmxlKCkpOworICAgICAgICB0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZChnZXRSZW1vdmVJbmRleCgpLCBpc0VkaXRhYmxlKCkgJiYgc2l6ZSA+IDApOworICAgICAgICB0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZChnZXRQcm9wZXJ0aWVzSW5kZXgoKSwgc2hvdWxkRW5hYmxlUHJvcGVydGllcyhzZWxlY3RlZCkpOworICAgIH0KIAotCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0QWRkSW5kZXgoKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBidXR0b25TZWxlY3RlZChpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4ID09IGdldEFkZEluZGV4KCkpIHsKKyAgICAgICAgICAgIGhhbmRsZUFkZCgpOworICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09IGdldFJlbW92ZUluZGV4KCkpIHsKKyAgICAgICAgICAgIGhhbmRsZVJlbW92ZSgpOworICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09IGdldFByb3BlcnRpZXNJbmRleCgpKSB7CisgICAgICAgICAgICBoYW5kbGVPcGVuUHJvcGVydGllcygpOworICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRSZW1vdmVJbmRleCgpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0QWRkSW5kZXgoKTsKIAotCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0UHJvcGVydGllc0luZGV4KCk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRSZW1vdmVJbmRleCgpOwogCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlUmVtb3ZlKCk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRQcm9wZXJ0aWVzSW5kZXgoKTsKIAotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZUFkZCgpOworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZVJlbW92ZSgpOwogCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlT3BlblByb3BlcnRpZXMoKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBoYW5kbGVBZGQoKTsKIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWZWaWV3ZXIucmVmcmVzaCgpOwotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQorICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZU9wZW5Qcm9wZXJ0aWVzKCk7CiAKLQlwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucygpIHsKLQkJZkFkZEFjdGlvbiA9IG5ldyBBY3Rpb24oUERFVUlNZXNzYWdlcy5SZXF1aXJlc1NlY3Rpb25fYWRkKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQloYW5kbGVBZGQoKTsKLQkJCX0KLQkJfTsKLQkJZkFkZEFjdGlvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUoKSk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKKyAgICAgICAgdGhpcy5mVmlld2VyLnJlZnJlc2goKTsKKyAgICAgICAgc3VwZXIucmVmcmVzaCgpOworICAgIH0KIAotCQlmUmVtb3ZlQWN0aW9uID0gbmV3IEFjdGlvbihQREVVSU1lc3NhZ2VzLlJlcXVpcmVzU2VjdGlvbl9kZWxldGUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWhhbmRsZVJlbW92ZSgpOwotCQkJfQotCQl9OwotCQlmUmVtb3ZlQWN0aW9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSgpKTsKKyAgICBwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucygpIHsKKyAgICAgICAgdGhpcy5mQWRkQWN0aW9uID0gbmV3IEFjdGlvbihQREVVSU1lc3NhZ2VzLlJlcXVpcmVzU2VjdGlvbl9hZGQpIHsKIAotCQlmUHJvcGVydGllc0FjdGlvbiA9IG5ldyBBY3Rpb24oUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9wcm9wZXJ0eUFjdGlvbikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaGFuZGxlT3BlblByb3BlcnRpZXMoKTsKLQkJCX0KLQkJfTsKLQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVBZGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdGhpcy5mQWRkQWN0aW9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSgpKTsKIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQlmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCW1hbmFnZXIuYWRkKGZBZGRBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCW1hbmFnZXIuYWRkKGZSZW1vdmVBY3Rpb24pOwotCQl9Ci0JCWdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS5nZXRDb250cmlidXRvcigpLmNvbnRleHRNZW51QWJvdXRUb1Nob3cobWFuYWdlcik7Ci0JCWlmIChzaG91bGRFbmFibGVQcm9wZXJ0aWVzKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKSkpIHsKLQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltYW5hZ2VyLmFkZChmUHJvcGVydGllc0FjdGlvbik7Ci0JCX0KLQl9CisgICAgICAgIHRoaXMuZlJlbW92ZUFjdGlvbiA9IG5ldyBBY3Rpb24oUERFVUlNZXNzYWdlcy5SZXF1aXJlc1NlY3Rpb25fZGVsZXRlKSB7CiAKLQlwcml2YXRlIEJ1bmRsZUlucHV0Q29udGV4dCBnZXRCdW5kbGVDb250ZXh0KCkgewotCQlJbnB1dENvbnRleHRNYW5hZ2VyIG1hbmFnZXIgPSBnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuZ2V0Q29udGV4dE1hbmFnZXIoKTsKLQkJcmV0dXJuIChCdW5kbGVJbnB1dENvbnRleHQpIG1hbmFnZXIuZmluZENvbnRleHQoQnVuZGxlSW5wdXRDb250ZXh0LkNPTlRFWFRfSUQpOwotCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGhhbmRsZVJlbW92ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0aGlzLmZSZW1vdmVBY3Rpb24uc2V0RW5hYmxlZChpc0VkaXRhYmxlKCkpOwogCi0JcHJvdGVjdGVkIElCdW5kbGVNb2RlbCBnZXRCdW5kbGVNb2RlbCgpIHsKLQkJQnVuZGxlSW5wdXRDb250ZXh0IGNvbnRleHQgPSBnZXRCdW5kbGVDb250ZXh0KCk7Ci0JCXJldHVybiAoY29udGV4dCAhPSBudWxsKSA/IChJQnVuZGxlTW9kZWwpIGNvbnRleHQuZ2V0TW9kZWwoKSA6IG51bGw7CisgICAgICAgIHRoaXMuZlByb3BlcnRpZXNBY3Rpb24gPSBuZXcgQWN0aW9uKFBERVVJTWVzc2FnZXMuSW1wb3J0UGFja2FnZVNlY3Rpb25fcHJvcGVydHlBY3Rpb24pIHsKIAotCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGhhbmRsZU9wZW5Qcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQogCi0JcHJvdGVjdGVkIElCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlJQnVuZGxlTW9kZWwgbW9kZWwgPSBnZXRCdW5kbGVNb2RlbCgpOwotCQlyZXR1cm4gKG1vZGVsICE9IG51bGwpID8gbW9kZWwuZ2V0QnVuZGxlKCkgOiBudWxsOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgZmluYWwgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0aGlzLmZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgIG1hbmFnZXIuYWRkKHRoaXMuZkFkZEFjdGlvbik7CisgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisgICAgICAgIGlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbWFuYWdlci5hZGQodGhpcy5mUmVtb3ZlQWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuZ2V0Q29udHJpYnV0b3IoKS5jb250ZXh0TWVudUFib3V0VG9TaG93KG1hbmFnZXIpOworICAgICAgICBpZiAoc2hvdWxkRW5hYmxlUHJvcGVydGllcygoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKSkpIHsKKyAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisgICAgICAgICAgICBtYW5hZ2VyLmFkZCh0aGlzLmZQcm9wZXJ0aWVzQWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNyZWF0ZUNvdW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgcHJpdmF0ZSBCdW5kbGVJbnB1dENvbnRleHQgZ2V0QnVuZGxlQ29udGV4dCgpIHsKKyAgICAgICAgSW5wdXRDb250ZXh0TWFuYWdlciBtYW5hZ2VyID0gZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLmdldENvbnRleHRNYW5hZ2VyKCk7CisgICAgICAgIHJldHVybiAoQnVuZGxlSW5wdXRDb250ZXh0KSBtYW5hZ2VyLmZpbmRDb250ZXh0KEJ1bmRsZUlucHV0Q29udGV4dC5DT05URVhUX0lEKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRFbmFibGVQcm9wZXJ0aWVzKE9iamVjdFtdIHNlbGVjdGVkKSB7Ci0JCWlmIChzZWxlY3RlZC5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChzZWxlY3RlZC5sZW5ndGggPT0gMSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KKyAgICBwcm90ZWN0ZWQgSUJ1bmRsZU1vZGVsIGdldEJ1bmRsZU1vZGVsKCkgeworICAgICAgICBCdW5kbGVJbnB1dENvbnRleHQgY29udGV4dCA9IGdldEJ1bmRsZUNvbnRleHQoKTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQgIT0gbnVsbCA/IChJQnVuZGxlTW9kZWwpIGNvbnRleHQuZ2V0TW9kZWwoKSA6IG51bGw7CiAKLQkJU3RyaW5nIHZlcnNpb24gPSAoKEltcG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGVkWzBdKS5nZXRWZXJzaW9uKCk7Ci0JCWJvb2xlYW4gb3B0aW9uYWwgPSAoKEltcG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGVkWzBdKS5pc09wdGlvbmFsKCk7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCUltcG9ydFBhY2thZ2VPYmplY3Qgb2JqZWN0ID0gKEltcG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGVkW2ldOwotCQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QuZ2V0VmVyc2lvbigpICE9IG51bGwgfHwgIShvcHRpb25hbCA9PSBvYmplY3QuaXNPcHRpb25hbCgpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICghdmVyc2lvbi5lcXVhbHMob2JqZWN0LmdldFZlcnNpb24oKSkgfHwgIShvcHRpb25hbCA9PSBvYmplY3QuaXNPcHRpb25hbCgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgfQogCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRIZWFkZXJDb25zdGFudCgpOworICAgIHByb3RlY3RlZCBJQnVuZGxlIGdldEJ1bmRsZSgpIHsKKyAgICAgICAgSUJ1bmRsZU1vZGVsIG1vZGVsID0gZ2V0QnVuZGxlTW9kZWwoKTsKKyAgICAgICAgcmV0dXJuIG1vZGVsICE9IG51bGwgPyBtb2RlbC5nZXRCdW5kbGUoKSA6IG51bGw7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElNb2RlbENoYW5nZWRFdmVudCBldmVudCkgewotCQlJQmFzZU1vZGVsIG1vZGVsID0gZ2V0UGFnZSgpLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIElNb2RlbENoYW5nZVByb3ZpZGVyKSB7Ci0JCQkoKElNb2RlbENoYW5nZVByb3ZpZGVyKSBtb2RlbCkuZmlyZU1vZGVsQ2hhbmdlZChldmVudCk7Ci0JCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JCWlmIChldmVudC5nZXRDaGFuZ2VUeXBlKCkgPT0gSU1vZGVsQ2hhbmdlZEV2ZW50LldPUkxEX0NIQU5HRUQpIHsKLQkJCW1hcmtTdGFsZSgpOwotCQkJcmV0dXJuOwotCQl9CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRW5hYmxlUHJvcGVydGllcyhPYmplY3RbXSBzZWxlY3RlZCkgeworICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAKLQkJaWYgKGdldEhlYWRlckNvbnN0YW50KCkuZXF1YWxzKGV2ZW50LmdldENoYW5nZWRQcm9wZXJ0eSgpKSkgewotCQkJcmVmcmVzaCgpOwotCQkJcmV0dXJuOwotCQl9CisgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gKChJbXBvcnRQYWNrYWdlT2JqZWN0KSBzZWxlY3RlZFswXSkuZ2V0VmVyc2lvbigpOworICAgICAgICBib29sZWFuIG9wdGlvbmFsID0gKChJbXBvcnRQYWNrYWdlT2JqZWN0KSBzZWxlY3RlZFswXSkuaXNPcHRpb25hbCgpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBJbXBvcnRQYWNrYWdlT2JqZWN0IG9iamVjdCA9IChJbXBvcnRQYWNrYWdlT2JqZWN0KSBzZWxlY3RlZFtpXTsKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAob2JqZWN0LmdldFZlcnNpb24oKSAhPSBudWxsIHx8ICEob3B0aW9uYWwgPT0gb2JqZWN0LmlzT3B0aW9uYWwoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZlcnNpb24uZXF1YWxzKG9iamVjdC5nZXRWZXJzaW9uKCkpIHx8ICEob3B0aW9uYWwgPT0gb2JqZWN0LmlzT3B0aW9uYWwoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JCU9iamVjdFtdIG9iamVjdHMgPSBldmVudC5nZXRDaGFuZ2VkT2JqZWN0cygpOwotCQlmb3IgKE9iamVjdCBlbGVtZW50IDogb2JqZWN0cykgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQREVNYW5pZmVzdEVsZW1lbnQKLQkJCQkJJiYgKChQREVNYW5pZmVzdEVsZW1lbnQpIGVsZW1lbnQpLmdldEhlYWRlcigpLmdldE5hbWUoKS5lcXVhbHMoZ2V0SGVhZGVyQ29uc3RhbnQoKSkpIHsKLQkJCQlzd2l0Y2ggKGV2ZW50LmdldENoYW5nZVR5cGUoKSkgewotCQkJCWNhc2UgSU1vZGVsQ2hhbmdlZEV2ZW50LklOU0VSVDoKLQkJCQkJZlZpZXdlci5hZGQoZWxlbWVudCk7Ci0JCQkJCWZWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVsZW1lbnQpKTsKLQkJCQkJZlZpZXdlci5nZXRUYWJsZSgpLnNldEZvY3VzKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU1vZGVsQ2hhbmdlZEV2ZW50LlJFTU9WRToKLQkJCQkJVGFibGUgdGFibGUgPSBmVmlld2VyLmdldFRhYmxlKCk7Ci0JCQkJCWludCBpbmRleCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCWZWaWV3ZXIucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQl0YWJsZS5zZXRTZWxlY3Rpb24oaW5kZXggPCB0YWJsZS5nZXRJdGVtQ291bnQoKSA/IGluZGV4IDogdGFibGUuZ2V0SXRlbUNvdW50KCkgLSAxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJZlZpZXdlci5yZWZyZXNoKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEhlYWRlckNvbnN0YW50KCk7CiAKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZWN0aW9uVmlld2VyTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJTW9kZWxDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgSUJhc2VNb2RlbCBtb2RlbCA9IGdldFBhZ2UoKS5nZXRNb2RlbCgpOworICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJTW9kZWxDaGFuZ2VQcm92aWRlcikgeworICAgICAgICAgICAgKChJTW9kZWxDaGFuZ2VQcm92aWRlcikgbW9kZWwpLmZpcmVNb2RlbENoYW5nZWQoZXZlbnQpOworICAgICAgICB9CiAKLQkJcHVibGljIGFic3RyYWN0IEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpOworICAgICAgICBpZiAoZXZlbnQuZ2V0Q2hhbmdlVHlwZSgpID09IElNb2RlbENoYW5nZWRFdmVudC5XT1JMRF9DSEFOR0VEKSB7CisgICAgICAgICAgICBtYXJrU3RhbGUoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KTsKKyAgICAgICAgaWYgKGdldEhlYWRlckNvbnN0YW50KCkuZXF1YWxzKGV2ZW50LmdldENoYW5nZWRQcm9wZXJ0eSgpKSkgeworICAgICAgICAgICAgcmVmcmVzaCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9CisgICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSBldmVudC5nZXRDaGFuZ2VkT2JqZWN0cygpOworICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogb2JqZWN0cykgeworICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQREVNYW5pZmVzdEVsZW1lbnQgJiYgKChQREVNYW5pZmVzdEVsZW1lbnQpIGVsZW1lbnQpLmdldEhlYWRlcigpLmdldE5hbWUoKS5lcXVhbHMoZ2V0SGVhZGVyQ29uc3RhbnQoKSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldENoYW5nZVR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIElNb2RlbENoYW5nZWRFdmVudC5JTlNFUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZWaWV3ZXIuYWRkKGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbGVtZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZWaWV3ZXIuZ2V0VGFibGUoKS5zZXRGb2N1cygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSU1vZGVsQ2hhbmdlZEV2ZW50LlJFTU9WRToKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlIHRhYmxlID0gdGhpcy5mVmlld2VyLmdldFRhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mVmlld2VyLnJlbW92ZShlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbihpbmRleCA8IHRhYmxlLmdldEl0ZW1Db3VudCgpID8gaW5kZXggOiB0YWJsZS5nZXRJdGVtQ291bnQoKSAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZWaWV3ZXIucmVmcmVzaChlbGVtZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQorICAgIHByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlY3Rpb25WaWV3ZXJMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7CiAKLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCk7CiAKLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCk7CiAKLQlwcm90ZWN0ZWQgY2xhc3MgSW1wb3J0TGlzdFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIHsKKyAgICAgICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBPYmplY3RbXSBmRWxlbWVudHM7CisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgSW1wb3J0TGlzdFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQsIElMYWJlbFByb3ZpZGVyIHJlbmRlcmVyKSB7Ci0JCQlzdXBlcihwYXJlbnQsIHJlbmRlcmVyKTsKLQkJfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCQlmaW5hbCBPYmplY3RbXSBhbGxFbGVtZW50cyA9IG5ldyBPYmplY3RbZkVsZW1lbnRzLmxlbmd0aF07Ci0JCQlpZiAoZkVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZFbGVtZW50cywgMCwgYWxsRWxlbWVudHMsIDAsIGZFbGVtZW50cy5sZW5ndGgpOwotCQkJfQotCQkJcmV0dXJuIGNvbXA7Ci0JCX0KKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICB9CisgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhPYmplY3RbXSBlbGVtZW50cykgewotCQkJc3VwZXIuc2V0RWxlbWVudHMoZWxlbWVudHMpOwotCQkJZkVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCX0KLQl9CisgICAgcHJvdGVjdGVkIGNsYXNzIEltcG9ydExpc3RTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyB7CisKKyAgICAgICAgcHJpdmF0ZSBPYmplY3RbXSBmRWxlbWVudHM7CisKKyAgICAgICAgcHVibGljIEltcG9ydExpc3RTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBJTGFiZWxQcm92aWRlciByZW5kZXJlcikgeworICAgICAgICAgICAgc3VwZXIocGFyZW50LCByZW5kZXJlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgICAgICBDb21wb3NpdGUgY29tcCA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIGFsbEVsZW1lbnRzID0gbmV3IE9iamVjdFt0aGlzLmZFbGVtZW50cy5sZW5ndGhdOworICAgICAgICAgICAgaWYgKHRoaXMuZkVsZW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZkVsZW1lbnRzLCAwLCBhbGxFbGVtZW50cywgMCwgdGhpcy5mRWxlbWVudHMubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjb21wOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRzKE9iamVjdFtdIGVsZW1lbnRzKSB7CisgICAgICAgICAgICBzdXBlci5zZXRFbGVtZW50cyhlbGVtZW50cyk7CisgICAgICAgICAgICB0aGlzLmZFbGVtZW50cyA9IGVsZW1lbnRzOworICAgICAgICB9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0Fic3RyYWN0UGRlRm9ybVRleHRFZGl0b3JDb250cmlidXRvci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9BYnN0cmFjdFBkZUZvcm1UZXh0RWRpdG9yQ29udHJpYnV0b3IuamF2YQppbmRleCBlMDIyYzVkLi5hZjU4ZTVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0Fic3RyYWN0UGRlRm9ybVRleHRFZGl0b3JDb250cmlidXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQWJzdHJhY3RQZGVGb3JtVGV4dEVkaXRvckNvbnRyaWJ1dG9yLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC00NywyNjcgKzQ4LDI2NiBAQAogICovCiBwdWJsaWMgY2xhc3MgQWJzdHJhY3RQZGVGb3JtVGV4dEVkaXRvckNvbnRyaWJ1dG9yIGV4dGVuZHMgUERFRm9ybUVkaXRvckNvbnRyaWJ1dG9yIHsKIAotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkNvcnJlY3Rpb25Bc3Npc3Q7CisgICAgcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQ29ycmVjdGlvbkFzc2lzdDsKIAotCXByb3RlY3RlZCBIeXBlcmxpbmtBY3Rpb24gZkh5cGVybGlua0FjdGlvbjsKKyAgICBwcm90ZWN0ZWQgSHlwZXJsaW5rQWN0aW9uIGZIeXBlcmxpbmtBY3Rpb247CiAKLQlwcm90ZWN0ZWQgTWFuaWZlc3RGb3JtYXRBY3Rpb24gZkZvcm1hdEFjdGlvbjsKKyAgICBwcm90ZWN0ZWQgTWFuaWZlc3RGb3JtYXRBY3Rpb24gZkZvcm1hdEFjdGlvbjsKIAotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkNvbnRlbnRBc3Npc3Q7CisgICAgcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQ29udGVudEFzc2lzdDsKIAotCXByb3RlY3RlZCBmaW5hbCBUZXh0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IgZlNvdXJjZUNvbnRyaWJ1dG9yOworICAgIHByb3RlY3RlZCBmaW5hbCBUZXh0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IgZlNvdXJjZUNvbnRyaWJ1dG9yOwogCi0JcHJvdGVjdGVkIFN1YkFjdGlvbkJhcnMgZlNvdXJjZUFjdGlvbkJhcnM7CisgICAgcHJvdGVjdGVkIFN1YkFjdGlvbkJhcnMgZlNvdXJjZUFjdGlvbkJhcnM7CiAKLQlwcm90ZWN0ZWQgY2xhc3MgUERFVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIGV4dGVuZHMgVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIHsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1tKSB7Ci0JCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1tKTsKLQkJCUlNZW51TWFuYWdlciBlZGl0TWVudSA9IG1tLmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLQkJCWlmIChlZGl0TWVudSAhPSBudWxsKSB7Ci0JCQkJZWRpdE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSUNvbnRleHRNZW51Q29uc3RhbnRzLkdST1VQX09QRU4pKTsKLQkJCQllZGl0TWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfR0VORVJBVEUpKTsKLQkJCQllZGl0TWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfQURESVRJT05TKSk7Ci0JCQkJaWYgKGZDb3JyZWN0aW9uQXNzaXN0ICE9IG51bGwpIHsKLQkJCQkJZWRpdE1lbnUuYXBwZW5kVG9Hcm91cChJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfR0VORVJBVEUsIGZDb3JyZWN0aW9uQXNzaXN0KTsKLQkJCQl9Ci0JCQkJaWYgKGZDb250ZW50QXNzaXN0ICE9IG51bGwpIHsKLQkJCQkJZWRpdE1lbnUuYXBwZW5kVG9Hcm91cChJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfR0VORVJBVEUsIGZDb250ZW50QXNzaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICBwcm90ZWN0ZWQgY2xhc3MgUERFVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIGV4dGVuZHMgVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIHsKIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJCXN1cGVyLmNvbnRyaWJ1dGVUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCQkJaWYgKGZIeXBlcmxpbmtBY3Rpb24gIT0gbnVsbCkgewotCQkJCXRvb2xCYXJNYW5hZ2VyLmFkZChmSHlwZXJsaW5rQWN0aW9uKTsKLQkJCX0KLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29udHJpYnV0ZVRvTWVudShJTWVudU1hbmFnZXIgbW0pIHsKKyAgICAgICAgICAgIHN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobW0pOworICAgICAgICAgICAgSU1lbnVNYW5hZ2VyIGVkaXRNZW51ID0gbW0uZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQpOworICAgICAgICAgICAgaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlZGl0TWVudS5hZGQobmV3IFNlcGFyYXRvcihJQ29udGV4dE1lbnVDb25zdGFudHMuR1JPVVBfT1BFTikpOworICAgICAgICAgICAgICAgIGVkaXRNZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9HRU5FUkFURSkpOworICAgICAgICAgICAgICAgIGVkaXRNZW51LmFkZChuZXcgU2VwYXJhdG9yKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9BRERJVElPTlMpKTsKKyAgICAgICAgICAgICAgICBpZiAoQWJzdHJhY3RQZGVGb3JtVGV4dEVkaXRvckNvbnRyaWJ1dG9yLnRoaXMuZkNvcnJlY3Rpb25Bc3Npc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlZGl0TWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9HRU5FUkFURSwgQWJzdHJhY3RQZGVGb3JtVGV4dEVkaXRvckNvbnRyaWJ1dG9yLnRoaXMuZkNvcnJlY3Rpb25Bc3Npc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoQWJzdHJhY3RQZGVGb3JtVGV4dEVkaXRvckNvbnRyaWJ1dG9yLnRoaXMuZkNvbnRlbnRBc3Npc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBlZGl0TWVudS5hcHBlbmRUb0dyb3VwKElDb250ZXh0TWVudUNvbnN0YW50cy5HUk9VUF9HRU5FUkFURSwgQWJzdHJhY3RQZGVGb3JtVGV4dEVkaXRvckNvbnRyaWJ1dG9yLnRoaXMuZkNvbnRlbnRBc3Npc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgcGFydCkgewotCQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOwotCQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldEFjdGlvbkJhcnMoKTsKLQkJCUlTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyID0gYWN0aW9uQmFycy5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQkJbWFuYWdlci5zZXRNZXNzYWdlKG51bGwpOwotCQkJbWFuYWdlci5zZXRFcnJvck1lc3NhZ2UobnVsbCk7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgeworICAgICAgICAgICAgc3VwZXIuY29udHJpYnV0ZVRvVG9vbEJhcih0b29sQmFyTWFuYWdlcik7CisgICAgICAgICAgICBpZiAoQWJzdHJhY3RQZGVGb3JtVGV4dEVkaXRvckNvbnRyaWJ1dG9yLnRoaXMuZkh5cGVybGlua0FjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdG9vbEJhck1hbmFnZXIuYWRkKEFic3RyYWN0UGRlRm9ybVRleHRFZGl0b3JDb250cmlidXRvci50aGlzLmZIeXBlcmxpbmtBY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAocGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSA/IChJVGV4dEVkaXRvcikgcGFydCA6IG51bGw7Ci0JCQlpZiAoZkNvcnJlY3Rpb25Bc3Npc3QgIT0gbnVsbCkgewotCQkJCWZDb3JyZWN0aW9uQXNzaXN0LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUVVJQ0tfQVNTSVNUKSk7Ci0JCQl9Ci0JCQlpZiAoZkh5cGVybGlua0FjdGlvbiAhPSBudWxsKSB7Ci0JCQkJZkh5cGVybGlua0FjdGlvbi5zZXRUZXh0RWRpdG9yKHRleHRFZGl0b3IpOwotCQkJfQotCQkJaWYgKGZGb3JtYXRBY3Rpb24gIT0gbnVsbCkgewotCQkJCWZGb3JtYXRBY3Rpb24uc2V0VGV4dEVkaXRvcih0ZXh0RWRpdG9yKTsKLQkJCX0KLQkJCWlmIChmQ29udGVudEFzc2lzdCAhPSBudWxsKSB7Ci0JCQkJZkNvbnRlbnRBc3Npc3Quc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCAiQ29udGVudEFzc2lzdCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsKKyAgICAgICAgICAgIHN1cGVyLnNldEFjdGl2ZUVkaXRvcihwYXJ0KTsKKyAgICAgICAgICAgIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7CisgICAgICAgICAgICBJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlciA9IGFjdGlvbkJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKKyAgICAgICAgICAgIG1hbmFnZXIuc2V0TWVzc2FnZShudWxsKTsKKyAgICAgICAgICAgIG1hbmFnZXIuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwogCi0JcHVibGljIEFic3RyYWN0UGRlRm9ybVRleHRFZGl0b3JDb250cmlidXRvcihTdHJpbmcgbWVudU5hbWUpIHsKLQkJc3VwZXIobWVudU5hbWUpOwotCQlmU291cmNlQ29udHJpYnV0b3IgPSBjcmVhdGVTb3VyY2VDb250cmlidXRvcigpOwotCQlpZiAoc3VwcG9ydHNDb3JyZWN0aW9uQXNzaXN0KCkpIHsKLQkJCWZDb3JyZWN0aW9uQXNzaXN0ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihQREVTb3VyY2VQYWdlLmdldEJ1bmRsZUZvckNvbnN0cnVjdGVkS2V5cygpLAotCQkJCQkiQ29ycmVjdGlvbkFzc2lzdFByb3Bvc2FsLiIpOyAvLyROT04tTkxTLTEkCi0JCQlmQ29ycmVjdGlvbkFzc2lzdC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLlFVSUNLX0FTU0lTVCk7Ci0JCX0KLQkJaWYgKHN1cHBvcnRzSHlwZXJsaW5raW5nKCkpIHsKLQkJCWZIeXBlcmxpbmtBY3Rpb24gPSBuZXcgU3ByaW5nSHlwZXJsaW5rQWN0aW9uKCk7Ci0JCQlmSHlwZXJsaW5rQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuT1BFTl9FRElUT1IpOwotCQl9Ci0JCWlmIChzdXBwb3J0c0Zvcm1hdEFjdGlvbigpKSB7Ci0JCQlmRm9ybWF0QWN0aW9uID0gbmV3IE1hbmlmZXN0Rm9ybWF0QWN0aW9uKCk7Ci0JCQlmRm9ybWF0QWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChQREVBY3Rpb25Db25zdGFudHMuREVGTl9GT1JNQVQpOwotCQl9Ci0JCWlmIChzdXBwb3J0c0NvbnRlbnRBc3Npc3QoKSkgewotCQkJZkNvbnRlbnRBc3Npc3QgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKFBERVNvdXJjZVBhZ2UuZ2V0QnVuZGxlRm9yQ29uc3RydWN0ZWRLZXlzKCksCi0JCQkJCSJDb250ZW50QXNzaXN0UHJvcG9zYWwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZDb250ZW50QXNzaXN0LnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuQ09OVEVOVF9BU1NJU1RfUFJPUE9TQUxTKTsKLQkJfQotCX0KKyAgICAgICAgICAgIElUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBwYXJ0IGluc3RhbmNlb2YgSVRleHRFZGl0b3IgPyAoSVRleHRFZGl0b3IpIHBhcnQgOiBudWxsOworICAgICAgICAgICAgaWYgKEFic3RyYWN0UGRlRm9ybVRleHRFZGl0b3JDb250cmlidXRvci50aGlzLmZDb3JyZWN0aW9uQXNzaXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBYnN0cmFjdFBkZUZvcm1UZXh0RWRpdG9yQ29udHJpYnV0b3IudGhpcy5mQ29ycmVjdGlvbkFzc2lzdC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlFVSUNLX0FTU0lTVCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEFic3RyYWN0UGRlRm9ybVRleHRFZGl0b3JDb250cmlidXRvci50aGlzLmZIeXBlcmxpbmtBY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFic3RyYWN0UGRlRm9ybVRleHRFZGl0b3JDb250cmlidXRvci50aGlzLmZIeXBlcmxpbmtBY3Rpb24uc2V0VGV4dEVkaXRvcih0ZXh0RWRpdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChBYnN0cmFjdFBkZUZvcm1UZXh0RWRpdG9yQ29udHJpYnV0b3IudGhpcy5mRm9ybWF0QWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBYnN0cmFjdFBkZUZvcm1UZXh0RWRpdG9yQ29udHJpYnV0b3IudGhpcy5mRm9ybWF0QWN0aW9uLnNldFRleHRFZGl0b3IodGV4dEVkaXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoQWJzdHJhY3RQZGVGb3JtVGV4dEVkaXRvckNvbnRyaWJ1dG9yLnRoaXMuZkNvbnRlbnRBc3Npc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFic3RyYWN0UGRlRm9ybVRleHRFZGl0b3JDb250cmlidXRvci50aGlzLmZDb250ZW50QXNzaXN0LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgIkNvbnRlbnRBc3Npc3QiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29ycmVjdGlvbkFzc2lzdCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KKyAgICBwdWJsaWMgQWJzdHJhY3RQZGVGb3JtVGV4dEVkaXRvckNvbnRyaWJ1dG9yKFN0cmluZyBtZW51TmFtZSkgeworICAgICAgICBzdXBlcihtZW51TmFtZSk7CisgICAgICAgIHRoaXMuZlNvdXJjZUNvbnRyaWJ1dG9yID0gY3JlYXRlU291cmNlQ29udHJpYnV0b3IoKTsKKyAgICAgICAgaWYgKHN1cHBvcnRzQ29ycmVjdGlvbkFzc2lzdCgpKSB7CisgICAgICAgICAgICB0aGlzLmZDb3JyZWN0aW9uQXNzaXN0ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihQREVTb3VyY2VQYWdlLmdldEJ1bmRsZUZvckNvbnN0cnVjdGVkS2V5cygpLCAiQ29ycmVjdGlvbkFzc2lzdFByb3Bvc2FsLiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB0aGlzLmZDb3JyZWN0aW9uQXNzaXN0LnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuUVVJQ0tfQVNTSVNUKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3VwcG9ydHNIeXBlcmxpbmtpbmcoKSkgeworICAgICAgICAgICAgdGhpcy5mSHlwZXJsaW5rQWN0aW9uID0gbmV3IFNwcmluZ0h5cGVybGlua0FjdGlvbigpOworICAgICAgICAgICAgdGhpcy5mSHlwZXJsaW5rQWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChJSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuT1BFTl9FRElUT1IpOworICAgICAgICB9CisgICAgICAgIGlmIChzdXBwb3J0c0Zvcm1hdEFjdGlvbigpKSB7CisgICAgICAgICAgICB0aGlzLmZGb3JtYXRBY3Rpb24gPSBuZXcgTWFuaWZlc3RGb3JtYXRBY3Rpb24oKTsKKyAgICAgICAgICAgIHRoaXMuZkZvcm1hdEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoUERFQWN0aW9uQ29uc3RhbnRzLkRFRk5fRk9STUFUKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3VwcG9ydHNDb250ZW50QXNzaXN0KCkpIHsKKyAgICAgICAgICAgIHRoaXMuZkNvbnRlbnRBc3Npc3QgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKFBERVNvdXJjZVBhZ2UuZ2V0QnVuZGxlRm9yQ29uc3RydWN0ZWRLZXlzKCksICJDb250ZW50QXNzaXN0UHJvcG9zYWwuIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHRoaXMuZkNvbnRlbnRBc3Npc3Quc2V0QWN0aW9uRGVmaW5pdGlvbklkKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5DT05URU5UX0FTU0lTVF9QUk9QT1NBTFMpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250ZW50QXNzaXN0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29ycmVjdGlvbkFzc2lzdCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRm9ybWF0QWN0aW9uKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29udGVudEFzc2lzdCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzSHlwZXJsaW5raW5nKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRm9ybWF0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBnZXRTb3VyY2VDb250cmlidXRvcigpIHsKLQkJcmV0dXJuIGZTb3VyY2VDb250cmlidXRvcjsKLQl9CisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNIeXBlcmxpbmtpbmcoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMpIHsKLQkJc3VwZXIuaW5pdChiYXJzKTsKLQkJZlNvdXJjZUFjdGlvbkJhcnMgPSBuZXcgU3ViQWN0aW9uQmFycyhiYXJzKTsKLQkJZlNvdXJjZUNvbnRyaWJ1dG9yLmluaXQoZlNvdXJjZUFjdGlvbkJhcnMpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldFNvdXJjZUNvbnRyaWJ1dG9yKCkgeworICAgICAgICByZXR1cm4gdGhpcy5mU291cmNlQ29udHJpYnV0b3I7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZlNvdXJjZUFjdGlvbkJhcnMuZGlzcG9zZSgpOwotCQlmU291cmNlQ29udHJpYnV0b3IuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycykgeworICAgICAgICBzdXBlci5pbml0KGJhcnMpOworICAgICAgICB0aGlzLmZTb3VyY2VBY3Rpb25CYXJzID0gbmV3IFN1YkFjdGlvbkJhcnMoYmFycyk7CisgICAgICAgIHRoaXMuZlNvdXJjZUNvbnRyaWJ1dG9yLmluaXQodGhpcy5mU291cmNlQWN0aW9uQmFycyk7CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlQWN0aW9uQmFyc0FjdGl2ZShib29sZWFuIGFjdGl2ZSkgewotCQlJQWN0aW9uQmFycyByb290QmFycyA9IGdldEFjdGlvbkJhcnMoKTsKLQkJcm9vdEJhcnMuY2xlYXJHbG9iYWxBY3Rpb25IYW5kbGVycygpOwotCQlyb290QmFycy51cGRhdGVBY3Rpb25CYXJzKCk7Ci0JCWlmIChhY3RpdmUpIHsKLQkJCWZTb3VyY2VBY3Rpb25CYXJzLmFjdGl2YXRlKCk7Ci0JCQlNYXAgaGFuZGxlcnMgPSBmU291cmNlQWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVycygpOwotCQkJaWYgKGhhbmRsZXJzICE9IG51bGwpIHsKLQkJCQlTZXQga2V5cyA9IGhhbmRsZXJzLmtleVNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQlyb290QmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKGlkLCAoSUFjdGlvbikgaGFuZGxlcnMuZ2V0KGlkKSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZlNvdXJjZUFjdGlvbkJhcnMuZGVhY3RpdmF0ZSgpOwotCQkJcmVnaXN0ZXJHbG9iYWxBY3Rpb25IYW5kbGVycygpOwotCQl9Ci0JCXJvb3RCYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoUERFQWN0aW9uQ29uc3RhbnRzLk9QRU4sIGFjdGl2ZSA/IGZIeXBlcmxpbmtBY3Rpb24gOiBudWxsKTsKLQkJcm9vdEJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihQREVBY3Rpb25Db25zdGFudHMuRk9STUFULCBhY3RpdmUgPyBmRm9ybWF0QWN0aW9uIDogbnVsbCk7Ci0JCS8vIFJlZ2lzdGVyIHRoZSByZXZlcnQgYWN0aW9uCi0JCXJvb3RCYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRVZFUlQuZ2V0SWQoKSwgZ2V0UmV2ZXJ0QWN0aW9uKCkpOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgIHRoaXMuZlNvdXJjZUFjdGlvbkJhcnMuZGlzcG9zZSgpOworICAgICAgICB0aGlzLmZTb3VyY2VDb250cmlidXRvci5kaXNwb3NlKCk7CisgICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKKyAgICB9CiAKLQkJcm9vdEJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2VBY3Rpb25CYXJzQWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7CisgICAgICAgIElBY3Rpb25CYXJzIHJvb3RCYXJzID0gZ2V0QWN0aW9uQmFycygpOworICAgICAgICByb290QmFycy5jbGVhckdsb2JhbEFjdGlvbkhhbmRsZXJzKCk7CisgICAgICAgIHJvb3RCYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKKyAgICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAgICAgdGhpcy5mU291cmNlQWN0aW9uQmFycy5hY3RpdmF0ZSgpOworICAgICAgICAgICAgTWFwIGhhbmRsZXJzID0gdGhpcy5mU291cmNlQWN0aW9uQmFycy5nZXRHbG9iYWxBY3Rpb25IYW5kbGVycygpOworICAgICAgICAgICAgaWYgKGhhbmRsZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTZXQga2V5cyA9IGhhbmRsZXJzLmtleVNldCgpOworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICByb290QmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKGlkLCAoSUFjdGlvbikgaGFuZGxlcnMuZ2V0KGlkKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5mU291cmNlQWN0aW9uQmFycy5kZWFjdGl2YXRlKCk7CisgICAgICAgICAgICByZWdpc3Rlckdsb2JhbEFjdGlvbkhhbmRsZXJzKCk7CisgICAgICAgIH0KKyAgICAgICAgcm9vdEJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihQREVBY3Rpb25Db25zdGFudHMuT1BFTiwgYWN0aXZlID8gdGhpcy5mSHlwZXJsaW5rQWN0aW9uIDogbnVsbCk7CisgICAgICAgIHJvb3RCYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoUERFQWN0aW9uQ29uc3RhbnRzLkZPUk1BVCwgYWN0aXZlID8gdGhpcy5mRm9ybWF0QWN0aW9uIDogbnVsbCk7CisgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSByZXZlcnQgYWN0aW9uCisgICAgICAgIHJvb3RCYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRVZFUlQuZ2V0SWQoKSwgZ2V0UmV2ZXJ0QWN0aW9uKCkpOwogCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJHbG9iYWxBY3Rpb25IYW5kbGVycygpIHsKLQkJcmVnaXN0ZXJHbG9iYWxBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7Ci0JCXJlZ2lzdGVyR2xvYmFsQWN0aW9uKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpKTsKLQkJcmVnaXN0ZXJHbG9iYWxBY3Rpb24oQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCkpOwotCQlyZWdpc3Rlckdsb2JhbEFjdGlvbihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpKTsKLQkJcmVnaXN0ZXJHbG9iYWxBY3Rpb24oQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpOwotCQlyZWdpc3Rlckdsb2JhbEFjdGlvbihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCkpOwotCQlyZWdpc3Rlckdsb2JhbEFjdGlvbihBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSk7Ci0JCXJlZ2lzdGVyR2xvYmFsQWN0aW9uKEFjdGlvbkZhY3RvcnkuRklORC5nZXRJZCgpKTsKLQl9CisgICAgICAgIHJvb3RCYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlckdsb2JhbEFjdGlvbihTdHJpbmcgaWQpIHsKLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRHbG9iYWxBY3Rpb24oaWQpOwotCQlnZXRBY3Rpb25CYXJzKCkuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihpZCwgYWN0aW9uKTsKLQl9CisgICAgcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJHbG9iYWxBY3Rpb25IYW5kbGVycygpIHsKKyAgICAgICAgcmVnaXN0ZXJHbG9iYWxBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7CisgICAgICAgIHJlZ2lzdGVyR2xvYmFsQWN0aW9uKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpKTsKKyAgICAgICAgcmVnaXN0ZXJHbG9iYWxBY3Rpb24oQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCkpOworICAgICAgICByZWdpc3Rlckdsb2JhbEFjdGlvbihBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpKTsKKyAgICAgICAgcmVnaXN0ZXJHbG9iYWxBY3Rpb24oQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpOworICAgICAgICByZWdpc3Rlckdsb2JhbEFjdGlvbihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCkpOworICAgICAgICByZWdpc3Rlckdsb2JhbEFjdGlvbihBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSk7CisgICAgICAgIHJlZ2lzdGVyR2xvYmFsQWN0aW9uKEFjdGlvbkZhY3RvcnkuRklORC5nZXRJZCgpKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYWdlKElFZGl0b3JQYXJ0IG5ld0VkaXRvcikgewotCQlpZiAoZkVkaXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCByZWdpc3Rlckdsb2JhbEFjdGlvbihTdHJpbmcgaWQpIHsKKyAgICAgICAgSUFjdGlvbiBhY3Rpb24gPSBnZXRHbG9iYWxBY3Rpb24oaWQpOworICAgICAgICBnZXRBY3Rpb25CYXJzKCkuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihpZCwgYWN0aW9uKTsKKyAgICB9CiAKLQkJSUZvcm1QYWdlIG9sZFBhZ2UgPSBmUGFnZTsKLQkJZlBhZ2UgPSBmRWRpdG9yLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQlpZiAoZlBhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIFVwZGF0ZSB0aGUgcXVpY2sgb3V0bGluZSBhY3Rpb24gdG8gdGhlIG5hdmlnYXRlIG1lbnUKLQkJdXBkYXRlUXVpY2tPdXRsaW5lTWVudUVudHJ5KCk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBuZXdFZGl0b3IpIHsKKyAgICAgICAgaWYgKHRoaXMuZkVkaXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotCQl1cGRhdGVBY3Rpb25zKCk7Ci0JCWlmIChvbGRQYWdlICE9IG51bGwgJiYgIW9sZFBhZ2UuaXNFZGl0b3IoKSAmJiAhZlBhZ2UuaXNFZGl0b3IoKSkgewotCQkJZ2V0QWN0aW9uQmFycygpLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJCXJldHVybjsKLQkJfQorICAgICAgICBJRm9ybVBhZ2Ugb2xkUGFnZSA9IHRoaXMuZlBhZ2U7CisgICAgICAgIHRoaXMuZlBhZ2UgPSB0aGlzLmZFZGl0b3IuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7CisgICAgICAgIGlmICh0aGlzLmZQYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBVcGRhdGUgdGhlIHF1aWNrIG91dGxpbmUgYWN0aW9uIHRvIHRoZSBuYXZpZ2F0ZSBtZW51CisgICAgICAgIHVwZGF0ZVF1aWNrT3V0bGluZU1lbnVFbnRyeSgpOwogCi0JCWJvb2xlYW4gaXNTb3VyY2VQYWdlID0gZlBhZ2UgaW5zdGFuY2VvZiBQREVTb3VyY2VQYWdlOwotCQlpZiAoaXNTb3VyY2VQYWdlICYmIGZQYWdlLmVxdWFscyhvbGRQYWdlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZTb3VyY2VDb250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IoZlBhZ2UpOwotCQlzZXRTb3VyY2VBY3Rpb25CYXJzQWN0aXZlKGlzU291cmNlUGFnZSk7Ci0JfQorICAgICAgICB1cGRhdGVBY3Rpb25zKCk7CisgICAgICAgIGlmIChvbGRQYWdlICE9IG51bGwgJiYgIW9sZFBhZ2UuaXNFZGl0b3IoKSAmJiAhdGhpcy5mUGFnZS5pc0VkaXRvcigpKSB7CisgICAgICAgICAgICBnZXRBY3Rpb25CYXJzKCkudXBkYXRlQWN0aW9uQmFycygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVRdWlja091dGxpbmVNZW51RW50cnkoKSB7Ci0JCS8vIEdldCB0aGUgbWFpbiBhY3Rpb24gYmFyCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRBY3Rpb25CYXJzKCk7Ci0JCUlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IGFjdGlvbkJhcnMuZ2V0TWVudU1hbmFnZXIoKTsKLQkJLy8gR2V0IHRoZSBuYXZpZ2F0ZSBtZW51Ci0JCUlNZW51TWFuYWdlciBuYXZpZ2F0ZU1lbnUgPSBtZW51TWFuYWdlci5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fTkFWSUdBVEUpOwotCQkvLyBFbnN1cmUgdGhlcmUgaXMgYSBuYXZpZ2F0ZSBtZW51Ci0JCWlmIChuYXZpZ2F0ZU1lbnUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIFJlbW92ZSB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgcXVpY2sgb3V0bGluZSBtZW51IGVudHJ5IC0gaWYKLQkJLy8gb25lIGV4aXN0cwotCQkvLyBQcmV2ZW50IGR1cGxpY2F0ZSBtZW51IGVudHJpZXMKLQkJLy8gUHJldmVudCB3cm9uZyBxdWljayBvdXRsaW5lIG1lbnUgZnJvbSBiZWluZyBicm91Z2h0IHVwIGZvciB0aGUgd3JvbmcKLQkJLy8gcGFnZQotCQluYXZpZ2F0ZU1lbnUucmVtb3ZlKFBERUFjdGlvbkNvbnN0YW50cy5DT01NQU5EX0lEX1FVSUNLX09VVExJTkUpOwotCQkvLyBFbnN1cmUgdGhlIGFjdGl2ZSBwYWdlIGlzIGEgc291cmNlIHBhZ2UKLQkJLy8gT25seSBhZGQgdGhlIHF1aWNrIG91dGxpbmUgbWVudSB0byB0aGUgc291cmNlIHBhZ2VzCi0JCWlmICgoZlBhZ2UgaW5zdGFuY2VvZiBQREVQcm9qZWN0aW9uU291cmNlUGFnZSkgPT0gZmFsc2UpIHsKLQkJCXJldHVybjsKLQkJfQotCQlQREVQcm9qZWN0aW9uU291cmNlUGFnZSBwYWdlID0gKFBERVByb2plY3Rpb25Tb3VyY2VQYWdlKSBmUGFnZTsKLQkJLy8gT25seSBhZGQgdGhlIGFjdGlvbiBpZiB0aGUgc291cmNlIHBhZ2Ugc3VwcG9ydHMgaXQKLQkJaWYgKHBhZ2UuaXNRdWlja091dGxpbmVFbmFibGVkKCkgPT0gZmFsc2UpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBHZXQgdGhlIGFwcHJvcHJpYXRlIHF1aWNrIG91dGxpbmUgYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWN0aXZlCi0JCS8vIHNvdXJjZSBwYWdlCi0JCUlBY3Rpb24gcXVpY2tPdXRsaW5lQWN0aW9uID0gcGFnZS5nZXRBY3Rpb24oUERFQWN0aW9uQ29uc3RhbnRzLkNPTU1BTkRfSURfUVVJQ0tfT1VUTElORSk7Ci0JCS8vIEVuc3VyZSBpdCBpcyBkZWZpbmVkCi0JCWlmIChxdWlja091dGxpbmVBY3Rpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIEFkZCB0aGUgcXVpY2sgb3V0bGluZSBhY3Rpb24gYWZ0ZXIgdGhlICJTaG93IEluIiBtZW51IGNvbnRyaWJ1dGVkCi0JCS8vIGJ5IEpEVAotCQkvLyBUaGlzIGNvdWxkIGJyZWFrIGlmIEpEVCBjaGFuZ2VzIHRoZSAiU2hvdyBJbiIgbWVudSBJRAotCQl0cnkgewotCQkJbmF2aWdhdGVNZW51Lmluc2VydEFmdGVyKCJzaG93SW4iLCBxdWlja091dGxpbmVBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUKLQkJfQotCX0KKyAgICAgICAgYm9vbGVhbiBpc1NvdXJjZVBhZ2UgPSB0aGlzLmZQYWdlIGluc3RhbmNlb2YgUERFU291cmNlUGFnZTsKKyAgICAgICAgaWYgKGlzU291cmNlUGFnZSAmJiB0aGlzLmZQYWdlLmVxdWFscyhvbGRQYWdlKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRoaXMuZlNvdXJjZUNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcih0aGlzLmZQYWdlKTsKKyAgICAgICAgc2V0U291cmNlQWN0aW9uQmFyc0FjdGl2ZShpc1NvdXJjZVBhZ2UpOworICAgIH0KIAotCXByb3RlY3RlZCBUZXh0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IgY3JlYXRlU291cmNlQ29udHJpYnV0b3IoKSB7Ci0JCXJldHVybiBuZXcgUERFVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yKCk7Ci0JfQorICAgIC8qKgorICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlUXVpY2tPdXRsaW5lTWVudUVudHJ5KCkgeworICAgICAgICAvLyBHZXQgdGhlIG1haW4gYWN0aW9uIGJhcgorICAgICAgICBJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0QWN0aW9uQmFycygpOworICAgICAgICBJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIgPSBhY3Rpb25CYXJzLmdldE1lbnVNYW5hZ2VyKCk7CisgICAgICAgIC8vIEdldCB0aGUgbmF2aWdhdGUgbWVudQorICAgICAgICBJTWVudU1hbmFnZXIgbmF2aWdhdGVNZW51ID0gbWVudU1hbmFnZXIuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX05BVklHQVRFKTsKKyAgICAgICAgLy8gRW5zdXJlIHRoZXJlIGlzIGEgbmF2aWdhdGUgbWVudQorICAgICAgICBpZiAobmF2aWdhdGVNZW51ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBSZW1vdmUgdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIHF1aWNrIG91dGxpbmUgbWVudSBlbnRyeSAtIGlmCisgICAgICAgIC8vIG9uZSBleGlzdHMKKyAgICAgICAgLy8gUHJldmVudCBkdXBsaWNhdGUgbWVudSBlbnRyaWVzCisgICAgICAgIC8vIFByZXZlbnQgd3JvbmcgcXVpY2sgb3V0bGluZSBtZW51IGZyb20gYmVpbmcgYnJvdWdodCB1cCBmb3IgdGhlIHdyb25nCisgICAgICAgIC8vIHBhZ2UKKyAgICAgICAgbmF2aWdhdGVNZW51LnJlbW92ZShQREVBY3Rpb25Db25zdGFudHMuQ09NTUFORF9JRF9RVUlDS19PVVRMSU5FKTsKKyAgICAgICAgLy8gRW5zdXJlIHRoZSBhY3RpdmUgcGFnZSBpcyBhIHNvdXJjZSBwYWdlCisgICAgICAgIC8vIE9ubHkgYWRkIHRoZSBxdWljayBvdXRsaW5lIG1lbnUgdG8gdGhlIHNvdXJjZSBwYWdlcworICAgICAgICBpZiAodGhpcy5mUGFnZSBpbnN0YW5jZW9mIFBERVByb2plY3Rpb25Tb3VyY2VQYWdlID09IGZhbHNlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgUERFUHJvamVjdGlvblNvdXJjZVBhZ2UgcGFnZSA9IChQREVQcm9qZWN0aW9uU291cmNlUGFnZSkgdGhpcy5mUGFnZTsKKyAgICAgICAgLy8gT25seSBhZGQgdGhlIGFjdGlvbiBpZiB0aGUgc291cmNlIHBhZ2Ugc3VwcG9ydHMgaXQKKyAgICAgICAgaWYgKHBhZ2UuaXNRdWlja091dGxpbmVFbmFibGVkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBHZXQgdGhlIGFwcHJvcHJpYXRlIHF1aWNrIG91dGxpbmUgYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWN0aXZlCisgICAgICAgIC8vIHNvdXJjZSBwYWdlCisgICAgICAgIElBY3Rpb24gcXVpY2tPdXRsaW5lQWN0aW9uID0gcGFnZS5nZXRBY3Rpb24oUERFQWN0aW9uQ29uc3RhbnRzLkNPTU1BTkRfSURfUVVJQ0tfT1VUTElORSk7CisgICAgICAgIC8vIEVuc3VyZSBpdCBpcyBkZWZpbmVkCisgICAgICAgIGlmIChxdWlja091dGxpbmVBY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIEFkZCB0aGUgcXVpY2sgb3V0bGluZSBhY3Rpb24gYWZ0ZXIgdGhlICJTaG93IEluIiBtZW51IGNvbnRyaWJ1dGVkCisgICAgICAgIC8vIGJ5IEpEVAorICAgICAgICAvLyBUaGlzIGNvdWxkIGJyZWFrIGlmIEpEVCBjaGFuZ2VzIHRoZSAiU2hvdyBJbiIgbWVudSBJRAorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmF2aWdhdGVNZW51Lmluc2VydEFmdGVyKCJzaG93SW4iLCBxdWlja091dGxpbmVBY3Rpb24pOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorICAgIH0KIAotCXByb3RlY3RlZCBIeXBlcmxpbmtBY3Rpb24gZ2V0SHlwZXJsaW5rQWN0aW9uKCkgewotCQlyZXR1cm4gZkh5cGVybGlua0FjdGlvbjsKLQl9CisgICAgcHJvdGVjdGVkIFRleHRFZGl0b3JBY3Rpb25Db250cmlidXRvciBjcmVhdGVTb3VyY2VDb250cmlidXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQREVUZXh0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IoKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgTWFuaWZlc3RGb3JtYXRBY3Rpb24gZ2V0Rm9ybWF0QWN0aW9uKCkgewotCQlyZXR1cm4gZkZvcm1hdEFjdGlvbjsKLQl9CisgICAgcHJvdGVjdGVkIEh5cGVybGlua0FjdGlvbiBnZXRIeXBlcmxpbmtBY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZIeXBlcmxpbmtBY3Rpb247CisgICAgfQogCi0JY2xhc3MgU3ByaW5nSHlwZXJsaW5rQWN0aW9uIGV4dGVuZHMgSHlwZXJsaW5rQWN0aW9uIHsKKyAgICBwcm90ZWN0ZWQgTWFuaWZlc3RGb3JtYXRBY3Rpb24gZ2V0Rm9ybWF0QWN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5mRm9ybWF0QWN0aW9uOworICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZ2VuZXJhdGVBY3Rpb25UZXh0KCkgewotCQkJU3RyaW5nIHRleHQgPSBQREVVSU1lc3NhZ2VzLkh5cGVybGlua0FjdGlvbk5vTGlua3NBdmFpbGFibGU7Ci0JCQlpZiAoZkxpbmsgaW5zdGFuY2VvZiBCdW5kbGVIeXBlcmxpbmspIHsKLQkJCQl0ZXh0ID0gUERFVUlNZXNzYWdlcy5IeXBlcmxpbmtBY3Rpb25PcGVuUGFja2FnZTsKLQkJCQlzZXRUZXh0KHRleHQpOwotCQkJCXNldFRvb2xUaXBUZXh0KHRleHQpOwotCQkJfSBlbHNlIHsKLQkJCQlzdXBlci5nZW5lcmF0ZUFjdGlvblRleHQoKTsKLQkJCX0KLQkJfQotCX0KKyAgICBjbGFzcyBTcHJpbmdIeXBlcmxpbmtBY3Rpb24gZXh0ZW5kcyBIeXBlcmxpbmtBY3Rpb24geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZUFjdGlvblRleHQoKSB7CisgICAgICAgICAgICBTdHJpbmcgdGV4dCA9IFBERVVJTWVzc2FnZXMuSHlwZXJsaW5rQWN0aW9uTm9MaW5rc0F2YWlsYWJsZTsKKyAgICAgICAgICAgIGlmICh0aGlzLmZMaW5rIGluc3RhbmNlb2YgQnVuZGxlSHlwZXJsaW5rKSB7CisgICAgICAgICAgICAgICAgdGV4dCA9IFBERVVJTWVzc2FnZXMuSHlwZXJsaW5rQWN0aW9uT3BlblBhY2thZ2U7CisgICAgICAgICAgICAgICAgc2V0VGV4dCh0ZXh0KTsKKyAgICAgICAgICAgICAgICBzZXRUb29sVGlwVGV4dCh0ZXh0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3VwZXIuZ2VuZXJhdGVBY3Rpb25UZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQWJzdHJhY3RQZGVHZW5lcmFsSW5mb1NlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQWJzdHJhY3RQZGVHZW5lcmFsSW5mb1NlY3Rpb24uamF2YQppbmRleCBlZWM0OTI4Li5mOTg1M2FiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0Fic3RyYWN0UGRlR2VuZXJhbEluZm9TZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9BYnN0cmFjdFBkZUdlbmVyYWxJbmZvU2VjdGlvbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CkBAIC00NSwzNzEgKzQ2LDM3OCBAQAogICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyBlc3NlbnRpYWxseSBhIGNvcHkgb2YgR2VuZXJhbEluZm9TZWN0aW9uIGZyb20gUERFIHdpdGggdmlzaWJpbGl0eSBpbmNyZWFzZWQgdG8gInByb3RlY3RlZCIgYXMKICAqIHJlcXVpcmVkIHRvIHJlLXVzZSB0aGlzIGNvZGUgd2l0aG91dCB1bm5lY2Vzc2FyeSBjb3B5aW5nIGludG8gc3ViY2xhc3Nlcy4gVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIGZ1cnRoZXIgbW9kaWZpZWQKICAqIHRvIGtlZXAgdGhlIHNlcGFyYXRpb24gYmV0d2VlbiBQREUgYW5kIG5vbi1QREUgY29kZS4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQZGVHZW5lcmFsSW5mb1NlY3Rpb24gZXh0ZW5kcyBQREVTZWN0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUExBVEZPUk1fRklMVEVSID0gIkVjbGlwc2UtUGxhdGZvcm1GaWx0ZXIiOyAvLyROT04tTkxTLTEkCiAKLQlwcm90ZWN0ZWQgRm9ybUVudHJ5IGZJZEVudHJ5OworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBQTEFURk9STV9GSUxURVIgPSAiRWNsaXBzZS1QbGF0Zm9ybUZpbHRlciI7IC8vJE5PTi1OTFMtMSQKIAotCXByb3RlY3RlZCBGb3JtRW50cnkgZlZlcnNpb25FbnRyeTsKKyAgICBwcm90ZWN0ZWQgRm9ybUVudHJ5IGZJZEVudHJ5OwogCi0JcHJvdGVjdGVkIEZvcm1FbnRyeSBmTmFtZUVudHJ5OworICAgIHByb3RlY3RlZCBGb3JtRW50cnkgZlZlcnNpb25FbnRyeTsKIAotCXByb3RlY3RlZCBGb3JtRW50cnkgZlByb3ZpZGVyRW50cnk7CisgICAgcHJvdGVjdGVkIEZvcm1FbnRyeSBmTmFtZUVudHJ5OwogCi0JcHJvdGVjdGVkIEZvcm1FbnRyeSBmUGxhdGZvcm1GaWx0ZXJFbnRyeTsKKyAgICBwcm90ZWN0ZWQgRm9ybUVudHJ5IGZQcm92aWRlckVudHJ5OwogCi0JcHJvdGVjdGVkIFRleHRWYWxpZGF0b3IgZklkRW50cnlWYWxpZGF0b3I7CisgICAgcHJvdGVjdGVkIEZvcm1FbnRyeSBmUGxhdGZvcm1GaWx0ZXJFbnRyeTsKIAotCXByb3RlY3RlZCBUZXh0VmFsaWRhdG9yIGZWZXJzaW9uRW50cnlWYWxpZGF0b3I7CisgICAgcHJvdGVjdGVkIFRleHRWYWxpZGF0b3IgZklkRW50cnlWYWxpZGF0b3I7CiAKLQlwcm90ZWN0ZWQgVGV4dFZhbGlkYXRvciBmTmFtZUVudHJ5VmFsaWRhdG9yOworICAgIHByb3RlY3RlZCBUZXh0VmFsaWRhdG9yIGZWZXJzaW9uRW50cnlWYWxpZGF0b3I7CiAKLQlwcm90ZWN0ZWQgVGV4dFZhbGlkYXRvciBmUHJvdmlkZXJFbnRyeVZhbGlkYXRvcjsKKyAgICBwcm90ZWN0ZWQgVGV4dFZhbGlkYXRvciBmTmFtZUVudHJ5VmFsaWRhdG9yOwogCi0JcHJvdGVjdGVkIFRleHRWYWxpZGF0b3IgZlBsYXRmb3JtRW50cnlWYWxpZGF0b3I7CisgICAgcHJvdGVjdGVkIFRleHRWYWxpZGF0b3IgZlByb3ZpZGVyRW50cnlWYWxpZGF0b3I7CiAKLQlwcml2YXRlIElQbHVnaW5Nb2RlbEJhc2UgZk1vZGVsOworICAgIHByb3RlY3RlZCBUZXh0VmFsaWRhdG9yIGZQbGF0Zm9ybUVudHJ5VmFsaWRhdG9yOwogCi0JcHVibGljIEFic3RyYWN0UGRlR2VuZXJhbEluZm9TZWN0aW9uKFBERUZvcm1QYWdlIHBhZ2UsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFnZSwgcGFyZW50LCBTZWN0aW9uLkRFU0NSSVBUSU9OKTsKLQkJY3JlYXRlQ2xpZW50KGdldFNlY3Rpb24oKSwgcGFnZS5nZXRFZGl0b3IoKS5nZXRUb29sa2l0KCkpOwotCX0KKyAgICBwcml2YXRlIElQbHVnaW5Nb2RlbEJhc2UgZk1vZGVsOwogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwudWkubmV3ZWRpdG9yLlBERVNlY3Rpb24jY3JlYXRlQ2xpZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbiwKLQkgKiBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0KQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNsaWVudChTZWN0aW9uIHNlY3Rpb24sIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc2VjdGlvbi5zZXRUZXh0KFBERVVJTWVzc2FnZXMuTWFuaWZlc3RFZGl0b3JfUGx1Z2luU3BlY1NlY3Rpb25fdGl0bGUpOwotCQlzZWN0aW9uLnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVDbGVhclRhYmxlV3JhcExheW91dChmYWxzZSwgMSkpOwotCQlUYWJsZVdyYXBEYXRhIGRhdGEgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICBwdWJsaWMgQWJzdHJhY3RQZGVHZW5lcmFsSW5mb1NlY3Rpb24oUERFRm9ybVBhZ2UgcGFnZSwgQ29tcG9zaXRlIHBhcmVudCkgeworICAgICAgICBzdXBlcihwYWdlLCBwYXJlbnQsIFNlY3Rpb24uREVTQ1JJUFRJT04pOworICAgICAgICBjcmVhdGVDbGllbnQoZ2V0U2VjdGlvbigpLCBwYWdlLmdldEVkaXRvcigpLmdldFRvb2xraXQoKSk7CisgICAgfQogCi0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlDb21wb3NpdGUgY2xpZW50ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCWNsaWVudC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlU2VjdGlvbkNsaWVudFRhYmxlV3JhcExheW91dChmYWxzZSwgMykpOwotCQlzZWN0aW9uLnNldENsaWVudChjbGllbnQpOworICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwudWkubmV3ZWRpdG9yLlBERVNlY3Rpb24jY3JlYXRlQ2xpZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbiwKKyAgICAgKiBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0KQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNsaWVudChTZWN0aW9uIHNlY3Rpb24sIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKKyAgICAgICAgc2VjdGlvbi5zZXRUZXh0KFBERVVJTWVzc2FnZXMuTWFuaWZlc3RFZGl0b3JfUGx1Z2luU3BlY1NlY3Rpb25fdGl0bGUpOworICAgICAgICBzZWN0aW9uLnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVDbGVhclRhYmxlV3JhcExheW91dChmYWxzZSwgMSkpOworICAgICAgICBUYWJsZVdyYXBEYXRhIGRhdGEgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7CisgICAgICAgIHNlY3Rpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKIAotCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWNyZWF0ZUlERW50cnkoY2xpZW50LCB0b29sa2l0LCBhY3Rpb25CYXJzKTsKLQkJY3JlYXRlVmVyc2lvbkVudHJ5KGNsaWVudCwgdG9vbGtpdCwgYWN0aW9uQmFycyk7Ci0JCWNyZWF0ZU5hbWVFbnRyeShjbGllbnQsIHRvb2xraXQsIGFjdGlvbkJhcnMpOwotCQljcmVhdGVQcm92aWRlckVudHJ5KGNsaWVudCwgdG9vbGtpdCwgYWN0aW9uQmFycyk7Ci0JCWlmIChpc0J1bmRsZSgpICYmICgoTWFuaWZlc3RFZGl0b3IpIGdldFBhZ2UoKS5nZXRFZGl0b3IoKSkuaXNFcXVpbm94KCkpIHsKLQkJCWNyZWF0ZVBsYXRmb3JtRmlsdGVyRW50cnkoY2xpZW50LCB0b29sa2l0LCBhY3Rpb25CYXJzKTsKLQkJfQotCQljcmVhdGVTcGVjaWZpY0NvbnRyb2xzKGNsaWVudCwgdG9vbGtpdCwgYWN0aW9uQmFycyk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNsaWVudCk7CisgICAgICAgIHNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkpOworICAgICAgICBDb21wb3NpdGUgY2xpZW50ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7CisgICAgICAgIGNsaWVudC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlU2VjdGlvbkNsaWVudFRhYmxlV3JhcExheW91dChmYWxzZSwgMykpOworICAgICAgICBzZWN0aW9uLnNldENsaWVudChjbGllbnQpOwogCi0JCWFkZExpc3RlbmVycygpOwotCX0KKyAgICAgICAgSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpOworICAgICAgICBjcmVhdGVJREVudHJ5KGNsaWVudCwgdG9vbGtpdCwgYWN0aW9uQmFycyk7CisgICAgICAgIGNyZWF0ZVZlcnNpb25FbnRyeShjbGllbnQsIHRvb2xraXQsIGFjdGlvbkJhcnMpOworICAgICAgICBjcmVhdGVOYW1lRW50cnkoY2xpZW50LCB0b29sa2l0LCBhY3Rpb25CYXJzKTsKKyAgICAgICAgY3JlYXRlUHJvdmlkZXJFbnRyeShjbGllbnQsIHRvb2xraXQsIGFjdGlvbkJhcnMpOworICAgICAgICBpZiAoaXNCdW5kbGUoKSAmJiAoKE1hbmlmZXN0RWRpdG9yKSBnZXRQYWdlKCkuZ2V0RWRpdG9yKCkpLmlzRXF1aW5veCgpKSB7CisgICAgICAgICAgICBjcmVhdGVQbGF0Zm9ybUZpbHRlckVudHJ5KGNsaWVudCwgdG9vbGtpdCwgYWN0aW9uQmFycyk7CisgICAgICAgIH0KKyAgICAgICAgY3JlYXRlU3BlY2lmaWNDb250cm9scyhjbGllbnQsIHRvb2xraXQsIGFjdGlvbkJhcnMpOworICAgICAgICB0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihjbGllbnQpOwogCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKKyAgICAgICAgYWRkTGlzdGVuZXJzKCk7CisgICAgfQogCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlU3BlY2lmaWNDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBJQWN0aW9uQmFycyBhY3Rpb25CYXJzKTsKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpOwogCi0JcHJvdGVjdGVkIElQbHVnaW5CYXNlIGdldFBsdWdpbkJhc2UoKSB7Ci0JCUlCYXNlTW9kZWwgbW9kZWwgPSBnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuZ2V0QWdncmVnYXRlTW9kZWwoKTsKLQkJcmV0dXJuICgoSVBsdWdpbk1vZGVsQmFzZSkgbW9kZWwpLmdldFBsdWdpbkJhc2UoKTsKLQl9CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlU3BlY2lmaWNDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBJQWN0aW9uQmFycyBhY3Rpb25CYXJzKTsKIAotCS8qKgotCSAqIE5vdCB1c2luZyB0aGUgYWdncmVnYXRlIG1vZGVsIGZyb20gdGhlIGZvcm0gZWRpdG9yIGJlY2F1c2UgaXQgaXMgYSBkaWZmZXJlbnQgbW9kZWwgaW5zdGFuY2UgZnJvbSB0aGUgb25lIHVzZWQgYnkKLQkgKiB0aGUgYnVuZGxlIGVycm9yIHJlcG9ydGVyLiBUaGluZ3MgZ2V0IG91dCBvZiBzeW5jIGJldHdlZW4gdGhlIGZvcm0gdmFsaWRhdG9yIGFuZCBzb3VyY2UgdmFsaWRhdG9yCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJUGx1Z2luTW9kZWxCYXNlIGdldE1vZGVsQmFzZSgpIHsKLQkJLy8gRmluZCB0aGUgbW9kZWwgb25seSBvbiB0aGUgZmlyc3QgY2FsbAotCQlpZiAoZk1vZGVsID09IG51bGwpIHsKLQkJCWZNb2RlbCA9IFBsdWdpblJlZ2lzdHJ5LmZpbmRNb2RlbChnZXRQcm9qZWN0KCkpOwotCQl9Ci0JCXJldHVybiBmTW9kZWw7Ci0JfQorICAgIHByb3RlY3RlZCBJUGx1Z2luQmFzZSBnZXRQbHVnaW5CYXNlKCkgeworICAgICAgICBJQmFzZU1vZGVsIG1vZGVsID0gZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLmdldEFnZ3JlZ2F0ZU1vZGVsKCk7CisgICAgICAgIHJldHVybiAoKElQbHVnaW5Nb2RlbEJhc2UpIG1vZGVsKS5nZXRQbHVnaW5CYXNlKCk7CisgICAgfQogCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNCdW5kbGUoKSB7Ci0JCXJldHVybiBnZXRCdW5kbGVDb250ZXh0KCkgIT0gbnVsbDsKLQl9CisgICAgLyoqCisgICAgICogTm90IHVzaW5nIHRoZSBhZ2dyZWdhdGUgbW9kZWwgZnJvbSB0aGUgZm9ybSBlZGl0b3IgYmVjYXVzZSBpdCBpcyBhIGRpZmZlcmVudCBtb2RlbCBpbnN0YW5jZSBmcm9tIHRoZSBvbmUgdXNlZCBieQorICAgICAqIHRoZSBidW5kbGUgZXJyb3IgcmVwb3J0ZXIuIFRoaW5ncyBnZXQgb3V0IG9mIHN5bmMgYmV0d2VlbiB0aGUgZm9ybSB2YWxpZGF0b3IgYW5kIHNvdXJjZSB2YWxpZGF0b3IKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSVBsdWdpbk1vZGVsQmFzZSBnZXRNb2RlbEJhc2UoKSB7CisgICAgICAgIC8vIEZpbmQgdGhlIG1vZGVsIG9ubHkgb24gdGhlIGZpcnN0IGNhbGwKKyAgICAgICAgaWYgKHRoaXMuZk1vZGVsID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZk1vZGVsID0gUGx1Z2luUmVnaXN0cnkuZmluZE1vZGVsKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZk1vZGVsOworICAgIH0KIAotCXByaXZhdGUgQnVuZGxlSW5wdXRDb250ZXh0IGdldEJ1bmRsZUNvbnRleHQoKSB7Ci0JCUlucHV0Q29udGV4dE1hbmFnZXIgbWFuYWdlciA9IGdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS5nZXRDb250ZXh0TWFuYWdlcigpOwotCQlyZXR1cm4gKEJ1bmRsZUlucHV0Q29udGV4dCkgbWFuYWdlci5maW5kQ29udGV4dChCdW5kbGVJbnB1dENvbnRleHQuQ09OVEVYVF9JRCk7Ci0JfQorICAgIHByb3RlY3RlZCBib29sZWFuIGlzQnVuZGxlKCkgeworICAgICAgICByZXR1cm4gZ2V0QnVuZGxlQ29udGV4dCgpICE9IG51bGw7CisgICAgfQogCi0JcHJvdGVjdGVkIElCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlCdW5kbGVJbnB1dENvbnRleHQgY29udGV4dCA9IGdldEJ1bmRsZUNvbnRleHQoKTsKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJSUJ1bmRsZU1vZGVsIG1vZGVsID0gKElCdW5kbGVNb2RlbCkgY29udGV4dC5nZXRNb2RlbCgpOwotCQkJcmV0dXJuIG1vZGVsLmdldEJ1bmRsZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwcml2YXRlIEJ1bmRsZUlucHV0Q29udGV4dCBnZXRCdW5kbGVDb250ZXh0KCkgeworICAgICAgICBJbnB1dENvbnRleHRNYW5hZ2VyIG1hbmFnZXIgPSBnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuZ2V0Q29udGV4dE1hbmFnZXIoKTsKKyAgICAgICAgcmV0dXJuIChCdW5kbGVJbnB1dENvbnRleHQpIG1hbmFnZXIuZmluZENvbnRleHQoQnVuZGxlSW5wdXRDb250ZXh0LkNPTlRFWFRfSUQpOworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUlERW50cnkoQ29tcG9zaXRlIGNsaWVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlmSWRFbnRyeSA9IG5ldyBGb3JtRW50cnkoY2xpZW50LCB0b29sa2l0LCBQREVVSU1lc3NhZ2VzLkdlbmVyYWxJbmZvU2VjdGlvbl9pZCwgbnVsbCwgZmFsc2UpOwotCQlmSWRFbnRyeS5zZXRGb3JtRW50cnlMaXN0ZW5lcihuZXcgRm9ybUVudHJ5QWRhcHRlcih0aGlzLCBhY3Rpb25CYXJzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRleHRWYWx1ZUNoYW5nZWQoRm9ybUVudHJ5IGVudHJ5KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0UGx1Z2luQmFzZSgpLnNldElkKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlQREVQbHVnaW4ubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZJZEVudHJ5LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7Ci0JCS8vIENyZWF0ZSB2YWxpZGF0b3IKLQkJZklkRW50cnlWYWxpZGF0b3IgPSBuZXcgVGV4dFZhbGlkYXRvcihnZXRNYW5hZ2VkRm9ybSgpLCBmSWRFbnRyeS5nZXRUZXh0KCksIGdldFByb2plY3QoKSwgdHJ1ZSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUNvbnRyb2woKSB7Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSWRFbnRyeSgpOwotCQkJfQotCQl9OwotCX0KKyAgICBwcm90ZWN0ZWQgSUJ1bmRsZSBnZXRCdW5kbGUoKSB7CisgICAgICAgIEJ1bmRsZUlucHV0Q29udGV4dCBjb250ZXh0ID0gZ2V0QnVuZGxlQ29udGV4dCgpOworICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBJQnVuZGxlTW9kZWwgbW9kZWwgPSAoSUJ1bmRsZU1vZGVsKSBjb250ZXh0LmdldE1vZGVsKCk7CisgICAgICAgICAgICByZXR1cm4gbW9kZWwuZ2V0QnVuZGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZUlkRW50cnkoKSB7Ci0JCS8vIFZhbHVlIG11c3QgYmUgc3BlY2lmaWVkCi0JCXJldHVybiBDb250cm9sVmFsaWRhdGlvblV0aWxpdHkudmFsaWRhdGVSZXF1aXJlZEZpZWxkKGZJZEVudHJ5LmdldFRleHQoKS5nZXRUZXh0KCksIGZJZEVudHJ5VmFsaWRhdG9yLAotCQkJCUlNZXNzYWdlUHJvdmlkZXIuRVJST1IpOwotCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVJREVudHJ5KENvbXBvc2l0ZSBjbGllbnQsIEZvcm1Ub29sa2l0IHRvb2xraXQsIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKyAgICAgICAgdGhpcy5mSWRFbnRyeSA9IG5ldyBGb3JtRW50cnkoY2xpZW50LCB0b29sa2l0LCBQREVVSU1lc3NhZ2VzLkdlbmVyYWxJbmZvU2VjdGlvbl9pZCwgbnVsbCwgZmFsc2UpOworICAgICAgICB0aGlzLmZJZEVudHJ5LnNldEZvcm1FbnRyeUxpc3RlbmVyKG5ldyBGb3JtRW50cnlBZGFwdGVyKHRoaXMsIGFjdGlvbkJhcnMpIHsKIAotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVZlcnNpb25FbnRyeShDb21wb3NpdGUgY2xpZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWZWZXJzaW9uRW50cnkgPSBuZXcgRm9ybUVudHJ5KGNsaWVudCwgdG9vbGtpdCwgUERFVUlNZXNzYWdlcy5HZW5lcmFsSW5mb1NlY3Rpb25fdmVyc2lvbiwgbnVsbCwgZmFsc2UpOwotCQlmVmVyc2lvbkVudHJ5LnNldEZvcm1FbnRyeUxpc3RlbmVyKG5ldyBGb3JtRW50cnlBZGFwdGVyKHRoaXMsIGFjdGlvbkJhcnMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdGV4dFZhbHVlQ2hhbmdlZChGb3JtRW50cnkgZW50cnkpIHsKLQkJCQl0cnkgewotCQkJCQlnZXRQbHVnaW5CYXNlKCkuc2V0VmVyc2lvbihlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJUERFUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlmVmVyc2lvbkVudHJ5LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7Ci0JCS8vIENyZWF0ZSB2YWxpZGF0b3IKLQkJZlZlcnNpb25FbnRyeVZhbGlkYXRvciA9IG5ldyBUZXh0VmFsaWRhdG9yKGdldE1hbmFnZWRGb3JtKCksIGZWZXJzaW9uRW50cnkuZ2V0VGV4dCgpLCBnZXRQcm9qZWN0KCksIHRydWUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVDb250cm9sKCkgewotCQkJCXJldHVybiB2YWxpZGF0ZVZlcnNpb25FbnRyeSgpOwotCQkJfQotCQl9OwotCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdGV4dFZhbHVlQ2hhbmdlZChGb3JtRW50cnkgZW50cnkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBnZXRQbHVnaW5CYXNlKCkuc2V0SWQoZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFBERVBsdWdpbi5sb2dFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdGhpcy5mSWRFbnRyeS5zZXRFZGl0YWJsZShpc0VkaXRhYmxlKCkpOworICAgICAgICAvLyBDcmVhdGUgdmFsaWRhdG9yCisgICAgICAgIHRoaXMuZklkRW50cnlWYWxpZGF0b3IgPSBuZXcgVGV4dFZhbGlkYXRvcihnZXRNYW5hZ2VkRm9ybSgpLCB0aGlzLmZJZEVudHJ5LmdldFRleHQoKSwgZ2V0UHJvamVjdCgpLCB0cnVlKSB7CiAKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlVmVyc2lvbkVudHJ5KCkgewotCQkvLyBWYWx1ZSBtdXN0IGJlIHNwZWNpZmllZAotCQlpZiAoQ29udHJvbFZhbGlkYXRpb25VdGlsaXR5LnZhbGlkYXRlUmVxdWlyZWRGaWVsZChmVmVyc2lvbkVudHJ5LmdldFRleHQoKS5nZXRUZXh0KCksIGZWZXJzaW9uRW50cnlWYWxpZGF0b3IsCi0JCQkJSU1lc3NhZ2VQcm92aWRlci5FUlJPUikgPT0gZmFsc2UpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBWYWx1ZSBtdXN0IGJlIGEgdmFsaWQgdmVyc2lvbgotCQlyZXR1cm4gQ29udHJvbFZhbGlkYXRpb25VdGlsaXR5LnZhbGlkYXRlVmVyc2lvbkZpZWxkKGZWZXJzaW9uRW50cnkuZ2V0VGV4dCgpLmdldFRleHQoKSwgZlZlcnNpb25FbnRyeVZhbGlkYXRvcik7Ci0JfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUNvbnRyb2woKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlSWRFbnRyeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5hbWVFbnRyeShDb21wb3NpdGUgY2xpZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWZOYW1lRW50cnkgPSBuZXcgRm9ybUVudHJ5KGNsaWVudCwgdG9vbGtpdCwgUERFVUlNZXNzYWdlcy5HZW5lcmFsSW5mb1NlY3Rpb25fbmFtZSwgbnVsbCwgZmFsc2UpOwotCQlmTmFtZUVudHJ5LnNldEZvcm1FbnRyeUxpc3RlbmVyKG5ldyBGb3JtRW50cnlBZGFwdGVyKHRoaXMsIGFjdGlvbkJhcnMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdGV4dFZhbHVlQ2hhbmdlZChGb3JtRW50cnkgZW50cnkpIHsKLQkJCQl0cnkgewotCQkJCQlnZXRQbHVnaW5CYXNlKCkuc2V0TmFtZShlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJUERFUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlmTmFtZUVudHJ5LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7Ci0JCS8vIENyZWF0ZSB2YWxpZGF0b3IKLQkJZk5hbWVFbnRyeVZhbGlkYXRvciA9IG5ldyBUZXh0VmFsaWRhdG9yKGdldE1hbmFnZWRGb3JtKCksIGZOYW1lRW50cnkuZ2V0VGV4dCgpLCBnZXRQcm9qZWN0KCksIHRydWUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVDb250cm9sKCkgewotCQkJCXJldHVybiB2YWxpZGF0ZU5hbWVFbnRyeSgpOwotCQkJfQotCQl9OwotCX0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlSWRFbnRyeSgpIHsKKyAgICAgICAgLy8gVmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQKKyAgICAgICAgcmV0dXJuIENvbnRyb2xWYWxpZGF0aW9uVXRpbGl0eS52YWxpZGF0ZVJlcXVpcmVkRmllbGQodGhpcy5mSWRFbnRyeS5nZXRUZXh0KCkuZ2V0VGV4dCgpLCB0aGlzLmZJZEVudHJ5VmFsaWRhdG9yLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKTsKKyAgICB9CiAKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlTmFtZUVudHJ5KCkgewotCQkvLyBWYWx1ZSBtdXN0IGJlIHNwZWNpZmllZAotCQlpZiAoQ29udHJvbFZhbGlkYXRpb25VdGlsaXR5LnZhbGlkYXRlUmVxdWlyZWRGaWVsZChmTmFtZUVudHJ5LmdldFRleHQoKS5nZXRUZXh0KCksIGZOYW1lRW50cnlWYWxpZGF0b3IsCi0JCQkJSU1lc3NhZ2VQcm92aWRlci5FUlJPUikgPT0gZmFsc2UpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBWYWx1ZSBtdXN0IGJlIGV4dGVybmFsaXplZAotCQlyZXR1cm4gQ29udHJvbFZhbGlkYXRpb25VdGlsaXR5LnZhbGlkYXRlVHJhbnNsYXRhYmxlRmllbGQoZk5hbWVFbnRyeS5nZXRUZXh0KCkuZ2V0VGV4dCgpLCBmTmFtZUVudHJ5VmFsaWRhdG9yLAotCQkJCWdldE1vZGVsQmFzZSgpLCBnZXRQcm9qZWN0KCkpOwotCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWZXJzaW9uRW50cnkoQ29tcG9zaXRlIGNsaWVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworICAgICAgICB0aGlzLmZWZXJzaW9uRW50cnkgPSBuZXcgRm9ybUVudHJ5KGNsaWVudCwgdG9vbGtpdCwgUERFVUlNZXNzYWdlcy5HZW5lcmFsSW5mb1NlY3Rpb25fdmVyc2lvbiwgbnVsbCwgZmFsc2UpOworICAgICAgICB0aGlzLmZWZXJzaW9uRW50cnkuc2V0Rm9ybUVudHJ5TGlzdGVuZXIobmV3IEZvcm1FbnRyeUFkYXB0ZXIodGhpcywgYWN0aW9uQmFycykgewogCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvdmlkZXJFbnRyeShDb21wb3NpdGUgY2xpZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWZQcm92aWRlckVudHJ5ID0gbmV3IEZvcm1FbnRyeShjbGllbnQsIHRvb2xraXQsIFBERVVJTWVzc2FnZXMuR2VuZXJhbEluZm9TZWN0aW9uX3Byb3ZpZGVyLCBudWxsLCBmYWxzZSk7Ci0JCWZQcm92aWRlckVudHJ5LnNldEZvcm1FbnRyeUxpc3RlbmVyKG5ldyBGb3JtRW50cnlBZGFwdGVyKHRoaXMsIGFjdGlvbkJhcnMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdGV4dFZhbHVlQ2hhbmdlZChGb3JtRW50cnkgZW50cnkpIHsKLQkJCQl0cnkgewotCQkJCQlnZXRQbHVnaW5CYXNlKCkuc2V0UHJvdmlkZXJOYW1lKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlQREVQbHVnaW4ubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZQcm92aWRlckVudHJ5LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7Ci0JCS8vIENyZWF0ZSB2YWxpZGF0b3IKLQkJZlByb3ZpZGVyRW50cnlWYWxpZGF0b3IgPSBuZXcgVGV4dFZhbGlkYXRvcihnZXRNYW5hZ2VkRm9ybSgpLCBmUHJvdmlkZXJFbnRyeS5nZXRUZXh0KCksIGdldFByb2plY3QoKSwgdHJ1ZSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUNvbnRyb2woKSB7Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUHJvdmlkZXJFbnRyeSgpOwotCQkJfQotCQl9OwotCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdGV4dFZhbHVlQ2hhbmdlZChGb3JtRW50cnkgZW50cnkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBnZXRQbHVnaW5CYXNlKCkuc2V0VmVyc2lvbihlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgUERFUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmZWZXJzaW9uRW50cnkuc2V0RWRpdGFibGUoaXNFZGl0YWJsZSgpKTsKKyAgICAgICAgLy8gQ3JlYXRlIHZhbGlkYXRvcgorICAgICAgICB0aGlzLmZWZXJzaW9uRW50cnlWYWxpZGF0b3IgPSBuZXcgVGV4dFZhbGlkYXRvcihnZXRNYW5hZ2VkRm9ybSgpLCB0aGlzLmZWZXJzaW9uRW50cnkuZ2V0VGV4dCgpLCBnZXRQcm9qZWN0KCksIHRydWUpIHsKIAotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVQcm92aWRlckVudHJ5KCkgewotCQkvLyBObyB2YWxpZGF0aW9uIHJlcXVpcmVkIGZvciBhbiBvcHRpb25hbCBmaWVsZAotCQlpZiAoZlByb3ZpZGVyRW50cnkuZ2V0VGV4dCgpLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBWYWx1ZSBtdXN0IGJlIGV4dGVybmFsaXplZAotCQlyZXR1cm4gQ29udHJvbFZhbGlkYXRpb25VdGlsaXR5LnZhbGlkYXRlVHJhbnNsYXRhYmxlRmllbGQoZlByb3ZpZGVyRW50cnkuZ2V0VGV4dCgpLmdldFRleHQoKSwKLQkJCQlmUHJvdmlkZXJFbnRyeVZhbGlkYXRvciwgZ2V0TW9kZWxCYXNlKCksIGdldFByb2plY3QoKSk7Ci0JfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUNvbnRyb2woKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlVmVyc2lvbkVudHJ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBsYXRmb3JtRmlsdGVyRW50cnkoQ29tcG9zaXRlIGNsaWVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlmUGxhdGZvcm1GaWx0ZXJFbnRyeSA9IG5ldyBGb3JtRW50cnkoY2xpZW50LCB0b29sa2l0LCBQREVVSU1lc3NhZ2VzLkdlbmVyYWxJbmZvU2VjdGlvbl9wbGF0Zm9ybUZpbHRlciwgbnVsbCwKLQkJCQlmYWxzZSk7Ci0JCWZQbGF0Zm9ybUZpbHRlckVudHJ5LnNldEZvcm1FbnRyeUxpc3RlbmVyKG5ldyBGb3JtRW50cnlBZGFwdGVyKHRoaXMsIGFjdGlvbkJhcnMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdGV4dFZhbHVlQ2hhbmdlZChGb3JtRW50cnkgZW50cnkpIHsKLQkJCQlnZXRCdW5kbGUoKS5zZXRIZWFkZXIoUExBVEZPUk1fRklMVEVSLCBmUGxhdGZvcm1GaWx0ZXJFbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWZQbGF0Zm9ybUZpbHRlckVudHJ5LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7Ci0JCS8vIENyZWF0ZSB2YWxpZGF0b3IKLQkJZlBsYXRmb3JtRW50cnlWYWxpZGF0b3IgPSBuZXcgVGV4dFZhbGlkYXRvcihnZXRNYW5hZ2VkRm9ybSgpLCBmUGxhdGZvcm1GaWx0ZXJFbnRyeS5nZXRUZXh0KCksIGdldFByb2plY3QoKSwKLQkJCQl0cnVlKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlQ29udHJvbCgpIHsKLQkJCQlyZXR1cm4gdmFsaWRhdGVQbGF0Zm9ybUVudHJ5KCk7Ci0JCQl9Ci0JCX07Ci0JfQorICAgIC8qKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVWZXJzaW9uRW50cnkoKSB7CisgICAgICAgIC8vIFZhbHVlIG11c3QgYmUgc3BlY2lmaWVkCisgICAgICAgIGlmIChDb250cm9sVmFsaWRhdGlvblV0aWxpdHkudmFsaWRhdGVSZXF1aXJlZEZpZWxkKHRoaXMuZlZlcnNpb25FbnRyeS5nZXRUZXh0KCkuZ2V0VGV4dCgpLCB0aGlzLmZWZXJzaW9uRW50cnlWYWxpZGF0b3IsCisgICAgICAgICAgICBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIFZhbHVlIG11c3QgYmUgYSB2YWxpZCB2ZXJzaW9uCisgICAgICAgIHJldHVybiBDb250cm9sVmFsaWRhdGlvblV0aWxpdHkudmFsaWRhdGVWZXJzaW9uRmllbGQodGhpcy5mVmVyc2lvbkVudHJ5LmdldFRleHQoKS5nZXRUZXh0KCksIHRoaXMuZlZlcnNpb25FbnRyeVZhbGlkYXRvcik7CisgICAgfQogCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVBsYXRmb3JtRW50cnkoKSB7Ci0JCS8vIE5vIHZhbGlkYXRpb24gcmVxdWlyZWQgZm9yIGFuIG9wdGlvbmFsIGZpZWxkCi0JCWlmIChmUGxhdGZvcm1GaWx0ZXJFbnRyeS5nZXRUZXh0KCkuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIFZhbHVlIG11c3QgbWF0Y2ggdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgYW5kIGNvbnRhaW4gdmFsaWQgc3ludGF4Ci0JCXJldHVybiBDb250cm9sVmFsaWRhdGlvblV0aWxpdHkudmFsaWRhdGVQbGF0Zm9ybUZpbHRlckZpZWxkKGZQbGF0Zm9ybUZpbHRlckVudHJ5LmdldFRleHQoKS5nZXRUZXh0KCksCi0JCQkJZlBsYXRmb3JtRW50cnlWYWxpZGF0b3IpOwotCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOYW1lRW50cnkoQ29tcG9zaXRlIGNsaWVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworICAgICAgICB0aGlzLmZOYW1lRW50cnkgPSBuZXcgRm9ybUVudHJ5KGNsaWVudCwgdG9vbGtpdCwgUERFVUlNZXNzYWdlcy5HZW5lcmFsSW5mb1NlY3Rpb25fbmFtZSwgbnVsbCwgZmFsc2UpOworICAgICAgICB0aGlzLmZOYW1lRW50cnkuc2V0Rm9ybUVudHJ5TGlzdGVuZXIobmV3IEZvcm1FbnRyeUFkYXB0ZXIodGhpcywgYWN0aW9uQmFycykgewogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY29tbWl0KGJvb2xlYW4gb25TYXZlKSB7Ci0JCWZJZEVudHJ5LmNvbW1pdCgpOwotCQlmVmVyc2lvbkVudHJ5LmNvbW1pdCgpOwotCQlmTmFtZUVudHJ5LmNvbW1pdCgpOwotCQlmUHJvdmlkZXJFbnRyeS5jb21taXQoKTsKLQkJaWYgKGZQbGF0Zm9ybUZpbHRlckVudHJ5ICE9IG51bGwpIHsKLQkJCWZQbGF0Zm9ybUZpbHRlckVudHJ5LmNvbW1pdCgpOwotCQl9Ci0JCXN1cGVyLmNvbW1pdChvblNhdmUpOwotCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdGV4dFZhbHVlQ2hhbmdlZChGb3JtRW50cnkgZW50cnkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBnZXRQbHVnaW5CYXNlKCkuc2V0TmFtZShlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgUERFUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmZOYW1lRW50cnkuc2V0RWRpdGFibGUoaXNFZGl0YWJsZSgpKTsKKyAgICAgICAgLy8gQ3JlYXRlIHZhbGlkYXRvcgorICAgICAgICB0aGlzLmZOYW1lRW50cnlWYWxpZGF0b3IgPSBuZXcgVGV4dFZhbGlkYXRvcihnZXRNYW5hZ2VkRm9ybSgpLCB0aGlzLmZOYW1lRW50cnkuZ2V0VGV4dCgpLCBnZXRQcm9qZWN0KCksIHRydWUpIHsKIAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UucGRlLmludGVybmFsLnVpLmVkaXRvci5QREVTZWN0aW9uI21vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS5wZGUuY29yZS5JTW9kZWxDaGFuZ2VkRXZlbnQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElNb2RlbENoYW5nZWRFdmVudCBlKSB7Ci0JCWlmIChlLmdldENoYW5nZVR5cGUoKSA9PSBJTW9kZWxDaGFuZ2VkRXZlbnQuV09STERfQ0hBTkdFRCkgewotCQkJbWFya1N0YWxlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcmVmcmVzaCgpOwotCQlpZiAoZS5nZXRDaGFuZ2VUeXBlKCkgPT0gSU1vZGVsQ2hhbmdlZEV2ZW50LkNIQU5HRSkgewotCQkJT2JqZWN0IG9iaiA9IGUuZ2V0Q2hhbmdlZE9iamVjdHMoKVswXTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUGx1Z2luQmFzZSkgewotCQkJCVN0cmluZyBwcm9wZXJ0eSA9IGUuZ2V0Q2hhbmdlZFByb3BlcnR5KCk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwgJiYgcHJvcGVydHkuZXF1YWxzKGdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS5nZXRUaXRsZVByb3BlcnR5KCkpKSB7Ci0JCQkJCWdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS51cGRhdGVUaXRsZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVDb250cm9sKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU5hbWVFbnRyeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCUlQbHVnaW5Nb2RlbEJhc2UgbW9kZWwgPSAoSVBsdWdpbk1vZGVsQmFzZSkgZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLmdldENvbnRleHRNYW5hZ2VyKCkuZ2V0QWdncmVnYXRlTW9kZWwoKTsKLQkJSVBsdWdpbkJhc2UgcGx1Z2luQmFzZSA9IG1vZGVsLmdldFBsdWdpbkJhc2UoKTsKLQkJZklkRW50cnkuc2V0VmFsdWUocGx1Z2luQmFzZS5nZXRJZCgpLCB0cnVlKTsKLQkJZk5hbWVFbnRyeS5zZXRWYWx1ZShwbHVnaW5CYXNlLmdldE5hbWUoKSwgdHJ1ZSk7Ci0JCWZWZXJzaW9uRW50cnkuc2V0VmFsdWUocGx1Z2luQmFzZS5nZXRWZXJzaW9uKCksIHRydWUpOwotCQlmUHJvdmlkZXJFbnRyeS5zZXRWYWx1ZShwbHVnaW5CYXNlLmdldFByb3ZpZGVyTmFtZSgpLCB0cnVlKTsKLQkJaWYgKGZQbGF0Zm9ybUZpbHRlckVudHJ5ICE9IG51bGwpIHsKLQkJCUlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQlmUGxhdGZvcm1GaWx0ZXJFbnRyeS5zZXRWYWx1ZShidW5kbGUuZ2V0SGVhZGVyKFBMQVRGT1JNX0ZJTFRFUiksIHRydWUpOwotCQkJfQotCQl9Ci0JCWdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS51cGRhdGVUaXRsZSgpOwotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQorICAgIC8qKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVOYW1lRW50cnkoKSB7CisgICAgICAgIC8vIFZhbHVlIG11c3QgYmUgc3BlY2lmaWVkCisgICAgICAgIGlmIChDb250cm9sVmFsaWRhdGlvblV0aWxpdHkudmFsaWRhdGVSZXF1aXJlZEZpZWxkKHRoaXMuZk5hbWVFbnRyeS5nZXRUZXh0KCkuZ2V0VGV4dCgpLCB0aGlzLmZOYW1lRW50cnlWYWxpZGF0b3IsCisgICAgICAgICAgICBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIFZhbHVlIG11c3QgYmUgZXh0ZXJuYWxpemVkCisgICAgICAgIHJldHVybiBDb250cm9sVmFsaWRhdGlvblV0aWxpdHkudmFsaWRhdGVUcmFuc2xhdGFibGVGaWVsZCh0aGlzLmZOYW1lRW50cnkuZ2V0VGV4dCgpLmdldFRleHQoKSwgdGhpcy5mTmFtZUVudHJ5VmFsaWRhdG9yLCBnZXRNb2RlbEJhc2UoKSwKKyAgICAgICAgICAgIGdldFByb2plY3QoKSk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY2FuY2VsRWRpdCgpIHsKLQkJZklkRW50cnkuY2FuY2VsRWRpdCgpOwotCQlmTmFtZUVudHJ5LmNhbmNlbEVkaXQoKTsKLQkJZlZlcnNpb25FbnRyeS5jYW5jZWxFZGl0KCk7Ci0JCWZQcm92aWRlckVudHJ5LmNhbmNlbEVkaXQoKTsKLQkJaWYgKGZQbGF0Zm9ybUZpbHRlckVudHJ5ICE9IG51bGwpIHsKLQkJCWZQbGF0Zm9ybUZpbHRlckVudHJ5LmNhbmNlbEVkaXQoKTsKLQkJfQotCQlzdXBlci5jYW5jZWxFZGl0KCk7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb3ZpZGVyRW50cnkoQ29tcG9zaXRlIGNsaWVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworICAgICAgICB0aGlzLmZQcm92aWRlckVudHJ5ID0gbmV3IEZvcm1FbnRyeShjbGllbnQsIHRvb2xraXQsIFBERVVJTWVzc2FnZXMuR2VuZXJhbEluZm9TZWN0aW9uX3Byb3ZpZGVyLCBudWxsLCBmYWxzZSk7CisgICAgICAgIHRoaXMuZlByb3ZpZGVyRW50cnkuc2V0Rm9ybUVudHJ5TGlzdGVuZXIobmV3IEZvcm1FbnRyeUFkYXB0ZXIodGhpcywgYWN0aW9uQmFycykgewogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJcmVtb3ZlTGlzdGVuZXJzKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRleHRWYWx1ZUNoYW5nZWQoRm9ybUVudHJ5IGVudHJ5KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0UGx1Z2luQmFzZSgpLnNldFByb3ZpZGVyTmFtZShlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgUERFUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmZQcm92aWRlckVudHJ5LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7CisgICAgICAgIC8vIENyZWF0ZSB2YWxpZGF0b3IKKyAgICAgICAgdGhpcy5mUHJvdmlkZXJFbnRyeVZhbGlkYXRvciA9IG5ldyBUZXh0VmFsaWRhdG9yKGdldE1hbmFnZWRGb3JtKCksIHRoaXMuZlByb3ZpZGVyRW50cnkuZ2V0VGV4dCgpLCBnZXRQcm9qZWN0KCksIHRydWUpIHsKIAotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUxpc3RlbmVycygpIHsKLQkJSUJhc2VNb2RlbCBtb2RlbCA9IGdldFBhZ2UoKS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJTW9kZWxDaGFuZ2VQcm92aWRlcikgewotCQkJKChJTW9kZWxDaGFuZ2VQcm92aWRlcikgbW9kZWwpLnJlbW92ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUNvbnRyb2woKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlUHJvdmlkZXJFbnRyeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJSUJhc2VNb2RlbCBtb2RlbCA9IGdldFBhZ2UoKS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJTW9kZWxDaGFuZ2VQcm92aWRlcikgewotCQkJKChJTW9kZWxDaGFuZ2VQcm92aWRlcikgbW9kZWwpLmFkZE1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVQcm92aWRlckVudHJ5KCkgeworICAgICAgICAvLyBObyB2YWxpZGF0aW9uIHJlcXVpcmVkIGZvciBhbiBvcHRpb25hbCBmaWVsZAorICAgICAgICBpZiAodGhpcy5mUHJvdmlkZXJFbnRyeS5nZXRUZXh0KCkuZ2V0VGV4dCgpLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIC8vIFZhbHVlIG11c3QgYmUgZXh0ZXJuYWxpemVkCisgICAgICAgIHJldHVybiBDb250cm9sVmFsaWRhdGlvblV0aWxpdHkudmFsaWRhdGVUcmFuc2xhdGFibGVGaWVsZCh0aGlzLmZQcm92aWRlckVudHJ5LmdldFRleHQoKS5nZXRUZXh0KCksIHRoaXMuZlByb3ZpZGVyRW50cnlWYWxpZGF0b3IsCisgICAgICAgICAgICBnZXRNb2RlbEJhc2UoKSwgZ2V0UHJvamVjdCgpKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5QYXN0ZShDbGlwYm9hcmQgY2xpcGJvYXJkKSB7Ci0JCURpc3BsYXkgZCA9IGdldFNlY3Rpb24oKS5nZXREaXNwbGF5KCk7Ci0JCXJldHVybiAoZC5nZXRGb2N1c0NvbnRyb2woKSBpbnN0YW5jZW9mIFRleHQpOwotCX0KKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlUGxhdGZvcm1GaWx0ZXJFbnRyeShDb21wb3NpdGUgY2xpZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisgICAgICAgIHRoaXMuZlBsYXRmb3JtRmlsdGVyRW50cnkgPSBuZXcgRm9ybUVudHJ5KGNsaWVudCwgdG9vbGtpdCwgUERFVUlNZXNzYWdlcy5HZW5lcmFsSW5mb1NlY3Rpb25fcGxhdGZvcm1GaWx0ZXIsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgdGhpcy5mUGxhdGZvcm1GaWx0ZXJFbnRyeS5zZXRGb3JtRW50cnlMaXN0ZW5lcihuZXcgRm9ybUVudHJ5QWRhcHRlcih0aGlzLCBhY3Rpb25CYXJzKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdGV4dFZhbHVlQ2hhbmdlZChGb3JtRW50cnkgZW50cnkpIHsKKyAgICAgICAgICAgICAgICBnZXRCdW5kbGUoKS5zZXRIZWFkZXIoUExBVEZPUk1fRklMVEVSLCBBYnN0cmFjdFBkZUdlbmVyYWxJbmZvU2VjdGlvbi50aGlzLmZQbGF0Zm9ybUZpbHRlckVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdGhpcy5mUGxhdGZvcm1GaWx0ZXJFbnRyeS5zZXRFZGl0YWJsZShpc0VkaXRhYmxlKCkpOworICAgICAgICAvLyBDcmVhdGUgdmFsaWRhdG9yCisgICAgICAgIHRoaXMuZlBsYXRmb3JtRW50cnlWYWxpZGF0b3IgPSBuZXcgVGV4dFZhbGlkYXRvcihnZXRNYW5hZ2VkRm9ybSgpLCB0aGlzLmZQbGF0Zm9ybUZpbHRlckVudHJ5LmdldFRleHQoKSwgZ2V0UHJvamVjdCgpLCB0cnVlKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVDb250cm9sKCkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVBsYXRmb3JtRW50cnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUGxhdGZvcm1FbnRyeSgpIHsKKyAgICAgICAgLy8gTm8gdmFsaWRhdGlvbiByZXF1aXJlZCBmb3IgYW4gb3B0aW9uYWwgZmllbGQKKyAgICAgICAgaWYgKHRoaXMuZlBsYXRmb3JtRmlsdGVyRW50cnkuZ2V0VGV4dCgpLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBWYWx1ZSBtdXN0IG1hdGNoIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGFuZCBjb250YWluIHZhbGlkIHN5bnRheAorICAgICAgICByZXR1cm4gQ29udHJvbFZhbGlkYXRpb25VdGlsaXR5LnZhbGlkYXRlUGxhdGZvcm1GaWx0ZXJGaWVsZCh0aGlzLmZQbGF0Zm9ybUZpbHRlckVudHJ5LmdldFRleHQoKS5nZXRUZXh0KCksIHRoaXMuZlBsYXRmb3JtRW50cnlWYWxpZGF0b3IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbW1pdChib29sZWFuIG9uU2F2ZSkgeworICAgICAgICB0aGlzLmZJZEVudHJ5LmNvbW1pdCgpOworICAgICAgICB0aGlzLmZWZXJzaW9uRW50cnkuY29tbWl0KCk7CisgICAgICAgIHRoaXMuZk5hbWVFbnRyeS5jb21taXQoKTsKKyAgICAgICAgdGhpcy5mUHJvdmlkZXJFbnRyeS5jb21taXQoKTsKKyAgICAgICAgaWYgKHRoaXMuZlBsYXRmb3JtRmlsdGVyRW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5mUGxhdGZvcm1GaWx0ZXJFbnRyeS5jb21taXQoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5jb21taXQob25TYXZlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGRlLmludGVybmFsLnVpLmVkaXRvci5QREVTZWN0aW9uI21vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS5wZGUuY29yZS5JTW9kZWxDaGFuZ2VkRXZlbnQpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElNb2RlbENoYW5nZWRFdmVudCBlKSB7CisgICAgICAgIGlmIChlLmdldENoYW5nZVR5cGUoKSA9PSBJTW9kZWxDaGFuZ2VkRXZlbnQuV09STERfQ0hBTkdFRCkgeworICAgICAgICAgICAgbWFya1N0YWxlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmVmcmVzaCgpOworICAgICAgICBpZiAoZS5nZXRDaGFuZ2VUeXBlKCkgPT0gSU1vZGVsQ2hhbmdlZEV2ZW50LkNIQU5HRSkgeworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGUuZ2V0Q2hhbmdlZE9iamVjdHMoKVswXTsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJUGx1Z2luQmFzZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGUuZ2V0Q2hhbmdlZFByb3BlcnR5KCk7CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwgJiYgcHJvcGVydHkuZXF1YWxzKGdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS5nZXRUaXRsZVByb3BlcnR5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS51cGRhdGVUaXRsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7CisgICAgICAgIElQbHVnaW5Nb2RlbEJhc2UgbW9kZWwgPSAoSVBsdWdpbk1vZGVsQmFzZSkgZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLmdldENvbnRleHRNYW5hZ2VyKCkuZ2V0QWdncmVnYXRlTW9kZWwoKTsKKyAgICAgICAgSVBsdWdpbkJhc2UgcGx1Z2luQmFzZSA9IG1vZGVsLmdldFBsdWdpbkJhc2UoKTsKKyAgICAgICAgdGhpcy5mSWRFbnRyeS5zZXRWYWx1ZShwbHVnaW5CYXNlLmdldElkKCksIHRydWUpOworICAgICAgICB0aGlzLmZOYW1lRW50cnkuc2V0VmFsdWUocGx1Z2luQmFzZS5nZXROYW1lKCksIHRydWUpOworICAgICAgICB0aGlzLmZWZXJzaW9uRW50cnkuc2V0VmFsdWUocGx1Z2luQmFzZS5nZXRWZXJzaW9uKCksIHRydWUpOworICAgICAgICB0aGlzLmZQcm92aWRlckVudHJ5LnNldFZhbHVlKHBsdWdpbkJhc2UuZ2V0UHJvdmlkZXJOYW1lKCksIHRydWUpOworICAgICAgICBpZiAodGhpcy5mUGxhdGZvcm1GaWx0ZXJFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICBJQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZSgpOworICAgICAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5mUGxhdGZvcm1GaWx0ZXJFbnRyeS5zZXRWYWx1ZShidW5kbGUuZ2V0SGVhZGVyKFBMQVRGT1JNX0ZJTFRFUiksIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS51cGRhdGVUaXRsZSgpOworICAgICAgICBzdXBlci5yZWZyZXNoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2FuY2VsRWRpdCgpIHsKKyAgICAgICAgdGhpcy5mSWRFbnRyeS5jYW5jZWxFZGl0KCk7CisgICAgICAgIHRoaXMuZk5hbWVFbnRyeS5jYW5jZWxFZGl0KCk7CisgICAgICAgIHRoaXMuZlZlcnNpb25FbnRyeS5jYW5jZWxFZGl0KCk7CisgICAgICAgIHRoaXMuZlByb3ZpZGVyRW50cnkuY2FuY2VsRWRpdCgpOworICAgICAgICBpZiAodGhpcy5mUGxhdGZvcm1GaWx0ZXJFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmZQbGF0Zm9ybUZpbHRlckVudHJ5LmNhbmNlbEVkaXQoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5jYW5jZWxFZGl0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgcmVtb3ZlTGlzdGVuZXJzKCk7CisgICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVMaXN0ZW5lcnMoKSB7CisgICAgICAgIElCYXNlTW9kZWwgbW9kZWwgPSBnZXRQYWdlKCkuZ2V0TW9kZWwoKTsKKyAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSU1vZGVsQ2hhbmdlUHJvdmlkZXIpIHsKKyAgICAgICAgICAgICgoSU1vZGVsQ2hhbmdlUHJvdmlkZXIpIG1vZGVsKS5yZW1vdmVNb2RlbENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKKyAgICAgICAgSUJhc2VNb2RlbCBtb2RlbCA9IGdldFBhZ2UoKS5nZXRNb2RlbCgpOworICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJTW9kZWxDaGFuZ2VQcm92aWRlcikgeworICAgICAgICAgICAgKChJTW9kZWxDaGFuZ2VQcm92aWRlcikgbW9kZWwpLmFkZE1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2FuUGFzdGUoQ2xpcGJvYXJkIGNsaXBib2FyZCkgeworICAgICAgICBEaXNwbGF5IGQgPSBnZXRTZWN0aW9uKCkuZ2V0RGlzcGxheSgpOworICAgICAgICByZXR1cm4gZC5nZXRGb2N1c0NvbnRyb2woKSBpbnN0YW5jZW9mIFRleHQ7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZURlcGVuZGVuY2llc1BhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlRGVwZW5kZW5jaWVzUGFnZS5qYXZhCmluZGV4IDY3MGZjYTcuLmQ4YjBjZDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlRGVwZW5kZW5jaWVzUGFnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlRGVwZW5kZW5jaWVzUGFnZS5qYXZhCkBAIC04LDEyICs4LDE0IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwpAQCAtMzgsMTAyICs0MCwxMDAgQEAKICAqLwogcHVibGljIGNsYXNzIEJ1bmRsZURlcGVuZGVuY2llc1BhZ2UgZXh0ZW5kcyBQREVGb3JtUGFnZSBpbXBsZW1lbnRzIElCdW5kbGVNYW5pZmVzdFNhdmVMaXN0ZW5lciB7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0lEID0gImJ1bmRsZV9kZXBlbmRlbmNpZXMiOyAvLyROT04tTkxTLTEkCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9JRCA9ICJidW5kbGVfZGVwZW5kZW5jaWVzIjsgLy8kTk9OLU5MUy0xJAogCi0JcHJpdmF0ZSBCdW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvbiBidW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvbiA9IG51bGw7CisgICAgcHJpdmF0ZSBCdW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvbiBidW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvbiA9IG51bGw7CiAKLQlwcml2YXRlIEJ1bmRsZUltcG9ydFNlY3Rpb24gYnVuZGxlSW1wb3J0U2VjdGlvbiA9IG51bGw7CisgICAgcHJpdmF0ZSBCdW5kbGVJbXBvcnRTZWN0aW9uIGJ1bmRsZUltcG9ydFNlY3Rpb24gPSBudWxsOwogCi0JcHJpdmF0ZSBCdW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvbiBidW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvbiA9IG51bGw7CisgICAgcHJpdmF0ZSBCdW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvbiBidW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvbiA9IG51bGw7CiAKLQlwcm90ZWN0ZWQgU2Nyb2xsZWRGb3JtIGZvcm0gPSBudWxsOworICAgIHByb3RlY3RlZCBTY3JvbGxlZEZvcm0gZm9ybSA9IG51bGw7CiAKLQlwcm90ZWN0ZWQgSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5JRkVTVF9FUlJPUlMgPSAiRGVwZW5kZW5jaWVzOiBQbGVhc2UgY29ycmVjdCBvbmUgb3IgbW9yZSBlcnJvcnMgaW4gdGhlIG1hbmlmZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1RfRVJST1JTID0gIkRlcGVuZGVuY2llczogUGxlYXNlIGNvcnJlY3Qgb25lIG9yIG1vcmUgZXJyb3JzIGluIHRoZSBtYW5pZmVzdCI7CiAKLQlwdWJsaWMgQnVuZGxlRGVwZW5kZW5jaWVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIFBBR0VfSUQsICJEZXBlbmRlbmNpZXMiKTsKLQl9CisgICAgcHVibGljIEJ1bmRsZURlcGVuZGVuY2llc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKKyAgICAgICAgc3VwZXIoZWRpdG9yLCBQQUdFX0lELCAiRGVwZW5kZW5jaWVzIik7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCXN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLQkJZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJZm9ybS5zZXRJbWFnZShQREVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfUkVRX1BMVUdJTlNfT0JKKSk7Ci0JCWZvcm0uc2V0VGV4dChQREVVSU1lc3NhZ2VzLkRlcGVuZGVuY2llc1BhZ2VfdGl0bGUpOwotCQlDb21wb3NpdGUgYm9keSA9IGZvcm0uZ2V0Qm9keSgpOwotCQlib2R5LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVGb3JtR3JpZExheW91dCh0cnVlLCAyKSk7Ci0JCUNvbXBvc2l0ZSBsZWZ0LCByaWdodDsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJbGVmdCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGJvZHksIFNXVC5OT05FKTsKLQkJbGVmdC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlRm9ybVBhbmVHcmlkTGF5b3V0KGZhbHNlLCAxKSk7Ci0JCWxlZnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXJpZ2h0ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoYm9keSwgU1dULk5PTkUpOwotCQlyaWdodC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlRm9ybVBhbmVHcmlkTGF5b3V0KGZhbHNlLCAxKSk7Ci0JCXJpZ2h0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgeworICAgICAgICBzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7CisgICAgICAgIHRoaXMuZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKKyAgICAgICAgdGhpcy5mb3JtLnNldEltYWdlKFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldChQREVQbHVnaW5JbWFnZXMuREVTQ19SRVFfUExVR0lOU19PQkopKTsKKyAgICAgICAgdGhpcy5mb3JtLnNldFRleHQoUERFVUlNZXNzYWdlcy5EZXBlbmRlbmNpZXNQYWdlX3RpdGxlKTsKKyAgICAgICAgQ29tcG9zaXRlIGJvZHkgPSB0aGlzLmZvcm0uZ2V0Qm9keSgpOworICAgICAgICBib2R5LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVGb3JtR3JpZExheW91dCh0cnVlLCAyKSk7CisgICAgICAgIENvbXBvc2l0ZSBsZWZ0LCByaWdodDsKKyAgICAgICAgRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKKyAgICAgICAgbGVmdCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGJvZHksIFNXVC5OT05FKTsKKyAgICAgICAgbGVmdC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlRm9ybVBhbmVHcmlkTGF5b3V0KGZhbHNlLCAxKSk7CisgICAgICAgIGxlZnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisgICAgICAgIHJpZ2h0ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoYm9keSwgU1dULk5PTkUpOworICAgICAgICByaWdodC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlRm9ybVBhbmVHcmlkTGF5b3V0KGZhbHNlLCAxKSk7CisgICAgICAgIHJpZ2h0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwogCi0JCXRoaXMuYnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb24gPSBuZXcgQnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb24odGhpcywgbGVmdCk7Ci0JCXRoaXMuYnVuZGxlSW1wb3J0U2VjdGlvbiA9IG5ldyBCdW5kbGVJbXBvcnRTZWN0aW9uKHRoaXMsIHJpZ2h0KTsKLQkJdGhpcy5idW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvbiA9IG5ldyBCdW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvbih0aGlzLCByaWdodCk7CisgICAgICAgIHRoaXMuYnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb24gPSBuZXcgQnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb24odGhpcywgbGVmdCk7CisgICAgICAgIHRoaXMuYnVuZGxlSW1wb3J0U2VjdGlvbiA9IG5ldyBCdW5kbGVJbXBvcnRTZWN0aW9uKHRoaXMsIHJpZ2h0KTsKKyAgICAgICAgdGhpcy5idW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvbiA9IG5ldyBCdW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvbih0aGlzLCByaWdodCk7CiAKLQkJbWFuYWdlZEZvcm0uYWRkUGFydChidW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvbik7Ci0JCW1hbmFnZWRGb3JtLmFkZFBhcnQoYnVuZGxlSW1wb3J0U2VjdGlvbik7Ci0JCW1hbmFnZWRGb3JtLmFkZFBhcnQoYnVuZGxlSW1wb3J0TGlicmFyeVNlY3Rpb24pOworICAgICAgICBtYW5hZ2VkRm9ybS5hZGRQYXJ0KHRoaXMuYnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb24pOworICAgICAgICBtYW5hZ2VkRm9ybS5hZGRQYXJ0KHRoaXMuYnVuZGxlSW1wb3J0U2VjdGlvbik7CisgICAgICAgIG1hbmFnZWRGb3JtLmFkZFBhcnQodGhpcy5idW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvbik7CiAKLQkJSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCA9IChJUGx1Z2luTW9kZWxCYXNlKSAoKEJ1bmRsZU1hbmlmZXN0RWRpdG9yKSB0aGlzLmdldEVkaXRvcigpKS5nZXRBZ2dyZWdhdGVNb2RlbCgpOwotCQlyZXNvdXJjZSA9IG1vZGVsLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQl1cGRhdGVGb3JtVGV4dCgpOwotCX0KKyAgICAgICAgSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCA9IChJUGx1Z2luTW9kZWxCYXNlKSAoKEJ1bmRsZU1hbmlmZXN0RWRpdG9yKSB0aGlzLmdldEVkaXRvcigpKS5nZXRBZ2dyZWdhdGVNb2RlbCgpOworICAgICAgICB0aGlzLnJlc291cmNlID0gbW9kZWwuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisgICAgICAgIHVwZGF0ZUZvcm1UZXh0KCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgbWFuaWZlc3RTYXZlZCgpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXVwZGF0ZUZvcm1UZXh0KCk7Ci0JCX0KLQl9CisgICAgcHVibGljIHZvaWQgbWFuaWZlc3RTYXZlZCgpIHsKKyAgICAgICAgaWYgKHRoaXMucmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdXBkYXRlRm9ybVRleHQoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUZvcm1UZXh0KCkgewotCQl0cnkgewotCQkJLy8gV2FpdCBmb3IgYnVpbGQKLQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGF0dXNIYW5kbGVyLmxvZyhuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELCAiQ291bGQgbm90IHVwZGF0ZSBwYWdlIHRpdGxlIHRleHQiLAotCQkJCQllKSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIE5vdGhpbmcgdG8gZG8/Ci0JCX0KKyAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVGb3JtVGV4dCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIGJ1aWxkCisgICAgICAgICAgICBKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBudWxsKTsKKyAgICAgICAgfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RhdHVzSGFuZGxlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJJZGVVaVBsdWdpbi5QTFVHSU5fSUQsICJDb3VsZCBub3QgdXBkYXRlIHBhZ2UgdGl0bGUgdGV4dCIsIGUpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbz8KKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMobnVsbCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWlmIChNYW5pZmVzdEVkaXRvclV0aWxzLmhhc0Vycm9yU2V2ZXJpdHlNYXJrZXIobWFya2VycykpIHsKLQkJCQkJZm9ybS5zZXRUZXh0KE1BTklGRVNUX0VSUk9SUyk7Ci0JCQkJCWZvcm0uc2V0SW1hZ2UoU2VydmVySWRlVWlQbHVnaW4uZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvbWFuaWZlc3RfZXJyb3IucG5nIikpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvcm0uc2V0VGV4dChQREVVSU1lc3NhZ2VzLkRlcGVuZGVuY2llc1BhZ2VfdGl0bGUpOwotCQkJCQlmb3JtLnNldEltYWdlKFNlcnZlcklkZVVpUGx1Z2luLmdldEltYWdlKCJmdWxsL29iajE2L29zZ2lfb2JqLmdpZiIpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RhdHVzSGFuZGxlci5sb2cobmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIFNlcnZlcklkZVVpUGx1Z2luLlBMVUdJTl9JRCwgIkNvdWxkIG5vdCB1cGRhdGUgcGFnZSB0aXRsZSB0ZXh0IiwKLQkJCQkJZSkpOwotCQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodGhpcy5yZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSU1hcmtlcltdIG1hcmtlcnMgPSB0aGlzLnJlc291cmNlLmZpbmRNYXJrZXJzKG51bGwsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKKyAgICAgICAgICAgICAgICBpZiAoTWFuaWZlc3RFZGl0b3JVdGlscy5oYXNFcnJvclNldmVyaXR5TWFya2VyKG1hcmtlcnMpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zZXRUZXh0KE1BTklGRVNUX0VSUk9SUyk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zZXRJbWFnZShTZXJ2ZXJJZGVVaVBsdWdpbi5nZXRJbWFnZSgiZnVsbC9vYmoxNi9tYW5pZmVzdF9lcnJvci5wbmciKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLnNldFRleHQoUERFVUlNZXNzYWdlcy5EZXBlbmRlbmNpZXNQYWdlX3RpdGxlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLnNldEltYWdlKFNlcnZlcklkZVVpUGx1Z2luLmdldEltYWdlKCJmdWxsL29iajE2L29zZ2lfb2JqLmdpZiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RhdHVzSGFuZGxlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJJZGVVaVBsdWdpbi5QTFVHSU5fSUQsICJDb3VsZCBub3QgdXBkYXRlIHBhZ2UgdGl0bGUgdGV4dCIsIGUpKTsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCS8qKiBGb3IgSlVuaXQgdGVzdGluZyBvbmx5ICogKi8KLQlwdWJsaWMgQnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb24gZ2V0QnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb24oKSB7Ci0JCXJldHVybiBidW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvbjsKLQl9CisgICAgLyoqIEZvciBKVW5pdCB0ZXN0aW5nIG9ubHkgKiAqLworICAgIHB1YmxpYyBCdW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvbiBnZXRCdW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb247CisgICAgfQogCi0JLyoqIEZvciBKVW5pdCB0ZXN0aW5nIG9ubHkgKiAqLwotCXB1YmxpYyBCdW5kbGVJbXBvcnRTZWN0aW9uIGdldEJ1bmRsZUltcG9ydFNlY3Rpb24oKSB7Ci0JCXJldHVybiBidW5kbGVJbXBvcnRTZWN0aW9uOwotCX0KKyAgICAvKiogRm9yIEpVbml0IHRlc3Rpbmcgb25seSAqICovCisgICAgcHVibGljIEJ1bmRsZUltcG9ydFNlY3Rpb24gZ2V0QnVuZGxlSW1wb3J0U2VjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYnVuZGxlSW1wb3J0U2VjdGlvbjsKKyAgICB9CiAKLQkvKiogRm9yIEpVbml0IHRlc3Rpbmcgb25seSAqICovCi0JcHVibGljIEJ1bmRsZUltcG9ydExpYnJhcnlTZWN0aW9uIGdldEJ1bmRsZUltcG9ydExpYnJhcnlTZWN0aW9uKCkgewotCQlyZXR1cm4gYnVuZGxlSW1wb3J0TGlicmFyeVNlY3Rpb247Ci0JfQorICAgIC8qKiBGb3IgSlVuaXQgdGVzdGluZyBvbmx5ICogKi8KKyAgICBwdWJsaWMgQnVuZGxlSW1wb3J0TGlicmFyeVNlY3Rpb24gZ2V0QnVuZGxlSW1wb3J0TGlicmFyeVNlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJ1bmRsZUltcG9ydExpYnJhcnlTZWN0aW9uOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVEZXBlbmRlbmN5UHJvcGVydGllc0RpYWxvZy5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVEZXBlbmRlbmN5UHJvcGVydGllc0RpYWxvZy5qYXZhCmluZGV4IDU4MDY1MDAuLmIzZWJjNTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlRGVwZW5kZW5jeVByb3BlcnRpZXNEaWFsb2cuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZURlcGVuZGVuY3lQcm9wZXJ0aWVzRGlhbG9nLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlN0YXR1c0RpYWxvZzsKQEAgLTI5LDEyOSArMzAsMTMxIEBACiAKIC8qKgogICogQmFzZWQgb24gPGNvZGU+RGVwZW5kZW5jeVByb3BlcnRpZXNEaWFsb2c8L2NvZGU+IGZyb20gUERFIGZvciBFY2xpcHNlIDMuNC4gVXNlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEVjbGlwc2UgMy40LgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVEZXBlbmRlbmN5UHJvcGVydGllc0RpYWxvZyBleHRlbmRzIFN0YXR1c0RpYWxvZyB7CiAKLQlwcml2YXRlIEJ1dHRvbiBmUmVleHBvcnRCdXR0b247CisgICAgcHJpdmF0ZSBCdXR0b24gZlJlZXhwb3J0QnV0dG9uOwogCi0JcHJpdmF0ZSBCdXR0b24gZk9wdGlvbmFsQnV0dG9uOworICAgIHByaXZhdGUgQnV0dG9uIGZPcHRpb25hbEJ1dHRvbjsKIAotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmRWRpdGFibGU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZFZGl0YWJsZTsKIAotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmU2hvd1JlZXhwb3J0OworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBmU2hvd1JlZXhwb3J0OwogCi0JcHJpdmF0ZSBib29sZWFuIGZFeHBvcnRlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZkV4cG9ydGVkOwogCi0JcHJpdmF0ZSBib29sZWFuIGZPcHRpb25hbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZk9wdGlvbmFsOwogCi0JcHJpdmF0ZSBQbHVnaW5WZXJzaW9uUGFydCBmVmVyc2lvblBhcnQ7CisgICAgcHJpdmF0ZSBQbHVnaW5WZXJzaW9uUGFydCBmVmVyc2lvblBhcnQ7CiAKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZlNob3dPcHRpb25hbDsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZlNob3dPcHRpb25hbDsKIAotCXByaXZhdGUgU3RyaW5nIGZWZXJzaW9uOworICAgIHByaXZhdGUgU3RyaW5nIGZWZXJzaW9uOwogCi0JcHVibGljIEJ1bmRsZURlcGVuZGVuY3lQcm9wZXJ0aWVzRGlhbG9nKGJvb2xlYW4gZWRpdGFibGUsIElQbHVnaW5JbXBvcnQgcGx1Z2luKSB7Ci0JCXRoaXMoZWRpdGFibGUsIHRydWUsIHBsdWdpbi5pc1JlZXhwb3J0ZWQoKSwgcGx1Z2luLmlzT3B0aW9uYWwoKSwgcGx1Z2luLmdldFZlcnNpb24oKSwgdHJ1ZSwgdHJ1ZSk7Ci0JfQorICAgIHB1YmxpYyBCdW5kbGVEZXBlbmRlbmN5UHJvcGVydGllc0RpYWxvZyhib29sZWFuIGVkaXRhYmxlLCBJUGx1Z2luSW1wb3J0IHBsdWdpbikgeworICAgICAgICB0aGlzKGVkaXRhYmxlLCB0cnVlLCBwbHVnaW4uaXNSZWV4cG9ydGVkKCksIHBsdWdpbi5pc09wdGlvbmFsKCksIHBsdWdpbi5nZXRWZXJzaW9uKCksIHRydWUsIHRydWUpOworICAgIH0KIAotCXB1YmxpYyBCdW5kbGVEZXBlbmRlbmN5UHJvcGVydGllc0RpYWxvZyhib29sZWFuIGVkaXRhYmxlLCBJbXBvcnRQYWNrYWdlT2JqZWN0IG9iamVjdCkgewotCQl0aGlzKGVkaXRhYmxlLCBmYWxzZSwgZmFsc2UsIG9iamVjdC5pc09wdGlvbmFsKCksIG9iamVjdC5nZXRWZXJzaW9uKCksIHRydWUsIHRydWUpOwotCX0KKyAgICBwdWJsaWMgQnVuZGxlRGVwZW5kZW5jeVByb3BlcnRpZXNEaWFsb2coYm9vbGVhbiBlZGl0YWJsZSwgSW1wb3J0UGFja2FnZU9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgdGhpcyhlZGl0YWJsZSwgZmFsc2UsIGZhbHNlLCBvYmplY3QuaXNPcHRpb25hbCgpLCBvYmplY3QuZ2V0VmVyc2lvbigpLCB0cnVlLCB0cnVlKTsKKyAgICB9CiAKLQlwdWJsaWMgQnVuZGxlRGVwZW5kZW5jeVByb3BlcnRpZXNEaWFsb2coYm9vbGVhbiBlZGl0YWJsZSwgRXhwb3J0UGFja2FnZU9iamVjdCBvYmplY3QpIHsKLQkJdGhpcyhlZGl0YWJsZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgb2JqZWN0LmdldFZlcnNpb24oKSwgZmFsc2UsIGZhbHNlKTsKLQl9CisgICAgcHVibGljIEJ1bmRsZURlcGVuZGVuY3lQcm9wZXJ0aWVzRGlhbG9nKGJvb2xlYW4gZWRpdGFibGUsIEV4cG9ydFBhY2thZ2VPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIHRoaXMoZWRpdGFibGUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIG9iamVjdC5nZXRWZXJzaW9uKCksIGZhbHNlLCBmYWxzZSk7CisgICAgfQogCi0JcHVibGljIEJ1bmRsZURlcGVuZGVuY3lQcm9wZXJ0aWVzRGlhbG9nKGJvb2xlYW4gZWRpdGFibGUsIGJvb2xlYW4gc2hvd1JlZXhwb3J0LCBib29sZWFuIGV4cG9ydCwgYm9vbGVhbiBvcHRpb25hbCwKLQkJCVN0cmluZyB2ZXJzaW9uLCBib29sZWFuIHNob3dPcHRpb25hbCwgYm9vbGVhbiBpc0ltcG9ydCkgewotCQlzdXBlcihQREVQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSk7Ci0JCWZFZGl0YWJsZSA9IGVkaXRhYmxlOwotCQlmU2hvd1JlZXhwb3J0ID0gc2hvd1JlZXhwb3J0OwotCQlmRXhwb3J0ZWQgPSBleHBvcnQ7Ci0JCWZPcHRpb25hbCA9IG9wdGlvbmFsOwotCQlmU2hvd09wdGlvbmFsID0gc2hvd09wdGlvbmFsOworICAgIHB1YmxpYyBCdW5kbGVEZXBlbmRlbmN5UHJvcGVydGllc0RpYWxvZyhib29sZWFuIGVkaXRhYmxlLCBib29sZWFuIHNob3dSZWV4cG9ydCwgYm9vbGVhbiBleHBvcnQsIGJvb2xlYW4gb3B0aW9uYWwsIFN0cmluZyB2ZXJzaW9uLAorICAgICAgICBib29sZWFuIHNob3dPcHRpb25hbCwgYm9vbGVhbiBpc0ltcG9ydCkgeworICAgICAgICBzdXBlcihQREVQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSk7CisgICAgICAgIHRoaXMuZkVkaXRhYmxlID0gZWRpdGFibGU7CisgICAgICAgIHRoaXMuZlNob3dSZWV4cG9ydCA9IHNob3dSZWV4cG9ydDsKKyAgICAgICAgdGhpcy5mRXhwb3J0ZWQgPSBleHBvcnQ7CisgICAgICAgIHRoaXMuZk9wdGlvbmFsID0gb3B0aW9uYWw7CisgICAgICAgIHRoaXMuZlNob3dPcHRpb25hbCA9IHNob3dPcHRpb25hbDsKIAotCQlpZiAoaXNJbXBvcnQpIHsKLQkJCWZWZXJzaW9uUGFydCA9IG5ldyBQbHVnaW5WZXJzaW9uUGFydCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWZWZXJzaW9uUGFydCA9IG5ldyBQbHVnaW5WZXJzaW9uUGFydChmYWxzZSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0R3JvdXBUZXh0KCkgewotCQkJCQlyZXR1cm4gUERFVUlNZXNzYWdlcy5EZXBlbmRlbmN5UHJvcGVydGllc0RpYWxvZ19leHBvcnRHcm91cFRleHQ7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlmVmVyc2lvblBhcnQuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQl9CisgICAgICAgIGlmIChpc0ltcG9ydCkgeworICAgICAgICAgICAgdGhpcy5mVmVyc2lvblBhcnQgPSBuZXcgUGx1Z2luVmVyc2lvblBhcnQodHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmZWZXJzaW9uUGFydCA9IG5ldyBQbHVnaW5WZXJzaW9uUGFydChmYWxzZSkgewogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQl9CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRHcm91cFRleHQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQREVVSU1lc3NhZ2VzLkRlcGVuZGVuY3lQcm9wZXJ0aWVzRGlhbG9nX2V4cG9ydEdyb3VwVGV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIHRoaXMuZlZlcnNpb25QYXJ0LnNldFZlcnNpb24odmVyc2lvbik7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgeworICAgICAgICBzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKHBhcmVudCk7CisgICAgfQogCi0JCWlmIChmU2hvd09wdGlvbmFsIHx8IGZTaG93UmVleHBvcnQpIHsKLQkJCUdyb3VwIGNvbnRhaW5lciA9IG5ldyBHcm91cChjb21wLCBTV1QuTk9ORSk7Ci0JCQljb250YWluZXIuc2V0VGV4dChQREVVSU1lc3NhZ2VzLkRlcGVuZGVuY3lQcm9wZXJ0aWVzRGlhbG9nX3Byb3BlcnRpZXMpOwotCQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICAgICAgQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CiAKLQkJCWlmIChmU2hvd09wdGlvbmFsKSB7Ci0JCQkJZk9wdGlvbmFsQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7Ci0JCQkJZk9wdGlvbmFsQnV0dG9uLnNldFRleHQoUERFVUlNZXNzYWdlcy5EZXBlbmRlbmN5UHJvcGVydGllc0RpYWxvZ19vcHRpb25hbCk7Ci0JCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJZk9wdGlvbmFsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQkJCWZPcHRpb25hbEJ1dHRvbi5zZXRFbmFibGVkKGZFZGl0YWJsZSk7Ci0JCQkJZk9wdGlvbmFsQnV0dG9uLnNldFNlbGVjdGlvbihmT3B0aW9uYWwpOwotCQkJfQorICAgICAgICBpZiAodGhpcy5mU2hvd09wdGlvbmFsIHx8IHRoaXMuZlNob3dSZWV4cG9ydCkgeworICAgICAgICAgICAgR3JvdXAgY29udGFpbmVyID0gbmV3IEdyb3VwKGNvbXAsIFNXVC5OT05FKTsKKyAgICAgICAgICAgIGNvbnRhaW5lci5zZXRUZXh0KFBERVVJTWVzc2FnZXMuRGVwZW5kZW5jeVByb3BlcnRpZXNEaWFsb2dfcHJvcGVydGllcyk7CisgICAgICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworICAgICAgICAgICAgY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwogCi0JCQlpZiAoZlNob3dSZWV4cG9ydCkgewotCQkJCWZSZWV4cG9ydEJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuQ0hFQ0spOwotCQkJCWZSZWV4cG9ydEJ1dHRvbi5zZXRUZXh0KFBERVVJTWVzc2FnZXMuRGVwZW5kZW5jeVByb3BlcnRpZXNEaWFsb2dfcmVleHBvcnQpOwotCQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCWZSZWV4cG9ydEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQlmUmVleHBvcnRCdXR0b24uc2V0RW5hYmxlZChmRWRpdGFibGUpOwotCQkJCWZSZWV4cG9ydEJ1dHRvbi5zZXRTZWxlY3Rpb24oZkV4cG9ydGVkKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgaWYgKHRoaXMuZlNob3dPcHRpb25hbCkgeworICAgICAgICAgICAgICAgIHRoaXMuZk9wdGlvbmFsQnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7CisgICAgICAgICAgICAgICAgdGhpcy5mT3B0aW9uYWxCdXR0b24uc2V0VGV4dChQREVVSU1lc3NhZ2VzLkRlcGVuZGVuY3lQcm9wZXJ0aWVzRGlhbG9nX29wdGlvbmFsKTsKKyAgICAgICAgICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworICAgICAgICAgICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKKyAgICAgICAgICAgICAgICB0aGlzLmZPcHRpb25hbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZPcHRpb25hbEJ1dHRvbi5zZXRFbmFibGVkKHRoaXMuZkVkaXRhYmxlKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZPcHRpb25hbEJ1dHRvbi5zZXRTZWxlY3Rpb24odGhpcy5mT3B0aW9uYWwpOworICAgICAgICAgICAgfQogCi0JCWZWZXJzaW9uUGFydC5jcmVhdGVWZXJzaW9uRmllbGRzKGNvbXAsIHRydWUsIGZFZGl0YWJsZSk7Ci0JCU1vZGlmeUxpc3RlbmVyIG1sID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdXBkYXRlU3RhdHVzKGZWZXJzaW9uUGFydC52YWxpZGF0ZUZ1bGxWZXJzaW9uUmFuZ2VUZXh0KHRydWUpKTsKLQkJCX0KLQkJfTsKLQkJZlZlcnNpb25QYXJ0LmFkZExpc3RlbmVycyhtbCwgbWwpOworICAgICAgICAgICAgaWYgKHRoaXMuZlNob3dSZWV4cG9ydCkgeworICAgICAgICAgICAgICAgIHRoaXMuZlJlZXhwb3J0QnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5DSEVDSyk7CisgICAgICAgICAgICAgICAgdGhpcy5mUmVleHBvcnRCdXR0b24uc2V0VGV4dChQREVVSU1lc3NhZ2VzLkRlcGVuZGVuY3lQcm9wZXJ0aWVzRGlhbG9nX3JlZXhwb3J0KTsKKyAgICAgICAgICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworICAgICAgICAgICAgICAgIGdkLmhvcml6b250YWxTcGFuID0gMjsKKyAgICAgICAgICAgICAgICB0aGlzLmZSZWV4cG9ydEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZSZWV4cG9ydEJ1dHRvbi5zZXRFbmFibGVkKHRoaXMuZkVkaXRhYmxlKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZSZWV4cG9ydEJ1dHRvbi5zZXRTZWxlY3Rpb24odGhpcy5mRXhwb3J0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcmV0dXJuIGNvbXA7Ci0JfQorICAgICAgICB0aGlzLmZWZXJzaW9uUGFydC5jcmVhdGVWZXJzaW9uRmllbGRzKGNvbXAsIHRydWUsIHRoaXMuZkVkaXRhYmxlKTsKKyAgICAgICAgTW9kaWZ5TGlzdGVuZXIgbWwgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7CiAKLQlwdWJsaWMgYm9vbGVhbiBpc1JlZXhwb3J0ZWQoKSB7Ci0JCXJldHVybiBmRXhwb3J0ZWQ7Ci0JfQorICAgICAgICAgICAgcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzKEJ1bmRsZURlcGVuZGVuY3lQcm9wZXJ0aWVzRGlhbG9nLnRoaXMuZlZlcnNpb25QYXJ0LnZhbGlkYXRlRnVsbFZlcnNpb25SYW5nZVRleHQodHJ1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0aGlzLmZWZXJzaW9uUGFydC5hZGRMaXN0ZW5lcnMobWwsIG1sKTsKIAotCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBmT3B0aW9uYWw7Ci0JfQorICAgICAgICByZXR1cm4gY29tcDsKKyAgICB9CiAKLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiBmVmVyc2lvbjsKLQl9CisgICAgcHVibGljIGJvb2xlYW4gaXNSZWV4cG9ydGVkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5mRXhwb3J0ZWQ7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlmT3B0aW9uYWwgPSAoZk9wdGlvbmFsQnV0dG9uID09IG51bGwpID8gZmFsc2UgOiBmT3B0aW9uYWxCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWZFeHBvcnRlZCA9IChmUmVleHBvcnRCdXR0b24gPT0gbnVsbCkgPyBmYWxzZSA6IGZSZWV4cG9ydEJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgeworICAgICAgICByZXR1cm4gdGhpcy5mT3B0aW9uYWw7CisgICAgfQogCi0JCWZWZXJzaW9uID0gZlZlcnNpb25QYXJ0LmdldFZlcnNpb24oKTsKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZWZXJzaW9uOworICAgIH0KIAotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgeworICAgICAgICB0aGlzLmZPcHRpb25hbCA9IHRoaXMuZk9wdGlvbmFsQnV0dG9uID09IG51bGwgPyBmYWxzZSA6IHRoaXMuZk9wdGlvbmFsQnV0dG9uLmdldFNlbGVjdGlvbigpOworICAgICAgICB0aGlzLmZFeHBvcnRlZCA9IHRoaXMuZlJlZXhwb3J0QnV0dG9uID09IG51bGwgPyBmYWxzZSA6IHRoaXMuZlJlZXhwb3J0QnV0dG9uLmdldFNlbGVjdGlvbigpOworCisgICAgICAgIHRoaXMuZlZlcnNpb24gPSB0aGlzLmZWZXJzaW9uUGFydC5nZXRWZXJzaW9uKCk7CisKKyAgICAgICAgc3VwZXIub2tQcmVzc2VkKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVFeGVjdXRpb25FbnZpcm9ubWVudFNlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlRXhlY3V0aW9uRW52aXJvbm1lbnRTZWN0aW9uLmphdmEKaW5kZXggZmI5MTYyOS4uMzkxZTFiNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVFeGVjdXRpb25FbnZpcm9ubWVudFNlY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUV4ZWN1dGlvbkVudmlyb25tZW50U2VjdGlvbi5qYXZhCkBAIC04LDIwICs4LDEyIEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5lbnZpcm9ubWVudHMuSUV4ZWN1dGlvbkVudmlyb25tZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CkBAIC03MSw0MzAgKzYzLDQwOSBAQAogCiAvKioKICAqIEFkYXB0ZWQgZnJvbSBQREUncyA8Y29kZT5FeGNlY3V0aW9uRW52aXJvbm1lbnRTZWN0aW9uPC9jb2RlPi4gKgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAYXV0aG9yIFN0ZWZmZW4gUGluZ2VsCiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVFeGVjdXRpb25FbnZpcm9ubWVudFNlY3Rpb24gZXh0ZW5kcyBUYWJsZVNlY3Rpb24gewogCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmRUVUYWJsZTsKKyAgICBwcml2YXRlIFRhYmxlVmlld2VyIGZFRVRhYmxlOwogCi0JcHJpdmF0ZSBBY3Rpb24gZlJlbW92ZUFjdGlvbjsKKyAgICBwcml2YXRlIEFjdGlvbiBmUmVtb3ZlQWN0aW9uOwogCi0JcHJpdmF0ZSBBY3Rpb24gZkFkZEFjdGlvbjsKKyAgICBwcml2YXRlIEFjdGlvbiBmQWRkQWN0aW9uOwogCi0JY2xhc3MgRUVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7CisgICAgY2xhc3MgRUVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7CiAKLQkJcHJpdmF0ZSBmaW5hbCBJbWFnZSBmSW1hZ2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgSW1hZ2UgZkltYWdlOwogCi0JCXB1YmxpYyBFRUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQlmSW1hZ2UgPSBQREVQbHVnaW5JbWFnZXMuREVTQ19KQVZBX0xJQl9PQkouY3JlYXRlSW1hZ2UoKTsKLQkJfQorICAgICAgICBwdWJsaWMgRUVMYWJlbFByb3ZpZGVyKCkgeworICAgICAgICAgICAgdGhpcy5mSW1hZ2UgPSBQREVQbHVnaW5JbWFnZXMuREVTQ19KQVZBX0xJQl9PQkouY3JlYXRlSW1hZ2UoKTsKKyAgICAgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBmSW1hZ2U7Ci0JCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZkltYWdlOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKLQkJCQlyZXR1cm4gKChJRXhlY3V0aW9uRW52aXJvbm1lbnQpIGVsZW1lbnQpLmdldElkKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFeGVjdXRpb25FbnZpcm9ubWVudCkgeworICAgICAgICAgICAgICAgIHJldHVybiAoKElFeGVjdXRpb25FbnZpcm9ubWVudCkgZWxlbWVudCkuZ2V0SWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZiAoZkltYWdlICE9IG51bGwpIHsKLQkJCQlmSW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmZJbWFnZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5mSW1hZ2UuZGlzcG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIuZGlzcG9zZSgpOworICAgICAgICB9CisgICAgfQogCi0JY2xhc3MgQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgRGVmYXVsdFRhYmxlUHJvdmlkZXIgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElCdW5kbGVNb2RlbCkgewotCQkJCUlCdW5kbGVNb2RlbCBtb2RlbCA9IChJQnVuZGxlTW9kZWwpIGlucHV0RWxlbWVudDsKLQkJCQlJQnVuZGxlIGJ1bmRsZSA9IG1vZGVsLmdldEJ1bmRsZSgpOwotCQkJCUlNYW5pZmVzdEhlYWRlciBoZWFkZXIgPSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5UKTsKLQkJCQlpZiAoaGVhZGVyIGluc3RhbmNlb2YgUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudEhlYWRlcikgewotCQkJCQlyZXR1cm4gKChSZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50SGVhZGVyKSBoZWFkZXIpLmdldEVudmlyb25tZW50cygpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0JfQorICAgIGNsYXNzIENvbnRlbnRQcm92aWRlciBleHRlbmRzIERlZmF1bHRUYWJsZVByb3ZpZGVyIHsKIAotCXB1YmxpYyBCdW5kbGVFeGVjdXRpb25FbnZpcm9ubWVudFNlY3Rpb24oUERFRm9ybVBhZ2UgcGFnZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYWdlLCBwYXJlbnQsIFNlY3Rpb24uREVTQ1JJUFRJT04sIG5ldyBTdHJpbmdbXSB7IFBERVVJTWVzc2FnZXMuUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudFNlY3Rpb25fYWRkLAotCQkJCVBERVVJTWVzc2FnZXMuUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudFNlY3Rpb25fcmVtb3ZlLAotCQkJCVBERVVJTWVzc2FnZXMuUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudFNlY3Rpb25fdXAsCi0JCQkJUERFVUlNZXNzYWdlcy5SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50U2VjdGlvbl9kb3duIH0pOwotCQljcmVhdGVDbGllbnQoZ2V0U2VjdGlvbigpLCBwYWdlLmdldEVkaXRvcigpLmdldFRvb2xraXQoKSk7Ci0JfQorICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworICAgICAgICAgICAgaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIElCdW5kbGVNb2RlbCkgeworICAgICAgICAgICAgICAgIElCdW5kbGVNb2RlbCBtb2RlbCA9IChJQnVuZGxlTW9kZWwpIGlucHV0RWxlbWVudDsKKyAgICAgICAgICAgICAgICBJQnVuZGxlIGJ1bmRsZSA9IG1vZGVsLmdldEJ1bmRsZSgpOworICAgICAgICAgICAgICAgIElNYW5pZmVzdEhlYWRlciBoZWFkZXIgPSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5UKTsKKyAgICAgICAgICAgICAgICBpZiAoaGVhZGVyIGluc3RhbmNlb2YgUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudEhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChSZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50SGVhZGVyKSBoZWFkZXIpLmdldEVudmlyb25tZW50cygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0WzBdOworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2xpZW50KFNlY3Rpb24gc2VjdGlvbiwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzZWN0aW9uLnNldFRleHQoUERFVUlNZXNzYWdlcy5SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50U2VjdGlvbl90aXRsZSk7Ci0JCWlmIChpc0ZyYWdtZW50KCkpIHsKLQkJCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oUERFVUlNZXNzYWdlcy5SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50U2VjdGlvbl9mcmFnbWVudERlc2MpOwotCQl9IGVsc2UgewotCQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihQREVVSU1lc3NhZ2VzLlJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRTZWN0aW9uX3BsdWdpbkRlc2MpOwotCQl9CisgICAgcHVibGljIEJ1bmRsZUV4ZWN1dGlvbkVudmlyb25tZW50U2VjdGlvbihQREVGb3JtUGFnZSBwYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIHN1cGVyKHBhZ2UsIHBhcmVudCwgU2VjdGlvbi5ERVNDUklQVElPTiwKKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFBERVVJTWVzc2FnZXMuUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudFNlY3Rpb25fYWRkLCBQREVVSU1lc3NhZ2VzLlJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRTZWN0aW9uX3JlbW92ZSwKKyAgICAgICAgICAgICAgICBQREVVSU1lc3NhZ2VzLlJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRTZWN0aW9uX3VwLCBQREVVSU1lc3NhZ2VzLlJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRTZWN0aW9uX2Rvd24gfSk7CisgICAgICAgIGNyZWF0ZUNsaWVudChnZXRTZWN0aW9uKCksIHBhZ2UuZ2V0RWRpdG9yKCkuZ2V0VG9vbGtpdCgpKTsKKyAgICB9CiAKLQkJc2VjdGlvbi5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlQ2xlYXJUYWJsZVdyYXBMYXlvdXQoZmFsc2UsIDEpKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDbGllbnQoU2VjdGlvbiBzZWN0aW9uLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7CisgICAgICAgIHNlY3Rpb24uc2V0VGV4dChQREVVSU1lc3NhZ2VzLlJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRTZWN0aW9uX3RpdGxlKTsKKyAgICAgICAgaWYgKGlzRnJhZ21lbnQoKSkgeworICAgICAgICAgICAgc2VjdGlvbi5zZXREZXNjcmlwdGlvbihQREVVSU1lc3NhZ2VzLlJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRTZWN0aW9uX2ZyYWdtZW50RGVzYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWN0aW9uLnNldERlc2NyaXB0aW9uKFBERVVJTWVzc2FnZXMuUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudFNlY3Rpb25fcGx1Z2luRGVzYyk7CisgICAgICAgIH0KIAotCQlUYWJsZVdyYXBEYXRhIGRhdGEgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgc2VjdGlvbi5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlQ2xlYXJUYWJsZVdyYXBMYXlvdXQoZmFsc2UsIDEpKTsKIAotCQlDb21wb3NpdGUgY29udGFpbmVyID0gY3JlYXRlQ2xpZW50Q29udGFpbmVyKHNlY3Rpb24sIDIsIHRvb2xraXQpOwotCQlFZGl0YWJsZVRhYmxlUGFydCB0YWJsZVBhcnQgPSBnZXRUYWJsZVBhcnQoKTsKLQkJdGFibGVQYXJ0LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7CisgICAgICAgIFRhYmxlV3JhcERhdGEgZGF0YSA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKKyAgICAgICAgc2VjdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwogCi0JCWNyZWF0ZVZpZXdlclBhcnRDb250cm9sKGNvbnRhaW5lciwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJLCAyLCB0b29sa2l0KTsKLQkJZkVFVGFibGUgPSB0YWJsZVBhcnQuZ2V0VGFibGVWaWV3ZXIoKTsKLQkJZkVFVGFibGUuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWZFRVRhYmxlLnNldExhYmVsUHJvdmlkZXIoUERFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkpOworICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyID0gY3JlYXRlQ2xpZW50Q29udGFpbmVyKHNlY3Rpb24sIDIsIHRvb2xraXQpOworICAgICAgICBFZGl0YWJsZVRhYmxlUGFydCB0YWJsZVBhcnQgPSBnZXRUYWJsZVBhcnQoKTsKKyAgICAgICAgdGFibGVQYXJ0LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7CiAKLQkJSHlwZXJsaW5rIGxpbmsgPSB0b29sa2l0LmNyZWF0ZUh5cGVybGluayhjb250YWluZXIsIFBERVVJTWVzc2FnZXMuQnVpbGRFeGVjdXRpb25FbnZpcm9ubWVudFNlY3Rpb25fY29uZmlndXJlLAotCQkJCVNXVC5OT05FKTsKLQkJbGluay5zZXRGb3JlZ3JvdW5kKHRvb2xraXQuZ2V0Q29sb3JzKCkuZ2V0Q29sb3IoSUZvcm1Db2xvcnMuVElUTEUpKTsKLQkJbGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSUh5cGVybGlua0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0VudGVyZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJfQorICAgICAgICBjcmVhdGVWaWV3ZXJQYXJ0Q29udHJvbChjb250YWluZXIsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSwgMiwgdG9vbGtpdCk7CisgICAgICAgIHRoaXMuZkVFVGFibGUgPSB0YWJsZVBhcnQuZ2V0VGFibGVWaWV3ZXIoKTsKKyAgICAgICAgdGhpcy5mRUVUYWJsZS5zZXRDb250ZW50UHJvdmlkZXIobmV3IENvbnRlbnRQcm92aWRlcigpKTsKKyAgICAgICAgdGhpcy5mRUVUYWJsZS5zZXRMYWJlbFByb3ZpZGVyKFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpKTsKIAotCQkJcHVibGljIHZvaWQgbGlua0V4aXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQl9CisgICAgICAgIEh5cGVybGluayBsaW5rID0gdG9vbGtpdC5jcmVhdGVIeXBlcmxpbmsoY29udGFpbmVyLCBQREVVSU1lc3NhZ2VzLkJ1aWxkRXhlY3V0aW9uRW52aXJvbm1lbnRTZWN0aW9uX2NvbmZpZ3VyZSwgU1dULk5PTkUpOworICAgICAgICBsaW5rLnNldEZvcmVncm91bmQodG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRDb2xvcihJRm9ybUNvbG9ycy5USVRMRSkpOworICAgICAgICBsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBJSHlwZXJsaW5rTGlzdGVuZXIoKSB7CiAKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXNob3dQcmVmZXJlbmNlUGFnZSgKLQkJCQkJCW5ldyBTdHJpbmdbXSB7ICJvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkuanJlUHJvZmlsZXMiIH0sIFBERVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsaW5rLnNldExheW91dERhdGEoZ2QpOworICAgICAgICAgICAgcHVibGljIHZvaWQgbGlua0VudGVyZWQoSHlwZXJsaW5rRXZlbnQgZSkgeworICAgICAgICAgICAgfQogCi0JCW1ha2VBY3Rpb25zKCk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKKyAgICAgICAgICAgIH0KIAotCQlJQnVuZGxlTW9kZWwgbW9kZWwgPSBnZXRCdW5kbGVNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJZkVFVGFibGUuc2V0SW5wdXQobW9kZWwpOwotCQkJbW9kZWwuYWRkTW9kZWxDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29udGFpbmVyKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29udGFpbmVyKTsKLQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBzaG93UHJlZmVyZW5jZVBhZ2UobmV3IFN0cmluZ1tdIHsgIm9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aS5qcmVQcm9maWxlcyIgfSwgUERFUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOworICAgICAgICBnZC5ob3Jpem9udGFsU3BhbiA9IDI7CisgICAgICAgIGxpbmsuc2V0TGF5b3V0RGF0YShnZCk7CiAKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd1ByZWZlcmVuY2VQYWdlKFN0cmluZ1tdIHBhZ2VJZHMsIGZpbmFsIFNoZWxsIHNoZWxsKSB7Ci0JCWZpbmFsIFByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihzaGVsbCwgcGFnZUlkc1swXSwgcGFnZUlkcywgbnVsbCk7Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSzsKLQl9CisgICAgICAgIG1ha2VBY3Rpb25zKCk7CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlJQnVuZGxlTW9kZWwgbW9kZWwgPSBnZXRCdW5kbGVNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJbW9kZWwucmVtb3ZlTW9kZWxDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9CisgICAgICAgIElCdW5kbGVNb2RlbCBtb2RlbCA9IGdldEJ1bmRsZU1vZGVsKCk7CisgICAgICAgIGlmIChtb2RlbCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmZFRVRhYmxlLnNldElucHV0KG1vZGVsKTsKKyAgICAgICAgICAgIG1vZGVsLmFkZE1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisgICAgICAgIHRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbnRhaW5lcik7CisgICAgICAgIHNlY3Rpb24uc2V0Q2xpZW50KGNvbnRhaW5lcik7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJZkVFVGFibGUucmVmcmVzaCgpOwotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzaG93UHJlZmVyZW5jZVBhZ2UoU3RyaW5nW10gcGFnZUlkcywgZmluYWwgU2hlbGwgc2hlbGwpIHsKKyAgICAgICAgZmluYWwgUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKHNoZWxsLCBwYWdlSWRzWzBdLCBwYWdlSWRzLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblNlbGVjdGVkKGludCBpbmRleCkgewotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCWNhc2UgMDoKLQkJCWhhbmRsZUFkZCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWhhbmRsZVJlbW92ZSgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCWhhbmRsZVVwKCk7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJaGFuZGxlRG93bigpOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgSUJ1bmRsZU1vZGVsIG1vZGVsID0gZ2V0QnVuZGxlTW9kZWwoKTsKKyAgICAgICAgaWYgKG1vZGVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1vZGVsLnJlbW92ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKGZBZGRBY3Rpb24pOwotCQlpZiAoIWZFRVRhYmxlLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1hbmFnZXIuYWRkKGZSZW1vdmVBY3Rpb24pOwotCQl9Ci0JCWdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS5nZXRDb250cmlidXRvcigpLmNvbnRleHRNZW51QWJvdXRUb1Nob3cobWFuYWdlcik7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7CisgICAgICAgIHRoaXMuZkVFVGFibGUucmVmcmVzaCgpOworICAgICAgICB1cGRhdGVCdXR0b25zKCk7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlmQWRkQWN0aW9uID0gbmV3IEFjdGlvbihQREVVSU1lc3NhZ2VzLlJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRTZWN0aW9uX2FkZCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaGFuZGxlQWRkKCk7Ci0JCQl9Ci0JCX07Ci0JCWZBZGRBY3Rpb24uc2V0RW5hYmxlZChpc0VkaXRhYmxlKCkpOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGJ1dHRvblNlbGVjdGVkKGludCBpbmRleCkgeworICAgICAgICBzd2l0Y2ggKGluZGV4KSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgaGFuZGxlQWRkKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaGFuZGxlUmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaGFuZGxlVXAoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBoYW5kbGVEb3duKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQkJZlJlbW92ZUFjdGlvbiA9IG5ldyBBY3Rpb24oUERFVUlNZXNzYWdlcy5OZXdNYW5pZmVzdEVkaXRvcl9MaWJyYXJ5U2VjdGlvbl9yZW1vdmUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWhhbmRsZVJlbW92ZSgpOwotCQkJfQotCQl9OwotCQlmUmVtb3ZlQWN0aW9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSgpKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7CisgICAgICAgIG1hbmFnZXIuYWRkKHRoaXMuZkFkZEFjdGlvbik7CisgICAgICAgIGlmICghdGhpcy5mRUVUYWJsZS5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CisgICAgICAgICAgICBtYW5hZ2VyLmFkZCh0aGlzLmZSZW1vdmVBY3Rpb24pOworICAgICAgICB9CisgICAgICAgIGdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS5nZXRDb250cmlidXRvcigpLmNvbnRleHRNZW51QWJvdXRUb1Nob3cobWFuYWdlcik7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7Ci0JCVRhYmxlIHRhYmxlID0gZkVFVGFibGUuZ2V0VGFibGUoKTsKLQkJaW50IGNvdW50ID0gdGFibGUuZ2V0SXRlbUNvdW50KCk7Ci0JCWJvb2xlYW4gY2FuTW92ZVVwID0gY291bnQgPiAwICYmIHRhYmxlLmdldFNlbGVjdGlvbigpLmxlbmd0aCA9PSAxICYmIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwOwotCQlib29sZWFuIGNhbk1vdmVEb3duID0gY291bnQgPiAwICYmIHRhYmxlLmdldFNlbGVjdGlvbigpLmxlbmd0aCA9PSAxICYmIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgPCBjb3VudCAtIDE7CisgICAgcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgeworICAgICAgICB0aGlzLmZBZGRBY3Rpb24gPSBuZXcgQWN0aW9uKFBERVVJTWVzc2FnZXMuUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudFNlY3Rpb25fYWRkKSB7CiAKLQkJVGFibGVQYXJ0IHRhYmxlUGFydCA9IGdldFRhYmxlUGFydCgpOwotCQl0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZCgwLCBpc0VkaXRhYmxlKCkpOwotCQl0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZCgxLCBpc0VkaXRhYmxlKCkgJiYgdGFibGUuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoID4gMCk7Ci0JCXRhYmxlUGFydC5zZXRCdXR0b25FbmFibGVkKDIsIGlzRWRpdGFibGUoKSAmJiBjYW5Nb3ZlVXApOwotCQl0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZCgzLCBpc0VkaXRhYmxlKCkgJiYgY2FuTW92ZURvd24pOwotCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGhhbmRsZUFkZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0aGlzLmZBZGRBY3Rpb24uc2V0RW5hYmxlZChpc0VkaXRhYmxlKCkpOwogCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURvd24oKSB7Ci0JCWludCBzZWxlY3Rpb24gPSBmRUVUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCXN3YXAoc2VsZWN0aW9uLCBzZWxlY3Rpb24gKyAxKTsKLQl9CisgICAgICAgIHRoaXMuZlJlbW92ZUFjdGlvbiA9IG5ldyBBY3Rpb24oUERFVUlNZXNzYWdlcy5OZXdNYW5pZmVzdEVkaXRvcl9MaWJyYXJ5U2VjdGlvbl9yZW1vdmUpIHsKIAotCXByaXZhdGUgdm9pZCBoYW5kbGVVcCgpIHsKLQkJaW50IHNlbGVjdGlvbiA9IGZFRVRhYmxlLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJc3dhcChzZWxlY3Rpb24sIHNlbGVjdGlvbiAtIDEpOwotCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGhhbmRsZVJlbW92ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0aGlzLmZSZW1vdmVBY3Rpb24uc2V0RW5hYmxlZChpc0VkaXRhYmxlKCkpOworICAgIH0KIAotCXB1YmxpYyB2b2lkIHN3YXAoaW50IGluZGV4MSwgaW50IGluZGV4MikgewotCQlSZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50SGVhZGVyIGhlYWRlciA9IGdldEhlYWRlcigpOwotCQloZWFkZXIuc3dhcChpbmRleDEsIGluZGV4Mik7Ci0JfQorICAgIHByaXZhdGUgdm9pZCB1cGRhdGVCdXR0b25zKCkgeworICAgICAgICBUYWJsZSB0YWJsZSA9IHRoaXMuZkVFVGFibGUuZ2V0VGFibGUoKTsKKyAgICAgICAgaW50IGNvdW50ID0gdGFibGUuZ2V0SXRlbUNvdW50KCk7CisgICAgICAgIGJvb2xlYW4gY2FuTW92ZVVwID0gY291bnQgPiAwICYmIHRhYmxlLmdldFNlbGVjdGlvbigpLmxlbmd0aCA9PSAxICYmIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwOworICAgICAgICBib29sZWFuIGNhbk1vdmVEb3duID0gY291bnQgPiAwICYmIHRhYmxlLmdldFNlbGVjdGlvbigpLmxlbmd0aCA9PSAxICYmIHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgPCBjb3VudCAtIDE7CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmRUVUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNzZWwuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlciA9IHNzZWwuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKLQkJCQkJZ2V0SGVhZGVyKCkucmVtb3ZlRXhlY3V0aW9uRW52aXJvbm1lbnQoKEV4ZWN1dGlvbkVudmlyb25tZW50KSBvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgICAgVGFibGVQYXJ0IHRhYmxlUGFydCA9IGdldFRhYmxlUGFydCgpOworICAgICAgICB0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZCgwLCBpc0VkaXRhYmxlKCkpOworICAgICAgICB0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZCgxLCBpc0VkaXRhYmxlKCkgJiYgdGFibGUuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoID4gMCk7CisgICAgICAgIHRhYmxlUGFydC5zZXRCdXR0b25FbmFibGVkKDIsIGlzRWRpdGFibGUoKSAmJiBjYW5Nb3ZlVXApOworICAgICAgICB0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZCgzLCBpc0VkaXRhYmxlKCkgJiYgY2FuTW92ZURvd24pOworICAgIH0KIAotCXByaXZhdGUgdm9pZCBoYW5kbGVBZGQoKSB7Ci0JCUVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyhQREVQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQluZXcgRUVMYWJlbFByb3ZpZGVyKCkpOwotCQlkaWFsb2cuc2V0RWxlbWVudHMoZ2V0RW52aXJvbm1lbnRzKCkpOwotCQlkaWFsb2cuc2V0QWxsb3dEdXBsaWNhdGVzKGZhbHNlKTsKLQkJZGlhbG9nLnNldE11bHRpcGxlU2VsZWN0aW9uKHRydWUpOwotCQlkaWFsb2cuc2V0VGl0bGUoUERFVUlNZXNzYWdlcy5SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50U2VjdGlvbl9kaWFsb2dfdGl0bGUpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShQREVVSU1lc3NhZ2VzLlJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRTZWN0aW9uX2RpYWxvZ01lc3NhZ2UpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCWFkZEV4ZWN1dGlvbkVudmlyb25tZW50cyhkaWFsb2cuZ2V0UmVzdWx0KCkpOwotCQl9Ci0JfQorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVEb3duKCkgeworICAgICAgICBpbnQgc2VsZWN0aW9uID0gdGhpcy5mRUVUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7CisgICAgICAgIHN3YXAoc2VsZWN0aW9uLCBzZWxlY3Rpb24gKyAxKTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgYWRkRXhlY3V0aW9uRW52aXJvbm1lbnRzKE9iamVjdFtdIHJlc3VsdCkgewotCQlJTWFuaWZlc3RIZWFkZXIgaGVhZGVyID0gZ2V0SGVhZGVyKCk7Ci0JCWlmIChoZWFkZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoT2JqZWN0IGVsZW1lbnQgOiByZXN1bHQpIHsKLQkJCQlTdHJpbmcgaWQgPSBudWxsOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUV4ZWN1dGlvbkVudmlyb25tZW50KSB7Ci0JCQkJCWlkID0gKChJRXhlY3V0aW9uRW52aXJvbm1lbnQpIGVsZW1lbnQpLmdldElkKCk7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKLQkJCQkJaWQgPSAoKEV4ZWN1dGlvbkVudmlyb25tZW50KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlidWZmZXIuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIoKSk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKGlkKTsKLQkJCX0KLQkJCWdldEJ1bmRsZSgpLnNldEhlYWRlcihDb25zdGFudHMuQlVORExFX1JFUVVJUkVERVhFQ1VUSU9ORU5WSVJPTk1FTlQsIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfSBlbHNlIHsKLQkJCVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRIZWFkZXIgZWUgPSAoUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudEhlYWRlcikgaGVhZGVyOwotCQkJZWUuYWRkRXhlY3V0aW9uRW52aXJvbm1lbnRzKHJlc3VsdCk7Ci0JCX0KLQl9CisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVVwKCkgeworICAgICAgICBpbnQgc2VsZWN0aW9uID0gdGhpcy5mRUVUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7CisgICAgICAgIHN3YXAoc2VsZWN0aW9uLCBzZWxlY3Rpb24gLSAxKTsKKyAgICB9CiAKLQlwcml2YXRlIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewotCQlCdW5kbGVJbnB1dENvbnRleHQgaW5wdXRDb250ZXh0ID0gZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlpZiAoaW5wdXRDb250ZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiBpbnB1dENvbnRleHQuZ2V0TGluZURlbGltaXRlcigpOwotCQl9Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQl9CisgICAgcHVibGljIHZvaWQgc3dhcChpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKSB7CisgICAgICAgIFJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRIZWFkZXIgaGVhZGVyID0gZ2V0SGVhZGVyKCk7CisgICAgICAgIGhlYWRlci5zd2FwKGluZGV4MSwgaW5kZXgyKTsKKyAgICB9CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIE9iamVjdFtdIGdldEVudmlyb25tZW50cygpIHsKLQkJUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudEhlYWRlciBoZWFkZXIgPSBnZXRIZWFkZXIoKTsKLQkJSUV4ZWN1dGlvbkVudmlyb25tZW50W10gZW52cyA9IEphdmFSdW50aW1lLmdldEV4ZWN1dGlvbkVudmlyb25tZW50c01hbmFnZXIoKS5nZXRFeGVjdXRpb25FbnZpcm9ubWVudHMoKTsKLQkJaWYgKGhlYWRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZW52czsKLQkJfQotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWhlYWRlci5oYXNFeGVjdXRpb25FbnZpcm9ubWVudChlbnZzW2ldKSkgewotCQkJCWxpc3QuYWRkKGVudnNbaV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZSgpIHsKKyAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5mRUVUYWJsZS5nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgaWYgKHNzZWwuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgSXRlcmF0b3IgaXRlciA9IHNzZWwuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SGVhZGVyKCkucmVtb3ZlRXhlY3V0aW9uRW52aXJvbm1lbnQoKEV4ZWN1dGlvbkVudmlyb25tZW50KSBvYmplY3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJTW9kZWxDaGFuZ2VkRXZlbnQgZSkgewotCQlpZiAoZS5nZXRDaGFuZ2VUeXBlKCkgPT0gSU1vZGVsQ2hhbmdlZEV2ZW50LldPUkxEX0NIQU5HRUQpIHsKLQkJCW1hcmtTdGFsZSgpOwotCQl9IGVsc2UgaWYgKGUuZ2V0Q2hhbmdlVHlwZSgpID09IElNb2RlbENoYW5nZWRFdmVudC5SRU1PVkUpIHsKLQkJCU9iamVjdFtdIG9iamVjdHMgPSBlLmdldENoYW5nZWRPYmplY3RzKCk7Ci0JCQlmb3IgKE9iamVjdCBlbGVtZW50IDogb2JqZWN0cykgewotCQkJCVRhYmxlIHRhYmxlID0gZkVFVGFibGUuZ2V0VGFibGUoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4ZWN1dGlvbkVudmlyb25tZW50KSB7Ci0JCQkJCWludCBpbmRleCA9IHRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCWZFRVRhYmxlLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJdGFibGUuc2V0U2VsZWN0aW9uKGluZGV4IDwgdGFibGUuZ2V0SXRlbUNvdW50KCkgPyBpbmRleCA6IHRhYmxlLmdldEl0ZW1Db3VudCgpIC0gMSk7Ci0JCQkJfQotCQkJfQotCQkJdXBkYXRlQnV0dG9ucygpOwotCQl9IGVsc2UgaWYgKGUuZ2V0Q2hhbmdlVHlwZSgpID09IElNb2RlbENoYW5nZWRFdmVudC5JTlNFUlQpIHsKLQkJCU9iamVjdFtdIG9iamVjdHMgPSBlLmdldENoYW5nZWRPYmplY3RzKCk7Ci0JCQlmb3IgKE9iamVjdCBlbGVtZW50IDogb2JqZWN0cykgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKLQkJCQkJZkVFVGFibGUuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChvYmplY3RzLmxlbmd0aCA+IDApIHsKLQkJCQlmRUVUYWJsZS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob2JqZWN0c1tvYmplY3RzLmxlbmd0aCAtIDFdKSk7Ci0JCQl9Ci0JCQl1cGRhdGVCdXR0b25zKCk7Ci0JCX0gZWxzZSBpZiAoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5ULmVxdWFscyhlLmdldENoYW5nZWRQcm9wZXJ0eSgpKSkgewotCQkJcmVmcmVzaCgpOwotCQl9Ci0JfQorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVBZGQoKSB7CisgICAgICAgIEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyhQREVQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgbmV3IEVFTGFiZWxQcm92aWRlcigpKTsKKyAgICAgICAgZGlhbG9nLnNldEVsZW1lbnRzKGdldEVudmlyb25tZW50cygpKTsKKyAgICAgICAgZGlhbG9nLnNldEFsbG93RHVwbGljYXRlcyhmYWxzZSk7CisgICAgICAgIGRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbih0cnVlKTsKKyAgICAgICAgZGlhbG9nLnNldFRpdGxlKFBERVVJTWVzc2FnZXMuUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudFNlY3Rpb25fZGlhbG9nX3RpdGxlKTsKKyAgICAgICAgZGlhbG9nLnNldE1lc3NhZ2UoUERFVUlNZXNzYWdlcy5SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50U2VjdGlvbl9kaWFsb2dNZXNzYWdlKTsKKyAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7CisgICAgICAgICAgICBhZGRFeGVjdXRpb25FbnZpcm9ubWVudHMoZGlhbG9nLmdldFJlc3VsdCgpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgQnVuZGxlSW5wdXRDb250ZXh0IGdldEJ1bmRsZUNvbnRleHQoKSB7Ci0JCUlucHV0Q29udGV4dE1hbmFnZXIgbWFuYWdlciA9IGdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS5nZXRDb250ZXh0TWFuYWdlcigpOwotCQlyZXR1cm4gKEJ1bmRsZUlucHV0Q29udGV4dCkgbWFuYWdlci5maW5kQ29udGV4dChCdW5kbGVJbnB1dENvbnRleHQuQ09OVEVYVF9JRCk7Ci0JfQorICAgIHByaXZhdGUgdm9pZCBhZGRFeGVjdXRpb25FbnZpcm9ubWVudHMoT2JqZWN0W10gcmVzdWx0KSB7CisgICAgICAgIElNYW5pZmVzdEhlYWRlciBoZWFkZXIgPSBnZXRIZWFkZXIoKTsKKyAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudCA6IHJlc3VsdCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWQgPSAoKElFeGVjdXRpb25FbnZpcm9ubWVudCkgZWxlbWVudCkuZ2V0SWQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFeGVjdXRpb25FbnZpcm9ubWVudCkgeworICAgICAgICAgICAgICAgICAgICBpZCA9ICgoRXhlY3V0aW9uRW52aXJvbm1lbnQpIGVsZW1lbnQpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZ2V0TGluZURlbGltaXRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2V0QnVuZGxlKCkuc2V0SGVhZGVyKENvbnN0YW50cy5CVU5ETEVfUkVRVUlSRURFWEVDVVRJT05FTlZJUk9OTUVOVCwgYnVmZmVyLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudEhlYWRlciBlZSA9IChSZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50SGVhZGVyKSBoZWFkZXI7CisgICAgICAgICAgICBlZS5hZGRFeGVjdXRpb25FbnZpcm9ubWVudHMocmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgSUJ1bmRsZSBnZXRCdW5kbGUoKSB7Ci0JCUlCdW5kbGVNb2RlbCBtb2RlbCA9IGdldEJ1bmRsZU1vZGVsKCk7Ci0JCXJldHVybiBtb2RlbCA9PSBudWxsID8gbnVsbCA6IG1vZGVsLmdldEJ1bmRsZSgpOwotCX0KKyAgICBwcml2YXRlIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgeworICAgICAgICBCdW5kbGVJbnB1dENvbnRleHQgaW5wdXRDb250ZXh0ID0gZ2V0QnVuZGxlQ29udGV4dCgpOworICAgICAgICBpZiAoaW5wdXRDb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dENvbnRleHQuZ2V0TGluZURlbGltaXRlcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKKyAgICB9CiAKLQlwcml2YXRlIElCdW5kbGVNb2RlbCBnZXRCdW5kbGVNb2RlbCgpIHsKLQkJQnVuZGxlSW5wdXRDb250ZXh0IGNvbnRleHQgPSBnZXRCdW5kbGVDb250ZXh0KCk7Ci0JCXJldHVybiBjb250ZXh0ID09IG51bGwgPyBudWxsIDogKElCdW5kbGVNb2RlbCkgY29udGV4dC5nZXRNb2RlbCgpOwotCX0KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIE9iamVjdFtdIGdldEVudmlyb25tZW50cygpIHsKKyAgICAgICAgUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudEhlYWRlciBoZWFkZXIgPSBnZXRIZWFkZXIoKTsKKyAgICAgICAgSUV4ZWN1dGlvbkVudmlyb25tZW50W10gZW52cyA9IEphdmFSdW50aW1lLmdldEV4ZWN1dGlvbkVudmlyb25tZW50c01hbmFnZXIoKS5nZXRFeGVjdXRpb25FbnZpcm9ubWVudHMoKTsKKyAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZW52czsKKyAgICAgICAgfQorICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnZzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWhlYWRlci5oYXNFeGVjdXRpb25FbnZpcm9ubWVudChlbnZzW2ldKSkgeworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGVudnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkoKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudEhlYWRlciBnZXRIZWFkZXIoKSB7Ci0JCUlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0JCWlmIChidW5kbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSU1hbmlmZXN0SGVhZGVyIGhlYWRlciA9IGJ1bmRsZS5nZXRNYW5pZmVzdEhlYWRlcihDb25zdGFudHMuQlVORExFX1JFUVVJUkVERVhFQ1VUSU9ORU5WSVJPTk1FTlQpOwotCQlpZiAoaGVhZGVyIGluc3RhbmNlb2YgUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudEhlYWRlcikgewotCQkJcmV0dXJuIChSZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50SGVhZGVyKSBoZWFkZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJTW9kZWxDaGFuZ2VkRXZlbnQgZSkgeworICAgICAgICBpZiAoZS5nZXRDaGFuZ2VUeXBlKCkgPT0gSU1vZGVsQ2hhbmdlZEV2ZW50LldPUkxEX0NIQU5HRUQpIHsKKyAgICAgICAgICAgIG1hcmtTdGFsZSgpOworICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0Q2hhbmdlVHlwZSgpID09IElNb2RlbENoYW5nZWRFdmVudC5SRU1PVkUpIHsKKyAgICAgICAgICAgIE9iamVjdFtdIG9iamVjdHMgPSBlLmdldENoYW5nZWRPYmplY3RzKCk7CisgICAgICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogb2JqZWN0cykgeworICAgICAgICAgICAgICAgIFRhYmxlIHRhYmxlID0gdGhpcy5mRUVUYWJsZS5nZXRUYWJsZSgpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mRUVUYWJsZS5yZW1vdmUoZWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNldFNlbGVjdGlvbihpbmRleCA8IHRhYmxlLmdldEl0ZW1Db3VudCgpID8gaW5kZXggOiB0YWJsZS5nZXRJdGVtQ291bnQoKSAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZUJ1dHRvbnMoKTsKKyAgICAgICAgfSBlbHNlIGlmIChlLmdldENoYW5nZVR5cGUoKSA9PSBJTW9kZWxDaGFuZ2VkRXZlbnQuSU5TRVJUKSB7CisgICAgICAgICAgICBPYmplY3RbXSBvYmplY3RzID0gZS5nZXRDaGFuZ2VkT2JqZWN0cygpOworICAgICAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudCA6IG9iamVjdHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4ZWN1dGlvbkVudmlyb25tZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZkVFVGFibGUuYWRkKGVsZW1lbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvYmplY3RzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZFRVRhYmxlLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihvYmplY3RzW29iamVjdHMubGVuZ3RoIC0gMV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZUJ1dHRvbnMoKTsKKyAgICAgICAgfSBlbHNlIGlmIChDb25zdGFudHMuQlVORExFX1JFUVVJUkVERVhFQ1VUSU9ORU5WSVJPTk1FTlQuZXF1YWxzKGUuZ2V0Q2hhbmdlZFByb3BlcnR5KCkpKSB7CisgICAgICAgICAgICByZWZyZXNoKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZyYWdtZW50KCkgewotCQlJbnB1dENvbnRleHRNYW5hZ2VyIG1hbmFnZXIgPSBnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuZ2V0Q29udGV4dE1hbmFnZXIoKTsKLQkJSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCA9IChJUGx1Z2luTW9kZWxCYXNlKSBtYW5hZ2VyLmdldEFnZ3JlZ2F0ZU1vZGVsKCk7Ci0JCXJldHVybiBtb2RlbC5pc0ZyYWdtZW50TW9kZWwoKTsKLQl9CisgICAgcHJpdmF0ZSBCdW5kbGVJbnB1dENvbnRleHQgZ2V0QnVuZGxlQ29udGV4dCgpIHsKKyAgICAgICAgSW5wdXRDb250ZXh0TWFuYWdlciBtYW5hZ2VyID0gZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLmdldENvbnRleHRNYW5hZ2VyKCk7CisgICAgICAgIHJldHVybiAoQnVuZGxlSW5wdXRDb250ZXh0KSBtYW5hZ2VyLmZpbmRDb250ZXh0KEJ1bmRsZUlucHV0Q29udGV4dC5DT05URVhUX0lEKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBkb0dsb2JhbEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsKLQkJaWYgKCFpc0VkaXRhYmxlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQorICAgIHByaXZhdGUgSUJ1bmRsZSBnZXRCdW5kbGUoKSB7CisgICAgICAgIElCdW5kbGVNb2RlbCBtb2RlbCA9IGdldEJ1bmRsZU1vZGVsKCk7CisgICAgICAgIHJldHVybiBtb2RlbCA9PSBudWxsID8gbnVsbCA6IG1vZGVsLmdldEJ1bmRsZSgpOworICAgIH0KIAotCQlpZiAoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKSB7Ci0JCQloYW5kbGVSZW1vdmUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9CisgICAgcHJpdmF0ZSBJQnVuZGxlTW9kZWwgZ2V0QnVuZGxlTW9kZWwoKSB7CisgICAgICAgIEJ1bmRsZUlucHV0Q29udGV4dCBjb250ZXh0ID0gZ2V0QnVuZGxlQ29udGV4dCgpOworICAgICAgICByZXR1cm4gY29udGV4dCA9PSBudWxsID8gbnVsbCA6IChJQnVuZGxlTW9kZWwpIGNvbnRleHQuZ2V0TW9kZWwoKTsKKyAgICB9CiAKLQkJaWYgKGFjdGlvbklkLmVxdWFscyhBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpKSkgewotCQkJLy8gZGVsZXRlIGhlcmUgYW5kIGxldCB0aGUgZWRpdG9yIHRyYW5zZmVyCi0JCQkvLyB0aGUgc2VsZWN0aW9uIHRvIHRoZSBjbGlwYm9hcmQKLQkJCWhhbmRsZVJlbW92ZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9CisgICAgcHJvdGVjdGVkIFJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRIZWFkZXIgZ2V0SGVhZGVyKCkgeworICAgICAgICBJQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZSgpOworICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIElNYW5pZmVzdEhlYWRlciBoZWFkZXIgPSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5UKTsKKyAgICAgICAgaWYgKGhlYWRlciBpbnN0YW5jZW9mIFJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRIZWFkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAoUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudEhlYWRlcikgaGVhZGVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCQlpZiAoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSkpIHsKLQkJCWRvUGFzdGUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNGcmFnbWVudCgpIHsKKyAgICAgICAgSW5wdXRDb250ZXh0TWFuYWdlciBtYW5hZ2VyID0gZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLmdldENvbnRleHRNYW5hZ2VyKCk7CisgICAgICAgIElQbHVnaW5Nb2RlbEJhc2UgbW9kZWwgPSAoSVBsdWdpbk1vZGVsQmFzZSkgbWFuYWdlci5nZXRBZ2dyZWdhdGVNb2RlbCgpOworICAgICAgICByZXR1cm4gbW9kZWwuaXNGcmFnbWVudE1vZGVsKCk7CisgICAgfQogCi0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZG9HbG9iYWxBY3Rpb24oU3RyaW5nIGFjdGlvbklkKSB7CisgICAgICAgIGlmICghaXNFZGl0YWJsZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNhblBhc3RlKE9iamVjdCB0YXJnZXQsIE9iamVjdFtdIG9iamVjdHMpIHsKLQkJUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudEhlYWRlciBoZWFkZXIgPSBnZXRIZWFkZXIoKTsKLQkJZm9yIChPYmplY3QgZWxlbWVudCA6IG9iamVjdHMpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKLQkJCQlTdHJpbmcgZW52ID0gKChFeGVjdXRpb25FbnZpcm9ubWVudCkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCWlmIChoZWFkZXIgPT0gbnVsbCB8fCAhaGVhZGVyLmhhc0VsZW1lbnQoZW52KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KKyAgICAgICAgaWYgKGFjdGlvbklkLmVxdWFscyhBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpKSkgeworICAgICAgICAgICAgaGFuZGxlUmVtb3ZlKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlpZiAoZ2V0UGFnZSgpLmdldE1vZGVsKCkuaXNFZGl0YWJsZSgpKSB7Ci0JCQl1cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQl9CisgICAgICAgIGlmIChhY3Rpb25JZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgIC8vIGRlbGV0ZSBoZXJlIGFuZCBsZXQgdGhlIGVkaXRvciB0cmFuc2ZlcgorICAgICAgICAgICAgLy8gdGhlIHNlbGVjdGlvbiB0byB0aGUgY2xpcGJvYXJkCisgICAgICAgICAgICBoYW5kbGVSZW1vdmUoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9QYXN0ZShPYmplY3QgdGFyZ2V0LCBPYmplY3RbXSBvYmplY3RzKSB7Ci0JCWFkZEV4ZWN1dGlvbkVudmlyb25tZW50cyhvYmplY3RzKTsKLQl9CisgICAgICAgIGlmIChhY3Rpb25JZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpKSkgeworICAgICAgICAgICAgZG9QYXN0ZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgdm9pZCBkb0Z1bGxCdWlsZChmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUpvYiBidWlsZEpvYiA9IG5ldyBKb2IoUERFVUlNZXNzYWdlcy5Db21waWxlcnNDb25maWd1cmF0aW9uQmxvY2tfYnVpbGRpbmcpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQgPT0gZmFtaWx5OwotCQkJfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQl0cnkgewotCQkJCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgSmF2YUNvcmUuQlVJTERFUl9JRCwgbnVsbCwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQlidWlsZEpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLmJ1aWxkUnVsZSgpKTsKLQkJYnVpbGRKb2Iuc2NoZWR1bGUoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuUGFzdGUoT2JqZWN0IHRhcmdldCwgT2JqZWN0W10gb2JqZWN0cykgeworICAgICAgICBSZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50SGVhZGVyIGhlYWRlciA9IGdldEhlYWRlcigpOworICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogb2JqZWN0cykgeworICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFeGVjdXRpb25FbnZpcm9ubWVudCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBlbnYgPSAoKEV4ZWN1dGlvbkVudmlyb25tZW50KSBlbGVtZW50KS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsIHx8ICFoZWFkZXIuaGFzRWxlbWVudChlbnYpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKyAgICAgICAgZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOworICAgICAgICBpZiAoZ2V0UGFnZSgpLmdldE1vZGVsKCkuaXNFZGl0YWJsZSgpKSB7CisgICAgICAgICAgICB1cGRhdGVCdXR0b25zKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1Bhc3RlKE9iamVjdCB0YXJnZXQsIE9iamVjdFtdIG9iamVjdHMpIHsKKyAgICAgICAgYWRkRXhlY3V0aW9uRW52aXJvbm1lbnRzKG9iamVjdHMpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVFeHBvcnRQYWNrYWdlU2VjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVFeHBvcnRQYWNrYWdlU2VjdGlvbi5qYXZhCmluZGV4IGYwZTg4MDAuLjYwYTFiZTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlRXhwb3J0UGFja2FnZVNlY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUV4cG9ydFBhY2thZ2VTZWN0aW9uLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwudWkuZWRpdG9yLlBERUZvcm1QYWdlOwpAQCAtMTksMTEgKzIwLDExIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVFeHBvcnRQYWNrYWdlU2VjdGlvbiBleHRlbmRzIEV4cG9ydFBhY2thZ2VTZWN0aW9uIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJFbnVtZXJhdGUgYWxsIHRoZSBwYWNrYWdlcyB0aGF0IHRoaXMgYnVuZGxlIGV4cG9zZXMgdG8gY2xpZW50cy4gQWxsIG90aGVyIHBhY2thZ2VzIHdpbGwgYmUgaGlkZGVuIGZyb20gY2xpZW50cyBhdCBhbGwgdGltZXMuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiRW51bWVyYXRlIGFsbCB0aGUgcGFja2FnZXMgdGhhdCB0aGlzIGJ1bmRsZSBleHBvc2VzIHRvIGNsaWVudHMuIEFsbCBvdGhlciBwYWNrYWdlcyB3aWxsIGJlIGhpZGRlbiBmcm9tIGNsaWVudHMgYXQgYWxsIHRpbWVzLiI7CiAKLQlwdWJsaWMgQnVuZGxlRXhwb3J0UGFja2FnZVNlY3Rpb24oUERFRm9ybVBhZ2UgcGFnZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYWdlLCBwYXJlbnQpOwotCQlnZXRTZWN0aW9uKCkuc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotCX0KKyAgICBwdWJsaWMgQnVuZGxlRXhwb3J0UGFja2FnZVNlY3Rpb24oUERFRm9ybVBhZ2UgcGFnZSwgQ29tcG9zaXRlIHBhcmVudCkgeworICAgICAgICBzdXBlcihwYWdlLCBwYXJlbnQpOworICAgICAgICBnZXRTZWN0aW9uKCkuc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVHZW5lcmFsSW5mb1NlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlR2VuZXJhbEluZm9TZWN0aW9uLmphdmEKaW5kZXggZjUzOWM3ZS4uZjVhZTdiMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVHZW5lcmFsSW5mb1NlY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUdlbmVyYWxJbmZvU2VjdGlvbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CkBAIC00MCwxMzggKzQxLDEzNyBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlR2VuZXJhbEluZm9TZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQZGVHZW5lcmFsSW5mb1NlY3Rpb24gewogCi0JcHJpdmF0ZSBGb3JtRW50cnkgZkNsYXNzRW50cnk7CisgICAgcHJpdmF0ZSBGb3JtRW50cnkgZkNsYXNzRW50cnk7CiAKLQlwcml2YXRlIFR5cGVGaWVsZEFzc2lzdERpc3Bvc2VyIGZUeXBlRmllbGRBc3Npc3REaXNwb3NlcjsKKyAgICBwcml2YXRlIFR5cGVGaWVsZEFzc2lzdERpc3Bvc2VyIGZUeXBlRmllbGRBc3Npc3REaXNwb3NlcjsKIAotCXB1YmxpYyBCdW5kbGVHZW5lcmFsSW5mb1NlY3Rpb24oUERFRm9ybVBhZ2UgcGFnZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYWdlLCBwYXJlbnQpOwotCX0KKyAgICBwdWJsaWMgQnVuZGxlR2VuZXJhbEluZm9TZWN0aW9uKFBERUZvcm1QYWdlIHBhZ2UsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICAgICAgc3VwZXIocGFnZSwgcGFyZW50KTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTcGVjaWZpY0NvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIEZvcm1Ub29sa2l0IHRvb2xraXQsIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJY3JlYXRlQ2xhc3NFbnRyeShwYXJlbnQsIHRvb2xraXQsIGFjdGlvbkJhcnMpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTcGVjaWZpY0NvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIEZvcm1Ub29sa2l0IHRvb2xraXQsIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKyAgICAgICAgY3JlYXRlQ2xhc3NFbnRyeShwYXJlbnQsIHRvb2xraXQsIGFjdGlvbkJhcnMpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNsaWVudChTZWN0aW9uIHNlY3Rpb24sIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc2VjdGlvbi5zZXRUZXh0KFBERVVJTWVzc2FnZXMuTWFuaWZlc3RFZGl0b3JfUGx1Z2luU3BlY1NlY3Rpb25fdGl0bGUpOwotCQlzZWN0aW9uLnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVDbGVhclRhYmxlV3JhcExheW91dChmYWxzZSwgMSkpOwotCQlUYWJsZVdyYXBEYXRhIGRhdGEgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDbGllbnQoU2VjdGlvbiBzZWN0aW9uLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7CisgICAgICAgIHNlY3Rpb24uc2V0VGV4dChQREVVSU1lc3NhZ2VzLk1hbmlmZXN0RWRpdG9yX1BsdWdpblNwZWNTZWN0aW9uX3RpdGxlKTsKKyAgICAgICAgc2VjdGlvbi5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlQ2xlYXJUYWJsZVdyYXBMYXlvdXQoZmFsc2UsIDEpKTsKKyAgICAgICAgVGFibGVXcmFwRGF0YSBkYXRhID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOworICAgICAgICBzZWN0aW9uLnNldExheW91dERhdGEoZGF0YSk7CiAKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJY2xpZW50LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVTZWN0aW9uQ2xpZW50VGFibGVXcmFwTGF5b3V0KGZhbHNlLCAzKSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNsaWVudCk7CisgICAgICAgIHNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkpOworICAgICAgICBDb21wb3NpdGUgY2xpZW50ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7CisgICAgICAgIGNsaWVudC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlU2VjdGlvbkNsaWVudFRhYmxlV3JhcExheW91dChmYWxzZSwgMykpOworICAgICAgICBzZWN0aW9uLnNldENsaWVudChjbGllbnQpOwogCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJY3JlYXRlSURFbnRyeShjbGllbnQsIHRvb2xraXQsIGFjdGlvbkJhcnMpOwotCQljcmVhdGVWZXJzaW9uRW50cnkoY2xpZW50LCB0b29sa2l0LCBhY3Rpb25CYXJzKTsKLQkJY3JlYXRlTmFtZUVudHJ5KGNsaWVudCwgdG9vbGtpdCwgYWN0aW9uQmFycyk7Ci0JCWNyZWF0ZVByb3ZpZGVyRW50cnkoY2xpZW50LCB0b29sa2l0LCBhY3Rpb25CYXJzKTsKLQkJY3JlYXRlU3BlY2lmaWNDb250cm9scyhjbGllbnQsIHRvb2xraXQsIGFjdGlvbkJhcnMpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihjbGllbnQpOworICAgICAgICBJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7CisgICAgICAgIGNyZWF0ZUlERW50cnkoY2xpZW50LCB0b29sa2l0LCBhY3Rpb25CYXJzKTsKKyAgICAgICAgY3JlYXRlVmVyc2lvbkVudHJ5KGNsaWVudCwgdG9vbGtpdCwgYWN0aW9uQmFycyk7CisgICAgICAgIGNyZWF0ZU5hbWVFbnRyeShjbGllbnQsIHRvb2xraXQsIGFjdGlvbkJhcnMpOworICAgICAgICBjcmVhdGVQcm92aWRlckVudHJ5KGNsaWVudCwgdG9vbGtpdCwgYWN0aW9uQmFycyk7CisgICAgICAgIGNyZWF0ZVNwZWNpZmljQ29udHJvbHMoY2xpZW50LCB0b29sa2l0LCBhY3Rpb25CYXJzKTsKKyAgICAgICAgdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY2xpZW50KTsKIAotCQlhZGRMaXN0ZW5lcnMoKTsKLQl9CisgICAgICAgIGFkZExpc3RlbmVycygpOworICAgIH0KIAotCXByaXZhdGUgdm9pZCBjcmVhdGVDbGFzc0VudHJ5KENvbXBvc2l0ZSBjbGllbnQsIEZvcm1Ub29sa2l0IHRvb2xraXQsIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJYm9vbGVhbiBpc0VkaXRhYmxlID0gaXNFZGl0YWJsZSgpOwotCQlmQ2xhc3NFbnRyeSA9IG5ldyBGb3JtRW50cnkoY2xpZW50LCB0b29sa2l0LCBQREVVSU1lc3NhZ2VzLkdlbmVyYWxJbmZvU2VjdGlvbl9jbGFzcywKLQkJCQlQREVVSU1lc3NhZ2VzLkdlbmVyYWxJbmZvU2VjdGlvbl9icm93c2UsIC8vCi0JCQkJaXNFZGl0YWJsZSgpKTsKLQkJZkNsYXNzRW50cnkuc2V0Rm9ybUVudHJ5TGlzdGVuZXIobmV3IEZvcm1FbnRyeUFkYXB0ZXIodGhpcywgYWN0aW9uQmFycykgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0ZXh0VmFsdWVDaGFuZ2VkKEZvcm1FbnRyeSBlbnRyeSkgewotCQkJCXRyeSB7Ci0JCQkJCSgoSVBsdWdpbikgZ2V0UGx1Z2luQmFzZSgpKS5zZXRDbGFzc05hbWUoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBERVBsdWdpbi5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQorICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDbGFzc0VudHJ5KENvbXBvc2l0ZSBjbGllbnQsIEZvcm1Ub29sa2l0IHRvb2xraXQsIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKyAgICAgICAgYm9vbGVhbiBpc0VkaXRhYmxlID0gaXNFZGl0YWJsZSgpOworICAgICAgICB0aGlzLmZDbGFzc0VudHJ5ID0gbmV3IEZvcm1FbnRyeShjbGllbnQsIHRvb2xraXQsIFBERVVJTWVzc2FnZXMuR2VuZXJhbEluZm9TZWN0aW9uX2NsYXNzLCBQREVVSU1lc3NhZ2VzLkdlbmVyYWxJbmZvU2VjdGlvbl9icm93c2UsIC8vCisgICAgICAgICAgICBpc0VkaXRhYmxlKCkpOworICAgICAgICB0aGlzLmZDbGFzc0VudHJ5LnNldEZvcm1FbnRyeUxpc3RlbmVyKG5ldyBGb3JtRW50cnlBZGFwdGVyKHRoaXMsIGFjdGlvbkJhcnMpIHsKIAotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgdmFsdWUgPSBmQ2xhc3NFbnRyeS5nZXRWYWx1ZSgpOwotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuZ2V0Q29tbW9uUHJvamVjdCgpOwotCQkJCXZhbHVlID0gUERFSmF2YUhlbHBlclVJLmNyZWF0ZUNsYXNzKHZhbHVlLCBwcm9qZWN0LCBjcmVhdGVKYXZhQXR0cmlidXRlVmFsdWUoKSwgZmFsc2UpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWZDbGFzc0VudHJ5LnNldFZhbHVlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRleHRWYWx1ZUNoYW5nZWQoRm9ybUVudHJ5IGVudHJ5KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgKChJUGx1Z2luKSBnZXRQbHVnaW5CYXNlKCkpLnNldENsYXNzTmFtZShlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgUERFUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYnJvd3NlQnV0dG9uU2VsZWN0ZWQoRm9ybUVudHJ5IGVudHJ5KSB7Ci0JCQkJZG9PcGVuU2VsZWN0aW9uRGlhbG9nKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQkJZkNsYXNzRW50cnkuc2V0RWRpdGFibGUoaXNFZGl0YWJsZSk7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IEJ1bmRsZUdlbmVyYWxJbmZvU2VjdGlvbi50aGlzLmZDbGFzc0VudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS5nZXRDb21tb25Qcm9qZWN0KCk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBQREVKYXZhSGVscGVyVUkuY3JlYXRlQ2xhc3ModmFsdWUsIHByb2plY3QsIGNyZWF0ZUphdmFBdHRyaWJ1dGVWYWx1ZSgpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlR2VuZXJhbEluZm9TZWN0aW9uLnRoaXMuZkNsYXNzRW50cnkuc2V0VmFsdWUodmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQlpZiAoaXNFZGl0YWJsZSkgewotCQkJZlR5cGVGaWVsZEFzc2lzdERpc3Bvc2VyID0gUERFSmF2YUhlbHBlclVJLmFkZFR5cGVGaWVsZEFzc2lzdFRvVGV4dChmQ2xhc3NFbnRyeS5nZXRUZXh0KCksIGdldFByb2plY3QoKSwKLQkJCQkJSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1MpOwotCQl9Ci0JfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBicm93c2VCdXR0b25TZWxlY3RlZChGb3JtRW50cnkgZW50cnkpIHsKKyAgICAgICAgICAgICAgICBkb09wZW5TZWxlY3Rpb25EaWFsb2coZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmZDbGFzc0VudHJ5LnNldEVkaXRhYmxlKGlzRWRpdGFibGUpOwogCi0JcHJpdmF0ZSBKYXZhQXR0cmlidXRlVmFsdWUgY3JlYXRlSmF2YUF0dHJpYnV0ZVZhbHVlKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLmdldENvbW1vblByb2plY3QoKTsKLQkJSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCA9IChJUGx1Z2luTW9kZWxCYXNlKSBnZXRQYWdlKCkuZ2V0TW9kZWwoKTsKLQkJcmV0dXJuIG5ldyBKYXZhQXR0cmlidXRlVmFsdWUocHJvamVjdCwgbW9kZWwsIG51bGwsIGZDbGFzc0VudHJ5LmdldFZhbHVlKCkpOwotCX0KKyAgICAgICAgaWYgKGlzRWRpdGFibGUpIHsKKyAgICAgICAgICAgIHRoaXMuZlR5cGVGaWVsZEFzc2lzdERpc3Bvc2VyID0gUERFSmF2YUhlbHBlclVJLmFkZFR5cGVGaWVsZEFzc2lzdFRvVGV4dCh0aGlzLmZDbGFzc0VudHJ5LmdldFRleHQoKSwgZ2V0UHJvamVjdCgpLAorICAgICAgICAgICAgICAgIElKYXZhU2VhcmNoQ29uc3RhbnRzLkNMQVNTKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgdm9pZCBkb09wZW5TZWxlY3Rpb25EaWFsb2coU3RyaW5nIGNsYXNzTmFtZSkgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRQbHVnaW5CYXNlKCkuZ2V0TW9kZWwoKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJU3RyaW5nIHR5cGUgPSBQREVKYXZhSGVscGVyVUkuc2VsZWN0VHlwZShyZXNvdXJjZSwgSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsIGNsYXNzTmFtZSwKLQkJCQludWxsKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJZkNsYXNzRW50cnkuc2V0VmFsdWUodHlwZSk7Ci0JCX0KLQl9CisgICAgcHJpdmF0ZSBKYXZhQXR0cmlidXRlVmFsdWUgY3JlYXRlSmF2YUF0dHJpYnV0ZVZhbHVlKCkgeworICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLmdldENvbW1vblByb2plY3QoKTsKKyAgICAgICAgSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCA9IChJUGx1Z2luTW9kZWxCYXNlKSBnZXRQYWdlKCkuZ2V0TW9kZWwoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXZhQXR0cmlidXRlVmFsdWUocHJvamVjdCwgbW9kZWwsIG51bGwsIHRoaXMuZkNsYXNzRW50cnkuZ2V0VmFsdWUoKSk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYnVuZGxlIjsKLQl9CisgICAgcHJpdmF0ZSB2b2lkIGRvT3BlblNlbGVjdGlvbkRpYWxvZyhTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIElSZXNvdXJjZSByZXNvdXJjZSA9IGdldFBsdWdpbkJhc2UoKS5nZXRNb2RlbCgpLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworICAgICAgICBTdHJpbmcgdHlwZSA9IFBERUphdmFIZWxwZXJVSS5zZWxlY3RUeXBlKHJlc291cmNlLCBJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywgY2xhc3NOYW1lLCBudWxsKTsKKyAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5mQ2xhc3NFbnRyeS5zZXRWYWx1ZSh0eXBlKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKiBGb3IgSlVuaXQgdGVzdGluZyBvbmx5ICogKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiBmTmFtZUVudHJ5LmdldFRleHQoKS5nZXRUZXh0KCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gIlRoaXMgc2VjdGlvbiBkZXNjcmliZXMgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGJ1bmRsZSI7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlpZiAoZlR5cGVGaWVsZEFzc2lzdERpc3Bvc2VyICE9IG51bGwpIHsKLQkJCWZUeXBlRmllbGRBc3Npc3REaXNwb3Nlci5kaXNwb3NlKCk7Ci0JCX0KLQl9CisgICAgLyoqIEZvciBKVW5pdCB0ZXN0aW5nIG9ubHkgKiAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZk5hbWVFbnRyeS5nZXRUZXh0KCkuZ2V0VGV4dCgpOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNvbW1pdChib29sZWFuIG9uU2F2ZSkgewotCQlmQ2xhc3NFbnRyeS5jb21taXQoKTsKLQkJc3VwZXIuY29tbWl0KG9uU2F2ZSk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKKyAgICAgICAgaWYgKHRoaXMuZlR5cGVGaWVsZEFzc2lzdERpc3Bvc2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZlR5cGVGaWVsZEFzc2lzdERpc3Bvc2VyLmRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNhbmNlbEVkaXQoKSB7Ci0JCWZDbGFzc0VudHJ5LmNhbmNlbEVkaXQoKTsKLQkJc3VwZXIuY2FuY2VsRWRpdCgpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb21taXQoYm9vbGVhbiBvblNhdmUpIHsKKyAgICAgICAgdGhpcy5mQ2xhc3NFbnRyeS5jb21taXQoKTsKKyAgICAgICAgc3VwZXIuY29tbWl0KG9uU2F2ZSk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCA9IChJUGx1Z2luTW9kZWxCYXNlKSBnZXRQYWdlKCkuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUlQbHVnaW4gcGx1Z2luID0gKElQbHVnaW4pIG1vZGVsLmdldFBsdWdpbkJhc2UoKTsKLQkJCS8vIE9ubHkgdXBkYXRlIHRoaXMgZmllbGQgaWYgaXQgYWxyZWFkeSBoYXMgbm90IGJlZW4gbW9kaWZpZWQKLQkJCS8vIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBjdXJzb3IgZnJvbSBiZWluZyBzZXQgdG8gcG9zaXRpb24gMCBhZnRlcgotCQkJLy8gYWNjZXB0aW5nIGEgZmllbGQgYXNzaXN0IHByb3Bvc2FsIHVzaW5nIFxyCi0JCQlpZiAoZkNsYXNzRW50cnkuaXNEaXJ0eSgpID09IGZhbHNlKSB7Ci0JCQkJZkNsYXNzRW50cnkuc2V0VmFsdWUocGx1Z2luLmdldENsYXNzTmFtZSgpLCB0cnVlKTsKLQkJCX0KLQkJfQotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNhbmNlbEVkaXQoKSB7CisgICAgICAgIHRoaXMuZkNsYXNzRW50cnkuY2FuY2VsRWRpdCgpOworICAgICAgICBzdXBlci5jYW5jZWxFZGl0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKKyAgICAgICAgSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCA9IChJUGx1Z2luTW9kZWxCYXNlKSBnZXRQYWdlKCkuZ2V0TW9kZWwoKTsKKyAgICAgICAgaWYgKG1vZGVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIElQbHVnaW4gcGx1Z2luID0gKElQbHVnaW4pIG1vZGVsLmdldFBsdWdpbkJhc2UoKTsKKyAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoaXMgZmllbGQgaWYgaXQgYWxyZWFkeSBoYXMgbm90IGJlZW4gbW9kaWZpZWQKKyAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBjdXJzb3IgZnJvbSBiZWluZyBzZXQgdG8gcG9zaXRpb24gMCBhZnRlcgorICAgICAgICAgICAgLy8gYWNjZXB0aW5nIGEgZmllbGQgYXNzaXN0IHByb3Bvc2FsIHVzaW5nIFxyCisgICAgICAgICAgICBpZiAodGhpcy5mQ2xhc3NFbnRyeS5pc0RpcnR5KCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZDbGFzc0VudHJ5LnNldFZhbHVlKHBsdWdpbi5nZXRDbGFzc05hbWUoKSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIucmVmcmVzaCgpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvbi5qYXZhCmluZGV4IGYxMGJiMjQuLjBhMjI5OTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlSW1wb3J0TGlicmFyeVNlY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUltcG9ydExpYnJhcnlTZWN0aW9uLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTQ3LDI5OSArNDgsMjkyIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0SW1wb3J0U2VjdGlvbiB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiU3BlY2lmeSB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgcmVxdWlyZWQgZm9yIHRoZSBvcGVyYXRpb24gb2YgdGhpcyBidW5kbGUuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiU3BlY2lmeSB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgcmVxdWlyZWQgZm9yIHRoZSBvcGVyYXRpb24gb2YgdGhpcyBidW5kbGUuIjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfSU5ERVggPSAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfSU5ERVggPSAwOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9SRU1PVEVfQlVORExFX0lOREVYID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX1JFTU9URV9CVU5ETEVfSU5ERVggPSAxOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9JTkRFWCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9JTkRFWCA9IDI7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVElFU19JTkRFWCA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRJRVNfSU5ERVggPSAzOwogCi0JcHVibGljIEJ1bmRsZUltcG9ydExpYnJhcnlTZWN0aW9uKFBERUZvcm1QYWdlIHBhZ2UsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFnZSwgcGFyZW50LCBTZWN0aW9uLkRFU0NSSVBUSU9OLCBuZXcgU3RyaW5nW10geyBQREVVSU1lc3NhZ2VzLkltcG9ydFBhY2thZ2VTZWN0aW9uX2FkZCwgIkRvd25sb2FkLi4uIiwKLQkJCQlQREVVSU1lc3NhZ2VzLkltcG9ydFBhY2thZ2VTZWN0aW9uX3JlbW92ZSwgUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9wcm9wZXJ0aWVzIH0pOworICAgIHB1YmxpYyBCdW5kbGVJbXBvcnRMaWJyYXJ5U2VjdGlvbihQREVGb3JtUGFnZSBwYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIHN1cGVyKHBhZ2UsIHBhcmVudCwgU2VjdGlvbi5ERVNDUklQVElPTiwgbmV3IFN0cmluZ1tdIHsgUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9hZGQsICJEb3dubG9hZC4uLiIsCisgICAgICAgICAgICBQREVVSU1lc3NhZ2VzLkltcG9ydFBhY2thZ2VTZWN0aW9uX3JlbW92ZSwgUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9wcm9wZXJ0aWVzIH0pOwogCi0JCWdldFNlY3Rpb24oKS5zZXRUZXh0KCJJbXBvcnQgTGlicmFyeSIpOwotCQlnZXRTZWN0aW9uKCkuc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotCQlnZXRUYWJsZVBhcnQoKS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JfQorICAgICAgICBnZXRTZWN0aW9uKCkuc2V0VGV4dCgiSW1wb3J0IExpYnJhcnkiKTsKKyAgICAgICAgZ2V0U2VjdGlvbigpLnNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKKyAgICAgICAgZ2V0VGFibGVQYXJ0KCkuc2V0RWRpdGFibGUoZmFsc2UpOworICAgIH0KIAotCWNsYXNzIEltcG9ydExpYnJhcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0VGFibGVQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0JCQlJbXBvcnRMaWJyYXJ5SGVhZGVyIGhlYWRlciA9IChJbXBvcnRMaWJyYXJ5SGVhZGVyKSBnZXRCdW5kbGUoKS5nZXRNYW5pZmVzdEhlYWRlcigKLQkJCQkJSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSk7Ci0JCQlpZiAoaGVhZGVyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGhlYWRlci5nZXRJbXBvcnRlZExpYnJhcmllcygpOwotCQkJfQotCQl9Ci0JfQorICAgIGNsYXNzIEltcG9ydExpYnJhcnlDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0VGFibGVQcm92aWRlciB7CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSW1wb3J0TGlicmFyeUNvbnRlbnRQcm92aWRlcigpOwotCX0KKyAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBwYXJlbnQpIHsKKyAgICAgICAgICAgIEltcG9ydExpYnJhcnlIZWFkZXIgaGVhZGVyID0gKEltcG9ydExpYnJhcnlIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlkpOworICAgICAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXIuZ2V0SW1wb3J0ZWRMaWJyYXJpZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJVGFibGVMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSW1wb3J0TGlicmFyeUxhYmVsUHJvdmlkZXIoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IEltcG9ydExpYnJhcnlDb250ZW50UHJvdmlkZXIoKTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgc2V0RWxlbWVudHMoSW1wb3J0TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2csIGJvb2xlYW4gYWRkUmVtb3RlKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoKEJ1bmRsZU1hbmlmZXN0RWRpdG9yKSB0aGlzLmdldFBhZ2UoKS5nZXRFZGl0b3IoKSkuZ2V0Q29tbW9uUHJvamVjdCgpOwotCQlJQXJ0ZWZhY3RbXSBsaWJyYXJpZXMgPSBudWxsOwotCQlpZiAoYWRkUmVtb3RlKSB7Ci0JCQlBcnRlZmFjdFJlcG9zaXRvcnkgYnVuZGxlUmVwb3NpdG9yeSA9IFJlcG9zaXRvcnlVdGlscy5zZWFyY2hGb3JBcnRpZmFjdHMoIiIsIGZhbHNlLCB0cnVlKTsKLQkJCWxpYnJhcmllcyA9IGJ1bmRsZVJlcG9zaXRvcnkuZ2V0TGlicmFyeVNldCgpLnRvQXJyYXkoKTsKLQkJfSBlbHNlIHsKLQkJCUNvbGxlY3Rpb248QXJ0ZWZhY3Q+IGxpYnJhcnlMaXN0ID0gUmVwb3NpdG9yeVV0aWxzLmdldEltcG9ydExpYnJhcnlQcm9wb3NhbHMocHJvamVjdCwgIiIpOwotCQkJcmVtb3ZlRXhpc3RpbmdMaWJyYXJpZXMobGlicmFyeUxpc3QpOwotCQkJbGlicmFyaWVzID0gbGlicmFyeUxpc3QudG9BcnJheShuZXcgSUFydGVmYWN0W10ge30pOwotCQl9Ci0JCWRpYWxvZy5zZXRFbGVtZW50cyhsaWJyYXJpZXMpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgSVRhYmxlTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IEltcG9ydExpYnJhcnlMYWJlbFByb3ZpZGVyKCk7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUV4aXN0aW5nTGlicmFyaWVzKENvbGxlY3Rpb248QXJ0ZWZhY3Q+IGJ1bmRsZXMpIHsKLQkJSW1wb3J0TGlicmFyeUhlYWRlciBoZWFkZXIgPSAoSW1wb3J0TGlicmFyeUhlYWRlcikgZ2V0QnVuZGxlKCkuZ2V0TWFuaWZlc3RIZWFkZXIoCi0JCQkJSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSk7Ci0JCVNldDxBcnRlZmFjdD4gZmlsdGVyZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0PEFydGVmYWN0PigpOworICAgIHByaXZhdGUgdm9pZCBzZXRFbGVtZW50cyhJbXBvcnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZywgYm9vbGVhbiBhZGRSZW1vdGUpIHsKKyAgICAgICAgSVByb2plY3QgcHJvamVjdCA9ICgoQnVuZGxlTWFuaWZlc3RFZGl0b3IpIHRoaXMuZ2V0UGFnZSgpLmdldEVkaXRvcigpKS5nZXRDb21tb25Qcm9qZWN0KCk7CisgICAgICAgIElBcnRlZmFjdFtdIGxpYnJhcmllcyA9IG51bGw7CisgICAgICAgIGlmIChhZGRSZW1vdGUpIHsKKyAgICAgICAgICAgIEFydGVmYWN0UmVwb3NpdG9yeSBidW5kbGVSZXBvc2l0b3J5ID0gUmVwb3NpdG9yeVV0aWxzLnNlYXJjaEZvckFydGlmYWN0cygiIiwgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgbGlicmFyaWVzID0gYnVuZGxlUmVwb3NpdG9yeS5nZXRMaWJyYXJ5U2V0KCkudG9BcnJheSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ29sbGVjdGlvbjxBcnRlZmFjdD4gbGlicmFyeUxpc3QgPSBSZXBvc2l0b3J5VXRpbHMuZ2V0SW1wb3J0TGlicmFyeVByb3Bvc2Fscyhwcm9qZWN0LCAiIik7CisgICAgICAgICAgICByZW1vdmVFeGlzdGluZ0xpYnJhcmllcyhsaWJyYXJ5TGlzdCk7CisgICAgICAgICAgICBsaWJyYXJpZXMgPSBsaWJyYXJ5TGlzdC50b0FycmF5KG5ldyBJQXJ0ZWZhY3RbXSB7fSk7CisgICAgICAgIH0KKyAgICAgICAgZGlhbG9nLnNldEVsZW1lbnRzKGxpYnJhcmllcyk7CisgICAgfQogCi0JCWlmIChoZWFkZXIgIT0gbnVsbCkgewotCQkJSW1wb3J0TGlicmFyeU9iamVjdFtdIGZpbHRlciA9IGhlYWRlci5nZXRJbXBvcnRlZExpYnJhcmllcygpOwotCQkJZm9yIChBcnRlZmFjdCBwcm9wb3NhbCA6IGJ1bmRsZXMpIHsKLQkJCQlmb3IgKEltcG9ydExpYnJhcnlPYmplY3QgaW1wb3J0ZWQgOiBmaWx0ZXIpIHsKLQkJCQkJaWYgKHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoaW1wb3J0ZWQuZ2V0SWQoKSkpIHsKLQkJCQkJCWZpbHRlcmVkRWxlbWVudHMuYWRkKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWJ1bmRsZXMucmVtb3ZlQWxsKGZpbHRlcmVkRWxlbWVudHMpOwotCQl9Ci0JfQorICAgIHByaXZhdGUgdm9pZCByZW1vdmVFeGlzdGluZ0xpYnJhcmllcyhDb2xsZWN0aW9uPEFydGVmYWN0PiBidW5kbGVzKSB7CisgICAgICAgIEltcG9ydExpYnJhcnlIZWFkZXIgaGVhZGVyID0gKEltcG9ydExpYnJhcnlIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlkpOworICAgICAgICBTZXQ8QXJ0ZWZhY3Q+IGZpbHRlcmVkRWxlbWVudHMgPSBuZXcgSGFzaFNldDxBcnRlZmFjdD4oKTsKIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZCgpIHsKLQkJaW50ZXJuYWxIYW5kbGVBZGQoZmFsc2UpOwotCQlyZXR1cm47Ci0JfQorICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIEltcG9ydExpYnJhcnlPYmplY3RbXSBmaWx0ZXIgPSBoZWFkZXIuZ2V0SW1wb3J0ZWRMaWJyYXJpZXMoKTsKKyAgICAgICAgICAgIGZvciAoQXJ0ZWZhY3QgcHJvcG9zYWwgOiBidW5kbGVzKSB7CisgICAgICAgICAgICAgICAgZm9yIChJbXBvcnRMaWJyYXJ5T2JqZWN0IGltcG9ydGVkIDogZmlsdGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wb3NhbC5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGltcG9ydGVkLmdldElkKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEVsZW1lbnRzLmFkZChwcm9wb3NhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidW5kbGVzLnJlbW92ZUFsbChmaWx0ZXJlZEVsZW1lbnRzKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEhhbmRsZUFkZChmaW5hbCBib29sZWFuIGFkZFJlbW90ZSkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZCgpIHsKKyAgICAgICAgaW50ZXJuYWxIYW5kbGVBZGQoZmFsc2UpOworICAgICAgICByZXR1cm47CisgICAgfQogCi0JCWZpbmFsIEltcG9ydExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEltcG9ydExpc3RTZWxlY3Rpb25EaWFsb2coUERFUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJbmV3IEJ1bmRsZUltcG9ydERpYWxvZ0xhYmVsUHJvdmlkZXIoKSk7CisgICAgcHJpdmF0ZSB2b2lkIGludGVybmFsSGFuZGxlQWRkKGZpbmFsIGJvb2xlYW4gYWRkUmVtb3RlKSB7CiAKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2V0RWxlbWVudHMoZGlhbG9nLCBhZGRSZW1vdGUpOwotCQkJCWRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbih0cnVlKTsKLQkJCQlkaWFsb2cuc2V0VGl0bGUoIkxpYnJhcnkgU2VsZWN0aW9uIik7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoIlNlbGVjdCBhIExpYnJhcnk6Iik7Ci0JCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJCVNXVFV0aWwuc2V0RGlhbG9nU2l6ZShkaWFsb2csIDQwMCwgNTAwKTsKLQkJCX0KLQkJfTsKKyAgICAgICAgZmluYWwgSW1wb3J0TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgSW1wb3J0TGlzdFNlbGVjdGlvbkRpYWxvZyhQREVQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKKyAgICAgICAgICAgIG5ldyBCdW5kbGVJbXBvcnREaWFsb2dMYWJlbFByb3ZpZGVyKCkpOwogCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBydW5uYWJsZSk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgeworICAgICAgICBSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKIAotCQkJT2JqZWN0W10gc2VsZWN0ZWQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgc2V0RWxlbWVudHMoZGlhbG9nLCBhZGRSZW1vdGUpOworICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbih0cnVlKTsKKyAgICAgICAgICAgICAgICBkaWFsb2cuc2V0VGl0bGUoIkxpYnJhcnkgU2VsZWN0aW9uIik7CisgICAgICAgICAgICAgICAgZGlhbG9nLnNldE1lc3NhZ2UoIlNlbGVjdCBhIExpYnJhcnk6Iik7CisgICAgICAgICAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIFNXVFV0aWwuc2V0RGlhbG9nU2l6ZShkaWFsb2csIDQwMCwgNTAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKIAotCQkJaWYgKGFkZFJlbW90ZSkgewotCQkJCWFkZFJlbW90ZUxpYnJhcmllcyhzZWxlY3RlZCk7Ci0JCQl9IGVsc2UgewotCQkJCWFkZExvY2FsTGlicmFyaWVzKHNlbGVjdGVkKTsKLQkJCX0KLQkJfQorICAgICAgICBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgcnVubmFibGUpOworICAgICAgICBpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKIAotCX0KKyAgICAgICAgICAgIE9iamVjdFtdIHNlbGVjdGVkID0gZGlhbG9nLmdldFJlc3VsdCgpOwogCi0JcHJpdmF0ZSB2b2lkIGFkZExvY2FsTGlicmFyaWVzKE9iamVjdFtdIHNlbGVjdGVkKSB7Ci0JCUltcG9ydExpYnJhcnlIZWFkZXIgaW1wb3J0TGlicmFyeUhlYWRlciA9IChJbXBvcnRMaWJyYXJ5SGVhZGVyKSBnZXRCdW5kbGUoKS5nZXRNYW5pZmVzdEhlYWRlcigKLQkJCQlJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9MSUJSQVJZKTsKLQkJZm9yIChPYmplY3QgY3VyclNlbGVjdGVkRWxlbWVudCA6IHNlbGVjdGVkKSB7Ci0JCQlMaWJyYXJ5QXJ0ZWZhY3QgY3VyckJ1bmRsZSA9IChMaWJyYXJ5QXJ0ZWZhY3QpIGN1cnJTZWxlY3RlZEVsZW1lbnQ7Ci0JCQlpZiAobnVsbCA9PSBpbXBvcnRMaWJyYXJ5SGVhZGVyKSB7Ci0JCQkJZ2V0QnVuZGxlKCkuc2V0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlksICIiKTsKLQkJCQlpbXBvcnRMaWJyYXJ5SGVhZGVyID0gKEltcG9ydExpYnJhcnlIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKAotCQkJCQkJSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSk7Ci0JCQl9CisgICAgICAgICAgICBpZiAoYWRkUmVtb3RlKSB7CisgICAgICAgICAgICAgICAgYWRkUmVtb3RlTGlicmFyaWVzKHNlbGVjdGVkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRkTG9jYWxMaWJyYXJpZXMoc2VsZWN0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCVN0cmluZyB2ZXJzaW9uU3RyaW5nID0gbnVsbDsKLQkJCU9zZ2lWZXJzaW9uIG9zZ2lWZXJzID0gY3VyckJ1bmRsZS5nZXRWZXJzaW9uKCk7Ci0JCQlpZiAob3NnaVZlcnMuZ2V0TWFqb3IoKSAhPSAwIHx8IG9zZ2lWZXJzLmdldE1pbm9yKCkgIT0gMCB8fCBvc2dpVmVycy5nZXRTZXJ2aWNlKCkgIT0gMAotCQkJCQl8fCAob3NnaVZlcnMuZ2V0UXVhbGlmaWVyKCkgIT0gbnVsbCAmJiAhb3NnaVZlcnMuZ2V0UXVhbGlmaWVyKCkudHJpbSgpLmVxdWFscygiIikpKSB7Ci0JCQkJdmVyc2lvblN0cmluZyA9ICJbIiArIGN1cnJCdW5kbGUuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkgKyAiLCIgKyBjdXJyQnVuZGxlLmdldFZlcnNpb24oKS50b1N0cmluZygpCi0JCQkJCQkrICJdIjsKLQkJCX0KLQkJCWltcG9ydExpYnJhcnlIZWFkZXIuYWRkTGlicmFyeShjdXJyQnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCB2ZXJzaW9uU3RyaW5nKTsKLQkJfQotCX0KKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgYWRkUmVtb3RlTGlicmFyaWVzKE9iamVjdFtdIHNlbGVjdGVkKSB7Ci0JCUltcG9ydExpYnJhcnlIZWFkZXIgaW1wb3J0TGlicmFyeUhlYWRlciA9IChJbXBvcnRMaWJyYXJ5SGVhZGVyKSBnZXRCdW5kbGUoKS5nZXRNYW5pZmVzdEhlYWRlcigKLQkJCQlJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9MSUJSQVJZKTsKKyAgICBwcml2YXRlIHZvaWQgYWRkTG9jYWxMaWJyYXJpZXMoT2JqZWN0W10gc2VsZWN0ZWQpIHsKKyAgICAgICAgSW1wb3J0TGlicmFyeUhlYWRlciBpbXBvcnRMaWJyYXJ5SGVhZGVyID0gKEltcG9ydExpYnJhcnlIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlkpOworICAgICAgICBmb3IgKE9iamVjdCBjdXJyU2VsZWN0ZWRFbGVtZW50IDogc2VsZWN0ZWQpIHsKKyAgICAgICAgICAgIExpYnJhcnlBcnRlZmFjdCBjdXJyQnVuZGxlID0gKExpYnJhcnlBcnRlZmFjdCkgY3VyclNlbGVjdGVkRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChudWxsID09IGltcG9ydExpYnJhcnlIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBnZXRCdW5kbGUoKS5zZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSwgIiIpOworICAgICAgICAgICAgICAgIGltcG9ydExpYnJhcnlIZWFkZXIgPSAoSW1wb3J0TGlicmFyeUhlYWRlcikgZ2V0QnVuZGxlKCkuZ2V0TWFuaWZlc3RIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSk7CisgICAgICAgICAgICB9CiAKLQkJU2V0PEFydGVmYWN0PiByZW1vdGVBcnRpZmFjdERlZmluaXRpb25zID0gbmV3IEhhc2hTZXQ8QXJ0ZWZhY3Q+KHNlbGVjdGVkLmxlbmd0aCk7CisgICAgICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZyA9IG51bGw7CisgICAgICAgICAgICBPc2dpVmVyc2lvbiBvc2dpVmVycyA9IGN1cnJCdW5kbGUuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgaWYgKG9zZ2lWZXJzLmdldE1ham9yKCkgIT0gMCB8fCBvc2dpVmVycy5nZXRNaW5vcigpICE9IDAgfHwgb3NnaVZlcnMuZ2V0U2VydmljZSgpICE9IDAKKyAgICAgICAgICAgICAgICB8fCBvc2dpVmVycy5nZXRRdWFsaWZpZXIoKSAhPSBudWxsICYmICFvc2dpVmVycy5nZXRRdWFsaWZpZXIoKS50cmltKCkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIHZlcnNpb25TdHJpbmcgPSAiWyIgKyBjdXJyQnVuZGxlLmdldFZlcnNpb24oKS50b1N0cmluZygpICsgIiwiICsgY3VyckJ1bmRsZS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSArICJdIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltcG9ydExpYnJhcnlIZWFkZXIuYWRkTGlicmFyeShjdXJyQnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCB2ZXJzaW9uU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KIAotCQlmb3IgKE9iamVjdCBjdXJyU2VsZWN0ZWRFbGVtZW50IDogc2VsZWN0ZWQpIHsKLQkJCXJlbW90ZUFydGlmYWN0RGVmaW5pdGlvbnMuYWRkKChBcnRlZmFjdCkgY3VyclNlbGVjdGVkRWxlbWVudCk7Ci0JCX0KKyAgICBwcml2YXRlIHZvaWQgYWRkUmVtb3RlTGlicmFyaWVzKE9iamVjdFtdIHNlbGVjdGVkKSB7CisgICAgICAgIEltcG9ydExpYnJhcnlIZWFkZXIgaW1wb3J0TGlicmFyeUhlYWRlciA9IChJbXBvcnRMaWJyYXJ5SGVhZGVyKSBnZXRCdW5kbGUoKS5nZXRNYW5pZmVzdEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9MSUJSQVJZKTsKIAotCQlJUHJvamVjdCBwcm9qZWN0ID0gKChCdW5kbGVNYW5pZmVzdEVkaXRvcikgdGhpcy5nZXRQYWdlKCkuZ2V0RWRpdG9yKCkpLmdldENvbW1vblByb2plY3QoKTsKLQkJUmVwb3NpdG9yeVV0aWxzLmRvd25sb2FkQXJpZmFjdHMocmVtb3RlQXJ0aWZhY3REZWZpbml0aW9ucywgcHJvamVjdCwgRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQlmYWxzZSk7CisgICAgICAgIFNldDxBcnRlZmFjdD4gcmVtb3RlQXJ0aWZhY3REZWZpbml0aW9ucyA9IG5ldyBIYXNoU2V0PEFydGVmYWN0PihzZWxlY3RlZC5sZW5ndGgpOwogCi0JCWZvciAoT2JqZWN0IGN1cnJTZWxlY3RlZEVsZW1lbnQgOiBzZWxlY3RlZCkgewotCQkJTGlicmFyeUFydGVmYWN0IGN1cnJMaWJyYXJ5ID0gKExpYnJhcnlBcnRlZmFjdCkgY3VyclNlbGVjdGVkRWxlbWVudDsKLQkJCWlmIChudWxsID09IGltcG9ydExpYnJhcnlIZWFkZXIpIHsKLQkJCQlnZXRCdW5kbGUoKS5zZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSwgIiIpOwotCQkJCWltcG9ydExpYnJhcnlIZWFkZXIgPSAoSW1wb3J0TGlicmFyeUhlYWRlcikgZ2V0QnVuZGxlKCkuZ2V0TWFuaWZlc3RIZWFkZXIoCi0JCQkJCQlJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9MSUJSQVJZKTsKLQkJCX0KKyAgICAgICAgZm9yIChPYmplY3QgY3VyclNlbGVjdGVkRWxlbWVudCA6IHNlbGVjdGVkKSB7CisgICAgICAgICAgICByZW1vdGVBcnRpZmFjdERlZmluaXRpb25zLmFkZCgoQXJ0ZWZhY3QpIGN1cnJTZWxlY3RlZEVsZW1lbnQpOworICAgICAgICB9CiAKLQkJCVN0cmluZyB2ZXJzaW9uU3RyaW5nID0gbnVsbDsKLQkJCU9zZ2lWZXJzaW9uIG9zZ2lWZXJzID0gY3VyckxpYnJhcnkuZ2V0VmVyc2lvbigpOwotCQkJaWYgKG9zZ2lWZXJzLmdldE1ham9yKCkgIT0gMCB8fCBvc2dpVmVycy5nZXRNaW5vcigpICE9IDAgfHwgb3NnaVZlcnMuZ2V0U2VydmljZSgpICE9IDAKLQkJCQkJfHwgKG9zZ2lWZXJzLmdldFF1YWxpZmllcigpICE9IG51bGwgJiYgIW9zZ2lWZXJzLmdldFF1YWxpZmllcigpLnRyaW0oKS5lcXVhbHMoIiIpKSkgewotCQkJCXZlcnNpb25TdHJpbmcgPSAiWyIgKyBjdXJyTGlicmFyeS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSArICIsIiArIGN1cnJMaWJyYXJ5LmdldFZlcnNpb24oKS50b1N0cmluZygpCi0JCQkJCQkrICJdIjsKLQkJCX0KKyAgICAgICAgSVByb2plY3QgcHJvamVjdCA9ICgoQnVuZGxlTWFuaWZlc3RFZGl0b3IpIHRoaXMuZ2V0UGFnZSgpLmdldEVkaXRvcigpKS5nZXRDb21tb25Qcm9qZWN0KCk7CisgICAgICAgIFJlcG9zaXRvcnlVdGlscy5kb3dubG9hZEFyaWZhY3RzKHJlbW90ZUFydGlmYWN0RGVmaW5pdGlvbnMsIHByb2plY3QsIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIGZhbHNlKTsKIAotCQkJaWYgKGltcG9ydExpYnJhcnlIZWFkZXIuaGFzRWxlbWVudChjdXJyTGlicmFyeS5nZXRTeW1ib2xpY05hbWUoKSkpIHsKLQkJCQlpbXBvcnRMaWJyYXJ5SGVhZGVyLnJlbW92ZUxpYnJhcnkoY3VyckxpYnJhcnkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJfQotCQkJaW1wb3J0TGlicmFyeUhlYWRlci5hZGRMaWJyYXJ5KGN1cnJMaWJyYXJ5LmdldFN5bWJvbGljTmFtZSgpLCB2ZXJzaW9uU3RyaW5nKTsKLQkJfQotCX0KKyAgICAgICAgZm9yIChPYmplY3QgY3VyclNlbGVjdGVkRWxlbWVudCA6IHNlbGVjdGVkKSB7CisgICAgICAgICAgICBMaWJyYXJ5QXJ0ZWZhY3QgY3VyckxpYnJhcnkgPSAoTGlicmFyeUFydGVmYWN0KSBjdXJyU2VsZWN0ZWRFbGVtZW50OworICAgICAgICAgICAgaWYgKG51bGwgPT0gaW1wb3J0TGlicmFyeUhlYWRlcikgeworICAgICAgICAgICAgICAgIGdldEJ1bmRsZSgpLnNldEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9MSUJSQVJZLCAiIik7CisgICAgICAgICAgICAgICAgaW1wb3J0TGlicmFyeUhlYWRlciA9IChJbXBvcnRMaWJyYXJ5SGVhZGVyKSBnZXRCdW5kbGUoKS5nZXRNYW5pZmVzdEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9MSUJSQVJZKTsKKyAgICAgICAgICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlbW92ZSgpIHsKLQkJT2JqZWN0W10gcmVtb3ZlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKTsKLQkJZm9yIChPYmplY3QgZWxlbWVudCA6IHJlbW92ZWQpIHsKLQkJCUltcG9ydExpYnJhcnlIZWFkZXIgaGVhZGVyID0gKEltcG9ydExpYnJhcnlIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKAotCQkJCQlJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9MSUJSQVJZKTsKLQkJCWhlYWRlci5yZW1vdmVMaWJyYXJ5KChJbXBvcnRMaWJyYXJ5T2JqZWN0KSBlbGVtZW50KTsKLQkJfQotCX0KKyAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uU3RyaW5nID0gbnVsbDsKKyAgICAgICAgICAgIE9zZ2lWZXJzaW9uIG9zZ2lWZXJzID0gY3VyckxpYnJhcnkuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgaWYgKG9zZ2lWZXJzLmdldE1ham9yKCkgIT0gMCB8fCBvc2dpVmVycy5nZXRNaW5vcigpICE9IDAgfHwgb3NnaVZlcnMuZ2V0U2VydmljZSgpICE9IDAKKyAgICAgICAgICAgICAgICB8fCBvc2dpVmVycy5nZXRRdWFsaWZpZXIoKSAhPSBudWxsICYmICFvc2dpVmVycy5nZXRRdWFsaWZpZXIoKS50cmltKCkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIHZlcnNpb25TdHJpbmcgPSAiWyIgKyBjdXJyTGlicmFyeS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSArICIsIiArIGN1cnJMaWJyYXJ5LmdldFZlcnNpb24oKS50b1N0cmluZygpICsgIl0iOworICAgICAgICAgICAgfQogCi0JY2xhc3MgQnVuZGxlSW1wb3J0RGlhbG9nTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gUERFUGx1Z2luSW1hZ2VzLkRFU0NfSkFSX0xJQl9PQkouY3JlYXRlSW1hZ2UoKTsKLQkJfQorICAgICAgICAgICAgaWYgKGltcG9ydExpYnJhcnlIZWFkZXIuaGFzRWxlbWVudChjdXJyTGlicmFyeS5nZXRTeW1ib2xpY05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBpbXBvcnRMaWJyYXJ5SGVhZGVyLnJlbW92ZUxpYnJhcnkoY3VyckxpYnJhcnkuZ2V0U3ltYm9saWNOYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW1wb3J0TGlicmFyeUhlYWRlci5hZGRMaWJyYXJ5KGN1cnJMaWJyYXJ5LmdldFN5bWJvbGljTmFtZSgpLCB2ZXJzaW9uU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlMaWJyYXJ5QXJ0ZWZhY3QgbGlicmFyeUFydGlmYWN0ID0gKExpYnJhcnlBcnRlZmFjdCkgZWxlbWVudDsKLQkJCVN0cmluZyBsYWJlbCA9IGxpYnJhcnlBcnRpZmFjdC5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCWlmIChudWxsICE9IGxpYnJhcnlBcnRpZmFjdC5nZXRWZXJzaW9uKCkpIHsKLQkJCQlsYWJlbCArPSAiICIgKyBsaWJyYXJ5QXJ0aWZhY3QuZ2V0VmVyc2lvbigpOwotCQkJfQotCQkJcmV0dXJuIGxhYmVsOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlbW92ZSgpIHsKKyAgICAgICAgT2JqZWN0W10gcmVtb3ZlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuZlZpZXdlci5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOworICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogcmVtb3ZlZCkgeworICAgICAgICAgICAgSW1wb3J0TGlicmFyeUhlYWRlciBoZWFkZXIgPSAoSW1wb3J0TGlicmFyeUhlYWRlcikgZ2V0QnVuZGxlKCkuZ2V0TWFuaWZlc3RIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSk7CisgICAgICAgICAgICBoZWFkZXIucmVtb3ZlTGlicmFyeSgoSW1wb3J0TGlicmFyeU9iamVjdCkgZWxlbWVudCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkJfQotCX0KKyAgICBjbGFzcyBCdW5kbGVJbXBvcnREaWFsb2dMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGdldEFkZEluZGV4KCkgewotCQlyZXR1cm4gQUREX0lOREVYOwotCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgeworICAgICAgICAgICAgcmV0dXJuIFBERVBsdWdpbkltYWdlcy5ERVNDX0pBUl9MSUJfT0JKLmNyZWF0ZUltYWdlKCk7CisgICAgICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0UmVtb3ZlSW5kZXgoKSB7Ci0JCXJldHVybiBSRU1PVkVfSU5ERVg7Ci0JfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgICAgICBMaWJyYXJ5QXJ0ZWZhY3QgbGlicmFyeUFydGlmYWN0ID0gKExpYnJhcnlBcnRlZmFjdCkgZWxlbWVudDsKKyAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGxpYnJhcnlBcnRpZmFjdC5nZXRTeW1ib2xpY05hbWUoKTsKKyAgICAgICAgICAgIGlmIChudWxsICE9IGxpYnJhcnlBcnRpZmFjdC5nZXRWZXJzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICBsYWJlbCArPSAiICIgKyBsaWJyYXJ5QXJ0aWZhY3QuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxhYmVsOwogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBnZXRQcm9wZXJ0aWVzSW5kZXgoKSB7Ci0JCXJldHVybiBQUk9QRVJUSUVTX0lOREVYOwotCX0KKyAgICAgICAgfQorICAgIH0KIAotCWNsYXNzIEltcG9ydExpYnJhcnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uVmlld2VyTGFiZWxQcm92aWRlciB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBnZXRBZGRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIEFERF9JTkRFWDsKKyAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gUERFUGx1Z2luSW1hZ2VzLkRFU0NfSkFSX0xJQl9PQkouY3JlYXRlSW1hZ2UoKTsKLQkJfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgZ2V0UmVtb3ZlSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBSRU1PVkVfSU5ERVg7CisgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJSW1wb3J0TGlicmFyeU9iamVjdCBpbXBvcnRMaWJyYXJ5T2JqZWN0ID0gKEltcG9ydExpYnJhcnlPYmplY3QpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgbGFiZWwgPSBpbXBvcnRMaWJyYXJ5T2JqZWN0LmdldFZhbHVlKCk7Ci0JCQlpZiAobnVsbCAhPSBpbXBvcnRMaWJyYXJ5T2JqZWN0LmdldFZlcnNpb24oKSkgewotCQkJCWxhYmVsICs9ICIgIiArIGltcG9ydExpYnJhcnlPYmplY3QuZ2V0VmVyc2lvbigpOwotCQkJfQotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgZ2V0UHJvcGVydGllc0luZGV4KCkgeworICAgICAgICByZXR1cm4gUFJPUEVSVElFU19JTkRFWDsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRlckNvbnN0YW50KCkgewotCQlyZXR1cm4gSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWTsKLQl9CisgICAgY2xhc3MgSW1wb3J0TGlicmFyeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25WaWV3ZXJMYWJlbFByb3ZpZGVyIHsKIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEVuYWJsZVByb3BlcnRpZXMoT2JqZWN0W10gc2VsZWN0ZWQpIHsKLQkJaWYgKHNlbGVjdGVkLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHNlbGVjdGVkLmxlbmd0aCA9PSAxKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBQREVQbHVnaW5JbWFnZXMuREVTQ19KQVJfTElCX09CSi5jcmVhdGVJbWFnZSgpOworICAgICAgICB9CiAKLQkJU3RyaW5nIHZlcnNpb24gPSAoKEltcG9ydExpYnJhcnlPYmplY3QpIHNlbGVjdGVkWzBdKS5nZXRWZXJzaW9uKCk7Ci0JCWJvb2xlYW4gb3B0aW9uYWwgPSAoKEltcG9ydExpYnJhcnlPYmplY3QpIHNlbGVjdGVkWzBdKS5pc09wdGlvbmFsKCk7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCUltcG9ydExpYnJhcnlPYmplY3Qgb2JqZWN0ID0gKEltcG9ydExpYnJhcnlPYmplY3QpIHNlbGVjdGVkW2ldOwotCQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QuZ2V0VmVyc2lvbigpICE9IG51bGwgfHwgIShvcHRpb25hbCA9PSBvYmplY3QuaXNPcHRpb25hbCgpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICghdmVyc2lvbi5lcXVhbHMob2JqZWN0LmdldFZlcnNpb24oKSkgfHwgIShvcHRpb25hbCA9PSBvYmplY3QuaXNPcHRpb25hbCgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgSW1wb3J0TGlicmFyeU9iamVjdCBpbXBvcnRMaWJyYXJ5T2JqZWN0ID0gKEltcG9ydExpYnJhcnlPYmplY3QpIGVsZW1lbnQ7CisgICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBpbXBvcnRMaWJyYXJ5T2JqZWN0LmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAobnVsbCAhPSBpbXBvcnRMaWJyYXJ5T2JqZWN0LmdldFZlcnNpb24oKSkgeworICAgICAgICAgICAgICAgIGxhYmVsICs9ICIgIiArIGltcG9ydExpYnJhcnlPYmplY3QuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxhYmVsOworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlT3BlblByb3BlcnRpZXMoKSB7Ci0JCU9iamVjdFtdIHNlbGVjdGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlZpZXdlci5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOwotCQlJbXBvcnRMaWJyYXJ5T2JqZWN0IGZpcnN0ID0gKEltcG9ydExpYnJhcnlPYmplY3QpIHNlbGVjdGVkWzBdOwotCQlCdW5kbGVEZXBlbmRlbmN5UHJvcGVydGllc0RpYWxvZyBkaWFsb2cgPSBuZXcgQnVuZGxlRGVwZW5kZW5jeVByb3BlcnRpZXNEaWFsb2coaXNFZGl0YWJsZSgpLCBmYWxzZSwgZmFsc2UsCi0JCQkJZmlyc3QuaXNPcHRpb25hbCgpLCBmaXJzdC5nZXRWZXJzaW9uKCksIHRydWUsIHRydWUpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCVNXVFV0aWwuc2V0RGlhbG9nU2l6ZShkaWFsb2csIDQwMCwgLTEpOwotCQlpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHsKLQkJCWRpYWxvZy5zZXRUaXRsZSgoKEltcG9ydExpYnJhcnlPYmplY3QpIHNlbGVjdGVkWzBdKS5nZXRWYWx1ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWRpYWxvZy5zZXRUaXRsZSgiUHJvcGVydGllcyIpOwotCQl9Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCVN0cmluZyBuZXdWZXJzaW9uID0gZGlhbG9nLmdldFZlcnNpb24oKTsKLQkJCWJvb2xlYW4gbmV3T3B0aW9uYWwgPSBkaWFsb2cuaXNPcHRpb25hbCgpOwotCQkJZm9yIChPYmplY3QgZWxlbWVudCA6IHNlbGVjdGVkKSB7Ci0JCQkJSW1wb3J0TGlicmFyeU9iamVjdCBvYmplY3QgPSAoSW1wb3J0TGlicmFyeU9iamVjdCkgZWxlbWVudDsKLQkJCQlpZiAoIW5ld1ZlcnNpb24uZXF1YWxzKG9iamVjdC5nZXRWZXJzaW9uKCkpKSB7Ci0JCQkJCW9iamVjdC5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOwotCQkJCX0KLQkJCQlpZiAoIW5ld09wdGlvbmFsID09IG9iamVjdC5pc09wdGlvbmFsKCkpIHsKLQkJCQkJb2JqZWN0LnNldE9wdGlvbmFsKG5ld09wdGlvbmFsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkZXJDb25zdGFudCgpIHsKKyAgICAgICAgcmV0dXJuIElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uU2VsZWN0ZWQoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA9PSBBRERfUkVNT1RFX0JVTkRMRV9JTkRFWCkgewotCQkJaW50ZXJuYWxIYW5kbGVBZGQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5idXR0b25TZWxlY3RlZChpbmRleCk7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRW5hYmxlUHJvcGVydGllcyhPYmplY3RbXSBzZWxlY3RlZCkgeworICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHZlcnNpb24gPSAoKEltcG9ydExpYnJhcnlPYmplY3QpIHNlbGVjdGVkWzBdKS5nZXRWZXJzaW9uKCk7CisgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwgPSAoKEltcG9ydExpYnJhcnlPYmplY3QpIHNlbGVjdGVkWzBdKS5pc09wdGlvbmFsKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIEltcG9ydExpYnJhcnlPYmplY3Qgb2JqZWN0ID0gKEltcG9ydExpYnJhcnlPYmplY3QpIHNlbGVjdGVkW2ldOworICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChvYmplY3QuZ2V0VmVyc2lvbigpICE9IG51bGwgfHwgIShvcHRpb25hbCA9PSBvYmplY3QuaXNPcHRpb25hbCgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghdmVyc2lvbi5lcXVhbHMob2JqZWN0LmdldFZlcnNpb24oKSkgfHwgIShvcHRpb25hbCA9PSBvYmplY3QuaXNPcHRpb25hbCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVPcGVuUHJvcGVydGllcygpIHsKKyAgICAgICAgT2JqZWN0W10gc2VsZWN0ZWQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKTsKKyAgICAgICAgSW1wb3J0TGlicmFyeU9iamVjdCBmaXJzdCA9IChJbXBvcnRMaWJyYXJ5T2JqZWN0KSBzZWxlY3RlZFswXTsKKyAgICAgICAgQnVuZGxlRGVwZW5kZW5jeVByb3BlcnRpZXNEaWFsb2cgZGlhbG9nID0gbmV3IEJ1bmRsZURlcGVuZGVuY3lQcm9wZXJ0aWVzRGlhbG9nKGlzRWRpdGFibGUoKSwgZmFsc2UsIGZhbHNlLCBmaXJzdC5pc09wdGlvbmFsKCksCisgICAgICAgICAgICBmaXJzdC5nZXRWZXJzaW9uKCksIHRydWUsIHRydWUpOworICAgICAgICBkaWFsb2cuY3JlYXRlKCk7CisgICAgICAgIFNXVFV0aWwuc2V0RGlhbG9nU2l6ZShkaWFsb2csIDQwMCwgLTEpOworICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIGRpYWxvZy5zZXRUaXRsZSgoKEltcG9ydExpYnJhcnlPYmplY3QpIHNlbGVjdGVkWzBdKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpYWxvZy5zZXRUaXRsZSgiUHJvcGVydGllcyIpOworICAgICAgICB9CisgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSyAmJiBpc0VkaXRhYmxlKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBuZXdWZXJzaW9uID0gZGlhbG9nLmdldFZlcnNpb24oKTsKKyAgICAgICAgICAgIGJvb2xlYW4gbmV3T3B0aW9uYWwgPSBkaWFsb2cuaXNPcHRpb25hbCgpOworICAgICAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudCA6IHNlbGVjdGVkKSB7CisgICAgICAgICAgICAgICAgSW1wb3J0TGlicmFyeU9iamVjdCBvYmplY3QgPSAoSW1wb3J0TGlicmFyeU9iamVjdCkgZWxlbWVudDsKKyAgICAgICAgICAgICAgICBpZiAoIW5ld1ZlcnNpb24uZXF1YWxzKG9iamVjdC5nZXRWZXJzaW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW5ld09wdGlvbmFsID09IG9iamVjdC5pc09wdGlvbmFsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE9wdGlvbmFsKG5ld09wdGlvbmFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBidXR0b25TZWxlY3RlZChpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4ID09IEFERF9SRU1PVEVfQlVORExFX0lOREVYKSB7CisgICAgICAgICAgICBpbnRlcm5hbEhhbmRsZUFkZCh0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmJ1dHRvblNlbGVjdGVkKGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvbi5qYXZhCmluZGV4IDFhZTJmMmMuLjVhNWZhYWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUltcG9ydFBhY2thZ2VTZWN0aW9uLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTYyLDM2MyArNjMsMzY0IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0SW1wb3J0U2VjdGlvbiB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiU3BlY2lmeSBwYWNrYWdlcyBvbiB3aGljaCB0aGlzIGJ1bmRsZSBkZXBlbmRzIHdpdGhvdXQgZXhwbGljaXRseSBpZGVudGlmeWluZyB0aGVpciBvcmlnaW5hdGluZyBidW5kbGUuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiU3BlY2lmeSBwYWNrYWdlcyBvbiB3aGljaCB0aGlzIGJ1bmRsZSBkZXBlbmRzIHdpdGhvdXQgZXhwbGljaXRseSBpZGVudGlmeWluZyB0aGVpciBvcmlnaW5hdGluZyBidW5kbGUuIjsKIAotCXByaXZhdGUgQWN0aW9uIGZHb1RvQWN0aW9uOworICAgIHByaXZhdGUgQWN0aW9uIGZHb1RvQWN0aW9uOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9JTkRFWCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9JTkRFWCA9IDA7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX1JFTU9URV9CVU5ETEVfSU5ERVggPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfUkVNT1RFX0JVTkRMRV9JTkRFWCA9IDE7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX0lOREVYID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX0lOREVYID0gMjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTX0lOREVYID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVElFU19JTkRFWCA9IDM7CiAKLQlwdWJsaWMgQnVuZGxlSW1wb3J0UGFja2FnZVNlY3Rpb24oUERFRm9ybVBhZ2UgcGFnZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYWdlLCBwYXJlbnQsIFNlY3Rpb24uREVTQ1JJUFRJT04sIG5ldyBTdHJpbmdbXSB7IFBERVVJTWVzc2FnZXMuSW1wb3J0UGFja2FnZVNlY3Rpb25fYWRkLCAiRG93bmxvYWQuLi4iLAotCQkJCVBERVVJTWVzc2FnZXMuSW1wb3J0UGFja2FnZVNlY3Rpb25fcmVtb3ZlLCBQREVVSU1lc3NhZ2VzLkltcG9ydFBhY2thZ2VTZWN0aW9uX3Byb3BlcnRpZXMgfSk7Ci0JCWdldFNlY3Rpb24oKS5zZXRUZXh0KCJJbXBvcnQgUGFja2FnZSIpOwotCQlnZXRTZWN0aW9uKCkuc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT04pOwotCQlnZXRUYWJsZVBhcnQoKS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JfQorICAgIHB1YmxpYyBCdW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvbihQREVGb3JtUGFnZSBwYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIHN1cGVyKHBhZ2UsIHBhcmVudCwgU2VjdGlvbi5ERVNDUklQVElPTiwgbmV3IFN0cmluZ1tdIHsgUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9hZGQsICJEb3dubG9hZC4uLiIsCisgICAgICAgICAgICBQREVVSU1lc3NhZ2VzLkltcG9ydFBhY2thZ2VTZWN0aW9uX3JlbW92ZSwgUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9wcm9wZXJ0aWVzIH0pOworICAgICAgICBnZXRTZWN0aW9uKCkuc2V0VGV4dCgiSW1wb3J0IFBhY2thZ2UiKTsKKyAgICAgICAgZ2V0U2VjdGlvbigpLnNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OKTsKKyAgICAgICAgZ2V0VGFibGVQYXJ0KCkuc2V0RWRpdGFibGUoZmFsc2UpOworICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRzTG9jYWwoSW1wb3J0TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9ICgoQnVuZGxlTWFuaWZlc3RFZGl0b3IpIHRoaXMuZ2V0UGFnZSgpLmdldEVkaXRvcigpKS5nZXRDb21tb25Qcm9qZWN0KCk7Ci0JCVNldDxQYWNrYWdlRXhwb3J0PiBwYWNrYWdlcyA9IFJlcG9zaXRvcnlVdGlscy5nZXRJbXBvcnRQYWNrYWdlUHJvcG9zYWxzKHByb2plY3QsICIiKTsKLQkJSW1wb3J0UGFja2FnZUhlYWRlciBoZWFkZXIgPSAoSW1wb3J0UGFja2FnZUhlYWRlcikgZ2V0QnVuZGxlKCkuZ2V0TWFuaWZlc3RIZWFkZXIoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFKTsKLQkJU2V0PFBhY2thZ2VFeHBvcnQ+IGZpbHRlcmVkRWxlbWVudHMgPSBuZXcgSGFzaFNldDxQYWNrYWdlRXhwb3J0PigpOworICAgIHByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRzTG9jYWwoSW1wb3J0TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cpIHsKKyAgICAgICAgSVByb2plY3QgcHJvamVjdCA9ICgoQnVuZGxlTWFuaWZlc3RFZGl0b3IpIHRoaXMuZ2V0UGFnZSgpLmdldEVkaXRvcigpKS5nZXRDb21tb25Qcm9qZWN0KCk7CisgICAgICAgIFNldDxQYWNrYWdlRXhwb3J0PiBwYWNrYWdlcyA9IFJlcG9zaXRvcnlVdGlscy5nZXRJbXBvcnRQYWNrYWdlUHJvcG9zYWxzKHByb2plY3QsICIiKTsKKyAgICAgICAgSW1wb3J0UGFja2FnZUhlYWRlciBoZWFkZXIgPSAoSW1wb3J0UGFja2FnZUhlYWRlcikgZ2V0QnVuZGxlKCkuZ2V0TWFuaWZlc3RIZWFkZXIoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFKTsKKyAgICAgICAgU2V0PFBhY2thZ2VFeHBvcnQ+IGZpbHRlcmVkRWxlbWVudHMgPSBuZXcgSGFzaFNldDxQYWNrYWdlRXhwb3J0PigpOwogCi0JCWlmIChoZWFkZXIgIT0gbnVsbCkgewotCQkJSW1wb3J0UGFja2FnZU9iamVjdFtdIGZpbHRlciA9IGhlYWRlci5nZXRQYWNrYWdlcygpOwotCQkJZm9yIChQYWNrYWdlRXhwb3J0IHByb3Bvc2FsIDogcGFja2FnZXMpIHsKLQkJCQlmb3IgKEltcG9ydFBhY2thZ2VPYmplY3QgaW1wb3J0ZWQgOiBmaWx0ZXIpIHsKLQkJCQkJaWYgKHByb3Bvc2FsLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGltcG9ydGVkLmdldE5hbWUoKSkpIHsKLQkJCQkJCWZpbHRlcmVkRWxlbWVudHMuYWRkKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXBhY2thZ2VzLnJlbW92ZUFsbChmaWx0ZXJlZEVsZW1lbnRzKTsKLQkJfQotCQlkaWFsb2cuc2V0RWxlbWVudHMocGFja2FnZXMudG9BcnJheSgpKTsKLQl9CisgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgSW1wb3J0UGFja2FnZU9iamVjdFtdIGZpbHRlciA9IGhlYWRlci5nZXRQYWNrYWdlcygpOworICAgICAgICAgICAgZm9yIChQYWNrYWdlRXhwb3J0IHByb3Bvc2FsIDogcGFja2FnZXMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEltcG9ydFBhY2thZ2VPYmplY3QgaW1wb3J0ZWQgOiBmaWx0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3Bvc2FsLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGltcG9ydGVkLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRWxlbWVudHMuYWRkKHByb3Bvc2FsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhY2thZ2VzLnJlbW92ZUFsbChmaWx0ZXJlZEVsZW1lbnRzKTsKKyAgICAgICAgfQorICAgICAgICBkaWFsb2cuc2V0RWxlbWVudHMocGFja2FnZXMudG9BcnJheSgpKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50c1JlbW90ZShJbXBvcnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZykgewotCQlJdGVyYWJsZTxJQXJ0ZWZhY3Q+IGJ1bmRsZXMgPSBudWxsOwotCQlBcnRlZmFjdFJlcG9zaXRvcnkgYnVuZGxlUmVwb3NpdG9yeSA9IFJlcG9zaXRvcnlVdGlscy5zZWFyY2hGb3JBcnRpZmFjdHMoIiIsIHRydWUsIGZhbHNlKTsKLQkJYnVuZGxlcyA9IGJ1bmRsZVJlcG9zaXRvcnkuZ2V0QnVuZGxlcygpOworICAgIHByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRzUmVtb3RlKEltcG9ydExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nKSB7CisgICAgICAgIEl0ZXJhYmxlPElBcnRlZmFjdD4gYnVuZGxlcyA9IG51bGw7CisgICAgICAgIEFydGVmYWN0UmVwb3NpdG9yeSBidW5kbGVSZXBvc2l0b3J5ID0gUmVwb3NpdG9yeVV0aWxzLnNlYXJjaEZvckFydGlmYWN0cygiIiwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBidW5kbGVzID0gYnVuZGxlUmVwb3NpdG9yeS5nZXRCdW5kbGVzKCk7CiAKLQkJU2V0PFBhY2thZ2VFeHBvcnQ+IGFsbFBhY2thZ2VFeHBvcnRzID0gbmV3IEhhc2hTZXQ8UGFja2FnZUV4cG9ydD4oKTsKLQkJZm9yIChJQXJ0ZWZhY3RUeXBlZCBjdXJyQnVuZGxlQXJ0ZWZhY3QgOiBidW5kbGVzKSB7Ci0JCQlhbGxQYWNrYWdlRXhwb3J0cy5hZGRBbGwoKChCdW5kbGVBcnRlZmFjdCkgY3VyckJ1bmRsZUFydGVmYWN0KS5nZXRFeHBvcnRzKCkpOwotCQl9CisgICAgICAgIFNldDxQYWNrYWdlRXhwb3J0PiBhbGxQYWNrYWdlRXhwb3J0cyA9IG5ldyBIYXNoU2V0PFBhY2thZ2VFeHBvcnQ+KCk7CisgICAgICAgIGZvciAoSUFydGVmYWN0VHlwZWQgY3VyckJ1bmRsZUFydGVmYWN0IDogYnVuZGxlcykgeworICAgICAgICAgICAgYWxsUGFja2FnZUV4cG9ydHMuYWRkQWxsKCgoQnVuZGxlQXJ0ZWZhY3QpIGN1cnJCdW5kbGVBcnRlZmFjdCkuZ2V0RXhwb3J0cygpKTsKKyAgICAgICAgfQogCi0JCWRpYWxvZy5zZXRFbGVtZW50cyhhbGxQYWNrYWdlRXhwb3J0cy50b0FycmF5KCkpOwotCX0KKyAgICAgICAgZGlhbG9nLnNldEVsZW1lbnRzKGFsbFBhY2thZ2VFeHBvcnRzLnRvQXJyYXkoKSk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElUYWJsZUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJbXBvcnRQYWNrYWdlTGFiZWxQcm92aWRlcigpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgSVRhYmxlTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IEltcG9ydFBhY2thZ2VMYWJlbFByb3ZpZGVyKCk7CisgICAgfQogCi0JY2xhc3MgSW1wb3J0UGFja2FnZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25WaWV3ZXJMYWJlbFByb3ZpZGVyIHsKKyAgICBjbGFzcyBJbXBvcnRQYWNrYWdlTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0U2VjdGlvblZpZXdlckxhYmVsUHJvdmlkZXIgewogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1BBQ0tBR0UpOwotCQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1BBQ0tBR0UpOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlJbXBvcnRQYWNrYWdlT2JqZWN0IGltcG9ydFBhY2thZ2VPYmplY3QgPSAoSW1wb3J0UGFja2FnZU9iamVjdCkgZWxlbWVudDsKLQkJCVN0cmluZyBsYWJlbCA9IGltcG9ydFBhY2thZ2VPYmplY3QuZ2V0TmFtZSgpOwotCQkJaWYgKG51bGwgIT0gaW1wb3J0UGFja2FnZU9iamVjdC5nZXRWZXJzaW9uKCkpIHsKLQkJCQlsYWJlbCArPSAiICIgKyBpbXBvcnRQYWNrYWdlT2JqZWN0LmdldFZlcnNpb24oKTsKLQkJCX0KLQkJCXJldHVybiBsYWJlbDsKLQkJfQotCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBJbXBvcnRQYWNrYWdlT2JqZWN0IGltcG9ydFBhY2thZ2VPYmplY3QgPSAoSW1wb3J0UGFja2FnZU9iamVjdCkgZWxlbWVudDsKKyAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9IGltcG9ydFBhY2thZ2VPYmplY3QuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKG51bGwgIT0gaW1wb3J0UGFja2FnZU9iamVjdC5nZXRWZXJzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICBsYWJlbCArPSAiICIgKyBpbXBvcnRQYWNrYWdlT2JqZWN0LmdldFZlcnNpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsYWJlbDsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQlmaW5hbCBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWJvb2xlYW4gc2luZ2xlU2VsZWN0aW9uID0gc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCQkmJiAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnNpemUoKSA9PSAxOwotCQlpZiAoc2luZ2xlU2VsZWN0aW9uKSB7Ci0JCQltYW5hZ2VyLmFkZChmR29Ub0FjdGlvbik7Ci0JCX0KLQkJc3VwZXIuZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgZmluYWwgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0aGlzLmZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7CisgICAgICAgIGJvb2xlYW4gc2luZ2xlU2VsZWN0aW9uID0gc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCkgPT0gMTsKKyAgICAgICAgaWYgKHNpbmdsZVNlbGVjdGlvbikgeworICAgICAgICAgICAgbWFuYWdlci5hZGQodGhpcy5mR29Ub0FjdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZCgpIHsKLQkJaW50ZXJuYWxIYW5kbGVBZGQoZmFsc2UpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBZGQoKSB7CisgICAgICAgIGludGVybmFsSGFuZGxlQWRkKGZhbHNlKTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxIYW5kbGVBZGQoZmluYWwgYm9vbGVhbiBhZGRSZW1vdGUpIHsKLQkJZmluYWwgSW1wb3J0TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgSW1wb3J0TGlzdFNlbGVjdGlvbkRpYWxvZyhQREVQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQluZXcgQnVuZGxlSW1wb3J0UGFja2FnZURpYWxvZ0xhYmVsUHJvdmlkZXIoKSk7CisgICAgcHJpdmF0ZSB2b2lkIGludGVybmFsSGFuZGxlQWRkKGZpbmFsIGJvb2xlYW4gYWRkUmVtb3RlKSB7CisgICAgICAgIGZpbmFsIEltcG9ydExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEltcG9ydExpc3RTZWxlY3Rpb25EaWFsb2coUERFUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCisgICAgICAgICAgICBuZXcgQnVuZGxlSW1wb3J0UGFja2FnZURpYWxvZ0xhYmVsUHJvdmlkZXIoKSk7CiAKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGFkZFJlbW90ZSkgewotCQkJCQlzZXRFbGVtZW50c1JlbW90ZShkaWFsb2cpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNldEVsZW1lbnRzTG9jYWwoZGlhbG9nKTsKLQkJCQl9CisgICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewogCi0JCQkJZGlhbG9nLnNldE11bHRpcGxlU2VsZWN0aW9uKHRydWUpOwotCQkJCWRpYWxvZy5zZXRNZXNzYWdlKFBERVVJTWVzc2FnZXMuSW1wb3J0UGFja2FnZVNlY3Rpb25fcmVxdWlyZWQpOwotCQkJCWRpYWxvZy5zZXRUaXRsZShQREVVSU1lc3NhZ2VzLkltcG9ydFBhY2thZ2VTZWN0aW9uX3NlbGVjdGlvbik7Ci0JCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJCVNXVFV0aWwuc2V0RGlhbG9nU2l6ZShkaWFsb2csIDQwMCwgNTAwKTsKLQkJCX0KLQkJfTsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpZiAoYWRkUmVtb3RlKSB7CisgICAgICAgICAgICAgICAgICAgIHNldEVsZW1lbnRzUmVtb3RlKGRpYWxvZyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0RWxlbWVudHNMb2NhbChkaWFsb2cpOworICAgICAgICAgICAgICAgIH0KIAotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgcnVubmFibGUpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCU9iamVjdFtdIHNlbGVjdGVkID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQkJaWYgKGFkZFJlbW90ZSkgewotCQkJCWRvd25sb2FkQnVuZGxlc0ZvclNlbGVjdGVkUGFja2FnZXMoc2VsZWN0ZWQpOwotCQkJfQotCQkJYWRkU2VsZWN0ZWRQYWNrYWdlc1RvTWFuaWZlc3Qoc2VsZWN0ZWQpOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbih0cnVlKTsKKyAgICAgICAgICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZShQREVVSU1lc3NhZ2VzLkltcG9ydFBhY2thZ2VTZWN0aW9uX3JlcXVpcmVkKTsKKyAgICAgICAgICAgICAgICBkaWFsb2cuc2V0VGl0bGUoUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9zZWxlY3Rpb24pOworICAgICAgICAgICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKKyAgICAgICAgICAgICAgICBTV1RVdGlsLnNldERpYWxvZ1NpemUoZGlhbG9nLCA0MDAsIDUwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAKLQlwcml2YXRlIHZvaWQgZG93bmxvYWRCdW5kbGVzRm9yU2VsZWN0ZWRQYWNrYWdlcyhPYmplY3RbXSBzZWxlY3RlZCkgewotCQlTZXQ8QXJ0ZWZhY3Q+IGJ1bmRsZUFydGVmYWN0cyA9IG5ldyBIYXNoU2V0PEFydGVmYWN0PigpOwotCQlmb3IgKE9iamVjdCBlbGVtZW50IDogc2VsZWN0ZWQpIHsKLQkJCVBhY2thZ2VFeHBvcnQgY3VyclBhY2thZ2VFeHBvcnQgPSAoUGFja2FnZUV4cG9ydCkgZWxlbWVudDsKLQkJCWJ1bmRsZUFydGVmYWN0cy5hZGQoY3VyclBhY2thZ2VFeHBvcnQuZ2V0QnVuZGxlKCkpOwotCQl9CisgICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBydW5uYWJsZSk7CisgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgeworICAgICAgICAgICAgT2JqZWN0W10gc2VsZWN0ZWQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICBpZiAoYWRkUmVtb3RlKSB7CisgICAgICAgICAgICAgICAgZG93bmxvYWRCdW5kbGVzRm9yU2VsZWN0ZWRQYWNrYWdlcyhzZWxlY3RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRTZWxlY3RlZFBhY2thZ2VzVG9NYW5pZmVzdChzZWxlY3RlZCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkJSVByb2plY3QgcHJvamVjdCA9ICgoQnVuZGxlTWFuaWZlc3RFZGl0b3IpIHRoaXMuZ2V0UGFnZSgpLmdldEVkaXRvcigpKS5nZXRDb21tb25Qcm9qZWN0KCk7Ci0JCVJlcG9zaXRvcnlVdGlscy5kb3dubG9hZEFyaWZhY3RzKGJ1bmRsZUFydGVmYWN0cywgcHJvamVjdCwgRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdHJ1ZSk7Ci0JfQorICAgIHByaXZhdGUgdm9pZCBkb3dubG9hZEJ1bmRsZXNGb3JTZWxlY3RlZFBhY2thZ2VzKE9iamVjdFtdIHNlbGVjdGVkKSB7CisgICAgICAgIFNldDxBcnRlZmFjdD4gYnVuZGxlQXJ0ZWZhY3RzID0gbmV3IEhhc2hTZXQ8QXJ0ZWZhY3Q+KCk7CisgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiBzZWxlY3RlZCkgeworICAgICAgICAgICAgUGFja2FnZUV4cG9ydCBjdXJyUGFja2FnZUV4cG9ydCA9IChQYWNrYWdlRXhwb3J0KSBlbGVtZW50OworICAgICAgICAgICAgYnVuZGxlQXJ0ZWZhY3RzLmFkZChjdXJyUGFja2FnZUV4cG9ydC5nZXRCdW5kbGUoKSk7CisgICAgICAgIH0KIAotCXByaXZhdGUgdm9pZCBhZGRTZWxlY3RlZFBhY2thZ2VzVG9NYW5pZmVzdChPYmplY3RbXSBzZWxlY3RlZCkgewotCQlJbXBvcnRQYWNrYWdlSGVhZGVyIGltcG9ydFBhY2thZ2VIZWFkZXIgPSAoSW1wb3J0UGFja2FnZUhlYWRlcikgZ2V0QnVuZGxlKCkuZ2V0TWFuaWZlc3RIZWFkZXIoCi0JCQkJQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFKTsKLQkJZm9yIChPYmplY3QgZWxlbWVudCA6IHNlbGVjdGVkKSB7Ci0JCQlQYWNrYWdlRXhwb3J0IGN1cnJQYWNrYWdlID0gKFBhY2thZ2VFeHBvcnQpIGVsZW1lbnQ7Ci0JCQlpZiAobnVsbCA9PSBpbXBvcnRQYWNrYWdlSGVhZGVyKSB7Ci0JCQkJZ2V0QnVuZGxlKCkuc2V0SGVhZGVyKENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgIiIpOwotCQkJCWltcG9ydFBhY2thZ2VIZWFkZXIgPSAoSW1wb3J0UGFja2FnZUhlYWRlcikgZ2V0QnVuZGxlKCkuZ2V0TWFuaWZlc3RIZWFkZXIoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFKTsKLQkJCX0KKyAgICAgICAgSVByb2plY3QgcHJvamVjdCA9ICgoQnVuZGxlTWFuaWZlc3RFZGl0b3IpIHRoaXMuZ2V0UGFnZSgpLmdldEVkaXRvcigpKS5nZXRDb21tb25Qcm9qZWN0KCk7CisgICAgICAgIFJlcG9zaXRvcnlVdGlscy5kb3dubG9hZEFyaWZhY3RzKGJ1bmRsZUFydGVmYWN0cywgcHJvamVjdCwgRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdHJ1ZSk7CisgICAgfQogCi0JCQlTdHJpbmcgdmVyc2lvblN0cmluZyA9IG51bGw7Ci0JCQlPc2dpVmVyc2lvbiBvc2dpVmVycyA9IGN1cnJQYWNrYWdlLmdldFZlcnNpb24oKTsKLQkJCWlmIChvc2dpVmVycy5nZXRNYWpvcigpICE9IDAgfHwgb3NnaVZlcnMuZ2V0TWlub3IoKSAhPSAwIHx8IG9zZ2lWZXJzLmdldFNlcnZpY2UoKSAhPSAwCi0JCQkJCXx8IChvc2dpVmVycy5nZXRRdWFsaWZpZXIoKSAhPSBudWxsICYmICFvc2dpVmVycy5nZXRRdWFsaWZpZXIoKS50cmltKCkuZXF1YWxzKCIiKSkpIHsKLQkJCQl2ZXJzaW9uU3RyaW5nID0gIlsiICsgY3VyclBhY2thZ2UuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkgKyAiLCIgKyBjdXJyUGFja2FnZS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKQotCQkJCQkJKyAiXSI7Ci0JCQl9CisgICAgcHJpdmF0ZSB2b2lkIGFkZFNlbGVjdGVkUGFja2FnZXNUb01hbmlmZXN0KE9iamVjdFtdIHNlbGVjdGVkKSB7CisgICAgICAgIEltcG9ydFBhY2thZ2VIZWFkZXIgaW1wb3J0UGFja2FnZUhlYWRlciA9IChJbXBvcnRQYWNrYWdlSGVhZGVyKSBnZXRCdW5kbGUoKS5nZXRNYW5pZmVzdEhlYWRlcihDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UpOworICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogc2VsZWN0ZWQpIHsKKyAgICAgICAgICAgIFBhY2thZ2VFeHBvcnQgY3VyclBhY2thZ2UgPSAoUGFja2FnZUV4cG9ydCkgZWxlbWVudDsKKyAgICAgICAgICAgIGlmIChudWxsID09IGltcG9ydFBhY2thZ2VIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBnZXRCdW5kbGUoKS5zZXRIZWFkZXIoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCAiIik7CisgICAgICAgICAgICAgICAgaW1wb3J0UGFja2FnZUhlYWRlciA9IChJbXBvcnRQYWNrYWdlSGVhZGVyKSBnZXRCdW5kbGUoKS5nZXRNYW5pZmVzdEhlYWRlcihDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UpOworICAgICAgICAgICAgfQogCi0JCQlJbXBvcnRQYWNrYWdlT2JqZWN0IG5ld1BhY2thZ2VPYmplY3QgPSBuZXcgSW1wb3J0UGFja2FnZU9iamVjdChpbXBvcnRQYWNrYWdlSGVhZGVyLCBjdXJyUGFja2FnZS5nZXROYW1lKCksCi0JCQkJCXZlcnNpb25TdHJpbmcsIENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURSk7Ci0JCQlpbXBvcnRQYWNrYWdlSGVhZGVyLmFkZFBhY2thZ2UobmV3UGFja2FnZU9iamVjdCk7Ci0JCX0KLQl9CisgICAgICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZyA9IG51bGw7CisgICAgICAgICAgICBPc2dpVmVyc2lvbiBvc2dpVmVycyA9IGN1cnJQYWNrYWdlLmdldFZlcnNpb24oKTsKKyAgICAgICAgICAgIGlmIChvc2dpVmVycy5nZXRNYWpvcigpICE9IDAgfHwgb3NnaVZlcnMuZ2V0TWlub3IoKSAhPSAwIHx8IG9zZ2lWZXJzLmdldFNlcnZpY2UoKSAhPSAwCisgICAgICAgICAgICAgICAgfHwgb3NnaVZlcnMuZ2V0UXVhbGlmaWVyKCkgIT0gbnVsbCAmJiAhb3NnaVZlcnMuZ2V0UXVhbGlmaWVyKCkudHJpbSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICB2ZXJzaW9uU3RyaW5nID0gIlsiICsgY3VyclBhY2thZ2UuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkgKyAiLCIgKyBjdXJyUGFja2FnZS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSArICJdIjsKKyAgICAgICAgICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlbW92ZSgpIHsKLQkJT2JqZWN0W10gcmVtb3ZlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKTsKLQkJSW1wb3J0UGFja2FnZUhlYWRlciBpbXBvcnRQYWNrYWdlSGVhZGVyID0gKEltcG9ydFBhY2thZ2VIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKAotCQkJCUNvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSk7Ci0JCWZvciAoT2JqZWN0IGVsZW1lbnQgOiByZW1vdmVkKSB7Ci0JCQlpbXBvcnRQYWNrYWdlSGVhZGVyLnJlbW92ZVBhY2thZ2UoKFBhY2thZ2VPYmplY3QpIGVsZW1lbnQpOwotCQl9Ci0JfQorICAgICAgICAgICAgSW1wb3J0UGFja2FnZU9iamVjdCBuZXdQYWNrYWdlT2JqZWN0ID0gbmV3IEltcG9ydFBhY2thZ2VPYmplY3QoaW1wb3J0UGFja2FnZUhlYWRlciwgY3VyclBhY2thZ2UuZ2V0TmFtZSgpLCB2ZXJzaW9uU3RyaW5nLAorICAgICAgICAgICAgICAgIENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURSk7CisgICAgICAgICAgICBpbXBvcnRQYWNrYWdlSGVhZGVyLmFkZFBhY2thZ2UobmV3UGFja2FnZU9iamVjdCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVPcGVuUHJvcGVydGllcygpIHsKLQkJT2JqZWN0W10gc2VsZWN0ZWQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmVmlld2VyLmdldFNlbGVjdGlvbigpKS50b0FycmF5KCk7Ci0JCUltcG9ydFBhY2thZ2VPYmplY3QgZmlyc3QgPSAoSW1wb3J0UGFja2FnZU9iamVjdCkgc2VsZWN0ZWRbMF07Ci0JCUJ1bmRsZURlcGVuZGVuY3lQcm9wZXJ0aWVzRGlhbG9nIGRpYWxvZyA9IG5ldyBCdW5kbGVEZXBlbmRlbmN5UHJvcGVydGllc0RpYWxvZyhpc0VkaXRhYmxlKCksIGZhbHNlLCBmYWxzZSwKLQkJCQlmaXJzdC5pc09wdGlvbmFsKCksIGZpcnN0LmdldFZlcnNpb24oKSwgdHJ1ZSwgdHJ1ZSk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJU1dUVXRpbC5zZXREaWFsb2dTaXplKGRpYWxvZywgNDAwLCAtMSk7Ci0JCWlmIChzZWxlY3RlZC5sZW5ndGggPT0gMSkgewotCQkJZGlhbG9nLnNldFRpdGxlKCgoSW1wb3J0UGFja2FnZU9iamVjdCkgc2VsZWN0ZWRbMF0pLmdldE5hbWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlkaWFsb2cuc2V0VGl0bGUoUERFVUlNZXNzYWdlcy5FeHBvcnRQYWNrYWdlU2VjdGlvbl9wcm9wcyk7Ci0JCX0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LICYmIGlzRWRpdGFibGUoKSkgewotCQkJU3RyaW5nIG5ld1ZlcnNpb24gPSBkaWFsb2cuZ2V0VmVyc2lvbigpOwotCQkJYm9vbGVhbiBuZXdPcHRpb25hbCA9IGRpYWxvZy5pc09wdGlvbmFsKCk7Ci0JCQlmb3IgKE9iamVjdCBlbGVtZW50IDogc2VsZWN0ZWQpIHsKLQkJCQlJbXBvcnRQYWNrYWdlT2JqZWN0IG9iamVjdCA9IChJbXBvcnRQYWNrYWdlT2JqZWN0KSBlbGVtZW50OwotCQkJCWlmICghbmV3VmVyc2lvbi5lcXVhbHMob2JqZWN0LmdldFZlcnNpb24oKSkpIHsKLQkJCQkJb2JqZWN0LnNldFZlcnNpb24obmV3VmVyc2lvbik7Ci0JCQkJfQotCQkJCWlmICghbmV3T3B0aW9uYWwgPT0gb2JqZWN0LmlzT3B0aW9uYWwoKSkgewotCQkJCQlvYmplY3Quc2V0T3B0aW9uYWwobmV3T3B0aW9uYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZW1vdmUoKSB7CisgICAgICAgIE9iamVjdFtdIHJlbW92ZWQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKTsKKyAgICAgICAgSW1wb3J0UGFja2FnZUhlYWRlciBpbXBvcnRQYWNrYWdlSGVhZGVyID0gKEltcG9ydFBhY2thZ2VIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSk7CisgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiByZW1vdmVkKSB7CisgICAgICAgICAgICBpbXBvcnRQYWNrYWdlSGVhZGVyLnJlbW92ZVBhY2thZ2UoKFBhY2thZ2VPYmplY3QpIGVsZW1lbnQpOworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRG91YmxlQ2xpY2soSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWhhbmRsZUdvVG9QYWNrYWdlKHNlbGVjdGlvbik7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU9wZW5Qcm9wZXJ0aWVzKCkgeworICAgICAgICBPYmplY3RbXSBzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuZlZpZXdlci5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOworICAgICAgICBJbXBvcnRQYWNrYWdlT2JqZWN0IGZpcnN0ID0gKEltcG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGVkWzBdOworICAgICAgICBCdW5kbGVEZXBlbmRlbmN5UHJvcGVydGllc0RpYWxvZyBkaWFsb2cgPSBuZXcgQnVuZGxlRGVwZW5kZW5jeVByb3BlcnRpZXNEaWFsb2coaXNFZGl0YWJsZSgpLCBmYWxzZSwgZmFsc2UsIGZpcnN0LmlzT3B0aW9uYWwoKSwKKyAgICAgICAgICAgIGZpcnN0LmdldFZlcnNpb24oKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKKyAgICAgICAgU1dUVXRpbC5zZXREaWFsb2dTaXplKGRpYWxvZywgNDAwLCAtMSk7CisgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgZGlhbG9nLnNldFRpdGxlKCgoSW1wb3J0UGFja2FnZU9iamVjdCkgc2VsZWN0ZWRbMF0pLmdldE5hbWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaWFsb2cuc2V0VGl0bGUoUERFVUlNZXNzYWdlcy5FeHBvcnRQYWNrYWdlU2VjdGlvbl9wcm9wcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LICYmIGlzRWRpdGFibGUoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5ld1ZlcnNpb24gPSBkaWFsb2cuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgYm9vbGVhbiBuZXdPcHRpb25hbCA9IGRpYWxvZy5pc09wdGlvbmFsKCk7CisgICAgICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogc2VsZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBJbXBvcnRQYWNrYWdlT2JqZWN0IG9iamVjdCA9IChJbXBvcnRQYWNrYWdlT2JqZWN0KSBlbGVtZW50OworICAgICAgICAgICAgICAgIGlmICghbmV3VmVyc2lvbi5lcXVhbHMob2JqZWN0LmdldFZlcnNpb24oKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldFZlcnNpb24obmV3VmVyc2lvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghbmV3T3B0aW9uYWwgPT0gb2JqZWN0LmlzT3B0aW9uYWwoKSkgeworICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0T3B0aW9uYWwobmV3T3B0aW9uYWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlzdXBlci5tYWtlQWN0aW9ucygpOwotCQlmR29Ub0FjdGlvbiA9IG5ldyBBY3Rpb24oUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9nb1RvUGFja2FnZSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaGFuZGxlR29Ub1BhY2thZ2UoZlZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX07Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworICAgICAgICBoYW5kbGVHb1RvUGFja2FnZShzZWxlY3Rpb24pOworICAgIH0KIAotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBnZXRQYWNrYWdlRnJhZ21lbnQoSVNlbGVjdGlvbiBzZWwpIHsKLQkJaWYgKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpICE9IDEpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucygpIHsKKyAgICAgICAgc3VwZXIubWFrZUFjdGlvbnMoKTsKKyAgICAgICAgdGhpcy5mR29Ub0FjdGlvbiA9IG5ldyBBY3Rpb24oUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9nb1RvUGFja2FnZSkgewogCi0JCQlJQmFzZU1vZGVsIG1vZGVsID0gZ2V0UGFnZSgpLmdldE1vZGVsKCk7Ci0JCQlpZiAoIShtb2RlbCBpbnN0YW5jZW9mIElQbHVnaW5Nb2RlbEJhc2UpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVHb1RvUGFja2FnZShCdW5kbGVJbXBvcnRQYWNrYWdlU2VjdGlvbi50aGlzLmZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KIAotCQkJcmV0dXJuIFBERUphdmFIZWxwZXIuZ2V0UGFja2FnZUZyYWdtZW50KCgoUGFja2FnZU9iamVjdCkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKS5nZXROYW1lKCksCi0JCQkJCSgoSVBsdWdpbk1vZGVsQmFzZSkgbW9kZWwpLmdldFBsdWdpbkJhc2UoKS5nZXRJZCgpLCBnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuZ2V0Q29tbW9uUHJvamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGdldFBhY2thZ2VGcmFnbWVudChJU2VsZWN0aW9uIHNlbCkgeworICAgICAgICBpZiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKyAgICAgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsOworICAgICAgICAgICAgaWYgKHNlbGVjdGlvbi5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUdvVG9QYWNrYWdlKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgZnJhZyA9IGdldFBhY2thZ2VGcmFnbWVudChzZWxlY3Rpb24pOwotCQlpZiAoZnJhZyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlWaWV3UGFydCBwYXJ0ID0gUERFUGx1Z2luLmdldEFjdGl2ZVBhZ2UoKS5zaG93VmlldyhKYXZhVUkuSURfUEFDS0FHRVMpOwotCQkJCVNob3dJblBhY2thZ2VWaWV3QWN0aW9uIGFjdGlvbiA9IG5ldyBTaG93SW5QYWNrYWdlVmlld0FjdGlvbihwYXJ0LmdldFNpdGUoKSk7Ci0JCQkJYWN0aW9uLnJ1bihmcmFnKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIElCYXNlTW9kZWwgbW9kZWwgPSBnZXRQYWdlKCkuZ2V0TW9kZWwoKTsKKyAgICAgICAgICAgIGlmICghKG1vZGVsIGluc3RhbmNlb2YgSVBsdWdpbk1vZGVsQmFzZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0QWRkSW5kZXgoKSB7Ci0JCXJldHVybiBBRERfSU5ERVg7Ci0JfQorICAgICAgICAgICAgcmV0dXJuIFBERUphdmFIZWxwZXIuZ2V0UGFja2FnZUZyYWdtZW50KCgoUGFja2FnZU9iamVjdCkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgKChJUGx1Z2luTW9kZWxCYXNlKSBtb2RlbCkuZ2V0UGx1Z2luQmFzZSgpLmdldElkKCksIGdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS5nZXRDb21tb25Qcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0UmVtb3ZlSW5kZXgoKSB7Ci0JCXJldHVybiBSRU1PVkVfSU5ERVg7Ci0JfQorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVHb1RvUGFja2FnZShJU2VsZWN0aW9uIHNlbGVjdGlvbikgeworICAgICAgICBJUGFja2FnZUZyYWdtZW50IGZyYWcgPSBnZXRQYWNrYWdlRnJhZ21lbnQoc2VsZWN0aW9uKTsKKyAgICAgICAgaWYgKGZyYWcgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJVmlld1BhcnQgcGFydCA9IFBERVBsdWdpbi5nZXRBY3RpdmVQYWdlKCkuc2hvd1ZpZXcoSmF2YVVJLklEX1BBQ0tBR0VTKTsKKyAgICAgICAgICAgICAgICBTaG93SW5QYWNrYWdlVmlld0FjdGlvbiBhY3Rpb24gPSBuZXcgU2hvd0luUGFja2FnZVZpZXdBY3Rpb24ocGFydC5nZXRTaXRlKCkpOworICAgICAgICAgICAgICAgIGFjdGlvbi5ydW4oZnJhZyk7CisgICAgICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGdldFByb3BlcnRpZXNJbmRleCgpIHsKLQkJcmV0dXJuIFBST1BFUlRJRVNfSU5ERVg7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgZ2V0QWRkSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBBRERfSU5ERVg7CisgICAgfQogCi0JY2xhc3MgQnVuZGxlSW1wb3J0UGFja2FnZURpYWxvZ0xhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1BBQ0tBR0UpOwotCQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBnZXRSZW1vdmVJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIFJFTU9WRV9JTkRFWDsKKyAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJUGFja2FnZUV4cG9ydCBwYWNrYWdlRXhwb3J0ID0gKFBhY2thZ2VFeHBvcnQpIGVsZW1lbnQ7Ci0JCQlTdHJpbmcgbGFiZWwgPSBwYWNrYWdlRXhwb3J0LmdldE5hbWUoKTsKLQkJCWlmIChudWxsICE9IHBhY2thZ2VFeHBvcnQuZ2V0VmVyc2lvbigpKSB7Ci0JCQkJbGFiZWwgKz0gIiAiICsgcGFja2FnZUV4cG9ydC5nZXRWZXJzaW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBnZXRQcm9wZXJ0aWVzSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBQUk9QRVJUSUVTX0lOREVYOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBJbXBvcnRQYWNrYWdlQ29udGVudFByb3ZpZGVyKCk7Ci0JfQorICAgIGNsYXNzIEJ1bmRsZUltcG9ydFBhY2thZ2VEaWFsb2dMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRlckNvbnN0YW50KCkgewotCQlyZXR1cm4gQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFOwotCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgeworICAgICAgICAgICAgcmV0dXJuIEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX1BBQ0tBR0UpOworICAgICAgICB9CiAKLQljbGFzcyBJbXBvcnRJdGVtV3JhcHBlciB7Ci0JCU9iamVjdCBmVW5kZXJseWluZzsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworICAgICAgICAgICAgUGFja2FnZUV4cG9ydCBwYWNrYWdlRXhwb3J0ID0gKFBhY2thZ2VFeHBvcnQpIGVsZW1lbnQ7CisgICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBwYWNrYWdlRXhwb3J0LmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChudWxsICE9IHBhY2thZ2VFeHBvcnQuZ2V0VmVyc2lvbigpKSB7CisgICAgICAgICAgICAgICAgbGFiZWwgKz0gIiAiICsgcGFja2FnZUV4cG9ydC5nZXRWZXJzaW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGFiZWw7CisgICAgICAgIH0KKyAgICB9CiAKLQkJcHVibGljIEltcG9ydEl0ZW1XcmFwcGVyKE9iamVjdCB1bmRlcmx5aW5nKSB7Ci0JCQlmVW5kZXJseWluZyA9IHVuZGVybHlpbmc7Ci0JCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgSW1wb3J0UGFja2FnZUNvbnRlbnRQcm92aWRlcigpOworICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRlckNvbnN0YW50KCkgeworICAgICAgICByZXR1cm4gQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFOworICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJbXBvcnRJdGVtV3JhcHBlcikgewotCQkJCUltcG9ydEl0ZW1XcmFwcGVyIGl0ZW0gPSAoSW1wb3J0SXRlbVdyYXBwZXIpIG9iajsKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpLmVxdWFscyhpdGVtLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICBjbGFzcyBJbXBvcnRJdGVtV3JhcHBlciB7CiAKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJaWYgKGZVbmRlcmx5aW5nIGluc3RhbmNlb2YgRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uKSB7Ci0JCQkJcmV0dXJuICgoRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uKSBmVW5kZXJseWluZykuZ2V0TmFtZSgpOwotCQkJfQotCQkJaWYgKGZVbmRlcmx5aW5nIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotCQkJCXJldHVybiAoKElQYWNrYWdlRnJhZ21lbnQpIGZVbmRlcmx5aW5nKS5nZXRFbGVtZW50TmFtZSgpOwotCQkJfQotCQkJaWYgKGZVbmRlcmx5aW5nIGluc3RhbmNlb2YgRXhwb3J0UGFja2FnZU9iamVjdCkgewotCQkJCXJldHVybiAoKEV4cG9ydFBhY2thZ2VPYmplY3QpIGZVbmRlcmx5aW5nKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgICAgICBPYmplY3QgZlVuZGVybHlpbmc7CiAKLQkJcHVibGljIFZlcnNpb24gZ2V0VmVyc2lvbigpIHsKLQkJCWlmIChmVW5kZXJseWluZyBpbnN0YW5jZW9mIEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbikgewotCQkJCXJldHVybiAoKEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbikgZlVuZGVybHlpbmcpLmdldFZlcnNpb24oKTsKLQkJCX0KLQkJCWlmIChmVW5kZXJseWluZyBpbnN0YW5jZW9mIEV4cG9ydFBhY2thZ2VPYmplY3QpIHsKLQkJCQlTdHJpbmcgdmVyc2lvbiA9ICgoRXhwb3J0UGFja2FnZU9iamVjdCkgZlVuZGVybHlpbmcpLmdldFZlcnNpb24oKTsKLQkJCQlpZiAodmVyc2lvbiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgVmVyc2lvbih2ZXJzaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgICAgICBwdWJsaWMgSW1wb3J0SXRlbVdyYXBwZXIoT2JqZWN0IHVuZGVybHlpbmcpIHsKKyAgICAgICAgICAgIHRoaXMuZlVuZGVybHlpbmcgPSB1bmRlcmx5aW5nOworICAgICAgICB9CiAKLQkJYm9vbGVhbiBoYXNWZXJzaW9uKCkgewotCQkJcmV0dXJuIGhhc0VQRCgpICYmICgoRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uKSBmVW5kZXJseWluZykuZ2V0VmVyc2lvbigpICE9IG51bGw7Ci0JCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TmFtZSgpOworICAgICAgICB9CiAKLQkJYm9vbGVhbiBoYXNFUEQoKSB7Ci0JCQlyZXR1cm4gZlVuZGVybHlpbmcgaW5zdGFuY2VvZiBFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb247Ci0JCX0KLQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEltcG9ydEl0ZW1XcmFwcGVyKSB7CisgICAgICAgICAgICAgICAgSW1wb3J0SXRlbVdyYXBwZXIgaXRlbSA9IChJbXBvcnRJdGVtV3JhcHBlcikgb2JqOworICAgICAgICAgICAgICAgIHJldHVybiBnZXROYW1lKCkuZXF1YWxzKGl0ZW0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uU2VsZWN0ZWQoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA9PSBBRERfUkVNT1RFX0JVTkRMRV9JTkRFWCkgewotCQkJaW50ZXJuYWxIYW5kbGVBZGQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5idXR0b25TZWxlY3RlZChpbmRleCk7Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmZVbmRlcmx5aW5nIGluc3RhbmNlb2YgRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uKSB0aGlzLmZVbmRlcmx5aW5nKS5nZXROYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5mVW5kZXJseWluZyBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChJUGFja2FnZUZyYWdtZW50KSB0aGlzLmZVbmRlcmx5aW5nKS5nZXRFbGVtZW50TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMuZlVuZGVybHlpbmcgaW5zdGFuY2VvZiBFeHBvcnRQYWNrYWdlT2JqZWN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoRXhwb3J0UGFja2FnZU9iamVjdCkgdGhpcy5mVW5kZXJseWluZykuZ2V0TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCWNsYXNzIEltcG9ydFBhY2thZ2VDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0VGFibGVQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0JCQlJbXBvcnRQYWNrYWdlSGVhZGVyIGhlYWRlciA9IChJbXBvcnRQYWNrYWdlSGVhZGVyKSBnZXRCdW5kbGUoKS5nZXRNYW5pZmVzdEhlYWRlcihDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UpOwotCQkJaWYgKGhlYWRlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBoZWFkZXIuZ2V0UGFja2FnZXMoKTsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgcHVibGljIFZlcnNpb24gZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmZVbmRlcmx5aW5nIGluc3RhbmNlb2YgRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uKSB0aGlzLmZVbmRlcmx5aW5nKS5nZXRWZXJzaW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5mVW5kZXJseWluZyBpbnN0YW5jZW9mIEV4cG9ydFBhY2thZ2VPYmplY3QpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9ICgoRXhwb3J0UGFja2FnZU9iamVjdCkgdGhpcy5mVW5kZXJseWluZykuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWZXJzaW9uKHZlcnNpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBoYXNWZXJzaW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIGhhc0VQRCgpICYmICgoRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uKSB0aGlzLmZVbmRlcmx5aW5nKS5nZXRWZXJzaW9uKCkgIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaGFzRVBEKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZlVuZGVybHlpbmcgaW5zdGFuY2VvZiBFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBidXR0b25TZWxlY3RlZChpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4ID09IEFERF9SRU1PVEVfQlVORExFX0lOREVYKSB7CisgICAgICAgICAgICBpbnRlcm5hbEhhbmRsZUFkZCh0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmJ1dHRvblNlbGVjdGVkKGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIEltcG9ydFBhY2thZ2VDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0VGFibGVQcm92aWRlciB7CisKKyAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBwYXJlbnQpIHsKKyAgICAgICAgICAgIEltcG9ydFBhY2thZ2VIZWFkZXIgaGVhZGVyID0gKEltcG9ydFBhY2thZ2VIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSk7CisgICAgICAgICAgICBpZiAoaGVhZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlci5nZXRQYWNrYWdlcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUltcG9ydFNlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlSW1wb3J0U2VjdGlvbi5qYXZhCmluZGV4IDc0ZGExNjIuLmZlMTcwYTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlSW1wb3J0U2VjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlSW1wb3J0U2VjdGlvbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC00NywyOTIgKzQ4LDI3MSBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlSW1wb3J0U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0SW1wb3J0U2VjdGlvbiB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT04gPSAiU3BlY2lmeSB0aGUgbGlzdCBvZiBidW5kbGVzIHJlcXVpcmVkIGZvciB0aGUgb3BlcmF0aW9uIG9mIHRoaXMgYnVuZGxlLiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gIlNwZWNpZnkgdGhlIGxpc3Qgb2YgYnVuZGxlcyByZXF1aXJlZCBmb3IgdGhlIG9wZXJhdGlvbiBvZiB0aGlzIGJ1bmRsZS4iOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9JTkRFWCA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFERF9JTkRFWCA9IDA7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUREX1JFTU9URV9CVU5ETEVfSU5ERVggPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfUkVNT1RFX0JVTkRMRV9JTkRFWCA9IDE7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX0lOREVYID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX0lOREVYID0gMjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTX0lOREVYID0gMzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJPUEVSVElFU19JTkRFWCA9IDM7CiAKLQlwdWJsaWMgQnVuZGxlSW1wb3J0U2VjdGlvbihQREVGb3JtUGFnZSBwYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhZ2UsIHBhcmVudCwgU2VjdGlvbi5ERVNDUklQVElPTiwgbmV3IFN0cmluZ1tdIHsgUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9hZGQsICJEb3dubG9hZC4uLiIsCi0JCQkJUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9yZW1vdmUsIFBERVVJTWVzc2FnZXMuSW1wb3J0UGFja2FnZVNlY3Rpb25fcHJvcGVydGllcyB9KTsKKyAgICBwdWJsaWMgQnVuZGxlSW1wb3J0U2VjdGlvbihQREVGb3JtUGFnZSBwYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIHN1cGVyKHBhZ2UsIHBhcmVudCwgU2VjdGlvbi5ERVNDUklQVElPTiwgbmV3IFN0cmluZ1tdIHsgUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9hZGQsICJEb3dubG9hZC4uLiIsCisgICAgICAgICAgICBQREVVSU1lc3NhZ2VzLkltcG9ydFBhY2thZ2VTZWN0aW9uX3JlbW92ZSwgUERFVUlNZXNzYWdlcy5JbXBvcnRQYWNrYWdlU2VjdGlvbl9wcm9wZXJ0aWVzIH0pOwogCi0JCWdldFNlY3Rpb24oKS5zZXRUZXh0KCJJbXBvcnQgQnVuZGxlIik7Ci0JCWdldFNlY3Rpb24oKS5zZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7Ci0JCWdldFRhYmxlUGFydCgpLnNldEVkaXRhYmxlKGZhbHNlKTsKLQl9CisgICAgICAgIGdldFNlY3Rpb24oKS5zZXRUZXh0KCJJbXBvcnQgQnVuZGxlIik7CisgICAgICAgIGdldFNlY3Rpb24oKS5zZXREZXNjcmlwdGlvbihERVNDUklQVElPTik7CisgICAgICAgIGdldFRhYmxlUGFydCgpLnNldEVkaXRhYmxlKGZhbHNlKTsKKyAgICB9CiAKLQljbGFzcyBJbXBvcnRCdW5kbGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0VGFibGVQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0JCQlJbXBvcnRCdW5kbGVIZWFkZXIgaGVhZGVyID0gKEltcG9ydEJ1bmRsZUhlYWRlcikgZ2V0QnVuZGxlKCkuZ2V0TWFuaWZlc3RIZWFkZXIoCi0JCQkJCUlIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSk7Ci0JCQlpZiAoaGVhZGVyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGhlYWRlci5nZXRJbXBvcnRlZEJ1bmRsZXMoKTsKLQkJCX0KLQkJfQotCX0KKyAgICBjbGFzcyBJbXBvcnRCdW5kbGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0VGFibGVQcm92aWRlciB7CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSW1wb3J0QnVuZGxlQ29udGVudFByb3ZpZGVyKCk7Ci0JfQorICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgeworICAgICAgICAgICAgSW1wb3J0QnVuZGxlSGVhZGVyIGhlYWRlciA9IChJbXBvcnRCdW5kbGVIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSk7CisgICAgICAgICAgICBpZiAoaGVhZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlci5nZXRJbXBvcnRlZEJ1bmRsZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJVGFibGVMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgQnVuZGxlSW1wb3J0TGFiZWxQcm92aWRlcigpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgSW1wb3J0QnVuZGxlQ29udGVudFByb3ZpZGVyKCk7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIHNldEVsZW1lbnRzKEltcG9ydExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nLCBib29sZWFuIGFkZFJlbW90ZSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKChCdW5kbGVNYW5pZmVzdEVkaXRvcikgdGhpcy5nZXRQYWdlKCkuZ2V0RWRpdG9yKCkpLmdldENvbW1vblByb2plY3QoKTsKLQkJSUFydGVmYWN0W10gYnVuZGxlcyA9IG51bGw7Ci0JCWlmIChhZGRSZW1vdGUpIHsKLQkJCUFydGVmYWN0UmVwb3NpdG9yeSBidW5kbGVSZXBvc2l0b3J5ID0gUmVwb3NpdG9yeVV0aWxzLnNlYXJjaEZvckFydGlmYWN0cygiIiwgdHJ1ZSwgZmFsc2UpOwotCQkJYnVuZGxlcyA9IGJ1bmRsZVJlcG9zaXRvcnkuZ2V0QnVuZGxlU2V0KCkudG9BcnJheSgpOwotCQl9IGVsc2UgewotCQkJQ29sbGVjdGlvbjxBcnRlZmFjdD4gYnVuZGxlTGlzdCA9IFJlcG9zaXRvcnlVdGlscy5nZXRJbXBvcnRCdW5kbGVQcm9wb3NhbHMocHJvamVjdCwgIiIpOwotCQkJYnVuZGxlcyA9IGJ1bmRsZUxpc3QudG9BcnJheShuZXcgSUFydGVmYWN0W10ge30pOwotCQl9Ci0JCWRpYWxvZy5zZXRFbGVtZW50cyhidW5kbGVzKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIElUYWJsZUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdW5kbGVJbXBvcnRMYWJlbFByb3ZpZGVyKCk7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUV4aXN0aW5nSW1wb3J0cyhDb2xsZWN0aW9uPEFydGVmYWN0PiBidW5kbGVzKSB7Ci0JCUltcG9ydEJ1bmRsZUhlYWRlciBoZWFkZXIgPSAoSW1wb3J0QnVuZGxlSGVhZGVyKSBnZXRCdW5kbGUoKS5nZXRNYW5pZmVzdEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9CVU5ETEUpOwotCQlTZXQ8QXJ0ZWZhY3Q+IGZpbHRlcmVkRWxlbWVudHMgPSBuZXcgSGFzaFNldDxBcnRlZmFjdD4oKTsKKyAgICBwcml2YXRlIHZvaWQgc2V0RWxlbWVudHMoSW1wb3J0TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2csIGJvb2xlYW4gYWRkUmVtb3RlKSB7CisgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoKEJ1bmRsZU1hbmlmZXN0RWRpdG9yKSB0aGlzLmdldFBhZ2UoKS5nZXRFZGl0b3IoKSkuZ2V0Q29tbW9uUHJvamVjdCgpOworICAgICAgICBJQXJ0ZWZhY3RbXSBidW5kbGVzID0gbnVsbDsKKyAgICAgICAgaWYgKGFkZFJlbW90ZSkgeworICAgICAgICAgICAgQXJ0ZWZhY3RSZXBvc2l0b3J5IGJ1bmRsZVJlcG9zaXRvcnkgPSBSZXBvc2l0b3J5VXRpbHMuc2VhcmNoRm9yQXJ0aWZhY3RzKCIiLCB0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICBidW5kbGVzID0gYnVuZGxlUmVwb3NpdG9yeS5nZXRCdW5kbGVTZXQoKS50b0FycmF5KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uPEFydGVmYWN0PiBidW5kbGVMaXN0ID0gUmVwb3NpdG9yeVV0aWxzLmdldEltcG9ydEJ1bmRsZVByb3Bvc2Fscyhwcm9qZWN0LCAiIik7CisgICAgICAgICAgICBidW5kbGVzID0gYnVuZGxlTGlzdC50b0FycmF5KG5ldyBJQXJ0ZWZhY3RbXSB7fSk7CisgICAgICAgIH0KKyAgICAgICAgZGlhbG9nLnNldEVsZW1lbnRzKGJ1bmRsZXMpOworICAgIH0KIAotCQlpZiAoaGVhZGVyICE9IG51bGwpIHsKLQkJCUltcG9ydEJ1bmRsZU9iamVjdFtdIGZpbHRlciA9IGhlYWRlci5nZXRJbXBvcnRlZEJ1bmRsZXMoKTsKLQkJCWZvciAoQXJ0ZWZhY3QgcHJvcG9zYWwgOiBidW5kbGVzKSB7Ci0JCQkJZm9yIChJbXBvcnRCdW5kbGVPYmplY3QgaW1wb3J0ZWQgOiBmaWx0ZXIpIHsKLQkJCQkJaWYgKHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoaW1wb3J0ZWQuZ2V0SWQoKSkpIHsKLQkJCQkJCWZpbHRlcmVkRWxlbWVudHMuYWRkKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWJ1bmRsZXMucmVtb3ZlQWxsKGZpbHRlcmVkRWxlbWVudHMpOwotCQl9Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZCgpIHsKKyAgICAgICAgaW50ZXJuYWxIYW5kbGVBZGQoZmFsc2UpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZCgpIHsKLQkJaW50ZXJuYWxIYW5kbGVBZGQoZmFsc2UpOwotCX0KKyAgICBwcml2YXRlIHZvaWQgaW50ZXJuYWxIYW5kbGVBZGQoZmluYWwgYm9vbGVhbiBhZGRSZW1vdGUpIHsKIAotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEhhbmRsZUFkZChmaW5hbCBib29sZWFuIGFkZFJlbW90ZSkgeworICAgICAgICBmaW5hbCBJbXBvcnRMaXN0U2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBJbXBvcnRMaXN0U2VsZWN0aW9uRGlhbG9nKFBERVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAorICAgICAgICAgICAgbmV3IEJ1bmRsZUltcG9ydERpYWxvZ0xhYmVsUHJvdmlkZXIoKSk7CiAKLQkJZmluYWwgSW1wb3J0TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgSW1wb3J0TGlzdFNlbGVjdGlvbkRpYWxvZyhQREVQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQluZXcgQnVuZGxlSW1wb3J0RGlhbG9nTGFiZWxQcm92aWRlcigpKTsKKyAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CiAKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2V0RWxlbWVudHMoZGlhbG9nLCBhZGRSZW1vdGUpOwotCQkJCWRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbih0cnVlKTsKLQkJCQlkaWFsb2cuc2V0VGl0bGUoIkJ1bmRsZSBTZWxlY3Rpb24iKTsKLQkJCQlkaWFsb2cuc2V0TWVzc2FnZSgiU2VsZWN0IGEgQnVuZGxlOiIpOwotCQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCQlTV1RVdGlsLnNldERpYWxvZ1NpemUoZGlhbG9nLCA0MDAsIDUwMCk7Ci0JCQl9Ci0JCX07CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgc2V0RWxlbWVudHMoZGlhbG9nLCBhZGRSZW1vdGUpOworICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbih0cnVlKTsKKyAgICAgICAgICAgICAgICBkaWFsb2cuc2V0VGl0bGUoIkJ1bmRsZSBTZWxlY3Rpb24iKTsKKyAgICAgICAgICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZSgiU2VsZWN0IGEgQnVuZGxlOiIpOworICAgICAgICAgICAgICAgIGRpYWxvZy5jcmVhdGUoKTsKKyAgICAgICAgICAgICAgICBTV1RVdGlsLnNldERpYWxvZ1NpemUoZGlhbG9nLCA0MDAsIDUwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIHJ1bm5hYmxlKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7CisgICAgICAgIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBydW5uYWJsZSk7CisgICAgICAgIGlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewogCi0JCQlPYmplY3RbXSBzZWxlY3RlZCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIE9iamVjdFtdIHNlbGVjdGVkID0gZGlhbG9nLmdldFJlc3VsdCgpOwogCi0JCQlpZiAoYWRkUmVtb3RlKSB7Ci0JCQkJYWRkUmVtb3RlQnVuZGxlcyhzZWxlY3RlZCk7Ci0JCQl9IGVsc2UgewotCQkJCWFkZExvY2FsQnVuZGxlcyhzZWxlY3RlZCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIGlmIChhZGRSZW1vdGUpIHsKKyAgICAgICAgICAgICAgICBhZGRSZW1vdGVCdW5kbGVzKHNlbGVjdGVkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRkTG9jYWxCdW5kbGVzKHNlbGVjdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCXByaXZhdGUgdm9pZCBhZGRMb2NhbEJ1bmRsZXMoT2JqZWN0W10gc2VsZWN0ZWQpIHsKLQkJSW1wb3J0QnVuZGxlSGVhZGVyIGltcG9ydEJ1bmRsZUhlYWRlciA9IChJbXBvcnRCdW5kbGVIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKAotCQkJCUlIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSk7Ci0JCWZvciAoT2JqZWN0IGN1cnJTZWxlY3RlZEVsZW1lbnQgOiBzZWxlY3RlZCkgewotCQkJQnVuZGxlQXJ0ZWZhY3QgY3VyckJ1bmRsZSA9IChCdW5kbGVBcnRlZmFjdCkgY3VyclNlbGVjdGVkRWxlbWVudDsKLQkJCWlmIChudWxsID09IGltcG9ydEJ1bmRsZUhlYWRlcikgewotCQkJCWdldEJ1bmRsZSgpLnNldEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9CVU5ETEUsICIiKTsKLQkJCQlpbXBvcnRCdW5kbGVIZWFkZXIgPSAoSW1wb3J0QnVuZGxlSGVhZGVyKSBnZXRCdW5kbGUoKS5nZXRNYW5pZmVzdEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9CVU5ETEUpOwotCQkJfQorICAgIHByaXZhdGUgdm9pZCBhZGRMb2NhbEJ1bmRsZXMoT2JqZWN0W10gc2VsZWN0ZWQpIHsKKyAgICAgICAgSW1wb3J0QnVuZGxlSGVhZGVyIGltcG9ydEJ1bmRsZUhlYWRlciA9IChJbXBvcnRCdW5kbGVIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSk7CisgICAgICAgIGZvciAoT2JqZWN0IGN1cnJTZWxlY3RlZEVsZW1lbnQgOiBzZWxlY3RlZCkgeworICAgICAgICAgICAgQnVuZGxlQXJ0ZWZhY3QgY3VyckJ1bmRsZSA9IChCdW5kbGVBcnRlZmFjdCkgY3VyclNlbGVjdGVkRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChudWxsID09IGltcG9ydEJ1bmRsZUhlYWRlcikgeworICAgICAgICAgICAgICAgIGdldEJ1bmRsZSgpLnNldEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9CVU5ETEUsICIiKTsKKyAgICAgICAgICAgICAgICBpbXBvcnRCdW5kbGVIZWFkZXIgPSAoSW1wb3J0QnVuZGxlSGVhZGVyKSBnZXRCdW5kbGUoKS5nZXRNYW5pZmVzdEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9CVU5ETEUpOworICAgICAgICAgICAgfQogCi0JCQlTdHJpbmcgdmVyc2lvblN0cmluZyA9IG51bGw7Ci0JCQlPc2dpVmVyc2lvbiBvc2dpVmVycyA9IGN1cnJCdW5kbGUuZ2V0VmVyc2lvbigpOwotCQkJaWYgKG9zZ2lWZXJzLmdldE1ham9yKCkgIT0gMCB8fCBvc2dpVmVycy5nZXRNaW5vcigpICE9IDAgfHwgb3NnaVZlcnMuZ2V0U2VydmljZSgpICE9IDAKLQkJCQkJfHwgKG9zZ2lWZXJzLmdldFF1YWxpZmllcigpICE9IG51bGwgJiYgIW9zZ2lWZXJzLmdldFF1YWxpZmllcigpLnRyaW0oKS5lcXVhbHMoIiIpKSkgewotCQkJCXZlcnNpb25TdHJpbmcgPSAiWyIgKyBjdXJyQnVuZGxlLmdldFZlcnNpb24oKS50b1N0cmluZygpICsgIiwiICsgY3VyckJ1bmRsZS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKQotCQkJCQkJKyAiXSI7Ci0JCQl9Ci0JCQlpbXBvcnRCdW5kbGVIZWFkZXIuYWRkQnVuZGxlKGN1cnJCdW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIHZlcnNpb25TdHJpbmcpOwotCQl9Ci0JfQorICAgICAgICAgICAgU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBudWxsOworICAgICAgICAgICAgT3NnaVZlcnNpb24gb3NnaVZlcnMgPSBjdXJyQnVuZGxlLmdldFZlcnNpb24oKTsKKyAgICAgICAgICAgIGlmIChvc2dpVmVycy5nZXRNYWpvcigpICE9IDAgfHwgb3NnaVZlcnMuZ2V0TWlub3IoKSAhPSAwIHx8IG9zZ2lWZXJzLmdldFNlcnZpY2UoKSAhPSAwCisgICAgICAgICAgICAgICAgfHwgb3NnaVZlcnMuZ2V0UXVhbGlmaWVyKCkgIT0gbnVsbCAmJiAhb3NnaVZlcnMuZ2V0UXVhbGlmaWVyKCkudHJpbSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICB2ZXJzaW9uU3RyaW5nID0gIlsiICsgY3VyckJ1bmRsZS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSArICIsIiArIGN1cnJCdW5kbGUuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkgKyAiXSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbXBvcnRCdW5kbGVIZWFkZXIuYWRkQnVuZGxlKGN1cnJCdW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIHZlcnNpb25TdHJpbmcpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGFkZFJlbW90ZUJ1bmRsZXMoT2JqZWN0W10gc2VsZWN0ZWQpIHsKLQkJSW1wb3J0QnVuZGxlSGVhZGVyIGltcG9ydEJ1bmRsZUhlYWRlciA9IChJbXBvcnRCdW5kbGVIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKAotCQkJCUlIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSk7CisgICAgcHJpdmF0ZSB2b2lkIGFkZFJlbW90ZUJ1bmRsZXMoT2JqZWN0W10gc2VsZWN0ZWQpIHsKKyAgICAgICAgSW1wb3J0QnVuZGxlSGVhZGVyIGltcG9ydEJ1bmRsZUhlYWRlciA9IChJbXBvcnRCdW5kbGVIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSk7CiAKLQkJU2V0PEFydGVmYWN0PiByZW1vdGVBcnRpZmFjdERlZmluaXRpb25zID0gbmV3IEhhc2hTZXQ8QXJ0ZWZhY3Q+KHNlbGVjdGVkLmxlbmd0aCk7CisgICAgICAgIFNldDxBcnRlZmFjdD4gcmVtb3RlQXJ0aWZhY3REZWZpbml0aW9ucyA9IG5ldyBIYXNoU2V0PEFydGVmYWN0PihzZWxlY3RlZC5sZW5ndGgpOwogCi0JCWZvciAoT2JqZWN0IGN1cnJTZWxlY3RlZEVsZW1lbnQgOiBzZWxlY3RlZCkgewotCQkJcmVtb3RlQXJ0aWZhY3REZWZpbml0aW9ucy5hZGQoKEFydGVmYWN0KSBjdXJyU2VsZWN0ZWRFbGVtZW50KTsKLQkJfQorICAgICAgICBmb3IgKE9iamVjdCBjdXJyU2VsZWN0ZWRFbGVtZW50IDogc2VsZWN0ZWQpIHsKKyAgICAgICAgICAgIHJlbW90ZUFydGlmYWN0RGVmaW5pdGlvbnMuYWRkKChBcnRlZmFjdCkgY3VyclNlbGVjdGVkRWxlbWVudCk7CisgICAgICAgIH0KIAotCQlJUHJvamVjdCBwcm9qZWN0ID0gKChCdW5kbGVNYW5pZmVzdEVkaXRvcikgdGhpcy5nZXRQYWdlKCkuZ2V0RWRpdG9yKCkpLmdldENvbW1vblByb2plY3QoKTsKLQkJUmVwb3NpdG9yeVV0aWxzLmRvd25sb2FkQXJpZmFjdHMocmVtb3RlQXJ0aWZhY3REZWZpbml0aW9ucywgcHJvamVjdCwgRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQlmYWxzZSk7CisgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoKEJ1bmRsZU1hbmlmZXN0RWRpdG9yKSB0aGlzLmdldFBhZ2UoKS5nZXRFZGl0b3IoKSkuZ2V0Q29tbW9uUHJvamVjdCgpOworICAgICAgICBSZXBvc2l0b3J5VXRpbHMuZG93bmxvYWRBcmlmYWN0cyhyZW1vdGVBcnRpZmFjdERlZmluaXRpb25zLCBwcm9qZWN0LCBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCBmYWxzZSk7CiAKLQkJZm9yIChPYmplY3QgY3VyclNlbGVjdGVkRWxlbWVudCA6IHNlbGVjdGVkKSB7Ci0JCQlCdW5kbGVBcnRlZmFjdCBjdXJyQnVuZGxlID0gKEJ1bmRsZUFydGVmYWN0KSBjdXJyU2VsZWN0ZWRFbGVtZW50OwotCQkJaWYgKG51bGwgPT0gaW1wb3J0QnVuZGxlSGVhZGVyKSB7Ci0JCQkJZ2V0QnVuZGxlKCkuc2V0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSwgIiIpOwotCQkJCWltcG9ydEJ1bmRsZUhlYWRlciA9IChJbXBvcnRCdW5kbGVIZWFkZXIpIGdldEJ1bmRsZSgpLmdldE1hbmlmZXN0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSk7Ci0JCQl9CisgICAgICAgIGZvciAoT2JqZWN0IGN1cnJTZWxlY3RlZEVsZW1lbnQgOiBzZWxlY3RlZCkgeworICAgICAgICAgICAgQnVuZGxlQXJ0ZWZhY3QgY3VyckJ1bmRsZSA9IChCdW5kbGVBcnRlZmFjdCkgY3VyclNlbGVjdGVkRWxlbWVudDsKKyAgICAgICAgICAgIGlmIChudWxsID09IGltcG9ydEJ1bmRsZUhlYWRlcikgeworICAgICAgICAgICAgICAgIGdldEJ1bmRsZSgpLnNldEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9CVU5ETEUsICIiKTsKKyAgICAgICAgICAgICAgICBpbXBvcnRCdW5kbGVIZWFkZXIgPSAoSW1wb3J0QnVuZGxlSGVhZGVyKSBnZXRCdW5kbGUoKS5nZXRNYW5pZmVzdEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9CVU5ETEUpOworICAgICAgICAgICAgfQogCi0JCQlTdHJpbmcgdmVyc2lvblN0cmluZyA9IG51bGw7Ci0JCQlPc2dpVmVyc2lvbiBvc2dpVmVycyA9IGN1cnJCdW5kbGUuZ2V0VmVyc2lvbigpOwotCQkJaWYgKG9zZ2lWZXJzLmdldE1ham9yKCkgIT0gMCB8fCBvc2dpVmVycy5nZXRNaW5vcigpICE9IDAgfHwgb3NnaVZlcnMuZ2V0U2VydmljZSgpICE9IDAKLQkJCQkJfHwgKG9zZ2lWZXJzLmdldFF1YWxpZmllcigpICE9IG51bGwgJiYgIW9zZ2lWZXJzLmdldFF1YWxpZmllcigpLnRyaW0oKS5lcXVhbHMoIiIpKSkgewotCQkJCXZlcnNpb25TdHJpbmcgPSAiWyIgKyBjdXJyQnVuZGxlLmdldFZlcnNpb24oKS50b1N0cmluZygpICsgIiwiICsgY3VyckJ1bmRsZS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKQotCQkJCQkJKyAiXSI7Ci0JCQl9CisgICAgICAgICAgICBTdHJpbmcgdmVyc2lvblN0cmluZyA9IG51bGw7CisgICAgICAgICAgICBPc2dpVmVyc2lvbiBvc2dpVmVycyA9IGN1cnJCdW5kbGUuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgaWYgKG9zZ2lWZXJzLmdldE1ham9yKCkgIT0gMCB8fCBvc2dpVmVycy5nZXRNaW5vcigpICE9IDAgfHwgb3NnaVZlcnMuZ2V0U2VydmljZSgpICE9IDAKKyAgICAgICAgICAgICAgICB8fCBvc2dpVmVycy5nZXRRdWFsaWZpZXIoKSAhPSBudWxsICYmICFvc2dpVmVycy5nZXRRdWFsaWZpZXIoKS50cmltKCkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIHZlcnNpb25TdHJpbmcgPSAiWyIgKyBjdXJyQnVuZGxlLmdldFZlcnNpb24oKS50b1N0cmluZygpICsgIiwiICsgY3VyckJ1bmRsZS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSArICJdIjsKKyAgICAgICAgICAgIH0KIAotCQkJaWYgKGltcG9ydEJ1bmRsZUhlYWRlci5oYXNFbGVtZW50KGN1cnJCdW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpKSB7Ci0JCQkJaW1wb3J0QnVuZGxlSGVhZGVyLnJlbW92ZUJ1bmRsZShjdXJyQnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCX0KLQkJCWltcG9ydEJ1bmRsZUhlYWRlci5hZGRCdW5kbGUoY3VyckJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgdmVyc2lvblN0cmluZyk7Ci0JCX0KLQl9CisgICAgICAgICAgICBpZiAoaW1wb3J0QnVuZGxlSGVhZGVyLmhhc0VsZW1lbnQoY3VyckJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBpbXBvcnRCdW5kbGVIZWFkZXIucmVtb3ZlQnVuZGxlKGN1cnJCdW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW1wb3J0QnVuZGxlSGVhZGVyLmFkZEJ1bmRsZShjdXJyQnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCB2ZXJzaW9uU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlbW92ZSgpIHsKLQkJT2JqZWN0W10gcmVtb3ZlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKTsKLQkJZm9yIChPYmplY3QgZWxlbWVudCA6IHJlbW92ZWQpIHsKLQkJCUltcG9ydEJ1bmRsZUhlYWRlciBoZWFkZXIgPSAoSW1wb3J0QnVuZGxlSGVhZGVyKSBnZXRCdW5kbGUoKS5nZXRNYW5pZmVzdEhlYWRlcigKLQkJCQkJSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfQlVORExFKTsKLQkJCWhlYWRlci5yZW1vdmVCdW5kbGUoKEltcG9ydEJ1bmRsZU9iamVjdCkgZWxlbWVudCk7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlKCkgeworICAgICAgICBPYmplY3RbXSByZW1vdmVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5mVmlld2VyLmdldFNlbGVjdGlvbigpKS50b0FycmF5KCk7CisgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiByZW1vdmVkKSB7CisgICAgICAgICAgICBJbXBvcnRCdW5kbGVIZWFkZXIgaGVhZGVyID0gKEltcG9ydEJ1bmRsZUhlYWRlcikgZ2V0QnVuZGxlKCkuZ2V0TWFuaWZlc3RIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfQlVORExFKTsKKyAgICAgICAgICAgIGhlYWRlci5yZW1vdmVCdW5kbGUoKEltcG9ydEJ1bmRsZU9iamVjdCkgZWxlbWVudCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGdldEFkZEluZGV4KCkgewotCQlyZXR1cm4gQUREX0lOREVYOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGdldEFkZEluZGV4KCkgeworICAgICAgICByZXR1cm4gQUREX0lOREVYOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0UmVtb3ZlSW5kZXgoKSB7Ci0JCXJldHVybiBSRU1PVkVfSU5ERVg7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgZ2V0UmVtb3ZlSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBSRU1PVkVfSU5ERVg7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBnZXRQcm9wZXJ0aWVzSW5kZXgoKSB7Ci0JCXJldHVybiBQUk9QRVJUSUVTX0lOREVYOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGdldFByb3BlcnRpZXNJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIFBST1BFUlRJRVNfSU5ERVg7CisgICAgfQogCi0JY2xhc3MgQnVuZGxlSW1wb3J0RGlhbG9nTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gUERFUGx1Z2luSW1hZ2VzLkRFU0NfQlVORExFX09CSi5jcmVhdGVJbWFnZSgpOwotCQl9CisgICAgY2xhc3MgQnVuZGxlSW1wb3J0RGlhbG9nTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCUJ1bmRsZUFydGVmYWN0IGJ1bmRsZUFydGlmYWN0ID0gKEJ1bmRsZUFydGVmYWN0KSBlbGVtZW50OwotCQkJU3RyaW5nIGxhYmVsID0gYnVuZGxlQXJ0aWZhY3QuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCQlpZiAobnVsbCAhPSBidW5kbGVBcnRpZmFjdC5nZXRWZXJzaW9uKCkpIHsKLQkJCQlsYWJlbCArPSAiICIgKyBidW5kbGVBcnRpZmFjdC5nZXRWZXJzaW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBQREVQbHVnaW5JbWFnZXMuREVTQ19CVU5ETEVfT0JKLmNyZWF0ZUltYWdlKCk7CisgICAgICAgIH0KIAotCWNsYXNzIEJ1bmRsZUltcG9ydExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25WaWV3ZXJMYWJlbFByb3ZpZGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworICAgICAgICAgICAgQnVuZGxlQXJ0ZWZhY3QgYnVuZGxlQXJ0aWZhY3QgPSAoQnVuZGxlQXJ0ZWZhY3QpIGVsZW1lbnQ7CisgICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBidW5kbGVBcnRpZmFjdC5nZXRTeW1ib2xpY05hbWUoKTsKKyAgICAgICAgICAgIGlmIChudWxsICE9IGJ1bmRsZUFydGlmYWN0LmdldFZlcnNpb24oKSkgeworICAgICAgICAgICAgICAgIGxhYmVsICs9ICIgIiArIGJ1bmRsZUFydGlmYWN0LmdldFZlcnNpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsYWJlbDsKKyAgICAgICAgfQorICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBQREVQbHVnaW5JbWFnZXMuREVTQ19CVU5ETEVfT0JKLmNyZWF0ZUltYWdlKCk7Ci0JCX0KKyAgICBjbGFzcyBCdW5kbGVJbXBvcnRMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uVmlld2VyTGFiZWxQcm92aWRlciB7CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlJbXBvcnRCdW5kbGVPYmplY3QgaW1wb3J0QnVuZGxlT2JqZWN0ID0gKEltcG9ydEJ1bmRsZU9iamVjdCkgZWxlbWVudDsKLQkJCVN0cmluZyBsYWJlbCA9IGltcG9ydEJ1bmRsZU9iamVjdC5nZXRWYWx1ZSgpOwotCQkJaWYgKG51bGwgIT0gaW1wb3J0QnVuZGxlT2JqZWN0LmdldFZlcnNpb24oKSkgewotCQkJCWxhYmVsICs9ICIgIiArIGltcG9ydEJ1bmRsZU9iamVjdC5nZXRWZXJzaW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIFBERVBsdWdpbkltYWdlcy5ERVNDX0JVTkRMRV9PQkouY3JlYXRlSW1hZ2UoKTsKKyAgICAgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkZXJDb25zdGFudCgpIHsKLQkJcmV0dXJuIElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRTsKLQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgSW1wb3J0QnVuZGxlT2JqZWN0IGltcG9ydEJ1bmRsZU9iamVjdCA9IChJbXBvcnRCdW5kbGVPYmplY3QpIGVsZW1lbnQ7CisgICAgICAgICAgICBTdHJpbmcgbGFiZWwgPSBpbXBvcnRCdW5kbGVPYmplY3QuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChudWxsICE9IGltcG9ydEJ1bmRsZU9iamVjdC5nZXRWZXJzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICBsYWJlbCArPSAiICIgKyBpbXBvcnRCdW5kbGVPYmplY3QuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxhYmVsOworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRW5hYmxlUHJvcGVydGllcyhPYmplY3RbXSBzZWxlY3RlZCkgewotCQlpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWFkZXJDb25zdGFudCgpIHsKKyAgICAgICAgcmV0dXJuIElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRTsKKyAgICB9CiAKLQkJU3RyaW5nIHZlcnNpb24gPSAoKEltcG9ydEJ1bmRsZU9iamVjdCkgc2VsZWN0ZWRbMF0pLmdldFZlcnNpb24oKTsKLQkJYm9vbGVhbiBvcHRpb25hbCA9ICgoSW1wb3J0QnVuZGxlT2JqZWN0KSBzZWxlY3RlZFswXSkuaXNPcHRpb25hbCgpOwotCQlmb3IgKGludCBpID0gMTsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlJbXBvcnRCdW5kbGVPYmplY3Qgb2JqZWN0ID0gKEltcG9ydEJ1bmRsZU9iamVjdCkgc2VsZWN0ZWRbaV07Ci0JCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdC5nZXRWZXJzaW9uKCkgIT0gbnVsbCB8fCAhKG9wdGlvbmFsID09IG9iamVjdC5pc09wdGlvbmFsKCkpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCF2ZXJzaW9uLmVxdWFscyhvYmplY3QuZ2V0VmVyc2lvbigpKSB8fCAhKG9wdGlvbmFsID09IG9iamVjdC5pc09wdGlvbmFsKCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRFbmFibGVQcm9wZXJ0aWVzKE9iamVjdFtdIHNlbGVjdGVkKSB7CisgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU9wZW5Qcm9wZXJ0aWVzKCkgewotCQlPYmplY3RbXSBzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKTsKLQkJSW1wb3J0QnVuZGxlT2JqZWN0IGZpcnN0ID0gKEltcG9ydEJ1bmRsZU9iamVjdCkgc2VsZWN0ZWRbMF07Ci0JCUJ1bmRsZURlcGVuZGVuY3lQcm9wZXJ0aWVzRGlhbG9nIGRpYWxvZyA9IG5ldyBCdW5kbGVEZXBlbmRlbmN5UHJvcGVydGllc0RpYWxvZyhpc0VkaXRhYmxlKCksIGZhbHNlLCBmYWxzZSwKLQkJCQlmaXJzdC5pc09wdGlvbmFsKCksIGZpcnN0LmdldFZlcnNpb24oKSwgdHJ1ZSwgdHJ1ZSk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJU1dUVXRpbC5zZXREaWFsb2dTaXplKGRpYWxvZywgNDAwLCAtMSk7Ci0JCWlmIChzZWxlY3RlZC5sZW5ndGggPT0gMSkgewotCQkJZGlhbG9nLnNldFRpdGxlKCgoSW1wb3J0QnVuZGxlT2JqZWN0KSBzZWxlY3RlZFswXSkuZ2V0VmFsdWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlkaWFsb2cuc2V0VGl0bGUoIlByb3BlcnRpZXMiKTsKLQkJfQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0sgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQlTdHJpbmcgbmV3VmVyc2lvbiA9IGRpYWxvZy5nZXRWZXJzaW9uKCk7Ci0JCQlib29sZWFuIG5ld09wdGlvbmFsID0gZGlhbG9nLmlzT3B0aW9uYWwoKTsKLQkJCWZvciAoT2JqZWN0IGVsZW1lbnQgOiBzZWxlY3RlZCkgewotCQkJCUltcG9ydEJ1bmRsZU9iamVjdCBvYmplY3QgPSAoSW1wb3J0QnVuZGxlT2JqZWN0KSBlbGVtZW50OwotCQkJCWlmICghbmV3VmVyc2lvbi5lcXVhbHMob2JqZWN0LmdldFZlcnNpb24oKSkpIHsKLQkJCQkJb2JqZWN0LnNldFZlcnNpb24obmV3VmVyc2lvbik7Ci0JCQkJfQotCQkJCWlmICghbmV3T3B0aW9uYWwgPT0gb2JqZWN0LmlzT3B0aW9uYWwoKSkgewotCQkJCQlvYmplY3Quc2V0T3B0aW9uYWwobmV3T3B0aW9uYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgICAgU3RyaW5nIHZlcnNpb24gPSAoKEltcG9ydEJ1bmRsZU9iamVjdCkgc2VsZWN0ZWRbMF0pLmdldFZlcnNpb24oKTsKKyAgICAgICAgYm9vbGVhbiBvcHRpb25hbCA9ICgoSW1wb3J0QnVuZGxlT2JqZWN0KSBzZWxlY3RlZFswXSkuaXNPcHRpb25hbCgpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBJbXBvcnRCdW5kbGVPYmplY3Qgb2JqZWN0ID0gKEltcG9ydEJ1bmRsZU9iamVjdCkgc2VsZWN0ZWRbaV07CisgICAgICAgICAgICBpZiAodmVyc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKG9iamVjdC5nZXRWZXJzaW9uKCkgIT0gbnVsbCB8fCAhKG9wdGlvbmFsID09IG9iamVjdC5pc09wdGlvbmFsKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCF2ZXJzaW9uLmVxdWFscyhvYmplY3QuZ2V0VmVyc2lvbigpKSB8fCAhKG9wdGlvbmFsID09IG9iamVjdC5pc09wdGlvbmFsKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblNlbGVjdGVkKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPT0gQUREX1JFTU9URV9CVU5ETEVfSU5ERVgpIHsKLQkJCWludGVybmFsSGFuZGxlQWRkKHRydWUpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuYnV0dG9uU2VsZWN0ZWQoaW5kZXgpOwotCQl9Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU9wZW5Qcm9wZXJ0aWVzKCkgeworICAgICAgICBPYmplY3RbXSBzZWxlY3RlZCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuZlZpZXdlci5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOworICAgICAgICBJbXBvcnRCdW5kbGVPYmplY3QgZmlyc3QgPSAoSW1wb3J0QnVuZGxlT2JqZWN0KSBzZWxlY3RlZFswXTsKKyAgICAgICAgQnVuZGxlRGVwZW5kZW5jeVByb3BlcnRpZXNEaWFsb2cgZGlhbG9nID0gbmV3IEJ1bmRsZURlcGVuZGVuY3lQcm9wZXJ0aWVzRGlhbG9nKGlzRWRpdGFibGUoKSwgZmFsc2UsIGZhbHNlLCBmaXJzdC5pc09wdGlvbmFsKCksCisgICAgICAgICAgICBmaXJzdC5nZXRWZXJzaW9uKCksIHRydWUsIHRydWUpOworICAgICAgICBkaWFsb2cuY3JlYXRlKCk7CisgICAgICAgIFNXVFV0aWwuc2V0RGlhbG9nU2l6ZShkaWFsb2csIDQwMCwgLTEpOworICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIGRpYWxvZy5zZXRUaXRsZSgoKEltcG9ydEJ1bmRsZU9iamVjdCkgc2VsZWN0ZWRbMF0pLmdldFZhbHVlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGlhbG9nLnNldFRpdGxlKCJQcm9wZXJ0aWVzIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LICYmIGlzRWRpdGFibGUoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5ld1ZlcnNpb24gPSBkaWFsb2cuZ2V0VmVyc2lvbigpOworICAgICAgICAgICAgYm9vbGVhbiBuZXdPcHRpb25hbCA9IGRpYWxvZy5pc09wdGlvbmFsKCk7CisgICAgICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogc2VsZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBJbXBvcnRCdW5kbGVPYmplY3Qgb2JqZWN0ID0gKEltcG9ydEJ1bmRsZU9iamVjdCkgZWxlbWVudDsKKyAgICAgICAgICAgICAgICBpZiAoIW5ld1ZlcnNpb24uZXF1YWxzKG9iamVjdC5nZXRWZXJzaW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIG9iamVjdC5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW5ld09wdGlvbmFsID09IG9iamVjdC5pc09wdGlvbmFsKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE9wdGlvbmFsKG5ld09wdGlvbmFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBidXR0b25TZWxlY3RlZChpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4ID09IEFERF9SRU1PVEVfQlVORExFX0lOREVYKSB7CisgICAgICAgICAgICBpbnRlcm5hbEhhbmRsZUFkZCh0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmJ1dHRvblNlbGVjdGVkKGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlTGlicmFyeVNlY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlTGlicmFyeVNlY3Rpb24uamF2YQppbmRleCBlOWU0MTBhLi42MTBmYzA5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZUxpYnJhcnlTZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVMaWJyYXJ5U2VjdGlvbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTc4LDY5NiArNzksNjkxIEBACiAKIC8qKgogICogQWRhcHRlZCBmcm9tIFBERSdzIDxjb2RlPkxpYnJhcnlTZWN0aW9uPC9jb2RlPi4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICovCiBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKIHB1YmxpYyBjbGFzcyBCdW5kbGVMaWJyYXJ5U2VjdGlvbiBleHRlbmRzIFRhYmxlU2VjdGlvbiBpbXBsZW1lbnRzIElNb2RlbENoYW5nZWRMaXN0ZW5lciwgSUJ1aWxkUHJvcGVydGllc0NvbnN0YW50cyB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVXX0lOREVYID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVXX0lOREVYID0gMDsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfSU5ERVggPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERfSU5ERVggPSAxOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9JTkRFWCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9JTkRFWCA9IDI7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVBfSU5ERVggPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUF9JTkRFWCA9IDM7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRE9XTl9JTkRFWCA9IDQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERPV05fSU5ERVggPSA0OwogCi0JcHJpdmF0ZSBBY3Rpb24gZlJlbmFtZUFjdGlvbjsKKyAgICBwcml2YXRlIEFjdGlvbiBmUmVuYW1lQWN0aW9uOwogCi0JcHJpdmF0ZSBBY3Rpb24gZlJlbW92ZUFjdGlvbjsKKyAgICBwcml2YXRlIEFjdGlvbiBmUmVtb3ZlQWN0aW9uOwogCi0JcHJpdmF0ZSBBY3Rpb24gZk5ld0FjdGlvbjsKKyAgICBwcml2YXRlIEFjdGlvbiBmTmV3QWN0aW9uOwogCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmTGlicmFyeVRhYmxlOworICAgIHByaXZhdGUgVGFibGVWaWV3ZXIgZkxpYnJhcnlUYWJsZTsKIAotCWNsYXNzIExpYnJhcnlGaWx0ZXIgZXh0ZW5kcyBKQVJGaWxlRmlsdGVyIHsKKyAgICBjbGFzcyBMaWJyYXJ5RmlsdGVyIGV4dGVuZHMgSkFSRmlsZUZpbHRlciB7CiAKLQkJcHVibGljIExpYnJhcnlGaWx0ZXIoSGFzaFNldCBzZXQpIHsKLQkJCXN1cGVyKHNldCk7Ci0JCX0KKyAgICAgICAgcHVibGljIExpYnJhcnlGaWx0ZXIoSGFzaFNldCBzZXQpIHsKKyAgICAgICAgICAgIHN1cGVyKHNldCk7CisgICAgICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQlyZXR1cm4gaXNQYXRoVmFsaWQoKChJRm9sZGVyKSBlbGVtZW50KS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQkJfQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCXJldHVybiBpc0ZpbGVWYWxpZCgoKElGaWxlKSBlbGVtZW50KS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7CisgICAgICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXNQYXRoVmFsaWQoKChJRm9sZGVyKSBlbGVtZW50KS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpc0ZpbGVWYWxpZCgoKElGaWxlKSBlbGVtZW50KS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogCi0JY2xhc3MgTGlicmFyeVNlbGVjdGlvblZhbGlkYXRvciBleHRlbmRzIEphclNlbGVjdGlvblZhbGlkYXRvciB7CisgICAgY2xhc3MgTGlicmFyeVNlbGVjdGlvblZhbGlkYXRvciBleHRlbmRzIEphclNlbGVjdGlvblZhbGlkYXRvciB7CiAKLQkJcHVibGljIExpYnJhcnlTZWxlY3Rpb25WYWxpZGF0b3IoQ2xhc3NbXSBhY2NlcHRlZFR5cGVzLCBib29sZWFuIGFsbG93TXVsdGlwbGVTZWxlY3Rpb24pIHsKLQkJCXN1cGVyKGFjY2VwdGVkVHlwZXMsIGFsbG93TXVsdGlwbGVTZWxlY3Rpb24pOwotCQl9CisgICAgICAgIHB1YmxpYyBMaWJyYXJ5U2VsZWN0aW9uVmFsaWRhdG9yKENsYXNzW10gYWNjZXB0ZWRUeXBlcywgYm9vbGVhbiBhbGxvd011bHRpcGxlU2VsZWN0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihhY2NlcHRlZFR5cGVzLCBhbGxvd011bHRpcGxlU2VsZWN0aW9uKTsKKyAgICAgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBJRm9sZGVyKSA/IHRydWUgOiBzdXBlci5pc1ZhbGlkKGVsZW1lbnQpOwotCQl9Ci0JfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChPYmplY3QgZWxlbWVudCkgeworICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBJRm9sZGVyID8gdHJ1ZSA6IHN1cGVyLmlzVmFsaWQoZWxlbWVudCk7CisgICAgICAgIH0KKyAgICB9CiAKLQljbGFzcyBUYWJsZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0JCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRQbHVnaW5CYXNlKCkuZ2V0TGlicmFyaWVzKCk7Ci0JCX0KLQl9CisgICAgY2xhc3MgVGFibGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewogCi0JcHVibGljIEJ1bmRsZUxpYnJhcnlTZWN0aW9uKFBERUZvcm1QYWdlIHBhZ2UsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFnZSwgcGFyZW50LCBTZWN0aW9uLkRFU0NSSVBUSU9OLCBuZXcgU3RyaW5nW10geyBQREVVSU1lc3NhZ2VzLk5ld01hbmlmZXN0RWRpdG9yX0xpYnJhcnlTZWN0aW9uX25ldywKLQkJCQlQREVVSU1lc3NhZ2VzLk5ld01hbmlmZXN0RWRpdG9yX0xpYnJhcnlTZWN0aW9uX2FkZCwKLQkJCQlQREVVSU1lc3NhZ2VzLk5ld01hbmlmZXN0RWRpdG9yX0xpYnJhcnlTZWN0aW9uX3JlbW92ZSwgUERFVUlNZXNzYWdlcy5NYW5pZmVzdEVkaXRvcl9MaWJyYXJ5U2VjdGlvbl91cCwKLQkJCQlQREVVSU1lc3NhZ2VzLk1hbmlmZXN0RWRpdG9yX0xpYnJhcnlTZWN0aW9uX2Rvd24gfSk7Ci0JfQorICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgeworICAgICAgICAgICAgcmV0dXJuIGdldE1vZGVsKCkuZ2V0UGx1Z2luQmFzZSgpLmdldExpYnJhcmllcygpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIlNwZWNpZnkgdGhlIGxpYnJhcmllcyBhbmQgZm9sZGVycyB0aGF0IGNvbnN0aXR1dGUgdGhlIGJ1bmRsZSBjbGFzc3BhdGguICIKLQkJCQkrICJJZiB1bnNwZWNpZmllZCwgdGhlIGNsYXNzZXMgYW5kIHJlc291cmNlcyBhcmUgYXNzdW1lZCB0byBiZSBhdCB0aGUgcm9vdCBvZiB0aGUgYnVuZGxlLiI7Ci0JfQorICAgIHB1YmxpYyBCdW5kbGVMaWJyYXJ5U2VjdGlvbihQREVGb3JtUGFnZSBwYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIHN1cGVyKHBhZ2UsIHBhcmVudCwgU2VjdGlvbi5ERVNDUklQVElPTiwKKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFBERVVJTWVzc2FnZXMuTmV3TWFuaWZlc3RFZGl0b3JfTGlicmFyeVNlY3Rpb25fbmV3LCBQREVVSU1lc3NhZ2VzLk5ld01hbmlmZXN0RWRpdG9yX0xpYnJhcnlTZWN0aW9uX2FkZCwKKyAgICAgICAgICAgICAgICBQREVVSU1lc3NhZ2VzLk5ld01hbmlmZXN0RWRpdG9yX0xpYnJhcnlTZWN0aW9uX3JlbW92ZSwgUERFVUlNZXNzYWdlcy5NYW5pZmVzdEVkaXRvcl9MaWJyYXJ5U2VjdGlvbl91cCwKKyAgICAgICAgICAgICAgICBQREVVSU1lc3NhZ2VzLk1hbmlmZXN0RWRpdG9yX0xpYnJhcnlTZWN0aW9uX2Rvd24gfSk7CisgICAgfQogCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNCdW5kbGUoKSB7Ci0JCXJldHVybiBnZXRCdW5kbGVDb250ZXh0KCkgIT0gbnVsbDsKLQl9CisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gIlNwZWNpZnkgdGhlIGxpYnJhcmllcyBhbmQgZm9sZGVycyB0aGF0IGNvbnN0aXR1dGUgdGhlIGJ1bmRsZSBjbGFzc3BhdGguICIKKyAgICAgICAgICAgICsgIklmIHVuc3BlY2lmaWVkLCB0aGUgY2xhc3NlcyBhbmQgcmVzb3VyY2VzIGFyZSBhc3N1bWVkIHRvIGJlIGF0IHRoZSByb290IG9mIHRoZSBidW5kbGUuIjsKKyAgICB9CiAKLQlwcml2YXRlIEJ1bmRsZUlucHV0Q29udGV4dCBnZXRCdW5kbGVDb250ZXh0KCkgewotCQlJbnB1dENvbnRleHRNYW5hZ2VyIG1hbmFnZXIgPSBnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuZ2V0Q29udGV4dE1hbmFnZXIoKTsKLQkJcmV0dXJuIChCdW5kbGVJbnB1dENvbnRleHQpIG1hbmFnZXIuZmluZENvbnRleHQoQnVuZGxlSW5wdXRDb250ZXh0LkNPTlRFWFRfSUQpOwotCX0KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0J1bmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldEJ1bmRsZUNvbnRleHQoKSAhPSBudWxsOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNsaWVudChTZWN0aW9uIHNlY3Rpb24sIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc2VjdGlvbi5zZXRUZXh0KFBERVVJTWVzc2FnZXMuTWFuaWZlc3RFZGl0b3JfTGlicmFyeVNlY3Rpb25fdGl0bGUpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKGdldFNlY3Rpb25EZXNjcmlwdGlvbigpKTsKKyAgICBwcml2YXRlIEJ1bmRsZUlucHV0Q29udGV4dCBnZXRCdW5kbGVDb250ZXh0KCkgeworICAgICAgICBJbnB1dENvbnRleHRNYW5hZ2VyIG1hbmFnZXIgPSBnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuZ2V0Q29udGV4dE1hbmFnZXIoKTsKKyAgICAgICAgcmV0dXJuIChCdW5kbGVJbnB1dENvbnRleHQpIG1hbmFnZXIuZmluZENvbnRleHQoQnVuZGxlSW5wdXRDb250ZXh0LkNPTlRFWFRfSUQpOworICAgIH0KIAotCQlDb21wb3NpdGUgY29udGFpbmVyID0gY3JlYXRlQ2xpZW50Q29udGFpbmVyKHNlY3Rpb24sIDIsIHRvb2xraXQpOwotCQlFZGl0YWJsZVRhYmxlUGFydCB0YWJsZVBhcnQgPSBnZXRUYWJsZVBhcnQoKTsKLQkJdGFibGVQYXJ0LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY3JlYXRlQ2xpZW50KFNlY3Rpb24gc2VjdGlvbiwgRm9ybVRvb2xraXQgdG9vbGtpdCkgeworICAgICAgICBzZWN0aW9uLnNldFRleHQoUERFVUlNZXNzYWdlcy5NYW5pZmVzdEVkaXRvcl9MaWJyYXJ5U2VjdGlvbl90aXRsZSk7CisgICAgICAgIHNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkpOwogCi0JCWNyZWF0ZVZpZXdlclBhcnRDb250cm9sKGNvbnRhaW5lciwgU1dULk1VTFRJLCAyLCB0b29sa2l0KTsKLQkJZkxpYnJhcnlUYWJsZSA9IHRhYmxlUGFydC5nZXRUYWJsZVZpZXdlcigpOwotCQlmTGlicmFyeVRhYmxlLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWZMaWJyYXJ5VGFibGUuc2V0TGFiZWxQcm92aWRlcihQREVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKSk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNvbnRhaW5lcik7CisgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIgPSBjcmVhdGVDbGllbnRDb250YWluZXIoc2VjdGlvbiwgMiwgdG9vbGtpdCk7CisgICAgICAgIEVkaXRhYmxlVGFibGVQYXJ0IHRhYmxlUGFydCA9IGdldFRhYmxlUGFydCgpOworICAgICAgICB0YWJsZVBhcnQuc2V0RWRpdGFibGUoaXNFZGl0YWJsZSgpKTsKIAotCQltYWtlQWN0aW9ucygpOwotCQl1cGRhdGVCdXR0b25zKCk7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZUNsZWFyR3JpZExheW91dChmYWxzZSwgMSkpOwotCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlzZWN0aW9uLnNldENsaWVudChjb250YWluZXIpOworICAgICAgICBjcmVhdGVWaWV3ZXJQYXJ0Q29udHJvbChjb250YWluZXIsIFNXVC5NVUxUSSwgMiwgdG9vbGtpdCk7CisgICAgICAgIHRoaXMuZkxpYnJhcnlUYWJsZSA9IHRhYmxlUGFydC5nZXRUYWJsZVZpZXdlcigpOworICAgICAgICB0aGlzLmZMaWJyYXJ5VGFibGUuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKKyAgICAgICAgdGhpcy5mTGlicmFyeVRhYmxlLnNldExhYmVsUHJvdmlkZXIoUERFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkpOworICAgICAgICB0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb250YWluZXIpOwogCi0JCUlQbHVnaW5Nb2RlbEJhc2UgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlmTGlicmFyeVRhYmxlLnNldElucHV0KG1vZGVsLmdldFBsdWdpbkJhc2UoKSk7Ci0JCW1vZGVsLmFkZE1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KKyAgICAgICAgbWFrZUFjdGlvbnMoKTsKKyAgICAgICAgdXBkYXRlQnV0dG9ucygpOworICAgICAgICBzZWN0aW9uLnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVDbGVhckdyaWRMYXlvdXQoZmFsc2UsIDEpKTsKKyAgICAgICAgc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKyAgICAgICAgc2VjdGlvbi5zZXRDbGllbnQoY29udGFpbmVyKTsKIAotCXByaXZhdGUgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQlUYWJsZSB0YWJsZSA9IGZMaWJyYXJ5VGFibGUuZ2V0VGFibGUoKTsKLQkJYm9vbGVhbiBoYXNTZWxlY3Rpb24gPSB0YWJsZS5nZXRTZWxlY3Rpb24oKS5sZW5ndGggPiAwOwotCQlib29sZWFuIHNpbmdsZVNlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbigpLmxlbmd0aCA9PSAxOwotCQlpbnQgY291bnQgPSB0YWJsZS5nZXRJdGVtQ291bnQoKTsKLQkJaW50IGluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJYm9vbGVhbiBjYW5Nb3ZlVXAgPSBzaW5nbGVTZWxlY3Rpb24gJiYgaW5kZXggPiAwOwotCQlib29sZWFuIGNhbk1vdmVEb3duID0gc2luZ2xlU2VsZWN0aW9uICYmIGluZGV4IDwgY291bnQgLSAxOworICAgICAgICBJUGx1Z2luTW9kZWxCYXNlIG1vZGVsID0gZ2V0TW9kZWwoKTsKKyAgICAgICAgdGhpcy5mTGlicmFyeVRhYmxlLnNldElucHV0KG1vZGVsLmdldFBsdWdpbkJhc2UoKSk7CisgICAgICAgIG1vZGVsLmFkZE1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworICAgIH0KIAotCQlUYWJsZVBhcnQgdGFibGVQYXJ0ID0gZ2V0VGFibGVQYXJ0KCk7Ci0JCXRhYmxlUGFydC5zZXRCdXR0b25FbmFibGVkKEFERF9JTkRFWCwgaXNFZGl0YWJsZSgpKTsKLQkJdGFibGVQYXJ0LnNldEJ1dHRvbkVuYWJsZWQoTkVXX0lOREVYLCBpc0VkaXRhYmxlKCkpOwotCQl0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZChSRU1PVkVfSU5ERVgsIGlzRWRpdGFibGUoKSAmJiBoYXNTZWxlY3Rpb24pOwotCQl0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZChVUF9JTkRFWCwgaXNFZGl0YWJsZSgpICYmIGNhbk1vdmVVcCk7Ci0JCXRhYmxlUGFydC5zZXRCdXR0b25FbmFibGVkKERPV05fSU5ERVgsIGlzRWRpdGFibGUoKSAmJiBjYW5Nb3ZlRG93bik7Ci0JfQorICAgIHByaXZhdGUgdm9pZCB1cGRhdGVCdXR0b25zKCkgeworICAgICAgICBUYWJsZSB0YWJsZSA9IHRoaXMuZkxpYnJhcnlUYWJsZS5nZXRUYWJsZSgpOworICAgICAgICBib29sZWFuIGhhc1NlbGVjdGlvbiA9IHRhYmxlLmdldFNlbGVjdGlvbigpLmxlbmd0aCA+IDA7CisgICAgICAgIGJvb2xlYW4gc2luZ2xlU2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uKCkubGVuZ3RoID09IDE7CisgICAgICAgIGludCBjb3VudCA9IHRhYmxlLmdldEl0ZW1Db3VudCgpOworICAgICAgICBpbnQgaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOworICAgICAgICBib29sZWFuIGNhbk1vdmVVcCA9IHNpbmdsZVNlbGVjdGlvbiAmJiBpbmRleCA+IDA7CisgICAgICAgIGJvb2xlYW4gY2FuTW92ZURvd24gPSBzaW5nbGVTZWxlY3Rpb24gJiYgaW5kZXggPCBjb3VudCAtIDE7CiAKLQlwcml2YXRlIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0JCWZOZXdBY3Rpb24gPSBuZXcgQWN0aW9uKFBERVVJTWVzc2FnZXMuTWFuaWZlc3RFZGl0b3JfTGlicmFyeVNlY3Rpb25fbmV3TGlicmFyeSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaGFuZGxlTmV3KCk7Ci0JCQl9Ci0JCX07Ci0JCWZOZXdBY3Rpb24uc2V0RW5hYmxlZChpc0VkaXRhYmxlKCkpOworICAgICAgICBUYWJsZVBhcnQgdGFibGVQYXJ0ID0gZ2V0VGFibGVQYXJ0KCk7CisgICAgICAgIHRhYmxlUGFydC5zZXRCdXR0b25FbmFibGVkKEFERF9JTkRFWCwgaXNFZGl0YWJsZSgpKTsKKyAgICAgICAgdGFibGVQYXJ0LnNldEJ1dHRvbkVuYWJsZWQoTkVXX0lOREVYLCBpc0VkaXRhYmxlKCkpOworICAgICAgICB0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZChSRU1PVkVfSU5ERVgsIGlzRWRpdGFibGUoKSAmJiBoYXNTZWxlY3Rpb24pOworICAgICAgICB0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZChVUF9JTkRFWCwgaXNFZGl0YWJsZSgpICYmIGNhbk1vdmVVcCk7CisgICAgICAgIHRhYmxlUGFydC5zZXRCdXR0b25FbmFibGVkKERPV05fSU5ERVgsIGlzRWRpdGFibGUoKSAmJiBjYW5Nb3ZlRG93bik7CisgICAgfQogCi0JCWZSZW5hbWVBY3Rpb24gPSBuZXcgQWN0aW9uKFBERVVJTWVzc2FnZXMuRWRpdGFibGVUYWJsZVBhcnRfcmVuYW1lQWN0aW9uKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRSZW5hbWVBY3Rpb24oKS5ydW4oKTsKLQkJCX0KLQkJfTsKLQkJZlJlbmFtZUFjdGlvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUoKSk7CisgICAgcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgeworICAgICAgICB0aGlzLmZOZXdBY3Rpb24gPSBuZXcgQWN0aW9uKFBERVVJTWVzc2FnZXMuTWFuaWZlc3RFZGl0b3JfTGlicmFyeVNlY3Rpb25fbmV3TGlicmFyeSkgewogCi0JCWZSZW1vdmVBY3Rpb24gPSBuZXcgQWN0aW9uKFBERVVJTWVzc2FnZXMuTmV3TWFuaWZlc3RFZGl0b3JfTGlicmFyeVNlY3Rpb25fcmVtb3ZlKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQloYW5kbGVSZW1vdmUoKTsKLQkJCX0KLQkJfTsKLQkJZlJlbW92ZUFjdGlvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUoKSk7Ci0JfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlTmV3KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHRoaXMuZk5ld0FjdGlvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUoKSk7CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCWlmIChnZXRQYWdlKCkuZ2V0TW9kZWwoKS5pc0VkaXRhYmxlKCkpIHsKLQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJfQotCX0KKyAgICAgICAgdGhpcy5mUmVuYW1lQWN0aW9uID0gbmV3IEFjdGlvbihQREVVSU1lc3NhZ2VzLkVkaXRhYmxlVGFibGVQYXJ0X3JlbmFtZUFjdGlvbikgewogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uU2VsZWN0ZWQoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJY2FzZSBORVdfSU5ERVg6Ci0JCQloYW5kbGVOZXcoKTsKLQkJCWJyZWFrOwotCQljYXNlIEFERF9JTkRFWDoKLQkJCWhhbmRsZUFkZCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkVNT1ZFX0lOREVYOgotCQkJaGFuZGxlUmVtb3ZlKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBVUF9JTkRFWDoKLQkJCWhhbmRsZVVwKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBET1dOX0lOREVYOgotCQkJaGFuZGxlRG93bigpOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBnZXRSZW5hbWVBY3Rpb24oKS5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdGhpcy5mUmVuYW1lQWN0aW9uLnNldEVuYWJsZWQoaXNFZGl0YWJsZSgpKTsKIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUlQbHVnaW5Nb2RlbEJhc2UgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJbW9kZWwucmVtb3ZlTW9kZWxDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KKyAgICAgICAgdGhpcy5mUmVtb3ZlQWN0aW9uID0gbmV3IEFjdGlvbihQREVVSU1lc3NhZ2VzLk5ld01hbmlmZXN0RWRpdG9yX0xpYnJhcnlTZWN0aW9uX3JlbW92ZSkgewogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZQotCSAqIG9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC51aS5lZGl0b3IuUERFU2VjdGlvbiNkb0dsb2JhbEFjdGlvbihqYXZhLmxhbmcKLQkgKiAuU3RyaW5nKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGRvR2xvYmFsQWN0aW9uKFN0cmluZyBhY3Rpb25JZCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlUmVtb3ZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHRoaXMuZlJlbW92ZUFjdGlvbi5zZXRFbmFibGVkKGlzRWRpdGFibGUoKSk7CisgICAgfQogCi0JCWlmICghaXNFZGl0YWJsZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworICAgICAgICBnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7CisgICAgICAgIGlmIChnZXRQYWdlKCkuZ2V0TW9kZWwoKS5pc0VkaXRhYmxlKCkpIHsKKyAgICAgICAgICAgIHVwZGF0ZUJ1dHRvbnMoKTsKKyAgICAgICAgfQorICAgIH0KIAotCQlpZiAoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKSB7Ci0JCQloYW5kbGVSZW1vdmUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhY3Rpb25JZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSkpIHsKLQkJCS8vIGRlbGV0ZSBoZXJlIGFuZCBsZXQgdGhlIGVkaXRvciB0cmFuc2ZlcgotCQkJLy8gdGhlIHNlbGVjdGlvbiB0byB0aGUgY2xpcGJvYXJkCi0JCQloYW5kbGVSZW1vdmUoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSkpIHsKLQkJCWRvUGFzdGUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uU2VsZWN0ZWQoaW50IGluZGV4KSB7CisgICAgICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgICAgIGNhc2UgTkVXX0lOREVYOgorICAgICAgICAgICAgICAgIGhhbmRsZU5ldygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBRERfSU5ERVg6CisgICAgICAgICAgICAgICAgaGFuZGxlQWRkKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJFTU9WRV9JTkRFWDoKKyAgICAgICAgICAgICAgICBoYW5kbGVSZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVVBfSU5ERVg6CisgICAgICAgICAgICAgICAgaGFuZGxlVXAoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRE9XTl9JTkRFWDoKKyAgICAgICAgICAgICAgICBoYW5kbGVEb3duKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBzZXRGb3JtSW5wdXQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVBsdWdpbkxpYnJhcnkpIHsKLQkJCWZMaWJyYXJ5VGFibGUuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iamVjdCksIHRydWUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICBJUGx1Z2luTW9kZWxCYXNlIG1vZGVsID0gZ2V0TW9kZWwoKTsKKyAgICAgICAgaWYgKG1vZGVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1vZGVsLnJlbW92ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLmRpc3Bvc2UoKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoZk5ld0FjdGlvbik7Ci0JCWlmICghZkxpYnJhcnlUYWJsZS5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltYW5hZ2VyLmFkZChmUmVuYW1lQWN0aW9uKTsKLQkJCW1hbmFnZXIuYWRkKGZSZW1vdmVBY3Rpb24pOwotCQl9Ci0JCS8vIENvcHksIGN1dCwgYW5kIHBhc3RlIG9wZXJhdGlvbnMgbm90IHN1cHBvcnRlZCBmb3IgcGx1Zy1pbnMgdGhhdCBkbwotCQkvLyBub3QgaGF2ZSBhIE1BTklGRVNULk1GIChub3QgYSBCdW5kbGUpCi0JCWdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS5nZXRDb250cmlidXRvcigpLmNvbnRleHRNZW51QWJvdXRUb1Nob3cobWFuYWdlciwgaXNCdW5kbGUoKSk7Ci0JfQorICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwudWkuZWRpdG9yLlBERVNlY3Rpb24jZG9HbG9iYWxBY3Rpb24oamF2YS5sYW5nIC5TdHJpbmcpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZG9HbG9iYWxBY3Rpb24oU3RyaW5nIGFjdGlvbklkKSB7CiAKLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlKCkgewotCQlPYmplY3RbXSBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmTGlicmFyeVRhYmxlLmdldFNlbGVjdGlvbigpKS50b0FycmF5KCk7Ci0JCWludCBpbmRleCA9IGZMaWJyYXJ5VGFibGUuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpbnRbXSBpbmRpY2VzID0gZkxpYnJhcnlUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGljZXMoKTsKLQkJZm9yIChpbnQgZWxlbWVudCA6IGluZGljZXMpIHsKLQkJCWlmIChlbGVtZW50IDwgaW5kZXgpIHsKLQkJCQlpbmRleCA9IGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKCFpc0VkaXRhYmxlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogCi0JCVN0cmluZ1tdIHJlbW92ZSA9IG5ldyBTdHJpbmdbc2VsZWN0aW9uLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2VsZWN0aW9uW2ldICE9IG51bGwgJiYgc2VsZWN0aW9uW2ldIGluc3RhbmNlb2YgSVBsdWdpbkxpYnJhcnkpIHsKLQkJCQlJUGx1Z2luTGlicmFyeSBlcCA9IChJUGx1Z2luTGlicmFyeSkgc2VsZWN0aW9uW2ldOwotCQkJCUlQbHVnaW5CYXNlIHBsdWdpbiA9IGVwLmdldFBsdWdpbkJhc2UoKTsKLQkJCQl0cnkgewotCQkJCQlwbHVnaW4ucmVtb3ZlKGVwKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJUERFUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQkJcmVtb3ZlW2ldID0gZXAuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCXVwZGF0ZUJ1aWxkUHJvcGVydGllcyhyZW1vdmUsIG5ldyBTdHJpbmdbcmVtb3ZlLmxlbmd0aF0sIHRydWUpOwotCQl1cGRhdGVKYXZhQ2xhc3NwYXRoTGlicyhyZW1vdmUsIG5ldyBTdHJpbmdbcmVtb3ZlLmxlbmd0aF0pOworICAgICAgICBpZiAoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpKSB7CisgICAgICAgICAgICBoYW5kbGVSZW1vdmUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChhY3Rpb25JZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgIC8vIGRlbGV0ZSBoZXJlIGFuZCBsZXQgdGhlIGVkaXRvciB0cmFuc2ZlcgorICAgICAgICAgICAgLy8gdGhlIHNlbGVjdGlvbiB0byB0aGUgY2xpcGJvYXJkCisgICAgICAgICAgICBoYW5kbGVSZW1vdmUoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aW9uSWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgIGRvUGFzdGUoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLQkJaW50IGl0ZW1Db3VudCA9IGZMaWJyYXJ5VGFibGUuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKTsKLQkJaWYgKGl0ZW1Db3VudCA+IDApIHsKLQkJCWlmIChpbmRleCA+PSBpdGVtQ291bnQpIHsKLQkJCQlpbmRleCA9IGl0ZW1Db3VudCAtIDE7Ci0JCQl9Ci0JCQlmTGlicmFyeVRhYmxlLmdldFRhYmxlKCkuc2V0U2VsZWN0aW9uKGluZGV4KTsKLQkJCWZMaWJyYXJ5VGFibGUuZ2V0VGFibGUoKS5zZXRGb2N1cygpOwotCQl9Ci0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc2V0Rm9ybUlucHV0KE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElQbHVnaW5MaWJyYXJ5KSB7CisgICAgICAgICAgICB0aGlzLmZMaWJyYXJ5VGFibGUuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG9iamVjdCksIHRydWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCXByaXZhdGUgdm9pZCBoYW5kbGVEb3duKCkgewotCQlUYWJsZSB0YWJsZSA9IGdldFRhYmxlUGFydCgpLmdldFRhYmxlVmlld2VyKCkuZ2V0VGFibGUoKTsKLQkJaW50IGluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ICE9IHRhYmxlLmdldEl0ZW1Db3VudCgpIC0gMSkgewotCQkJc3dhcChpbmRleCwgaW5kZXggKyAxKTsKLQkJfQotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgbWFuYWdlci5hZGQodGhpcy5mTmV3QWN0aW9uKTsKKyAgICAgICAgaWYgKCF0aGlzLmZMaWJyYXJ5VGFibGUuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOworICAgICAgICAgICAgbWFuYWdlci5hZGQodGhpcy5mUmVuYW1lQWN0aW9uKTsKKyAgICAgICAgICAgIG1hbmFnZXIuYWRkKHRoaXMuZlJlbW92ZUFjdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29weSwgY3V0LCBhbmQgcGFzdGUgb3BlcmF0aW9ucyBub3Qgc3VwcG9ydGVkIGZvciBwbHVnLWlucyB0aGF0IGRvCisgICAgICAgIC8vIG5vdCBoYXZlIGEgTUFOSUZFU1QuTUYgKG5vdCBhIEJ1bmRsZSkKKyAgICAgICAgZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLmdldENvbnRyaWJ1dG9yKCkuY29udGV4dE1lbnVBYm91dFRvU2hvdyhtYW5hZ2VyLCBpc0J1bmRsZSgpKTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgaGFuZGxlVXAoKSB7Ci0JCWludCBpbmRleCA9IGdldFRhYmxlUGFydCgpLmdldFRhYmxlVmlld2VyKCkuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPj0gMSkgewotCQkJc3dhcChpbmRleCwgaW5kZXggLSAxKTsKLQkJfQotCX0KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlKCkgeworICAgICAgICBPYmplY3RbXSBzZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmZMaWJyYXJ5VGFibGUuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKTsKKyAgICAgICAgaW50IGluZGV4ID0gdGhpcy5mTGlicmFyeVRhYmxlLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKKyAgICAgICAgaW50W10gaW5kaWNlcyA9IHRoaXMuZkxpYnJhcnlUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGljZXMoKTsKKyAgICAgICAgZm9yIChpbnQgZWxlbWVudCA6IGluZGljZXMpIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50IDwgaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IGVsZW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCXB1YmxpYyB2b2lkIHN3YXAoaW50IGluZGV4MSwgaW50IGluZGV4MikgewotCQlUYWJsZSB0YWJsZSA9IGdldFRhYmxlUGFydCgpLmdldFRhYmxlVmlld2VyKCkuZ2V0VGFibGUoKTsKLQkJSVBsdWdpbkxpYnJhcnkgbDEgPSAoSVBsdWdpbkxpYnJhcnkpIHRhYmxlLmdldEl0ZW0oaW5kZXgxKS5nZXREYXRhKCk7Ci0JCUlQbHVnaW5MaWJyYXJ5IGwyID0gKElQbHVnaW5MaWJyYXJ5KSB0YWJsZS5nZXRJdGVtKGluZGV4MikuZ2V0RGF0YSgpOworICAgICAgICBTdHJpbmdbXSByZW1vdmUgPSBuZXcgU3RyaW5nW3NlbGVjdGlvbi5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKHNlbGVjdGlvbltpXSAhPSBudWxsICYmIHNlbGVjdGlvbltpXSBpbnN0YW5jZW9mIElQbHVnaW5MaWJyYXJ5KSB7CisgICAgICAgICAgICAgICAgSVBsdWdpbkxpYnJhcnkgZXAgPSAoSVBsdWdpbkxpYnJhcnkpIHNlbGVjdGlvbltpXTsKKyAgICAgICAgICAgICAgICBJUGx1Z2luQmFzZSBwbHVnaW4gPSBlcC5nZXRQbHVnaW5CYXNlKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcGx1Z2luLnJlbW92ZShlcCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFBERVBsdWdpbi5sb2dFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbW92ZVtpXSA9IGVwLmdldE5hbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1cGRhdGVCdWlsZFByb3BlcnRpZXMocmVtb3ZlLCBuZXcgU3RyaW5nW3JlbW92ZS5sZW5ndGhdLCB0cnVlKTsKKyAgICAgICAgdXBkYXRlSmF2YUNsYXNzcGF0aExpYnMocmVtb3ZlLCBuZXcgU3RyaW5nW3JlbW92ZS5sZW5ndGhdKTsKIAotCQl0cnkgewotCQkJSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCQlJUGx1Z2luQmFzZSBwbHVnaW5CYXNlID0gbW9kZWwuZ2V0UGx1Z2luQmFzZSgpOwotCQkJcGx1Z2luQmFzZS5zd2FwKGwxLCBsMik7Ci0JCQlyZWZyZXNoKCk7Ci0JCQl0YWJsZS5zZXRTZWxlY3Rpb24oaW5kZXgyKTsKLQkJCXRhYmxlLnNldEZvY3VzKCk7Ci0JCQl1cGRhdGVCdXR0b25zKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJUERFUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KKyAgICAgICAgaW50IGl0ZW1Db3VudCA9IHRoaXMuZkxpYnJhcnlUYWJsZS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpOworICAgICAgICBpZiAoaXRlbUNvdW50ID4gMCkgeworICAgICAgICAgICAgaWYgKGluZGV4ID49IGl0ZW1Db3VudCkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gaXRlbUNvdW50IC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuZkxpYnJhcnlUYWJsZS5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbihpbmRleCk7CisgICAgICAgICAgICB0aGlzLmZMaWJyYXJ5VGFibGUuZ2V0VGFibGUoKS5zZXRGb2N1cygpOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZUJ1dHRvbnMoKTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgaGFuZGxlTmV3KCkgewotCQlJUGx1Z2luTW9kZWxCYXNlIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJTmV3UnVudGltZUxpYnJhcnlEaWFsb2cgZGlhbG9nID0gbmV3IE5ld1J1bnRpbWVMaWJyYXJ5RGlhbG9nKGdldFBhZ2UoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwKLQkJCQltb2RlbC5nZXRQbHVnaW5CYXNlKCkuZ2V0TGlicmFyaWVzKCkpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoUERFVUlNZXNzYWdlcy5NYW5pZmVzdEVkaXRvcl9MaWJyYXJ5U2VjdGlvbl9uZXdMaWJyYXJ5RW50cnkpOwotCQlTV1RVdGlsLnNldERpYWxvZ1NpemUoZGlhbG9nLCAyNTAsIDE3NSk7CisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURvd24oKSB7CisgICAgICAgIFRhYmxlIHRhYmxlID0gZ2V0VGFibGVQYXJ0KCkuZ2V0VGFibGVWaWV3ZXIoKS5nZXRUYWJsZSgpOworICAgICAgICBpbnQgaW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOworICAgICAgICBpZiAoaW5kZXggIT0gdGFibGUuZ2V0SXRlbUNvdW50KCkgLSAxKSB7CisgICAgICAgICAgICBzd2FwKGluZGV4LCBpbmRleCArIDEpOworICAgICAgICB9CisgICAgfQogCi0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJU3RyaW5nIGxpYk5hbWUgPSBkaWFsb2cuZ2V0TGlicmFyeU5hbWUoKTsKLQkJCWlmIChsaWJOYW1lID09IG51bGwgfHwgbGliTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlJUGx1Z2luTGlicmFyeSBsaWJyYXJ5ID0gbW9kZWwuZ2V0UGx1Z2luRmFjdG9yeSgpLmNyZWF0ZUxpYnJhcnkoKTsKLQkJCQlsaWJyYXJ5LnNldE5hbWUobGliTmFtZSk7Ci0JCQkJbGlicmFyeS5zZXRFeHBvcnRlZCh0cnVlKTsKLQkJCQltb2RlbC5nZXRQbHVnaW5CYXNlKCkuYWRkKGxpYnJhcnkpOwotCQkJCWNoZWNrU291cmNlUm9vdEVudHJ5KCk7Ci0JCQkJdXBkYXRlQnVpbGRQcm9wZXJ0aWVzKG5ldyBTdHJpbmdbXSB7IG51bGwgfSwgbmV3IFN0cmluZ1tdIHsgbGlicmFyeS5nZXROYW1lKCkgfSwgdHJ1ZSk7Ci0JCQkJZkxpYnJhcnlUYWJsZS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obGlicmFyeSkpOwotCQkJCWZMaWJyYXJ5VGFibGUuZ2V0VGFibGUoKS5zZXRGb2N1cygpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJUERFUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlVXAoKSB7CisgICAgICAgIGludCBpbmRleCA9IGdldFRhYmxlUGFydCgpLmdldFRhYmxlVmlld2VyKCkuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOworICAgICAgICBpZiAoaW5kZXggPj0gMSkgeworICAgICAgICAgICAgc3dhcChpbmRleCwgaW5kZXggLSAxKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgdm9pZCBjaGVja1NvdXJjZVJvb3RFbnRyeSgpIHsKLQkJSVBsdWdpbk1vZGVsQmFzZSBwbHVnaW5Nb2RlbCA9IGdldE1vZGVsKCk7Ci0JCUlQbHVnaW5MaWJyYXJ5W10gbGlicmFyaWVzID0gcGx1Z2luTW9kZWwuZ2V0UGx1Z2luQmFzZSgpLmdldExpYnJhcmllcygpOwotCQlmb3IgKElQbHVnaW5MaWJyYXJ5IGVsZW1lbnQgOiBsaWJyYXJpZXMpIHsKLQkJCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoIi4iKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQorICAgIHB1YmxpYyB2b2lkIHN3YXAoaW50IGluZGV4MSwgaW50IGluZGV4MikgeworICAgICAgICBUYWJsZSB0YWJsZSA9IGdldFRhYmxlUGFydCgpLmdldFRhYmxlVmlld2VyKCkuZ2V0VGFibGUoKTsKKyAgICAgICAgSVBsdWdpbkxpYnJhcnkgbDEgPSAoSVBsdWdpbkxpYnJhcnkpIHRhYmxlLmdldEl0ZW0oaW5kZXgxKS5nZXREYXRhKCk7CisgICAgICAgIElQbHVnaW5MaWJyYXJ5IGwyID0gKElQbHVnaW5MaWJyYXJ5KSB0YWJsZS5nZXRJdGVtKGluZGV4MikuZ2V0RGF0YSgpOwogCi0JCUlQbHVnaW5MaWJyYXJ5IGxpYnJhcnkgPSBwbHVnaW5Nb2RlbC5nZXRQbHVnaW5GYWN0b3J5KCkuY3JlYXRlTGlicmFyeSgpOwotCQl0cnkgewotCQkJbGlicmFyeS5zZXROYW1lKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXBsdWdpbk1vZGVsLmdldFBsdWdpbkJhc2UoKS5hZGQobGlicmFyeSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCA9IGdldE1vZGVsKCk7CisgICAgICAgICAgICBJUGx1Z2luQmFzZSBwbHVnaW5CYXNlID0gbW9kZWwuZ2V0UGx1Z2luQmFzZSgpOworICAgICAgICAgICAgcGx1Z2luQmFzZS5zd2FwKGwxLCBsMik7CisgICAgICAgICAgICByZWZyZXNoKCk7CisgICAgICAgICAgICB0YWJsZS5zZXRTZWxlY3Rpb24oaW5kZXgyKTsKKyAgICAgICAgICAgIHRhYmxlLnNldEZvY3VzKCk7CisgICAgICAgICAgICB1cGRhdGVCdXR0b25zKCk7CisgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgUERFUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgSUJ1aWxkTW9kZWwgZ2V0QnVpbGRNb2RlbCgpIHsKLQkJSUZvcm1QYWdlIHBhZ2UgPSBnZXRQYWdlKCkuZ2V0RWRpdG9yKCkuZmluZFBhZ2UoQnVpbGRJbnB1dENvbnRleHQuQ09OVEVYVF9JRCk7Ci0JCUlCYXNlTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAocGFnZSBpbnN0YW5jZW9mIEJ1aWxkU291cmNlUGFnZSkgewotCQkJbW9kZWwgPSAoKEJ1aWxkU291cmNlUGFnZSkgcGFnZSkuZ2V0SW5wdXRDb250ZXh0KCkuZ2V0TW9kZWwoKTsKLQkJfQorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVOZXcoKSB7CisgICAgICAgIElQbHVnaW5Nb2RlbEJhc2UgbW9kZWwgPSBnZXRNb2RlbCgpOworICAgICAgICBOZXdSdW50aW1lTGlicmFyeURpYWxvZyBkaWFsb2cgPSBuZXcgTmV3UnVudGltZUxpYnJhcnlEaWFsb2coZ2V0UGFnZSgpLmdldFNpdGUoKS5nZXRTaGVsbCgpLCBtb2RlbC5nZXRQbHVnaW5CYXNlKCkuZ2V0TGlicmFyaWVzKCkpOworICAgICAgICBkaWFsb2cuY3JlYXRlKCk7CisgICAgICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoUERFVUlNZXNzYWdlcy5NYW5pZmVzdEVkaXRvcl9MaWJyYXJ5U2VjdGlvbl9uZXdMaWJyYXJ5RW50cnkpOworICAgICAgICBTV1RVdGlsLnNldERpYWxvZ1NpemUoZGlhbG9nLCAyNTAsIDE3NSk7CisKKyAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7CisgICAgICAgICAgICBTdHJpbmcgbGliTmFtZSA9IGRpYWxvZy5nZXRMaWJyYXJ5TmFtZSgpOworICAgICAgICAgICAgaWYgKGxpYk5hbWUgPT0gbnVsbCB8fCBsaWJOYW1lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIElQbHVnaW5MaWJyYXJ5IGxpYnJhcnkgPSBtb2RlbC5nZXRQbHVnaW5GYWN0b3J5KCkuY3JlYXRlTGlicmFyeSgpOworICAgICAgICAgICAgICAgIGxpYnJhcnkuc2V0TmFtZShsaWJOYW1lKTsKKyAgICAgICAgICAgICAgICBsaWJyYXJ5LnNldEV4cG9ydGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1vZGVsLmdldFBsdWdpbkJhc2UoKS5hZGQobGlicmFyeSk7CisgICAgICAgICAgICAgICAgY2hlY2tTb3VyY2VSb290RW50cnkoKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVCdWlsZFByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsgbnVsbCB9LCBuZXcgU3RyaW5nW10geyBsaWJyYXJ5LmdldE5hbWUoKSB9LCB0cnVlKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZMaWJyYXJ5VGFibGUuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpYnJhcnkpKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZMaWJyYXJ5VGFibGUuZ2V0VGFibGUoKS5zZXRGb2N1cygpOworICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgUERFUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1NvdXJjZVJvb3RFbnRyeSgpIHsKKyAgICAgICAgSVBsdWdpbk1vZGVsQmFzZSBwbHVnaW5Nb2RlbCA9IGdldE1vZGVsKCk7CisgICAgICAgIElQbHVnaW5MaWJyYXJ5W10gbGlicmFyaWVzID0gcGx1Z2luTW9kZWwuZ2V0UGx1Z2luQmFzZSgpLmdldExpYnJhcmllcygpOworICAgICAgICBmb3IgKElQbHVnaW5MaWJyYXJ5IGVsZW1lbnQgOiBsaWJyYXJpZXMpIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoIi4iKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIElQbHVnaW5MaWJyYXJ5IGxpYnJhcnkgPSBwbHVnaW5Nb2RlbC5nZXRQbHVnaW5GYWN0b3J5KCkuY3JlYXRlTGlicmFyeSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbGlicmFyeS5zZXROYW1lKCIuIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHBsdWdpbk1vZGVsLmdldFBsdWdpbkJhc2UoKS5hZGQobGlicmFyeSk7CisgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBJQnVpbGRNb2RlbCBnZXRCdWlsZE1vZGVsKCkgeworICAgICAgICBJRm9ybVBhZ2UgcGFnZSA9IGdldFBhZ2UoKS5nZXRFZGl0b3IoKS5maW5kUGFnZShCdWlsZElucHV0Q29udGV4dC5DT05URVhUX0lEKTsKKyAgICAgICAgSUJhc2VNb2RlbCBtb2RlbCA9IG51bGw7CisgICAgICAgIGlmIChwYWdlIGluc3RhbmNlb2YgQnVpbGRTb3VyY2VQYWdlKSB7CisgICAgICAgICAgICBtb2RlbCA9ICgoQnVpbGRTb3VyY2VQYWdlKSBwYWdlKS5nZXRJbnB1dENvbnRleHQoKS5nZXRNb2RlbCgpOworICAgICAgICB9CiAKLQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwgaW5zdGFuY2VvZiBJQnVpbGRNb2RlbCkgewotCQkJcmV0dXJuIChJQnVpbGRNb2RlbCkgbW9kZWw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgICAgICBpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbCBpbnN0YW5jZW9mIElCdWlsZE1vZGVsKSB7CisgICAgICAgICAgICByZXR1cm4gKElCdWlsZE1vZGVsKSBtb2RlbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgY29uZmlndXJlU291cmNlQnVpbGRFbnRyeShJQnVpbGRNb2RlbCBibW9kZWwsIFN0cmluZyBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQnVpbGQgYnVpbGQgPSBibW9kZWwuZ2V0QnVpbGQoKTsKLQkJSUJ1aWxkRW50cnkgZW50cnkgPSBidWlsZC5nZXRFbnRyeShQUk9QRVJUWV9TT1VSQ0VfUFJFRklYICsgKG9sZFBhdGggIT0gbnVsbCA/IG9sZFBhdGggOiBuZXdQYXRoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAobmV3UGF0aCAhPSBudWxsKSB7Ci0JCQkJaWYgKGVudHJ5ID09IG51bGwpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSU1vZGVsKSBnZXRQYWdlKCkuZ2V0TW9kZWwoKSkuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0UHJvamVjdCgpOwotCQkJCQlJSmF2YVByb2plY3QganByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJCUFycmF5TGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgZWxlbWVudCA6IGVudHJpZXMpIHsKLQkJCQkJCWlmIChlbGVtZW50LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJCQkJdG9rZW5zLmFkZChlbGVtZW50LmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHRva2Vucy5zaXplKCkgPT0gMCkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9CisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVNvdXJjZUJ1aWxkRW50cnkoSUJ1aWxkTW9kZWwgYm1vZGVsLCBTdHJpbmcgb2xkUGF0aCwgU3RyaW5nIG5ld1BhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgSUJ1aWxkIGJ1aWxkID0gYm1vZGVsLmdldEJ1aWxkKCk7CisgICAgICAgIElCdWlsZEVudHJ5IGVudHJ5ID0gYnVpbGQuZ2V0RW50cnkoUFJPUEVSVFlfU09VUkNFX1BSRUZJWCArIChvbGRQYXRoICE9IG51bGwgPyBvbGRQYXRoIDogbmV3UGF0aCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG5ld1BhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoKElNb2RlbCkgZ2V0UGFnZSgpLmdldE1vZGVsKCkpLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgSUphdmFQcm9qZWN0IGpwcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0ganByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoSUNsYXNzcGF0aEVudHJ5IGVsZW1lbnQgOiBlbnRyaWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2Vucy5hZGQoZWxlbWVudC5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCWVudHJ5ID0gYm1vZGVsLmdldEZhY3RvcnkoKS5jcmVhdGVFbnRyeShQUk9QRVJUWV9TT1VSQ0VfUFJFRklYICsgbmV3UGF0aCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQllbnRyeS5hZGRUb2tlbigoU3RyaW5nKSB0b2tlbnMuZ2V0KGkpKTsKLQkJCQkJfQotCQkJCQlidWlsZC5hZGQoZW50cnkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVudHJ5LnNldE5hbWUoUFJPUEVSVFlfU09VUkNFX1BSRUZJWCArIG5ld1BhdGgpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZW50cnkgIT0gbnVsbCAmJiBuZXdQYXRoID09IG51bGwpIHsKLQkJCQlidWlsZC5yZW1vdmUoZW50cnkpOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGJtb2RlbC5nZXRGYWN0b3J5KCkuY3JlYXRlRW50cnkoUFJPUEVSVFlfU09VUkNFX1BSRUZJWCArIG5ld1BhdGgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuYWRkVG9rZW4oKFN0cmluZykgdG9rZW5zLmdldChpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnVpbGQuYWRkKGVudHJ5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbnRyeS5zZXROYW1lKFBST1BFUlRZX1NPVVJDRV9QUkVGSVggKyBuZXdQYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5ICE9IG51bGwgJiYgbmV3UGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGQucmVtb3ZlKGVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgdm9pZCBoYW5kbGVBZGQoKSB7Ci0JCUVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyhnZXRQYWdlKCkuZ2V0U2l0ZSgpLmdldFNoZWxsKCksCi0JCQkJbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlQWRkKCkgeworICAgICAgICBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coZ2V0UGFnZSgpLmdldFNpdGUoKS5nZXRTaGVsbCgpLCBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLAorICAgICAgICAgICAgbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpKTsKIAotCQlDbGFzc1tdIGFjY2VwdGVkQ2xhc3NlcyA9IG5ldyBDbGFzc1tdIHsgSUZpbGUuY2xhc3MgfTsKLQkJZGlhbG9nLnNldFZhbGlkYXRvcihuZXcgTGlicmFyeVNlbGVjdGlvblZhbGlkYXRvcihhY2NlcHRlZENsYXNzZXMsIHRydWUpKTsKLQkJZGlhbG9nLnNldFRpdGxlKFBERVVJTWVzc2FnZXMuQnVpbGRFZGl0b3JfQ2xhc3NwYXRoU2VjdGlvbl9qYXJzVGl0bGUpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShQREVVSU1lc3NhZ2VzLkNsYXNzcGF0aFNlY3Rpb25famFyc01lc3NhZ2UpOwotCQlJUGx1Z2luTGlicmFyeVtdIGxpYnJhcmllcyA9IGdldE1vZGVsKCkuZ2V0UGx1Z2luQmFzZSgpLmdldExpYnJhcmllcygpOwotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSVBsdWdpbkxpYnJhcnkgZWxlbWVudCA6IGxpYnJhcmllcykgewotCQkJc2V0LmFkZChuZXcgUGF0aChDbGFzc3BhdGhVdGlsQ29yZS5leHBhbmRMaWJyYXJ5TmFtZShlbGVtZW50LmdldE5hbWUoKSkpKTsKLQkJfQorICAgICAgICBDbGFzc1tdIGFjY2VwdGVkQ2xhc3NlcyA9IG5ldyBDbGFzc1tdIHsgSUZpbGUuY2xhc3MgfTsKKyAgICAgICAgZGlhbG9nLnNldFZhbGlkYXRvcihuZXcgTGlicmFyeVNlbGVjdGlvblZhbGlkYXRvcihhY2NlcHRlZENsYXNzZXMsIHRydWUpKTsKKyAgICAgICAgZGlhbG9nLnNldFRpdGxlKFBERVVJTWVzc2FnZXMuQnVpbGRFZGl0b3JfQ2xhc3NwYXRoU2VjdGlvbl9qYXJzVGl0bGUpOworICAgICAgICBkaWFsb2cuc2V0TWVzc2FnZShQREVVSU1lc3NhZ2VzLkNsYXNzcGF0aFNlY3Rpb25famFyc01lc3NhZ2UpOworICAgICAgICBJUGx1Z2luTGlicmFyeVtdIGxpYnJhcmllcyA9IGdldE1vZGVsKCkuZ2V0UGx1Z2luQmFzZSgpLmdldExpYnJhcmllcygpOworICAgICAgICBIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIGZvciAoSVBsdWdpbkxpYnJhcnkgZWxlbWVudCA6IGxpYnJhcmllcykgeworICAgICAgICAgICAgc2V0LmFkZChuZXcgUGF0aChDbGFzc3BhdGhVdGlsQ29yZS5leHBhbmRMaWJyYXJ5TmFtZShlbGVtZW50LmdldE5hbWUoKSkpKTsKKyAgICAgICAgfQogCi0JCWRpYWxvZy5hZGRGaWx0ZXIobmV3IExpYnJhcnlGaWx0ZXIoc2V0KSk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoKElNb2RlbCkgZ2V0UGFnZSgpLmdldE1vZGVsKCkpLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKLQkJZGlhbG9nLnNldElucHV0KHByb2plY3QpOwotCQlkaWFsb2cuc2V0Q29tcGFyYXRvcihuZXcgUmVzb3VyY2VDb21wYXJhdG9yKFJlc291cmNlQ29tcGFyYXRvci5OQU1FKSk7CisgICAgICAgIGRpYWxvZy5hZGRGaWx0ZXIobmV3IExpYnJhcnlGaWx0ZXIoc2V0KSk7CisgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoKElNb2RlbCkgZ2V0UGFnZSgpLmdldE1vZGVsKCkpLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKKyAgICAgICAgZGlhbG9nLnNldElucHV0KHByb2plY3QpOworICAgICAgICBkaWFsb2cuc2V0Q29tcGFyYXRvcihuZXcgUmVzb3VyY2VDb21wYXJhdG9yKFJlc291cmNlQ29tcGFyYXRvci5OQU1FKSk7CiAKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJCVN0cmluZ1tdIGZpbGVQYXRocyA9IG5ldyBTdHJpbmdbZWxlbWVudHMubGVuZ3RoXTsKLQkJCUlQbHVnaW5Nb2RlbEJhc2UgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVJlc291cmNlIGVsZW0gPSAoSVJlc291cmNlKSBlbGVtZW50c1tpXTsKLQkJCQlJUGF0aCBwYXRoID0gZWxlbS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJCXBhdGggPSBwYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCQkJfQotCQkJCWZpbGVQYXRoc1tpXSA9IHBhdGgudG9TdHJpbmcoKTsKLQkJCQlJUGx1Z2luTGlicmFyeSBsaWJyYXJ5ID0gbW9kZWwuZ2V0UGx1Z2luRmFjdG9yeSgpLmNyZWF0ZUxpYnJhcnkoKTsKLQkJCQl0cnkgewotCQkJCQlsaWJyYXJ5LnNldE5hbWUoZmlsZVBhdGhzW2ldKTsKLQkJCQkJbGlicmFyeS5zZXRFeHBvcnRlZCh0cnVlKTsKLQkJCQkJbW9kZWwuZ2V0UGx1Z2luQmFzZSgpLmFkZChsaWJyYXJ5KTsKLQkJCQkJbGlzdC5hZGQobGlicmFyeSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBERVBsdWdpbi5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQkJY2hlY2tTb3VyY2VSb290RW50cnkoKTsKLQkJCWZMaWJyYXJ5VGFibGUuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGxpc3QudG9BcnJheSgpKSk7Ci0JCQlmTGlicmFyeVRhYmxlLmdldFRhYmxlKCkuc2V0Rm9jdXMoKTsKLQkJfQotCX0KKyAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7CisgICAgICAgICAgICBPYmplY3RbXSBlbGVtZW50cyA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVQYXRocyA9IG5ldyBTdHJpbmdbZWxlbWVudHMubGVuZ3RoXTsKKyAgICAgICAgICAgIElQbHVnaW5Nb2RlbEJhc2UgbW9kZWwgPSBnZXRNb2RlbCgpOworICAgICAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgSVJlc291cmNlIGVsZW0gPSAoSVJlc291cmNlKSBlbGVtZW50c1tpXTsKKyAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gZWxlbS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CisgICAgICAgICAgICAgICAgaWYgKGVsZW0gaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbGVQYXRoc1tpXSA9IHBhdGgudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBJUGx1Z2luTGlicmFyeSBsaWJyYXJ5ID0gbW9kZWwuZ2V0UGx1Z2luRmFjdG9yeSgpLmNyZWF0ZUxpYnJhcnkoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LnNldE5hbWUoZmlsZVBhdGhzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgbGlicmFyeS5zZXRFeHBvcnRlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbW9kZWwuZ2V0UGx1Z2luQmFzZSgpLmFkZChsaWJyYXJ5KTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQobGlicmFyeSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFBERVBsdWdpbi5sb2dFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hlY2tTb3VyY2VSb290RW50cnkoKTsKKyAgICAgICAgICAgIHRoaXMuZkxpYnJhcnlUYWJsZS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obGlzdC50b0FycmF5KCkpKTsKKyAgICAgICAgICAgIHRoaXMuZkxpYnJhcnlUYWJsZS5nZXRUYWJsZSgpLnNldEZvY3VzKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgdXBkYXRlQnVpbGRQcm9wZXJ0aWVzKGZpbmFsIFN0cmluZ1tdIG9sZFBhdGhzLCBmaW5hbCBTdHJpbmdbXSBuZXdQYXRocywgYm9vbGVhbiBtb2RpZnlTb3VyY2VFbnRyeSkgewotCQlJQnVpbGRNb2RlbCBibW9kZWwgPSBnZXRCdWlsZE1vZGVsKCk7Ci0JCWlmIChibW9kZWwgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9CisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJ1aWxkUHJvcGVydGllcyhmaW5hbCBTdHJpbmdbXSBvbGRQYXRocywgZmluYWwgU3RyaW5nW10gbmV3UGF0aHMsIGJvb2xlYW4gbW9kaWZ5U291cmNlRW50cnkpIHsKKyAgICAgICAgSUJ1aWxkTW9kZWwgYm1vZGVsID0gZ2V0QnVpbGRNb2RlbCgpOworICAgICAgICBpZiAoYm1vZGVsID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0JCUlCdWlsZCBidWlsZCA9IGJtb2RlbC5nZXRCdWlsZCgpOworICAgICAgICBJQnVpbGQgYnVpbGQgPSBibW9kZWwuZ2V0QnVpbGQoKTsKIAotCQlJQnVpbGRFbnRyeSBlbnRyeSA9IGJ1aWxkLmdldEVudHJ5KFBST1BFUlRZX0JJTl9JTkNMVURFUyk7Ci0JCWlmIChlbnRyeSA9PSBudWxsKSB7Ci0JCQllbnRyeSA9IGJtb2RlbC5nZXRGYWN0b3J5KCkuY3JlYXRlRW50cnkoUFJPUEVSVFlfQklOX0lOQ0xVREVTKTsKLQkJfQorICAgICAgICBJQnVpbGRFbnRyeSBlbnRyeSA9IGJ1aWxkLmdldEVudHJ5KFBST1BFUlRZX0JJTl9JTkNMVURFUyk7CisgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKSB7CisgICAgICAgICAgICBlbnRyeSA9IGJtb2RlbC5nZXRGYWN0b3J5KCkuY3JlYXRlRW50cnkoUFJPUEVSVFlfQklOX0lOQ0xVREVTKTsKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQkvLyBhZGRpbmcgbmV3IGVudHJpZXMKLQkJCWlmIChvbGRQYXRoc1swXSA9PSBudWxsKSB7Ci0JCQkJZm9yIChTdHJpbmcgZWxlbWVudCA6IG5ld1BhdGhzKSB7Ci0JCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCWVudHJ5LmFkZFRva2VuKGVsZW1lbnQpOwotCQkJCQkJaWYgKG1vZGlmeVNvdXJjZUVudHJ5KSB7Ci0JCQkJCQkJY29uZmlndXJlU291cmNlQnVpbGRFbnRyeShibW9kZWwsIG51bGwsIGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHJlbW92aW5nIGVudHJpZXMKLQkJCX0gZWxzZSBpZiAobmV3UGF0aHNbMF0gPT0gbnVsbCkgewotCQkJCWZvciAoU3RyaW5nIGVsZW1lbnQgOiBvbGRQYXRocykgewotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQllbnRyeS5yZW1vdmVUb2tlbihlbGVtZW50KTsKLQkJCQkJCWlmIChtb2RpZnlTb3VyY2VFbnRyeSkgewotCQkJCQkJCWNvbmZpZ3VyZVNvdXJjZUJ1aWxkRW50cnkoYm1vZGVsLCBlbGVtZW50LCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZW50cnkuZ2V0VG9rZW5zKCkubGVuZ3RoID09IDApIHsKLQkJCQkJYnVpbGQucmVtb3ZlKGVudHJ5KTsKLQkJCQl9Ci0JCQkJLy8gcmVuYW1lIGVudHJpZXMKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRQYXRocy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAobmV3UGF0aHNbaV0gIT0gbnVsbCAmJiBvbGRQYXRoc1tpXSAhPSBudWxsKSB7Ci0JCQkJCQllbnRyeS5yZW5hbWVUb2tlbihvbGRQYXRoc1tpXSwgbmV3UGF0aHNbaV0pOwotCQkJCQkJaWYgKG1vZGlmeVNvdXJjZUVudHJ5KSB7Ci0JCQkJCQkJY29uZmlndXJlU291cmNlQnVpbGRFbnRyeShibW9kZWwsIG9sZFBhdGhzW2ldLCBuZXdQYXRoc1tpXSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gYWRkaW5nIG5ldyBlbnRyaWVzCisgICAgICAgICAgICBpZiAob2xkUGF0aHNbMF0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiBuZXdQYXRocykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5hZGRUb2tlbihlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZnlTb3VyY2VFbnRyeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZVNvdXJjZUJ1aWxkRW50cnkoYm1vZGVsLCBudWxsLCBlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyByZW1vdmluZyBlbnRyaWVzCisgICAgICAgICAgICB9IGVsc2UgaWYgKG5ld1BhdGhzWzBdID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBlbGVtZW50IDogb2xkUGF0aHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucmVtb3ZlVG9rZW4oZWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kaWZ5U291cmNlRW50cnkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVTb3VyY2VCdWlsZEVudHJ5KGJtb2RlbCwgZWxlbWVudCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldFRva2VucygpLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkLnJlbW92ZShlbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHJlbmFtZSBlbnRyaWVzCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2xkUGF0aHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhdGhzW2ldICE9IG51bGwgJiYgb2xkUGF0aHNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucmVuYW1lVG9rZW4ob2xkUGF0aHNbaV0sIG5ld1BhdGhzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZnlTb3VyY2VFbnRyeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZVNvdXJjZUJ1aWxkRW50cnkoYm1vZGVsLCBvbGRQYXRoc1tpXSwgbmV3UGF0aHNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgdm9pZCB1cGRhdGVKYXZhQ2xhc3NwYXRoTGlicyhTdHJpbmdbXSBvbGRQYXRocywgU3RyaW5nW10gbmV3UGF0aHMpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9ICgoSU1vZGVsKSBnZXRQYWdlKCkuZ2V0TW9kZWwoKSkuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0UHJvamVjdCgpOwotCQlJSmF2YVByb2plY3QganByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0ganByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlBcnJheUxpc3QgdG9CZUFkZGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaW50IGluZGV4ID0gLTE7Ci0JCQllbnRyeUxvb3A6IGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChlbnRyaWVzW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgewotCQkJCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJfQotCQkJCQkvLyBkbyBub3QgYWRkIHRoZSBvbGQgcGF0aHMgKGhhbmRsaW5nIGRlbGV0aW9uL3JlbmFtaW5nKQotCQkJCQlJUGF0aCBwYXRoID0gZW50cmllc1tpXS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9sZFBhdGhzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAob2xkUGF0aHNbal0gIT0gbnVsbCAmJiBwYXRoLmVxdWFscyhuZXcgUGF0aChvbGRQYXRoc1tqXSkucmVtb3ZlVHJhaWxpbmdTZXBhcmF0b3IoKSkpIHsKLQkJCQkJCQljb250aW51ZSBlbnRyeUxvb3A7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVudHJpZXNbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpIHsKLQkJCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJCQlpbmRleCA9IGk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdG9CZUFkZGVkLmFkZChlbnRyaWVzW2ldKTsKLQkJCX0KLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWluZGV4ID0gZW50cmllcy5sZW5ndGg7Ci0JCQl9CisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUphdmFDbGFzc3BhdGhMaWJzKFN0cmluZ1tdIG9sZFBhdGhzLCBTdHJpbmdbXSBuZXdQYXRocykgeworICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gKChJTW9kZWwpIGdldFBhZ2UoKS5nZXRNb2RlbCgpKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRQcm9qZWN0KCk7CisgICAgICAgIElKYXZhUHJvamVjdCBqcHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKKyAgICAgICAgICAgIEFycmF5TGlzdCB0b0JlQWRkZWQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAtMTsKKyAgICAgICAgICAgIGVudHJ5TG9vcDogZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJpZXNbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBhZGQgdGhlIG9sZCBwYXRocyAoaGFuZGxpbmcgZGVsZXRpb24vcmVuYW1pbmcpCisgICAgICAgICAgICAgICAgICAgIElQYXRoIHBhdGggPSBlbnRyaWVzW2ldLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLnJlbW92ZVRyYWlsaW5nU2VwYXJhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgb2xkUGF0aHMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRQYXRoc1tqXSAhPSBudWxsICYmIHBhdGguZXF1YWxzKG5ldyBQYXRoKG9sZFBhdGhzW2pdKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIGVudHJ5TG9vcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cmllc1tpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUikgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b0JlQWRkZWQuYWRkKGVudHJpZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBlbnRyaWVzLmxlbmd0aDsKKyAgICAgICAgICAgIH0KIAotCQkJLy8gYWRkIHBhdGhzCi0JCQlmb3IgKFN0cmluZyBlbGVtZW50IDogbmV3UGF0aHMpIHsKLQkJCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocHJvamVjdC5nZXRGdWxsUGF0aCgpLmFwcGVuZChlbGVtZW50KSwgbnVsbCwgbnVsbCwKLQkJCQkJCXRydWUpOwotCQkJCWlmICghdG9CZUFkZGVkLmNvbnRhaW5zKGVudHJ5KSkgewotCQkJCQl0b0JlQWRkZWQuYWRkKGluZGV4KyssIGVudHJ5KTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICAvLyBhZGQgcGF0aHMKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiBuZXdQYXRocykgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShwcm9qZWN0LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGVsZW1lbnQpLCBudWxsLCBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRvQmVBZGRlZC5jb250YWlucyhlbnRyeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9CZUFkZGVkLmFkZChpbmRleCsrLCBlbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlpZiAodG9CZUFkZGVkLnNpemUoKSA9PSBlbnRyaWVzLmxlbmd0aCkgewotCQkJCXJldHVybjsKLQkJCX0KKyAgICAgICAgICAgIGlmICh0b0JlQWRkZWQuc2l6ZSgpID09IGVudHJpZXMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCQlJQ2xhc3NwYXRoRW50cnlbXSB1cGRhdGVkID0gKElDbGFzc3BhdGhFbnRyeVtdKSB0b0JlQWRkZWQudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W3RvQmVBZGRlZC5zaXplKCldKTsKLQkJCWpwcm9qZWN0LnNldFJhd0NsYXNzcGF0aCh1cGRhdGVkLCBudWxsKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KKyAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIHVwZGF0ZWQgPSAoSUNsYXNzcGF0aEVudHJ5W10pIHRvQmVBZGRlZC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbdG9CZUFkZGVkLnNpemUoKV0pOworICAgICAgICAgICAganByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKHVwZGF0ZWQsIG51bGwpOworICAgICAgICB9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJaWYgKGZMaWJyYXJ5VGFibGUuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZMaWJyYXJ5VGFibGUuc2V0U2VsZWN0aW9uKG51bGwpOwotCQlmTGlicmFyeVRhYmxlLnJlZnJlc2goKTsKLQkJc3VwZXIucmVmcmVzaCgpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgeworICAgICAgICBpZiAodGhpcy5mTGlicmFyeVRhYmxlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmZMaWJyYXJ5VGFibGUuc2V0U2VsZWN0aW9uKG51bGwpOworICAgICAgICB0aGlzLmZMaWJyYXJ5VGFibGUucmVmcmVzaCgpOworICAgICAgICBzdXBlci5yZWZyZXNoKCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElNb2RlbENoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0Q2hhbmdlVHlwZSgpID09IElNb2RlbENoYW5nZWRFdmVudC5XT1JMRF9DSEFOR0VEKSB7Ci0JCQltYXJrU3RhbGUoKTsKLQkJCXJldHVybjsKLQkJfQotCQlPYmplY3QgY2hhbmdlT2JqZWN0ID0gZXZlbnQuZ2V0Q2hhbmdlZE9iamVjdHMoKVswXTsKLQkJaWYgKGNoYW5nZU9iamVjdCBpbnN0YW5jZW9mIElQbHVnaW5MaWJyYXJ5KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0Q2hhbmdlVHlwZSgpID09IElNb2RlbENoYW5nZWRFdmVudC5JTlNFUlQpIHsKLQkJCQlmTGlicmFyeVRhYmxlLmFkZChjaGFuZ2VPYmplY3QpOwotCQkJfSBlbHNlIGlmIChldmVudC5nZXRDaGFuZ2VUeXBlKCkgPT0gSU1vZGVsQ2hhbmdlZEV2ZW50LlJFTU9WRSkgewotCQkJCWZMaWJyYXJ5VGFibGUucmVtb3ZlKGNoYW5nZU9iamVjdCk7Ci0JCQl9IGVsc2UgewotCQkJCWZMaWJyYXJ5VGFibGUudXBkYXRlKGNoYW5nZU9iamVjdCwgbnVsbCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2hhbmdlT2JqZWN0LmVxdWFscyhmTGlicmFyeVRhYmxlLmdldElucHV0KCkpKSB7Ci0JCQltYXJrU3RhbGUoKTsKLQkJfSBlbHNlIGlmIChjaGFuZ2VPYmplY3QgaW5zdGFuY2VvZiBJUGx1Z2luRWxlbWVudAotCQkJCSYmICgoSVBsdWdpbkVsZW1lbnQpIGNoYW5nZU9iamVjdCkuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBJUGx1Z2luTGlicmFyeSkgewotCQkJZkxpYnJhcnlUYWJsZS51cGRhdGUoKChJUGx1Z2luRWxlbWVudCkgY2hhbmdlT2JqZWN0KS5nZXRQYXJlbnQoKSwgbnVsbCk7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElNb2RlbENoYW5nZWRFdmVudCBldmVudCkgeworICAgICAgICBpZiAoZXZlbnQuZ2V0Q2hhbmdlVHlwZSgpID09IElNb2RlbENoYW5nZWRFdmVudC5XT1JMRF9DSEFOR0VEKSB7CisgICAgICAgICAgICBtYXJrU3RhbGUoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBPYmplY3QgY2hhbmdlT2JqZWN0ID0gZXZlbnQuZ2V0Q2hhbmdlZE9iamVjdHMoKVswXTsKKyAgICAgICAgaWYgKGNoYW5nZU9iamVjdCBpbnN0YW5jZW9mIElQbHVnaW5MaWJyYXJ5KSB7CisgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0Q2hhbmdlVHlwZSgpID09IElNb2RlbENoYW5nZWRFdmVudC5JTlNFUlQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZMaWJyYXJ5VGFibGUuYWRkKGNoYW5nZU9iamVjdCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmdldENoYW5nZVR5cGUoKSA9PSBJTW9kZWxDaGFuZ2VkRXZlbnQuUkVNT1ZFKSB7CisgICAgICAgICAgICAgICAgdGhpcy5mTGlicmFyeVRhYmxlLnJlbW92ZShjaGFuZ2VPYmplY3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZMaWJyYXJ5VGFibGUudXBkYXRlKGNoYW5nZU9iamVjdCwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlT2JqZWN0LmVxdWFscyh0aGlzLmZMaWJyYXJ5VGFibGUuZ2V0SW5wdXQoKSkpIHsKKyAgICAgICAgICAgIG1hcmtTdGFsZSgpOworICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZU9iamVjdCBpbnN0YW5jZW9mIElQbHVnaW5FbGVtZW50ICYmICgoSVBsdWdpbkVsZW1lbnQpIGNoYW5nZU9iamVjdCkuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBJUGx1Z2luTGlicmFyeSkgeworICAgICAgICAgICAgdGhpcy5mTGlicmFyeVRhYmxlLnVwZGF0ZSgoKElQbHVnaW5FbGVtZW50KSBjaGFuZ2VPYmplY3QpLmdldFBhcmVudCgpLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlmTGlicmFyeVRhYmxlLmdldFRhYmxlKCkuc2V0Rm9jdXMoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisgICAgICAgIHRoaXMuZkxpYnJhcnlUYWJsZS5nZXRUYWJsZSgpLnNldEZvY3VzKCk7CisgICAgfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZQotCSAqIG9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC51aS5lZGl0b3IuU3RydWN0dXJlZFZpZXdlclNlY3Rpb24jZG9QYXN0ZShqYXZhCi0JICogLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0W10pCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9QYXN0ZShPYmplY3QgdGFyZ2V0T2JqZWN0LCBPYmplY3RbXSBzb3VyY2VPYmplY3RzKSB7Ci0JCS8vIEdldCB0aGUgbW9kZWwKLQkJSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCUlQbHVnaW5CYXNlIHBsdWdpbiA9IG1vZGVsLmdldFBsdWdpbkJhc2UoKTsKLQkJdHJ5IHsKLQkJCS8vIFBhc3RlIGFsbCBzb3VyY2Ugb2JqZWN0cwotCQkJZm9yIChPYmplY3Qgc291cmNlT2JqZWN0IDogc291cmNlT2JqZWN0cykgewotCQkJCWlmIChzb3VyY2VPYmplY3QgaW5zdGFuY2VvZiBQbHVnaW5MaWJyYXJ5KSB7Ci0JCQkJCS8vIFBsdWdpbiBsaWJyYXJ5IG9iamVjdAotCQkJCQlQbHVnaW5MaWJyYXJ5IGxpYnJhcnkgPSAoUGx1Z2luTGlicmFyeSkgc291cmNlT2JqZWN0OwotCQkJCQkvLyBBZGp1c3QgYWxsIHRoZSBzb3VyY2Ugb2JqZWN0IHRyYW5zaWVudCBmaWVsZCB2YWx1ZXMgdG8KLQkJCQkJLy8gYWNjZXB0YWJsZSB2YWx1ZXMKLQkJCQkJbGlicmFyeS5yZWNvbm5lY3QobW9kZWwsIHBsdWdpbik7Ci0JCQkJCS8vIEFkZCB0aGUgbGlicmFyeSB0byB0aGUgcGx1Zy1pbgotCQkJCQlwbHVnaW4uYWRkKGxpYnJhcnkpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlQREVQbHVnaW4ubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQorICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwudWkuZWRpdG9yLlN0cnVjdHVyZWRWaWV3ZXJTZWN0aW9uI2RvUGFzdGUoamF2YSAubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3RbXSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1Bhc3RlKE9iamVjdCB0YXJnZXRPYmplY3QsIE9iamVjdFtdIHNvdXJjZU9iamVjdHMpIHsKKyAgICAgICAgLy8gR2V0IHRoZSBtb2RlbAorICAgICAgICBJUGx1Z2luTW9kZWxCYXNlIG1vZGVsID0gZ2V0TW9kZWwoKTsKKyAgICAgICAgSVBsdWdpbkJhc2UgcGx1Z2luID0gbW9kZWwuZ2V0UGx1Z2luQmFzZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gUGFzdGUgYWxsIHNvdXJjZSBvYmplY3RzCisgICAgICAgICAgICBmb3IgKE9iamVjdCBzb3VyY2VPYmplY3QgOiBzb3VyY2VPYmplY3RzKSB7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZU9iamVjdCBpbnN0YW5jZW9mIFBsdWdpbkxpYnJhcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUGx1Z2luIGxpYnJhcnkgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgIFBsdWdpbkxpYnJhcnkgbGlicmFyeSA9IChQbHVnaW5MaWJyYXJ5KSBzb3VyY2VPYmplY3Q7CisgICAgICAgICAgICAgICAgICAgIC8vIEFkanVzdCBhbGwgdGhlIHNvdXJjZSBvYmplY3QgdHJhbnNpZW50IGZpZWxkIHZhbHVlcyB0bworICAgICAgICAgICAgICAgICAgICAvLyBhY2NlcHRhYmxlIHZhbHVlcworICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LnJlY29ubmVjdChtb2RlbCwgcGx1Z2luKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBsaWJyYXJ5IHRvIHRoZSBwbHVnLWluCisgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5hZGQobGlicmFyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFBERVBsdWdpbi5sb2dFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlCi0JICogb3JnLmVjbGlwc2UucGRlLmludGVybmFsLnVpLmVkaXRvci5TdHJ1Y3R1cmVkVmlld2VyU2VjdGlvbiNjYW5QYXN0ZShqYXZhCi0JICogLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0W10pCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUGFzdGUoT2JqZWN0IHRhcmdldE9iamVjdCwgT2JqZWN0W10gc291cmNlT2JqZWN0cykgewotCQlIYXNoU2V0IGxpYnJhcnlTZXQgPSBudWxsOwotCQkvLyBPbmx5IHNvdXJjZSBvYmplY3RzIHRoYXQgYXJlIHBsdWdpbiBsaWJyYXJpZXMgdGhhdCBoYXZlIG5vdCBhbHJlYWR5Ci0JCS8vIGJlZW4gc3BlY2lmaWVkIGNhbiBiZSBwYXN0ZWQKLQkJZm9yIChPYmplY3QgZWxlbWVudCA6IHNvdXJjZU9iamVjdHMpIHsKLQkJCS8vIE9ubHkgcGx1Z2luIGxpYnJhcmllcyBhcmUgYWxsb3dlZAotCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgSVBsdWdpbkxpYnJhcnkpID09IGZhbHNlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJLy8gV2UgaGF2ZSBhIHBsdWdpbiBsaWJyYXJ5Ci0JCQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlicmFyaWVzIGFscmVhZHkgc3BlY2lmaWVkIGFuZCBzdG9yZSB0aGVtIGluCi0JCQkvLyBhIHNldCB0byBhc3Npc3Qgd2l0aCBzZWFyY2hpbmcKLQkJCWlmIChsaWJyYXJ5U2V0ID09IG51bGwpIHsKLQkJCQlsaWJyYXJ5U2V0ID0gY3JlYXRlUGx1Z2luTGlicmFyeVNldCgpOwotCQkJfQotCQkJLy8gTm8gZHVwbGljYXRlIGxpYnJhcmllcyBhcmUgYWxsb3dlZAotCQkJSVBsdWdpbkxpYnJhcnkgbGlicmFyeSA9IChJUGx1Z2luTGlicmFyeSkgZWxlbWVudDsKLQkJCWlmIChsaWJyYXJ5U2V0LmNvbnRhaW5zKG5ldyBQYXRoKENsYXNzcGF0aFV0aWxDb3JlLmV4cGFuZExpYnJhcnlOYW1lKGxpYnJhcnkuZ2V0TmFtZSgpKSkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICAvKgorICAgICAqIChub24tSmF2YWRvYykKKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGRlLmludGVybmFsLnVpLmVkaXRvci5TdHJ1Y3R1cmVkVmlld2VyU2VjdGlvbiNjYW5QYXN0ZShqYXZhIC5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdFtdKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGNhblBhc3RlKE9iamVjdCB0YXJnZXRPYmplY3QsIE9iamVjdFtdIHNvdXJjZU9iamVjdHMpIHsKKyAgICAgICAgSGFzaFNldCBsaWJyYXJ5U2V0ID0gbnVsbDsKKyAgICAgICAgLy8gT25seSBzb3VyY2Ugb2JqZWN0cyB0aGF0IGFyZSBwbHVnaW4gbGlicmFyaWVzIHRoYXQgaGF2ZSBub3QgYWxyZWFkeQorICAgICAgICAvLyBiZWVuIHNwZWNpZmllZCBjYW4gYmUgcGFzdGVkCisgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiBzb3VyY2VPYmplY3RzKSB7CisgICAgICAgICAgICAvLyBPbmx5IHBsdWdpbiBsaWJyYXJpZXMgYXJlIGFsbG93ZWQKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBsdWdpbkxpYnJhcnkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBXZSBoYXZlIGEgcGx1Z2luIGxpYnJhcnkKKyAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBsaWJyYXJpZXMgYWxyZWFkeSBzcGVjaWZpZWQgYW5kIHN0b3JlIHRoZW0gaW4KKyAgICAgICAgICAgIC8vIGEgc2V0IHRvIGFzc2lzdCB3aXRoIHNlYXJjaGluZworICAgICAgICAgICAgaWYgKGxpYnJhcnlTZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxpYnJhcnlTZXQgPSBjcmVhdGVQbHVnaW5MaWJyYXJ5U2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBObyBkdXBsaWNhdGUgbGlicmFyaWVzIGFyZSBhbGxvd2VkCisgICAgICAgICAgICBJUGx1Z2luTGlicmFyeSBsaWJyYXJ5ID0gKElQbHVnaW5MaWJyYXJ5KSBlbGVtZW50OworICAgICAgICAgICAgaWYgKGxpYnJhcnlTZXQuY29udGFpbnMobmV3IFBhdGgoQ2xhc3NwYXRoVXRpbENvcmUuZXhwYW5kTGlicmFyeU5hbWUobGlicmFyeS5nZXROYW1lKCkpKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSGFzaFNldCBjcmVhdGVQbHVnaW5MaWJyYXJ5U2V0KCkgewotCQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlicmFyaWVzIGFuZCBhZGQgdGhlbSB0byBhIHNldCBmb3IgZWFzeSBzZWFyY2hpbmcKLQkJSVBsdWdpbkxpYnJhcnlbXSBsaWJyYXJpZXMgPSBnZXRNb2RlbCgpLmdldFBsdWdpbkJhc2UoKS5nZXRMaWJyYXJpZXMoKTsKLQkJSGFzaFNldCBsaWJyYXJ5U2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJUGx1Z2luTGlicmFyeSBlbGVtZW50IDogbGlicmFyaWVzKSB7Ci0JCQlsaWJyYXJ5U2V0LmFkZChuZXcgUGF0aChDbGFzc3BhdGhVdGlsQ29yZS5leHBhbmRMaWJyYXJ5TmFtZShlbGVtZW50LmdldE5hbWUoKSkpKTsKLQkJfQotCQlyZXR1cm4gbGlicmFyeVNldDsKLQl9CisgICAgLyoqCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByaXZhdGUgSGFzaFNldCBjcmVhdGVQbHVnaW5MaWJyYXJ5U2V0KCkgeworICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbGlicmFyaWVzIGFuZCBhZGQgdGhlbSB0byBhIHNldCBmb3IgZWFzeSBzZWFyY2hpbmcKKyAgICAgICAgSVBsdWdpbkxpYnJhcnlbXSBsaWJyYXJpZXMgPSBnZXRNb2RlbCgpLmdldFBsdWdpbkJhc2UoKS5nZXRMaWJyYXJpZXMoKTsKKyAgICAgICAgSGFzaFNldCBsaWJyYXJ5U2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgZm9yIChJUGx1Z2luTGlicmFyeSBlbGVtZW50IDogbGlicmFyaWVzKSB7CisgICAgICAgICAgICBsaWJyYXJ5U2V0LmFkZChuZXcgUGF0aChDbGFzc3BhdGhVdGlsQ29yZS5leHBhbmRMaWJyYXJ5TmFtZShlbGVtZW50LmdldE5hbWUoKSkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlicmFyeVNldDsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbnRyeU1vZGlmaWVkKE9iamVjdCBlbnRyeSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlJUGx1Z2luTW9kZWxCYXNlIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBtb2RlbC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXRQcm9qZWN0KCk7Ci0JCQlJUGx1Z2luTGlicmFyeSBsaWJyYXJ5ID0gKElQbHVnaW5MaWJyYXJ5KSBlbnRyeTsKLQkJCW1vZGVsLmdldFBsdWdpbkJhc2UoKS5yZW1vdmUobGlicmFyeSk7Ci0JCQlTdHJpbmdbXSBvbGRWYWx1ZSA9IHsgbGlicmFyeS5nZXROYW1lKCkgfTsKLQkJCVN0cmluZ1tdIG5ld1ZhbHVlID0geyB2YWx1ZSB9OwotCQkJbGlicmFyeS5zZXROYW1lKHZhbHVlKTsKLQkJCWJvb2xlYW4gbWVtYmVyRXhpc3RzID0gcHJvamVjdC5maW5kTWVtYmVyKHZhbHVlKSAhPSBudWxsOwotCQkJdXBkYXRlQnVpbGRQcm9wZXJ0aWVzKG9sZFZhbHVlLCBuZXdWYWx1ZSwgIW1lbWJlckV4aXN0cyk7Ci0JCQl1cGRhdGVKYXZhQ2xhc3NwYXRoTGlicyhvbGRWYWx1ZSwgbWVtYmVyRXhpc3RzID8gbmV3VmFsdWUgOiBuZXcgU3RyaW5nW10geyBudWxsIH0pOwotCQkJbW9kZWwuZ2V0UGx1Z2luQmFzZSgpLmFkZChsaWJyYXJ5KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlQREVQbHVnaW4ubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVudHJ5TW9kaWZpZWQoT2JqZWN0IGVudHJ5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElQbHVnaW5Nb2RlbEJhc2UgbW9kZWwgPSBnZXRNb2RlbCgpOworICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IG1vZGVsLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKKyAgICAgICAgICAgIElQbHVnaW5MaWJyYXJ5IGxpYnJhcnkgPSAoSVBsdWdpbkxpYnJhcnkpIGVudHJ5OworICAgICAgICAgICAgbW9kZWwuZ2V0UGx1Z2luQmFzZSgpLnJlbW92ZShsaWJyYXJ5KTsKKyAgICAgICAgICAgIFN0cmluZ1tdIG9sZFZhbHVlID0geyBsaWJyYXJ5LmdldE5hbWUoKSB9OworICAgICAgICAgICAgU3RyaW5nW10gbmV3VmFsdWUgPSB7IHZhbHVlIH07CisgICAgICAgICAgICBsaWJyYXJ5LnNldE5hbWUodmFsdWUpOworICAgICAgICAgICAgYm9vbGVhbiBtZW1iZXJFeGlzdHMgPSBwcm9qZWN0LmZpbmRNZW1iZXIodmFsdWUpICE9IG51bGw7CisgICAgICAgICAgICB1cGRhdGVCdWlsZFByb3BlcnRpZXMob2xkVmFsdWUsIG5ld1ZhbHVlLCAhbWVtYmVyRXhpc3RzKTsKKyAgICAgICAgICAgIHVwZGF0ZUphdmFDbGFzc3BhdGhMaWJzKG9sZFZhbHVlLCBtZW1iZXJFeGlzdHMgPyBuZXdWYWx1ZSA6IG5ldyBTdHJpbmdbXSB7IG51bGwgfSk7CisgICAgICAgICAgICBtb2RlbC5nZXRQbHVnaW5CYXNlKCkuYWRkKGxpYnJhcnkpOworICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFBERVBsdWdpbi5sb2dFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJUGx1Z2luTW9kZWxCYXNlIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKElQbHVnaW5Nb2RlbEJhc2UpIGdldFBhZ2UoKS5nZXRNb2RlbCgpOwotCX0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHJpdmF0ZSBJUGx1Z2luTW9kZWxCYXNlIGdldE1vZGVsKCkgeworICAgICAgICByZXR1cm4gKElQbHVnaW5Nb2RlbEJhc2UpIGdldFBhZ2UoKS5nZXRNb2RlbCgpOworICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZU1hbmlmZXN0RWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZU1hbmlmZXN0RWRpdG9yLmphdmEKaW5kZXggOGE2YTA3Zi4uNjRjODlmZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVNYW5pZmVzdEVkaXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlTWFuaWZlc3RFZGl0b3IuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTg3LDQ0MyArODgsNDM3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBCdW5kbGVNYW5pZmVzdEVkaXRvciBleHRlbmRzIE1hbmlmZXN0RWRpdG9yIHsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEX0VESVRPUiA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuYnVuZGxlbWFuaWZlc3QiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEX0VESVRPUiA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuYnVuZGxlbWFuaWZlc3QiOwogCi0JcHJvdGVjdGVkIGJvb2xlYW4gZkVxdWlub3ggPSB0cnVlOworICAgIHByb3RlY3RlZCBib29sZWFuIGZFcXVpbm94ID0gdHJ1ZTsKIAotCXByb3RlY3RlZCBib29sZWFuIGZTaG93RXh0ZW5zaW9ucyA9IHRydWU7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZlNob3dFeHRlbnNpb25zID0gdHJ1ZTsKIAotCXByb3RlY3RlZCBJRWNsaXBzZVByZWZlcmVuY2VzIGZQcmVmczsKKyAgICBwcm90ZWN0ZWQgSUVjbGlwc2VQcmVmZXJlbmNlcyBmUHJlZnM7CiAKLQlwcm90ZWN0ZWQgTGlzdDxJQnVuZGxlTWFuaWZlc3RTYXZlTGlzdGVuZXI+IHNhdmVMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElCdW5kbGVNYW5pZmVzdFNhdmVMaXN0ZW5lcj4oMyk7CisgICAgcHJvdGVjdGVkIExpc3Q8SUJ1bmRsZU1hbmlmZXN0U2F2ZUxpc3RlbmVyPiBzYXZlTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJQnVuZGxlTWFuaWZlc3RTYXZlTGlzdGVuZXI+KDMpOwogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBwYWdlcyBmb3IgdGhpcyBlZGl0b3IuIFB1YmxpYyBmb3IgdGVzdGluZy4KLQkgKi8KLQlwdWJsaWMgSUVkaXRvclBhcnRbXSBnZXRQYXJ0cygpIHsKLQkJQXJyYXlMaXN0PElFZGl0b3JQYXJ0PiBwYXJ0cyA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclBhcnQ+KGdldFBhZ2VDb3VudCgpKTsKLQkJaWYgKHBhZ2VzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3QgcGFnZSA9IHBhZ2VzLmdldChpKTsKLQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCXBhcnRzLmFkZCgoSUVkaXRvclBhcnQpIHBhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFydHMudG9BcnJheShuZXcgSUVkaXRvclBhcnRbcGFydHMuc2l6ZSgpXSk7Ci0JfQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcGFnZXMgZm9yIHRoaXMgZWRpdG9yLiBQdWJsaWMgZm9yIHRlc3RpbmcuCisgICAgICovCisgICAgcHVibGljIElFZGl0b3JQYXJ0W10gZ2V0UGFydHMoKSB7CisgICAgICAgIEFycmF5TGlzdDxJRWRpdG9yUGFydD4gcGFydHMgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JQYXJ0PihnZXRQYWdlQ291bnQoKSk7CisgICAgICAgIGlmICh0aGlzLnBhZ2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5wYWdlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIE9iamVjdCBwYWdlID0gdGhpcy5wYWdlcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgeworICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hZGQoKElFZGl0b3JQYXJ0KSBwYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcnRzLnRvQXJyYXkobmV3IElFZGl0b3JQYXJ0W3BhcnRzLnNpemUoKV0pOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEVkaXRvclBhZ2VzKCkgewotCQl0cnkgewotCQkJQnVuZGxlT3ZlcnZpZXdQYWdlIG92ZXJ2aWV3UGFnZSA9IG5ldyBCdW5kbGVPdmVydmlld1BhZ2UodGhpcyk7Ci0JCQlhZGRQYWdlKG92ZXJ2aWV3UGFnZSk7Ci0JCQlzYXZlTGlzdGVuZXJzLmFkZChvdmVydmlld1BhZ2UpOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGFkZEVkaXRvclBhZ2VzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnVuZGxlT3ZlcnZpZXdQYWdlIG92ZXJ2aWV3UGFnZSA9IG5ldyBCdW5kbGVPdmVydmlld1BhZ2UodGhpcyk7CisgICAgICAgICAgICBhZGRQYWdlKG92ZXJ2aWV3UGFnZSk7CisgICAgICAgICAgICB0aGlzLnNhdmVMaXN0ZW5lcnMuYWRkKG92ZXJ2aWV3UGFnZSk7CiAKLQkJCUJ1bmRsZURlcGVuZGVuY2llc1BhZ2UgZGVwZW5kZW5jaWVzUGFnZSA9IG5ldyBCdW5kbGVEZXBlbmRlbmNpZXNQYWdlKHRoaXMpOwotCQkJYWRkUGFnZShkZXBlbmRlbmNpZXNQYWdlKTsKLQkJCXNhdmVMaXN0ZW5lcnMuYWRkKGRlcGVuZGVuY2llc1BhZ2UpOworICAgICAgICAgICAgQnVuZGxlRGVwZW5kZW5jaWVzUGFnZSBkZXBlbmRlbmNpZXNQYWdlID0gbmV3IEJ1bmRsZURlcGVuZGVuY2llc1BhZ2UodGhpcyk7CisgICAgICAgICAgICBhZGRQYWdlKGRlcGVuZGVuY2llc1BhZ2UpOworICAgICAgICAgICAgdGhpcy5zYXZlTGlzdGVuZXJzLmFkZChkZXBlbmRlbmNpZXNQYWdlKTsKIAotCQkJQnVuZGxlUnVudGltZVBhZ2UgcnVudGltZVBhZ2UgPSBuZXcgQnVuZGxlUnVudGltZVBhZ2UodGhpcyk7Ci0JCQlhZGRQYWdlKHJ1bnRpbWVQYWdlKTsKLQkJCXNhdmVMaXN0ZW5lcnMuYWRkKHJ1bnRpbWVQYWdlKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJU3RhdHVzSGFuZGxlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJJZGVVaVBsdWdpbi5QTFVHSU5fSUQsICJGYWlsZWQgdG8gY3JlYXRlIGVkaXRvciBwYWdlcyIsIGUpKTsKLQkJfQotCQlhZGRTb3VyY2VQYWdlKEJ1bmRsZUlucHV0Q29udGV4dC5DT05URVhUX0lEKTsKLQl9CisgICAgICAgICAgICBCdW5kbGVSdW50aW1lUGFnZSBydW50aW1lUGFnZSA9IG5ldyBCdW5kbGVSdW50aW1lUGFnZSh0aGlzKTsKKyAgICAgICAgICAgIGFkZFBhZ2UocnVudGltZVBhZ2UpOworICAgICAgICAgICAgdGhpcy5zYXZlTGlzdGVuZXJzLmFkZChydW50aW1lUGFnZSk7CisgICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0YXR1c0hhbmRsZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELCAiRmFpbGVkIHRvIGNyZWF0ZSBlZGl0b3IgcGFnZXMiLCBlKSk7CisgICAgICAgIH0KKyAgICAgICAgYWRkU291cmNlUGFnZShCdW5kbGVJbnB1dENvbnRleHQuQ09OVEVYVF9JRCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBERVNvdXJjZVBhZ2UgY3JlYXRlU291cmNlUGFnZShQREVGb3JtRWRpdG9yIGVkaXRvciwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbnRleHRJZCkgewotCQlpZiAoY29udGV4dElkLmVxdWFscyhCdW5kbGVJbnB1dENvbnRleHQuQ09OVEVYVF9JRCkpIHsKLQkJCXJldHVybiBuZXcgU3ByaW5nQnVuZGxlU291cmNlUGFnZShlZGl0b3IsIHRpdGxlLCBuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlU291cmNlUGFnZShlZGl0b3IsIHRpdGxlLCBuYW1lLCBjb250ZXh0SWQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUERFU291cmNlUGFnZSBjcmVhdGVTb3VyY2VQYWdlKFBERUZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgY29udGV4dElkKSB7CisgICAgICAgIGlmIChjb250ZXh0SWQuZXF1YWxzKEJ1bmRsZUlucHV0Q29udGV4dC5DT05URVhUX0lEKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTcHJpbmdCdW5kbGVTb3VyY2VQYWdlKGVkaXRvciwgdGl0bGUsIG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVTb3VyY2VQYWdlKGVkaXRvciwgdGl0bGUsIG5hbWUsIGNvbnRleHRJZCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVzb3VyY2VDb250ZXh0cyhJbnB1dENvbnRleHRNYW5hZ2VyIG1hbmFnZXIsIElGaWxlRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSUZpbGUgZmlsZSA9IGlucHV0LmdldEZpbGUoKTsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBmaWxlLmdldFBhcmVudCgpOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlc291cmNlQ29udGV4dHMoSW5wdXRDb250ZXh0TWFuYWdlciBtYW5hZ2VyLCBJRmlsZUVkaXRvcklucHV0IGlucHV0KSB7CisgICAgICAgIElGaWxlIGZpbGUgPSBpbnB1dC5nZXRGaWxlKCk7CisgICAgICAgIElDb250YWluZXIgY29udGFpbmVyID0gZmlsZS5nZXRQYXJlbnQoKTsKIAotCQlJRmlsZSBtYW5pZmVzdEZpbGUgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQkJaWYgKG5hbWUuZW5kc1dpdGgoIm1mIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQltYW5pZmVzdEZpbGUgPSBmaWxlOwotCQl9Ci0JCWlmIChtYW5pZmVzdEZpbGUgIT0gbnVsbCAmJiBtYW5pZmVzdEZpbGUuZXhpc3RzKCkpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbiA9IG5ldyBGaWxlRWRpdG9ySW5wdXQobWFuaWZlc3RGaWxlKTsKLQkJCW1hbmFnZXIucHV0Q29udGV4dChpbiwgbmV3IFNwcmluZ0J1bmRsZUlucHV0Q29udGV4dCh0aGlzLCBpbiwgZmlsZSA9PSBtYW5pZmVzdEZpbGUpKTsKLQkJfQotCQltYW5hZ2VyLm1vbml0b3JGaWxlKG1hbmlmZXN0RmlsZSk7CisgICAgICAgIElGaWxlIG1hbmlmZXN0RmlsZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOworICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgibWYiKSkgeyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgSUZvbGRlcikgeworICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lci5nZXRQYXJlbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hbmlmZXN0RmlsZSA9IGZpbGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hbmlmZXN0RmlsZSAhPSBudWxsICYmIG1hbmlmZXN0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgSUVkaXRvcklucHV0IGluID0gbmV3IEZpbGVFZGl0b3JJbnB1dChtYW5pZmVzdEZpbGUpOworICAgICAgICAgICAgbWFuYWdlci5wdXRDb250ZXh0KGluLCBuZXcgU3ByaW5nQnVuZGxlSW5wdXRDb250ZXh0KHRoaXMsIGluLCBmaWxlID09IG1hbmlmZXN0RmlsZSkpOworICAgICAgICB9CisgICAgICAgIG1hbmFnZXIubW9uaXRvckZpbGUobWFuaWZlc3RGaWxlKTsKIAotCQlmUHJlZnMgPSBuZXcgUHJvamVjdFNjb3BlKGNvbnRhaW5lci5nZXRQcm9qZWN0KCkpLmdldE5vZGUoUERFQ29yZS5QTFVHSU5fSUQpOwotCQlpZiAoZlByZWZzICE9IG51bGwpIHsKLQkJCWZTaG93RXh0ZW5zaW9ucyA9IGZQcmVmcy5nZXRCb29sZWFuKElDb3JlQ29uc3RhbnRzLkVYVEVOU0lPTlNfUFJPUEVSVFksIHRydWUpOwotCQkJZkVxdWlub3ggPSBmUHJlZnMuZ2V0Qm9vbGVhbihJQ29yZUNvbnN0YW50cy5FUVVJTk9YX1BST1BFUlRZLCB0cnVlKTsKLQkJfQotCX0KKyAgICAgICAgdGhpcy5mUHJlZnMgPSBuZXcgUHJvamVjdFNjb3BlKGNvbnRhaW5lci5nZXRQcm9qZWN0KCkpLmdldE5vZGUoUERFQ29yZS5QTFVHSU5fSUQpOworICAgICAgICBpZiAodGhpcy5mUHJlZnMgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5mU2hvd0V4dGVuc2lvbnMgPSB0aGlzLmZQcmVmcy5nZXRCb29sZWFuKElDb3JlQ29uc3RhbnRzLkVYVEVOU0lPTlNfUFJPUEVSVFksIHRydWUpOworICAgICAgICAgICAgdGhpcy5mRXF1aW5veCA9IHRoaXMuZlByZWZzLmdldEJvb2xlYW4oSUNvcmVDb25zdGFudHMuRVFVSU5PWF9QUk9QRVJUWSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN1cGVyLmRvU2F2ZShtb25pdG9yKTsKLQkJZm9yIChJQnVuZGxlTWFuaWZlc3RTYXZlTGlzdGVuZXIgY3Vyckxpc3RlbmVyIDogdGhpcy5zYXZlTGlzdGVuZXJzKSB7Ci0JCQljdXJyTGlzdGVuZXIubWFuaWZlc3RTYXZlZCgpOwotCQl9Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKyAgICAgICAgc3VwZXIuZG9TYXZlKG1vbml0b3IpOworICAgICAgICBmb3IgKElCdW5kbGVNYW5pZmVzdFNhdmVMaXN0ZW5lciBjdXJyTGlzdGVuZXIgOiB0aGlzLnNhdmVMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGN1cnJMaXN0ZW5lci5tYW5pZmVzdFNhdmVkKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWlub3goKSB7Ci0JCXJldHVybiBmRXF1aW5veDsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNFcXVpbm94KCkgeworICAgICAgICByZXR1cm4gdGhpcy5mRXF1aW5veDsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBtb25pdG9yZWRGaWxlQWRkZWQoSUZpbGUgZmlsZSkgewotCQlpZiAoZklucHV0Q29udGV4dE1hbmFnZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoQnVuZGxlTW9kZWxVdGlsaXR5LkZfTUFOSUZFU1QpKSB7Ci0JCQlpZiAoIWZJbnB1dENvbnRleHRNYW5hZ2VyLmhhc0NvbnRleHQoQnVuZGxlSW5wdXRDb250ZXh0LkNPTlRFWFRfSUQpKSB7Ci0JCQkJSUVkaXRvcklucHV0IGluID0gbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKTsKLQkJCQlmSW5wdXRDb250ZXh0TWFuYWdlci5wdXRDb250ZXh0KGluLCBuZXcgU3ByaW5nQnVuZGxlSW5wdXRDb250ZXh0KHRoaXMsIGluLCBmYWxzZSkpOwotCQkJfQotCQl9Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG1vbml0b3JlZEZpbGVBZGRlZChJRmlsZSBmaWxlKSB7CisgICAgICAgIGlmICh0aGlzLmZJbnB1dENvbnRleHRNYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOworICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJ1bmRsZU1vZGVsVXRpbGl0eS5GX01BTklGRVNUKSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLmZJbnB1dENvbnRleHRNYW5hZ2VyLmhhc0NvbnRleHQoQnVuZGxlSW5wdXRDb250ZXh0LkNPTlRFWFRfSUQpKSB7CisgICAgICAgICAgICAgICAgSUVkaXRvcklucHV0IGluID0gbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZJbnB1dENvbnRleHRNYW5hZ2VyLnB1dENvbnRleHQoaW4sIG5ldyBTcHJpbmdCdW5kbGVJbnB1dENvbnRleHQodGhpcywgaW4sIGZhbHNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBDb3B5IG9mIHN1cGVyIG1ldGhvZCB3aXRoIHdvcmstYXJvdW5kIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBFY2xpcHNlIDMuNCBhbmQgMy41LgotCSAqIAotCSAqIEBzZWUgI2NyZWF0ZVN5c3RlbUZpbGVDb250ZXh0cyhJbnB1dENvbnRleHRNYW5hZ2VyLCBJRWRpdG9ySW5wdXQpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSW5wdXRDb250ZXh0cyhJbnB1dENvbnRleHRNYW5hZ2VyIGNvbnRleHRNYW5hZ2VyKSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCS8vIHJlc291cmNlIC0gZmluZCB0aGUgcHJvamVjdAotCQkJY3JlYXRlUmVzb3VyY2VDb250ZXh0cyhjb250ZXh0TWFuYWdlciwgKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KTsKLQkJfSBlbHNlIGlmIChQZGVDb21wYXRpYmlsaXR5VXRpbC5pc1N5c3RlbUZpbGVFZGl0b3JJbnB1dChpbnB1dCkpIHsKLQkJCS8vIHN5c3RlbSBmaWxlIC0gZmluZCB0aGUgZmlsZSBzeXN0ZW0gZm9sZGVyCi0JCQljcmVhdGVTeXN0ZW1GaWxlQ29udGV4dHMoY29udGV4dE1hbmFnZXIsIGlucHV0KTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCWNyZWF0ZVN0b3JhZ2VDb250ZXh0cyhjb250ZXh0TWFuYWdlciwgKElTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElVUklFZGl0b3JJbnB1dCkgewotCQkJSVVSSUVkaXRvcklucHV0IHVyaUVkaXRvcklucHV0ID0gKElVUklFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCQl0cnkgewotCQkJCUlGaWxlU3RvcmUgc3RvcmUgPSBFRlMuZ2V0U3RvcmUodXJpRWRpdG9ySW5wdXQuZ2V0VVJJKCkpOwotCQkJCWlmICghRUZTLlNDSEVNRV9GSUxFLmVxdWFscyhzdG9yZS5nZXRGaWxlU3lzdGVtKCkuZ2V0U2NoZW1lKCkpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJSUVkaXRvcklucHV0IHNpbnB1dCA9IFBkZUNvbXBhdGliaWxpdHlVdGlsLmNyZWF0ZVN5c3RlbUZpbGVFZGl0b3JJbnB1dCh1cmlFZGl0b3JJbnB1dCk7Ci0JCQkJaWYgKHNpbnB1dCA9PSBudWxsKSB7Ci0JCQkJCS8vIEVjbGlwc2UgMy41IG9yIGxhdGVyCi0JCQkJCXNpbnB1dCA9IG5ldyBGaWxlU3RvcmVFZGl0b3JJbnB1dChzdG9yZSk7Ci0JCQkJfQotCQkJCWNyZWF0ZVN5c3RlbUZpbGVDb250ZXh0cyhjb250ZXh0TWFuYWdlciwgc2lucHV0KTsKLQkJCX0KKyAgICAvKioKKyAgICAgKiBDb3B5IG9mIHN1cGVyIG1ldGhvZCB3aXRoIHdvcmstYXJvdW5kIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBFY2xpcHNlIDMuNCBhbmQgMy41LgorICAgICAqCisgICAgICogQHNlZSAjY3JlYXRlU3lzdGVtRmlsZUNvbnRleHRzKElucHV0Q29udGV4dE1hbmFnZXIsIElFZGl0b3JJbnB1dCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVJbnB1dENvbnRleHRzKElucHV0Q29udGV4dE1hbmFnZXIgY29udGV4dE1hbmFnZXIpIHsKKyAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKKyAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgeworICAgICAgICAgICAgLy8gcmVzb3VyY2UgLSBmaW5kIHRoZSBwcm9qZWN0CisgICAgICAgICAgICBjcmVhdGVSZXNvdXJjZUNvbnRleHRzKGNvbnRleHRNYW5hZ2VyLCAoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpOworICAgICAgICB9IGVsc2UgaWYgKFBkZUNvbXBhdGliaWxpdHlVdGlsLmlzU3lzdGVtRmlsZUVkaXRvcklucHV0KGlucHV0KSkgeworICAgICAgICAgICAgLy8gc3lzdGVtIGZpbGUgLSBmaW5kIHRoZSBmaWxlIHN5c3RlbSBmb2xkZXIKKyAgICAgICAgICAgIGNyZWF0ZVN5c3RlbUZpbGVDb250ZXh0cyhjb250ZXh0TWFuYWdlciwgaW5wdXQpOworICAgICAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgeworICAgICAgICAgICAgY3JlYXRlU3RvcmFnZUNvbnRleHRzKGNvbnRleHRNYW5hZ2VyLCAoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgaW5wdXQpOworICAgICAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSVVSSUVkaXRvcklucHV0KSB7CisgICAgICAgICAgICBJVVJJRWRpdG9ySW5wdXQgdXJpRWRpdG9ySW5wdXQgPSAoSVVSSUVkaXRvcklucHV0KSBpbnB1dDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSUZpbGVTdG9yZSBzdG9yZSA9IEVGUy5nZXRTdG9yZSh1cmlFZGl0b3JJbnB1dC5nZXRVUkkoKSk7CisgICAgICAgICAgICAgICAgaWYgKCFFRlMuU0NIRU1FX0ZJTEUuZXF1YWxzKHN0b3JlLmdldEZpbGVTeXN0ZW0oKS5nZXRTY2hlbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJRWRpdG9ySW5wdXQgc2lucHV0ID0gUGRlQ29tcGF0aWJpbGl0eVV0aWwuY3JlYXRlU3lzdGVtRmlsZUVkaXRvcklucHV0KHVyaUVkaXRvcklucHV0KTsKKyAgICAgICAgICAgICAgICBpZiAoc2lucHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRWNsaXBzZSAzLjUgb3IgbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgc2lucHV0ID0gbmV3IEZpbGVTdG9yZUVkaXRvcklucHV0KHN0b3JlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3JlYXRlU3lzdGVtRmlsZUNvbnRleHRzKGNvbnRleHRNYW5hZ2VyLCBzaW5wdXQpOworICAgICAgICAgICAgfQogCi0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFRoZSBzaWduYXR1cmUgb2YgY3JlYXRlU3lzdGVtRmlsZUNvbnRleHRzKCkgaGFzIGNoYW5nZWQgYmV0d2VlbiBFY2xpcHNlIDMuNCBhbmQgMy41LiBUaGlzIG1ldGhvZCBzZXJ2ZXMgYXMgYQotCSAqIHdvcmstYXJvdW5kIHdpdGggYSBtb3JlIGdlbmVyaWMgc2lnbmF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgZWl0aGVyIGEgU3lzdGVtRmlsZUVkaXRvcklucHV0IG9yIEZpbGVTdG9yZUVkaXRvcklucHV0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3lzdGVtRmlsZUNvbnRleHRzKElucHV0Q29udGV4dE1hbmFnZXIgbWFuYWdlciwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUZpbGUgZmlsZSA9IChGaWxlKSBpbnB1dC5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwotCQlpZiAoZmlsZSA9PSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRmlsZVN0b3JlRWRpdG9ySW5wdXQpIHsKLQkJCWZpbGUgPSBuZXcgRmlsZSgoKElVUklFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFVSSSgpKTsKLQkJfQotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRmlsZSBtYW5pZmVzdEZpbGUgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgibWFuaWZlc3QubWYiKSkgeyAvLyROT04tTkxTLTEkCi0JCQltYW5pZmVzdEZpbGUgPSBmaWxlOwotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAobWFuaWZlc3RGaWxlICE9IG51bGwgJiYgbWFuaWZlc3RGaWxlLmV4aXN0cygpKSB7Ci0JCQkJSUVkaXRvcklucHV0IGluID0gUGRlQ29tcGF0aWJpbGl0eVV0aWwuY3JlYXRlU3lzdGVtRmlsZUVkaXRvcklucHV0KG1hbmlmZXN0RmlsZSk7Ci0JCQkJaWYgKGluID09IG51bGwpIHsKLQkJCQkJLy8gRWNsaXBzZSAzLjUgb3IgbGF0ZXIKLQkJCQkJSUZpbGVTdG9yZSBzdG9yZSA9IEVGUy5nZXRTdG9yZShtYW5pZmVzdEZpbGUudG9VUkkoKSk7Ci0JCQkJCWluID0gbmV3IEZpbGVTdG9yZUVkaXRvcklucHV0KHN0b3JlKTsKLQkJCQl9Ci0JCQkJbWFuYWdlci5wdXRDb250ZXh0KGluLCBuZXcgU3ByaW5nQnVuZGxlSW5wdXRDb250ZXh0KHRoaXMsIGluLCBmaWxlID09IG1hbmlmZXN0RmlsZSkpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVBERVBsdWdpbi5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogVGhlIHNpZ25hdHVyZSBvZiBjcmVhdGVTeXN0ZW1GaWxlQ29udGV4dHMoKSBoYXMgY2hhbmdlZCBiZXR3ZWVuIEVjbGlwc2UgMy40IGFuZCAzLjUuIFRoaXMgbWV0aG9kIHNlcnZlcyBhcyBhCisgICAgICogd29yay1hcm91bmQgd2l0aCBhIG1vcmUgZ2VuZXJpYyBzaWduYXR1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXQgZWl0aGVyIGEgU3lzdGVtRmlsZUVkaXRvcklucHV0IG9yIEZpbGVTdG9yZUVkaXRvcklucHV0CisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3lzdGVtRmlsZUNvbnRleHRzKElucHV0Q29udGV4dE1hbmFnZXIgbWFuYWdlciwgSUVkaXRvcklucHV0IGlucHV0KSB7CisgICAgICAgIEZpbGUgZmlsZSA9IGlucHV0LmdldEFkYXB0ZXIoRmlsZS5jbGFzcyk7CisgICAgICAgIGlmIChmaWxlID09IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBGaWxlU3RvcmVFZGl0b3JJbnB1dCkgeworICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCgoSVVSSUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0VVJJKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOworICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJtYW5pZmVzdC5tZiIpKSB7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIG1hbmlmZXN0RmlsZSA9IGZpbGU7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChtYW5pZmVzdEZpbGUgIT0gbnVsbCAmJiBtYW5pZmVzdEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBJRWRpdG9ySW5wdXQgaW4gPSBQZGVDb21wYXRpYmlsaXR5VXRpbC5jcmVhdGVTeXN0ZW1GaWxlRWRpdG9ySW5wdXQobWFuaWZlc3RGaWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBFY2xpcHNlIDMuNSBvciBsYXRlcgorICAgICAgICAgICAgICAgICAgICBJRmlsZVN0b3JlIHN0b3JlID0gRUZTLmdldFN0b3JlKG1hbmlmZXN0RmlsZS50b1VSSSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaW4gPSBuZXcgRmlsZVN0b3JlRWRpdG9ySW5wdXQoc3RvcmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtYW5hZ2VyLnB1dENvbnRleHQoaW4sIG5ldyBTcHJpbmdCdW5kbGVJbnB1dENvbnRleHQodGhpcywgaW4sIGZpbGUgPT0gbWFuaWZlc3RGaWxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgUERFUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVN0b3JhZ2VDb250ZXh0cyhJbnB1dENvbnRleHRNYW5hZ2VyIG1hbmFnZXIsIElTdG9yYWdlRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSmFyRW50cnlFZGl0b3JJbnB1dCkgewotCQkJY3JlYXRlSmFyRW50cnlDb250ZXh0cyhtYW5hZ2VyLCAoSmFyRW50cnlFZGl0b3JJbnB1dCkgaW5wdXQpOwotCQkJcmV0dXJuOwotCQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3RvcmFnZUNvbnRleHRzKElucHV0Q29udGV4dE1hbmFnZXIgbWFuYWdlciwgSVN0b3JhZ2VFZGl0b3JJbnB1dCBpbnB1dCkgeworICAgICAgICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBKYXJFbnRyeUVkaXRvcklucHV0KSB7CisgICAgICAgICAgICBjcmVhdGVKYXJFbnRyeUNvbnRleHRzKG1hbmFnZXIsIChKYXJFbnRyeUVkaXRvcklucHV0KSBpbnB1dCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotCQlTdHJpbmcgbmFtZSA9IGlucHV0LmdldE5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoIm1hbmlmZXN0Lm1mIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJbWFuYWdlci5wdXRDb250ZXh0KGlucHV0LCBuZXcgU3ByaW5nQnVuZGxlSW5wdXRDb250ZXh0KHRoaXMsIGlucHV0LCB0cnVlKSk7Ci0JCX0KLQl9CisgICAgICAgIFN0cmluZyBuYW1lID0gaW5wdXQuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKKyAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgibWFuaWZlc3QubWYiKSkgeyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICBtYW5hZ2VyLnB1dENvbnRleHQoaW5wdXQsIG5ldyBTcHJpbmdCdW5kbGVJbnB1dENvbnRleHQodGhpcywgaW5wdXQsIHRydWUpKTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUphckVudHJ5Q29udGV4dHMoSW5wdXRDb250ZXh0TWFuYWdlciBtYW5hZ2VyLCBKYXJFbnRyeUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlTdG9yYWdlIHN0b3JhZ2UgPSBpbnB1dC5nZXRTdG9yYWdlKCk7Ci0JCVppcEZpbGUgemlwID0gKFppcEZpbGUpIHN0b3JhZ2UuZ2V0QWRhcHRlcihaaXBGaWxlLmNsYXNzKTsKLQkJdHJ5IHsKLQkJCWlmICh6aXAgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVKYXJFbnRyeUNvbnRleHRzKElucHV0Q29udGV4dE1hbmFnZXIgbWFuYWdlciwgSmFyRW50cnlFZGl0b3JJbnB1dCBpbnB1dCkgeworICAgICAgICBJU3RvcmFnZSBzdG9yYWdlID0gaW5wdXQuZ2V0U3RvcmFnZSgpOworICAgICAgICBaaXBGaWxlIHppcCA9IHN0b3JhZ2UuZ2V0QWRhcHRlcihaaXBGaWxlLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh6aXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAotCQkJaWYgKHppcC5nZXRFbnRyeSgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnB1dCA9IG5ldyBKYXJFbnRyeUVkaXRvcklucHV0KG5ldyBKYXJFbnRyeUZpbGUoemlwLCAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQltYW5hZ2VyLnB1dENvbnRleHQoCi0JCQkJCQlpbnB1dCwKLQkJCQkJCW5ldyBTcHJpbmdCdW5kbGVJbnB1dENvbnRleHQodGhpcywgaW5wdXQsIHN0b3JhZ2UuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQkJQnVuZGxlTW9kZWxVdGlsaXR5LkZfTUFOSUZFU1QpKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmICh6aXAgIT0gbnVsbCkgewotCQkJCQl6aXAuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICBpZiAoemlwLmdldEVudHJ5KCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIGlucHV0ID0gbmV3IEphckVudHJ5RWRpdG9ySW5wdXQobmV3IEphckVudHJ5RmlsZSh6aXAsICJNRVRBLUlORi9NQU5JRkVTVC5NRiIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIG1hbmFnZXIucHV0Q29udGV4dChpbnB1dCwgbmV3IFNwcmluZ0J1bmRsZUlucHV0Q29udGV4dCh0aGlzLCBpbnB1dCwgc3RvcmFnZS5nZXROYW1lKCkuZXF1YWxzKEJ1bmRsZU1vZGVsVXRpbGl0eS5GX01BTklGRVNUKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoemlwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgemlwLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2hvd0V4dGVuc2lvbnMoYm9vbGVhbiBzaG93KSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZQcmVmcyAhPSBudWxsKSB7Ci0JCQlmUHJlZnMucHV0Qm9vbGVhbihJQ29yZUNvbnN0YW50cy5FWFRFTlNJT05TX1BST1BFUlRZLCBzaG93KTsKLQkJCWZQcmVmcy5mbHVzaCgpOwotCQl9Ci0JCWZTaG93RXh0ZW5zaW9ucyA9IHNob3c7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFNob3dFeHRlbnNpb25zKGJvb2xlYW4gc2hvdykgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0aGlzLmZQcmVmcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmZQcmVmcy5wdXRCb29sZWFuKElDb3JlQ29uc3RhbnRzLkVYVEVOU0lPTlNfUFJPUEVSVFksIHNob3cpOworICAgICAgICAgICAgdGhpcy5mUHJlZnMuZmx1c2goKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmZTaG93RXh0ZW5zaW9ucyA9IHNob3c7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gc2hvd0V4dGVuc2lvblRhYnMoKSB7Ci0JCWlmIChmSW5wdXRDb250ZXh0TWFuYWdlci5oYXNDb250ZXh0KFBsdWdpbklucHV0Q29udGV4dC5DT05URVhUX0lEKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJSUJhc2VNb2RlbCBtb2RlbCA9IGdldEFnZ3JlZ2F0ZU1vZGVsKCk7Ci0JCXJldHVybiBmU2hvd0V4dGVuc2lvbnMgJiYgbW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5pc0VkaXRhYmxlKCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHNob3dFeHRlbnNpb25UYWJzKCkgeworICAgICAgICBpZiAodGhpcy5mSW5wdXRDb250ZXh0TWFuYWdlci5oYXNDb250ZXh0KFBsdWdpbklucHV0Q29udGV4dC5DT05URVhUX0lEKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgSUJhc2VNb2RlbCBtb2RlbCA9IGdldEFnZ3JlZ2F0ZU1vZGVsKCk7CisgICAgICAgIHJldHVybiB0aGlzLmZTaG93RXh0ZW5zaW9ucyAmJiBtb2RlbCAhPSBudWxsICYmIG1vZGVsLmlzRWRpdGFibGUoKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlJUGx1Z2luTW9kZWxCYXNlIG1vZGVsID0gKElQbHVnaW5Nb2RlbEJhc2UpIGdldEFnZ3JlZ2F0ZU1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsIHx8ICFtb2RlbC5pc1ZhbGlkKCkpIHsKLQkJCXJldHVybiBzdXBlci5nZXRUaXRsZSgpOwotCQl9Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0VGl0bGVUZXh0KG1vZGVsKTsKLQkJaWYgKHRleHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFRpdGxlKCk7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsLmdldFJlc291cmNlU3RyaW5nKHRleHQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgeworICAgICAgICBJUGx1Z2luTW9kZWxCYXNlIG1vZGVsID0gKElQbHVnaW5Nb2RlbEJhc2UpIGdldEFnZ3JlZ2F0ZU1vZGVsKCk7CisgICAgICAgIGlmIChtb2RlbCA9PSBudWxsIHx8ICFtb2RlbC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRUaXRsZSgpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyB0ZXh0ID0gZ2V0VGl0bGVUZXh0KG1vZGVsKTsKKyAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRpdGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1vZGVsLmdldFJlc291cmNlU3RyaW5nKHRleHQpOworICAgIH0KIAotCXByaXZhdGUgU3RyaW5nIGdldFRpdGxlVGV4dChJUGx1Z2luTW9kZWxCYXNlIG1vZGVsKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQREVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlTdHJpbmcgcHJlZiA9IHN0b3JlLmdldFN0cmluZyhJUHJlZmVyZW5jZUNvbnN0YW50cy5QUk9QX1NIT1dfT0JKRUNUUyk7CisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGl0bGVUZXh0KElQbHVnaW5Nb2RlbEJhc2UgbW9kZWwpIHsKKyAgICAgICAgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CisgICAgICAgIFN0cmluZyBwcmVmID0gc3RvcmUuZ2V0U3RyaW5nKElQcmVmZXJlbmNlQ29uc3RhbnRzLlBST1BfU0hPV19PQkpFQ1RTKTsKIAotCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCi0JCWlmIChtb2RlbC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlpZiAobW9kZWwuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0TmFtZSgpLmVxdWFscygiVEVTVC5NRiIpKSB7Ci0JCQkJYnVpbGRlci5hcHBlbmQoInRlc3Q6ICIpOwotCQkJfSBlbHNlIGlmIChtb2RlbC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKS5nZXROYW1lKCkuZXF1YWxzKCJ0ZW1wbGF0ZS5tZiIpKSB7Ci0JCQkJYnVpbGRlci5hcHBlbmQoInRlbXBsYXRlOiAiKTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAobW9kZWwuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKG1vZGVsLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldE5hbWUoKS5lcXVhbHMoIlRFU1QuTUYiKSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ0ZXN0OiAiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZWwuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCkuZ2V0TmFtZSgpLmVxdWFscygidGVtcGxhdGUubWYiKSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJ0ZW1wbGF0ZTogIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAoRmFjZXRVdGlscy5pc1BhclByb2plY3QoZ2V0Q29tbW9uUHJvamVjdCgpKSkgewotCQkJQnVuZGxlSW5wdXRDb250ZXh0IGNvbnRleHQgPSAoQnVuZGxlSW5wdXRDb250ZXh0KSBnZXRDb250ZXh0TWFuYWdlcigpLmZpbmRDb250ZXh0KAotCQkJCQlCdW5kbGVJbnB1dENvbnRleHQuQ09OVEVYVF9JRCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJSUJ1bmRsZU1vZGVsIGJ1bmRsZU1vZGVsID0gKElCdW5kbGVNb2RlbCkgY29udGV4dC5nZXRNb2RlbCgpOwotCQkJCWlmIChwcmVmICE9IG51bGwgJiYgcHJlZi5lcXVhbHMoSVByZWZlcmVuY2VDb25zdGFudHMuVkFMVUVfVVNFX05BTUVTKSkgewotCQkJCQlidWlsZGVyLmFwcGVuZChidW5kbGVNb2RlbC5nZXRCdW5kbGUoKS5nZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5QQVJfTkFNRSkpOwotCQkJCX0KLQkJCQlidWlsZGVyLmFwcGVuZChidW5kbGVNb2RlbC5nZXRCdW5kbGUoKS5nZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5QQVJfU1lNQk9MSUNOQU1FKSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKEZhY2V0VXRpbHMuaXNQYXJQcm9qZWN0KGdldENvbW1vblByb2plY3QoKSkpIHsKKyAgICAgICAgICAgIEJ1bmRsZUlucHV0Q29udGV4dCBjb250ZXh0ID0gKEJ1bmRsZUlucHV0Q29udGV4dCkgZ2V0Q29udGV4dE1hbmFnZXIoKS5maW5kQ29udGV4dChCdW5kbGVJbnB1dENvbnRleHQuQ09OVEVYVF9JRCk7CisgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSUJ1bmRsZU1vZGVsIGJ1bmRsZU1vZGVsID0gKElCdW5kbGVNb2RlbCkgY29udGV4dC5nZXRNb2RlbCgpOworICAgICAgICAgICAgICAgIGlmIChwcmVmICE9IG51bGwgJiYgcHJlZi5lcXVhbHMoSVByZWZlcmVuY2VDb25zdGFudHMuVkFMVUVfVVNFX05BTUVTKSkgeworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidW5kbGVNb2RlbC5nZXRCdW5kbGUoKS5nZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5QQVJfTkFNRSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChidW5kbGVNb2RlbC5nZXRCdW5kbGUoKS5nZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5QQVJfU1lNQk9MSUNOQU1FKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAocHJlZiAhPSBudWxsICYmIHByZWYuZXF1YWxzKElQcmVmZXJlbmNlQ29uc3RhbnRzLlZBTFVFX1VTRV9OQU1FUykKLQkJCQkmJiBtb2RlbC5nZXRQbHVnaW5CYXNlKCkuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCWJ1aWxkZXIuYXBwZW5kKG1vZGVsLmdldFBsdWdpbkJhc2UoKS5nZXROYW1lKCkpOwotCQl9Ci0JCWlmIChtb2RlbC5nZXRQbHVnaW5CYXNlKCkuZ2V0SWQoKSAhPSBudWxsKSB7Ci0JCQlidWlsZGVyLmFwcGVuZChtb2RlbC5nZXRQbHVnaW5CYXNlKCkuZ2V0SWQoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLQl9CisgICAgICAgIGlmIChwcmVmICE9IG51bGwgJiYgcHJlZi5lcXVhbHMoSVByZWZlcmVuY2VDb25zdGFudHMuVkFMVUVfVVNFX05BTUVTKSAmJiBtb2RlbC5nZXRQbHVnaW5CYXNlKCkuZ2V0TmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG1vZGVsLmdldFBsdWdpbkJhc2UoKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtb2RlbC5nZXRQbHVnaW5CYXNlKCkuZ2V0SWQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChtb2RlbC5nZXRQbHVnaW5CYXNlKCkuZ2V0SWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVNvcnRhYmxlQ29udGVudE91dGxpbmVQYWdlIGNyZWF0ZUNvbnRlbnRPdXRsaW5lKCkgewotCQlyZXR1cm4gbmV3IEJ1bmRsZU1hbmlmZXN0T3V0bGluZVBhZ2UodGhpcyk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBJU29ydGFibGVDb250ZW50T3V0bGluZVBhZ2UgY3JlYXRlQ29udGVudE91dGxpbmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVuZGxlTWFuaWZlc3RPdXRsaW5lUGFnZSh0aGlzKTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5CdW5kbGVFZGl0b3IoU3RyaW5nIGJ1bmRsZSwgU3RyaW5nIHZlcnNpb24sIElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG9wZW5QbHVnaW5FZGl0b3IoUmVwb3NpdG9yeVV0aWxzLmdldEJ1bmRsZURlZmluaXRpb24oYnVuZGxlLCB2ZXJzaW9uLCBwcm9qZWN0KSk7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkJ1bmRsZUVkaXRvcihTdHJpbmcgYnVuZGxlLCBTdHJpbmcgdmVyc2lvbiwgSVByb2plY3QgcHJvamVjdCkgeworICAgICAgICByZXR1cm4gb3BlblBsdWdpbkVkaXRvcihSZXBvc2l0b3J5VXRpbHMuZ2V0QnVuZGxlRGVmaW5pdGlvbihidW5kbGUsIHZlcnNpb24sIHByb2plY3QpKTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5QbHVnaW5FZGl0b3IoQnVuZGxlRGVmaW5pdGlvbiBidW5kbGVEZWZpbml0aW9uKSB7Ci0JCWlmIChidW5kbGVEZWZpbml0aW9uID09IG51bGwpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmJlZXAoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBvcGVuUGx1Z2luRWRpdG9yKGJ1bmRsZURlZmluaXRpb24sIGZhbHNlKTsKLQl9CisgICAgcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuUGx1Z2luRWRpdG9yKEJ1bmRsZURlZmluaXRpb24gYnVuZGxlRGVmaW5pdGlvbikgeworICAgICAgICBpZiAoYnVuZGxlRGVmaW5pdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5iZWVwKCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3BlblBsdWdpbkVkaXRvcihidW5kbGVEZWZpbml0aW9uLCBmYWxzZSk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuUGx1Z2luRWRpdG9yKE9iamVjdCBvYmplY3QsIGJvb2xlYW4gc291cmNlKSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCdW5kbGVEZWZpbml0aW9uKSB7Ci0JCQlVUkkgZmlsZSA9ICgoQnVuZGxlRGVmaW5pdGlvbikgb2JqZWN0KS5nZXRMb2NhdGlvbigpOwotCQkJcmV0dXJuIG9wZW5FeHRlcm5hbFBsdWdpbihuZXcgRmlsZShmaWxlKSwgIk1FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIHB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlblBsdWdpbkVkaXRvcihPYmplY3Qgb2JqZWN0LCBib29sZWFuIHNvdXJjZSkgeworICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQnVuZGxlRGVmaW5pdGlvbikgeworICAgICAgICAgICAgVVJJIGZpbGUgPSAoKEJ1bmRsZURlZmluaXRpb24pIG9iamVjdCkuZ2V0TG9jYXRpb24oKTsKKyAgICAgICAgICAgIHJldHVybiBvcGVuRXh0ZXJuYWxQbHVnaW4obmV3IEZpbGUoZmlsZSksICJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCS8vIHByaXZhdGUgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5Xb3Jrc3BhY2VQbHVnaW4oSUZpbGUgcGx1Z2luRmlsZSkgewotCS8vIHJldHVybiBvcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQocGx1Z2luRmlsZSkpOwotCS8vIH0KKyAgICAvLyBwcml2YXRlIHN0YXRpYyBJRWRpdG9yUGFydCBvcGVuV29ya3NwYWNlUGx1Z2luKElGaWxlIHBsdWdpbkZpbGUpIHsKKyAgICAvLyByZXR1cm4gb3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KHBsdWdpbkZpbGUpKTsKKyAgICAvLyB9CiAKLQlwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5FeHRlcm5hbFBsdWdpbihGaWxlIGxvY2F0aW9uLCBTdHJpbmcgZmlsZW5hbWUpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gbnVsbDsKLQkJaWYgKGxvY2F0aW9uLmlzRmlsZSgpKSB7Ci0JCQl0cnkgewotCQkJCVppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGxvY2F0aW9uKTsKLQkJCQlpZiAoemlwRmlsZS5nZXRFbnRyeShmaWxlbmFtZSkgIT0gbnVsbCkgewotCQkJCQlpbnB1dCA9IG5ldyBKYXJFbnRyeUVkaXRvcklucHV0KG5ldyBKYXJFbnRyeUZpbGUoemlwRmlsZSwgZmlsZW5hbWUpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShsb2NhdGlvbiwgZmlsZW5hbWUpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlJRmlsZVN0b3JlIHN0b3JlOwotCQkJCXRyeSB7Ci0JCQkJCXN0b3JlID0gRUZTLmdldFN0b3JlKGZpbGUudG9VUkkoKSk7Ci0JCQkJCWlucHV0ID0gbmV3IEZpbGVTdG9yZUVkaXRvcklucHV0KHN0b3JlKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9wZW5FZGl0b3IoaW5wdXQpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5FeHRlcm5hbFBsdWdpbihGaWxlIGxvY2F0aW9uLCBTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgSUVkaXRvcklucHV0IGlucHV0ID0gbnVsbDsKKyAgICAgICAgaWYgKGxvY2F0aW9uLmlzRmlsZSgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoemlwRmlsZS5nZXRFbnRyeShmaWxlbmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IG5ldyBKYXJFbnRyeUVkaXRvcklucHV0KG5ldyBKYXJFbnRyeUZpbGUoemlwRmlsZSwgZmlsZW5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShsb2NhdGlvbiwgZmlsZW5hbWUpOworICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBJRmlsZVN0b3JlIHN0b3JlOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlID0gRUZTLmdldFN0b3JlKGZpbGUudG9VUkkoKSk7CisgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gbmV3IEZpbGVTdG9yZUVkaXRvcklucHV0KHN0b3JlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9wZW5FZGl0b3IoaW5wdXQpOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkVkaXRvcihJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIFBERVBsdWdpbi5nZXRBY3RpdmVQYWdlKCkub3BlbkVkaXRvcihpbnB1dCwgQnVuZGxlTWFuaWZlc3RFZGl0b3IuSURfRURJVE9SKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlQREVQbHVnaW4ubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIElFZGl0b3JQYXJ0IG9wZW5FZGl0b3IoSUVkaXRvcklucHV0IGlucHV0KSB7CisgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBQREVQbHVnaW4uZ2V0QWN0aXZlUGFnZSgpLm9wZW5FZGl0b3IoaW5wdXQsIEJ1bmRsZU1hbmlmZXN0RWRpdG9yLklEX0VESVRPUik7CisgICAgICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgUERFUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sYmFyKElUb29sQmFyTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCS8vIGlnbm9yZQotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sYmFyKElUb29sQmFyTWFuYWdlciBtYW5hZ2VyKSB7CisgICAgICAgIC8vIGlnbm9yZQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1HbG9iYWxBY3Rpb24oU3RyaW5nIGlkKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCUlGb3JtUGFnZSBwYWdlID0gZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCWlmIChwYWdlIGluc3RhbmNlb2YgQWJzdHJhY3RQZGVGb3JtUGFnZSkgewotCQkJYm9vbGVhbiBoYW5kbGVkID0gKChBYnN0cmFjdFBkZUZvcm1QYWdlKSBwYWdlKS5wZXJmb3JtR2xvYmFsQWN0aW9uKGlkKTsKLQkJCWlmICghaGFuZGxlZCkgewotCQkJCWlmIChpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCkpKSB7Ci0JCQkJCWZJbnB1dENvbnRleHRNYW5hZ2VyLnVuZG8oKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoaWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpKSkgewotCQkJCQlmSW5wdXRDb250ZXh0TWFuYWdlci5yZWRvKCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpKSB8fCBpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpKSB7Ci0JCQkJCWNvcHlUb0NsaXBib2FyZChzZWxlY3Rpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucGVyZm9ybUdsb2JhbEFjdGlvbihpZCk7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUdsb2JhbEFjdGlvbihTdHJpbmcgaWQpIHsKKyAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgSUZvcm1QYWdlIHBhZ2UgPSBnZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKHBhZ2UgaW5zdGFuY2VvZiBBYnN0cmFjdFBkZUZvcm1QYWdlKSB7CisgICAgICAgICAgICBib29sZWFuIGhhbmRsZWQgPSAoKEFic3RyYWN0UGRlRm9ybVBhZ2UpIHBhZ2UpLnBlcmZvcm1HbG9iYWxBY3Rpb24oaWQpOworICAgICAgICAgICAgaWYgKCFoYW5kbGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mSW5wdXRDb250ZXh0TWFuYWdlci51bmRvKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mSW5wdXRDb250ZXh0TWFuYWdlci5yZWRvKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpKSB8fCBpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvcHlUb0NsaXBib2FyZChzZWxlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VwZXIucGVyZm9ybUdsb2JhbEFjdGlvbihpZCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgY29weVRvQ2xpcGJvYXJkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdFtdIG9iamVjdHMgPSBudWxsOwotCQlTdHJpbmcgdGV4dFZlcnNpb24gPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzc2VsID09IG51bGwgfHwgc3NlbC5zaXplKCkgPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCW9iamVjdHMgPSBzc2VsLnRvQXJyYXkoKTsKLQkJCVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQlQcmludFdyaXRlciBwd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHdyaXRlcik7Ci0JCQlDbGFzczw/PiBvYmpDbGFzcyA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gb2JqZWN0c1tpXTsKLQkJCQlpZiAob2JqQ2xhc3MgPT0gbnVsbCkgewotCQkJCQlvYmpDbGFzcyA9IG9iai5nZXRDbGFzcygpOwotCQkJCX0gZWxzZSBpZiAob2JqQ2xhc3MuZXF1YWxzKG9iai5nZXRDbGFzcygpKSA9PSBmYWxzZSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJV3JpdGFibGUpIHsKLQkJCQkJLy8gQWRkIGEgY3VzdG9taXplZCBkZWxpbWl0ZXIgaW4gYmV0d2VlbiBhbGwgc2VyaWFsaXplZAotCQkJCQkvLyBvYmplY3RzIHRvIGZvcm1hdCB0aGUgdGV4dCByZXByZXNlbnRhdGlvbgotCQkJCQlpZiAoKGkgIT0gMCkgJiYgKG9iaiBpbnN0YW5jZW9mIElXcml0YWJsZURlbGltaXRlcikpIHsKLQkJCQkJCSgoSVdyaXRhYmxlRGVsaW1pdGVyKSBvYmopLndyaXRlRGVsaW1ldGVyKHB3cml0ZXIpOwotCQkJCQl9Ci0JCQkJCSgoSVdyaXRhYmxlKSBvYmopLndyaXRlKCIiLCBwd3JpdGVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCS8vIERlbGltaXRlciBpcyBhbHdheXMgYSBuZXdsaW5lCi0JCQkJCXB3cml0ZXIucHJpbnRsbigoU3RyaW5nKSBvYmopOwotCQkJCX0KLQkJCX0KLQkJCXB3cml0ZXIuZmx1c2goKTsKLQkJCXRleHRWZXJzaW9uID0gd3JpdGVyLnRvU3RyaW5nKCk7Ci0JCQl0cnkgewotCQkJCXB3cml0ZXIuY2xvc2UoKTsKLQkJCQl3cml0ZXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfSBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJdGV4dFZlcnNpb24gPSAoKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldFRleHQoKTsKLQkJfQotCQlpZiAoKHRleHRWZXJzaW9uID09IG51bGwgfHwgdGV4dFZlcnNpb24ubGVuZ3RoKCkgPT0gMCkgJiYgb2JqZWN0cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gc2V0IHRoZSBjbGlwYm9hcmQgY29udGVudHMKLQkJT2JqZWN0W10gbyA9IG51bGw7Ci0JCVRyYW5zZmVyW10gdCA9IG51bGw7Ci0JCWlmIChvYmplY3RzID09IG51bGwpIHsKLQkJCW8gPSBuZXcgT2JqZWN0W10geyB0ZXh0VmVyc2lvbiB9OwotCQkJdCA9IG5ldyBUcmFuc2ZlcltdIHsgVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKLQkJfSBlbHNlIGlmICh0ZXh0VmVyc2lvbiA9PSBudWxsIHx8IHRleHRWZXJzaW9uLmxlbmd0aCgpID09IDApIHsKLQkJCW8gPSBuZXcgT2JqZWN0W10geyBvYmplY3RzIH07Ci0JCQl0ID0gbmV3IFRyYW5zZmVyW10geyBNb2RlbERhdGFUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCX0gZWxzZSB7Ci0JCQlvID0gbmV3IE9iamVjdFtdIHsgb2JqZWN0cywgdGV4dFZlcnNpb24gfTsKLQkJCXQgPSBuZXcgVHJhbnNmZXJbXSB7IE1vZGVsRGF0YVRyYW5zZmVyLmdldEluc3RhbmNlKCksIFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCX0KLQkJZ2V0Q2xpcGJvYXJkKCkuc2V0Q29udGVudHMobywgdCk7Ci0JfQorICAgIHByaXZhdGUgdm9pZCBjb3B5VG9DbGlwYm9hcmQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKyAgICAgICAgT2JqZWN0W10gb2JqZWN0cyA9IG51bGw7CisgICAgICAgIFN0cmluZyB0ZXh0VmVyc2lvbiA9IG51bGw7CisgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworICAgICAgICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOworICAgICAgICAgICAgaWYgKHNzZWwgPT0gbnVsbCB8fCBzc2VsLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2JqZWN0cyA9IHNzZWwudG9BcnJheSgpOworICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgIFByaW50V3JpdGVyIHB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKKyAgICAgICAgICAgIENsYXNzPD8+IG9iakNsYXNzID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBvYmplY3RzW2ldOworICAgICAgICAgICAgICAgIGlmIChvYmpDbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG9iakNsYXNzID0gb2JqLmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmpDbGFzcy5lcXVhbHMob2JqLmdldENsYXNzKCkpID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElXcml0YWJsZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYSBjdXN0b21pemVkIGRlbGltaXRlciBpbiBiZXR3ZWVuIGFsbCBzZXJpYWxpemVkCisgICAgICAgICAgICAgICAgICAgIC8vIG9iamVjdHMgdG8gZm9ybWF0IHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uCisgICAgICAgICAgICAgICAgICAgIGlmIChpICE9IDAgJiYgb2JqIGluc3RhbmNlb2YgSVdyaXRhYmxlRGVsaW1pdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKElXcml0YWJsZURlbGltaXRlcikgb2JqKS53cml0ZURlbGltZXRlcihwd3JpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAoKElXcml0YWJsZSkgb2JqKS53cml0ZSgiIiwgcHdyaXRlcik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgICAgICAvLyBEZWxpbWl0ZXIgaXMgYWx3YXlzIGEgbmV3bGluZQorICAgICAgICAgICAgICAgICAgICBwd3JpdGVyLnByaW50bG4oKFN0cmluZykgb2JqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwd3JpdGVyLmZsdXNoKCk7CisgICAgICAgICAgICB0ZXh0VmVyc2lvbiA9IHdyaXRlci50b1N0cmluZygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwd3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKKyAgICAgICAgICAgIHRleHRWZXJzaW9uID0gKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRUZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0ZXh0VmVyc2lvbiA9PSBudWxsIHx8IHRleHRWZXJzaW9uLmxlbmd0aCgpID09IDApICYmIG9iamVjdHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIHNldCB0aGUgY2xpcGJvYXJkIGNvbnRlbnRzCisgICAgICAgIE9iamVjdFtdIG8gPSBudWxsOworICAgICAgICBUcmFuc2ZlcltdIHQgPSBudWxsOworICAgICAgICBpZiAob2JqZWN0cyA9PSBudWxsKSB7CisgICAgICAgICAgICBvID0gbmV3IE9iamVjdFtdIHsgdGV4dFZlcnNpb24gfTsKKyAgICAgICAgICAgIHQgPSBuZXcgVHJhbnNmZXJbXSB7IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07CisgICAgICAgIH0gZWxzZSBpZiAodGV4dFZlcnNpb24gPT0gbnVsbCB8fCB0ZXh0VmVyc2lvbi5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBvID0gbmV3IE9iamVjdFtdIHsgb2JqZWN0cyB9OworICAgICAgICAgICAgdCA9IG5ldyBUcmFuc2ZlcltdIHsgTW9kZWxEYXRhVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbyA9IG5ldyBPYmplY3RbXSB7IG9iamVjdHMsIHRleHRWZXJzaW9uIH07CisgICAgICAgICAgICB0ID0gbmV3IFRyYW5zZmVyW10geyBNb2RlbERhdGFUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworICAgICAgICB9CisgICAgICAgIGdldENsaXBib2FyZCgpLnNldENvbnRlbnRzKG8sIHQpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVNYW5pZmVzdEVkaXRvckNvbnRyaWJ1dG9yLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZU1hbmlmZXN0RWRpdG9yQ29udHJpYnV0b3IuamF2YQppbmRleCA0OTlkZjE0Li43MzExNDY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZU1hbmlmZXN0RWRpdG9yQ29udHJpYnV0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZU1hbmlmZXN0RWRpdG9yQ29udHJpYnV0b3IuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yczsKIAogLyoqCkBAIC0xNSwyNyArMTYsMjcgQEAKICAqLwogcHVibGljIGNsYXNzIEJ1bmRsZU1hbmlmZXN0RWRpdG9yQ29udHJpYnV0b3IgZXh0ZW5kcyBBYnN0cmFjdFBkZUZvcm1UZXh0RWRpdG9yQ29udHJpYnV0b3IgewogCi0JcHVibGljIEJ1bmRsZU1hbmlmZXN0RWRpdG9yQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCImUGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKLQl9CisgICAgcHVibGljIEJ1bmRsZU1hbmlmZXN0RWRpdG9yQ29udHJpYnV0b3IoKSB7CisgICAgICAgIHN1cGVyKCImUGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRlbnRBc3Npc3QoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRlbnRBc3Npc3QoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzRm9ybWF0QWN0aW9uKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNGb3JtYXRBY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29ycmVjdGlvbkFzc2lzdCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29ycmVjdGlvbkFzc2lzdCgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNIeXBlcmxpbmtpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0h5cGVybGlua2luZygpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVNYW5pZmVzdE91dGxpbmVQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZU1hbmlmZXN0T3V0bGluZVBhZ2UuamF2YQppbmRleCBkZmRjMDJkLi5mMTdmZGVlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZU1hbmlmZXN0T3V0bGluZVBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZU1hbmlmZXN0T3V0bGluZVBhZ2UuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC00MywxMDYgKzQ0LDEwOSBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlTWFuaWZlc3RPdXRsaW5lUGFnZSBleHRlbmRzIE1hbmlmZXN0T3V0bGluZVBhZ2UgewogCi0JcHVibGljIEJ1bmRsZU1hbmlmZXN0T3V0bGluZVBhZ2UoUERFRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yKTsKLQl9CisgICAgcHVibGljIEJ1bmRsZU1hbmlmZXN0T3V0bGluZVBhZ2UoUERFRm9ybUVkaXRvciBlZGl0b3IpIHsKKyAgICAgICAgc3VwZXIoZWRpdG9yKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUERFRm9ybVBhZ2UpIHsKLQkJCVBERUZvcm1QYWdlIHBhZ2UgPSAoUERFRm9ybVBhZ2UpIHBhcmVudDsKLQkJCUlCdW5kbGVNb2RlbCBtb2RlbCA9IGdldEJ1bmRsZU1vZGVsKHBhZ2UpOwotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuaXNWYWxpZCgpKSB7Ci0JCQkJSUJ1bmRsZSBidW5kbGUgPSBtb2RlbC5nZXRCdW5kbGUoKTsKLQkJCQlpZiAocGFnZS5nZXRJZCgpLmVxdWFscyhCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpKSB7Ci0JCQkJCUFycmF5TGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQkJSW1wb3J0UGFja2FnZUhlYWRlciBwYWNrYWdlSGVhZGVyID0gKEltcG9ydFBhY2thZ2VIZWFkZXIpIGJ1bmRsZS5nZXRNYW5pZmVzdEhlYWRlcihDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UpOwotCQkJCQlJbXBvcnRCdW5kbGVIZWFkZXIgYnVuZGxlSGVhZGVyID0gKEltcG9ydEJ1bmRsZUhlYWRlcikgYnVuZGxlLmdldE1hbmlmZXN0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSk7Ci0JCQkJCUltcG9ydExpYnJhcnlIZWFkZXIgbGlicmFyeUhlYWRlciA9IChJbXBvcnRMaWJyYXJ5SGVhZGVyKSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSk7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKKyAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFBERUZvcm1QYWdlKSB7CisgICAgICAgICAgICBQREVGb3JtUGFnZSBwYWdlID0gKFBERUZvcm1QYWdlKSBwYXJlbnQ7CisgICAgICAgICAgICBJQnVuZGxlTW9kZWwgbW9kZWwgPSBnZXRCdW5kbGVNb2RlbChwYWdlKTsKKyAgICAgICAgICAgIGlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgIElCdW5kbGUgYnVuZGxlID0gbW9kZWwuZ2V0QnVuZGxlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhZ2UuZ2V0SWQoKS5lcXVhbHMoQnVuZGxlRGVwZW5kZW5jaWVzUGFnZS5QQUdFX0lEKSkgeworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgICAgICAgICAgICAgICAgIEltcG9ydFBhY2thZ2VIZWFkZXIgcGFja2FnZUhlYWRlciA9IChJbXBvcnRQYWNrYWdlSGVhZGVyKSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFKTsKKyAgICAgICAgICAgICAgICAgICAgSW1wb3J0QnVuZGxlSGVhZGVyIGJ1bmRsZUhlYWRlciA9IChJbXBvcnRCdW5kbGVIZWFkZXIpIGJ1bmRsZS5nZXRNYW5pZmVzdEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9CVU5ETEUpOworICAgICAgICAgICAgICAgICAgICBJbXBvcnRMaWJyYXJ5SGVhZGVyIGxpYnJhcnlIZWFkZXIgPSAoSW1wb3J0TGlicmFyeUhlYWRlcikgYnVuZGxlLmdldE1hbmlmZXN0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlkpOwogCi0JCQkJCWlmIChwYWNrYWdlSGVhZGVyICE9IG51bGwgJiYgIXBhY2thZ2VIZWFkZXIuaXNFbXB0eSgpKSB7Ci0JCQkJCQlsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KHBhY2thZ2VIZWFkZXIuZ2V0UGFja2FnZXMoKSkpOwotCQkJCQl9Ci0JCQkJCWlmIChidW5kbGVIZWFkZXIgIT0gbnVsbCAmJiAhYnVuZGxlSGVhZGVyLmlzRW1wdHkoKSkgewotCQkJCQkJbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChidW5kbGVIZWFkZXIuZ2V0SW1wb3J0ZWRCdW5kbGVzKCkpKTsKLQkJCQkJfQotCQkJCQlpZiAobGlicmFyeUhlYWRlciAhPSBudWxsICYmICFsaWJyYXJ5SGVhZGVyLmlzRW1wdHkoKSkgewotCQkJCQkJbGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChsaWJyYXJ5SGVhZGVyLmdldEltcG9ydGVkTGlicmFyaWVzKCkpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCX0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VIZWFkZXIgIT0gbnVsbCAmJiAhcGFja2FnZUhlYWRlci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QocGFja2FnZUhlYWRlci5nZXRQYWNrYWdlcygpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUhlYWRlciAhPSBudWxsICYmICFidW5kbGVIZWFkZXIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KGJ1bmRsZUhlYWRlci5nZXRJbXBvcnRlZEJ1bmRsZXMoKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChsaWJyYXJ5SGVhZGVyICE9IG51bGwgJiYgIWxpYnJhcnlIZWFkZXIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KGxpYnJhcnlIZWFkZXIuZ2V0SW1wb3J0ZWRMaWJyYXJpZXMoKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaXN0LnRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKHBhcmVudCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJlbnRQYWdlSWQoT2JqZWN0IGl0ZW0pIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IG51bGw7Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgSW1wb3J0UGFja2FnZU9iamVjdCB8fCBpdGVtIGluc3RhbmNlb2YgSW1wb3J0QnVuZGxlT2JqZWN0Ci0JCQkJfHwgaXRlbSBpbnN0YW5jZW9mIEltcG9ydExpYnJhcnlPYmplY3QpIHsKLQkJCXBhZ2VJZCA9IEJ1bmRsZURlcGVuZGVuY2llc1BhZ2UuUEFHRV9JRDsKLQkJfQotCQlpZiAocGFnZUlkICE9IG51bGwpIHsKLQkJCXJldHVybiBwYWdlSWQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudFBhZ2VJZChpdGVtKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJlbnRQYWdlSWQoT2JqZWN0IGl0ZW0pIHsKKyAgICAgICAgU3RyaW5nIHBhZ2VJZCA9IG51bGw7CisgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgSW1wb3J0UGFja2FnZU9iamVjdCB8fCBpdGVtIGluc3RhbmNlb2YgSW1wb3J0QnVuZGxlT2JqZWN0IHx8IGl0ZW0gaW5zdGFuY2VvZiBJbXBvcnRMaWJyYXJ5T2JqZWN0KSB7CisgICAgICAgICAgICBwYWdlSWQgPSBCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhZ2VJZCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcGFnZUlkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5nZXRQYXJlbnRQYWdlSWQoaXRlbSk7CisgICAgfQogCi0JcHJpdmF0ZSBJQnVuZGxlTW9kZWwgZ2V0QnVuZGxlTW9kZWwoUERFRm9ybVBhZ2UgcGFnZSkgewotCQlJbnB1dENvbnRleHRNYW5hZ2VyIG1hbmFnZXIgPSBwYWdlLmdldFBERUVkaXRvcigpLmdldENvbnRleHRNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCUJ1bmRsZUlucHV0Q29udGV4dCBjb250ZXh0ID0gKEJ1bmRsZUlucHV0Q29udGV4dCkgbWFuYWdlci5maW5kQ29udGV4dChCdW5kbGVJbnB1dENvbnRleHQuQ09OVEVYVF9JRCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChJQnVuZGxlTW9kZWwpIGNvbnRleHQuZ2V0TW9kZWwoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgcHJpdmF0ZSBJQnVuZGxlTW9kZWwgZ2V0QnVuZGxlTW9kZWwoUERFRm9ybVBhZ2UgcGFnZSkgeworICAgICAgICBJbnB1dENvbnRleHRNYW5hZ2VyIG1hbmFnZXIgPSBwYWdlLmdldFBERUVkaXRvcigpLmdldENvbnRleHRNYW5hZ2VyKCk7CisgICAgICAgIGlmIChtYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ1bmRsZUlucHV0Q29udGV4dCBjb250ZXh0ID0gKEJ1bmRsZUlucHV0Q29udGV4dCkgbWFuYWdlci5maW5kQ29udGV4dChCdW5kbGVJbnB1dENvbnRleHQuQ09OVEVYVF9JRCk7CisgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChJQnVuZGxlTW9kZWwpIGNvbnRleHQuZ2V0TW9kZWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgY3JlYXRlTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBCYXNpY0xhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEltcG9ydExpYnJhcnlPYmplY3QpIHsKLQkJCQkJcmV0dXJuICgoSW1wb3J0TGlicmFyeU9iamVjdCkgb2JqKS5nZXRJZCgpOwotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSW1wb3J0QnVuZGxlT2JqZWN0KSB7Ci0JCQkJCXJldHVybiAoKEltcG9ydEJ1bmRsZU9iamVjdCkgb2JqKS5nZXRJZCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iaik7Ci0JCQkJfQotCQkJfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJTGFiZWxQcm92aWRlciBjcmVhdGVMYWJlbFByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IEJhc2ljTGFiZWxQcm92aWRlcigpIHsKIAotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQkJCVBERUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJbXBvcnRMaWJyYXJ5T2JqZWN0KSB7Ci0JCQkJCXJldHVybiBsYWJlbFByb3ZpZGVyLmdldChQREVQbHVnaW5JbWFnZXMuREVTQ19KQVJfTElCX09CSik7Ci0JCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJbXBvcnRCdW5kbGVPYmplY3QpIHsKLQkJCQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0KFBERVBsdWdpbkltYWdlcy5ERVNDX0JVTkRMRV9PQkopOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmopOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSW1wb3J0TGlicmFyeU9iamVjdCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChJbXBvcnRMaWJyYXJ5T2JqZWN0KSBvYmopLmdldElkKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJbXBvcnRCdW5kbGVPYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoSW1wb3J0QnVuZGxlT2JqZWN0KSBvYmopLmdldElkKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRleHQob2JqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJfTsKLQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAgICAgUERFTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gUERFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7CisgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEltcG9ydExpYnJhcnlPYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0KFBERVBsdWdpbkltYWdlcy5ERVNDX0pBUl9MSUJfT0JKKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEltcG9ydEJ1bmRsZU9iamVjdCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxQcm92aWRlci5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfQlVORExFX09CSik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iaik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JcHVibGljIGNsYXNzIEJhc2ljTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewotCQkJCXJldHVybiAoKElGb3JtUGFnZSkgb2JqKS5nZXRUaXRsZSgpOwotCQkJfQotCQkJcmV0dXJuIFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldFRleHQob2JqKTsKLQkJfQorICAgICAgICB9OworICAgIH0KIAotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewotCQkJCXJldHVybiBQREVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfUEFHRV9PQkopOwotCQkJfQotCQkJcmV0dXJuIFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldEltYWdlKG9iaik7Ci0JCX0KLQl9CisgICAgcHVibGljIGNsYXNzIEJhc2ljTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElGb3JtUGFnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoKElGb3JtUGFnZSkgb2JqKS5nZXRUaXRsZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldFRleHQob2JqKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElGb3JtUGFnZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBQREVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfUEFHRV9PQkopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldEltYWdlKG9iaik7CisgICAgICAgIH0KKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlT3ZlcnZpZXdQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZU92ZXJ2aWV3UGFnZS5qYXZhCmluZGV4IDUxODJlMWEuLjQxOWZjZGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlT3ZlcnZpZXdQYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVPdmVydmlld1BhZ2UuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yczsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CkBAIC03MywyNTYgKzc0LDI1MCBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlT3ZlcnZpZXdQYWdlIGV4dGVuZHMgUERFRm9ybVBhZ2UgaW1wbGVtZW50cyBJSHlwZXJsaW5rTGlzdGVuZXIsIElCdW5kbGVNYW5pZmVzdFNhdmVMaXN0ZW5lciB7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0lEID0gImJ1bmRsZV9vdmVydmlldyI7IC8vJE5PTi1OTFMtMSQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0lEID0gImJ1bmRsZV9vdmVydmlldyI7IC8vJE5PTi1OTFMtMSQKIAotCXByaXZhdGUgQnVuZGxlR2VuZXJhbEluZm9TZWN0aW9uIGZJbmZvU2VjdGlvbjsKKyAgICBwcml2YXRlIEJ1bmRsZUdlbmVyYWxJbmZvU2VjdGlvbiBmSW5mb1NlY3Rpb247CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX0NPTlRFTlRfU0VDVElPTl9URVhUID0gIjxmb3JtPjxwPlRoZSBjb250ZW50IG9mIHRoZSBidW5kbGUgaXMgbWFkZSB1cCBvZiB0d28gc2VjdGlvbnM6PC9wPjxsaSBzdHlsZT1cImltYWdlXCIgdmFsdWU9XCJwYWdlXCIgYmluZGVudD1cIjVcIj48YSBocmVmPVwiZGVwZW5kZW5jaWVzXCI+RGVwZW5kZW5jaWVzPC9hPjogbGlzdHMgYWxsIHRoZSBidW5kbGVzIHJlcXVpcmVkIG9uIHRoaXMgYnVuZGxlJ3MgY2xhc3NwYXRoIHRvIGNvbXBpbGUgYW5kIHJ1bi48L2xpPjxsaSBzdHlsZT1cImltYWdlXCIgdmFsdWU9XCJwYWdlXCIgYmluZGVudD1cIjVcIj48YSBocmVmPVwicnVudGltZVwiPlJ1bnRpbWU8L2E+OiBsaXN0cyB0aGUgcGFja2FnZXMgdGhhdCB0aGlzIGJ1bmRsZSBleHBvcnRzIHRvIG90aGVyIGJ1bmRsZXMuPC9saT48L2Zvcm0+IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX0NPTlRFTlRfU0VDVElPTl9URVhUID0gIjxmb3JtPjxwPlRoZSBjb250ZW50IG9mIHRoZSBidW5kbGUgaXMgbWFkZSB1cCBvZiB0d28gc2VjdGlvbnM6PC9wPjxsaSBzdHlsZT1cImltYWdlXCIgdmFsdWU9XCJwYWdlXCIgYmluZGVudD1cIjVcIj48YSBocmVmPVwiZGVwZW5kZW5jaWVzXCI+RGVwZW5kZW5jaWVzPC9hPjogbGlzdHMgYWxsIHRoZSBidW5kbGVzIHJlcXVpcmVkIG9uIHRoaXMgYnVuZGxlJ3MgY2xhc3NwYXRoIHRvIGNvbXBpbGUgYW5kIHJ1bi48L2xpPjxsaSBzdHlsZT1cImltYWdlXCIgdmFsdWU9XCJwYWdlXCIgYmluZGVudD1cIjVcIj48YSBocmVmPVwicnVudGltZVwiPlJ1bnRpbWU8L2E+OiBsaXN0cyB0aGUgcGFja2FnZXMgdGhhdCB0aGlzIGJ1bmRsZSBleHBvcnRzIHRvIG90aGVyIGJ1bmRsZXMuPC9saT48L2Zvcm0+IjsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfQUNUSU9OX1NFQ1RJT05fVEVYVCA9ICI8Zm9ybT48cD5QZXJmb3JtIGNvbW1vbiBhY3Rpb25zIG9uIHRoZSBidW5kbGU6PC9wPiIKLQkJCSsgIjxsaSBzdHlsZT1cImltYWdlXCIgdmFsdWU9XCJkZXBlbmRlbmNpZXNcIiBiaW5kZW50PVwiNVwiPjxhIGhyZWY9XCJyZWZyZXNoZGVwZW5kZW5jaWVzXCI+UmVmcmVzaCBCdW5kbGUgRGVwZW5kZW5jaWVzPC9hPjogcmVmcmVzaCB0aGUgQnVuZGxlIENsYXNzcGF0aCBDb250YWluZXIgdG8gcmVmbGVjdCBjaGFuZ2VzIGluIHRoZSBNQU5JRkVTVC5NRiBmaWxlLjwvbGk+IgotCQkJKyAiPGxpIHN0eWxlPVwiaW1hZ2VcIiB2YWx1ZT1cImV4cG9ydFwiIGJpbmRlbnQ9XCI1XCI+PGEgaHJlZj1cImV4cG9ydGJ1bmRsZVwiPkV4cG9ydCBCdW5kbGU8L2E+OiBleHBvcnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBCdW5kbGUgdG8gYSBkZXBsb3lhYmxlIEpBUi48L2xpPiIKLQkJCSsgIjwvZm9ybT4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfQUNUSU9OX1NFQ1RJT05fVEVYVCA9ICI8Zm9ybT48cD5QZXJmb3JtIGNvbW1vbiBhY3Rpb25zIG9uIHRoZSBidW5kbGU6PC9wPiIKKyAgICAgICAgKyAiPGxpIHN0eWxlPVwiaW1hZ2VcIiB2YWx1ZT1cImRlcGVuZGVuY2llc1wiIGJpbmRlbnQ9XCI1XCI+PGEgaHJlZj1cInJlZnJlc2hkZXBlbmRlbmNpZXNcIj5SZWZyZXNoIEJ1bmRsZSBEZXBlbmRlbmNpZXM8L2E+OiByZWZyZXNoIHRoZSBCdW5kbGUgQ2xhc3NwYXRoIENvbnRhaW5lciB0byByZWZsZWN0IGNoYW5nZXMgaW4gdGhlIE1BTklGRVNULk1GIGZpbGUuPC9saT4iCisgICAgICAgICsgIjxsaSBzdHlsZT1cImltYWdlXCIgdmFsdWU9XCJleHBvcnRcIiBiaW5kZW50PVwiNVwiPjxhIGhyZWY9XCJleHBvcnRidW5kbGVcIj5FeHBvcnQgQnVuZGxlPC9hPjogZXhwb3J0IHRoZSBjb250ZW50cyBvZiB0aGUgQnVuZGxlIHRvIGEgZGVwbG95YWJsZSBKQVIuPC9saT4iCisgICAgICAgICsgIjwvZm9ybT4iOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0VSUk9SUyA9ICJPdmVydmlldzogUGxlYXNlIGNvcnJlY3Qgb25lIG9yIG1vcmUgZXJyb3JzIGluIHRoZSBtYW5pZmVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0VSUk9SUyA9ICJPdmVydmlldzogUGxlYXNlIGNvcnJlY3Qgb25lIG9yIG1vcmUgZXJyb3JzIGluIHRoZSBtYW5pZmVzdCI7CiAKLQlwcm90ZWN0ZWQgU2Nyb2xsZWRGb3JtIGZvcm0gPSBudWxsOworICAgIHByb3RlY3RlZCBTY3JvbGxlZEZvcm0gZm9ybSA9IG51bGw7CiAKLQlwcm90ZWN0ZWQgSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKIAotCXB1YmxpYyBCdW5kbGVPdmVydmlld1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBQQUdFX0lELCAiT3ZlcnZpZXciKTsKLQl9CisgICAgcHVibGljIEJ1bmRsZU92ZXJ2aWV3UGFnZShGb3JtRWRpdG9yIGVkaXRvcikgeworICAgICAgICBzdXBlcihlZGl0b3IsIFBBR0VfSUQsICJPdmVydmlldyIpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlzdXBlci5jcmVhdGVGb3JtQ29udGVudChtYW5hZ2VkRm9ybSk7Ci0JCUlQbHVnaW5Nb2RlbEJhc2UgbW9kZWwgPSAoSVBsdWdpbk1vZGVsQmFzZSkgKChCdW5kbGVNYW5pZmVzdEVkaXRvcikgdGhpcy5nZXRFZGl0b3IoKSkuZ2V0QWdncmVnYXRlTW9kZWwoKTsKLQkJcmVzb3VyY2UgPSBtb2RlbC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5zZXRJbWFnZShTZXJ2ZXJJZGVVaVBsdWdpbi5nZXRJbWFnZSgiZnVsbC9vYmoxNi9vc2dpX29iai5naWYiKSk7Ci0JCWZvcm0uc2V0VGV4dChQREVVSU1lc3NhZ2VzLk1hbmlmZXN0RWRpdG9yX092ZXJ2aWV3UGFnZV90aXRsZSk7Ci0JCWZpbGxCb2R5KG1hbmFnZWRGb3JtLCB0b29sa2l0KTsKLQkJdXBkYXRlRm9ybVRleHQoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7CisgICAgICAgIHN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKKyAgICAgICAgSVBsdWdpbk1vZGVsQmFzZSBtb2RlbCA9IChJUGx1Z2luTW9kZWxCYXNlKSAoKEJ1bmRsZU1hbmlmZXN0RWRpdG9yKSB0aGlzLmdldEVkaXRvcigpKS5nZXRBZ2dyZWdhdGVNb2RlbCgpOworICAgICAgICB0aGlzLnJlc291cmNlID0gbW9kZWwuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisgICAgICAgIHRoaXMuZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKKyAgICAgICAgRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKKyAgICAgICAgdGhpcy5mb3JtLnNldEltYWdlKFNlcnZlcklkZVVpUGx1Z2luLmdldEltYWdlKCJmdWxsL29iajE2L29zZ2lfb2JqLmdpZiIpKTsKKyAgICAgICAgdGhpcy5mb3JtLnNldFRleHQoUERFVUlNZXNzYWdlcy5NYW5pZmVzdEVkaXRvcl9PdmVydmlld1BhZ2VfdGl0bGUpOworICAgICAgICBmaWxsQm9keShtYW5hZ2VkRm9ybSwgdG9vbGtpdCk7CisgICAgICAgIHVwZGF0ZUZvcm1UZXh0KCk7CisgICAgfQogCi0JcHVibGljIHZvaWQgbWFuaWZlc3RTYXZlZCgpIHsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXVwZGF0ZUZvcm1UZXh0KCk7Ci0JCX0KLQl9CisgICAgcHVibGljIHZvaWQgbWFuaWZlc3RTYXZlZCgpIHsKKyAgICAgICAgaWYgKHRoaXMucmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdXBkYXRlRm9ybVRleHQoKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUZvcm1UZXh0KCkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBXYWl0IGZvciBidWlsZAotCQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fQlVJTEQsIG51bGwpOwotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMobnVsbCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWlmIChNYW5pZmVzdEVkaXRvclV0aWxzLmhhc0Vycm9yU2V2ZXJpdHlNYXJrZXIobWFya2VycykpIHsKLQkJCQkJZm9ybS5zZXRUZXh0KE1BTklGRVNUX0VSUk9SUyk7Ci0JCQkJCWZvcm0uc2V0SW1hZ2UoU2VydmVySWRlVWlQbHVnaW4uZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvbWFuaWZlc3RfZXJyb3IucG5nIikpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvcm0uc2V0VGV4dChQREVVSU1lc3NhZ2VzLk1hbmlmZXN0RWRpdG9yX092ZXJ2aWV3UGFnZV90aXRsZSk7Ci0JCQkJCWZvcm0uc2V0SW1hZ2UoU2VydmVySWRlVWlQbHVnaW4uZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvb3NnaV9vYmouZ2lmIikpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlTdGF0dXNIYW5kbGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlcklkZVVpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCSJDb3VsZCBub3QgdXBkYXRlIHBhZ2UgdGl0bGUgdGV4dCIsIGUpKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlTdGF0dXNIYW5kbGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlcklkZVVpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCSJDb3VsZCBub3QgdXBkYXRlIHBhZ2UgdGl0bGUgdGV4dCIsIGUpKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVN0YXR1c0hhbmRsZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJIkNvdWxkIG5vdCB1cGRhdGUgcGFnZSB0aXRsZSB0ZXh0IiwgZSkpOwotCQkJfQotCQl9Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUZvcm1UZXh0KCkgeworICAgICAgICBpZiAodGhpcy5yZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIGJ1aWxkCisgICAgICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7CisgICAgICAgICAgICAgICAgSU1hcmtlcltdIG1hcmtlcnMgPSB0aGlzLnJlc291cmNlLmZpbmRNYXJrZXJzKG51bGwsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKKyAgICAgICAgICAgICAgICBpZiAoTWFuaWZlc3RFZGl0b3JVdGlscy5oYXNFcnJvclNldmVyaXR5TWFya2VyKG1hcmtlcnMpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zZXRUZXh0KE1BTklGRVNUX0VSUk9SUyk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zZXRJbWFnZShTZXJ2ZXJJZGVVaVBsdWdpbi5nZXRJbWFnZSgiZnVsbC9vYmoxNi9tYW5pZmVzdF9lcnJvci5wbmciKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLnNldFRleHQoUERFVUlNZXNzYWdlcy5NYW5pZmVzdEVkaXRvcl9PdmVydmlld1BhZ2VfdGl0bGUpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uc2V0SW1hZ2UoU2VydmVySWRlVWlQbHVnaW4uZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvb3NnaV9vYmouZ2lmIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNIYW5kbGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlcklkZVVpUGx1Z2luLlBMVUdJTl9JRCwgIkNvdWxkIG5vdCB1cGRhdGUgcGFnZSB0aXRsZSB0ZXh0IiwgZSkpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN0YXR1c0hhbmRsZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELCAiQ291bGQgbm90IHVwZGF0ZSBwYWdlIHRpdGxlIHRleHQiLCBlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNIYW5kbGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlcklkZVVpUGx1Z2luLlBMVUdJTl9JRCwgIkNvdWxkIG5vdCB1cGRhdGUgcGFnZSB0aXRsZSB0ZXh0IiwgZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGZpbGxCb2R5KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlDb21wb3NpdGUgYm9keSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKS5nZXRCb2R5KCk7Ci0JCWJvZHkuc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZUZvcm1UYWJsZVdyYXBMYXlvdXQodHJ1ZSwgMikpOworICAgIHByaXZhdGUgdm9pZCBmaWxsQm9keShJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0sIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKKyAgICAgICAgQ29tcG9zaXRlIGJvZHkgPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCkuZ2V0Qm9keSgpOworICAgICAgICBib2R5LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVGb3JtVGFibGVXcmFwTGF5b3V0KHRydWUsIDIpKTsKIAotCQlDb21wb3NpdGUgbGVmdCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGJvZHkpOwotCQlsZWZ0LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVGb3JtUGFuZVRhYmxlV3JhcExheW91dChmYWxzZSwgMSkpOwotCQlsZWZ0LnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJZkluZm9TZWN0aW9uID0gbmV3IEJ1bmRsZUdlbmVyYWxJbmZvU2VjdGlvbih0aGlzLCBsZWZ0KTsKLQkJbWFuYWdlZEZvcm0uYWRkUGFydChmSW5mb1NlY3Rpb24pOwotCQltYW5hZ2VkRm9ybS5hZGRQYXJ0KG5ldyBCdW5kbGVFeGVjdXRpb25FbnZpcm9ubWVudFNlY3Rpb24odGhpcywgbGVmdCkpOworICAgICAgICBDb21wb3NpdGUgbGVmdCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGJvZHkpOworICAgICAgICBsZWZ0LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVGb3JtUGFuZVRhYmxlV3JhcExheW91dChmYWxzZSwgMSkpOworICAgICAgICBsZWZ0LnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKKyAgICAgICAgdGhpcy5mSW5mb1NlY3Rpb24gPSBuZXcgQnVuZGxlR2VuZXJhbEluZm9TZWN0aW9uKHRoaXMsIGxlZnQpOworICAgICAgICBtYW5hZ2VkRm9ybS5hZGRQYXJ0KHRoaXMuZkluZm9TZWN0aW9uKTsKKyAgICAgICAgbWFuYWdlZEZvcm0uYWRkUGFydChuZXcgQnVuZGxlRXhlY3V0aW9uRW52aXJvbm1lbnRTZWN0aW9uKHRoaXMsIGxlZnQpKTsKIAotCQlDb21wb3NpdGUgcmlnaHQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShib2R5KTsKLQkJcmlnaHQuc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZUZvcm1QYW5lVGFibGVXcmFwTGF5b3V0KGZhbHNlLCAxKSk7Ci0JCXJpZ2h0LnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMKSk7Ci0JCWNyZWF0ZUJ1bmRsZUFjdGlvblNlY3Rpb24obWFuYWdlZEZvcm0sIHJpZ2h0LCB0b29sa2l0KTsKLQkJY3JlYXRlQnVuZGxlQ29udGVudFNlY3Rpb24obWFuYWdlZEZvcm0sIHJpZ2h0LCB0b29sa2l0KTsKKyAgICAgICAgQ29tcG9zaXRlIHJpZ2h0ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoYm9keSk7CisgICAgICAgIHJpZ2h0LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVGb3JtUGFuZVRhYmxlV3JhcExheW91dChmYWxzZSwgMSkpOworICAgICAgICByaWdodC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTCkpOworICAgICAgICBjcmVhdGVCdW5kbGVBY3Rpb25TZWN0aW9uKG1hbmFnZWRGb3JtLCByaWdodCwgdG9vbGtpdCk7CisgICAgICAgIGNyZWF0ZUJ1bmRsZUNvbnRlbnRTZWN0aW9uKG1hbmFnZWRGb3JtLCByaWdodCwgdG9vbGtpdCk7CiAKLQl9CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1bmRsZUNvbnRlbnRTZWN0aW9uKElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSwgQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlTdHJpbmcgc2VjdGlvblRpdGxlOwotCQlzZWN0aW9uVGl0bGUgPSAiQnVuZGxlIENvbnRlbnQiOwotCQlTZWN0aW9uIHNlY3Rpb24gPSBjcmVhdGVTdGF0aWNTZWN0aW9uKHRvb2xraXQsIHBhcmVudCwgc2VjdGlvblRpdGxlKTsKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlQnVuZGxlQ29udGVudFNlY3Rpb24oSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtLCBDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7CisgICAgICAgIFN0cmluZyBzZWN0aW9uVGl0bGU7CisgICAgICAgIHNlY3Rpb25UaXRsZSA9ICJCdW5kbGUgQ29udGVudCI7CisgICAgICAgIFNlY3Rpb24gc2VjdGlvbiA9IGNyZWF0ZVN0YXRpY1NlY3Rpb24odG9vbGtpdCwgcGFyZW50LCBzZWN0aW9uVGl0bGUpOwogCi0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBjcmVhdGVTdGF0aWNTZWN0aW9uQ2xpZW50KHRvb2xraXQsIHNlY3Rpb24pOworICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyID0gY3JlYXRlU3RhdGljU2VjdGlvbkNsaWVudCh0b29sa2l0LCBzZWN0aW9uKTsKIAotCQlGb3JtVGV4dCB0ZXh0ID0gY3JlYXRlQ2xpZW50KGNvbnRhaW5lciwgQlVORExFX0NPTlRFTlRfU0VDVElPTl9URVhULCB0cnVlLCB0b29sa2l0KTsKLQkJUERFTGFiZWxQcm92aWRlciBscCA9IFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOwotCQl0ZXh0LnNldEltYWdlKCJwYWdlIiwgbHAuZ2V0KFBERVBsdWdpbkltYWdlcy5ERVNDX1BBR0VfT0JKLCBTaGFyZWRMYWJlbFByb3ZpZGVyLkZfRURJVCkpOyAvLyROT04tTkxTLTEkCi0JCXRleHQuYWRkSHlwZXJsaW5rTGlzdGVuZXIodGhpcyk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNvbnRhaW5lcik7Ci0JfQorICAgICAgICBGb3JtVGV4dCB0ZXh0ID0gY3JlYXRlQ2xpZW50KGNvbnRhaW5lciwgQlVORExFX0NPTlRFTlRfU0VDVElPTl9URVhULCB0cnVlLCB0b29sa2l0KTsKKyAgICAgICAgUERFTGFiZWxQcm92aWRlciBscCA9IFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOworICAgICAgICB0ZXh0LnNldEltYWdlKCJwYWdlIiwgbHAuZ2V0KFBERVBsdWdpbkltYWdlcy5ERVNDX1BBR0VfT0JKLCBTaGFyZWRMYWJlbFByb3ZpZGVyLkZfRURJVCkpOyAvLyROT04tTkxTLTEkCisgICAgICAgIHRleHQuYWRkSHlwZXJsaW5rTGlzdGVuZXIodGhpcyk7CisgICAgICAgIHNlY3Rpb24uc2V0Q2xpZW50KGNvbnRhaW5lcik7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1bmRsZUFjdGlvblNlY3Rpb24oSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtLCBDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCVN0cmluZyBzZWN0aW9uVGl0bGU7Ci0JCXNlY3Rpb25UaXRsZSA9ICJCdW5kbGUgQWN0aW9ucyI7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IGNyZWF0ZVN0YXRpY1NlY3Rpb24odG9vbGtpdCwgcGFyZW50LCBzZWN0aW9uVGl0bGUpOworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVCdW5kbGVBY3Rpb25TZWN0aW9uKElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSwgQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgeworICAgICAgICBTdHJpbmcgc2VjdGlvblRpdGxlOworICAgICAgICBzZWN0aW9uVGl0bGUgPSAiQnVuZGxlIEFjdGlvbnMiOworICAgICAgICBTZWN0aW9uIHNlY3Rpb24gPSBjcmVhdGVTdGF0aWNTZWN0aW9uKHRvb2xraXQsIHBhcmVudCwgc2VjdGlvblRpdGxlKTsKIAotCQlDb21wb3NpdGUgY29udGFpbmVyID0gY3JlYXRlU3RhdGljU2VjdGlvbkNsaWVudCh0b29sa2l0LCBzZWN0aW9uKTsKKyAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciA9IGNyZWF0ZVN0YXRpY1NlY3Rpb25DbGllbnQodG9vbGtpdCwgc2VjdGlvbik7CiAKLQkJRm9ybVRleHQgbm90ZVRleHQgPSBjcmVhdGVDbGllbnQoCi0JCQkJY29udGFpbmVyLAotCQkJCSI8Zm9ybT48cD5PU0dpIGRlcGVuZGVuY3kgbWV0YSBkYXRhIGluIHRoZSBNQU5JRkVTVC5NRiBmaWxlIGNhbiBhdXRvbWF0aWNhbGx5IGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVwZW5kZW5jaWVzIGV4cHJlc3NlZCBpbiBzb3VyY2UgY29kZSBhcnRpZmFjdHMuPC9wPjxwPkphdmEgc291cmNlIGZpbGVzLCBTcHJpbmcgWE1MIGNvbmZpZ3VyYXRpb24sIEpQQSBwZXJzaXN0ZW5jZS54bWwgYW5kIEhpYmVybmF0ZSAuaGJtIG1hcHBpbmcgZmlsZXMgd2lsbCBiZSBhbmFseXNlZC4gVGhlIHByb2Nlc3Mgd2lsbCBjcmVhdGUgSW1wb3J0LVBhY2thZ2UgYW5kIEV4cG9ydC1QYWNrYWdlIGhlYWRlcnMuPC9wPjxsaSBzdHlsZT1cImltYWdlXCIgdmFsdWU9XCJtYW5pZmVzdFwiIGJpbmRlbnQ9XCI1XCI+PGEgaHJlZj1cImdlbmVyYXRlXCI+VXBkYXRlIE1BTklGRVNULk1GPC9hPjogYXV0b21hdGljYWxseSBnZW5lcmF0ZSBNQU5JRkVTVC5NRiBmaWxlIGJhc2VkIG9uIGRlcGVuZGVuY2llcyBpbiBzb3VyY2UgY29kZSBhcnRpZmFjdHMuPC9saT48L2Zvcm0+IiwKLQkJCQl0cnVlLCB0b29sa2l0KTsKLQkJbm90ZVRleHQuc2V0SW1hZ2UoIm1hbmlmZXN0IiwgU2VydmVySWRlVWlQbHVnaW4uZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvb3NnaV9vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCW5vdGVUZXh0LmFkZEh5cGVybGlua0xpc3RlbmVyKHRoaXMpOworICAgICAgICBGb3JtVGV4dCBub3RlVGV4dCA9IGNyZWF0ZUNsaWVudChjb250YWluZXIsCisgICAgICAgICAgICAiPGZvcm0+PHA+T1NHaSBkZXBlbmRlbmN5IG1ldGEgZGF0YSBpbiB0aGUgTUFOSUZFU1QuTUYgZmlsZSBjYW4gYXV0b21hdGljYWxseSBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlcGVuZGVuY2llcyBleHByZXNzZWQgaW4gc291cmNlIGNvZGUgYXJ0aWZhY3RzLjwvcD48cD5KYXZhIHNvdXJjZSBmaWxlcywgU3ByaW5nIFhNTCBjb25maWd1cmF0aW9uLCBKUEEgcGVyc2lzdGVuY2UueG1sIGFuZCBIaWJlcm5hdGUgLmhibSBtYXBwaW5nIGZpbGVzIHdpbGwgYmUgYW5hbHlzZWQuIFRoZSBwcm9jZXNzIHdpbGwgY3JlYXRlIEltcG9ydC1QYWNrYWdlIGFuZCBFeHBvcnQtUGFja2FnZSBoZWFkZXJzLjwvcD48bGkgc3R5bGU9XCJpbWFnZVwiIHZhbHVlPVwibWFuaWZlc3RcIiBiaW5kZW50PVwiNVwiPjxhIGhyZWY9XCJnZW5lcmF0ZVwiPlVwZGF0ZSBNQU5JRkVTVC5NRjwvYT46IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgTUFOSUZFU1QuTUYgZmlsZSBiYXNlZCBvbiBkZXBlbmRlbmNpZXMgaW4gc291cmNlIGNvZGUgYXJ0aWZhY3RzLjwvbGk+PC9mb3JtPiIsCisgICAgICAgICAgICB0cnVlLCB0b29sa2l0KTsKKyAgICAgICAgbm90ZVRleHQuc2V0SW1hZ2UoIm1hbmlmZXN0IiwgU2VydmVySWRlVWlQbHVnaW4uZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvb3NnaV9vYmouZ2lmIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIG5vdGVUZXh0LmFkZEh5cGVybGlua0xpc3RlbmVyKHRoaXMpOwogCi0JCUJ1dHRvbiBidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb250YWluZXIsICJBdXRvbWF0aWNhbGx5IHVwZGF0ZSBNQU5JRkVTVC5NRiBmaWxlIGluIGJhY2tncm91bmQuIiwKLQkJCQlTV1QuQ0hFQ0spOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJTGlzdDxJQ29tbWFuZD4gY21kcyA9IEFycmF5cy5hc0xpc3QoZGVzY3JpcHRpb24uZ2V0QnVpbGRTcGVjKCkpOwotCQkJCQkJCUxpc3Q8SUNvbW1hbmQ+IG5ld0NtZHMgPSBuZXcgQXJyYXlMaXN0PElDb21tYW5kPihjbWRzKTsKLQkJCQkJCQlpZiAoQnVuZGxvclVpUGx1Z2luLmlzQnVuZGxvckJ1aWxkaW5nKHByb2plY3QpKSB7Ci0JCQkJCQkJCWZvciAoSUNvbW1hbmQgY29uZmlnIDogY21kcykgewotCQkJCQkJCQkJaWYgKGNvbmZpZy5nZXRCdWlsZGVyTmFtZSgpLmVxdWFscyhCdW5kbG9yQ29yZVBsdWdpbi5CVUlMREVSX0lEKSkgewotCQkJCQkJCQkJCW5ld0NtZHMucmVtb3ZlKGNvbmZpZyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlJQ29tbWFuZCBjb21tYW5kID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpLm5ld0NvbW1hbmQoKTsKLQkJCQkJCQkJY29tbWFuZC5zZXRCdWlsZGVyTmFtZShCdW5kbG9yQ29yZVBsdWdpbi5CVUlMREVSX0lEKTsKLQkJCQkJCQkJbmV3Q21kcy5hZGQoY29tbWFuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghY21kcy5lcXVhbHMobmV3Q21kcykpIHsKLQkJCQkJCQkJZGVzY3JpcHRpb24uc2V0QnVpbGRTcGVjKG5ld0NtZHMudG9BcnJheShuZXcgSUNvbW1hbmRbXSB7fSkpOwotCQkJCQkJCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBtb25pdG9yKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXRyeSB7Ci0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkKLQkJCQkJCQkucnVuSW5VSShQREVQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCksIG9wLCBQREVQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUxKSB7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLQkJCQl9CisgICAgICAgIEJ1dHRvbiBidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihjb250YWluZXIsICJBdXRvbWF0aWNhbGx5IHVwZGF0ZSBNQU5JRkVTVC5NRiBmaWxlIGluIGJhY2tncm91bmQuIiwgU1dULkNIRUNLKTsKKyAgICAgICAgYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewogCi0JCQl9Ci0JCX0pOwotCQlUYWJsZVdyYXBEYXRhIGRhdGEgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCWRhdGEuaW5kZW50ID0gNTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWJvb2xlYW4gYnVpbGRpbmcgPSByZXNvdXJjZSAhPSBudWxsICYmIEJ1bmRsb3JVaVBsdWdpbi5pc0J1bmRsb3JCdWlsZGluZyhyZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQlidXR0b24uc2V0U2VsZWN0aW9uKGJ1aWxkaW5nKTsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7CiAKLQkJdG9vbGtpdC5jcmVhdGVMYWJlbChjb250YWluZXIsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IEJ1bmRsZU92ZXJ2aWV3UGFnZS50aGlzLnJlc291cmNlLmdldFByb2plY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8SUNvbW1hbmQ+IGNtZHMgPSBBcnJheXMuYXNMaXN0KGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PElDb21tYW5kPiBuZXdDbWRzID0gbmV3IEFycmF5TGlzdDxJQ29tbWFuZD4oY21kcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJ1bmRsb3JVaVBsdWdpbi5pc0J1bmRsb3JCdWlsZGluZyhwcm9qZWN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKElDb21tYW5kIGNvbmZpZyA6IGNtZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuZ2V0QnVpbGRlck5hbWUoKS5lcXVhbHMoQnVuZGxvckNvcmVQbHVnaW4uQlVJTERFUl9JRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDbWRzLnJlbW92ZShjb25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNvbW1hbmQgY29tbWFuZCA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKS5uZXdDb21tYW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQuc2V0QnVpbGRlck5hbWUoQnVuZGxvckNvcmVQbHVnaW4uQlVJTERFUl9JRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NtZHMuYWRkKGNvbW1hbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNtZHMuZXF1YWxzKG5ld0NtZHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDbWRzLnRvQXJyYXkobmV3IElDb21tYW5kW10ge30pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbW9uaXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoUERFUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLCBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBERVBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTEpIHsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgICAgIH0KIAotCQlGb3JtVGV4dCB0ZXh0ID0gY3JlYXRlQ2xpZW50KGNvbnRhaW5lciwgQlVORExFX0FDVElPTl9TRUNUSU9OX1RFWFQsIHRydWUsIHRvb2xraXQpOwotCQlQREVMYWJlbFByb3ZpZGVyIGxwID0gUERFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCXRleHQuc2V0SW1hZ2UoInBhZ2UiLCBscC5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfUEFHRV9PQkosIFNoYXJlZExhYmVsUHJvdmlkZXIuRl9FRElUKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dC5zZXRJbWFnZSgKLQkJCQkiZGVwZW5kZW5jaWVzIiwgSmF2YVVJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVhURVJOQUxfQVJDSElWRV9XSVRIX1NPVVJDRSkpOyAvLyROT04tTkxTLTEkCi0JCS8vVE9ETyBSZXBsYWNlIHRoZXNlIHdpdGggYXBwcm9wcmlhdGUgaW1hZ2VzIGFzIG5lZWRlZC4gTVRQCi0JCS8vdGV4dC5zZXRJbWFnZSgiZXhwb3J0IiwgQmVhbnNHcmFwaEltYWdlcy5nZXRJbWFnZShCZWFuc0dyYXBoSW1hZ2VzLklNR19PQkpTX0VYUE9SVF9FTkFCTEVEKSk7Ci0JCXRleHQuYWRkSHlwZXJsaW5rTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBUYWJsZVdyYXBEYXRhIGRhdGEgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7CisgICAgICAgIGRhdGEuaW5kZW50ID0gNTsKKyAgICAgICAgYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIGJvb2xlYW4gYnVpbGRpbmcgPSB0aGlzLnJlc291cmNlICE9IG51bGwgJiYgQnVuZGxvclVpUGx1Z2luLmlzQnVuZGxvckJ1aWxkaW5nKHRoaXMucmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgYnV0dG9uLnNldFNlbGVjdGlvbihidWlsZGluZyk7CiAKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29udGFpbmVyKTsKLQl9CisgICAgICAgIHRvb2xraXQuY3JlYXRlTGFiZWwoY29udGFpbmVyLCAiIik7CiAKLQlwcm90ZWN0ZWQgZmluYWwgU2VjdGlvbiBjcmVhdGVTdGF0aWNTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSKTsKLQkJc2VjdGlvbi5jbGllbnRWZXJ0aWNhbFNwYWNpbmcgPSBGb3JtTGF5b3V0RmFjdG9yeS5TRUNUSU9OX0hFQURFUl9WRVJUSUNBTF9TUEFDSU5HOwotCQlzZWN0aW9uLnNldFRleHQodGV4dCk7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZUNsZWFyVGFibGVXcmFwTGF5b3V0KGZhbHNlLCAxKSk7Ci0JCVRhYmxlV3JhcERhdGEgZGF0YSA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9CisgICAgICAgIEZvcm1UZXh0IHRleHQgPSBjcmVhdGVDbGllbnQoY29udGFpbmVyLCBCVU5ETEVfQUNUSU9OX1NFQ1RJT05fVEVYVCwgdHJ1ZSwgdG9vbGtpdCk7CisgICAgICAgIFBERUxhYmVsUHJvdmlkZXIgbHAgPSBQREVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsKKyAgICAgICAgdGV4dC5zZXRJbWFnZSgicGFnZSIsIGxwLmdldChQREVQbHVnaW5JbWFnZXMuREVTQ19QQUdFX09CSiwgU2hhcmVkTGFiZWxQcm92aWRlci5GX0VESVQpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB0ZXh0LnNldEltYWdlKCJkZXBlbmRlbmNpZXMiLCBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FWFRFUk5BTF9BUkNISVZFX1dJVEhfU09VUkNFKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgLy8gVE9ETyBSZXBsYWNlIHRoZXNlIHdpdGggYXBwcm9wcmlhdGUgaW1hZ2VzIGFzIG5lZWRlZC4gTVRQCisgICAgICAgIC8vIHRleHQuc2V0SW1hZ2UoImV4cG9ydCIsIEJlYW5zR3JhcGhJbWFnZXMuZ2V0SW1hZ2UoQmVhbnNHcmFwaEltYWdlcy5JTUdfT0JKU19FWFBPUlRfRU5BQkxFRCkpOworICAgICAgICB0ZXh0LmFkZEh5cGVybGlua0xpc3RlbmVyKHRoaXMpOwogCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVTdGF0aWNTZWN0aW9uQ2xpZW50KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZVNlY3Rpb25DbGllbnRUYWJsZVdyYXBMYXlvdXQoZmFsc2UsIDEpKTsKLQkJVGFibGVXcmFwRGF0YSBkYXRhID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9CisgICAgICAgIHNlY3Rpb24uc2V0Q2xpZW50KGNvbnRhaW5lcik7CisgICAgfQogCi0JcHJvdGVjdGVkIGZpbmFsIEZvcm1UZXh0IGNyZWF0ZUNsaWVudChDb21wb3NpdGUgc2VjdGlvbiwgU3RyaW5nIGNvbnRlbnQsIGJvb2xlYW4gcGFyc2VUYWdzLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCUZvcm1UZXh0IHRleHQgPSB0b29sa2l0LmNyZWF0ZUZvcm1UZXh0KHNlY3Rpb24sIHRydWUpOwotCQl0cnkgewotCQkJdGV4dC5zZXRUZXh0KGNvbnRlbnQsIHBhcnNlVGFncywgZmFsc2UpOwotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQkJdGV4dC5zZXRUZXh0KGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KKyAgICBwcm90ZWN0ZWQgZmluYWwgU2VjdGlvbiBjcmVhdGVTdGF0aWNTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIFNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSKTsKKyAgICAgICAgc2VjdGlvbi5jbGllbnRWZXJ0aWNhbFNwYWNpbmcgPSBGb3JtTGF5b3V0RmFjdG9yeS5TRUNUSU9OX0hFQURFUl9WRVJUSUNBTF9TUEFDSU5HOworICAgICAgICBzZWN0aW9uLnNldFRleHQodGV4dCk7CisgICAgICAgIHNlY3Rpb24uc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZUNsZWFyVGFibGVXcmFwTGF5b3V0KGZhbHNlLCAxKSk7CisgICAgICAgIFRhYmxlV3JhcERhdGEgZGF0YSA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKKyAgICAgICAgc2VjdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOworICAgICAgICByZXR1cm4gc2VjdGlvbjsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJaWYgKGUuZ2V0SHJlZigpLmVxdWFscygiZGVwZW5kZW5jaWVzIikpIHsKLQkJCWdldEVkaXRvcigpLnNldEFjdGl2ZVBhZ2UoQnVuZGxlRGVwZW5kZW5jaWVzUGFnZS5QQUdFX0lEKTsKLQkJfSBlbHNlIGlmIChlLmdldEhyZWYoKS5lcXVhbHMoInJ1bnRpbWUiKSkgewotCQkJZ2V0RWRpdG9yKCkuc2V0QWN0aXZlUGFnZShCdW5kbGVSdW50aW1lUGFnZS5QQUdFX0lEKTsKLQkJfSBlbHNlIGlmIChlLmdldEhyZWYoKS5lcXVhbHMoInJlZnJlc2hkZXBlbmRlbmNpZXMiKSkgewotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJU2VydmVyQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iLnNjaGVkdWxlQ2xhc3NwYXRoQ29udGFpbmVyVXBkYXRlSm9iKAotCQkJCQkJCUphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZS5nZXRQcm9qZWN0KCkpLCBCdW5kbGVNYW5pZmVzdE1hbmFnZXIuSU1QT1JUU19DSEFOR0VEKTsKLQkJCQl9Ci0JCQl9OwotCQkJdHJ5IHsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkKLQkJCQkJCS5ydW5JblVJKFBERVBsdWdpbi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwgb3AsIFBERVBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlMSkgewotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLQkJCX0KLQkJfSBlbHNlIGlmIChlLmdldEhyZWYoKS5lcXVhbHMoImdlbmVyYXRlIikpIHsKLQkJCUJ1bmRsb3JVaVBsdWdpbi5ydW5CdW5kbG9yT25Qcm9qZWN0KEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZS5nZXRQcm9qZWN0KCkpKTsKLQkJfSBlbHNlIGlmIChlLmdldEhyZWYoKS5lcXVhbHMoImV4cG9ydGJ1bmRsZSIpKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworICAgIHByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlU3RhdGljU2VjdGlvbkNsaWVudChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKyAgICAgICAgY29udGFpbmVyLnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVTZWN0aW9uQ2xpZW50VGFibGVXcmFwTGF5b3V0KGZhbHNlLCAxKSk7CisgICAgICAgIFRhYmxlV3JhcERhdGEgZGF0YSA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKKyAgICAgICAgY29udGFpbmVyLnNldExheW91dERhdGEoZGF0YSk7CisgICAgICAgIHJldHVybiBjb250YWluZXI7CisgICAgfQogCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlCdW5kbGVFeHBvcnRXaXphcmQgd2l6YXJkID0gbmV3IEJ1bmRsZUV4cG9ydFdpemFyZCgpOwotCQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQkJCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLAotCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZS5nZXRQcm9qZWN0KCkpIH0pKTsKLQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KKyAgICBwcm90ZWN0ZWQgZmluYWwgRm9ybVRleHQgY3JlYXRlQ2xpZW50KENvbXBvc2l0ZSBzZWN0aW9uLCBTdHJpbmcgY29udGVudCwgYm9vbGVhbiBwYXJzZVRhZ3MsIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKKyAgICAgICAgRm9ybVRleHQgdGV4dCA9IHRvb2xraXQuY3JlYXRlRm9ybVRleHQoc2VjdGlvbiwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXh0LnNldFRleHQoY29udGVudCwgcGFyc2VUYWdzLCBmYWxzZSk7CisgICAgICAgIH0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0ZXh0LnNldFRleHQoZS5nZXRNZXNzYWdlKCksIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQogCi0JcHVibGljIHZvaWQgbGlua0VudGVyZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQorICAgIHB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgeworICAgICAgICBpZiAoZS5nZXRIcmVmKCkuZXF1YWxzKCJkZXBlbmRlbmNpZXMiKSkgeworICAgICAgICAgICAgZ2V0RWRpdG9yKCkuc2V0QWN0aXZlUGFnZShCdW5kbGVEZXBlbmRlbmNpZXNQYWdlLlBBR0VfSUQpOworICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0SHJlZigpLmVxdWFscygicnVudGltZSIpKSB7CisgICAgICAgICAgICBnZXRFZGl0b3IoKS5zZXRBY3RpdmVQYWdlKEJ1bmRsZVJ1bnRpbWVQYWdlLlBBR0VfSUQpOworICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0SHJlZigpLmVxdWFscygicmVmcmVzaGRlcGVuZGVuY2llcyIpKSB7CisgICAgICAgICAgICBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewogCi0JcHVibGljIHZvaWQgbGlua0V4aXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIFNlcnZlckNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYi5zY2hlZHVsZUNsYXNzcGF0aENvbnRhaW5lclVwZGF0ZUpvYigKKyAgICAgICAgICAgICAgICAgICAgICAgIEphdmFDb3JlLmNyZWF0ZShCdW5kbGVPdmVydmlld1BhZ2UudGhpcy5yZXNvdXJjZS5nZXRQcm9qZWN0KCkpLCBCdW5kbGVNYW5pZmVzdE1hbmFnZXIuSU1QT1JUU19DSEFOR0VEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoUERFUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLCBvcCwgUERFUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUxKSB7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0SHJlZigpLmVxdWFscygiZ2VuZXJhdGUiKSkgeworICAgICAgICAgICAgQnVuZGxvclVpUGx1Z2luLnJ1bkJ1bmRsb3JPblByb2plY3QoSmF2YUNvcmUuY3JlYXRlKHRoaXMucmVzb3VyY2UuZ2V0UHJvamVjdCgpKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZS5nZXRIcmVmKCkuZXF1YWxzKCJleHBvcnRidW5kbGUiKSkgeworICAgICAgICAgICAgRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKIAotCS8qKiBGb3IgSlVuaXQgdGVzdGluZyBvbmx5ICogKi8KLQlwdWJsaWMgQnVuZGxlR2VuZXJhbEluZm9TZWN0aW9uIGdldEJ1bmRsZUdlbmVyYWxJbmZvU2VjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZkluZm9TZWN0aW9uOwotCX0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZUV4cG9ydFdpemFyZCB3aXphcmQgPSBuZXcgQnVuZGxlRXhwb3J0V2l6YXJkKCk7CisgICAgICAgICAgICAgICAgICAgIFdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7CisgICAgICAgICAgICAgICAgICAgIHdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXcgT2JqZWN0W10geyBKYXZhQ29yZS5jcmVhdGUoQnVuZGxlT3ZlcnZpZXdQYWdlLnRoaXMucmVzb3VyY2UuZ2V0UHJvamVjdCgpKSB9KSk7CisgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChIeXBlcmxpbmtFdmVudCBlKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkbworICAgIH0KKworICAgIC8qKiBGb3IgSlVuaXQgdGVzdGluZyBvbmx5ICogKi8KKyAgICBwdWJsaWMgQnVuZGxlR2VuZXJhbEluZm9TZWN0aW9uIGdldEJ1bmRsZUdlbmVyYWxJbmZvU2VjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZkluZm9TZWN0aW9uOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVRdWlja0Fzc2lzdEFzc2lzdGFudC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVRdWlja0Fzc2lzdEFzc2lzdGFudC5qYXZhCmluZGV4IGVmZTkwZmYuLjAzOGUyOGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlUXVpY2tBc3Npc3RBc3Npc3RhbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZVF1aWNrQXNzaXN0QXNzaXN0YW50LmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtNDAsMTQyICs0MSwxNDIgQEAKICAqLwogcHVibGljIGNsYXNzIEJ1bmRsZVF1aWNrQXNzaXN0QXNzaXN0YW50IGV4dGVuZHMgUXVpY2tBc3Npc3RBc3Npc3RhbnQgewogCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZSBjcmVhdGVJbWFnZTsKKyAgICBwcml2YXRlIGZpbmFsIEltYWdlIGNyZWF0ZUltYWdlOwogCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZSByZW5hbWVJbWFnZTsKKyAgICBwcml2YXRlIGZpbmFsIEltYWdlIHJlbmFtZUltYWdlOwogCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZSByZW1vdmVJbWFnZTsKKyAgICBwcml2YXRlIGZpbmFsIEltYWdlIHJlbW92ZUltYWdlOwogCi0JY2xhc3MgQnVuZGxlQ29tcGxldGlvblByb3Bvc2FsIGltcGxlbWVudHMgSUNvbXBsZXRpb25Qcm9wb3NhbCB7CisgICAgY2xhc3MgQnVuZGxlQ29tcGxldGlvblByb3Bvc2FsIGltcGxlbWVudHMgSUNvbXBsZXRpb25Qcm9wb3NhbCB7CiAKLQkJUG9zaXRpb24gcG9zaXRpb247CisgICAgICAgIFBvc2l0aW9uIHBvc2l0aW9uOwogCi0JCUlNYXJrZXJSZXNvbHV0aW9uIHJlc29sdXRpb247CisgICAgICAgIElNYXJrZXJSZXNvbHV0aW9uIHJlc29sdXRpb247CiAKLQkJSU1hcmtlciBtYXJrZXI7CisgICAgICAgIElNYXJrZXIgbWFya2VyOwogCi0JCXB1YmxpYyBCdW5kbGVDb21wbGV0aW9uUHJvcG9zYWwoSU1hcmtlclJlc29sdXRpb24gcmVzb2x1dGlvbiwgUG9zaXRpb24gcG9zLCBJTWFya2VyIG1hcmtlcikgewotCQkJcG9zaXRpb24gPSBwb3M7Ci0JCQl0aGlzLnJlc29sdXRpb24gPSByZXNvbHV0aW9uOwotCQkJdGhpcy5tYXJrZXIgPSBtYXJrZXI7Ci0JCX0KKyAgICAgICAgcHVibGljIEJ1bmRsZUNvbXBsZXRpb25Qcm9wb3NhbChJTWFya2VyUmVzb2x1dGlvbiByZXNvbHV0aW9uLCBQb3NpdGlvbiBwb3MsIElNYXJrZXIgbWFya2VyKSB7CisgICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gcG9zOworICAgICAgICAgICAgdGhpcy5yZXNvbHV0aW9uID0gcmVzb2x1dGlvbjsKKyAgICAgICAgICAgIHRoaXMubWFya2VyID0gbWFya2VyOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQlyZXNvbHV0aW9uLnJ1bihtYXJrZXIpOwotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCkgeworICAgICAgICAgICAgdGhpcy5yZXNvbHV0aW9uLnJ1bih0aGlzLm1hcmtlcik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkJcmV0dXJuIG5ldyBQb2ludChwb3NpdGlvbi5vZmZzZXQsIDApOwotCQl9CisgICAgICAgIHB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KHRoaXMucG9zaXRpb24ub2Zmc2V0LCAwKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJCWlmIChyZXNvbHV0aW9uIGluc3RhbmNlb2YgQWJzdHJhY3RQREVNYXJrZXJSZXNvbHV0aW9uKSB7Ci0JCQkJcmV0dXJuICgoQWJzdHJhY3RQREVNYXJrZXJSZXNvbHV0aW9uKSByZXNvbHV0aW9uKS5nZXREZXNjcmlwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgeworICAgICAgICAgICAgaWYgKHRoaXMucmVzb2x1dGlvbiBpbnN0YW5jZW9mIEFic3RyYWN0UERFTWFya2VyUmVzb2x1dGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybiAoKEFic3RyYWN0UERFTWFya2VyUmVzb2x1dGlvbikgdGhpcy5yZXNvbHV0aW9uKS5nZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gcmVzb2x1dGlvbi5nZXRMYWJlbCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnJlc29sdXRpb24uZ2V0TGFiZWwoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCWlmIChyZXNvbHV0aW9uIGluc3RhbmNlb2YgQWJzdHJhY3RQREVNYXJrZXJSZXNvbHV0aW9uKSB7Ci0JCQkJc3dpdGNoICgoKEFic3RyYWN0UERFTWFya2VyUmVzb2x1dGlvbikgcmVzb2x1dGlvbikuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBBYnN0cmFjdFBERU1hcmtlclJlc29sdXRpb24uQ1JFQVRFX1RZUEU6Ci0JCQkJCXJldHVybiBjcmVhdGVJbWFnZTsKLQkJCQljYXNlIEFic3RyYWN0UERFTWFya2VyUmVzb2x1dGlvbi5SRU1PVkVfVFlQRToKLQkJCQkJcmV0dXJuIHJlbW92ZUltYWdlOwotCQkJCWNhc2UgQWJzdHJhY3RQREVNYXJrZXJSZXNvbHV0aW9uLlJFTkFNRV9UWVBFOgotCQkJCQlyZXR1cm4gcmVuYW1lSW1hZ2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgcHVibGljIEltYWdlIGdldEltYWdlKCkgeworICAgICAgICAgICAgaWYgKHRoaXMucmVzb2x1dGlvbiBpbnN0YW5jZW9mIEFic3RyYWN0UERFTWFya2VyUmVzb2x1dGlvbikgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoKChBYnN0cmFjdFBERU1hcmtlclJlc29sdXRpb24pIHRoaXMucmVzb2x1dGlvbikuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQWJzdHJhY3RQREVNYXJrZXJSZXNvbHV0aW9uLkNSRUFURV9UWVBFOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJ1bmRsZVF1aWNrQXNzaXN0QXNzaXN0YW50LnRoaXMuY3JlYXRlSW1hZ2U7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQWJzdHJhY3RQREVNYXJrZXJSZXNvbHV0aW9uLlJFTU9WRV9UWVBFOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJ1bmRsZVF1aWNrQXNzaXN0QXNzaXN0YW50LnRoaXMucmVtb3ZlSW1hZ2U7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQWJzdHJhY3RQREVNYXJrZXJSZXNvbHV0aW9uLlJFTkFNRV9UWVBFOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJ1bmRsZVF1aWNrQXNzaXN0QXNzaXN0YW50LnRoaXMucmVuYW1lSW1hZ2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgICAgICBwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAotCWNsYXNzIEJ1bmRsZVF1aWNrQXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHsKKyAgICBjbGFzcyBCdW5kbGVRdWlja0Fzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElRdWlja0Fzc2lzdFByb2Nlc3NvciB7CiAKLQkJTWFwPElNYXJrZXIsIElNYXJrZXJSZXNvbHV0aW9uW10+IHJlc29sdXRpb25NYXAgPSBuZXcgSGFzaE1hcDxJTWFya2VyLCBJTWFya2VyUmVzb2x1dGlvbltdPigpOworICAgICAgICBNYXA8SU1hcmtlciwgSU1hcmtlclJlc29sdXRpb25bXT4gcmVzb2x1dGlvbk1hcCA9IG5ldyBIYXNoTWFwPElNYXJrZXIsIElNYXJrZXJSZXNvbHV0aW9uW10+KCk7CiAKLQkJcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gY2FuRml4KEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJaWYgKCEoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hcmtlckFubm90YXRpb24pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJSU1hcmtlciBtYXJrZXIgPSAoKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24pLmdldE1hcmtlcigpOwotCQkJSU1hcmtlclJlc29sdXRpb25bXSByZXNvbHV0aW9ucyA9IElERS5nZXRNYXJrZXJIZWxwUmVnaXN0cnkoKS5nZXRSZXNvbHV0aW9ucyhtYXJrZXIpOwotCQkJYm9vbGVhbiBjYW5GaXggPSByZXNvbHV0aW9ucy5sZW5ndGggPiAwOwotCQkJaWYgKGNhbkZpeCkgewotCQkJCWlmICghcmVzb2x1dGlvbk1hcC5jb250YWluc0tleShtYXJrZXIpKSB7Ci0JCQkJCXJlc29sdXRpb25NYXAucHV0KG1hcmtlciwgcmVzb2x1dGlvbnMpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjYW5GaXg7Ci0JCX0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuRml4KEFubm90YXRpb24gYW5ub3RhdGlvbikgeworICAgICAgICAgICAgaWYgKCEoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hcmtlckFubm90YXRpb24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24pLmdldE1hcmtlcigpOworICAgICAgICAgICAgSU1hcmtlclJlc29sdXRpb25bXSByZXNvbHV0aW9ucyA9IElERS5nZXRNYXJrZXJIZWxwUmVnaXN0cnkoKS5nZXRSZXNvbHV0aW9ucyhtYXJrZXIpOworICAgICAgICAgICAgYm9vbGVhbiBjYW5GaXggPSByZXNvbHV0aW9ucy5sZW5ndGggPiAwOworICAgICAgICAgICAgaWYgKGNhbkZpeCkgeworICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZXNvbHV0aW9uTWFwLmNvbnRhaW5zS2V5KG1hcmtlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHV0aW9uTWFwLnB1dChtYXJrZXIsIHJlc29sdXRpb25zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2FuRml4OworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gY2FuQXNzaXN0KElRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuQXNzaXN0KElRdWlja0Fzc2lzdEludm9jYXRpb25Db250ZXh0IGludm9jYXRpb25Db250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVRdWlja0Fzc2lzdFByb3Bvc2FscyhJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCkgewotCQkJSUFubm90YXRpb25Nb2RlbCBhbW9kZWwgPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRTb3VyY2VWaWV3ZXIoKS5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJCUlEb2N1bWVudCBkb2MgPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRTb3VyY2VWaWV3ZXIoKS5nZXREb2N1bWVudCgpOworICAgICAgICBwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVRdWlja0Fzc2lzdFByb3Bvc2FscyhJUXVpY2tBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBpbnZvY2F0aW9uQ29udGV4dCkgeworICAgICAgICAgICAgSUFubm90YXRpb25Nb2RlbCBhbW9kZWwgPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRTb3VyY2VWaWV3ZXIoKS5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKKyAgICAgICAgICAgIElEb2N1bWVudCBkb2MgPSBpbnZvY2F0aW9uQ29udGV4dC5nZXRTb3VyY2VWaWV3ZXIoKS5nZXREb2N1bWVudCgpOwogCi0JCQlpbnQgb2Zmc2V0ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCk7Ci0JCQlJdGVyYXRvcjw/PiBpdCA9IGFtb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKLQkJCUxpc3Q8QnVuZGxlQ29tcGxldGlvblByb3Bvc2FsPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxCdW5kbGVDb21wbGV0aW9uUHJvcG9zYWw+KCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGtleSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoIShrZXkgaW5zdGFuY2VvZiBNYXJrZXJBbm5vdGF0aW9uKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaW52b2NhdGlvbkNvbnRleHQuZ2V0T2Zmc2V0KCk7CisgICAgICAgICAgICBJdGVyYXRvcjw/PiBpdCA9IGFtb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKKyAgICAgICAgICAgIExpc3Q8QnVuZGxlQ29tcGxldGlvblByb3Bvc2FsPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxCdW5kbGVDb21wbGV0aW9uUHJvcG9zYWw+KCk7CisgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIShrZXkgaW5zdGFuY2VvZiBNYXJrZXJBbm5vdGF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTWFya2VyQW5ub3RhdGlvbikga2V5OwotCQkJCUlNYXJrZXIgbWFya2VyID0gYW5ub3RhdGlvbi5nZXRNYXJrZXIoKTsKKyAgICAgICAgICAgICAgICBNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTWFya2VyQW5ub3RhdGlvbikga2V5OworICAgICAgICAgICAgICAgIElNYXJrZXIgbWFya2VyID0gYW5ub3RhdGlvbi5nZXRNYXJrZXIoKTsKIAotCQkJCUlNYXJrZXJSZXNvbHV0aW9uW10gbWFwcGluZyA9IHJlc29sdXRpb25NYXAuZ2V0KG1hcmtlcik7Ci0JCQkJaWYgKG1hcHBpbmcgIT0gbnVsbCkgewotCQkJCQlQb3NpdGlvbiBwb3MgPSBhbW9kZWwuZ2V0UG9zaXRpb24oYW5ub3RhdGlvbik7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbnQgbGluZSA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQocG9zLmdldE9mZnNldCgpKTsKLQkJCQkJCWludCBzdGFydCA9IHBvcy5nZXRPZmZzZXQoKTsKLQkJCQkJCVN0cmluZyBkZWxpbSA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKGxpbmUpOwotCQkJCQkJaW50IGRlbGltTGVuZ3RoID0gZGVsaW0gIT0gbnVsbCA/IGRlbGltLmxlbmd0aCgpIDogMDsKLQkJCQkJCWludCBlbmQgPSBkb2MuZ2V0TGluZUxlbmd0aChsaW5lKSArIHN0YXJ0IC0gZGVsaW1MZW5ndGg7Ci0JCQkJCQlpZiAob2Zmc2V0ID49IHN0YXJ0ICYmIG9mZnNldCA8PSBlbmQpIHsKLQkJCQkJCQlmb3IgKElNYXJrZXJSZXNvbHV0aW9uIGVsZW1lbnQgOiBtYXBwaW5nKSB7Ci0JCQkJCQkJCWxpc3QuYWRkKG5ldyBCdW5kbGVDb21wbGV0aW9uUHJvcG9zYWwoZWxlbWVudCwgcG9zLCBtYXJrZXIpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQorICAgICAgICAgICAgICAgIElNYXJrZXJSZXNvbHV0aW9uW10gbWFwcGluZyA9IHRoaXMucmVzb2x1dGlvbk1hcC5nZXQobWFya2VyKTsKKyAgICAgICAgICAgICAgICBpZiAobWFwcGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uIHBvcyA9IGFtb2RlbC5nZXRQb3NpdGlvbihhbm5vdGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChwb3MuZ2V0T2Zmc2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gcG9zLmdldE9mZnNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlbGltID0gZG9jLmdldExpbmVEZWxpbWl0ZXIobGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsaW1MZW5ndGggPSBkZWxpbSAhPSBudWxsID8gZGVsaW0ubGVuZ3RoKCkgOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZCA9IGRvYy5nZXRMaW5lTGVuZ3RoKGxpbmUpICsgc3RhcnQgLSBkZWxpbUxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gc3RhcnQgJiYgb2Zmc2V0IDw9IGVuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSU1hcmtlclJlc29sdXRpb24gZWxlbWVudCA6IG1hcHBpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQobmV3IEJ1bmRsZUNvbXBsZXRpb25Qcm9wb3NhbChlbGVtZW50LCBwb3MsIG1hcmtlcikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2xpc3Quc2l6ZSgpXSk7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxpc3QudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtsaXN0LnNpemUoKV0pOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIEJ1bmRsZVF1aWNrQXNzaXN0QXNzaXN0YW50KCkgewotCQlzZXRRdWlja0Fzc2lzdFByb2Nlc3NvcihuZXcgQnVuZGxlUXVpY2tBc3Npc3RQcm9jZXNzb3IoKSk7Ci0JCWNyZWF0ZUltYWdlID0gUERFUGx1Z2luSW1hZ2VzLkRFU0NfQUREX0FUVC5jcmVhdGVJbWFnZSgpOwotCQlyZW1vdmVJbWFnZSA9IFBERVBsdWdpbkltYWdlcy5ERVNDX0RFTEVURS5jcmVhdGVJbWFnZSgpOwotCQlyZW5hbWVJbWFnZSA9IFBERVBsdWdpbkltYWdlcy5ERVNDX1JFRlJFU0guY3JlYXRlSW1hZ2UoKTsKLQl9CisgICAgcHVibGljIEJ1bmRsZVF1aWNrQXNzaXN0QXNzaXN0YW50KCkgeworICAgICAgICBzZXRRdWlja0Fzc2lzdFByb2Nlc3NvcihuZXcgQnVuZGxlUXVpY2tBc3Npc3RQcm9jZXNzb3IoKSk7CisgICAgICAgIHRoaXMuY3JlYXRlSW1hZ2UgPSBQREVQbHVnaW5JbWFnZXMuREVTQ19BRERfQVRULmNyZWF0ZUltYWdlKCk7CisgICAgICAgIHRoaXMucmVtb3ZlSW1hZ2UgPSBQREVQbHVnaW5JbWFnZXMuREVTQ19ERUxFVEUuY3JlYXRlSW1hZ2UoKTsKKyAgICAgICAgdGhpcy5yZW5hbWVJbWFnZSA9IFBERVBsdWdpbkltYWdlcy5ERVNDX1JFRlJFU0guY3JlYXRlSW1hZ2UoKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljcmVhdGVJbWFnZS5kaXNwb3NlKCk7Ci0JCXJlbW92ZUltYWdlLmRpc3Bvc2UoKTsKLQkJcmVuYW1lSW1hZ2UuZGlzcG9zZSgpOwotCX0KKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICB0aGlzLmNyZWF0ZUltYWdlLmRpc3Bvc2UoKTsKKyAgICAgICAgdGhpcy5yZW1vdmVJbWFnZS5kaXNwb3NlKCk7CisgICAgICAgIHRoaXMucmVuYW1lSW1hZ2UuZGlzcG9zZSgpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVSdW50aW1lUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9CdW5kbGVSdW50aW1lUGFnZS5qYXZhCmluZGV4IDdlNTEwOTcuLjI2YzJjNzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvQnVuZGxlUnVudGltZVBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0J1bmRsZVJ1bnRpbWVQYWdlLmphdmEKQEAgLTgsMTIgKzgsMTQgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7CkBAIC0zOCw5MiArNDAsODkgQEAKICAqLwogcHVibGljIGNsYXNzIEJ1bmRsZVJ1bnRpbWVQYWdlIGV4dGVuZHMgUERFRm9ybVBhZ2UgaW1wbGVtZW50cyBJQnVuZGxlTWFuaWZlc3RTYXZlTGlzdGVuZXIgewogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9JRCA9ICJidW5kbGVfcnVudGltZSI7IC8vJE5PTi1OTFMtMSQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0lEID0gImJ1bmRsZV9ydW50aW1lIjsgLy8kTk9OLU5MUy0xJAogCi0JcHJpdmF0ZSBCdW5kbGVFeHBvcnRQYWNrYWdlU2VjdGlvbiBidW5kbGVFeHBvcnRQYWNrYWdlU2VjdGlvbiA9IG51bGw7CisgICAgcHJpdmF0ZSBCdW5kbGVFeHBvcnRQYWNrYWdlU2VjdGlvbiBidW5kbGVFeHBvcnRQYWNrYWdlU2VjdGlvbiA9IG51bGw7CiAKLQlwcml2YXRlIEJ1bmRsZUxpYnJhcnlTZWN0aW9uIGJ1bmRsZUxpYnJhcnlTZWN0aW9uID0gbnVsbDsKKyAgICBwcml2YXRlIEJ1bmRsZUxpYnJhcnlTZWN0aW9uIGJ1bmRsZUxpYnJhcnlTZWN0aW9uID0gbnVsbDsKIAotCXByb3RlY3RlZCBTY3JvbGxlZEZvcm0gZm9ybSA9IG51bGw7CisgICAgcHJvdGVjdGVkIFNjcm9sbGVkRm9ybSBmb3JtID0gbnVsbDsKIAotCXByb3RlY3RlZCBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOworICAgIHByb3RlY3RlZCBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0VSUk9SUyA9ICJSdW50aW1lOiBQbGVhc2UgY29ycmVjdCBvbmUgb3IgbW9yZSBlcnJvcnMgaW4gdGhlIG1hbmlmZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1RfRVJST1JTID0gIlJ1bnRpbWU6IFBsZWFzZSBjb3JyZWN0IG9uZSBvciBtb3JlIGVycm9ycyBpbiB0aGUgbWFuaWZlc3QiOwogCi0JcHVibGljIEJ1bmRsZVJ1bnRpbWVQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgUEFHRV9JRCwgUERFVUlNZXNzYWdlcy5SdW50aW1lUGFnZV90YWJOYW1lKTsKLQl9CisgICAgcHVibGljIEJ1bmRsZVJ1bnRpbWVQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7CisgICAgICAgIHN1cGVyKGVkaXRvciwgUEFHRV9JRCwgUERFVUlNZXNzYWdlcy5SdW50aW1lUGFnZV90YWJOYW1lKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWZvcm0pOwotCQlmb3JtID0gbWZvcm0uZ2V0Rm9ybSgpOwotCQlmb3JtLnNldEltYWdlKFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldChQREVQbHVnaW5JbWFnZXMuREVTQ19KQVZBX0xJQl9PQkopKTsKLQkJZm9ybS5zZXRUZXh0KFBERVVJTWVzc2FnZXMuTWFuaWZlc3RFZGl0b3JfUnVudGltZUZvcm1fdGl0bGUpOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtZm9ybSkgeworICAgICAgICBzdXBlci5jcmVhdGVGb3JtQ29udGVudChtZm9ybSk7CisgICAgICAgIHRoaXMuZm9ybSA9IG1mb3JtLmdldEZvcm0oKTsKKyAgICAgICAgdGhpcy5mb3JtLnNldEltYWdlKFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldChQREVQbHVnaW5JbWFnZXMuREVTQ19KQVZBX0xJQl9PQkopKTsKKyAgICAgICAgdGhpcy5mb3JtLnNldFRleHQoUERFVUlNZXNzYWdlcy5NYW5pZmVzdEVkaXRvcl9SdW50aW1lRm9ybV90aXRsZSk7CiAKLQkJQ29tcG9zaXRlIGJvZHkgPSBmb3JtLmdldEJvZHkoKTsKLQkJYm9keS5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlRm9ybUdyaWRMYXlvdXQodHJ1ZSwgMikpOwotCQlDb21wb3NpdGUgbGVmdCwgcmlnaHQ7Ci0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtZm9ybS5nZXRUb29sa2l0KCk7Ci0JCWxlZnQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShib2R5LCBTV1QuTk9ORSk7Ci0JCWxlZnQuc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZUZvcm1QYW5lR3JpZExheW91dChmYWxzZSwgMSkpOwotCQlsZWZ0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlyaWdodCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGJvZHksIFNXVC5OT05FKTsKLQkJcmlnaHQuc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZUZvcm1QYW5lR3JpZExheW91dChmYWxzZSwgMSkpOwotCQlyaWdodC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKyAgICAgICAgQ29tcG9zaXRlIGJvZHkgPSB0aGlzLmZvcm0uZ2V0Qm9keSgpOworICAgICAgICBib2R5LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVGb3JtR3JpZExheW91dCh0cnVlLCAyKSk7CisgICAgICAgIENvbXBvc2l0ZSBsZWZ0LCByaWdodDsKKyAgICAgICAgRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1mb3JtLmdldFRvb2xraXQoKTsKKyAgICAgICAgbGVmdCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGJvZHksIFNXVC5OT05FKTsKKyAgICAgICAgbGVmdC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlRm9ybVBhbmVHcmlkTGF5b3V0KGZhbHNlLCAxKSk7CisgICAgICAgIGxlZnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CisgICAgICAgIHJpZ2h0ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoYm9keSwgU1dULk5PTkUpOworICAgICAgICByaWdodC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlRm9ybVBhbmVHcmlkTGF5b3V0KGZhbHNlLCAxKSk7CisgICAgICAgIHJpZ2h0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwogCi0JCWJ1bmRsZUV4cG9ydFBhY2thZ2VTZWN0aW9uID0gbmV3IEJ1bmRsZUV4cG9ydFBhY2thZ2VTZWN0aW9uKHRoaXMsIGxlZnQpOwotCQlidW5kbGVMaWJyYXJ5U2VjdGlvbiA9IG5ldyBCdW5kbGVMaWJyYXJ5U2VjdGlvbih0aGlzLCByaWdodCk7CisgICAgICAgIHRoaXMuYnVuZGxlRXhwb3J0UGFja2FnZVNlY3Rpb24gPSBuZXcgQnVuZGxlRXhwb3J0UGFja2FnZVNlY3Rpb24odGhpcywgbGVmdCk7CisgICAgICAgIHRoaXMuYnVuZGxlTGlicmFyeVNlY3Rpb24gPSBuZXcgQnVuZGxlTGlicmFyeVNlY3Rpb24odGhpcywgcmlnaHQpOwogCi0JCW1mb3JtLmFkZFBhcnQoYnVuZGxlRXhwb3J0UGFja2FnZVNlY3Rpb24pOwotCQltZm9ybS5hZGRQYXJ0KGJ1bmRsZUxpYnJhcnlTZWN0aW9uKTsKKyAgICAgICAgbWZvcm0uYWRkUGFydCh0aGlzLmJ1bmRsZUV4cG9ydFBhY2thZ2VTZWN0aW9uKTsKKyAgICAgICAgbWZvcm0uYWRkUGFydCh0aGlzLmJ1bmRsZUxpYnJhcnlTZWN0aW9uKTsKIAotCQlJUGx1Z2luTW9kZWxCYXNlIG1vZGVsID0gKElQbHVnaW5Nb2RlbEJhc2UpICgoQnVuZGxlTWFuaWZlc3RFZGl0b3IpIHRoaXMuZ2V0RWRpdG9yKCkpLmdldEFnZ3JlZ2F0ZU1vZGVsKCk7Ci0JCXJlc291cmNlID0gbW9kZWwuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCXVwZGF0ZUZvcm1UZXh0KCk7Ci0JfQorICAgICAgICBJUGx1Z2luTW9kZWxCYXNlIG1vZGVsID0gKElQbHVnaW5Nb2RlbEJhc2UpICgoQnVuZGxlTWFuaWZlc3RFZGl0b3IpIHRoaXMuZ2V0RWRpdG9yKCkpLmdldEFnZ3JlZ2F0ZU1vZGVsKCk7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSBtb2RlbC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKyAgICAgICAgdXBkYXRlRm9ybVRleHQoKTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBtYW5pZmVzdFNhdmVkKCkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdXBkYXRlRm9ybVRleHQoKTsKLQkJfQotCX0KKyAgICBwdWJsaWMgdm9pZCBtYW5pZmVzdFNhdmVkKCkgeworICAgICAgICBpZiAodGhpcy5yZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICB1cGRhdGVGb3JtVGV4dCgpOworICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRm9ybVRleHQoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBXYWl0IGZvciBidWlsZAotCQkJSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCVN0YXR1c0hhbmRsZXIubG9nKG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBTZXJ2ZXJJZGVVaVBsdWdpbi5QTFVHSU5fSUQsICJDb3VsZCBub3QgdXBkYXRlIHBhZ2UgdGl0bGUgdGV4dCIsCi0JCQkJCWUpKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJU3RhdHVzSGFuZGxlci5sb2cobmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsIFNlcnZlcklkZVVpUGx1Z2luLlBMVUdJTl9JRCwgIkNvdWxkIG5vdCB1cGRhdGUgcGFnZSB0aXRsZSB0ZXh0IiwKLQkJCQkJZSkpOwotCQl9CisgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlRm9ybVRleHQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBXYWl0IGZvciBidWlsZAorICAgICAgICAgICAgSm9iLmdldEpvYk1hbmFnZXIoKS5qb2luKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0YXR1c0hhbmRsZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELCAiQ291bGQgbm90IHVwZGF0ZSBwYWdlIHRpdGxlIHRleHQiLCBlKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0YXR1c0hhbmRsZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELCAiQ291bGQgbm90IHVwZGF0ZSBwYWdlIHRpdGxlIHRleHQiLCBlKSk7CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKG51bGwsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlpZiAoTWFuaWZlc3RFZGl0b3JVdGlscy5oYXNFcnJvclNldmVyaXR5TWFya2VyKG1hcmtlcnMpKSB7Ci0JCQkJCWZvcm0uc2V0VGV4dChNQU5JRkVTVF9FUlJPUlMpOwotCQkJCQlmb3JtLnNldEltYWdlKFNlcnZlcklkZVVpUGx1Z2luLmdldEltYWdlKCJmdWxsL29iajE2L21hbmlmZXN0X2Vycm9yLnBuZyIpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmb3JtLnNldFRleHQoUERFVUlNZXNzYWdlcy5NYW5pZmVzdEVkaXRvcl9SdW50aW1lRm9ybV90aXRsZSk7Ci0JCQkJCWZvcm0uc2V0SW1hZ2UoU2VydmVySWRlVWlQbHVnaW4uZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvb3NnaV9vYmouZ2lmIikpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGF0dXNIYW5kbGVyLmxvZyhuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELCAiQ291bGQgbm90IHVwZGF0ZSBwYWdlIHRpdGxlIHRleHQiLAotCQkJCQllKSk7Ci0JCX0KLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodGhpcy5yZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSU1hcmtlcltdIG1hcmtlcnMgPSB0aGlzLnJlc291cmNlLmZpbmRNYXJrZXJzKG51bGwsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKKyAgICAgICAgICAgICAgICBpZiAoTWFuaWZlc3RFZGl0b3JVdGlscy5oYXNFcnJvclNldmVyaXR5TWFya2VyKG1hcmtlcnMpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zZXRUZXh0KE1BTklGRVNUX0VSUk9SUyk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zZXRJbWFnZShTZXJ2ZXJJZGVVaVBsdWdpbi5nZXRJbWFnZSgiZnVsbC9vYmoxNi9tYW5pZmVzdF9lcnJvci5wbmciKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLnNldFRleHQoUERFVUlNZXNzYWdlcy5NYW5pZmVzdEVkaXRvcl9SdW50aW1lRm9ybV90aXRsZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zZXRJbWFnZShTZXJ2ZXJJZGVVaVBsdWdpbi5nZXRJbWFnZSgiZnVsbC9vYmoxNi9vc2dpX29iai5naWYiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0YXR1c0hhbmRsZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELCAiQ291bGQgbm90IHVwZGF0ZSBwYWdlIHRpdGxlIHRleHQiLCBlKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgQnVuZGxlRXhwb3J0UGFja2FnZVNlY3Rpb24gZ2V0QnVuZGxlRXhwb3J0UGFja2FnZVNlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmJ1bmRsZUV4cG9ydFBhY2thZ2VTZWN0aW9uOwotCX0KKyAgICBwdWJsaWMgQnVuZGxlRXhwb3J0UGFja2FnZVNlY3Rpb24gZ2V0QnVuZGxlRXhwb3J0UGFja2FnZVNlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJ1bmRsZUV4cG9ydFBhY2thZ2VTZWN0aW9uOworICAgIH0KIAotCXB1YmxpYyBCdW5kbGVMaWJyYXJ5U2VjdGlvbiBnZXRCdW5kbGVMaWJyYXJ5U2VjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuYnVuZGxlTGlicmFyeVNlY3Rpb247Ci0JfQorICAgIHB1YmxpYyBCdW5kbGVMaWJyYXJ5U2VjdGlvbiBnZXRCdW5kbGVMaWJyYXJ5U2VjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYnVuZGxlTGlicmFyeVNlY3Rpb247CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0lCdW5kbGVNYW5pZmVzdFNhdmVMaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9JQnVuZGxlTWFuaWZlc3RTYXZlTGlzdGVuZXIuamF2YQppbmRleCA1OGUzZWVkLi43MWI3ZDkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL0lCdW5kbGVNYW5pZmVzdFNhdmVMaXN0ZW5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvSUJ1bmRsZU1hbmlmZXN0U2F2ZUxpc3RlbmVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIC8qKgpAQCAtMTUsNyArMTYsNyBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIElCdW5kbGVNYW5pZmVzdFNhdmVMaXN0ZW5lciB7CiAKLQkvKiogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIG1hbmlmZXN0IGVkaXRvciBoYXMgYmVlbiBzYXZlZCAqLwotCXZvaWQgbWFuaWZlc3RTYXZlZCgpOworICAgIC8qKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWFuaWZlc3QgZWRpdG9yIGhhcyBiZWVuIHNhdmVkICovCisgICAgdm9pZCBtYW5pZmVzdFNhdmVkKCk7CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvTWFuaWZlc3RFZGl0b3JVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9NYW5pZmVzdEVkaXRvclV0aWxzLmphdmEKaW5kZXggZGI5ZDIwYy4uYTlmNzQyMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9NYW5pZmVzdEVkaXRvclV0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9NYW5pZmVzdEVkaXRvclV0aWxzLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTI0LDQ0ICsyNSw0MyBAQAogICovCiBwdWJsaWMgY2xhc3MgTWFuaWZlc3RFZGl0b3JVdGlscyB7CiAKLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBkb3dubG9hZGFibGUgYXJ0aWZhY3RzIHdoZXJlIG9ubHkgdGhlIGxhdGVzdCB2ZXJzaW9ucyBhcmUgaW5jbHVkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU9sZFZlcnNpb25zKFNldDxBcnRlZmFjdD4gYnVuZGxlcykgewotCQlNYXA8U3RyaW5nLCBBcnRlZmFjdD4gc3ltYm9saWNOYW1lVG9IaWdoZXN0VmVyc2lvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJ0ZWZhY3Q+KGJ1bmRsZXMuc2l6ZSgpKTsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBkb3dubG9hZGFibGUgYXJ0aWZhY3RzIHdoZXJlIG9ubHkgdGhlIGxhdGVzdCB2ZXJzaW9ucyBhcmUgaW5jbHVkZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZU9sZFZlcnNpb25zKFNldDxBcnRlZmFjdD4gYnVuZGxlcykgeworICAgICAgICBNYXA8U3RyaW5nLCBBcnRlZmFjdD4gc3ltYm9saWNOYW1lVG9IaWdoZXN0VmVyc2lvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJ0ZWZhY3Q+KGJ1bmRsZXMuc2l6ZSgpKTsKIAotCQlTZXQ8QXJ0ZWZhY3Q+IG9sZEFydGlmYWN0cyA9IG5ldyBIYXNoU2V0PEFydGVmYWN0PigpOworICAgICAgICBTZXQ8QXJ0ZWZhY3Q+IG9sZEFydGlmYWN0cyA9IG5ldyBIYXNoU2V0PEFydGVmYWN0PigpOwogCi0JCWZvciAoQXJ0ZWZhY3QgY3VyckFydGlmYWN0RGVmaW5pdGlvbiA6IGJ1bmRsZXMpIHsKLQkJCUFydGVmYWN0IG1hcHBlZEFydGlmYWN0ID0gc3ltYm9saWNOYW1lVG9IaWdoZXN0VmVyc2lvbk1hcC5nZXQoY3VyckFydGlmYWN0RGVmaW5pdGlvbi5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQlpZiAobWFwcGVkQXJ0aWZhY3QgPT0gbnVsbCkgewotCQkJCXN5bWJvbGljTmFtZVRvSGlnaGVzdFZlcnNpb25NYXAucHV0KGN1cnJBcnRpZmFjdERlZmluaXRpb24uZ2V0U3ltYm9saWNOYW1lKCksIGN1cnJBcnRpZmFjdERlZmluaXRpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY3VyckFydGlmYWN0RGVmaW5pdGlvbi5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKG1hcHBlZEFydGlmYWN0LmdldFZlcnNpb24oKSkgPD0gMCkgewotCQkJCQlvbGRBcnRpZmFjdHMuYWRkKGN1cnJBcnRpZmFjdERlZmluaXRpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9sZEFydGlmYWN0cy5hZGQobWFwcGVkQXJ0aWZhY3QpOwotCQkJCQlzeW1ib2xpY05hbWVUb0hpZ2hlc3RWZXJzaW9uTWFwLnB1dChjdXJyQXJ0aWZhY3REZWZpbml0aW9uLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCWN1cnJBcnRpZmFjdERlZmluaXRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICBmb3IgKEFydGVmYWN0IGN1cnJBcnRpZmFjdERlZmluaXRpb24gOiBidW5kbGVzKSB7CisgICAgICAgICAgICBBcnRlZmFjdCBtYXBwZWRBcnRpZmFjdCA9IHN5bWJvbGljTmFtZVRvSGlnaGVzdFZlcnNpb25NYXAuZ2V0KGN1cnJBcnRpZmFjdERlZmluaXRpb24uZ2V0U3ltYm9saWNOYW1lKCkpOworICAgICAgICAgICAgaWYgKG1hcHBlZEFydGlmYWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzeW1ib2xpY05hbWVUb0hpZ2hlc3RWZXJzaW9uTWFwLnB1dChjdXJyQXJ0aWZhY3REZWZpbml0aW9uLmdldFN5bWJvbGljTmFtZSgpLCBjdXJyQXJ0aWZhY3REZWZpbml0aW9uKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJBcnRpZmFjdERlZmluaXRpb24uZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyhtYXBwZWRBcnRpZmFjdC5nZXRWZXJzaW9uKCkpIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkQXJ0aWZhY3RzLmFkZChjdXJyQXJ0aWZhY3REZWZpbml0aW9uKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvbGRBcnRpZmFjdHMuYWRkKG1hcHBlZEFydGlmYWN0KTsKKyAgICAgICAgICAgICAgICAgICAgc3ltYm9saWNOYW1lVG9IaWdoZXN0VmVyc2lvbk1hcC5wdXQoY3VyckFydGlmYWN0RGVmaW5pdGlvbi5nZXRTeW1ib2xpY05hbWUoKSwgY3VyckFydGlmYWN0RGVmaW5pdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJYnVuZGxlcy5yZW1vdmVBbGwob2xkQXJ0aWZhY3RzKTsKLQl9CisgICAgICAgIGJ1bmRsZXMucmVtb3ZlQWxsKG9sZEFydGlmYWN0cyk7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBhcnJheSBjb250YWlucyBhIG1hcmtlciB3aGVyZSB0aGUgc2V2ZXJpdHkgaXMgRVJST1IuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0Vycm9yU2V2ZXJpdHlNYXJrZXIoSU1hcmtlcltdIG1hcmtlcnMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFycmF5IGNvbnRhaW5zIGEgbWFya2VyIHdoZXJlIHRoZSBzZXZlcml0eSBpcyBFUlJPUi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzRXJyb3JTZXZlcml0eU1hcmtlcihJTWFya2VyW10gbWFya2VycykgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCi0JCWZvciAoSU1hcmtlciBjdXJyTWFya2VyIDogbWFya2VycykgewotCQkJSW50ZWdlciBzZXZlcml0eSA9IChJbnRlZ2VyKSBjdXJyTWFya2VyLmdldEF0dHJpYnV0ZSgic2V2ZXJpdHkiKTsKLQkJCWlmIChzZXZlcml0eSAhPSBudWxsICYmIHNldmVyaXR5LmludFZhbHVlKCkgPT0gMikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgICAgIGZvciAoSU1hcmtlciBjdXJyTWFya2VyIDogbWFya2VycykgeworICAgICAgICAgICAgSW50ZWdlciBzZXZlcml0eSA9IChJbnRlZ2VyKSBjdXJyTWFya2VyLmdldEF0dHJpYnV0ZSgic2V2ZXJpdHkiKTsKKyAgICAgICAgICAgIGlmIChzZXZlcml0eSAhPSBudWxsICYmIHNldmVyaXR5LmludFZhbHVlKCkgPT0gMikgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGFyRGVwZW5kZW5jaWVzU2VjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QYXJEZXBlbmRlbmNpZXNTZWN0aW9uLmphdmEKaW5kZXggNjZkMDk4YS4uZjY4ZDgwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QYXJEZXBlbmRlbmNpZXNTZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QYXJEZXBlbmRlbmNpZXNTZWN0aW9uLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMzgsMTEzICszOSwxMTEgQEAKICAqLwogcHVibGljIGNsYXNzIFBhckRlcGVuZGVuY2llc1NlY3Rpb24gZXh0ZW5kcyBEZXBlbmRlbmNpZXNTZWN0aW9uIHsKIAotCXByaXZhdGUgZmluYWwgUGFyWG1sRWRpdG9yUGFnZSBwYWdlOworICAgIHByaXZhdGUgZmluYWwgUGFyWG1sRWRpdG9yUGFnZSBwYWdlOwogCi0JcHJpdmF0ZSBQYXIgcGFyOworICAgIHByaXZhdGUgUGFyIHBhcjsKIAotCXB1YmxpYyBQYXJEZXBlbmRlbmNpZXNTZWN0aW9uKFBhclhtbEVkaXRvclBhZ2UgcGFnZSwgQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gYnV0dG9uTGFiZWxzKSB7Ci0JCXN1cGVyKHBhZ2UsIHBhcmVudCwgYnV0dG9uTGFiZWxzKTsKLQkJdGhpcy5wYWdlID0gcGFnZTsKLQkJaW5pdGlhbGl6ZSgpOwotCQlnZXRTZWN0aW9uKCkuc2V0VGV4dCgiTmVzdGVkIEJ1bmRsZXMiKTsKLQkJZ2V0U2VjdGlvbigpLnNldERlc2NyaXB0aW9uKCJBZGQgb3IgcmVtb3ZlIGJ1bmRsZSBkZXBlbmRlbmNpZXMgdG8gdGhlIFBBUi4iKTsKLQl9CisgICAgcHVibGljIFBhckRlcGVuZGVuY2llc1NlY3Rpb24oUGFyWG1sRWRpdG9yUGFnZSBwYWdlLCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBidXR0b25MYWJlbHMpIHsKKyAgICAgICAgc3VwZXIocGFnZSwgcGFyZW50LCBidXR0b25MYWJlbHMpOworICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlOworICAgICAgICBpbml0aWFsaXplKCk7CisgICAgICAgIGdldFNlY3Rpb24oKS5zZXRUZXh0KCJOZXN0ZWQgQnVuZGxlcyIpOworICAgICAgICBnZXRTZWN0aW9uKCkuc2V0RGVzY3JpcHRpb24oIkFkZCBvciByZW1vdmUgYnVuZGxlIGRlcGVuZGVuY2llcyB0byB0aGUgUEFSLiIpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZUJ1dHRvbnMoKSB7Ci0JCWlmIChnZXRUYWJsZVZpZXdlcigpICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIHNlbGVjdGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0VGFibGVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOwotCQkJaW50IHNpemUgPSBzZWxlY3RlZC5sZW5ndGg7Ci0JCQlUYWJsZVBhcnQgdGFibGVQYXJ0ID0gZ2V0VGFibGVQYXJ0KCk7Ci0JCQl0YWJsZVBhcnQuc2V0QnV0dG9uRW5hYmxlZChnZXRSZW1vdmVJbmRleCgpLCBzaXplID4gMCk7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZW5hYmxlQnV0dG9ucygpIHsKKyAgICAgICAgaWYgKGdldFRhYmxlVmlld2VyKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgT2JqZWN0W10gc2VsZWN0ZWQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRUYWJsZVZpZXdlcigpLmdldFNlbGVjdGlvbigpKS50b0FycmF5KCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IHNlbGVjdGVkLmxlbmd0aDsKKyAgICAgICAgICAgIFRhYmxlUGFydCB0YWJsZVBhcnQgPSBnZXRUYWJsZVBhcnQoKTsKKyAgICAgICAgICAgIHRhYmxlUGFydC5zZXRCdXR0b25FbmFibGVkKGdldFJlbW92ZUluZGV4KCksIHNpemUgPiAwKTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVudHJ5TW9kaWZpZWQoT2JqZWN0IGVudHJ5LCBTdHJpbmcgdmFsdWUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGVudHJ5TW9kaWZpZWQoT2JqZWN0IGVudHJ5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCi0JfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZCgpIHsKLQkJLy8gZ2V0IGxpc3Qgb2YgZmFjZXQgcHJvamVjdHMgdGhhdCBhcmUgbm90IGluIHRoZSBtb2RlbAotCQlMaXN0PElQcm9qZWN0PiBmYWNldFByb2plY3RzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oQXJyYXlzLmFzTGlzdChGYWNldFV0aWxzLmdldEJ1bmRsZVByb2plY3RzKCkpKTsKLQkJZm9yIChJdGVyYXRvcjxJUHJvamVjdD4gaXQgPSBmYWNldFByb2plY3RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlQcm9qZWN0IHdvcmtzcGFjZVByb2plY3QgPSBpdC5uZXh0KCk7Ci0JCQlmb3IgKEJ1bmRsZSBidW5kbGUgOiBwYXIuZ2V0QnVuZGxlKCkpIHsKLQkJCQlpZiAoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpICE9IG51bGwKLQkJCQkJCSYmIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMoUGFyVXRpbHMuZ2V0U3ltYm9saWNOYW1lKHdvcmtzcGFjZVByb2plY3QpKSkgewotCQkJCQlpdC5yZW1vdmUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkKCkgeworICAgICAgICAvLyBnZXQgbGlzdCBvZiBmYWNldCBwcm9qZWN0cyB0aGF0IGFyZSBub3QgaW4gdGhlIG1vZGVsCisgICAgICAgIExpc3Q8SVByb2plY3Q+IGZhY2V0UHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0PihBcnJheXMuYXNMaXN0KEZhY2V0VXRpbHMuZ2V0QnVuZGxlUHJvamVjdHMoKSkpOworICAgICAgICBmb3IgKEl0ZXJhdG9yPElQcm9qZWN0PiBpdCA9IGZhY2V0UHJvamVjdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgSVByb2plY3Qgd29ya3NwYWNlUHJvamVjdCA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IHRoaXMucGFyLmdldEJ1bmRsZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSAhPSBudWxsICYmIGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMoUGFyVXRpbHMuZ2V0U3ltYm9saWNOYW1lKHdvcmtzcGFjZVByb2plY3QpKSkgeworICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJUHJvamVjdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgUHJvamVjdFNlbGVjdGlvbkRpYWxvZyhnZXRTZWN0aW9uKCkuZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5zZXRFbGVtZW50cyhmYWNldFByb2plY3RzLnRvQXJyYXkobmV3IElQcm9qZWN0WzBdKSk7CisgICAgICAgIFByb2plY3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IFByb2plY3RTZWxlY3Rpb25EaWFsb2coZ2V0U2VjdGlvbigpLmdldFNoZWxsKCkpOworICAgICAgICBkaWFsb2cuc2V0RWxlbWVudHMoZmFjZXRQcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFswXSkpOwogCi0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJLy8gYWRkIHNlbGVjdGVkIGZhY2V0IHByb2plY3RzIHRvIHRoZSBtb2RlbAotCQkJSVByb2plY3RbXSB3b3Jrc3BhY2VQcm9qZWN0cyA9IGRpYWxvZy5nZXRTZWxlY3RlZFByb2plY3RzKCk7Ci0JCQlmb3IgKElQcm9qZWN0IHdvcmtzcGFjZVByb2plY3QgOiB3b3Jrc3BhY2VQcm9qZWN0cykgewotCQkJCUNvbGxlY3Rpb248Pz4gbmV3Q2hpbGREZXNjcmlwdG9ycyA9IHBhZ2UuZ2V0TW9kZWwoKS5nZXROZXdDaGlsZERlc2NyaXB0b3JzKHBhciwgbnVsbCk7Ci0JCQkJT2JqZWN0IGRlc2NyaXB0b3IgPSBuZXdDaGlsZERlc2NyaXB0b3JzLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCUNvbW1hbmQgY29tbWFuZCA9IENyZWF0ZUNoaWxkQ29tbWFuZC5jcmVhdGUocGFnZS5nZXRNb2RlbCgpLCBwYXIsIGRlc2NyaXB0b3IsCi0JCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGFyKSk7Ci0JCQkJcGFnZS5nZXRNb2RlbCgpLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQkJaWYgKGNvbW1hbmQuZ2V0UmVzdWx0KCkgIT0gbnVsbCAmJiAhY29tbWFuZC5nZXRSZXN1bHQoKS5pc0VtcHR5KCkpIHsKLQkJCQkJQnVuZGxlIHByb2plY3QgPSAoQnVuZGxlKSBjb21tYW5kLmdldFJlc3VsdCgpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQlwcm9qZWN0LnNldFN5bWJvbGljTmFtZShQYXJVdGlscy5nZXRTeW1ib2xpY05hbWUod29ya3NwYWNlUHJvamVjdCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgICAgaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7CisgICAgICAgICAgICAvLyBhZGQgc2VsZWN0ZWQgZmFjZXQgcHJvamVjdHMgdG8gdGhlIG1vZGVsCisgICAgICAgICAgICBJUHJvamVjdFtdIHdvcmtzcGFjZVByb2plY3RzID0gZGlhbG9nLmdldFNlbGVjdGVkUHJvamVjdHMoKTsKKyAgICAgICAgICAgIGZvciAoSVByb2plY3Qgd29ya3NwYWNlUHJvamVjdCA6IHdvcmtzcGFjZVByb2plY3RzKSB7CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/PiBuZXdDaGlsZERlc2NyaXB0b3JzID0gdGhpcy5wYWdlLmdldE1vZGVsKCkuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyh0aGlzLnBhciwgbnVsbCk7CisgICAgICAgICAgICAgICAgT2JqZWN0IGRlc2NyaXB0b3IgPSBuZXdDaGlsZERlc2NyaXB0b3JzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICAgICAgICAgIENvbW1hbmQgY29tbWFuZCA9IENyZWF0ZUNoaWxkQ29tbWFuZC5jcmVhdGUodGhpcy5wYWdlLmdldE1vZGVsKCksIHRoaXMucGFyLCBkZXNjcmlwdG9yLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24odGhpcy5wYXIpKTsKKyAgICAgICAgICAgICAgICB0aGlzLnBhZ2UuZ2V0TW9kZWwoKS5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOworICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLmdldFJlc3VsdCgpICE9IG51bGwgJiYgIWNvbW1hbmQuZ2V0UmVzdWx0KCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBwcm9qZWN0ID0gKEJ1bmRsZSkgY29tbWFuZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXRTeW1ib2xpY05hbWUoUGFyVXRpbHMuZ2V0U3ltYm9saWNOYW1lKHdvcmtzcGFjZVByb2plY3QpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgeworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAKLQl9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRG93bigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZURvd24oKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAotCX0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVPcGVuUHJvcGVydGllcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZU9wZW5Qcm9wZXJ0aWVzKCkgeworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAKLQl9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFRhYmxlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJQ29tbWFuZCBjb21tYW5kID0gUmVtb3ZlQ29tbWFuZC5jcmVhdGUocGFnZS5nZXRNb2RlbCgpLCBwYXIsIG51bGwsIHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQlwYWdlLmdldE1vZGVsKCkuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZW1vdmUoKSB7CisgICAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0VGFibGVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKKyAgICAgICAgaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBDb21tYW5kIGNvbW1hbmQgPSBSZW1vdmVDb21tYW5kLmNyZWF0ZSh0aGlzLnBhZ2UuZ2V0TW9kZWwoKSwgdGhpcy5wYXIsIG51bGwsIHNlbGVjdGlvbi50b0xpc3QoKSk7CisgICAgICAgICAgICB0aGlzLnBhZ2UuZ2V0TW9kZWwoKS5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVXAoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVcCgpIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCi0JfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWdldFRhYmxlVmlld2VyKCkuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihwYWdlLmdldE1vZGVsKCkuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQlnZXRUYWJsZVZpZXdlcigpLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihwYWdlLmdldE1vZGVsKCkuZ2V0QWRhcHRlckZhY3RvcnkoKSkpOwotCQlwYXIgPSBwYWdlLmdldFBhcigpOwotCQlnZXRUYWJsZVZpZXdlcigpLnNldElucHV0KHBhcik7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIGdldFRhYmxlVmlld2VyKCkuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcih0aGlzLnBhZ2UuZ2V0TW9kZWwoKS5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7CisgICAgICAgIGdldFRhYmxlVmlld2VyKCkuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKHRoaXMucGFnZS5nZXRNb2RlbCgpLmdldEFkYXB0ZXJGYWN0b3J5KCkpKTsKKyAgICAgICAgdGhpcy5wYXIgPSB0aGlzLnBhZ2UuZ2V0UGFyKCk7CisgICAgICAgIGdldFRhYmxlVmlld2VyKCkuc2V0SW5wdXQodGhpcy5wYXIpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWVuYWJsZUJ1dHRvbnMoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKyAgICAgICAgZW5hYmxlQnV0dG9ucygpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QYXJFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGFyRWRpdG9yLmphdmEKaW5kZXggYTMwMzEwZi4uZDNmZWM0NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QYXJFZGl0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL1BhckVkaXRvci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTEwMCw5OTEgKzEwMSw5OTcgQEAKICAqLwogcHVibGljIGNsYXNzIFBhckVkaXRvciBleHRlbmRzIFNoYXJlZEhlYWRlckZvcm1FZGl0b3IgaW1wbGVtZW50cyBJU2VsZWN0aW9uUHJvdmlkZXIgewogCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5wYXIudWkuZWRpdG9yIjsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFRElUT1JfSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnBhci51aS5lZGl0b3IiOwogCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgb25lIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIGZvciBwcm92aWRpbmcgdmlld3Mgb2YgdGhlIG1vZGVsLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBvbmUgYWRhcHRlciBmYWN0b3J5IHVzZWQgZm9yIHByb3ZpZGluZyB2aWV3cyBvZiB0aGUgbW9kZWwuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisgICAgICogLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7CiAKLQkvKioKLQkgKiBSZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBsYXN0IGFjdGl2YXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisgICAgLyoqCisgICAgICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CiAKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29udGVudE91dGxpbmVQYWdlIGNvbnRlbnRPdXRsaW5lUGFnZTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIElDb250ZW50T3V0bGluZVBhZ2UgY29udGVudE91dGxpbmVQYWdlOwogCi0JLyoqCi0JICogVGhpcyBpcyBhIGtsdWRnZS4uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBjb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyOworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYSBrbHVkZ2UuLi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBjb250ZW50T3V0bGluZVN0YXR1c0xpbmVNYW5hZ2VyOwogCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY29udGVudCBvdXRsaW5lIHBhZ2UncyB2aWV3ZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZVZpZXdlciBjb250ZW50T3V0bGluZVZpZXdlcjsKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBjb250ZW50IG91dGxpbmUgcGFnZSdzIHZpZXdlci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIFRyZWVWaWV3ZXIgY29udGVudE91dGxpbmVWaWV3ZXI7CiAKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgY29udGVudCB2aWV3ZXIsIHdoaWNoIG1heSBiZSBlaXRoZXIgb25lIG9mIHRoZSB2aWV3ZXJzIGluIHRoZSBwYWdlcyBvciB0aGUgY29udGVudAotCSAqIG91dGxpbmUgdmlld2VyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZpZXdlciBjdXJyZW50Vmlld2VyOworICAgIC8qKgorICAgICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSBjb250ZW50IHZpZXdlciwgd2hpY2ggbWF5IGJlIGVpdGhlciBvbmUgb2YgdGhlIHZpZXdlcnMgaW4gdGhlIHBhZ2VzIG9yIHRoZSBjb250ZW50CisgICAgICogb3V0bGluZSB2aWV3ZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBWaWV3ZXIgY3VycmVudFZpZXdlcjsKIAotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGFjdGl2ZSB2aWV3ZXIgcGFuZSwgaW4gdGhlIGJvb2suIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmlld2VyUGFuZSBjdXJyZW50Vmlld2VyUGFuZTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBhY3RpdmUgdmlld2VyIHBhbmUsIGluIHRoZSBib29rLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVmlld2VyUGFuZSBjdXJyZW50Vmlld2VyUGFuZTsKIAotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIGVkaXRpbmcgZG9tYWluIHRoYXQgaXMgdXNlZCB0byB0cmFjayBhbGwgY2hhbmdlcyB0byB0aGUgbW9kZWwuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKKyAgICAvKioKKyAgICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBlZGl0aW5nIGRvbWFpbiB0aGF0IGlzIHVzZWQgdG8gdHJhY2sgYWxsIGNoYW5nZXMgdG8gdGhlIG1vZGVsLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKIAotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZWRpdG9yIGFzIGEgd2hvbGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiBlZGl0b3JTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOworICAgIC8qKgorICAgICAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHNlbGVjdGlvbiBvZiB0aGUgZWRpdG9yIGFzIGEgd2hvbGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBJU2VsZWN0aW9uIGVkaXRvclNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7CiAKLQkvKioKLQkgKiBUaGlzIGxpc3RlbnMgZm9yIHdoZW4gdGhlIG91dGxpbmUgYmVjb21lcyBhY3RpdmUgPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9IG5ldyBJUGFydExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQ29udGVudE91dGxpbmUpIHsKLQkJCQlpZiAoKChDb250ZW50T3V0bGluZSkgcGFydCkuZ2V0Q3VycmVudFBhZ2UoKSA9PSBjb250ZW50T3V0bGluZVBhZ2UpIHsKLQkJCQkJLy8gZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zZXRBY3RpdmVFZGl0b3IoUGFyRWRpdG9yLnRoaXMpOworICAgIC8qKgorICAgICAqIFRoaXMgbGlzdGVucyBmb3Igd2hlbiB0aGUgb3V0bGluZSBiZWNvbWVzIGFjdGl2ZSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSVBhcnRMaXN0ZW5lciBwYXJ0TGlzdGVuZXIgPSBuZXcgSVBhcnRMaXN0ZW5lcigpIHsKIAotCQkJCQlzZXRDdXJyZW50Vmlld2VyKGNvbnRlbnRPdXRsaW5lVmlld2VyKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHBhcnQgPT0gUGFyRWRpdG9yLnRoaXMpIHsKLQkJCQloYW5kbGVBY3RpdmF0ZSgpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgeworICAgICAgICAgICAgaWYgKHBhcnQgaW5zdGFuY2VvZiBDb250ZW50T3V0bGluZSkgeworICAgICAgICAgICAgICAgIGlmICgoKENvbnRlbnRPdXRsaW5lKSBwYXJ0KS5nZXRDdXJyZW50UGFnZSgpID09IFBhckVkaXRvci50aGlzLmNvbnRlbnRPdXRsaW5lUGFnZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihQYXJFZGl0b3IudGhpcyk7CiAKLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwKSB7Ci0JCQkvLyBJZ25vcmUuCi0JCX0KKyAgICAgICAgICAgICAgICAgICAgc2V0Q3VycmVudFZpZXdlcihQYXJFZGl0b3IudGhpcy5jb250ZW50T3V0bGluZVZpZXdlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0ID09IFBhckVkaXRvci50aGlzKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlQWN0aXZhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcCkgewotCQkJLy8gSWdub3JlLgotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcCkgeworICAgICAgICAgICAgLy8gSWdub3JlLgorICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKLQkJCS8vIElnbm9yZS4KLQkJfQorICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHApIHsKKyAgICAgICAgICAgIC8vIElnbm9yZS4KKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcCkgewotCQkJLy8gSWdub3JlLgotCQl9Ci0JfTsKKyAgICAgICAgcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKyAgICAgICAgICAgIC8vIElnbm9yZS4KKyAgICAgICAgfQogCi0JLyoqCi0JICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworICAgICAgICBwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHApIHsKKyAgICAgICAgICAgIC8vIElnbm9yZS4KKyAgICAgICAgfQorICAgIH07CiAKLQkvKioKLQkgKiBUaGlzIGxpc3RlbnMgZm9yIHdvcmtzcGFjZSBjaGFuZ2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJLy8gT25seSBsaXN0ZW5pbmcgdG8gdGhlc2UuCi0JCQkvLyBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZURlbHRhLlBPU1RfQ0hBTkdFKQotCQkJewotCQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCQl0cnkgewotCQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisgICAgLyoqCisgICAgICogUmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CiAKLQkJCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGxpc3RlbnMgZm9yIHdvcmtzcGFjZSBjaGFuZ2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKIAotCQkJCQkJcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOworICAgICAgICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIC8vIE9ubHkgbGlzdGVuaW5nIHRvIHRoZXNlLgorICAgICAgICAgICAgLy8gaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VEZWx0YS5QT1NUX0NIQU5HRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewogCi0JCQkJCQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKLQkJCQkJCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKLQkJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKIAotCQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlbW92ZWRSZXNvdXJjZXMoKSB7Ci0JCQkJCQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7Ci0JCQkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CiAKLQkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQkJCQkJaWYgKGRlbHRhLmdldEZsYWdzKCkgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUwotCQkJCQkJCQkJJiYgZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJCQkJaWYgKChkZWx0YS5nZXRLaW5kKCkgJiAoSVJlc291cmNlRGVsdGEuQ0hBTkdFRCB8IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpKSAhPSAwKSB7Ci0JCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKAotCQkJCQkJCQkJCQlVUkkuY3JlYXRlVVJJKGRlbHRhLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSksIGZhbHNlKTsKLQkJCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJaWYgKChkZWx0YS5nZXRLaW5kKCkgJiBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSAhPSAwKSB7Ci0JCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCQl9IGVsc2UgaWYgKCFzYXZlZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpKSB7Ci0JCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBQYXJFZGl0b3IudGhpcy5lZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7CiAKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlZFJlc291cmNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJCQlSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7Ci0JCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbW92ZWRSZXNvdXJjZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJaWYgKCF2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKLQkJCQkJCWlmICghaXNEaXJ0eSgpKSB7Ci0JCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoUGFyRWRpdG9yLnRoaXMsIGZhbHNlKTsKLQkJCQkJCQkJCVBhckVkaXRvci50aGlzLmRpc3Bvc2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJfQotCQkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YS5nZXRGbGFncygpICE9IElSZXNvdXJjZURlbHRhLk1BUktFUlMgJiYgZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkZWx0YS5nZXRLaW5kKCkgJiAoSVJlc291cmNlRGVsdGEuQ0hBTkdFRCB8IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShkZWx0YS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFQYXJFZGl0b3IudGhpcy5zYXZlZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJCQlpZiAoIXZpc2l0b3IuZ2V0Q2hhbmdlZFJlc291cmNlcygpLmlzRW1wdHkoKSkgewotCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotCQkJCQkJaWYgKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gUGFyRWRpdG9yLnRoaXMpIHsKLQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJaGFuZGxlQWN0aXZhdGUoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJU2VydmVySWRlVWlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZyhleGNlcHRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KIAotCS8qKgotCSAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisgICAgICAgICAgICAgICAgICAgIFJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEuYWNjZXB0KHZpc2l0b3IpOwogCi0JLyoqCi0JICogVGhpcyBsaXN0ZW5zIHRvIHdoaWNoIGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF2aXNpdG9yLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhckVkaXRvci50aGlzLnJlbW92ZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNEaXJ0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CiAKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn1zIHRoYXQgYXJlIGxpc3RlbmluZyB0bwotCSAqIHRoaXMgZWRpdG9yLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihQYXJFZGl0b3IudGhpcywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyRWRpdG9yLnRoaXMuZGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KIAotCXByaXZhdGUgUmVzb3VyY2UgcGFyUmVzb3VyY2U7CisgICAgICAgICAgICAgICAgICAgIGlmICghdmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYXJFZGl0b3IudGhpcy5jaGFuZ2VkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLmdldENoYW5nZWRSZXNvdXJjZXMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSBQYXJFZGl0b3IudGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewogCi0JcHJpdmF0ZSBQYXIgcGFyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVBY3RpdmF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJJZGVVaVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKIAotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhIG1vZGVsIGVkaXRvci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJFZGl0b3IoKSB7Ci0JCWluaXRpYWxpemVFZGl0aW5nRG9tYWluKCk7Ci0JfQorICAgIC8qKgorICAgICAqIFJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBzYXZlZC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IHNhdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFBhZ2VzKCkgewotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIGxpc3RlbnMgdG8gd2hpY2ggZXZlciB2aWV3ZXIgaXMgYWN0aXZlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7CiAKLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn1zIHRoYXQgYXJlIGxpc3RlbmluZyB0bworICAgICAqIHRoaXMgZWRpdG9yLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPigpOwogCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGEgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyIGFuZCBhZGRzIGEgbGlzdGVuZXIgYXMgd2VsbCByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7Ci0JCWNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7Ci0JCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJLy8gY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOwotCQlNZW51IG1lbnUgPSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgbmV3IFVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpKTsKKyAgICBwcml2YXRlIFJlc291cmNlIHBhclJlc291cmNlOwogCi0JCWludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9MSU5LOwotCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdIHsgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKLQkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IEVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlcihlZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKLQl9CisgICAgcHJpdmF0ZSBQYXIgcGFyOwogCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgbWV0aG9kIGNhbGxlZCB0byBsb2FkIGEgcmVzb3VyY2UgaW50byB0aGUgZWRpdGluZyBkb21haW4ncyByZXNvdXJjZSBzZXQgYmFzZWQgb24gdGhlIGVkaXRvcidzIGlucHV0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVNb2RlbCgpIHsKLQkJVVJJIHJlc291cmNlVVJJID0gRWRpdFVJVXRpbC5nZXRVUkkoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCXRyeSB7Ci0JCQkvLyBMb2FkIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBlZGl0aW5nIGRvbWFpbi4KLQkJCS8vCi0JCQlwYXJSZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTZXJ2ZXJJZGVVaVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGUpOwotCQkJcGFyUmVzb3VyY2UgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIGZhbHNlKTsKLQkJfQorICAgIC8qKgorICAgICAqIFRoaXMgY3JlYXRlcyBhIG1vZGVsIGVkaXRvci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIFBhckVkaXRvcigpIHsKKyAgICAgICAgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKTsKKyAgICB9CiAKLQkJcGFyID0gKFBhcikgcGFyUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkUGFnZXMoKSB7CisgICAgfQogCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbnN0YWxsIHlvdXIgb3duIGNvbnRyb2xzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlcygpIHsKLQkJY3JlYXRlTW9kZWwoKTsKLQkJYWRkUGFnZXMoKTsKLQl9CisgICAgLyoqCisgICAgICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisgICAgICogLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOworICAgIC8qKgorICAgICAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwgcmVnaXN0ZXJpbmcgdGhlIG1lbnUgZm9yIGV4dGVuc2lvbi4gPCEtLQorICAgICAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgeworICAgICAgICBNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7CisgICAgICAgIGNvbnRleHRNZW51LmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7CisgICAgICAgIGNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKyAgICAgICAgLy8gY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOworICAgICAgICBNZW51IG1lbnUgPSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKKyAgICAgICAgdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOworICAgICAgICBnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgbmV3IFVud3JhcHBpbmdTZWxlY3Rpb25Qcm92aWRlcih2aWV3ZXIpKTsKIAotCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOworICAgICAgICBpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsKKyAgICAgICAgVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OworICAgICAgICB2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7CisgICAgICAgIHZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldyBFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIodGhpcy5lZGl0aW5nRG9tYWluLCB2aWV3ZXIpKTsKKyAgICB9CiAKLQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIG1ldGhvZCBjYWxsZWQgdG8gbG9hZCBhIHJlc291cmNlIGludG8gdGhlIGVkaXRpbmcgZG9tYWluJ3MgcmVzb3VyY2Ugc2V0IGJhc2VkIG9uIHRoZSBlZGl0b3IncyBpbnB1dC4KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVNb2RlbCgpIHsKKyAgICAgICAgVVJJIHJlc291cmNlVVJJID0gRWRpdFVJVXRpbC5nZXRVUkkoZ2V0RWRpdG9ySW5wdXQoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBMb2FkIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBlZGl0aW5nIGRvbWFpbi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICB0aGlzLnBhclJlc291cmNlID0gdGhpcy5lZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UocmVzb3VyY2VVUkksIHRydWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU2VydmVySWRlVWlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZyhlKTsKKyAgICAgICAgICAgIHRoaXMucGFyUmVzb3VyY2UgPSB0aGlzLmVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgZmFsc2UpOworICAgICAgICB9CiAKLQkJLy8gaWYgKGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aXZlRWRpdG9yKCkgPT0gdGhpcykgewotCQkvLyBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNldEFjdGl2ZUVkaXRvcihudWxsKTsKLQkJLy8gfQorICAgICAgICB0aGlzLnBhciA9IChQYXIpIHRoaXMucGFyUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICB9CiAKLQkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSAhPSBudWxsKSB7Ci0JCQljb250ZW50T3V0bGluZVBhZ2UuZGlzcG9zZSgpOwotCQl9CisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBpbnN0YWxsIHlvdXIgb3duIGNvbnRyb2xzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYworICAgICAqIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VzKCkgeworICAgICAgICBjcmVhdGVNb2RlbCgpOworICAgICAgICBhZGRQYWdlcygpOworICAgIH0KIAotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQorICAgIC8qKgorICAgICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMucmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7CiAKLQkvKioKLQkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHNhdmVzIHRoZSBtb2RlbCBmaWxlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJLy8gU2F2ZSBvbmx5IHJlc291cmNlcyB0aGF0IGhhdmUgYWN0dWFsbHkgY2hhbmdlZC4KLQkJLy8KLQkJZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBzYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOwotCQlzYXZlT3B0aW9ucy5wdXQoUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VELCBSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRURfTUVNT1JZX0JVRkZFUik7CisgICAgICAgIGdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHRoaXMucGFydExpc3RlbmVyKTsKIAotCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZwotCQkvLyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCi0JCS8vCi0JCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLgotCQkJLy8KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkvLyBTYXZlIHRoZSByZXNvdXJjZXMgdG8gdGhlIGZpbGUgc3lzdGVtLgotCQkJCS8vCi0JCQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSkgewotCQkJCQlpZiAoKGZpcnN0IHx8ICFyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBpc1BlcnNpc3RlZChyZXNvdXJjZSkpCi0JCQkJCQkJJiYgIWVkaXRpbmdEb21haW4uaXNSZWFkT25seShyZXNvdXJjZSkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQlyZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQkJCWhhbmRsZUVycm9yKGV4Y2VwdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OworICAgICAgICB0aGlzLmFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKIAotCQl0cnkgewotCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCi0JCQkvLwotCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOworICAgICAgICAvLyBpZiAoZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5nZXRBY3RpdmVFZGl0b3IoKSA9PSB0aGlzKSB7CisgICAgICAgIC8vIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKG51bGwpOworICAgICAgICAvLyB9CiAKLQkJCS8vIFJlZnJlc2ggdGhlIG5lY2Vzc2FyeSBzdGF0ZS4KLQkJCS8vCi0JCQkoKEJhc2ljQ29tbWFuZFN0YWNrKSBlZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgotCQkJLy8KLQkJCVNlcnZlcklkZVVpUGx1Z2luLmdldERlZmF1bHQoKS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCX0KKyAgICAgICAgaWYgKHRoaXMuY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY29udGVudE91dGxpbmVQYWdlLmRpc3Bvc2UoKTsKKyAgICAgICAgfQogCi0JLyoqCi0JICogVGhpcyBhbHNvIGNoYW5nZXMgdGhlIGVkaXRvcidzIGlucHV0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJc2F2ZUFzRGlhbG9nLm9wZW4oKTsKLQkJSVBhdGggcGF0aCA9IHNhdmVBc0RpYWxvZy5nZXRSZXN1bHQoKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBzdXBlci5kaXNwb3NlKCk7CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZUFzKFVSSSB1cmksIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgewotCQkoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSkuc2V0VVJJKHVyaSk7Ci0JCXNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7Ci0JCXNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7Ci0JCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJLy8gZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkgIT0gbnVsbCA/IGdldEFjdGlvbkJhcnMoKQotCQkvLyAuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5nZXRQcm9ncmVzc01vbml0b3IoKSA6IG5ldwotCQkvLyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWRvU2F2ZShwcm9ncmVzc01vbml0b3IpOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHNhdmVzIHRoZSBtb2RlbCBmaWxlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisgICAgICogZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworICAgICAgICAvLyBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBjaGFuZ2VkLgorICAgICAgICAvLworICAgICAgICBmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CisgICAgICAgIHNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsIFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKIAotCS8qKgotCSAqIFRoaXMgaXMgaGVyZSBmb3IgdGhlIGxpc3RlbmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZShpbnQgYWN0aW9uKSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZShhY3Rpb24pOwotCX0KKyAgICAgICAgLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcKKyAgICAgICAgLy8gYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya2JlbmNoLgorICAgICAgICAvLworICAgICAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKIAotCS8vIC8qKgotCS8vICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwdWJsaWMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCS8vIHJldHVybiAoRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yKQotCS8vIGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCS8vIH0KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgcmVzb3VyY2VzIHRvIHRoZSBmaWxlIHN5c3RlbS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBQYXJFZGl0b3IudGhpcy5lZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChmaXJzdCB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkgfHwgaXNQZXJzaXN0ZWQocmVzb3VyY2UpKSAmJiAhUGFyRWRpdG9yLnRoaXMuZWRpdGluZ0RvbWFpbi5pc1JlYWRPbmx5KHJlc291cmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJFZGl0b3IudGhpcy5zYXZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLy8gcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7Ci0JLy8gcmV0dXJuIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aW9uQmFycygpOwotCS8vIH0KLQkvKioKLQkgKiBUaGlzIGlzIGhvdyB0aGUgZnJhbWV3b3JrIGRldGVybWluZXMgd2hpY2ggaW50ZXJmYWNlcyB3ZSBpbXBsZW1lbnQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7Ci0JCWlmIChrZXkuZXF1YWxzKElDb250ZW50T3V0bGluZVBhZ2UuY2xhc3MpKSB7Ci0JCQlyZXR1cm4gc2hvd091dGxpbmVWaWV3KCkgPyBnZXRDb250ZW50T3V0bGluZVBhZ2UoKSA6IG51bGw7Ci0JCX0KLQkJLy8gZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpKSB7Ci0JCS8vIHJldHVybiBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQkvLyB9Ci0JCS8vIGVsc2UgaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7Ci0JCS8vIHJldHVybiB0aGlzOwotCQkvLyB9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsKLQkJfQotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRoaXMgcnVucyB0aGUgb3B0aW9ucywgYW5kIHNob3dzIHByb2dyZXNzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLCBmYWxzZSwgb3BlcmF0aW9uKTsKIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9CisgICAgICAgICAgICAvLyBSZWZyZXNoIHRoZSBuZWNlc3Nhcnkgc3RhdGUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgKChCYXNpY0NvbW1hbmRTdGFjaykgdGhpcy5lZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5zYXZlSXNEb25lKCk7CisgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIFNlcnZlcklkZVVpUGx1Z2luLmdldERlZmF1bHQoKS5sb2coZXhjZXB0aW9uKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFRoaXMgYWNjZXNzZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudCBvdXRsaW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIHsKLQkJaWYgKGNvbnRlbnRPdXRsaW5lUGFnZSA9PSBudWxsKSB7Ci0JCQkvLyBUaGUgY29udGVudCBvdXRsaW5lIGlzIGp1c3QgYSB0cmVlLgotCQkJLy8KLQkJCWNsYXNzIE15Q29udGVudE91dGxpbmVQYWdlIGV4dGVuZHMgQ29udGVudE91dGxpbmVQYWdlIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQkJCQljb250ZW50T3V0bGluZVZpZXdlciA9IGdldFRyZWVWaWV3ZXIoKTsKLQkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOworICAgIC8qKgorICAgICAqIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBlZGl0b3IncyBpbnB1dC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7CisgICAgICAgIFNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKKyAgICAgICAgc2F2ZUFzRGlhbG9nLm9wZW4oKTsKKyAgICAgICAgSVBhdGggcGF0aCA9IHNhdmVBc0RpYWxvZy5nZXRSZXN1bHQoKTsKKyAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKKyAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JCQkJCS8vIFNldCB1cCB0aGUgdHJlZSB2aWV3ZXIuCi0JCQkJCS8vCi0JCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpKTsKLQkJCQkJY29udGVudE91dGxpbmVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7Ci0JCQkJCWNvbnRlbnRPdXRsaW5lVmlld2VyLnNldElucHV0KHBhclJlc291cmNlKTsKKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBkb1NhdmVBcyhVUkkgdXJpLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKKyAgICAgICAgdGhpcy5lZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApLnNldFVSSSh1cmkpOworICAgICAgICBzZXRJbnB1dFdpdGhOb3RpZnkoZWRpdG9ySW5wdXQpOworICAgICAgICBzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOworICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7CisgICAgICAgIC8vIGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpICE9IG51bGwgPyBnZXRBY3Rpb25CYXJzKCkKKyAgICAgICAgLy8gLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgOiBuZXcKKyAgICAgICAgLy8gTnVsbFByb2dyZXNzTW9uaXRvcigpOworICAgICAgICBkb1NhdmUocHJvZ3Jlc3NNb25pdG9yKTsKKyAgICB9CiAKLQkJCQkJLy8gTWFrZSBzdXJlIG91ciBwb3B1cHMgd29yay4KLQkJCQkJLy8KLQkJCQkJY3JlYXRlQ29udGV4dE1lbnVGb3IoY29udGVudE91dGxpbmVWaWV3ZXIpOworICAgIC8qKgorICAgICAqIFRoaXMgaXMgaGVyZSBmb3IgdGhlIGxpc3RlbmVyIHRvIGJlIGFibGUgdG8gY2FsbCBpdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlKGludCBhY3Rpb24pIHsKKyAgICAgICAgc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKGFjdGlvbik7CisgICAgfQorCisgICAgLy8gLyoqCisgICAgLy8gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAvLyAqIEBnZW5lcmF0ZWQKKyAgICAvLyAqLworICAgIC8vIHB1YmxpYyBFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7CisgICAgLy8gcmV0dXJuIChFZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IpCisgICAgLy8gZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7CisgICAgLy8gfQorCisgICAgLyoqCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgLy8gcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7CisgICAgLy8gcmV0dXJuIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuZ2V0QWN0aW9uQmFycygpOworICAgIC8vIH0KKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGhvdyB0aGUgZnJhbWV3b3JrIGRldGVybWluZXMgd2hpY2ggaW50ZXJmYWNlcyB3ZSBpbXBsZW1lbnQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKKyAgICAgICAgaWYgKGtleS5lcXVhbHMoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBzaG93T3V0bGluZVZpZXcoKSA/IGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIDogbnVsbDsKKyAgICAgICAgfQorICAgICAgICAvLyBlbHNlIGlmIChrZXkuZXF1YWxzKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykpIHsKKyAgICAgICAgLy8gcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gZWxzZSBpZiAoa2V5LmVxdWFscyhJR290b01hcmtlci5jbGFzcykpIHsKKyAgICAgICAgLy8gcmV0dXJuIHRoaXM7CisgICAgICAgIC8vIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihrZXkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyRmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGFjY2Vzc2VzIGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlIGNvbnRlbnQgb3V0bGluZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBJQ29udGVudE91dGxpbmVQYWdlIGdldENvbnRlbnRPdXRsaW5lUGFnZSgpIHsKKyAgICAgICAgaWYgKHRoaXMuY29udGVudE91dGxpbmVQYWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRoZSBjb250ZW50IG91dGxpbmUgaXMganVzdCBhIHRyZWUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY2xhc3MgTXlDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgUGFyRWRpdG9yLnRoaXMuY29udGVudE91dGxpbmVWaWV3ZXIgPSBnZXRUcmVlVmlld2VyKCk7CisgICAgICAgICAgICAgICAgICAgIFBhckVkaXRvci50aGlzLmNvbnRlbnRPdXRsaW5lVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdXAgdGhlIHRyZWUgdmlld2VyLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBQYXJFZGl0b3IudGhpcy5jb250ZW50T3V0bGluZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKFBhckVkaXRvci50aGlzLmFkYXB0ZXJGYWN0b3J5KSk7CisgICAgICAgICAgICAgICAgICAgIFBhckVkaXRvci50aGlzLmNvbnRlbnRPdXRsaW5lVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihQYXJFZGl0b3IudGhpcy5hZGFwdGVyRmFjdG9yeSkpOworICAgICAgICAgICAgICAgICAgICBQYXJFZGl0b3IudGhpcy5jb250ZW50T3V0bGluZVZpZXdlci5zZXRJbnB1dChQYXJFZGl0b3IudGhpcy5wYXJSZXNvdXJjZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG91ciBwb3B1cHMgd29yay4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29udGV4dE1lbnVGb3IoUGFyRWRpdG9yLnRoaXMuY29udGVudE91dGxpbmVWaWV3ZXIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghUGFyRWRpdG9yLnRoaXMuZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSByb290IG9iamVjdCBpbiB0aGUgdmlldy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJFZGl0b3IudGhpcy5jb250ZW50T3V0bGluZVZpZXdlci5zZXRTZWxlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oUGFyRWRpdG9yLnRoaXMuZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKSksIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgeworICAgICAgICAgICAgICAgICAgICBzdXBlci5tYWtlQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgUGFyRWRpdG9yLnRoaXMuY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworICAgICAgICAgICAgICAgICAgICAvLyBzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOworICAgICAgICAgICAgICAgICAgICAvLyBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLAorICAgICAgICAgICAgICAgICAgICAvLyBhY3Rpb25CYXJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuY29udGVudE91dGxpbmVQYWdlID0gbmV3IE15Q29udGVudE91dGxpbmVQYWdlKCk7CisKKyAgICAgICAgICAgIC8vIExpc3RlbiB0byBzZWxlY3Rpb24gc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGl0IGlzIGEgc3BlY2lhbCB3YXkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdGhpcy5jb250ZW50T3V0bGluZVBhZ2UuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewogCi0JCQkJCWlmICghZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmlzRW1wdHkoKSkgewotCQkJCQkJLy8gU2VsZWN0IHRoZSByb290IG9iamVjdCBpbiB0aGUgdmlldy4KLQkJCQkJCS8vCi0JCQkJCQljb250ZW50T3V0bGluZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpCi0JCQkJCQkJCS5nZXRSZXNvdXJjZXMoKQotCQkJCQkJCQkuZ2V0KDApKSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9CisgICAgICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgd2UgaGFuZGxlIHNlbGVjdGlvbnMgY29ycmVjdGx5LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CiAKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBtYWtlQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwKLQkJCQkJCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlcikgewotCQkJCQlzdXBlci5tYWtlQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsKLQkJCQkJY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA9IHN0YXR1c0xpbmVNYW5hZ2VyOwotCQkJCX0KKyAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudE91dGxpbmVQYWdlOworICAgIH0KIAotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJCQkvLyBzdXBlci5zZXRBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotCQkJCQkvLyBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLAotCQkJCQkvLyBhY3Rpb25CYXJzKTsKLQkJCQl9Ci0JCQl9CisgICAgLyoqCisgICAgICogVGhpcyByZXR1cm5zIHRoZSBlZGl0aW5nIGRvbWFpbiBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElFZGl0aW5nRG9tYWluUHJvdmlkZXJ9IGludGVyZmFjZS4gVGhpcyBpcyBpbXBvcnRhbnQKKyAgICAgKiBmb3IgaW1wbGVtZW50aW5nIHRoZSBzdGF0aWMgbWV0aG9kcyBvZiB7QGxpbmsgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWlufSBhbmQgZm9yIHN1cHBvcnRpbmcKKyAgICAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb259LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVkaXRpbmdEb21haW47CisgICAgfQogCi0JCQljb250ZW50T3V0bGluZVBhZ2UgPSBuZXcgTXlDb250ZW50T3V0bGluZVBhZ2UoKTsKKyAgICAvLyAvKioKKyAgICAvLyAqIFRoaXMgYWNjZXNzZXMgYSBjYWNoZWQgdmVyc2lvbiBvZiB0aGUgcHJvcGVydHkgc2hlZXQuIDwhLS0KKyAgICAvLyBiZWdpbi11c2VyLWRvYworICAgIC8vICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgIC8vICogQGdlbmVyYXRlZAorICAgIC8vICovCisgICAgLy8gcHVibGljIElQcm9wZXJ0eVNoZWV0UGFnZSBnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpIHsKKyAgICAvLyBpZiAocHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgeworICAgIC8vIHByb3BlcnR5U2hlZXRQYWdlID0gbmV3IEV4dGVuZGVkUHJvcGVydHlTaGVldFBhZ2UoZWRpdGluZ0RvbWFpbikgeworICAgIC8vIEBPdmVycmlkZQorICAgIC8vIHB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworICAgIC8vIHN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7CisgICAgLy8gZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKS5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywgYWN0aW9uQmFycyk7CisgICAgLy8gfQorICAgIC8vCisgICAgLy8gQE92ZXJyaWRlCisgICAgLy8gcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoTGlzdDw/PiBzZWxlY3Rpb24pIHsKKyAgICAvLyBQYXJFZGl0b3IudGhpcy5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihzZWxlY3Rpb24pOworICAgIC8vIFBhckVkaXRvci50aGlzLnNldEZvY3VzKCk7CisgICAgLy8gfQorICAgIC8vIH07CisgICAgLy8gcHJvcGVydHlTaGVldFBhZ2Uuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihuZXcKKyAgICAvLyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOworICAgIC8vIH0KKyAgICAvLworICAgIC8vIHJldHVybiBwcm9wZXJ0eVNoZWV0UGFnZTsKKyAgICAvLyB9CiAKLQkJCS8vIExpc3RlbiB0byBzZWxlY3Rpb24gc28gdGhhdCB3ZSBjYW4gaGFuZGxlIGl0IGlzIGEgc3BlY2lhbCB3YXkuCi0JCQkvLwotCQkJY29udGVudE91dGxpbmVQYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYW5kbGUgc2VsZWN0aW9ucyBjb3JyZWN0bHkuCi0JCQkJLy8KLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQloYW5kbGVDb250ZW50T3V0bGluZVNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KKyAgICBwdWJsaWMgUGFyIGdldFBhcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGFyOworICAgIH0KIAotCQlyZXR1cm4gY29udGVudE91dGxpbmVQYWdlOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyfSB0byByZXR1cm4gdGhpcyBlZGl0b3IncyBvdmVyYWxsIHNlbGVjdGlvbi4KKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlbGVjdGlvbjsKKyAgICB9CiAKLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGVkaXRpbmcgZG9tYWluIGFzIHJlcXVpcmVkIGJ5IHRoZSB7QGxpbmsgSUVkaXRpbmdEb21haW5Qcm92aWRlcn0gaW50ZXJmYWNlLiBUaGlzIGlzIGltcG9ydGFudAotCSAqIGZvciBpbXBsZW1lbnRpbmcgdGhlIHN0YXRpYyBtZXRob2RzIG9mIHtAbGluayBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW59IGFuZCBmb3Igc3VwcG9ydGluZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbn0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIHJldHVybnMgdGhlIHZpZXdlciBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElWaWV3ZXJQcm92aWRlcn0gaW50ZXJmYWNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisgICAgICogZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50Vmlld2VyOworICAgIH0KIAotCS8vIC8qKgotCS8vICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBzaGVldC4gPCEtLQotCS8vIGJlZ2luLXVzZXItZG9jCi0JLy8gKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwdWJsaWMgSVByb3BlcnR5U2hlZXRQYWdlIGdldFByb3BlcnR5U2hlZXRQYWdlKCkgewotCS8vIGlmIChwcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7Ci0JLy8gcHJvcGVydHlTaGVldFBhZ2UgPSBuZXcgRXh0ZW5kZWRQcm9wZXJ0eVNoZWV0UGFnZShlZGl0aW5nRG9tYWluKSB7Ci0JLy8gQE92ZXJyaWRlCi0JLy8gcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JLy8gc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkvLyBnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLnNoYXJlR2xvYmFsQWN0aW9ucyh0aGlzLCBhY3Rpb25CYXJzKTsKLQkvLyB9Ci0JLy8KLQkvLyBAT3ZlcnJpZGUKLQkvLyBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihMaXN0PD8+IHNlbGVjdGlvbikgewotCS8vIFBhckVkaXRvci50aGlzLnNldFNlbGVjdGlvblRvVmlld2VyKHNlbGVjdGlvbik7Ci0JLy8gUGFyRWRpdG9yLnRoaXMuc2V0Rm9jdXMoKTsKLQkvLyB9Ci0JLy8gfTsKLQkvLyBwcm9wZXJ0eVNoZWV0UGFnZS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKG5ldwotCS8vIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7Ci0JLy8gfQotCS8vCi0JLy8gcmV0dXJuIHByb3BlcnR5U2hlZXRQYWdlOwotCS8vIH0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVyaUF0dHJpYnV0ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoRVZhbGlkYXRvci5VUklfQVRUUklCVVRFLCBudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAodXJpQXR0cmlidXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsKKyAgICAgICAgICAgICAgICAgICAgRU9iamVjdCBlT2JqZWN0ID0gdGhpcy5lZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0RU9iamVjdCh1cmksIHRydWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoZU9iamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9ucy5zaW5nbGV0b24odGhpcy5lZGl0aW5nRG9tYWluLmdldFdyYXBwZXIoZU9iamVjdCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIFNlcnZlcklkZVVpUGx1Z2luLmdldERlZmF1bHQoKS5sb2coZXhjZXB0aW9uKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyBQYXIgZ2V0UGFyKCkgewotCQlyZXR1cm4gcGFyOwotCX0KKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIGFjdGl2YXRpb24gb2YgdGhlIGVkaXRvciBvciBpdCdzIGFzc29jaWF0ZWQgdmlld3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRlKCkgeworICAgICAgICAvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKHRoaXMuZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkuY2xlYXIoKTsKIAotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHJldHVybiB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBlZGl0b3JTZWxlY3Rpb247Ci0JfQorICAgICAgICAgICAgLy8gUmVmcmVzaCBhbnkgYWN0aW9ucyB0aGF0IG1heSBiZWNvbWUgZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBzZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOworICAgICAgICB9CiAKLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHZpZXdlciBhcyByZXF1aXJlZCBieSB0aGUge0BsaW5rIElWaWV3ZXJQcm92aWRlcn0gaW50ZXJmYWNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIGN1cnJlbnRWaWV3ZXI7Ci0JfQorICAgICAgICBpZiAoIXRoaXMucmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpIHsKKyAgICAgICAgICAgICAgICBnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKFBhckVkaXRvci50aGlzLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgUGFyRWRpdG9yLnRoaXMuZGlzcG9zZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB0aGlzLnNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRoaXMuY2hhbmdlZFJlc291cmNlcy5yZW1vdmVBbGwodGhpcy5zYXZlZFJlc291cmNlcyk7CisgICAgICAgICAgICBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCk7CisgICAgICAgICAgICB0aGlzLmNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHRoaXMuc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7Ci0JCQkJU3RyaW5nIHVyaUF0dHJpYnV0ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoRVZhbGlkYXRvci5VUklfQVRUUklCVVRFLCBudWxsKTsKLQkJCQlpZiAodXJpQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpQXR0cmlidXRlKTsKLQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldEVPYmplY3QodXJpLCB0cnVlKTsKLQkJCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgewotCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGVkaXRpbmdEb21haW4uZ2V0V3JhcHBlcihlT2JqZWN0KSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJU2VydmVySWRlVWlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKSB7CisgICAgICAgIGlmICghdGhpcy5jaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSAmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7CisgICAgICAgICAgICB0aGlzLmVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKIAotCS8qKgotCSAqIEhhbmRsZXMgYWN0aXZhdGlvbiBvZiB0aGUgZWRpdG9yIG9yIGl0J3MgYXNzb2NpYXRlZCB2aWV3cy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRlKCkgewotCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4KLQkJLy8KLQkJaWYgKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkgIT0gbnVsbCkgewotCQkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKS5jbGVhcigpOworICAgICAgICAgICAgZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHRoaXMuY2hhbmdlZFJlc291cmNlcykgeworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLnVubG9hZCgpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkJCS8vIFJlZnJlc2ggYW55IGFjdGlvbnMgdGhhdCBtYXkgYmVjb21lIGVuYWJsZWQgb3IgZGlzYWJsZWQuCi0JCQkvLwotCQkJc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKLQkJfQorICAgIC8qKgorICAgICAqIFRoaXMgZGVhbHMgd2l0aCBob3cgd2Ugd2FudCBzZWxlY3Rpb24gaW4gdGhlIG91dGxpbmVyIHRvIGFmZmVjdCB0aGUgb3RoZXIgdmlld3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KKyAgICAgKiBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKyAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXdlclBhbmUgIT0gbnVsbCAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworICAgICAgICAgICAgSXRlcmF0b3I8Pz4gc2VsZWN0ZWRFbGVtZW50cyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZmlyc3Qgc2VsZWN0ZWQgZWxlbWVudC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIE9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLm5leHQoKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIHNlbGVjdCBlbGVtZW50IGluIGVkaXRvcgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWlmIChoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpIHsKLQkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKFBhckVkaXRvci50aGlzLCBmYWxzZSk7Ci0JCQkJUGFyRWRpdG9yLnRoaXMuZGlzcG9zZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlyZW1vdmVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOwotCQkJCXNhdmVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQljaGFuZ2VkUmVzb3VyY2VzLnJlbW92ZUFsbChzYXZlZFJlc291cmNlcyk7Ci0JCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCk7Ci0JCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQlzYXZlZFJlc291cmNlcy5jbGVhcigpOwotCQl9Ci0JfQorICAgIC8qKgorICAgICAqIFNob3dzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisgICAgICogLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKGdldFNpdGUoKS5nZXRTaGVsbCgpLCAiRmlsZSBjaGFuZ2VkIGRldGVjdGVkIiwgIlRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suIERpc2NhcmQgY2hhbmdlcyBhbmQgcmVsb2FkPyIpOworICAgIH0KIAotCS8qKgotCSAqIEhhbmRsZXMgd2hhdCB0byBkbyB3aXRoIGNoYW5nZWQgcmVzb3VyY2VzIG9uIGFjdGl2YXRpb24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKCkgewotCQlpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpICYmICghaXNEaXJ0eSgpIHx8IGhhbmRsZURpcnR5Q29uZmxpY3QoKSkpIHsKLQkJCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlRXJyb3IoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAotCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IGNoYW5nZWRSZXNvdXJjZXMpIHsKLQkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQloYW5kbGVFcnJvcihleGNlcHRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgIH0KIAotCS8qKgotCSAqIFRoaXMgZGVhbHMgd2l0aCBob3cgd2Ugd2FudCBzZWxlY3Rpb24gaW4gdGhlIG91dGxpbmVyIHRvIGFmZmVjdCB0aGUgb3RoZXIgdmlld3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChjdXJyZW50Vmlld2VyUGFuZSAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJdGVyYXRvcjw/PiBzZWxlY3RlZEVsZW1lbnRzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOwotCQkJaWYgKHNlbGVjdGVkRWxlbWVudHMuaGFzTmV4dCgpKSB7Ci0JCQkJLy8gR2V0IHRoZSBmaXJzdCBzZWxlY3RlZCBlbGVtZW50LgotCQkJCS8vCi0JCQkJLy8gT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMubmV4dCgpOwotCQkJCS8vIFRPRE8gc2VsZWN0IGVsZW1lbnQgaW4gZWRpdG9yCi0JCQl9Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHN0YXJ0dXAuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisgICAgICAgIHNldFNpdGUoc2l0ZSk7CisgICAgICAgIHNldElucHV0V2l0aE5vdGlmeShlZGl0b3JJbnB1dCk7CisgICAgICAgIHNldFBhcnROYW1lKGVkaXRvcklucHV0LmdldE5hbWUoKSk7CisgICAgICAgIHNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7CisgICAgICAgIHNpdGUuZ2V0UGFnZSgpLmFkZFBhcnRMaXN0ZW5lcih0aGlzLnBhcnRMaXN0ZW5lcik7CisgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMucmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOworICAgIH0KIAotCS8qKgotCSAqIFNob3dzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZURpcnR5Q29uZmxpY3QoKSB7Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgIkZpbGUgY2hhbmdlZCBkZXRlY3RlZCIsCi0JCQkJIlRoZSBmaWxlIGhhcyBjaGFuZ2VkIG9uIGRpc2suIERpc2NhcmQgY2hhbmdlcyBhbmQgcmVsb2FkPyIpOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIHNldHMgdXAgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbW9kZWwgZWRpdG9yLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KKyAgICAgICAgLy8KKyAgICAgICAgdGhpcy5hZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7CiAKLQlwcml2YXRlIHZvaWQgaGFuZGxlRXJyb3IoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgdGhpcy5hZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKyAgICAgICAgdGhpcy5hZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUGFySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisgICAgICAgIHRoaXMuYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKIAotCX0KKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlCisgICAgICAgIC8vIGV4ZWN1dGVkLgorICAgICAgICAvLworICAgICAgICBCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKIAotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzdGFydHVwLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKLQkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKLQkJc2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKLQkJc2l0ZS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHJlc291cmNlQ2hhbmdlTGlzdGVuZXIsCi0JCQkJSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCX0KKyAgICAgICAgLy8gQWRkIGEgbGlzdGVuZXIgdG8gc2V0IHRoZSBtb3N0IHJlY2VudCBjb21tYW5kJ3MgYWZmZWN0ZWQgb2JqZWN0cyB0bworICAgICAgICAvLyBiZSB0aGUgc2VsZWN0aW9uIG9mIHRoZSB2aWV3ZXIgd2l0aCBmb2N1cy4KKyAgICAgICAgLy8KKyAgICAgICAgY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKIAotCS8qKgotCSAqIFRoaXMgc2V0cyB1cCB0aGUgZWRpdGluZyBkb21haW4gZm9yIHRoZSBtb2RlbCBlZGl0b3IuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpIHsKLQkJLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KLQkJLy8KLQkJYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LkRlc2NyaXB0b3IuUmVnaXN0cnkuSU5TVEFOQ0UpOworICAgICAgICAgICAgcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgeworICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcigpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewogCi0JCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlhZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUGFySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKIAotCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUKLQkJLy8gZXhlY3V0ZWQuCi0JCS8vCi0JCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spIGV2ZW50LmdldFNvdXJjZSgpKS5nZXRNb3N0UmVjZW50Q29tbWFuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gc2V0IHRoZSBtb3N0IHJlY2VudCBjb21tYW5kJ3MgYWZmZWN0ZWQgb2JqZWN0cyB0bwotCQkvLyBiZSB0aGUgc2VsZWN0aW9uIG9mIHRoZSB2aWV3ZXIgd2l0aCBmb2N1cy4KLQkJLy8KLQkJY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJCQlnZXRDb250YWluZXIoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworICAgICAgICAvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQgc3RhY2suCisgICAgICAgIC8vCisgICAgICAgIHRoaXMuZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4odGhpcy5hZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7CisgICAgfQogCi0JCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBhZmZlY3RlZCBvYmplY3RzLgotCQkJCQkJLy8KLQkJCQkJCUNvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaykgZXZlbnQuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7Ci0JCQkJCQlpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKG1vc3RSZWNlbnRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9KTsKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHRlc3RzIHRoZSBjb21tYW5kIHN0YWNrLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCisgICAgICogZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7CisgICAgICAgIHJldHVybiAoKEJhc2ljQ29tbWFuZFN0YWNrKSB0aGlzLmVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLmlzU2F2ZU5lZWRlZCgpOworICAgIH0KIAotCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQgc3RhY2suCi0JCS8vCi0JCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2ssIG5ldyBIYXNoTWFwPFJlc291cmNlLCBCb29sZWFuPigpKTsKLQl9CisgICAgLyoqCisgICAgICogVGhpcyByZXR1cm5zIHdoZXRoZXIgc29tZXRoaW5nIGhhcyBiZWVuIHBlcnNpc3RlZCB0byB0aGUgVVJJIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzCisgICAgICogdGhlIFVSSSBjb252ZXJ0ZXIgZnJvbSB0aGUgZWRpdG9yJ3MgcmVzb3VyY2Ugc2V0IHRvIHRyeSB0byBvcGVuIGFuIGlucHV0IHN0cmVhbS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQorICAgICAqIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1BlcnNpc3RlZChSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gdGhpcy5lZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0ocmVzb3VyY2UuZ2V0VVJJKCkpOworICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gSWdub3JlCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKLQkvKioKLQkgKiBUaGlzIGlzIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIElFZGl0b3JQYXJ0fSBhbmQgc2ltcGx5IHRlc3RzIHRoZSBjb21tYW5kIHN0YWNrLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gKChCYXNpY0NvbW1hbmRTdGFjaykgZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuaXNTYXZlTmVlZGVkKCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB3aGV0aGVyIHNvbWV0aGluZyBoYXMgYmVlbiBwZXJzaXN0ZWQgdG8gdGhlIFVSSSBvZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlLiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcwotCSAqIHRoZSBVUkkgY29udmVydGVyIGZyb20gdGhlIGVkaXRvcidzIHJlc291cmNlIHNldCB0byB0cnkgdG8gb3BlbiBhbiBpbnB1dCBzdHJlYW0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUGVyc2lzdGVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0ocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gSWdub3JlCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgLy8gLyoqCisgICAgLy8gKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyfSB0byBoZWxwCisgICAgLy8gKiBmaWxsIHRoZSBjb250ZXh0IG1lbnVzIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIHRoZSBFZGl0IG1lbnUuIDwhLS0KKyAgICAvLyAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAvLyAqIEBnZW5lcmF0ZWQKKyAgICAvLyAqLworICAgIC8vIHB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKKyAgICAvLyAoKElNZW51TGlzdGVuZXIpCisgICAgLy8gZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkpLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7CisgICAgLy8gfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIC8qKgorICAgICAqIFRoaXMgaXMgdXNlZCB0byB0cmFjayB0aGUgYWN0aXZlIHZpZXdlci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgcGFnZUluZGV4KSB7CisgICAgICAgIHN1cGVyLnBhZ2VDaGFuZ2UocGFnZUluZGV4KTsKIAotCS8vIC8qKgotCS8vICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcn0gdG8gaGVscAotCS8vICogZmlsbCB0aGUgY29udGV4dCBtZW51cyB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgRWRpdCBtZW51LiA8IS0tCi0JLy8gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JLy8gKChJTWVudUxpc3RlbmVyKQotCS8vIGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpKS5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOwotCS8vIH0KKyAgICAgICAgaWYgKHRoaXMuY29udGVudE91dGxpbmVQYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhhbmRsZUNvbnRlbnRPdXRsaW5lU2VsZWN0aW9uKHRoaXMuY29udGVudE91dGxpbmVQYWdlLmdldFNlbGVjdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byB0cmFjayB0aGUgYWN0aXZlIHZpZXdlci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBhZ2VDaGFuZ2UoaW50IHBhZ2VJbmRleCkgewotCQlzdXBlci5wYWdlQ2hhbmdlKHBhZ2VJbmRleCk7CisgICAgLyoqCisgICAgICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCisgICAgICogLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgfQogCi0JCWlmIChjb250ZW50T3V0bGluZVBhZ2UgIT0gbnVsbCkgewotCQkJaGFuZGxlQ29udGVudE91dGxpbmVTZWxlY3Rpb24oY29udGVudE91dGxpbmVQYWdlLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvbmUgY29udGVudCB2aWV3ZXIsIGVpdGhlciBmb3IgdGhlIGN1cnJlbnQgcGFnZSBvciB0aGUgb3V0bGluZSB2aWV3LCBpZiBpdCBoYXMgZm9jdXMsIGlzIHRoZQorICAgICAqIGN1cnJlbnQgb25lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKKyAgICAgICAgLy8gSWYgaXQgaXMgY2hhbmdpbmcuLi4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXdlciAhPSB2aWV3ZXIpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBvbiBkZW1hbmQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewogCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlbGVjdGlvbkNoYW5nZWRFdmVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkNoYW5nZWRFdmVudC5nZXRTZWxlY3Rpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQogCi0JLyoqCi0JICogVGhpcyBtYWtlcyBzdXJlIHRoYXQgb25lIGNvbnRlbnQgdmlld2VyLCBlaXRoZXIgZm9yIHRoZSBjdXJyZW50IHBhZ2Ugb3IgdGhlIG91dGxpbmUgdmlldywgaWYgaXQgaGFzIGZvY3VzLCBpcyB0aGUKLQkgKiBjdXJyZW50IG9uZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRWaWV3ZXIoVmlld2VyIHZpZXdlcikgewotCQkvLyBJZiBpdCBpcyBjaGFuZ2luZy4uLgotCQkvLwotCQlpZiAoY3VycmVudFZpZXdlciAhPSB2aWV3ZXIpIHsKLQkJCWlmIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgb24gZGVtYW5kLgotCQkJCS8vCi0JCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCS8vIFRoaXMganVzdCBub3RpZmllcyB0aG9zZSB0aGluZ3MgdGhhdCBhcmUgYWZmZWN0ZWQgYnkKLQkJCQkJLy8gdGhlIHNlY3Rpb24uCi0JCQkJCS8vCi0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHNlbGVjdGlvbkNoYW5nZWRFdmVudCkgewotCQkJCQkJc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkNoYW5nZWRFdmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQorICAgICAgICAgICAgLy8gU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCBvbmUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFZpZXdlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Vmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzLnNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7CisgICAgICAgICAgICB9CiAKLQkJCS8vIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBvbGQgb25lLgotCQkJLy8KLQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKLQkJCQljdXJyZW50Vmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCQkJfQorICAgICAgICAgICAgLy8gU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXcgb25lLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICh2aWV3ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcy5zZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOworICAgICAgICAgICAgfQogCi0JCQkvLyBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5ldyBvbmUuCi0JCQkvLwotCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCQkJfQorICAgICAgICAgICAgLy8gUmVtZW1iZXIgaXQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdGhpcy5jdXJyZW50Vmlld2VyID0gdmlld2VyOwogCi0JCQkvLyBSZW1lbWJlciBpdC4KLQkJCS8vCi0JCQljdXJyZW50Vmlld2VyID0gdmlld2VyOworICAgICAgICAgICAgLy8gU2V0IHRoZSBlZGl0b3JzIHNlbGVjdGlvbiBiYXNlZCBvbiB0aGUgY3VycmVudCB2aWV3ZXIncworICAgICAgICAgICAgLy8gc2VsZWN0aW9uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHNldFNlbGVjdGlvbih0aGlzLmN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkgOiB0aGlzLmN1cnJlbnRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOworICAgICAgICB9CisgICAgfQogCi0JCQkvLyBTZXQgdGhlIGVkaXRvcnMgc2VsZWN0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZpZXdlcidzCi0JCQkvLyBzZWxlY3Rpb24uCi0JCQkvLwotCQkJc2V0U2VsZWN0aW9uKGN1cnJlbnRWaWV3ZXIgPT0gbnVsbCA/IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkgOiBjdXJyZW50Vmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAgICAgKgorICAgICAqIEBnZW5lcmF0ZWQKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKKyAgICAgICAgLy8gVE9ETyBpbXBsZW1lbnQKKyAgICB9CiAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCS8vIFRPRE8gaW1wbGVtZW50Ci0JfQorICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXJ9IHRvIHNldCB0aGlzIGVkaXRvcidzIG92ZXJhbGwgc2VsZWN0aW9uLgorICAgICAqIENhbGxpbmcgdGhpcyByZXN1bHQgd2lsbCBub3RpZnkgdGhlIGxpc3RlbmVycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisgICAgICAgIHRoaXMuZWRpdG9yU2VsZWN0aW9uID0gc2VsZWN0aW9uOwogCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcn0gdG8gc2V0IHRoaXMgZWRpdG9yJ3Mgb3ZlcmFsbCBzZWxlY3Rpb24uCi0JICogQ2FsbGluZyB0aGlzIHJlc3VsdCB3aWxsIG5vdGlmeSB0aGUgbGlzdGVuZXJzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWVkaXRvclNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKKyAgICAgICAgZm9yIChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5zZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBsaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0U3RhdHVzTGluZU1hbmFnZXIoc2VsZWN0aW9uKTsKKyAgICB9CiAKLQkJZm9yIChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyIDogc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycykgewotCQkJbGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOwotCQl9Ci0JCS8vIHNldFN0YXR1c0xpbmVNYW5hZ2VyKHNlbGVjdGlvbik7Ci0JfQorICAgIC8qKgorICAgICAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgeworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPD8+IHRoZVNlbGVjdGlvbiA9IGNvbGxlY3Rpb247CisgICAgICAgIC8vIE1ha2Ugc3VyZSBpdCdzIG9rYXkuCisgICAgICAgIC8vCisgICAgICAgIGlmICh0aGVTZWxlY3Rpb24gIT0gbnVsbCAmJiAhdGhlU2VsZWN0aW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gSSBkb24ndCBrbm93IGlmIHRoaXMgc2hvdWxkIGJlIHJ1biB0aGlzIGRlZmVycmVkCisgICAgICAgICAgICAvLyBiZWNhdXNlIHdlIG1pZ2h0IGhhdmUgdG8gZ2l2ZSB0aGUgZWRpdG9yIGEgY2hhbmNlIHRvIHByb2Nlc3MgdGhlCisgICAgICAgICAgICAvLyB2aWV3ZXIgdXBkYXRlIGV2ZW50cworICAgICAgICAgICAgLy8gYW5kIGhlbmNlIHRvIHVwZGF0ZSB0aGUgdmlld3MgZmlyc3QuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewogCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvblRvVmlld2VyKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlmaW5hbCBDb2xsZWN0aW9uPD8+IHRoZVNlbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JCS8vIE1ha2Ugc3VyZSBpdCdzIG9rYXkuCi0JCS8vCi0JCWlmICh0aGVTZWxlY3Rpb24gIT0gbnVsbCAmJiAhdGhlU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJLy8gSSBkb24ndCBrbm93IGlmIHRoaXMgc2hvdWxkIGJlIHJ1biB0aGlzIGRlZmVycmVkCi0JCQkvLyBiZWNhdXNlIHdlIG1pZ2h0IGhhdmUgdG8gZ2l2ZSB0aGUgZWRpdG9yIGEgY2hhbmNlIHRvIHByb2Nlc3MgdGhlCi0JCQkvLyB2aWV3ZXIgdXBkYXRlIGV2ZW50cwotCQkJLy8gYW5kIGhlbmNlIHRvIHVwZGF0ZSB0aGUgdmlld3MgZmlyc3QuCi0JCQkvLwotCQkJLy8KLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIKLQkJCQkJLy8gb2YgdGhlIGVkaXRvci4KLQkJCQkJLy8KLQkJCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgewotCQkJCQkJY3VycmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhlU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHNlbGVjdCB0aGUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgY29udGVudCB2aWV3ZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGVkaXRvci4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgaWYgKFBhckVkaXRvci50aGlzLmN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUGFyRWRpdG9yLnRoaXMuY3VycmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhlU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bigpOworICAgICAgICB9CisgICAgfQogCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8vIHB1YmxpYyB2b2lkIHNldFN0YXR1c0xpbmVNYW5hZ2VyKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JLy8gSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gY3VycmVudFZpZXdlciAhPSBudWxsICYmCi0JLy8gY3VycmVudFZpZXdlciA9PSBjb250ZW50T3V0bGluZVZpZXdlciA/IGNvbnRlbnRPdXRsaW5lU3RhdHVzTGluZU1hbmFnZXIgOgotCS8vIGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCS8vCi0JLy8gaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKLQkvLyBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkvLyBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOwotCS8vIHN3aXRjaCAoY29sbGVjdGlvbi5zaXplKCkpIHsKLQkvLyBjYXNlIDA6IHsKLQkvLyBzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKGdldFN0cmluZygiX1VJX05vT2JqZWN0U2VsZWN0ZWQiKSk7Ci0JLy8gYnJlYWs7Ci0JLy8gfQotCS8vIGNhc2UgMTogewotCS8vIFN0cmluZyB0ZXh0ID0gbmV3Ci0JLy8gQWRhcHRlckZhY3RvcnlJdGVtRGVsZWdhdG9yKGFkYXB0ZXJGYWN0b3J5KS5nZXRUZXh0KGNvbGxlY3Rpb24uaXRlcmF0b3IoKS4KLQkvLyBuZXh0KCkpOwotCS8vIHN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQiLAotCS8vIHRleHQpKTsKLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8gZGVmYXVsdDogewotCS8vIHN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTXVsdGlPYmplY3RTZWxlY3RlZCIsCi0JLy8gSW50ZWdlci50b1N0cmluZyhjb2xsZWN0aW9uCi0JLy8gLnNpemUoKSkpKTsKLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyBlbHNlIHsKLQkvLyBzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKCIiKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG91dGxpbmUgdmlldyBzaG91bGQgYmUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd091dGxpbmVWaWV3KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgLyoqCisgICAgICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgICAgICoKKyAgICAgKiBAZ2VuZXJhdGVkCisgICAgICovCisgICAgLy8gcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKyAgICAvLyBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBjdXJyZW50Vmlld2VyICE9IG51bGwgJiYKKyAgICAvLyBjdXJyZW50Vmlld2VyID09IGNvbnRlbnRPdXRsaW5lVmlld2VyID8gY29udGVudE91dGxpbmVTdGF0dXNMaW5lTWFuYWdlciA6CisgICAgLy8gZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7CisgICAgLy8KKyAgICAvLyBpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgeworICAgIC8vIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgeworICAgIC8vIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikudG9MaXN0KCk7CisgICAgLy8gc3dpdGNoIChjb2xsZWN0aW9uLnNpemUoKSkgeworICAgIC8vIGNhc2UgMDogeworICAgIC8vIHN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoZ2V0U3RyaW5nKCJfVUlfTm9PYmplY3RTZWxlY3RlZCIpKTsKKyAgICAvLyBicmVhazsKKyAgICAvLyB9CisgICAgLy8gY2FzZSAxOiB7CisgICAgLy8gU3RyaW5nIHRleHQgPSBuZXcKKyAgICAvLyBBZGFwdGVyRmFjdG9yeUl0ZW1EZWxlZ2F0b3IoYWRhcHRlckZhY3RvcnkpLmdldFRleHQoY29sbGVjdGlvbi5pdGVyYXRvcigpLgorICAgIC8vIG5leHQoKSk7CisgICAgLy8gc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZCIsCisgICAgLy8gdGV4dCkpOworICAgIC8vIGJyZWFrOworICAgIC8vIH0KKyAgICAvLyBkZWZhdWx0OiB7CisgICAgLy8gc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShnZXRTdHJpbmcoIl9VSV9NdWx0aU9iamVjdFNlbGVjdGVkIiwKKyAgICAvLyBJbnRlZ2VyLnRvU3RyaW5nKGNvbGxlY3Rpb24KKyAgICAvLyAuc2l6ZSgpKSkpOworICAgIC8vIGJyZWFrOworICAgIC8vIH0KKyAgICAvLyB9CisgICAgLy8gfQorICAgIC8vIGVsc2UgeworICAgIC8vIHN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOworICAgIC8vIH0KKyAgICAvLyB9CisgICAgLy8gfQorICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgb3V0bGluZSB2aWV3IHNob3VsZCBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICAgICAqCisgICAgICogQGdlbmVyYXRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIHNob3dPdXRsaW5lVmlldygpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogCi0JcHJvdGVjdGVkIEZvcm1Ub29sa2l0IGNyZWF0ZVRvb2xraXQoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCXJldHVybiBuZXcgRm9ybVRvb2xraXQoU2VydmVySWRlVWlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEZvcm1Db2xvcnMoZGlzcGxheSkpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRm9ybVRvb2xraXQgY3JlYXRlVG9vbGtpdChEaXNwbGF5IGRpc3BsYXkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGb3JtVG9vbGtpdChTZXJ2ZXJJZGVVaVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Rm9ybUNvbG9ycyhkaXNwbGF5KSk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL1BhckdlbmVyYWxJbmZvU2VjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QYXJHZW5lcmFsSW5mb1NlY3Rpb24uamF2YQppbmRleCAyYWI5ZDZkLi5jYzkyNjU1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL1BhckdlbmVyYWxJbmZvU2VjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGFyR2VuZXJhbEluZm9TZWN0aW9uLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKQEAgLTMwLDEzOSArMzEsMTQzIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQYXJHZW5lcmFsSW5mb1NlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFBkZUdlbmVyYWxJbmZvU2VjdGlvbiB7CiAKLQlwdWJsaWMgUGFyR2VuZXJhbEluZm9TZWN0aW9uKFBERUZvcm1QYWdlIHBhZ2UsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFnZSwgcGFyZW50KTsKLQl9CisgICAgcHVibGljIFBhckdlbmVyYWxJbmZvU2VjdGlvbihQREVGb3JtUGFnZSBwYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIHN1cGVyKHBhZ2UsIHBhcmVudCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3BlY2lmaWNDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVNwZWNpZmljQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgeworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNsaWVudChTZWN0aW9uIHNlY3Rpb24sIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc2VjdGlvbi5zZXRUZXh0KFBERVVJTWVzc2FnZXMuTWFuaWZlc3RFZGl0b3JfUGx1Z2luU3BlY1NlY3Rpb25fdGl0bGUpOwotCQlzZWN0aW9uLnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVDbGVhclRhYmxlV3JhcExheW91dChmYWxzZSwgMSkpOwotCQlUYWJsZVdyYXBEYXRhIGRhdGEgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDbGllbnQoU2VjdGlvbiBzZWN0aW9uLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7CisgICAgICAgIHNlY3Rpb24uc2V0VGV4dChQREVVSU1lc3NhZ2VzLk1hbmlmZXN0RWRpdG9yX1BsdWdpblNwZWNTZWN0aW9uX3RpdGxlKTsKKyAgICAgICAgc2VjdGlvbi5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlQ2xlYXJUYWJsZVdyYXBMYXlvdXQoZmFsc2UsIDEpKTsKKyAgICAgICAgVGFibGVXcmFwRGF0YSBkYXRhID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOworICAgICAgICBzZWN0aW9uLnNldExheW91dERhdGEoZGF0YSk7CiAKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJY2xpZW50LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVTZWN0aW9uQ2xpZW50VGFibGVXcmFwTGF5b3V0KGZhbHNlLCAyKSk7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KGNsaWVudCk7CisgICAgICAgIHNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkpOworICAgICAgICBDb21wb3NpdGUgY2xpZW50ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7CisgICAgICAgIGNsaWVudC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlU2VjdGlvbkNsaWVudFRhYmxlV3JhcExheW91dChmYWxzZSwgMikpOworICAgICAgICBzZWN0aW9uLnNldENsaWVudChjbGllbnQpOwogCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSBnZXRQYWdlKCkuZ2V0UERFRWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJY3JlYXRlSURFbnRyeShjbGllbnQsIHRvb2xraXQsIGFjdGlvbkJhcnMpOwotCQljcmVhdGVWZXJzaW9uRW50cnkoY2xpZW50LCB0b29sa2l0LCBhY3Rpb25CYXJzKTsKLQkJY3JlYXRlTmFtZUVudHJ5KGNsaWVudCwgdG9vbGtpdCwgYWN0aW9uQmFycyk7Ci0JCWNyZWF0ZVByb3ZpZGVyRW50cnkoY2xpZW50LCB0b29sa2l0LCBhY3Rpb25CYXJzKTsKLQkJY3JlYXRlU3BlY2lmaWNDb250cm9scyhjbGllbnQsIHRvb2xraXQsIGFjdGlvbkJhcnMpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihjbGllbnQpOwotCX0KKyAgICAgICAgSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpOworICAgICAgICBjcmVhdGVJREVudHJ5KGNsaWVudCwgdG9vbGtpdCwgYWN0aW9uQmFycyk7CisgICAgICAgIGNyZWF0ZVZlcnNpb25FbnRyeShjbGllbnQsIHRvb2xraXQsIGFjdGlvbkJhcnMpOworICAgICAgICBjcmVhdGVOYW1lRW50cnkoY2xpZW50LCB0b29sa2l0LCBhY3Rpb25CYXJzKTsKKyAgICAgICAgY3JlYXRlUHJvdmlkZXJFbnRyeShjbGllbnQsIHRvb2xraXQsIGFjdGlvbkJhcnMpOworICAgICAgICBjcmVhdGVTcGVjaWZpY0NvbnRyb2xzKGNsaWVudCwgdG9vbGtpdCwgYWN0aW9uQmFycyk7CisgICAgICAgIHRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGNsaWVudCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSURFbnRyeShDb21wb3NpdGUgY2xpZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWZJZEVudHJ5ID0gbmV3IEZvcm1FbnRyeShjbGllbnQsIHRvb2xraXQsIFBERVVJTWVzc2FnZXMuR2VuZXJhbEluZm9TZWN0aW9uX2lkLCBudWxsLCBmYWxzZSk7Ci0JCWZJZEVudHJ5LnNldEZvcm1FbnRyeUxpc3RlbmVyKG5ldyBGb3JtRW50cnlBZGFwdGVyKHRoaXMsIGFjdGlvbkJhcnMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdGV4dFZhbHVlQ2hhbmdlZChGb3JtRW50cnkgZW50cnkpIHsKLQkJCQlnZXRCdW5kbGUoKS5zZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5QQVJfU1lNQk9MSUNOQU1FLCBmSWRFbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCWZJZEVudHJ5LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7Ci0JCS8vIENyZWF0ZSB2YWxpZGF0b3IKLQkJLy8gZklkRW50cnlWYWxpZGF0b3IgPSBuZXcgVGV4dFZhbGlkYXRvcihnZXRNYW5hZ2VkRm9ybSgpLAotCQkvLyBmSWRFbnRyeS5nZXRUZXh0KCksIGdldFByb2plY3QoKSwgdHJ1ZSkgewotCQkvLyBAT3ZlcnJpZGUKLQkJLy8gcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVDb250cm9sKCkgewotCQkvLyByZXR1cm4gdmFsaWRhdGVJZEVudHJ5KCk7Ci0JCS8vIH0KLQkJLy8gfTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlSURFbnRyeShDb21wb3NpdGUgY2xpZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisgICAgICAgIHRoaXMuZklkRW50cnkgPSBuZXcgRm9ybUVudHJ5KGNsaWVudCwgdG9vbGtpdCwgUERFVUlNZXNzYWdlcy5HZW5lcmFsSW5mb1NlY3Rpb25faWQsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgdGhpcy5mSWRFbnRyeS5zZXRGb3JtRW50cnlMaXN0ZW5lcihuZXcgRm9ybUVudHJ5QWRhcHRlcih0aGlzLCBhY3Rpb25CYXJzKSB7CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWZXJzaW9uRW50cnkoQ29tcG9zaXRlIGNsaWVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlmVmVyc2lvbkVudHJ5ID0gbmV3IEZvcm1FbnRyeShjbGllbnQsIHRvb2xraXQsIFBERVVJTWVzc2FnZXMuR2VuZXJhbEluZm9TZWN0aW9uX3ZlcnNpb24sIG51bGwsIGZhbHNlKTsKLQkJZlZlcnNpb25FbnRyeS5zZXRGb3JtRW50cnlMaXN0ZW5lcihuZXcgRm9ybUVudHJ5QWRhcHRlcih0aGlzLCBhY3Rpb25CYXJzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRleHRWYWx1ZUNoYW5nZWQoRm9ybUVudHJ5IGVudHJ5KSB7Ci0JCQkJZ2V0QnVuZGxlKCkuc2V0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuUEFSX1ZFUlNJT04sIGZWZXJzaW9uRW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlmVmVyc2lvbkVudHJ5LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7Ci0JCS8vIENyZWF0ZSB2YWxpZGF0b3IKLQkJLy8gZlZlcnNpb25FbnRyeVZhbGlkYXRvciA9IG5ldyBUZXh0VmFsaWRhdG9yKGdldE1hbmFnZWRGb3JtKCksCi0JCS8vIGZWZXJzaW9uRW50cnkuZ2V0VGV4dCgpLCBnZXRQcm9qZWN0KCksIHRydWUpIHsKLQkJLy8gQE92ZXJyaWRlCi0JCS8vIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlQ29udHJvbCgpIHsKLQkJLy8gcmV0dXJuIHZhbGlkYXRlVmVyc2lvbkVudHJ5KCk7Ci0JCS8vIH0KLQkJLy8gfTsKLQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRleHRWYWx1ZUNoYW5nZWQoRm9ybUVudHJ5IGVudHJ5KSB7CisgICAgICAgICAgICAgICAgZ2V0QnVuZGxlKCkuc2V0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuUEFSX1NZTUJPTElDTkFNRSwgUGFyR2VuZXJhbEluZm9TZWN0aW9uLnRoaXMuZklkRW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmZJZEVudHJ5LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7CisgICAgICAgIC8vIENyZWF0ZSB2YWxpZGF0b3IKKyAgICAgICAgLy8gZklkRW50cnlWYWxpZGF0b3IgPSBuZXcgVGV4dFZhbGlkYXRvcihnZXRNYW5hZ2VkRm9ybSgpLAorICAgICAgICAvLyBmSWRFbnRyeS5nZXRUZXh0KCksIGdldFByb2plY3QoKSwgdHJ1ZSkgeworICAgICAgICAvLyBAT3ZlcnJpZGUKKyAgICAgICAgLy8gcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVDb250cm9sKCkgeworICAgICAgICAvLyByZXR1cm4gdmFsaWRhdGVJZEVudHJ5KCk7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gfTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOYW1lRW50cnkoQ29tcG9zaXRlIGNsaWVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlmTmFtZUVudHJ5ID0gbmV3IEZvcm1FbnRyeShjbGllbnQsIHRvb2xraXQsIFBERVVJTWVzc2FnZXMuR2VuZXJhbEluZm9TZWN0aW9uX25hbWUsIG51bGwsIGZhbHNlKTsKLQkJZk5hbWVFbnRyeS5zZXRGb3JtRW50cnlMaXN0ZW5lcihuZXcgRm9ybUVudHJ5QWRhcHRlcih0aGlzLCBhY3Rpb25CYXJzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRleHRWYWx1ZUNoYW5nZWQoRm9ybUVudHJ5IGVudHJ5KSB7Ci0JCQkJZ2V0QnVuZGxlKCkuc2V0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuUEFSX05BTUUsIGZOYW1lRW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlmTmFtZUVudHJ5LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7Ci0JCS8vIENyZWF0ZSB2YWxpZGF0b3IKLQkJLy8gZk5hbWVFbnRyeVZhbGlkYXRvciA9IG5ldyBUZXh0VmFsaWRhdG9yKGdldE1hbmFnZWRGb3JtKCksCi0JCS8vIGZOYW1lRW50cnkuZ2V0VGV4dCgpLCBnZXRQcm9qZWN0KCksIHRydWUpIHsKLQkJLy8gQE92ZXJyaWRlCi0JCS8vIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlQ29udHJvbCgpIHsKLQkJLy8gcmV0dXJuIHZhbGlkYXRlTmFtZUVudHJ5KCk7Ci0JCS8vIH0KLQkJLy8gfTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmVyc2lvbkVudHJ5KENvbXBvc2l0ZSBjbGllbnQsIEZvcm1Ub29sa2l0IHRvb2xraXQsIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKyAgICAgICAgdGhpcy5mVmVyc2lvbkVudHJ5ID0gbmV3IEZvcm1FbnRyeShjbGllbnQsIHRvb2xraXQsIFBERVVJTWVzc2FnZXMuR2VuZXJhbEluZm9TZWN0aW9uX3ZlcnNpb24sIG51bGwsIGZhbHNlKTsKKyAgICAgICAgdGhpcy5mVmVyc2lvbkVudHJ5LnNldEZvcm1FbnRyeUxpc3RlbmVyKG5ldyBGb3JtRW50cnlBZGFwdGVyKHRoaXMsIGFjdGlvbkJhcnMpIHsKIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb3ZpZGVyRW50cnkoQ29tcG9zaXRlIGNsaWVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCwgSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlmUHJvdmlkZXJFbnRyeSA9IG5ldyBGb3JtRW50cnkoY2xpZW50LCB0b29sa2l0LCAiRGVzY3JpcHRpb24iLCBudWxsLCBmYWxzZSk7Ci0JCWZQcm92aWRlckVudHJ5LnNldEZvcm1FbnRyeUxpc3RlbmVyKG5ldyBGb3JtRW50cnlBZGFwdGVyKHRoaXMsIGFjdGlvbkJhcnMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdGV4dFZhbHVlQ2hhbmdlZChGb3JtRW50cnkgZW50cnkpIHsKLQkJCQlnZXRCdW5kbGUoKS5zZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5QQVJfREVTQ1JJUFRJT04sIGZQcm92aWRlckVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQkJZlByb3ZpZGVyRW50cnkuc2V0RWRpdGFibGUoaXNFZGl0YWJsZSgpKTsKLQkJLy8gQ3JlYXRlIHZhbGlkYXRvcgotCQkvLyBmUHJvdmlkZXJFbnRyeVZhbGlkYXRvciA9IG5ldyBUZXh0VmFsaWRhdG9yKGdldE1hbmFnZWRGb3JtKCksCi0JCS8vIGZQcm92aWRlckVudHJ5LmdldFRleHQoKSwgZ2V0UHJvamVjdCgpLCB0cnVlKSB7Ci0JCS8vIEBPdmVycmlkZQotCQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUNvbnRyb2woKSB7Ci0JCS8vIHJldHVybiB2YWxpZGF0ZVByb3ZpZGVyRW50cnkoKTsKLQkJLy8gfQotCQkvLyB9OwotCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdGV4dFZhbHVlQ2hhbmdlZChGb3JtRW50cnkgZW50cnkpIHsKKyAgICAgICAgICAgICAgICBnZXRCdW5kbGUoKS5zZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5QQVJfVkVSU0lPTiwgUGFyR2VuZXJhbEluZm9TZWN0aW9uLnRoaXMuZlZlcnNpb25FbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHRoaXMuZlZlcnNpb25FbnRyeS5zZXRFZGl0YWJsZShpc0VkaXRhYmxlKCkpOworICAgICAgICAvLyBDcmVhdGUgdmFsaWRhdG9yCisgICAgICAgIC8vIGZWZXJzaW9uRW50cnlWYWxpZGF0b3IgPSBuZXcgVGV4dFZhbGlkYXRvcihnZXRNYW5hZ2VkRm9ybSgpLAorICAgICAgICAvLyBmVmVyc2lvbkVudHJ5LmdldFRleHQoKSwgZ2V0UHJvamVjdCgpLCB0cnVlKSB7CisgICAgICAgIC8vIEBPdmVycmlkZQorICAgICAgICAvLyBwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUNvbnRyb2woKSB7CisgICAgICAgIC8vIHJldHVybiB2YWxpZGF0ZVZlcnNpb25FbnRyeSgpOworICAgICAgICAvLyB9CisgICAgICAgIC8vIH07CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgUEFSIjsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlTmFtZUVudHJ5KENvbXBvc2l0ZSBjbGllbnQsIEZvcm1Ub29sa2l0IHRvb2xraXQsIElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKKyAgICAgICAgdGhpcy5mTmFtZUVudHJ5ID0gbmV3IEZvcm1FbnRyeShjbGllbnQsIHRvb2xraXQsIFBERVVJTWVzc2FnZXMuR2VuZXJhbEluZm9TZWN0aW9uX25hbWUsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgdGhpcy5mTmFtZUVudHJ5LnNldEZvcm1FbnRyeUxpc3RlbmVyKG5ldyBGb3JtRW50cnlBZGFwdGVyKHRoaXMsIGFjdGlvbkJhcnMpIHsKIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWlmIChmSWRFbnRyeSAhPSBudWxsKSB7Ci0JCQlmSWRFbnRyeS5zZXRWYWx1ZShnZXRCdW5kbGUoKS5nZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5QQVJfU1lNQk9MSUNOQU1FKSwgdHJ1ZSk7Ci0JCX0KLQkJaWYgKGZOYW1lRW50cnkgIT0gbnVsbCkgewotCQkJZk5hbWVFbnRyeS5zZXRWYWx1ZShnZXRCdW5kbGUoKS5nZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5QQVJfTkFNRSksIHRydWUpOwotCQl9Ci0JCWlmIChmUHJvdmlkZXJFbnRyeSAhPSBudWxsKSB7Ci0JCQlmUHJvdmlkZXJFbnRyeS5zZXRWYWx1ZShnZXRCdW5kbGUoKS5nZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5QQVJfREVTQ1JJUFRJT04pLCB0cnVlKTsKLQkJfQotCQlpZiAoZlZlcnNpb25FbnRyeSAhPSBudWxsKSB7Ci0JCQlmVmVyc2lvbkVudHJ5LnNldFZhbHVlKGdldEJ1bmRsZSgpLmdldEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLlBBUl9WRVJTSU9OKSwgdHJ1ZSk7Ci0JCX0KLQkJZ2V0UGFnZSgpLmdldFBERUVkaXRvcigpLnVwZGF0ZVRpdGxlKCk7Ci0JfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXh0VmFsdWVDaGFuZ2VkKEZvcm1FbnRyeSBlbnRyeSkgeworICAgICAgICAgICAgICAgIGdldEJ1bmRsZSgpLnNldEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLlBBUl9OQU1FLCBQYXJHZW5lcmFsSW5mb1NlY3Rpb24udGhpcy5mTmFtZUVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdGhpcy5mTmFtZUVudHJ5LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7CisgICAgICAgIC8vIENyZWF0ZSB2YWxpZGF0b3IKKyAgICAgICAgLy8gZk5hbWVFbnRyeVZhbGlkYXRvciA9IG5ldyBUZXh0VmFsaWRhdG9yKGdldE1hbmFnZWRGb3JtKCksCisgICAgICAgIC8vIGZOYW1lRW50cnkuZ2V0VGV4dCgpLCBnZXRQcm9qZWN0KCksIHRydWUpIHsKKyAgICAgICAgLy8gQE92ZXJyaWRlCisgICAgICAgIC8vIHByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlQ29udHJvbCgpIHsKKyAgICAgICAgLy8gcmV0dXJuIHZhbGlkYXRlTmFtZUVudHJ5KCk7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gfTsKKyAgICB9CiAKLQlwdWJsaWMgSVByb2plY3QgZ2V0UGFyUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldFByb2plY3QoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvdmlkZXJFbnRyeShDb21wb3NpdGUgY2xpZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0LCBJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7CisgICAgICAgIHRoaXMuZlByb3ZpZGVyRW50cnkgPSBuZXcgRm9ybUVudHJ5KGNsaWVudCwgdG9vbGtpdCwgIkRlc2NyaXB0aW9uIiwgbnVsbCwgZmFsc2UpOworICAgICAgICB0aGlzLmZQcm92aWRlckVudHJ5LnNldEZvcm1FbnRyeUxpc3RlbmVyKG5ldyBGb3JtRW50cnlBZGFwdGVyKHRoaXMsIGFjdGlvbkJhcnMpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXh0VmFsdWVDaGFuZ2VkKEZvcm1FbnRyeSBlbnRyeSkgeworICAgICAgICAgICAgICAgIGdldEJ1bmRsZSgpLnNldEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLlBBUl9ERVNDUklQVElPTiwgUGFyR2VuZXJhbEluZm9TZWN0aW9uLnRoaXMuZlByb3ZpZGVyRW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0aGlzLmZQcm92aWRlckVudHJ5LnNldEVkaXRhYmxlKGlzRWRpdGFibGUoKSk7CisgICAgICAgIC8vIENyZWF0ZSB2YWxpZGF0b3IKKyAgICAgICAgLy8gZlByb3ZpZGVyRW50cnlWYWxpZGF0b3IgPSBuZXcgVGV4dFZhbGlkYXRvcihnZXRNYW5hZ2VkRm9ybSgpLAorICAgICAgICAvLyBmUHJvdmlkZXJFbnRyeS5nZXRUZXh0KCksIGdldFByb2plY3QoKSwgdHJ1ZSkgeworICAgICAgICAvLyBAT3ZlcnJpZGUKKyAgICAgICAgLy8gcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVDb250cm9sKCkgeworICAgICAgICAvLyByZXR1cm4gdmFsaWRhdGVQcm92aWRlckVudHJ5KCk7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gfTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICJUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBQQVIiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKSB7CisgICAgICAgIGlmICh0aGlzLmZJZEVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZklkRW50cnkuc2V0VmFsdWUoZ2V0QnVuZGxlKCkuZ2V0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuUEFSX1NZTUJPTElDTkFNRSksIHRydWUpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmZOYW1lRW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5mTmFtZUVudHJ5LnNldFZhbHVlKGdldEJ1bmRsZSgpLmdldEhlYWRlcihJSGVhZGVyQ29uc3RhbnRzLlBBUl9OQU1FKSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuZlByb3ZpZGVyRW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5mUHJvdmlkZXJFbnRyeS5zZXRWYWx1ZShnZXRCdW5kbGUoKS5nZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5QQVJfREVTQ1JJUFRJT04pLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5mVmVyc2lvbkVudHJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZlZlcnNpb25FbnRyeS5zZXRWYWx1ZShnZXRCdW5kbGUoKS5nZXRIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5QQVJfVkVSU0lPTiksIHRydWUpOworICAgICAgICB9CisgICAgICAgIGdldFBhZ2UoKS5nZXRQREVFZGl0b3IoKS51cGRhdGVUaXRsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBJUHJvamVjdCBnZXRQYXJQcm9qZWN0KCkgeworICAgICAgICByZXR1cm4gZ2V0UHJvamVjdCgpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QYXJNYW5pZmVzdEVkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QYXJNYW5pZmVzdEVkaXRvci5qYXZhCmluZGV4IGU1YWU2YWEuLjJiODMxY2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGFyTWFuaWZlc3RFZGl0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL1Bhck1hbmlmZXN0RWRpdG9yLmphdmEKQEAgLTY4LDcgKzY4LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUucGFyLnByb3ZpZGVyLlBhckl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5TZXJ2ZXJJZGVVaVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuU3RhdHVzSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9ycy5tb2RlbC5CdW5kbGVNb2RlbFV0aWxpdHk7CiAKIC8qKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCkBAIC03NiwzMTcgKzc1LDMyMSBAQAogICovCiBwdWJsaWMgY2xhc3MgUGFyTWFuaWZlc3RFZGl0b3IgZXh0ZW5kcyBCdW5kbGVNYW5pZmVzdEVkaXRvciB7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRF9FRElUT1IgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnBhcm1hbmlmZXN0IjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJRF9FRElUT1IgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLnBhcm1hbmlmZXN0IjsKIAotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OworICAgIHByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwogCi0JcHJvdGVjdGVkIFZpZXdlciBjdXJyZW50Vmlld2VyOworICAgIHByb3RlY3RlZCBWaWV3ZXIgY3VycmVudFZpZXdlcjsKIAotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKKyAgICBwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47CiAKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CiAKLQlwcml2YXRlIFJlc291cmNlIHBhclJlc291cmNlOworICAgIHByaXZhdGUgUmVzb3VyY2UgcGFyUmVzb3VyY2U7CiAKLQlwcml2YXRlIFBhciBwYXI7CisgICAgcHJpdmF0ZSBQYXIgcGFyOwogCi0JcHJpdmF0ZSBJRWRpdG9ySW5wdXQgcGFySW5wdXQ7CisgICAgcHJpdmF0ZSBJRWRpdG9ySW5wdXQgcGFySW5wdXQ7CiAKLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KKyAgICBwdWJsaWMgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVkaXRpbmdEb21haW47CisgICAgfQogCi0JcHVibGljIFBhciBnZXRQYXIoKSB7Ci0JCXJldHVybiBwYXI7Ci0JfQorICAgIHB1YmxpYyBQYXIgZ2V0UGFyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wYXI7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRWRpdG9yUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQlhZGRQYWdlKG5ldyBQYXJPdmVydmlld1BhZ2UodGhpcykpOwotCQkJaWYgKHBhcklucHV0ICE9IG51bGwpIHsKLQkJCQlpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpOwotCQkJCWNyZWF0ZVBhclBhZ2VzKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCVN0YXR1c0hhbmRsZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELCAiRmFpbGVkIHRvIGNyZWF0ZSBlZGl0b3IgcGFnZXMiLCBlKSk7Ci0JCX0KLQkJYWRkU291cmNlUGFnZShCdW5kbGVJbnB1dENvbnRleHQuQ09OVEVYVF9JRCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGFkZEVkaXRvclBhZ2VzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWRkUGFnZShuZXcgUGFyT3ZlcnZpZXdQYWdlKHRoaXMpKTsKKyAgICAgICAgICAgIGlmICh0aGlzLnBhcklucHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpOworICAgICAgICAgICAgICAgIGNyZWF0ZVBhclBhZ2VzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0YXR1c0hhbmRsZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELCAiRmFpbGVkIHRvIGNyZWF0ZSBlZGl0b3IgcGFnZXMiLCBlKSk7CisgICAgICAgIH0KKyAgICAgICAgYWRkU291cmNlUGFnZShCdW5kbGVJbnB1dENvbnRleHQuQ09OVEVYVF9JRCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVzb3VyY2VDb250ZXh0cyhJbnB1dENvbnRleHRNYW5hZ2VyIG1hbmFnZXIsIElGaWxlRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSUZpbGUgZmlsZSA9IGlucHV0LmdldEZpbGUoKTsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBmaWxlLmdldFBhcmVudCgpOwotCQlvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVzb3VyY2VDb250ZXh0cyhJbnB1dENvbnRleHRNYW5hZ2VyIG1hbmFnZXIsIElGaWxlRWRpdG9ySW5wdXQgaW5wdXQpIHsKKyAgICAgICAgSUZpbGUgZmlsZSA9IGlucHV0LmdldEZpbGUoKTsKKyAgICAgICAgSUNvbnRhaW5lciBjb250YWluZXIgPSBmaWxlLmdldFBhcmVudCgpOworICAgICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7CiAKLQkJSUZpbGUgbWFuaWZlc3RGaWxlID0gbnVsbDsKLQkJSUZpbGUgcGFyRmlsZSA9IG51bGw7CisgICAgICAgIElGaWxlIG1hbmlmZXN0RmlsZSA9IG51bGw7CisgICAgICAgIElGaWxlIHBhckZpbGUgPSBudWxsOwogCi0JCVN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotCQlpZiAobmFtZS5lcXVhbHMoIm1hbmlmZXN0Lm1mIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQltYW5pZmVzdEZpbGUgPSBmaWxlOwotCQkJcGFyRmlsZSA9IEZhY2V0VXRpbHMuZ2V0UGFyRmlsZShwcm9qZWN0KTsKLQkJfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUucGFyLnhtbCIpKSB7Ci0JCQlwYXJGaWxlID0gZmlsZTsKLQkJCW1hbmlmZXN0RmlsZSA9IGNvbnRhaW5lci5nZXRQcm9qZWN0KCkuZ2V0RmlsZShuZXcgUGF0aCgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobWFuaWZlc3RGaWxlICE9IG51bGwgJiYgbWFuaWZlc3RGaWxlLmV4aXN0cygpKSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW4gPSBuZXcgRmlsZUVkaXRvcklucHV0KG1hbmlmZXN0RmlsZSk7Ci0JCQltYW5hZ2VyLnB1dENvbnRleHQoaW4sIG5ldyBTcHJpbmdCdW5kbGVJbnB1dENvbnRleHQodGhpcywgaW4sIGZpbGUgPT0gbWFuaWZlc3RGaWxlKSk7Ci0JCX0KLQkJaWYgKHBhckZpbGUgIT0gbnVsbCAmJiBwYXJGaWxlLmV4aXN0cygpKSB7Ci0JCQlwYXJJbnB1dCA9IG5ldyBGaWxlRWRpdG9ySW5wdXQocGFyRmlsZSk7Ci0JCX0KLQkJbWFuYWdlci5tb25pdG9yRmlsZShtYW5pZmVzdEZpbGUpOwotCQltYW5hZ2VyLm1vbml0b3JGaWxlKHBhckZpbGUpOworICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJtYW5pZmVzdC5tZiIpKSB7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBJRm9sZGVyKSB7CisgICAgICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLmdldFBhcmVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFuaWZlc3RGaWxlID0gZmlsZTsKKyAgICAgICAgICAgIHBhckZpbGUgPSBGYWNldFV0aWxzLmdldFBhckZpbGUocHJvamVjdCk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnBhci54bWwiKSkgeworICAgICAgICAgICAgcGFyRmlsZSA9IGZpbGU7CisgICAgICAgICAgICBtYW5pZmVzdEZpbGUgPSBjb250YWluZXIuZ2V0UHJvamVjdCgpLmdldEZpbGUobmV3IFBhdGgoIk1FVEEtSU5GL01BTklGRVNULk1GIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hbmlmZXN0RmlsZSAhPSBudWxsICYmIG1hbmlmZXN0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgSUVkaXRvcklucHV0IGluID0gbmV3IEZpbGVFZGl0b3JJbnB1dChtYW5pZmVzdEZpbGUpOworICAgICAgICAgICAgbWFuYWdlci5wdXRDb250ZXh0KGluLCBuZXcgU3ByaW5nQnVuZGxlSW5wdXRDb250ZXh0KHRoaXMsIGluLCBmaWxlID09IG1hbmlmZXN0RmlsZSkpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJGaWxlICE9IG51bGwgJiYgcGFyRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhpcy5wYXJJbnB1dCA9IG5ldyBGaWxlRWRpdG9ySW5wdXQocGFyRmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgbWFuYWdlci5tb25pdG9yRmlsZShtYW5pZmVzdEZpbGUpOworICAgICAgICBtYW5hZ2VyLm1vbml0b3JGaWxlKHBhckZpbGUpOwogCi0JCWZQcmVmcyA9IG5ldyBQcm9qZWN0U2NvcGUoY29udGFpbmVyLmdldFByb2plY3QoKSkuZ2V0Tm9kZShQREVDb3JlLlBMVUdJTl9JRCk7Ci0JCWlmIChmUHJlZnMgIT0gbnVsbCkgewotCQkJZlNob3dFeHRlbnNpb25zID0gZlByZWZzLmdldEJvb2xlYW4oSUNvcmVDb25zdGFudHMuRVhURU5TSU9OU19QUk9QRVJUWSwgdHJ1ZSk7Ci0JCQlmRXF1aW5veCA9IGZQcmVmcy5nZXRCb29sZWFuKElDb3JlQ29uc3RhbnRzLkVRVUlOT1hfUFJPUEVSVFksIHRydWUpOwotCQl9Ci0JfQorICAgICAgICB0aGlzLmZQcmVmcyA9IG5ldyBQcm9qZWN0U2NvcGUoY29udGFpbmVyLmdldFByb2plY3QoKSkuZ2V0Tm9kZShQREVDb3JlLlBMVUdJTl9JRCk7CisgICAgICAgIGlmICh0aGlzLmZQcmVmcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmZTaG93RXh0ZW5zaW9ucyA9IHRoaXMuZlByZWZzLmdldEJvb2xlYW4oSUNvcmVDb25zdGFudHMuRVhURU5TSU9OU19QUk9QRVJUWSwgdHJ1ZSk7CisgICAgICAgICAgICB0aGlzLmZFcXVpbm94ID0gdGhpcy5mUHJlZnMuZ2V0Qm9vbGVhbihJQ29yZUNvbnN0YW50cy5FUVVJTk9YX1BST1BFUlRZLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVN5c3RlbUZpbGVDb250ZXh0cyhJbnB1dENvbnRleHRNYW5hZ2VyIG1hbmFnZXIsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlGaWxlIGZpbGUgPSAoRmlsZSkgaW5wdXQuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBpbnB1dCBpbnN0YW5jZW9mIEZpbGVTdG9yZUVkaXRvcklucHV0KSB7Ci0JCQlmaWxlID0gbmV3IEZpbGUoKChJVVJJRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRVUkkoKSk7Ci0JCX0KLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUZpbGUgbWFuaWZlc3RGaWxlID0gbnVsbDsKLQkJRmlsZSBwYXJGaWxlID0gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSBmaWxlLmdldE5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0JCWlmIChuYW1lLmVxdWFscygibWFuaWZlc3QubWYiKSkgeyAvLyROT04tTkxTLTEkCi0JCQltYW5pZmVzdEZpbGUgPSBmaWxlOwotCQkJRmlsZSBkaXIgPSBmaWxlLmdldFBhcmVudEZpbGUoKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlwYXJGaWxlID0gbmV3IEZpbGUoZGlyLCAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnJ1bnRpbWUuY29yZS5wYXIueG1sIik7Ci0JCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUucGFyLnhtbCIpKSB7Ci0JCQlwYXJGaWxlID0gZmlsZTsKLQkJCUZpbGUgZGlyID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQltYW5pZmVzdEZpbGUgPSBuZXcgRmlsZShkaXIuZ2V0UGFyZW50RmlsZSgpLCAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAobWFuaWZlc3RGaWxlICE9IG51bGwgJiYgbWFuaWZlc3RGaWxlLmV4aXN0cygpKSB7Ci0JCQkJSUVkaXRvcklucHV0IGluID0gUGRlQ29tcGF0aWJpbGl0eVV0aWwuY3JlYXRlU3lzdGVtRmlsZUVkaXRvcklucHV0KG1hbmlmZXN0RmlsZSk7Ci0JCQkJaWYgKGluID09IG51bGwpIHsKLQkJCQkJLy8gRWNsaXBzZSAzLjUgb3IgbGF0ZXIKLQkJCQkJSUZpbGVTdG9yZSBzdG9yZSA9IEVGUy5nZXRTdG9yZShtYW5pZmVzdEZpbGUudG9VUkkoKSk7Ci0JCQkJCWluID0gbmV3IEZpbGVTdG9yZUVkaXRvcklucHV0KHN0b3JlKTsKLQkJCQl9Ci0JCQkJbWFuYWdlci5wdXRDb250ZXh0KGluLCBuZXcgU3ByaW5nQnVuZGxlSW5wdXRDb250ZXh0KHRoaXMsIGluLCBmaWxlID09IG1hbmlmZXN0RmlsZSkpOwotCQkJfQotCQkJaWYgKHBhckZpbGUgIT0gbnVsbCAmJiBwYXJGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcGFySW5wdXQgPSBQZGVDb21wYXRpYmlsaXR5VXRpbC5jcmVhdGVTeXN0ZW1GaWxlRWRpdG9ySW5wdXQocGFyRmlsZSk7Ci0JCQkJaWYgKHBhcklucHV0ID09IG51bGwpIHsKLQkJCQkJLy8gRWNsaXBzZSAzLjUgb3IgbGF0ZXIKLQkJCQkJSUZpbGVTdG9yZSBzdG9yZSA9IEVGUy5nZXRTdG9yZShwYXJGaWxlLnRvVVJJKCkpOwotCQkJCQlwYXJJbnB1dCA9IG5ldyBGaWxlU3RvcmVFZGl0b3JJbnB1dChzdG9yZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVBERVBsdWdpbi5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3lzdGVtRmlsZUNvbnRleHRzKElucHV0Q29udGV4dE1hbmFnZXIgbWFuYWdlciwgSUVkaXRvcklucHV0IGlucHV0KSB7CisgICAgICAgIEZpbGUgZmlsZSA9IGlucHV0LmdldEFkYXB0ZXIoRmlsZS5jbGFzcyk7CisgICAgICAgIGlmIChmaWxlID09IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBGaWxlU3RvcmVFZGl0b3JJbnB1dCkgeworICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCgoSVVSSUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0VVJJKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IG51bGw7CisgICAgICAgIEZpbGUgcGFyRmlsZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOworICAgICAgICBpZiAobmFtZS5lcXVhbHMoIm1hbmlmZXN0Lm1mIikpIHsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgbWFuaWZlc3RGaWxlID0gZmlsZTsKKyAgICAgICAgICAgIEZpbGUgZGlyID0gZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgcGFyRmlsZSA9IG5ldyBGaWxlKGRpciwgIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUucGFyLnhtbCIpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJvcmcuZWNsaXBzZS52aXJnby5pZGUucnVudGltZS5jb3JlLnBhci54bWwiKSkgeworICAgICAgICAgICAgcGFyRmlsZSA9IGZpbGU7CisgICAgICAgICAgICBGaWxlIGRpciA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgbWFuaWZlc3RGaWxlID0gbmV3IEZpbGUoZGlyLmdldFBhcmVudEZpbGUoKSwgIk1FVEEtSU5GL01BTklGRVNULk1GIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1hbmlmZXN0RmlsZSAhPSBudWxsICYmIG1hbmlmZXN0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIElFZGl0b3JJbnB1dCBpbiA9IFBkZUNvbXBhdGliaWxpdHlVdGlsLmNyZWF0ZVN5c3RlbUZpbGVFZGl0b3JJbnB1dChtYW5pZmVzdEZpbGUpOworICAgICAgICAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEVjbGlwc2UgMy41IG9yIGxhdGVyCisgICAgICAgICAgICAgICAgICAgIElGaWxlU3RvcmUgc3RvcmUgPSBFRlMuZ2V0U3RvcmUobWFuaWZlc3RGaWxlLnRvVVJJKCkpOworICAgICAgICAgICAgICAgICAgICBpbiA9IG5ldyBGaWxlU3RvcmVFZGl0b3JJbnB1dChzdG9yZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hbmFnZXIucHV0Q29udGV4dChpbiwgbmV3IFNwcmluZ0J1bmRsZUlucHV0Q29udGV4dCh0aGlzLCBpbiwgZmlsZSA9PSBtYW5pZmVzdEZpbGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJGaWxlICE9IG51bGwgJiYgcGFyRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHRoaXMucGFySW5wdXQgPSBQZGVDb21wYXRpYmlsaXR5VXRpbC5jcmVhdGVTeXN0ZW1GaWxlRWRpdG9ySW5wdXQocGFyRmlsZSk7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMucGFySW5wdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBFY2xpcHNlIDMuNSBvciBsYXRlcgorICAgICAgICAgICAgICAgICAgICBJRmlsZVN0b3JlIHN0b3JlID0gRUZTLmdldFN0b3JlKHBhckZpbGUudG9VUkkoKSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMucGFySW5wdXQgPSBuZXcgRmlsZVN0b3JlRWRpdG9ySW5wdXQoc3RvcmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBQREVQbHVnaW4ubG9nRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVkaXRpbmdEb21haW4oKSB7Ci0JCS8vIENyZWF0ZSBhbiBhZGFwdGVyIGZhY3RvcnkgdGhhdCB5aWVsZHMgaXRlbSBwcm92aWRlcnMuCi0JCS8vCi0JCWFkYXB0ZXJGYWN0b3J5ID0gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5EZXNjcmlwdG9yLlJlZ2lzdHJ5LklOU1RBTkNFKTsKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdGluZ0RvbWFpbigpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IHlpZWxkcyBpdGVtIHByb3ZpZGVycy4KKyAgICAgICAgLy8KKyAgICAgICAgdGhpcy5hZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkuRGVzY3JpcHRvci5SZWdpc3RyeS5JTlNUQU5DRSk7CiAKLQkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWFkYXB0ZXJGYWN0b3J5LmFkZEFkYXB0ZXJGYWN0b3J5KG5ldyBQYXJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKyAgICAgICAgdGhpcy5hZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKKyAgICAgICAgdGhpcy5hZGFwdGVyRmFjdG9yeS5hZGRBZGFwdGVyRmFjdG9yeShuZXcgUGFySXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7CisgICAgICAgIHRoaXMuYWRhcHRlckZhY3RvcnkuYWRkQWRhcHRlckZhY3RvcnkobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKIAotCQkvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUKLQkJLy8gZXhlY3V0ZWQuCi0JCS8vCi0JCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOworICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbW1hbmQgc3RhY2sgdGhhdCB3aWxsIG5vdGlmeSB0aGlzIGVkaXRvciBhcyBjb21tYW5kcyBhcmUKKyAgICAgICAgLy8gZXhlY3V0ZWQuCisgICAgICAgIC8vCisgICAgICAgIEJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwogCi0JCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8KLQkJLy8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCi0JCS8vCi0JCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQkJZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKKyAgICAgICAgLy8gQWRkIGEgbGlzdGVuZXIgdG8gc2V0IHRoZSBtb3N0IHJlY2VudCBjb21tYW5kJ3MgYWZmZWN0ZWQgb2JqZWN0cyB0bworICAgICAgICAvLyBiZSB0aGUgc2VsZWN0aW9uIG9mIHRoZSB2aWV3ZXIgd2l0aCBmb2N1cy4KKyAgICAgICAgLy8KKyAgICAgICAgY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKIAotCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KLQkJCQkJCS8vCi0JCQkJCQlDb21tYW5kIG1vc3RSZWNlbnRDb21tYW5kID0gKChDb21tYW5kU3RhY2spIGV2ZW50LmdldFNvdXJjZSgpKS5nZXRNb3N0UmVjZW50Q29tbWFuZCgpOwotCQkJCQkJaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CiAKLQkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgotCQkvLwotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgQm9vbGVhbj4oKSk7Ci0JfQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7CiAKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJZmluYWwgQ29sbGVjdGlvbjw/PiB0aGVTZWxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCQkvLyBNYWtlIHN1cmUgaXQncyBva2F5LgotCQkvLwotCQlpZiAodGhlU2VsZWN0aW9uICE9IG51bGwgJiYgIXRoZVNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCS8vIEkgZG9uJ3Qga25vdyBpZiB0aGlzIHNob3VsZCBiZSBydW4gdGhpcyBkZWZlcnJlZAotCQkJLy8gYmVjYXVzZSB3ZSBtaWdodCBoYXZlIHRvIGdpdmUgdGhlIGVkaXRvciBhIGNoYW5jZSB0byBwcm9jZXNzIHRoZQotCQkJLy8gdmlld2VyIHVwZGF0ZSBldmVudHMKLQkJCS8vIGFuZCBoZW5jZSB0byB1cGRhdGUgdGhlIHZpZXdzIGZpcnN0LgotCQkJLy8KLQkJCS8vCi0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IGNvbnRlbnQgdmlld2VyCi0JCQkJCS8vIG9mIHRoZSBlZGl0b3IuCi0JCQkJCS8vCi0JCQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKLQkJCQkJCWN1cnJlbnRWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoZVNlbGVjdGlvbi50b0FycmF5KCkpLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJfQotCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byBzZWxlY3QgdGhlIGFmZmVjdGVkIG9iamVjdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCBtb3N0UmVjZW50Q29tbWFuZCA9ICgoQ29tbWFuZFN0YWNrKSBldmVudC5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0aW9uVG9WaWV3ZXIobW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogCi0JcHVibGljIHZvaWQgY3JlYXRlTW9kZWwoKSB7Ci0JCVVSSSByZXNvdXJjZVVSSSA9IEVkaXRVSVV0aWwuZ2V0VVJJKHBhcklucHV0KTsKLQkJdHJ5IHsKLQkJCS8vIExvYWQgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGVkaXRpbmcgZG9tYWluLgotCQkJLy8KLQkJCXBhclJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVNlcnZlcklkZVVpUGx1Z2luLmdldERlZmF1bHQoKS5sb2coZSk7Ci0JCQlwYXJSZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgZmFsc2UpOwotCQl9CisgICAgICAgIC8vIENyZWF0ZSB0aGUgZWRpdGluZyBkb21haW4gd2l0aCBhIHNwZWNpYWwgY29tbWFuZCBzdGFjay4KKyAgICAgICAgLy8KKyAgICAgICAgdGhpcy5lZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbih0aGlzLmFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2ssIG5ldyBIYXNoTWFwPFJlc291cmNlLCBCb29sZWFuPigpKTsKKyAgICB9CiAKLQkJcGFyID0gKFBhcikgcGFyUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQl9CisgICAgcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248Pz4gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsKKyAgICAgICAgLy8gTWFrZSBzdXJlIGl0J3Mgb2theS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBJIGRvbid0IGtub3cgaWYgdGhpcyBzaG91bGQgYmUgcnVuIHRoaXMgZGVmZXJyZWQKKyAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSB0byBnaXZlIHRoZSBlZGl0b3IgYSBjaGFuY2UgdG8gcHJvY2VzcyB0aGUKKyAgICAgICAgICAgIC8vIHZpZXdlciB1cGRhdGUgZXZlbnRzCisgICAgICAgICAgICAvLyBhbmQgaGVuY2UgdG8gdXBkYXRlIHRoZSB2aWV3cyBmaXJzdC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLworICAgICAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CiAKLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJQYWdlcygpIHsKLQkJY3JlYXRlTW9kZWwoKTsKLQkJYWRkUGFyUGFnZXMoKTsKLQl9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlcgorICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgZWRpdG9yLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBpZiAoUGFyTWFuaWZlc3RFZGl0b3IudGhpcy5jdXJyZW50Vmlld2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhck1hbmlmZXN0RWRpdG9yLnRoaXMuY3VycmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhlU2VsZWN0aW9uLnRvQXJyYXkoKSksIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bigpOworICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyUGFnZXMoKSB7Ci0JCXRyeSB7Ci0JCQlhZGRQYWdlKG5ldyBQYXJYbWxFZGl0b3JQYWdlKHRoaXMsICJvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yLnBhci5kZXBlbmRlbmNpZXMiLCAiRGVwZW5kZW5jaWVzIikpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlTZXJ2ZXJJZGVVaVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGUpOwotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZU1vZGVsKCkgeworICAgICAgICBVUkkgcmVzb3VyY2VVUkkgPSBFZGl0VUlVdGlsLmdldFVSSSh0aGlzLnBhcklucHV0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIExvYWQgdGhlIHJlc291cmNlIHRocm91Z2ggdGhlIGVkaXRpbmcgZG9tYWluLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHRoaXMucGFyUmVzb3VyY2UgPSB0aGlzLmVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVVSSSwgdHJ1ZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTZXJ2ZXJJZGVVaVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGUpOworICAgICAgICAgICAgdGhpcy5wYXJSZXNvdXJjZSA9IHRoaXMuZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKHJlc291cmNlVVJJLCBmYWxzZSk7CisgICAgICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQkvLyBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBjaGFuZ2VkLgotCQkvLwotCQlmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7Ci0JCXNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsIFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKKyAgICAgICAgdGhpcy5wYXIgPSAoUGFyKSB0aGlzLnBhclJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgfQogCi0JCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nCi0JCS8vIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KLQkJLy8KLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQkvLyBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBnZXRzIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHJ1bnMuCi0JCQkvLwotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCS8vIFNhdmUgdGhlIHJlc291cmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0uCi0JCQkJLy8KLQkJCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKSB7Ci0JCQkJCWlmICgoZmlyc3QgfHwgIXJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpIHx8IGlzUGVyc2lzdGVkKHJlc291cmNlKSkKLQkJCQkJCQkmJiAhZWRpdGluZ0RvbWFpbi5pc1JlYWRPbmx5KHJlc291cmNlKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCXJlc291cmNlLnNhdmUoc2F2ZU9wdGlvbnMpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQkJaGFuZGxlRXJyb3IoZXhjZXB0aW9uKTsKLQkJCQkJCX0KLQkJCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07CisgICAgcHVibGljIHZvaWQgY3JlYXRlUGFyUGFnZXMoKSB7CisgICAgICAgIGNyZWF0ZU1vZGVsKCk7CisgICAgICAgIGFkZFBhclBhZ2VzKCk7CisgICAgfQogCi0JCXRyeSB7Ci0JCQkvLyBUaGlzIHJ1bnMgdGhlIG9wdGlvbnMsIGFuZCBzaG93cyBwcm9ncmVzcy4KLQkJCS8vCi0JCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7CisgICAgcHJvdGVjdGVkIHZvaWQgYWRkUGFyUGFnZXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhZGRQYWdlKG5ldyBQYXJYbWxFZGl0b3JQYWdlKHRoaXMsICJvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yLnBhci5kZXBlbmRlbmNpZXMiLCAiRGVwZW5kZW5jaWVzIikpOworICAgICAgICB9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTZXJ2ZXJJZGVVaVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGUpOworICAgICAgICB9CisgICAgfQogCi0JCQkvLyBSZWZyZXNoIHRoZSBuZWNlc3Nhcnkgc3RhdGUuCi0JCQkvLwotCQkJKChCYXNpY0NvbW1hbmRTdGFjaykgZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuc2F2ZUlzRG9uZSgpOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4KLQkJCS8vCi0JCQlTZXJ2ZXJJZGVVaVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJc3VwZXIuZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgeworICAgICAgICAvLyBTYXZlIG9ubHkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBhY3R1YWxseSBjaGFuZ2VkLgorICAgICAgICAvLworICAgICAgICBmaW5hbCBNYXA8T2JqZWN0LCBPYmplY3Q+IHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CisgICAgICAgIHNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsIFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKIAotCXByb3RlY3RlZCBib29sZWFuIGlzUGVyc2lzdGVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0ocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gSWdub3JlCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgICAgIC8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nCisgICAgICAgIC8vIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KKyAgICAgICAgLy8KKyAgICAgICAgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7CiAKLQlwcml2YXRlIHZvaWQgaGFuZGxlRXJyb3IoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG1ldGhvZCB0aGF0IGdldHMgaW52b2tlZCB3aGVuIHRoZSBvcGVyYXRpb24gcnVucy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgcmVzb3VyY2VzIHRvIHRoZSBmaWxlIHN5c3RlbS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBQYXJNYW5pZmVzdEVkaXRvci50aGlzLmVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGZpcnN0IHx8ICFyZXNvdXJjZS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSB8fCBpc1BlcnNpc3RlZChyZXNvdXJjZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhUGFyTWFuaWZlc3RFZGl0b3IudGhpcy5lZGl0aW5nRG9tYWluLmlzUmVhZE9ubHkocmVzb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhck1hbmlmZXN0RWRpdG9yLnRoaXMuc2F2ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OwogCi0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSkucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JCVNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJc2F2ZUFzRGlhbG9nLm9wZW4oKTsKLQkJSVBhdGggcGF0aCA9IHNhdmVBc0RpYWxvZy5nZXRSZXN1bHQoKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOwotCQkJfQotCQl9Ci0JCXN1cGVyLmRvU2F2ZUFzKCk7Ci0JfQorICAgICAgICAgICAgLy8gUmVmcmVzaCB0aGUgbmVjZXNzYXJ5IHN0YXRlLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICgoQmFzaWNDb21tYW5kU3RhY2spIHRoaXMuZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuc2F2ZUlzRG9uZSgpOworICAgICAgICAgICAgZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZyB0aGF0IHNob3VsZG4ndC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBTZXJ2ZXJJZGVVaVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7CisgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlQXMoVVJJIHVyaSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7Ci0JCShlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5zZXRVUkkodXJpKTsKLQkJc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKLQkJc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKLQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkvLyBnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSAhPSBudWxsID8gZ2V0QWN0aW9uQmFycygpCi0JCS8vIC5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpIDogbmV3Ci0JCS8vIE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7Ci0JfQorICAgIHByb3RlY3RlZCBib29sZWFuIGlzUGVyc2lzdGVkKFJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSB0aGlzLmVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShyZXNvdXJjZS5nZXRVUkkoKSk7CisgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWlmIChlZGl0aW5nRG9tYWluICE9IG51bGwgJiYgZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGRpcnR5ID0gKChCYXNpY0NvbW1hbmRTdGFjaykgZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSkuaXNTYXZlTmVlZGVkKCk7Ci0JCQlyZXR1cm4gZGlydHkgfHwgc3VwZXIuaXNEaXJ0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc0RpcnR5KCk7Ci0JfQorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVFcnJvcihJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7CisgICAgICAgIFNhdmVBc0RpYWxvZyBzYXZlQXNEaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKKyAgICAgICAgc2F2ZUFzRGlhbG9nLm9wZW4oKTsKKyAgICAgICAgSVBhdGggcGF0aCA9IHNhdmVBc0RpYWxvZy5nZXRSZXN1bHQoKTsKKyAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKKyAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkb1NhdmVBcyhVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSksIG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN1cGVyLmRvU2F2ZUFzKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZG9TYXZlQXMoVVJJIHVyaSwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7CisgICAgICAgIHRoaXMuZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLmdldCgwKS5zZXRVUkkodXJpKTsKKyAgICAgICAgc2V0SW5wdXRXaXRoTm90aWZ5KGVkaXRvcklucHV0KTsKKyAgICAgICAgc2V0UGFydE5hbWUoZWRpdG9ySW5wdXQuZ2V0TmFtZSgpKTsKKyAgICAgICAgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworICAgICAgICAvLyBnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSAhPSBudWxsID8gZ2V0QWN0aW9uQmFycygpCisgICAgICAgIC8vIC5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpIDogbmV3CisgICAgICAgIC8vIE51bGxQcm9ncmVzc01vbml0b3IoKTsKKyAgICAgICAgZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKKyAgICAgICAgaWYgKHRoaXMuZWRpdGluZ0RvbWFpbiAhPSBudWxsICYmIHRoaXMuZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSAhPSBudWxsKSB7CisgICAgICAgICAgICBib29sZWFuIGRpcnR5ID0gKChCYXNpY0NvbW1hbmRTdGFjaykgdGhpcy5lZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpKS5pc1NhdmVOZWVkZWQoKTsKKyAgICAgICAgICAgIHJldHVybiBkaXJ0eSB8fCBzdXBlci5pc0RpcnR5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmlzRGlydHkoKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGFyT3ZlcnZpZXdQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL1Bhck92ZXJ2aWV3UGFnZS5qYXZhCmluZGV4IGIzMTllNmUuLmNkOWIzN2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGFyT3ZlcnZpZXdQYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QYXJPdmVydmlld1BhZ2UuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKQEAgLTQyLDEyNiArNDMsMTI2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQYXJPdmVydmlld1BhZ2UgZXh0ZW5kcyBQREVGb3JtUGFnZSBpbXBsZW1lbnRzIElIeXBlcmxpbmtMaXN0ZW5lciB7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0lEID0gInBhcl9vdmVydmlldyI7IC8vJE5PTi1OTFMtMSQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX0lEID0gInBhcl9vdmVydmlldyI7IC8vJE5PTi1OTFMtMSQKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfQ09OVEVOVF9TRUNUSU9OX1RFWFQgPSAiPGZvcm0+PHA+VGhlIGNvbnRlbnQgb2YgdGhlIFBBUiBpcyBtYWRlIHVwIG9mIG9uZSBzZWN0aW9uOjwvcD48bGkgc3R5bGU9XCJpbWFnZVwiIHZhbHVlPVwicGFnZVwiIGJpbmRlbnQ9XCI1XCI+PGEgaHJlZj1cImRlcGVuZGVuY2llc1wiPkRlcGVuZGVuY2llczwvYT46IGxpc3RzIGFsbCB0aGUgYnVuZGxlcyByZXF1aXJlZCBieSB0aGlzIFBBUiB0byBjb21waWxlIGFuZCBydW4uPC9saT48L2Zvcm0+IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX0NPTlRFTlRfU0VDVElPTl9URVhUID0gIjxmb3JtPjxwPlRoZSBjb250ZW50IG9mIHRoZSBQQVIgaXMgbWFkZSB1cCBvZiBvbmUgc2VjdGlvbjo8L3A+PGxpIHN0eWxlPVwiaW1hZ2VcIiB2YWx1ZT1cInBhZ2VcIiBiaW5kZW50PVwiNVwiPjxhIGhyZWY9XCJkZXBlbmRlbmNpZXNcIj5EZXBlbmRlbmNpZXM8L2E+OiBsaXN0cyBhbGwgdGhlIGJ1bmRsZXMgcmVxdWlyZWQgYnkgdGhpcyBQQVIgdG8gY29tcGlsZSBhbmQgcnVuLjwvbGk+PC9mb3JtPiI7CiAKLQlwcml2YXRlIFBhckdlbmVyYWxJbmZvU2VjdGlvbiBmSW5mb1NlY3Rpb247CisgICAgcHJpdmF0ZSBQYXJHZW5lcmFsSW5mb1NlY3Rpb24gZkluZm9TZWN0aW9uOwogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBBUl9BQ1RJT05fU0VDVElPTl9URVhUID0gIjxmb3JtPjxwPlBlcmZvcm0gY29tbW9uIGFjdGlvbnMgb24gdGhlIFBBUjo8L3A+IgotCQkJKyAiPGxpIHN0eWxlPVwiaW1hZ2VcIiB2YWx1ZT1cImV4cG9ydFwiIGJpbmRlbnQ9XCI1XCI+PGEgaHJlZj1cImV4cG9ydHBhclwiPkV4cG9ydCBQQVI8L2E+OiBleHBvcnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBQQVIgdG8gYSBkZXBsb3lhYmxlIEpBUi48L2xpPiIKLQkJCSsgIjwvZm9ybT4iOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBQQVJfQUNUSU9OX1NFQ1RJT05fVEVYVCA9ICI8Zm9ybT48cD5QZXJmb3JtIGNvbW1vbiBhY3Rpb25zIG9uIHRoZSBQQVI6PC9wPiIKKyAgICAgICAgKyAiPGxpIHN0eWxlPVwiaW1hZ2VcIiB2YWx1ZT1cImV4cG9ydFwiIGJpbmRlbnQ9XCI1XCI+PGEgaHJlZj1cImV4cG9ydHBhclwiPkV4cG9ydCBQQVI8L2E+OiBleHBvcnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBQQVIgdG8gYSBkZXBsb3lhYmxlIEpBUi48L2xpPiIKKyAgICAgICAgKyAiPC9mb3JtPiI7CiAKLQlwdWJsaWMgUGFyT3ZlcnZpZXdQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgUEFHRV9JRCwgIk92ZXJ2aWV3Iik7Ci0JfQorICAgIHB1YmxpYyBQYXJPdmVydmlld1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKKyAgICAgICAgc3VwZXIoZWRpdG9yLCBQQUdFX0lELCAiT3ZlcnZpZXciKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCQlTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5zZXRJbWFnZShTZXJ2ZXJJZGVVaVBsdWdpbi5nZXRJbWFnZSgiZnVsbC9vYmoxNi9wYXJfb2JqLmdpZiIpKTsKLQkJZm9ybS5zZXRUZXh0KFBERVVJTWVzc2FnZXMuTWFuaWZlc3RFZGl0b3JfT3ZlcnZpZXdQYWdlX3RpdGxlKTsKLQkJZmlsbEJvZHkobWFuYWdlZEZvcm0sIHRvb2xraXQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKKyAgICAgICAgc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOworICAgICAgICBTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKKyAgICAgICAgRm9ybVRvb2xraXQgdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKKyAgICAgICAgZm9ybS5zZXRJbWFnZShTZXJ2ZXJJZGVVaVBsdWdpbi5nZXRJbWFnZSgiZnVsbC9vYmoxNi9wYXJfb2JqLmdpZiIpKTsKKyAgICAgICAgZm9ybS5zZXRUZXh0KFBERVVJTWVzc2FnZXMuTWFuaWZlc3RFZGl0b3JfT3ZlcnZpZXdQYWdlX3RpdGxlKTsKKyAgICAgICAgZmlsbEJvZHkobWFuYWdlZEZvcm0sIHRvb2xraXQpOworICAgIH0KIAotCXByaXZhdGUgdm9pZCBmaWxsQm9keShJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0sIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJQ29tcG9zaXRlIGJvZHkgPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCkuZ2V0Qm9keSgpOwotCQlib2R5LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVGb3JtVGFibGVXcmFwTGF5b3V0KHRydWUsIDIpKTsKKyAgICBwcml2YXRlIHZvaWQgZmlsbEJvZHkoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7CisgICAgICAgIENvbXBvc2l0ZSBib2R5ID0gbWFuYWdlZEZvcm0uZ2V0Rm9ybSgpLmdldEJvZHkoKTsKKyAgICAgICAgYm9keS5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlRm9ybVRhYmxlV3JhcExheW91dCh0cnVlLCAyKSk7CiAKLQkJQ29tcG9zaXRlIGxlZnQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShib2R5KTsKLQkJbGVmdC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlRm9ybVBhbmVUYWJsZVdyYXBMYXlvdXQoZmFsc2UsIDEpKTsKLQkJbGVmdC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCWZJbmZvU2VjdGlvbiA9IG5ldyBQYXJHZW5lcmFsSW5mb1NlY3Rpb24odGhpcywgbGVmdCk7Ci0JCW1hbmFnZWRGb3JtLmFkZFBhcnQoZkluZm9TZWN0aW9uKTsKKyAgICAgICAgQ29tcG9zaXRlIGxlZnQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShib2R5KTsKKyAgICAgICAgbGVmdC5zZXRMYXlvdXQoRm9ybUxheW91dEZhY3RvcnkuY3JlYXRlRm9ybVBhbmVUYWJsZVdyYXBMYXlvdXQoZmFsc2UsIDEpKTsKKyAgICAgICAgbGVmdC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7CisgICAgICAgIHRoaXMuZkluZm9TZWN0aW9uID0gbmV3IFBhckdlbmVyYWxJbmZvU2VjdGlvbih0aGlzLCBsZWZ0KTsKKyAgICAgICAgbWFuYWdlZEZvcm0uYWRkUGFydCh0aGlzLmZJbmZvU2VjdGlvbik7CiAKLQkJQ29tcG9zaXRlIHJpZ2h0ID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoYm9keSk7Ci0JCXJpZ2h0LnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVGb3JtUGFuZVRhYmxlV3JhcExheW91dChmYWxzZSwgMSkpOwotCQlyaWdodC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTCkpOwotCQljcmVhdGVQYXJBY3Rpb25TZWN0aW9uKG1hbmFnZWRGb3JtLCByaWdodCwgdG9vbGtpdCk7Ci0JCWNyZWF0ZVBhckNvbnRlbnRTZWN0aW9uKG1hbmFnZWRGb3JtLCByaWdodCwgdG9vbGtpdCk7Ci0JfQorICAgICAgICBDb21wb3NpdGUgcmlnaHQgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShib2R5KTsKKyAgICAgICAgcmlnaHQuc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZUZvcm1QYW5lVGFibGVXcmFwTGF5b3V0KGZhbHNlLCAxKSk7CisgICAgICAgIHJpZ2h0LnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMKSk7CisgICAgICAgIGNyZWF0ZVBhckFjdGlvblNlY3Rpb24obWFuYWdlZEZvcm0sIHJpZ2h0LCB0b29sa2l0KTsKKyAgICAgICAgY3JlYXRlUGFyQ29udGVudFNlY3Rpb24obWFuYWdlZEZvcm0sIHJpZ2h0LCB0b29sa2l0KTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgY3JlYXRlUGFyQ29udGVudFNlY3Rpb24oSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtLCBDb21wb3NpdGUgcGFyZW50LCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCVN0cmluZyBzZWN0aW9uVGl0bGU7Ci0JCXNlY3Rpb25UaXRsZSA9ICJQQVIgQ29udGVudCI7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IGNyZWF0ZVN0YXRpY1NlY3Rpb24odG9vbGtpdCwgcGFyZW50LCBzZWN0aW9uVGl0bGUpOworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVQYXJDb250ZW50U2VjdGlvbihJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0sIENvbXBvc2l0ZSBwYXJlbnQsIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKKyAgICAgICAgU3RyaW5nIHNlY3Rpb25UaXRsZTsKKyAgICAgICAgc2VjdGlvblRpdGxlID0gIlBBUiBDb250ZW50IjsKKyAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gY3JlYXRlU3RhdGljU2VjdGlvbih0b29sa2l0LCBwYXJlbnQsIHNlY3Rpb25UaXRsZSk7CiAKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGNyZWF0ZVN0YXRpY1NlY3Rpb25DbGllbnQodG9vbGtpdCwgc2VjdGlvbik7CisgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIgPSBjcmVhdGVTdGF0aWNTZWN0aW9uQ2xpZW50KHRvb2xraXQsIHNlY3Rpb24pOwogCi0JCUZvcm1UZXh0IHRleHQgPSBjcmVhdGVDbGllbnQoY29udGFpbmVyLCBCVU5ETEVfQ09OVEVOVF9TRUNUSU9OX1RFWFQsIHRydWUsIHRvb2xraXQpOwotCQlQREVMYWJlbFByb3ZpZGVyIGxwID0gUERFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCXRleHQuc2V0SW1hZ2UoInBhZ2UiLCBscC5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfUEFHRV9PQkosIFNoYXJlZExhYmVsUHJvdmlkZXIuRl9FRElUKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dC5hZGRIeXBlcmxpbmtMaXN0ZW5lcih0aGlzKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29udGFpbmVyKTsKLQl9CisgICAgICAgIEZvcm1UZXh0IHRleHQgPSBjcmVhdGVDbGllbnQoY29udGFpbmVyLCBCVU5ETEVfQ09OVEVOVF9TRUNUSU9OX1RFWFQsIHRydWUsIHRvb2xraXQpOworICAgICAgICBQREVMYWJlbFByb3ZpZGVyIGxwID0gUERFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7CisgICAgICAgIHRleHQuc2V0SW1hZ2UoInBhZ2UiLCBscC5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfUEFHRV9PQkosIFNoYXJlZExhYmVsUHJvdmlkZXIuRl9FRElUKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgdGV4dC5hZGRIeXBlcmxpbmtMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgc2VjdGlvbi5zZXRDbGllbnQoY29udGFpbmVyKTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgY3JlYXRlUGFyQWN0aW9uU2VjdGlvbihJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0sIENvbXBvc2l0ZSBwYXJlbnQsIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJU3RyaW5nIHNlY3Rpb25UaXRsZSA9ICJQQVIgQWN0aW9ucyI7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IGNyZWF0ZVN0YXRpY1NlY3Rpb24odG9vbGtpdCwgcGFyZW50LCBzZWN0aW9uVGl0bGUpOworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVQYXJBY3Rpb25TZWN0aW9uKElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSwgQ29tcG9zaXRlIHBhcmVudCwgRm9ybVRvb2xraXQgdG9vbGtpdCkgeworICAgICAgICBTdHJpbmcgc2VjdGlvblRpdGxlID0gIlBBUiBBY3Rpb25zIjsKKyAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gY3JlYXRlU3RhdGljU2VjdGlvbih0b29sa2l0LCBwYXJlbnQsIHNlY3Rpb25UaXRsZSk7CiAKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGNyZWF0ZVN0YXRpY1NlY3Rpb25DbGllbnQodG9vbGtpdCwgc2VjdGlvbik7CisgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIgPSBjcmVhdGVTdGF0aWNTZWN0aW9uQ2xpZW50KHRvb2xraXQsIHNlY3Rpb24pOwogCi0JCUZvcm1UZXh0IHRleHQgPSBjcmVhdGVDbGllbnQoY29udGFpbmVyLCBQQVJfQUNUSU9OX1NFQ1RJT05fVEVYVCwgdHJ1ZSwgdG9vbGtpdCk7Ci0JCS8vVE9ETyBSZXBsYWNlIHRoZXNlIHdpdGggYXBwcm9wcmlhdGUgaW1hZ2VzIGFzIG5lZWRlZC4gTVRQCi0vLwkJdGV4dC5zZXRJbWFnZSgiZXhwb3J0IiwgQmVhbnNHcmFwaEltYWdlcy5nZXRJbWFnZShCZWFuc0dyYXBoSW1hZ2VzLklNR19PQkpTX0VYUE9SVF9FTkFCTEVEKSk7Ci0JCXRleHQuYWRkSHlwZXJsaW5rTGlzdGVuZXIodGhpcyk7CisgICAgICAgIEZvcm1UZXh0IHRleHQgPSBjcmVhdGVDbGllbnQoY29udGFpbmVyLCBQQVJfQUNUSU9OX1NFQ1RJT05fVEVYVCwgdHJ1ZSwgdG9vbGtpdCk7CisgICAgICAgIC8vIFRPRE8gUmVwbGFjZSB0aGVzZSB3aXRoIGFwcHJvcHJpYXRlIGltYWdlcyBhcyBuZWVkZWQuIE1UUAorICAgICAgICAvLyB0ZXh0LnNldEltYWdlKCJleHBvcnQiLCBCZWFuc0dyYXBoSW1hZ2VzLmdldEltYWdlKEJlYW5zR3JhcGhJbWFnZXMuSU1HX09CSlNfRVhQT1JUX0VOQUJMRUQpKTsKKyAgICAgICAgdGV4dC5hZGRIeXBlcmxpbmtMaXN0ZW5lcih0aGlzKTsKIAotCQlzZWN0aW9uLnNldENsaWVudChjb250YWluZXIpOwotCX0KKyAgICAgICAgc2VjdGlvbi5zZXRDbGllbnQoY29udGFpbmVyKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgZmluYWwgU2VjdGlvbiBjcmVhdGVTdGF0aWNTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSKTsKLQkJc2VjdGlvbi5jbGllbnRWZXJ0aWNhbFNwYWNpbmcgPSBGb3JtTGF5b3V0RmFjdG9yeS5TRUNUSU9OX0hFQURFUl9WRVJUSUNBTF9TUEFDSU5HOwotCQlzZWN0aW9uLnNldFRleHQodGV4dCk7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZUNsZWFyVGFibGVXcmFwTGF5b3V0KGZhbHNlLCAxKSk7Ci0JCVRhYmxlV3JhcERhdGEgZGF0YSA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9CisgICAgcHJvdGVjdGVkIGZpbmFsIFNlY3Rpb24gY3JlYXRlU3RhdGljU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgeworICAgICAgICBTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUik7CisgICAgICAgIHNlY3Rpb24uY2xpZW50VmVydGljYWxTcGFjaW5nID0gRm9ybUxheW91dEZhY3RvcnkuU0VDVElPTl9IRUFERVJfVkVSVElDQUxfU1BBQ0lORzsKKyAgICAgICAgc2VjdGlvbi5zZXRUZXh0KHRleHQpOworICAgICAgICBzZWN0aW9uLnNldExheW91dChGb3JtTGF5b3V0RmFjdG9yeS5jcmVhdGVDbGVhclRhYmxlV3JhcExheW91dChmYWxzZSwgMSkpOworICAgICAgICBUYWJsZVdyYXBEYXRhIGRhdGEgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7CisgICAgICAgIHNlY3Rpb24uc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgcmV0dXJuIHNlY3Rpb247CisgICAgfQogCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVTdGF0aWNTZWN0aW9uQ2xpZW50KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZVNlY3Rpb25DbGllbnRUYWJsZVdyYXBMYXlvdXQoZmFsc2UsIDEpKTsKLQkJVGFibGVXcmFwRGF0YSBkYXRhID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9CisgICAgcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVTdGF0aWNTZWN0aW9uQ2xpZW50KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0KEZvcm1MYXlvdXRGYWN0b3J5LmNyZWF0ZVNlY3Rpb25DbGllbnRUYWJsZVdyYXBMYXlvdXQoZmFsc2UsIDEpKTsKKyAgICAgICAgVGFibGVXcmFwRGF0YSBkYXRhID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOworICAgICAgICBjb250YWluZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgZmluYWwgRm9ybVRleHQgY3JlYXRlQ2xpZW50KENvbXBvc2l0ZSBzZWN0aW9uLCBTdHJpbmcgY29udGVudCwgYm9vbGVhbiBwYXJzZVRhZ3MsIEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJRm9ybVRleHQgdGV4dCA9IHRvb2xraXQuY3JlYXRlRm9ybVRleHQoc2VjdGlvbiwgdHJ1ZSk7Ci0JCXRyeSB7Ci0JCQl0ZXh0LnNldFRleHQoY29udGVudCwgcGFyc2VUYWdzLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBlKSB7Ci0JCQl0ZXh0LnNldFRleHQoZS5nZXRNZXNzYWdlKCksIGZhbHNlLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQorICAgIHByb3RlY3RlZCBmaW5hbCBGb3JtVGV4dCBjcmVhdGVDbGllbnQoQ29tcG9zaXRlIHNlY3Rpb24sIFN0cmluZyBjb250ZW50LCBib29sZWFuIHBhcnNlVGFncywgRm9ybVRvb2xraXQgdG9vbGtpdCkgeworICAgICAgICBGb3JtVGV4dCB0ZXh0ID0gdG9vbGtpdC5jcmVhdGVGb3JtVGV4dChzZWN0aW9uLCB0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRleHQuc2V0VGV4dChjb250ZW50LCBwYXJzZVRhZ3MsIGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRleHQuc2V0VGV4dChlLmdldE1lc3NhZ2UoKSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJaWYgKGUuZ2V0SHJlZigpLmVxdWFscygiZGVwZW5kZW5jaWVzIikpIHsKLQkJCWdldEVkaXRvcigpLnNldEFjdGl2ZVBhZ2UoUGFyWG1sRWRpdG9yUGFnZS5JRF9FRElUT1IpOwotCQl9IGVsc2UgaWYgKGUuZ2V0SHJlZigpLmVxdWFscygiZXhwb3J0cGFyIikpIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisgICAgcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7CisgICAgICAgIGlmIChlLmdldEhyZWYoKS5lcXVhbHMoImRlcGVuZGVuY2llcyIpKSB7CisgICAgICAgICAgICBnZXRFZGl0b3IoKS5zZXRBY3RpdmVQYWdlKFBhclhtbEVkaXRvclBhZ2UuSURfRURJVE9SKTsKKyAgICAgICAgfSBlbHNlIGlmIChlLmdldEhyZWYoKS5lcXVhbHMoImV4cG9ydHBhciIpKSB7CisgICAgICAgICAgICBEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewogCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlQYXJFeHBvcnRXaXphcmQgd2l6YXJkID0gbmV3IFBhckV4cG9ydFdpemFyZCgpOwotCQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQkJCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLAotCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IGZJbmZvU2VjdGlvbi5nZXRQYXJQcm9qZWN0KCkgfSkpOwotCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgUGFyRXhwb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBQYXJFeHBvcnRXaXphcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKKyAgICAgICAgICAgICAgICAgICAgd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IFBhck92ZXJ2aWV3UGFnZS50aGlzLmZJbmZvU2VjdGlvbi5nZXRQYXJQcm9qZWN0KCkgfSkpOworICAgICAgICAgICAgICAgICAgICBkaWFsb2cub3BlbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgbGlua0VudGVyZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkvLyBpZ25vcmUKLQl9CisgICAgcHVibGljIHZvaWQgbGlua0VudGVyZWQoSHlwZXJsaW5rRXZlbnQgZSkgeworICAgICAgICAvLyBpZ25vcmUKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJLy8gaWdub3JlCi0JfQorICAgIHB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgeworICAgICAgICAvLyBpZ25vcmUKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGFyVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGFyVXRpbHMuamF2YQppbmRleCAwOTk4OTUzLi4xYWE3YjVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL1BhclV0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QYXJVdGlscy5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CkBAIC0xNywxMSArMTgsMTEgQEAKICAqLwogcHVibGljIGNsYXNzIFBhclV0aWxzIHsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN5bWJvbGljTmFtZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIEZvciBub3cgd2UgYXJlIGdvaW5nIHRvIHVzZSBwcm9qZWN0IG5hbWVzIGluc3RlYWQgb2YKLQkJLy8gQnVuZGxlLVN5bWJvbGljTmFtZSBjYXVzZSB0aGVzZSAqbXVzdCoKLQkJLy8gYmUgdW5pcXVlIHdpdGhpbiB0aGUgZWNsaXBzZSB3b3Jrc3BhY2UKLQkJcmV0dXJuIHByb2plY3QuZ2V0TmFtZSgpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTeW1ib2xpY05hbWUoSVByb2plY3QgcHJvamVjdCkgeworICAgICAgICAvLyBGb3Igbm93IHdlIGFyZSBnb2luZyB0byB1c2UgcHJvamVjdCBuYW1lcyBpbnN0ZWFkIG9mCisgICAgICAgIC8vIEJ1bmRsZS1TeW1ib2xpY05hbWUgY2F1c2UgdGhlc2UgKm11c3QqCisgICAgICAgIC8vIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVjbGlwc2Ugd29ya3NwYWNlCisgICAgICAgIHJldHVybiBwcm9qZWN0LmdldE5hbWUoKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGFyWG1sRWRpdG9yUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QYXJYbWxFZGl0b3JQYWdlLmphdmEKaW5kZXggZDliOWVhMy4uNDNlYTRlYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QYXJYbWxFZGl0b3JQYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QYXJYbWxFZGl0b3JQYWdlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwpAQCAtMjQsMzEgKzI1LDMxIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQYXJYbWxFZGl0b3JQYWdlIGV4dGVuZHMgQWJzdHJhY3RQYXJYbWxFZGl0b3JQYWdlIHsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEX0VESVRPUiA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yLnBhci5kZXBlbmRlbmNpZXMiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElEX0VESVRPUiA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yLnBhci5kZXBlbmRlbmNpZXMiOwogCi0JcHVibGljIFBhclhtbEVkaXRvclBhZ2UoUGFyTWFuaWZlc3RFZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihlZGl0b3IsIGlkLCB0aXRsZSk7Ci0JfQorICAgIHB1YmxpYyBQYXJYbWxFZGl0b3JQYWdlKFBhck1hbmlmZXN0RWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLCBTdHJpbmcgdGl0bGUpIHsKKyAgICAgICAgc3VwZXIoZWRpdG9yLCBpZCwgdGl0bGUpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRm9ybVBhcnQgZ2V0Rm9ybVBhcnQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gbGFiZWxzKSB7Ci0JCXJldHVybiBuZXcgUGFyRGVwZW5kZW5jaWVzU2VjdGlvbih0aGlzLCBwYXJlbnQsIGxhYmVscyk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBJRm9ybVBhcnQgZ2V0Rm9ybVBhcnQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gbGFiZWxzKSB7CisgICAgICAgIHJldHVybiBuZXcgUGFyRGVwZW5kZW5jaWVzU2VjdGlvbih0aGlzLCBwYXJlbnQsIGxhYmVscyk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCXN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLQkJU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCWZvcm0uc2V0SW1hZ2UoU2VydmVySWRlVWlQbHVnaW4uZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvcGFyX29iai5naWYiKSk7Ci0JCWZvcm0uc2V0VGV4dCgiUEFSIEVkaXRvciIpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKKyAgICAgICAgc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOworICAgICAgICBTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKKyAgICAgICAgZm9ybS5zZXRJbWFnZShTZXJ2ZXJJZGVVaVBsdWdpbi5nZXRJbWFnZSgiZnVsbC9vYmoxNi9wYXJfb2JqLmdpZiIpKTsKKyAgICAgICAgZm9ybS5zZXRUZXh0KCJQQVIgRWRpdG9yIik7CisgICAgfQogCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuICgoUGFyTWFuaWZlc3RFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JfQorICAgIHByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZ2V0TW9kZWwoKSB7CisgICAgICAgIHJldHVybiAoKFBhck1hbmlmZXN0RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0RWRpdGluZ0RvbWFpbigpOworICAgIH0KIAotCXB1YmxpYyBQYXIgZ2V0UGFyKCkgewotCQlyZXR1cm4gKChQYXJNYW5pZmVzdEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldFBhcigpOwotCX0KKyAgICBwdWJsaWMgUGFyIGdldFBhcigpIHsKKyAgICAgICAgcmV0dXJuICgoUGFyTWFuaWZlc3RFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRQYXIoKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGRlQ29tcGF0aWJpbGl0eVV0aWwuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUGRlQ29tcGF0aWJpbGl0eVV0aWwuamF2YQppbmRleCAxOGVkNzgxLi41NjA3MjI0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL1BkZUNvbXBhdGliaWxpdHlVdGlsLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9QZGVDb21wYXRpYmlsaXR5VXRpbC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMjUsNDcgKzI2LDQ1IEBACiAgKi8KIGNsYXNzIFBkZUNvbXBhdGliaWxpdHlVdGlsIHsKIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFY2xpcHNlMzQgPSB0cnVlOworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFY2xpcHNlMzQgPSB0cnVlOwogCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3lzdGVtRmlsZUVkaXRvcklucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaXNFY2xpcHNlMzQpIHsKLQkJCUNsYXNzPD8+IHN5c3RlbUZpbGVFZGl0b3JJbnB1dENsYXNzOwotCQkJdHJ5IHsKLQkJCQlzeXN0ZW1GaWxlRWRpdG9ySW5wdXRDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC51aS5lZGl0b3IuU3lzdGVtRmlsZUVkaXRvcklucHV0Iik7Ci0JCQkJcmV0dXJuIHN5c3RlbUZpbGVFZGl0b3JJbnB1dENsYXNzLmlzSW5zdGFuY2UoaW5wdXQpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaXNFY2xpcHNlMzQgPSBmYWxzZTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJJZGVVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJCSJGYWlsZWQgdG8gY2hlY2sgZm9yIGluc3RhbmNlIG9mIFN5c3RlbUZpbGVFZGl0b3JJbnB1dCIpKTsKLQkJCQlpc0VjbGlwc2UzNCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3lzdGVtRmlsZUVkaXRvcklucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgeworICAgICAgICBpZiAoaXNFY2xpcHNlMzQpIHsKKyAgICAgICAgICAgIENsYXNzPD8+IHN5c3RlbUZpbGVFZGl0b3JJbnB1dENsYXNzOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzeXN0ZW1GaWxlRWRpdG9ySW5wdXRDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC51aS5lZGl0b3IuU3lzdGVtRmlsZUVkaXRvcklucHV0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN5c3RlbUZpbGVFZGl0b3JJbnB1dENsYXNzLmlzSW5zdGFuY2UoaW5wdXQpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaXNFY2xpcHNlMzQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlcklkZVVpUGx1Z2luLlBMVUdJTl9JRCwgIkZhaWxlZCB0byBjaGVjayBmb3IgaW5zdGFuY2Ugb2YgU3lzdGVtRmlsZUVkaXRvcklucHV0IikpOworICAgICAgICAgICAgICAgIGlzRWNsaXBzZTM0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgSUVkaXRvcklucHV0IGNyZWF0ZVN5c3RlbUZpbGVFZGl0b3JJbnB1dChJVVJJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcmV0dXJuIGNyZWF0ZVN5c3RlbUZpbGVFZGl0b3JJbnB1dChuZXcgRmlsZShpbnB1dC5nZXRVUkkoKSkpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIElFZGl0b3JJbnB1dCBjcmVhdGVTeXN0ZW1GaWxlRWRpdG9ySW5wdXQoSVVSSUVkaXRvcklucHV0IGlucHV0KSB7CisgICAgICAgIHJldHVybiBjcmVhdGVTeXN0ZW1GaWxlRWRpdG9ySW5wdXQobmV3IEZpbGUoaW5wdXQuZ2V0VVJJKCkpKTsKKyAgICB9CiAKLQlwdWJsaWMgc3RhdGljIElFZGl0b3JJbnB1dCBjcmVhdGVTeXN0ZW1GaWxlRWRpdG9ySW5wdXQoRmlsZSBmaWxlKSB7Ci0JCWlmIChpc0VjbGlwc2UzNCkgewotCQkJQ2xhc3M8Pz4gc3lzdGVtRmlsZUVkaXRvcklucHV0Q2xhc3M7Ci0JCQl0cnkgewotCQkJCXN5c3RlbUZpbGVFZGl0b3JJbnB1dENsYXNzID0gQ2xhc3MuZm9yTmFtZSgib3JnLmVjbGlwc2UucGRlLmludGVybmFsLnVpLmVkaXRvci5TeXN0ZW1GaWxlRWRpdG9ySW5wdXQiKTsKLQkJCQlDb25zdHJ1Y3Rvcjw/PiBjb25zdHJ1Y3RvciA9IHN5c3RlbUZpbGVFZGl0b3JJbnB1dENsYXNzLmdldENvbnN0cnVjdG9yKEZpbGUuY2xhc3MpOwotCQkJCXJldHVybiAoSUVkaXRvcklucHV0KSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShmaWxlKTsKLQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCWlzRWNsaXBzZTM0ID0gZmFsc2U7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKLQkJCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQkiRmFpbGVkIHRvIGNyZWF0ZSBpbnN0YW5jZSBvZiBTeXN0ZW1GaWxlRWRpdG9ySW5wdXQiKSk7Ci0JCQkJaXNFY2xpcHNlMzQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgcHVibGljIHN0YXRpYyBJRWRpdG9ySW5wdXQgY3JlYXRlU3lzdGVtRmlsZUVkaXRvcklucHV0KEZpbGUgZmlsZSkgeworICAgICAgICBpZiAoaXNFY2xpcHNlMzQpIHsKKyAgICAgICAgICAgIENsYXNzPD8+IHN5c3RlbUZpbGVFZGl0b3JJbnB1dENsYXNzOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzeXN0ZW1GaWxlRWRpdG9ySW5wdXRDbGFzcyA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC51aS5lZGl0b3IuU3lzdGVtRmlsZUVkaXRvcklucHV0Iik7CisgICAgICAgICAgICAgICAgQ29uc3RydWN0b3I8Pz4gY29uc3RydWN0b3IgPSBzeXN0ZW1GaWxlRWRpdG9ySW5wdXRDbGFzcy5nZXRDb25zdHJ1Y3RvcihGaWxlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKElFZGl0b3JJbnB1dCkgY29uc3RydWN0b3IubmV3SW5zdGFuY2UoZmlsZSk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpc0VjbGlwc2UzNCA9IGZhbHNlOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELCAiRmFpbGVkIHRvIGNyZWF0ZSBpbnN0YW5jZSBvZiBTeXN0ZW1GaWxlRWRpdG9ySW5wdXQiKSk7CisgICAgICAgICAgICAgICAgaXNFY2xpcHNlMzQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvUHJvamVjdFNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9Qcm9qZWN0U2VsZWN0aW9uRGlhbG9nLmphdmEKaW5kZXggMjNkMDIxYi4uMGE5MWU2MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9Qcm9qZWN0U2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9Qcm9qZWN0U2VsZWN0aW9uRGlhbG9nLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMjMsMjEgKzI0LDIxIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQcm9qZWN0U2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgewogCi0JcHVibGljIFByb2plY3RTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgV29ya2JlbmNoTGFiZWxQcm92aWRlci5nZXREZWNvcmF0aW5nV29ya2JlbmNoTGFiZWxQcm92aWRlcigpKTsKLQkJc2V0VGl0bGUoIkJ1bmRsZSBTZWxlY3Rpb24iKTsKLQkJc2V0TWVzc2FnZSgiU2VsZWN0IGEgQnVuZGxlOiIpOwotCQlzZXRFbGVtZW50cyhGYWNldFV0aWxzLmdldEJ1bmRsZVByb2plY3RzKCkpOwotCQlzZXRNdWx0aXBsZVNlbGVjdGlvbih0cnVlKTsKLQl9CisgICAgcHVibGljIFByb2plY3RTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50KSB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgV29ya2JlbmNoTGFiZWxQcm92aWRlci5nZXREZWNvcmF0aW5nV29ya2JlbmNoTGFiZWxQcm92aWRlcigpKTsKKyAgICAgICAgc2V0VGl0bGUoIkJ1bmRsZSBTZWxlY3Rpb24iKTsKKyAgICAgICAgc2V0TWVzc2FnZSgiU2VsZWN0IGEgQnVuZGxlOiIpOworICAgICAgICBzZXRFbGVtZW50cyhGYWNldFV0aWxzLmdldEJ1bmRsZVByb2plY3RzKCkpOworICAgICAgICBzZXRNdWx0aXBsZVNlbGVjdGlvbih0cnVlKTsKKyAgICB9CiAKLQlwdWJsaWMgSVByb2plY3RbXSBnZXRTZWxlY3RlZFByb2plY3RzKCkgewotCQlPYmplY3RbXSByZXN1bHQgPSBnZXRSZXN1bHQoKTsKLQkJQXJyYXlMaXN0PElQcm9qZWN0PiBwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3Q+KCk7Ci0JCWZvciAoT2JqZWN0IHByb2plY3QgOiByZXN1bHQpIHsKLQkJCXByb2plY3RzLmFkZCgoSVByb2plY3QpIHByb2plY3QpOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFswXSk7Ci0JfQorICAgIHB1YmxpYyBJUHJvamVjdFtdIGdldFNlbGVjdGVkUHJvamVjdHMoKSB7CisgICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IGdldFJlc3VsdCgpOworICAgICAgICBBcnJheUxpc3Q8SVByb2plY3Q+IHByb2plY3RzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oKTsKKyAgICAgICAgZm9yIChPYmplY3QgcHJvamVjdCA6IHJlc3VsdCkgeworICAgICAgICAgICAgcHJvamVjdHMuYWRkKChJUHJvamVjdCkgcHJvamVjdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHByb2plY3RzLnRvQXJyYXkobmV3IElQcm9qZWN0WzBdKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvU3ByaW5nQnVuZGxlRm9sZGluZ1N0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL1NwcmluZ0J1bmRsZUZvbGRpbmdTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCmluZGV4IDc4YjQ5YzcuLjYxNWU4NzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvU3ByaW5nQnVuZGxlRm9sZGluZ1N0cnVjdHVyZVByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9TcHJpbmdCdW5kbGVGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9yczsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtMzIsNDkgKzMzLDQ5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTcHJpbmdCdW5kbGVGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIgZXh0ZW5kcyBCdW5kbGVGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIgewogCi0JcHJpdmF0ZSBmaW5hbCBNYXAgZlBvc2l0aW9uVG9FbGVtZW50ID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcCBmUG9zaXRpb25Ub0VsZW1lbnQgPSBuZXcgSGFzaE1hcCgpOwogCi0JcHVibGljIFNwcmluZ0J1bmRsZUZvbGRpbmdTdHJ1Y3R1cmVQcm92aWRlcihQREVTb3VyY2VQYWdlIGVkaXRvciwgSUVkaXRpbmdNb2RlbCBtb2RlbCkgewotCQlzdXBlcihlZGl0b3IsIG1vZGVsKTsKLQl9CisgICAgcHVibGljIFNwcmluZ0J1bmRsZUZvbGRpbmdTdHJ1Y3R1cmVQcm92aWRlcihQREVTb3VyY2VQYWdlIGVkaXRvciwgSUVkaXRpbmdNb2RlbCBtb2RlbCkgeworICAgICAgICBzdXBlcihlZGl0b3IsIG1vZGVsKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRGb2xkaW5nUmVnaW9ucyhTZXQgY3VycmVudFJlZ2lvbnMsIElFZGl0aW5nTW9kZWwgbW9kZWwpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlCdW5kbGUgYnVuZGxlID0gKChCdW5kbGVNb2RlbCkgbW9kZWwpLmdldEJ1bmRsZSgpOworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZEZvbGRpbmdSZWdpb25zKFNldCBjdXJyZW50UmVnaW9ucywgSUVkaXRpbmdNb2RlbCBtb2RlbCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgSUJ1bmRsZSBidW5kbGUgPSAoKEJ1bmRsZU1vZGVsKSBtb2RlbCkuZ2V0QnVuZGxlKCk7CiAKLQkJSU1hbmlmZXN0SGVhZGVyIGltcG9ydFBhY2thZ2VIZWFkZXIgPSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFKTsKLQkJSU1hbmlmZXN0SGVhZGVyIGV4cG9ydFBhY2thZ2VIZWFkZXIgPSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFKTsKLQkJSU1hbmlmZXN0SGVhZGVyIHJlcXVpcmVCdW5kbGVIZWFkZXIgPSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFKTsKLQkJSU1hbmlmZXN0SGVhZGVyIGltcG9ydExpYnJhcnlIZWFkZXIgPSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSk7Ci0JCUlNYW5pZmVzdEhlYWRlciBpbXBvcnRCdW5kbGVIZWFkZXIgPSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfQlVORExFKTsKLQkJSU1hbmlmZXN0SGVhZGVyIGltcG9ydFRlbXBsYXRlQnVuZGxlSGVhZGVyID0gYnVuZGxlLmdldE1hbmlmZXN0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX1RFTVBMQVRFKTsKLQkJSU1hbmlmZXN0SGVhZGVyIGV4cG9ydFRlbXBsYXRlQnVuZGxlSGVhZGVyID0gYnVuZGxlLmdldE1hbmlmZXN0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuRVhQT1JUX1RFTVBMQVRFKTsKKyAgICAgICAgSU1hbmlmZXN0SGVhZGVyIGltcG9ydFBhY2thZ2VIZWFkZXIgPSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFKTsKKyAgICAgICAgSU1hbmlmZXN0SGVhZGVyIGV4cG9ydFBhY2thZ2VIZWFkZXIgPSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFKTsKKyAgICAgICAgSU1hbmlmZXN0SGVhZGVyIHJlcXVpcmVCdW5kbGVIZWFkZXIgPSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFKTsKKyAgICAgICAgSU1hbmlmZXN0SGVhZGVyIGltcG9ydExpYnJhcnlIZWFkZXIgPSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSk7CisgICAgICAgIElNYW5pZmVzdEhlYWRlciBpbXBvcnRCdW5kbGVIZWFkZXIgPSBidW5kbGUuZ2V0TWFuaWZlc3RIZWFkZXIoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfQlVORExFKTsKKyAgICAgICAgSU1hbmlmZXN0SGVhZGVyIGltcG9ydFRlbXBsYXRlQnVuZGxlSGVhZGVyID0gYnVuZGxlLmdldE1hbmlmZXN0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX1RFTVBMQVRFKTsKKyAgICAgICAgSU1hbmlmZXN0SGVhZGVyIGV4cG9ydFRlbXBsYXRlQnVuZGxlSGVhZGVyID0gYnVuZGxlLmdldE1hbmlmZXN0SGVhZGVyKElIZWFkZXJDb25zdGFudHMuRVhQT1JUX1RFTVBMQVRFKTsKIAotCQl0cnkgewotCQkJYWRkRm9sZGluZ1JlZ2lvbnMoY3VycmVudFJlZ2lvbnMsIGltcG9ydFBhY2thZ2VIZWFkZXIsIG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJYWRkRm9sZGluZ1JlZ2lvbnMoY3VycmVudFJlZ2lvbnMsIGV4cG9ydFBhY2thZ2VIZWFkZXIsIG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJYWRkRm9sZGluZ1JlZ2lvbnMoY3VycmVudFJlZ2lvbnMsIHJlcXVpcmVCdW5kbGVIZWFkZXIsIG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJYWRkRm9sZGluZ1JlZ2lvbnMoY3VycmVudFJlZ2lvbnMsIGltcG9ydExpYnJhcnlIZWFkZXIsIG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJYWRkRm9sZGluZ1JlZ2lvbnMoY3VycmVudFJlZ2lvbnMsIGltcG9ydEJ1bmRsZUhlYWRlciwgbW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlhZGRGb2xkaW5nUmVnaW9ucyhjdXJyZW50UmVnaW9ucywgaW1wb3J0VGVtcGxhdGVCdW5kbGVIZWFkZXIsIG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJYWRkRm9sZGluZ1JlZ2lvbnMoY3VycmVudFJlZ2lvbnMsIGV4cG9ydFRlbXBsYXRlQnVuZGxlSGVhZGVyLCBtb2RlbC5nZXREb2N1bWVudCgpKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYWRkRm9sZGluZ1JlZ2lvbnMoY3VycmVudFJlZ2lvbnMsIGltcG9ydFBhY2thZ2VIZWFkZXIsIG1vZGVsLmdldERvY3VtZW50KCkpOworICAgICAgICAgICAgYWRkRm9sZGluZ1JlZ2lvbnMoY3VycmVudFJlZ2lvbnMsIGV4cG9ydFBhY2thZ2VIZWFkZXIsIG1vZGVsLmdldERvY3VtZW50KCkpOworICAgICAgICAgICAgYWRkRm9sZGluZ1JlZ2lvbnMoY3VycmVudFJlZ2lvbnMsIHJlcXVpcmVCdW5kbGVIZWFkZXIsIG1vZGVsLmdldERvY3VtZW50KCkpOworICAgICAgICAgICAgYWRkRm9sZGluZ1JlZ2lvbnMoY3VycmVudFJlZ2lvbnMsIGltcG9ydExpYnJhcnlIZWFkZXIsIG1vZGVsLmdldERvY3VtZW50KCkpOworICAgICAgICAgICAgYWRkRm9sZGluZ1JlZ2lvbnMoY3VycmVudFJlZ2lvbnMsIGltcG9ydEJ1bmRsZUhlYWRlciwgbW9kZWwuZ2V0RG9jdW1lbnQoKSk7CisgICAgICAgICAgICBhZGRGb2xkaW5nUmVnaW9ucyhjdXJyZW50UmVnaW9ucywgaW1wb3J0VGVtcGxhdGVCdW5kbGVIZWFkZXIsIG1vZGVsLmdldERvY3VtZW50KCkpOworICAgICAgICAgICAgYWRkRm9sZGluZ1JlZ2lvbnMoY3VycmVudFJlZ2lvbnMsIGV4cG9ydFRlbXBsYXRlQnVuZGxlSGVhZGVyLCBtb2RlbC5nZXREb2N1bWVudCgpKTsKKyAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGFkZEZvbGRpbmdSZWdpb25zKFNldCByZWdpb25zLCBJTWFuaWZlc3RIZWFkZXIgaGVhZGVyLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChoZWFkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBzdGFydExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoaGVhZGVyLmdldE9mZnNldCgpKTsKLQkJaW50IGVuZExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoaGVhZGVyLmdldE9mZnNldCgpICsgaGVhZGVyLmdldExlbmd0aCgpIC0gMSk7Ci0JCWlmIChzdGFydExpbmUgPCBlbmRMaW5lKSB7Ci0JCQlpbnQgc3RhcnQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHN0YXJ0TGluZSk7Ci0JCQlpbnQgZW5kID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChlbmRMaW5lKSArIGRvY3VtZW50LmdldExpbmVMZW5ndGgoZW5kTGluZSk7Ci0JCQlQb3NpdGlvbiBwb3NpdGlvbiA9IG5ldyBQb3NpdGlvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJcmVnaW9ucy5hZGQocG9zaXRpb24pOwotCQkJZlBvc2l0aW9uVG9FbGVtZW50LnB1dChwb3NpdGlvbiwgaGVhZGVyKTsKLQkJfQotCX0KKyAgICBwcml2YXRlIHZvaWQgYWRkRm9sZGluZ1JlZ2lvbnMoU2V0IHJlZ2lvbnMsIElNYW5pZmVzdEhlYWRlciBoZWFkZXIsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IHN0YXJ0TGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChoZWFkZXIuZ2V0T2Zmc2V0KCkpOworICAgICAgICBpbnQgZW5kTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChoZWFkZXIuZ2V0T2Zmc2V0KCkgKyBoZWFkZXIuZ2V0TGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgaWYgKHN0YXJ0TGluZSA8IGVuZExpbmUpIHsKKyAgICAgICAgICAgIGludCBzdGFydCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoc3RhcnRMaW5lKTsKKyAgICAgICAgICAgIGludCBlbmQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGVuZExpbmUpICsgZG9jdW1lbnQuZ2V0TGluZUxlbmd0aChlbmRMaW5lKTsKKyAgICAgICAgICAgIFBvc2l0aW9uIHBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7CisgICAgICAgICAgICByZWdpb25zLmFkZChwb3NpdGlvbik7CisgICAgICAgICAgICB0aGlzLmZQb3NpdGlvblRvRWxlbWVudC5wdXQocG9zaXRpb24sIGhlYWRlcik7CisgICAgICAgIH0KKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvU3ByaW5nQnVuZGxlSHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvU3ByaW5nQnVuZGxlSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQppbmRleCAzZWE2YWQ4Li5hYTkyMzljIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL1NwcmluZ0J1bmRsZUh5cGVybGlua0RldGVjdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9TcHJpbmdCdW5kbGVIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CkBAIC00MiwxODAgKzQzLDE3NCBAQAogICovCiBwdWJsaWMgY2xhc3MgU3ByaW5nQnVuZGxlSHlwZXJsaW5rRGV0ZWN0b3IgaW1wbGVtZW50cyBJSHlwZXJsaW5rRGV0ZWN0b3IgewogCi0JcHJpdmF0ZSBmaW5hbCBQREVTb3VyY2VQYWdlIGZTb3VyY2VQYWdlOworICAgIHByaXZhdGUgZmluYWwgUERFU291cmNlUGFnZSBmU291cmNlUGFnZTsKIAotCS8qKgotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0b3IgaW4gd2hpY2ggdG8gZGV0ZWN0IHRoZSBoeXBlcmxpbmsKLQkgKi8KLQlwdWJsaWMgU3ByaW5nQnVuZGxlSHlwZXJsaW5rRGV0ZWN0b3IoUERFU291cmNlUGFnZSBwYWdlKSB7Ci0JCWZTb3VyY2VQYWdlID0gcGFnZTsKLQl9CisgICAgLyoqCisgICAgICogQHBhcmFtIGVkaXRvciB0aGUgZWRpdG9yIGluIHdoaWNoIHRvIGRldGVjdCB0aGUgaHlwZXJsaW5rCisgICAgICovCisgICAgcHVibGljIFNwcmluZ0J1bmRsZUh5cGVybGlua0RldGVjdG9yKFBERVNvdXJjZVBhZ2UgcGFnZSkgeworICAgICAgICB0aGlzLmZTb3VyY2VQYWdlID0gcGFnZTsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUKLQkgKiBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3IjZGV0ZWN0SHlwZXJsaW5rcygKLQkgKiBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24sCi0JICogYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSUh5cGVybGlua1tdIGRldGVjdEh5cGVybGlua3MoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGJvb2xlYW4gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcykgewotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CisgICAgLyoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvciNkZXRlY3RIeXBlcmxpbmtzKCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAorICAgICAqIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiwgYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgSUh5cGVybGlua1tdIGRldGVjdEh5cGVybGlua3MoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGJvb2xlYW4gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcykgeworICAgICAgICBpZiAocmVnaW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJSURvY3VtZW50UmFuZ2UgZWxlbWVudCA9IGZTb3VyY2VQYWdlLmdldFJhbmdlRWxlbWVudChyZWdpb24uZ2V0T2Zmc2V0KCksIGZhbHNlKTsKLQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIE1hbmlmZXN0SGVhZGVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICAgICAgSURvY3VtZW50UmFuZ2UgZWxlbWVudCA9IHRoaXMuZlNvdXJjZVBhZ2UuZ2V0UmFuZ2VFbGVtZW50KHJlZ2lvbi5nZXRPZmZzZXQoKSwgZmFsc2UpOworICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTWFuaWZlc3RIZWFkZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JCU1hbmlmZXN0SGVhZGVyIGhlYWRlciA9IChNYW5pZmVzdEhlYWRlcikgZWxlbWVudDsKLQkJaWYgKCFoZWFkZXIuZ2V0TW9kZWwoKS5pc0VkaXRhYmxlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CisgICAgICAgIE1hbmlmZXN0SGVhZGVyIGhlYWRlciA9IChNYW5pZmVzdEhlYWRlcikgZWxlbWVudDsKKyAgICAgICAgaWYgKCFoZWFkZXIuZ2V0TW9kZWwoKS5pc0VkaXRhYmxlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJU3RyaW5nIGhlYWRlck5hbWUgPSBoZWFkZXIuZ2V0TmFtZSgpOwotCQlpZiAocmVnaW9uLmdldE9mZnNldCgpIDw9IGhlYWRlci5nZXRPZmZzZXQoKSArIGhlYWRlck5hbWUubGVuZ3RoKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CisgICAgICAgIFN0cmluZyBoZWFkZXJOYW1lID0gaGVhZGVyLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKHJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBoZWFkZXIuZ2V0T2Zmc2V0KCkgKyBoZWFkZXJOYW1lLmxlbmd0aCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQogCi0JCVN0cmluZ1tdIHRyYW5zbGF0YWJsZSA9IElDb3JlQ29uc3RhbnRzLlRSQU5TTEFUQUJMRV9IRUFERVJTOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zbGF0YWJsZS5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFoZWFkZXJOYW1lLmVxdWFscyh0cmFuc2xhdGFibGVbaV0pKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdmFsdWUgPSBoZWFkZXIuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDAgfHwgdmFsdWUuY2hhckF0KDApICE9ICclJykgewotCQkJCWJyZWFrOwotCQkJfQorICAgICAgICBTdHJpbmdbXSB0cmFuc2xhdGFibGUgPSBJQ29yZUNvbnN0YW50cy5UUkFOU0xBVEFCTEVfSEVBREVSUzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmFuc2xhdGFibGUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghaGVhZGVyTmFtZS5lcXVhbHModHJhbnNsYXRhYmxlW2ldKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gaGVhZGVyLmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwIHx8IHZhbHVlLmNoYXJBdCgwKSAhPSAnJScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KIAotCQkJSURvY3VtZW50UmFuZ2UgcmFuZ2UgPSBCdW5kbGVTb3VyY2VQYWdlLmdldFNwZWNpZmljUmFuZ2UoaGVhZGVyLmdldE1vZGVsKCksIGhlYWRlciwgdmFsdWUpOwotCQkJcmV0dXJuIG5ldyBJSHlwZXJsaW5rW10geyBuZXcgVHJhbnNsYXRpb25IeXBlcmxpbmsobmV3IFJlZ2lvbihyYW5nZS5nZXRPZmZzZXQoKSwgcmFuZ2UuZ2V0TGVuZ3RoKCkpLCB2YWx1ZSwKLQkJCQkJaGVhZGVyLmdldE1vZGVsKCkpIH07Ci0JCX0KKyAgICAgICAgICAgIElEb2N1bWVudFJhbmdlIHJhbmdlID0gQnVuZGxlU291cmNlUGFnZS5nZXRTcGVjaWZpY1JhbmdlKGhlYWRlci5nZXRNb2RlbCgpLCBoZWFkZXIsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSUh5cGVybGlua1tdIHsgbmV3IFRyYW5zbGF0aW9uSHlwZXJsaW5rKG5ldyBSZWdpb24ocmFuZ2UuZ2V0T2Zmc2V0KCksIHJhbmdlLmdldExlbmd0aCgpKSwgdmFsdWUsIGhlYWRlci5nZXRNb2RlbCgpKSB9OworICAgICAgICB9CiAKLQkJaWYgKGhlYWRlciBpbnN0YW5jZW9mIEJ1bmRsZUFjdGl2YXRvckhlYWRlcikgeyAvLyBhZGQgZWxzZSBpZiBzdGF0bWVudHMKLQkJCS8vIGZvciBvdGhlciBoZWFkZXJzCi0JCQlTdHJpbmcgdGFyZ2V0ID0gKChCdW5kbGVBY3RpdmF0b3JIZWFkZXIpIGVsZW1lbnQpLmdldENsYXNzTmFtZSgpOwotCQkJaWYgKHRhcmdldCA9PSBudWxsIHx8IHRhcmdldC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlJRG9jdW1lbnRSYW5nZSByYW5nZSA9IEJ1bmRsZVNvdXJjZVBhZ2UuZ2V0U3BlY2lmaWNSYW5nZShoZWFkZXIuZ2V0TW9kZWwoKSwgaGVhZGVyLCB0YXJnZXQpOwotCQkJaWYgKHJhbmdlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBuZXcgSUh5cGVybGlua1tdIHsgbmV3IEphdmFIeXBlcmxpbmsobmV3IFJlZ2lvbihyYW5nZS5nZXRPZmZzZXQoKSwgcmFuZ2UuZ2V0TGVuZ3RoKCkpLCB0YXJnZXQsCi0JCQkJCWhlYWRlci5nZXRNb2RlbCgpLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpKSB9OwotCQl9IGVsc2UgaWYgKGhlYWRlciBpbnN0YW5jZW9mIEJhc2VQYWNrYWdlSGVhZGVyIHx8IGhlYWRlciBpbnN0YW5jZW9mIFJlcXVpcmVCdW5kbGVIZWFkZXIKLQkJCQl8fCBoZWFkZXIgaW5zdGFuY2VvZiBJbXBvcnRCdW5kbGVIZWFkZXIgfHwgaGVhZGVyIGluc3RhbmNlb2YgSW1wb3J0TGlicmFyeUhlYWRlcgotCQkJCXx8IGhlYWRlciBpbnN0YW5jZW9mIEZyYWdtZW50SG9zdEhlYWRlcikgewotCQkJcmV0dXJuIG1hdGNoTGlua0ZvcihoZWFkZXIsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgICAgICBpZiAoaGVhZGVyIGluc3RhbmNlb2YgQnVuZGxlQWN0aXZhdG9ySGVhZGVyKSB7IC8vIGFkZCBlbHNlIGlmIHN0YXRtZW50cworICAgICAgICAgICAgLy8gZm9yIG90aGVyIGhlYWRlcnMKKyAgICAgICAgICAgIFN0cmluZyB0YXJnZXQgPSAoKEJ1bmRsZUFjdGl2YXRvckhlYWRlcikgZWxlbWVudCkuZ2V0Q2xhc3NOYW1lKCk7CisgICAgICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElEb2N1bWVudFJhbmdlIHJhbmdlID0gQnVuZGxlU291cmNlUGFnZS5nZXRTcGVjaWZpY1JhbmdlKGhlYWRlci5nZXRNb2RlbCgpLCBoZWFkZXIsIHRhcmdldCk7CisgICAgICAgICAgICBpZiAocmFuZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBJSHlwZXJsaW5rW10geworICAgICAgICAgICAgICAgIG5ldyBKYXZhSHlwZXJsaW5rKG5ldyBSZWdpb24ocmFuZ2UuZ2V0T2Zmc2V0KCksIHJhbmdlLmdldExlbmd0aCgpKSwgdGFyZ2V0LCBoZWFkZXIuZ2V0TW9kZWwoKS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSkgfTsKKyAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIgaW5zdGFuY2VvZiBCYXNlUGFja2FnZUhlYWRlciB8fCBoZWFkZXIgaW5zdGFuY2VvZiBSZXF1aXJlQnVuZGxlSGVhZGVyIHx8IGhlYWRlciBpbnN0YW5jZW9mIEltcG9ydEJ1bmRsZUhlYWRlcgorICAgICAgICAgICAgfHwgaGVhZGVyIGluc3RhbmNlb2YgSW1wb3J0TGlicmFyeUhlYWRlciB8fCBoZWFkZXIgaW5zdGFuY2VvZiBGcmFnbWVudEhvc3RIZWFkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaExpbmtGb3IoaGVhZGVyLCByZWdpb24uZ2V0T2Zmc2V0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXByaXZhdGUgSUh5cGVybGlua1tdIG1hdGNoTGlua0ZvcihNYW5pZmVzdEhlYWRlciBoZWFkZXIsIGludCBtYWluT2Zmc2V0KSB7Ci0JCUlEb2N1bWVudCBkb2MgPSAoKElFZGl0aW5nTW9kZWwpIGhlYWRlci5nZXRNb2RlbCgpKS5nZXREb2N1bWVudCgpOwotCQlTdHJpbmcgdmFsdWU7Ci0JCXRyeSB7Ci0JCQl2YWx1ZSA9IGRvYy5nZXQoaGVhZGVyLmdldE9mZnNldCgpLCBoZWFkZXIuZ2V0TGVuZ3RoKCkpOwotCQkJaW50IG9mZnNldCA9IG1haW5PZmZzZXQgLSBoZWFkZXIuZ2V0T2Zmc2V0KCk7Ci0JCQkvLyBPdXIgb2Zmc2V0IGZhbGxzIG91dHNpZGUgdGhlIHZhbHVlIHJhbmdlCi0JCQlpZiAob2Zmc2V0ID49IHZhbHVlLmxlbmd0aCgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9CisgICAgcHJpdmF0ZSBJSHlwZXJsaW5rW10gbWF0Y2hMaW5rRm9yKE1hbmlmZXN0SGVhZGVyIGhlYWRlciwgaW50IG1haW5PZmZzZXQpIHsKKyAgICAgICAgSURvY3VtZW50IGRvYyA9ICgoSUVkaXRpbmdNb2RlbCkgaGVhZGVyLmdldE1vZGVsKCkpLmdldERvY3VtZW50KCk7CisgICAgICAgIFN0cmluZyB2YWx1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gZG9jLmdldChoZWFkZXIuZ2V0T2Zmc2V0KCksIGhlYWRlci5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gbWFpbk9mZnNldCAtIGhlYWRlci5nZXRPZmZzZXQoKTsKKyAgICAgICAgICAgIC8vIE91ciBvZmZzZXQgZmFsbHMgb3V0c2lkZSB0aGUgdmFsdWUgcmFuZ2UKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gdmFsdWUubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KIAotCQkJLy8gZW5zdXJlIHdlIGFyZSBvdmVyIGEgbGV0dGVyIG9yIHBlcmlvZAotCQkJY2hhciBjID0gdmFsdWUuY2hhckF0KG9mZnNldCk7Ci0JCQlpZiAoIWVsZW1lbnRDaGFyKGMsIHRydWUpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9CisgICAgICAgICAgICAvLyBlbnN1cmUgd2UgYXJlIG92ZXIgYSBsZXR0ZXIgb3IgcGVyaW9kCisgICAgICAgICAgICBjaGFyIGMgPSB2YWx1ZS5jaGFyQXQob2Zmc2V0KTsKKyAgICAgICAgICAgIGlmICghZWxlbWVudENoYXIoYywgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KIAotCQkJLy8gc2NhbiBiYWNrd2FyZHMgdG8gZmluZCB0aGUgc3RhcnQgb2YgdGhlIHdvcmQKLQkJCWludCBkb3duT2Zmc2V0ID0gb2Zmc2V0OwotCQkJYyA9IHZhbHVlLmNoYXJBdCgtLWRvd25PZmZzZXQpOwotCQkJd2hpbGUgKGMgIT0gJywnICYmIGMgIT0gJzonICYmIGRvd25PZmZzZXQgPiAwKSB7Ci0JCQkJLy8gYyA9PSAnOycgbWVhbnMgd2UgYXJlIGF0IGEgZGlyZWN0aXZlIC8gYXR0cmlidXRlIG5hbWUgKE5PVAotCQkJCS8vIHZhbHVlKQotCQkJCWlmIChjID09ICc7JyB8fCAhZWxlbWVudENoYXIoYywgZmFsc2UpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlkb3duT2Zmc2V0IC09IDE7Ci0JCQkJYyA9IHZhbHVlLmNoYXJBdChkb3duT2Zmc2V0KTsKLQkJCX0KLQkJCS8vIGJhY2t0cmFjayBmb3J3YXJkcyB0byByZW1vdmUgd2hpdGVzcGFjZSBldGMuCi0JCQl3aGlsZSAoZG93bk9mZnNldCA8IG9mZnNldCAmJiAhZWxlbWVudENoYXIoYywgdHJ1ZSkpIHsKLQkJCQljID0gdmFsdWUuY2hhckF0KCsrZG93bk9mZnNldCk7Ci0JCQl9CisgICAgICAgICAgICAvLyBzY2FuIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBzdGFydCBvZiB0aGUgd29yZAorICAgICAgICAgICAgaW50IGRvd25PZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICBjID0gdmFsdWUuY2hhckF0KC0tZG93bk9mZnNldCk7CisgICAgICAgICAgICB3aGlsZSAoYyAhPSAnLCcgJiYgYyAhPSAnOicgJiYgZG93bk9mZnNldCA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBjID09ICc7JyBtZWFucyB3ZSBhcmUgYXQgYSBkaXJlY3RpdmUgLyBhdHRyaWJ1dGUgbmFtZSAoTk9UCisgICAgICAgICAgICAgICAgLy8gdmFsdWUpCisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJzsnIHx8ICFlbGVtZW50Q2hhcihjLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvd25PZmZzZXQgLT0gMTsKKyAgICAgICAgICAgICAgICBjID0gdmFsdWUuY2hhckF0KGRvd25PZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYmFja3RyYWNrIGZvcndhcmRzIHRvIHJlbW92ZSB3aGl0ZXNwYWNlIGV0Yy4KKyAgICAgICAgICAgIHdoaWxlIChkb3duT2Zmc2V0IDwgb2Zmc2V0ICYmICFlbGVtZW50Q2hhcihjLCB0cnVlKSkgeworICAgICAgICAgICAgICAgIGMgPSB2YWx1ZS5jaGFyQXQoKytkb3duT2Zmc2V0KTsKKyAgICAgICAgICAgIH0KIAotCQkJLy8gc2NhbiBmb3J3YXJkcyB0byBmaW5kIHRoZSBlbmQgb2YgdGhlIHdvcmQKLQkJCWludCB1cE9mZnNldCA9IG9mZnNldDsKLQkJCWMgPSB2YWx1ZS5jaGFyQXQodXBPZmZzZXQpOwotCQkJaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotCQkJd2hpbGUgKGMgIT0gJzsnICYmIGMgIT0gJywnICYmIHVwT2Zmc2V0IDwgbGVuZ3RoIC0gMSkgewotCQkJCWlmICghZWxlbWVudENoYXIoYywgZmFsc2UpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQl1cE9mZnNldCArPSAxOwotCQkJCWMgPSB2YWx1ZS5jaGFyQXQodXBPZmZzZXQpOwotCQkJfQotCQkJLy8gYmFja3RyYWNrIHRvIHJlbW92ZSBleHRyYSBjaGFycwotCQkJaWYgKGMgPT0gJzsnIHx8IGMgPT0gJywnKSB7Ci0JCQkJdXBPZmZzZXQgLT0gMTsKLQkJCX0KKyAgICAgICAgICAgIC8vIHNjYW4gZm9yd2FyZHMgdG8gZmluZCB0aGUgZW5kIG9mIHRoZSB3b3JkCisgICAgICAgICAgICBpbnQgdXBPZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgICAgICBjID0gdmFsdWUuY2hhckF0KHVwT2Zmc2V0KTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgICAgIHdoaWxlIChjICE9ICc7JyAmJiBjICE9ICcsJyAmJiB1cE9mZnNldCA8IGxlbmd0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnRDaGFyKGMsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXBPZmZzZXQgKz0gMTsKKyAgICAgICAgICAgICAgICBjID0gdmFsdWUuY2hhckF0KHVwT2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGJhY2t0cmFjayB0byByZW1vdmUgZXh0cmEgY2hhcnMKKyAgICAgICAgICAgIGlmIChjID09ICc7JyB8fCBjID09ICcsJykgeworICAgICAgICAgICAgICAgIHVwT2Zmc2V0IC09IDE7CisgICAgICAgICAgICB9CiAKLQkJCVN0cmluZyBtYXRjaCA9IHZhbHVlLnN1YnN0cmluZyhkb3duT2Zmc2V0LCB1cE9mZnNldCArIDEpOwotCQkJaWYgKG1hdGNoLmxlbmd0aCgpID4gMCkgewotCQkJCUlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbihtYWluT2Zmc2V0IC0gKG9mZnNldCAtIGRvd25PZmZzZXQpLCBtYXRjaC5sZW5ndGgoKSk7Ci0JCQkJaWYgKGhlYWRlciBpbnN0YW5jZW9mIEJhc2VQYWNrYWdlSGVhZGVyKSB7Ci0JCQkJCXJldHVybiBuZXcgSUh5cGVybGlua1tdIHsgbmV3IFBhY2thZ2VIeXBlcmxpbmsocmVnaW9uLCBtYXRjaCwgKEJhc2VQYWNrYWdlSGVhZGVyKSBoZWFkZXIpIH07Ci0JCQkJfSBlbHNlIGlmIChoZWFkZXIgaW5zdGFuY2VvZiBSZXF1aXJlQnVuZGxlSGVhZGVyIHx8IGhlYWRlciBpbnN0YW5jZW9mIEltcG9ydEJ1bmRsZUhlYWRlcgotCQkJCQkJfHwgaGVhZGVyIGluc3RhbmNlb2YgRnJhZ21lbnRIb3N0SGVhZGVyKSB7CisgICAgICAgICAgICBTdHJpbmcgbWF0Y2ggPSB2YWx1ZS5zdWJzdHJpbmcoZG93bk9mZnNldCwgdXBPZmZzZXQgKyAxKTsKKyAgICAgICAgICAgIGlmIChtYXRjaC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24obWFpbk9mZnNldCAtIChvZmZzZXQgLSBkb3duT2Zmc2V0KSwgbWF0Y2gubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGlmIChoZWFkZXIgaW5zdGFuY2VvZiBCYXNlUGFja2FnZUhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElIeXBlcmxpbmtbXSB7IG5ldyBQYWNrYWdlSHlwZXJsaW5rKHJlZ2lvbiwgbWF0Y2gsIChCYXNlUGFja2FnZUhlYWRlcikgaGVhZGVyKSB9OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVhZGVyIGluc3RhbmNlb2YgUmVxdWlyZUJ1bmRsZUhlYWRlciB8fCBoZWFkZXIgaW5zdGFuY2VvZiBJbXBvcnRCdW5kbGVIZWFkZXIgfHwgaGVhZGVyIGluc3RhbmNlb2YgRnJhZ21lbnRIb3N0SGVhZGVyKSB7CiAKLQkJCQkJLy8gdHJ5IHRvIGZpZ3VyZSBvdXQgdGhlIHZlcnNpb24gcmFuZ2UKLQkJCQkJU3RyaW5nIHZlcnNpb24gPSB2YWx1ZS5zdWJzdHJpbmcodXBPZmZzZXQgKyAxKTsKLQkJCQkJaWYgKHZlcnNpb24uc3RhcnRzV2l0aCgiO3ZlcnNpb249XCIiKSkgewotCQkJCQkJdmVyc2lvbiA9IHZlcnNpb24uc3Vic3RyaW5nKDEwKTsKLQkJCQkJCWludCBsYXN0aW5kZXggPSB2ZXJzaW9uLmluZGV4T2YoJyInKTsKLQkJCQkJCXZlcnNpb24gPSB2ZXJzaW9uLnN1YnN0cmluZygwLCBsYXN0aW5kZXgpOwotCQkJCQl9IGVsc2UgaWYgKHZlcnNpb24uc3RhcnRzV2l0aCgiO2J1bmRsZS12ZXJzaW9uPVwiIikpIHsKLQkJCQkJCXZlcnNpb24gPSB2ZXJzaW9uLnN1YnN0cmluZygxNyk7Ci0JCQkJCQlpbnQgbGFzdGluZGV4ID0gdmVyc2lvbi5pbmRleE9mKCciJyk7Ci0JCQkJCQl2ZXJzaW9uID0gdmVyc2lvbi5zdWJzdHJpbmcoMCwgbGFzdGluZGV4KTsKLQkJCQkJfQorICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZmlndXJlIG91dCB0aGUgdmVyc2lvbiByYW5nZQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IHZhbHVlLnN1YnN0cmluZyh1cE9mZnNldCArIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAodmVyc2lvbi5zdGFydHNXaXRoKCI7dmVyc2lvbj1cIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi5zdWJzdHJpbmcoMTApOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RpbmRleCA9IHZlcnNpb24uaW5kZXhPZignIicpOworICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24uc3Vic3RyaW5nKDAsIGxhc3RpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbi5zdGFydHNXaXRoKCI7YnVuZGxlLXZlcnNpb249XCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24uc3Vic3RyaW5nKDE3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0aW5kZXggPSB2ZXJzaW9uLmluZGV4T2YoJyInKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnN1YnN0cmluZygwLCBsYXN0aW5kZXgpOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJcmV0dXJuIG5ldyBJSHlwZXJsaW5rW10geyBuZXcgQnVuZGxlSHlwZXJsaW5rKHJlZ2lvbiwgbWF0Y2gsIHZlcnNpb24pIH07Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElIeXBlcmxpbmtbXSB7IG5ldyBCdW5kbGVIeXBlcmxpbmsocmVnaW9uLCBtYXRjaCwgdmVyc2lvbikgfTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlwcml2YXRlIGJvb2xlYW4gZWxlbWVudENoYXIoY2hhciBjLCBib29sZWFuIG5vV2hpdGVzcGFjZSkgewotCQlpZiAobm9XaGl0ZXNwYWNlICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gKCdhJyA8PSBjICYmIGMgPD0gJ3onKSB8fCAoJ0EnIDw9IGMgJiYgYyA8PSAnWicpIHx8IGMgPT0gJy4nIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYyk7Ci0JfQorICAgIHByaXZhdGUgYm9vbGVhbiBlbGVtZW50Q2hhcihjaGFyIGMsIGJvb2xlYW4gbm9XaGl0ZXNwYWNlKSB7CisgICAgICAgIGlmIChub1doaXRlc3BhY2UgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAnYScgPD0gYyAmJiBjIDw9ICd6JyB8fCAnQScgPD0gYyAmJiBjIDw9ICdaJyB8fCBjID09ICcuJyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpOworICAgIH0KIAotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuICgoUERFRm9ybUVkaXRvcikgZlNvdXJjZVBhZ2UuZ2V0RWRpdG9yKCkpLmdldENvbW1vblByb2plY3QoKTsKLQl9CisgICAgcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KCkgeworICAgICAgICByZXR1cm4gKChQREVGb3JtRWRpdG9yKSB0aGlzLmZTb3VyY2VQYWdlLmdldEVkaXRvcigpKS5nZXRDb21tb25Qcm9qZWN0KCk7CisgICAgfQogCi0JcHVibGljIGNsYXNzIEJ1bmRsZUh5cGVybGluayBleHRlbmRzIE1hbmlmZXN0RWxlbWVudEh5cGVybGluayB7CisgICAgcHVibGljIGNsYXNzIEJ1bmRsZUh5cGVybGluayBleHRlbmRzIE1hbmlmZXN0RWxlbWVudEh5cGVybGluayB7CiAKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmVyc2lvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmVyc2lvbjsKIAotCQlwdWJsaWMgQnVuZGxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBTdHJpbmcgcGx1Z2luSUQsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCQlzdXBlcihyZWdpb24sIHBsdWdpbklEKTsKLQkJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCX0KKyAgICAgICAgcHVibGljIEJ1bmRsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHBsdWdpbklELCBTdHJpbmcgdmVyc2lvbikgeworICAgICAgICAgICAgc3VwZXIocmVnaW9uLCBwbHVnaW5JRCk7CisgICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIG9wZW4yKCkgewotCQkJQnVuZGxlTWFuaWZlc3RFZGl0b3Iub3BlbkJ1bmRsZUVkaXRvcihmRWxlbWVudCwgdmVyc2lvbiwgZ2V0UHJvamVjdCgpKTsKLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb3BlbjIoKSB7CisgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdEVkaXRvci5vcGVuQnVuZGxlRWRpdG9yKHRoaXMuZkVsZW1lbnQsIHRoaXMudmVyc2lvbiwgZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQogCi0JfQorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9TcHJpbmdCdW5kbGVJbnB1dENvbnRleHQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvU3ByaW5nQnVuZGxlSW5wdXRDb250ZXh0LmphdmEKaW5kZXggZTkwMTNhOC4uYjdlNTFjMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9TcHJpbmdCdW5kbGVJbnB1dENvbnRleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL1NwcmluZ0J1bmRsZUlucHV0Q29udGV4dC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMzUsMzggKzM2LDM4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTcHJpbmdCdW5kbGVJbnB1dENvbnRleHQgZXh0ZW5kcyBCdW5kbGVJbnB1dENvbnRleHQgewogCi0JcHVibGljIFNwcmluZ0J1bmRsZUlucHV0Q29udGV4dChQREVGb3JtRWRpdG9yIGVkaXRvciwgSUVkaXRvcklucHV0IGlucHV0LCBib29sZWFuIHByaW1hcnkpIHsKLQkJc3VwZXIoZWRpdG9yLCBpbnB1dCwgcHJpbWFyeSk7Ci0JfQorICAgIHB1YmxpYyBTcHJpbmdCdW5kbGVJbnB1dENvbnRleHQoUERFRm9ybUVkaXRvciBlZGl0b3IsIElFZGl0b3JJbnB1dCBpbnB1dCwgYm9vbGVhbiBwcmltYXJ5KSB7CisgICAgICAgIHN1cGVyKGVkaXRvciwgaW5wdXQsIHByaW1hcnkpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJQmFzZU1vZGVsIGNyZWF0ZU1vZGVsKElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTcHJpbmdCdW5kbGVNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWJvb2xlYW4gaXNSZWNvbmNpbGluZyA9IGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dDsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGlucHV0KTsKLQkJbW9kZWwgPSBuZXcgU3ByaW5nQnVuZGxlTW9kZWwoZG9jdW1lbnQsIGlzUmVjb25jaWxpbmcpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZSBmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpOwotCQkJbW9kZWwuc2V0VW5kZXJseWluZ1Jlc291cmNlKGZpbGUpOwotCQkJbW9kZWwuc2V0Q2hhcnNldChmaWxlLmdldENoYXJzZXQoKSk7Ci0JCX0gZWxzZSBpZiAoUGRlQ29tcGF0aWJpbGl0eVV0aWwuaXNTeXN0ZW1GaWxlRWRpdG9ySW5wdXQoaW5wdXQpKSB7Ci0JCQlGaWxlIGZpbGUgPSAoRmlsZSkgKGlucHV0KS5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLnJlbW92ZUxhc3RTZWdtZW50cygyKTsKLQkJCW1vZGVsLnNldEluc3RhbGxMb2NhdGlvbihwYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkudG9TdHJpbmcoKSk7Ci0JCQltb2RlbC5zZXRDaGFyc2V0KGdldERlZmF1bHRDaGFyc2V0KCkpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSVVSSUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZVN0b3JlIHN0b3JlID0gRUZTLmdldFN0b3JlKCgoSVVSSUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0VVJJKCkpOwotCQkJbW9kZWwuc2V0SW5zdGFsbExvY2F0aW9uKHN0b3JlLmdldFBhcmVudCgpLmdldFBhcmVudCgpLnRvU3RyaW5nKCkpOwotCQkJbW9kZWwuc2V0Q2hhcnNldChnZXREZWZhdWx0Q2hhcnNldCgpKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEphckVudHJ5RWRpdG9ySW5wdXQpIHsKLQkJCUZpbGUgZmlsZSA9IChGaWxlKSAoKEphckVudHJ5RWRpdG9ySW5wdXQpIGlucHV0KS5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwotCQkJbW9kZWwuc2V0SW5zdGFsbExvY2F0aW9uKGZpbGUudG9TdHJpbmcoKSk7Ci0JCQltb2RlbC5zZXRDaGFyc2V0KGdldERlZmF1bHRDaGFyc2V0KCkpOwotCQl9IGVsc2UgewotCQkJbW9kZWwuc2V0Q2hhcnNldChnZXREZWZhdWx0Q2hhcnNldCgpKTsKLQkJfQotCQltb2RlbC5sb2FkKCk7Ci0JCXJldHVybiBtb2RlbDsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIElCYXNlTW9kZWwgY3JlYXRlTW9kZWwoSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIFNwcmluZ0J1bmRsZU1vZGVsIG1vZGVsID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBpc1JlY29uY2lsaW5nID0gaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0OworICAgICAgICBJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoaW5wdXQpOworICAgICAgICBtb2RlbCA9IG5ldyBTcHJpbmdCdW5kbGVNb2RlbChkb2N1bWVudCwgaXNSZWNvbmNpbGluZyk7CisgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKKyAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRGaWxlKCk7CisgICAgICAgICAgICBtb2RlbC5zZXRVbmRlcmx5aW5nUmVzb3VyY2UoZmlsZSk7CisgICAgICAgICAgICBtb2RlbC5zZXRDaGFyc2V0KGZpbGUuZ2V0Q2hhcnNldCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChQZGVDb21wYXRpYmlsaXR5VXRpbC5pc1N5c3RlbUZpbGVFZGl0b3JJbnB1dChpbnB1dCkpIHsKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IGlucHV0LmdldEFkYXB0ZXIoRmlsZS5jbGFzcyk7CisgICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkucmVtb3ZlTGFzdFNlZ21lbnRzKDIpOworICAgICAgICAgICAgbW9kZWwuc2V0SW5zdGFsbExvY2F0aW9uKHBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIG1vZGVsLnNldENoYXJzZXQoZ2V0RGVmYXVsdENoYXJzZXQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJVVJJRWRpdG9ySW5wdXQpIHsKKyAgICAgICAgICAgIElGaWxlU3RvcmUgc3RvcmUgPSBFRlMuZ2V0U3RvcmUoKChJVVJJRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRVUkkoKSk7CisgICAgICAgICAgICBtb2RlbC5zZXRJbnN0YWxsTG9jYXRpb24oc3RvcmUuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBtb2RlbC5zZXRDaGFyc2V0KGdldERlZmF1bHRDaGFyc2V0KCkpOworICAgICAgICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSmFyRW50cnlFZGl0b3JJbnB1dCkgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gKChKYXJFbnRyeUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKKyAgICAgICAgICAgIG1vZGVsLnNldEluc3RhbGxMb2NhdGlvbihmaWxlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgbW9kZWwuc2V0Q2hhcnNldChnZXREZWZhdWx0Q2hhcnNldCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1vZGVsLnNldENoYXJzZXQoZ2V0RGVmYXVsdENoYXJzZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgbW9kZWwubG9hZCgpOworICAgICAgICByZXR1cm4gbW9kZWw7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL1NwcmluZ0J1bmRsZVNvdXJjZVBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvU3ByaW5nQnVuZGxlU291cmNlUGFnZS5qYXZhCmluZGV4IDZhNzM1MDMuLmU1NDA4Y2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvU3ByaW5nQnVuZGxlU291cmNlUGFnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvU3ByaW5nQnVuZGxlU291cmNlUGFnZS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTg0LDM2OCArODUsMzcwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTcHJpbmdCdW5kbGVTb3VyY2VQYWdlIGV4dGVuZHMgQnVuZGxlU291cmNlUGFnZSB7CiAKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBJRF9DT05URVhUX01FTlUgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmJ1bmRsZW1hbmlmZXN0LnRleHQubWVudSI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSURfQ09OVEVYVF9NRU5VID0gIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS5idW5kbGVtYW5pZmVzdC50ZXh0Lm1lbnUiOwogCi0JcHJpdmF0ZSBJRm9sZGluZ1N0cnVjdHVyZVByb3ZpZGVyIGZGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBJRm9sZGluZ1N0cnVjdHVyZVByb3ZpZGVyIGZGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXI7CiAKLQlwcml2YXRlIGZpbmFsIENoYW5nZUF3YXJlU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBmQ29uZmlndXJhdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIENoYW5nZUF3YXJlU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBmQ29uZmlndXJhdGlvbjsKIAotCXB1YmxpYyBTcHJpbmdCdW5kbGVTb3VyY2VQYWdlKFBERUZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihlZGl0b3IsIGlkLCB0aXRsZSk7Ci0JCWZDb25maWd1cmF0aW9uID0gY3JlYXRlU291cmNlVmlld2VyQ29uZmlndXJhdGlvbihCdW5kbGVDb2xvck1hbmFnZXIuZ2V0RGVmYXVsdCgpKTsKLQkJaWYgKGZDb25maWd1cmF0aW9uICE9IG51bGwpIHsKLQkJCXNldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oZkNvbmZpZ3VyYXRpb24pOwotCQl9Ci0JfQorICAgIHB1YmxpYyBTcHJpbmdCdW5kbGVTb3VyY2VQYWdlKFBERUZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgeworICAgICAgICBzdXBlcihlZGl0b3IsIGlkLCB0aXRsZSk7CisgICAgICAgIHRoaXMuZkNvbmZpZ3VyYXRpb24gPSBjcmVhdGVTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKEJ1bmRsZUNvbG9yTWFuYWdlci5nZXREZWZhdWx0KCkpOworICAgICAgICBpZiAodGhpcy5mQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKHRoaXMuZkNvbmZpZ3VyYXRpb24pOworICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIENoYW5nZUF3YXJlU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjcmVhdGVTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKElDb2xvck1hbmFnZXIgY29sb3JNYW5hZ2VyKSB7Ci0JCXJldHVybiBuZXcgQnVuZGxlTWFuaWZlc3RDb25maWd1cmF0aW9uKGNvbG9yTWFuYWdlciwgdGhpcyk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBDaGFuZ2VBd2FyZVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY3JlYXRlU291cmNlVmlld2VyQ29uZmlndXJhdGlvbihJQ29sb3JNYW5hZ2VyIGNvbG9yTWFuYWdlcikgeworICAgICAgICByZXR1cm4gbmV3IEJ1bmRsZU1hbmlmZXN0Q29uZmlndXJhdGlvbihjb2xvck1hbmFnZXIsIHRoaXMpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldEVkaXRvckNvbnRleHRNZW51SWQoU3RyaW5nIGNvbnRleHRNZW51SWQpIHsKLQkJc3VwZXIuc2V0RWRpdG9yQ29udGV4dE1lbnVJZChJRF9DT05URVhUX01FTlUpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRFZGl0b3JDb250ZXh0TWVudUlkKFN0cmluZyBjb250ZXh0TWVudUlkKSB7CisgICAgICAgIHN1cGVyLnNldEVkaXRvckNvbnRleHRNZW51SWQodGhpcy5JRF9DT05URVhUX01FTlUpOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25FbmFibGVkKCkgewotCQlJQmFzZU1vZGVsIG1vZGVsID0gZ2V0SW5wdXRDb250ZXh0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSUVkaXRpbmdNb2RlbCkgewotCQkJZkZvbGRpbmdTdHJ1Y3R1cmVQcm92aWRlciA9IGdldEZvbGRpbmdTdHJ1Y3R1cmVQcm92aWRlcigoSUVkaXRpbmdNb2RlbCkgbW9kZWwpOwotCQkJaWYgKGZGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCWZGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIuaW5pdGlhbGl6ZSgpOwotCQkJCUlSZWNvbmNpbGVyIHJlYyA9IGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRSZWNvbmNpbGVyKGdldFNvdXJjZVZpZXdlcigpKTsKLQkJCQlJUmVjb25jaWxpbmdTdHJhdGVneSBzdGFydGVneSA9IHJlYy5nZXRSZWNvbmNpbGluZ1N0cmF0ZWd5KG5ldyBTdHJpbmcoKSk7Ci0JCQkJaWYgKHN0YXJ0ZWd5IGluc3RhbmNlb2YgUmVjb25jaWxpbmdTdHJhdGVneSkgewotCQkJCQkoKFJlY29uY2lsaW5nU3RyYXRlZ3kpIHN0YXJ0ZWd5KS5hZGRQYXJ0aWNpcGFudChmRm9sZGluZ1N0cnVjdHVyZVByb3ZpZGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJvamVjdGlvbkVuYWJsZWQoKSB7CisgICAgICAgIElCYXNlTW9kZWwgbW9kZWwgPSBnZXRJbnB1dENvbnRleHQoKS5nZXRNb2RlbCgpOworICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJRWRpdGluZ01vZGVsKSB7CisgICAgICAgICAgICB0aGlzLmZGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIgPSBnZXRGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIoKElFZGl0aW5nTW9kZWwpIG1vZGVsKTsKKyAgICAgICAgICAgIGlmICh0aGlzLmZGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuZkZvbGRpbmdTdHJ1Y3R1cmVQcm92aWRlci5pbml0aWFsaXplKCk7CisgICAgICAgICAgICAgICAgSVJlY29uY2lsZXIgcmVjID0gZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldFJlY29uY2lsZXIoZ2V0U291cmNlVmlld2VyKCkpOworICAgICAgICAgICAgICAgIElSZWNvbmNpbGluZ1N0cmF0ZWd5IHN0YXJ0ZWd5ID0gcmVjLmdldFJlY29uY2lsaW5nU3RyYXRlZ3kobmV3IFN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRlZ3kgaW5zdGFuY2VvZiBSZWNvbmNpbGluZ1N0cmF0ZWd5KSB7CisgICAgICAgICAgICAgICAgICAgICgoUmVjb25jaWxpbmdTdHJhdGVneSkgc3RhcnRlZ3kpLmFkZFBhcnRpY2lwYW50KHRoaXMuZkZvbGRpbmdTdHJ1Y3R1cmVQcm92aWRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIElGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIgZ2V0Rm9sZGluZ1N0cnVjdHVyZVByb3ZpZGVyKElFZGl0aW5nTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgUGx1Z2luTW9kZWwpIHsKLQkJCXJldHVybiBuZXcgUGx1Z2luRm9sZGluZ1N0cnVjdHVyZVByb3ZpZGVyKHRoaXMsIG1vZGVsKTsKLQkJfQotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBCdW5kbGVNb2RlbCkgewotCQkJcmV0dXJuIG5ldyBTcHJpbmdCdW5kbGVGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIodGhpcywgbW9kZWwpOwotCQl9Ci0JCS8vIHJldHVybiBzdXBlci5nZXRGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIobW9kZWwpOwotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIElGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIgZ2V0Rm9sZGluZ1N0cnVjdHVyZVByb3ZpZGVyKElFZGl0aW5nTW9kZWwgbW9kZWwpIHsKKyAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgUGx1Z2luTW9kZWwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGx1Z2luRm9sZGluZ1N0cnVjdHVyZVByb3ZpZGVyKHRoaXMsIG1vZGVsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBCdW5kbGVNb2RlbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTcHJpbmdCdW5kbGVGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIodGhpcywgbW9kZWwpOworICAgICAgICB9CisgICAgICAgIC8vIHJldHVybiBzdXBlci5nZXRGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIobW9kZWwpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRGlzYWJsZWQoKSB7Ci0JCWZGb2xkaW5nU3RydWN0dXJlUHJvdmlkZXIgPSBudWxsOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRGlzYWJsZWQoKSB7CisgICAgICAgIHRoaXMuZkZvbGRpbmdTdHJ1Y3R1cmVQcm92aWRlciA9IG51bGw7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWZmZWN0c1RleHRQcmVzZW50YXRpb24oUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoZkNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmQ29uZmlndXJhdGlvbi5hZmZlY3RzVGV4dFByZXNlbnRhdGlvbihldmVudCkgfHwgc3VwZXIuYWZmZWN0c1RleHRQcmVzZW50YXRpb24oZXZlbnQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhZmZlY3RzVGV4dFByZXNlbnRhdGlvbihQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmICh0aGlzLmZDb25maWd1cmF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5mQ29uZmlndXJhdGlvbi5hZmZlY3RzVGV4dFByZXNlbnRhdGlvbihldmVudCkgfHwgc3VwZXIuYWZmZWN0c1RleHRQcmVzZW50YXRpb24oZXZlbnQpOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlmQ29uZmlndXJhdGlvbi5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICBpZiAodGhpcy5mQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmZDb25maWd1cmF0aW9uLmRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5kaXNwb3NlKCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJlZmVyZW5jZVN0b3JlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZkNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJCUlTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyID0gZ2V0U291cmNlVmlld2VyKCk7Ci0JCQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCWZDb25maWd1cmF0aW9uLmFkYXB0VG9QcmVmZXJlbmNlQ2hhbmdlKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlzdXBlci5oYW5kbGVQcmVmZXJlbmNlU3RvcmVDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcmVmZXJlbmNlU3RvcmVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0aGlzLmZDb25maWd1cmF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOworICAgICAgICAgICAgICAgIGlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmZDb25maWd1cmF0aW9uLmFkYXB0VG9QcmVmZXJlbmNlQ2hhbmdlKGV2ZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5oYW5kbGVQcmVmZXJlbmNlU3RvcmVDaGFuZ2VkKGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVkaXRvckNvbnRleHRNZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuZWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhtZW51KTsKLQkJUERFRm9ybUVkaXRvckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gKChQREVGb3JtRWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0Q29udHJpYnV0b3IoKTsKLQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgQnVuZGxlTWFuaWZlc3RFZGl0b3JDb250cmlidXRvcikgewotCQkJQnVuZGxlTWFuaWZlc3RFZGl0b3JDb250cmlidXRvciB0ZXh0Q29udHJpYnV0b3IgPSAoQnVuZGxlTWFuaWZlc3RFZGl0b3JDb250cmlidXRvcikgY29udHJpYnV0b3I7Ci0JCQlIeXBlcmxpbmtBY3Rpb24gYWN0aW9uID0gdGV4dENvbnRyaWJ1dG9yLmdldEh5cGVybGlua0FjdGlvbigpOwotCQkJaWYgKChhY3Rpb24gIT0gbnVsbCkgJiYgYWN0aW9uLmlzRW5hYmxlZCgpCi0JCQkJCSYmICgoYWN0aW9uLmdldEh5cGVyTGluaygpIGluc3RhbmNlb2YgRXh0ZW5zaW9uSHlwZXJMaW5rKSA9PSBmYWxzZSkpIHsKLQkJCQkvLyBBbm90aGVyIGRldGVjdG9yIGhhbmRsZXMgdGhpcyB0aGUgZXh0ZW5zaW9uIGh5cGVybGluayBjYXNlCi0JCQkJLy8gb3JnLmVjbGlwc2UucGRlLmludGVybmFsLnVpLmVkaXRvci5wbHVnaW4uCi0JCQkJLy8gRXh0ZW5zaW9uQXR0cmlidXRlUG9pbnREZWN0ZWN0b3IuamF2YQotCQkJCS8vIEltcGxlbWVudGVkIGF0IGEgaGlnaGVyIGxldmVsLiBBcyBhIHJlc3VsdCwgbmVlZCB0byBkaXNhYmxlCi0JCQkJLy8gdGhlIGFjdGlvbiBoZXJlIHRvIHByZXZlbnQgZHVwbGljYXRlIGVudHJpZXMgaW4gdGhlIGNvbnRleHQKLQkJCQkvLyBtZW51Ci0JCQkJbWVudS5hZGQoYWN0aW9uKTsKLQkJCX0KLQkJCU1hbmlmZXN0Rm9ybWF0QWN0aW9uIGZvcm1hdE1hbmlmZXN0QWN0aW9uID0gdGV4dENvbnRyaWJ1dG9yLmdldEZvcm1hdEFjdGlvbigpOwotCQkJaWYgKGZvcm1hdE1hbmlmZXN0QWN0aW9uICE9IG51bGwgJiYgZm9ybWF0TWFuaWZlc3RBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQkvLyBhZGQgZm9ybWF0IGFjdGlvbiBhZnRlciBPdXRsaW5lLiBUaGlzIGlzIHRoZSBzYW1lIG9yZGVyIGFzCi0JCQkJLy8gdGhlIGh5cGVybGluayBhY3Rpb25zCi0JCQkJbWVudS5pbnNlcnRBZnRlcihQREVBY3Rpb25Db25zdGFudHMuQ09NTUFORF9JRF9RVUlDS19PVVRMSU5FLCBmb3JtYXRNYW5pZmVzdEFjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgeworICAgICAgICBzdXBlci5lZGl0b3JDb250ZXh0TWVudUFib3V0VG9TaG93KG1lbnUpOworICAgICAgICBQREVGb3JtRWRpdG9yQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSAoKFBERUZvcm1FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRDb250cmlidXRvcigpOworICAgICAgICBpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBCdW5kbGVNYW5pZmVzdEVkaXRvckNvbnRyaWJ1dG9yKSB7CisgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdEVkaXRvckNvbnRyaWJ1dG9yIHRleHRDb250cmlidXRvciA9IChCdW5kbGVNYW5pZmVzdEVkaXRvckNvbnRyaWJ1dG9yKSBjb250cmlidXRvcjsKKyAgICAgICAgICAgIEh5cGVybGlua0FjdGlvbiBhY3Rpb24gPSB0ZXh0Q29udHJpYnV0b3IuZ2V0SHlwZXJsaW5rQWN0aW9uKCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwgJiYgYWN0aW9uLmlzRW5hYmxlZCgpICYmIGFjdGlvbi5nZXRIeXBlckxpbmsoKSBpbnN0YW5jZW9mIEV4dGVuc2lvbkh5cGVyTGluayA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIC8vIEFub3RoZXIgZGV0ZWN0b3IgaGFuZGxlcyB0aGlzIHRoZSBleHRlbnNpb24gaHlwZXJsaW5rIGNhc2UKKyAgICAgICAgICAgICAgICAvLyBvcmcuZWNsaXBzZS5wZGUuaW50ZXJuYWwudWkuZWRpdG9yLnBsdWdpbi4KKyAgICAgICAgICAgICAgICAvLyBFeHRlbnNpb25BdHRyaWJ1dGVQb2ludERlY3RlY3Rvci5qYXZhCisgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50ZWQgYXQgYSBoaWdoZXIgbGV2ZWwuIEFzIGEgcmVzdWx0LCBuZWVkIHRvIGRpc2FibGUKKyAgICAgICAgICAgICAgICAvLyB0aGUgYWN0aW9uIGhlcmUgdG8gcHJldmVudCBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUgY29udGV4dAorICAgICAgICAgICAgICAgIC8vIG1lbnUKKyAgICAgICAgICAgICAgICBtZW51LmFkZChhY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWFuaWZlc3RGb3JtYXRBY3Rpb24gZm9ybWF0TWFuaWZlc3RBY3Rpb24gPSB0ZXh0Q29udHJpYnV0b3IuZ2V0Rm9ybWF0QWN0aW9uKCk7CisgICAgICAgICAgICBpZiAoZm9ybWF0TWFuaWZlc3RBY3Rpb24gIT0gbnVsbCAmJiBmb3JtYXRNYW5pZmVzdEFjdGlvbi5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIC8vIGFkZCBmb3JtYXQgYWN0aW9uIGFmdGVyIE91dGxpbmUuIFRoaXMgaXMgdGhlIHNhbWUgb3JkZXIgYXMKKyAgICAgICAgICAgICAgICAvLyB0aGUgaHlwZXJsaW5rIGFjdGlvbnMKKyAgICAgICAgICAgICAgICBtZW51Lmluc2VydEFmdGVyKFBERUFjdGlvbkNvbnN0YW50cy5DT01NQU5EX0lEX1FVSUNLX09VVExJTkUsIGZvcm1hdE1hbmlmZXN0QWN0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJUERFRm9ybUVkaXRvckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gKChQREVGb3JtRWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0Q29udHJpYnV0b3IoKTsKLQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgQnVuZGxlTWFuaWZlc3RFZGl0b3JDb250cmlidXRvcikgewotCQkJQnVuZGxlTWFuaWZlc3RFZGl0b3JDb250cmlidXRvciB0ZXh0Q29udHJpYnV0b3IgPSAoQnVuZGxlTWFuaWZlc3RFZGl0b3JDb250cmlidXRvcikgY29udHJpYnV0b3I7Ci0JCQlzZXRBY3Rpb24oUERFQWN0aW9uQ29uc3RhbnRzLk9QRU4sIHRleHRDb250cmlidXRvci5nZXRIeXBlcmxpbmtBY3Rpb24oKSk7Ci0JCQlzZXRBY3Rpb24oUERFQWN0aW9uQ29uc3RhbnRzLkZPUk1BVCwgdGV4dENvbnRyaWJ1dG9yLmdldEZvcm1hdEFjdGlvbigpKTsKLQkJCWlmICh0ZXh0Q29udHJpYnV0b3Iuc3VwcG9ydHNDb250ZW50QXNzaXN0KCkpIHsKLQkJCQljcmVhdGVDb250ZW50QXNzaXN0QWN0aW9uKCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKKyAgICAgICAgc3VwZXIuY3JlYXRlQWN0aW9ucygpOworICAgICAgICBQREVGb3JtRWRpdG9yQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSAoKFBERUZvcm1FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRDb250cmlidXRvcigpOworICAgICAgICBpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBCdW5kbGVNYW5pZmVzdEVkaXRvckNvbnRyaWJ1dG9yKSB7CisgICAgICAgICAgICBCdW5kbGVNYW5pZmVzdEVkaXRvckNvbnRyaWJ1dG9yIHRleHRDb250cmlidXRvciA9IChCdW5kbGVNYW5pZmVzdEVkaXRvckNvbnRyaWJ1dG9yKSBjb250cmlidXRvcjsKKyAgICAgICAgICAgIHNldEFjdGlvbihQREVBY3Rpb25Db25zdGFudHMuT1BFTiwgdGV4dENvbnRyaWJ1dG9yLmdldEh5cGVybGlua0FjdGlvbigpKTsKKyAgICAgICAgICAgIHNldEFjdGlvbihQREVBY3Rpb25Db25zdGFudHMuRk9STUFULCB0ZXh0Q29udHJpYnV0b3IuZ2V0Rm9ybWF0QWN0aW9uKCkpOworICAgICAgICAgICAgaWYgKHRleHRDb250cmlidXRvci5zdXBwb3J0c0NvbnRlbnRBc3Npc3QoKSkgeworICAgICAgICAgICAgICAgIGNyZWF0ZUNvbnRlbnRBc3Npc3RBY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50QXNzaXN0QWN0aW9uKCkgewotCQlJQWN0aW9uIGNvbnRlbnRBc3Npc3QgPSBuZXcgQ29udGVudEFzc2lzdEFjdGlvbihnZXRCdW5kbGVGb3JDb25zdHJ1Y3RlZEtleXMoKSwgIkNvbnRlbnRBc3Npc3RQcm9wb3NhbC4iLCB0aGlzKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZW50QXNzaXN0LnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuQ09OVEVOVF9BU1NJU1RfUFJPUE9TQUxTKTsKLQkJc2V0QWN0aW9uKCJDb250ZW50QXNzaXN0IiwgY29udGVudEFzc2lzdCk7IC8vJE5PTi1OTFMtMSQKLQkJbWFya0FzU3RhdGVEZXBlbmRlbnRBY3Rpb24oIkNvbnRlbnRBc3Npc3QiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQorICAgIHByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50QXNzaXN0QWN0aW9uKCkgeworICAgICAgICBJQWN0aW9uIGNvbnRlbnRBc3Npc3QgPSBuZXcgQ29udGVudEFzc2lzdEFjdGlvbihnZXRCdW5kbGVGb3JDb25zdHJ1Y3RlZEtleXMoKSwgIkNvbnRlbnRBc3Npc3RQcm9wb3NhbC4iLCB0aGlzKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBjb250ZW50QXNzaXN0LnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuQ09OVEVOVF9BU1NJU1RfUFJPUE9TQUxTKTsKKyAgICAgICAgc2V0QWN0aW9uKCJDb250ZW50QXNzaXN0IiwgY29udGVudEFzc2lzdCk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgbWFya0FzU3RhdGVEZXBlbmRlbnRBY3Rpb24oIkNvbnRlbnRBc3Npc3QiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAorICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBjcmVhdGVPdXRsaW5lTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBTcHJpbmdCdW5kbGVMYWJlbFByb3ZpZGVyKCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJTGFiZWxQcm92aWRlciBjcmVhdGVPdXRsaW5lTGFiZWxQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTcHJpbmdCdW5kbGVMYWJlbFByb3ZpZGVyKCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElUcmVlQ29udGVudFByb3ZpZGVyIGNyZWF0ZU91dGxpbmVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgU3ByaW5nQnVuZGxlT3V0bGluZUNvbnRlbnRQcm92aWRlcigpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVRyZWVDb250ZW50UHJvdmlkZXIgY3JlYXRlT3V0bGluZUNvbnRlbnRQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTcHJpbmdCdW5kbGVPdXRsaW5lQ29udGVudFByb3ZpZGVyKCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElEb2N1bWVudFJhbmdlIGZpbmRSYW5nZSgpIHsKLQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgPSBudWxsOwotCQlDbGFzcyBjbGFzc0FuY2VzdG9yID0gdGhpcy5nZXRDbGFzcygpOwotCQl3aGlsZSAoY2xhc3NBbmNlc3RvciAhPSBPYmplY3QuY2xhc3MpIHsKLQkJCXRyeSB7Ci0JCQkJZmllbGQgPSBjbGFzc0FuY2VzdG9yLmdldERlY2xhcmVkRmllbGQoImZTZWxlY3Rpb24iKTsKLQkJCQlicmVhazsKLQkJCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCS8vIG1laCwganVzdCBtb3ZlIHVwIHRoZSBoaWVyYXJjaHkKLQkJCWNsYXNzQW5jZXN0b3IgPSBjbGFzc0FuY2VzdG9yLmdldFN1cGVyY2xhc3MoKTsKLQkJfQotCQlpZiAoZmllbGQgIT0gbnVsbCkgewotCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCU9iamVjdCBzZWxlY3Rpb247Ci0JCQl0cnkgewotCQkJCXNlbGVjdGlvbiA9IGZpZWxkLmdldCh0aGlzKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yIiwgZSk7Ci0JCQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElEb2N1bWVudFJhbmdlIGZpbmRSYW5nZSgpIHsKKyAgICAgICAgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgPSBudWxsOworICAgICAgICBDbGFzcyBjbGFzc0FuY2VzdG9yID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICB3aGlsZSAoY2xhc3NBbmNlc3RvciAhPSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmllbGQgPSBjbGFzc0FuY2VzdG9yLmdldERlY2xhcmVkRmllbGQoImZTZWxlY3Rpb24iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG1laCwganVzdCBtb3ZlIHVwIHRoZSBoaWVyYXJjaHkKKyAgICAgICAgICAgIGNsYXNzQW5jZXN0b3IgPSBjbGFzc0FuY2VzdG9yLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIE9iamVjdCBzZWxlY3Rpb247CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9IGZpZWxkLmdldCh0aGlzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIEVycm9yIiwgZSk7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJbXBvcnRMaWJyYXJ5T2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldFNwZWNpZmljUmFuZ2UoKChJbXBvcnRMaWJyYXJ5T2JqZWN0KSBzZWxlY3Rpb24pLmdldE1vZGVsKCksIElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlksCi0JCQkJCQkoKEltcG9ydExpYnJhcnlPYmplY3QpIHNlbGVjdGlvbikuZ2V0SWQoKSk7Ci0JCQl9IGVsc2UgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIEltcG9ydEJ1bmRsZU9iamVjdCkgewotCQkJCXJldHVybiBnZXRTcGVjaWZpY1JhbmdlKCgoSW1wb3J0QnVuZGxlT2JqZWN0KSBzZWxlY3Rpb24pLmdldE1vZGVsKCksIElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSwKLQkJCQkJCSgoSW1wb3J0QnVuZGxlT2JqZWN0KSBzZWxlY3Rpb24pLmdldElkKCkpOwotCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJbXBvcnRQYWNrYWdlT2JqZWN0KSB7Ci0JCQkJSW1wb3J0UGFja2FnZU9iamVjdCBpbXBPYmogPSAoSW1wb3J0UGFja2FnZU9iamVjdCkgc2VsZWN0aW9uOwotCQkJCVN0cmluZyBrZXkgPSBpbXBPYmouZ2V0SGVhZGVyKCkuZ2V0S2V5KCk7Ci0JCQkJaWYgKGtleSAhPSBudWxsICYmIGtleS5lcXVhbHNJZ25vcmVDYXNlKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX1RFTVBMQVRFKSkgewotCQkJCQlyZXR1cm4gZ2V0U3BlY2lmaWNSYW5nZSgoKEltcG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGlvbikuZ2V0TW9kZWwoKSwKLQkJCQkJCQlJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9URU1QTEFURSwgKChJbXBvcnRQYWNrYWdlT2JqZWN0KSBzZWxlY3Rpb24pLmdldFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9JTVBPUlRTKSkgewotCQkJCQlyZXR1cm4gZ2V0U3BlY2lmaWNSYW5nZSgoKEltcG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGlvbikuZ2V0TW9kZWwoKSwKLQkJCQkJCQlJSGVhZGVyQ29uc3RhbnRzLkVYQ0xVREVEX0lNUE9SVFMsICgoSW1wb3J0UGFja2FnZU9iamVjdCkgc2VsZWN0aW9uKS5nZXRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKGtleSAhPSBudWxsICYmIGtleS5lcXVhbHNJZ25vcmVDYXNlKElIZWFkZXJDb25zdGFudHMuVU5WRVJTSU9ORURfSU1QT1JUUykpIHsKLQkJCQkJcmV0dXJuIGdldFNwZWNpZmljUmFuZ2UoKChJbXBvcnRQYWNrYWdlT2JqZWN0KSBzZWxlY3Rpb24pLmdldE1vZGVsKCksCi0JCQkJCQkJSUhlYWRlckNvbnN0YW50cy5VTlZFUlNJT05FRF9JTVBPUlRTLCAoKEltcG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGlvbikuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBFeHBvcnRQYWNrYWdlT2JqZWN0KSB7Ci0JCQkJRXhwb3J0UGFja2FnZU9iamVjdCBleHBPYmogPSAoRXhwb3J0UGFja2FnZU9iamVjdCkgc2VsZWN0aW9uOwotCQkJCVN0cmluZyBrZXkgPSBleHBPYmouZ2V0SGVhZGVyKCkuZ2V0S2V5KCk7Ci0JCQkJaWYgKGtleSAhPSBudWxsICYmIGtleS5lcXVhbHNJZ25vcmVDYXNlKElIZWFkZXJDb25zdGFudHMuRVhQT1JUX1RFTVBMQVRFKSkgewotCQkJCQlyZXR1cm4gZ2V0U3BlY2lmaWNSYW5nZSgoKEV4cG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGlvbikuZ2V0TW9kZWwoKSwKLQkJCQkJCQlJSGVhZGVyQ29uc3RhbnRzLkVYUE9SVF9URU1QTEFURSwgKChFeHBvcnRQYWNrYWdlT2JqZWN0KSBzZWxlY3Rpb24pLmdldFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9FWFBPUlRTKSkgewotCQkJCQlyZXR1cm4gZ2V0U3BlY2lmaWNSYW5nZSgoKEV4cG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGlvbikuZ2V0TW9kZWwoKSwKLQkJCQkJCQlJSGVhZGVyQ29uc3RhbnRzLkVYQ0xVREVEX0VYUE9SVFMsICgoRXhwb3J0UGFja2FnZU9iamVjdCkgc2VsZWN0aW9uKS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmZpbmRSYW5nZSgpOwotCX0KKyAgICAgICAgICAgIGlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJbXBvcnRMaWJyYXJ5T2JqZWN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNwZWNpZmljUmFuZ2UoKChJbXBvcnRMaWJyYXJ5T2JqZWN0KSBzZWxlY3Rpb24pLmdldE1vZGVsKCksIElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlksCisgICAgICAgICAgICAgICAgICAgICgoSW1wb3J0TGlicmFyeU9iamVjdCkgc2VsZWN0aW9uKS5nZXRJZCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSW1wb3J0QnVuZGxlT2JqZWN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNwZWNpZmljUmFuZ2UoKChJbXBvcnRCdW5kbGVPYmplY3QpIHNlbGVjdGlvbikuZ2V0TW9kZWwoKSwgSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfQlVORExFLAorICAgICAgICAgICAgICAgICAgICAoKEltcG9ydEJ1bmRsZU9iamVjdCkgc2VsZWN0aW9uKS5nZXRJZCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSW1wb3J0UGFja2FnZU9iamVjdCkgeworICAgICAgICAgICAgICAgIEltcG9ydFBhY2thZ2VPYmplY3QgaW1wT2JqID0gKEltcG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGlvbjsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gaW1wT2JqLmdldEhlYWRlcigpLmdldEtleSgpOworICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCAmJiBrZXkuZXF1YWxzSWdub3JlQ2FzZShJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9URU1QTEFURSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNwZWNpZmljUmFuZ2UoKChJbXBvcnRQYWNrYWdlT2JqZWN0KSBzZWxlY3Rpb24pLmdldE1vZGVsKCksIElIZWFkZXJDb25zdGFudHMuSU1QT1JUX1RFTVBMQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgKChJbXBvcnRQYWNrYWdlT2JqZWN0KSBzZWxlY3Rpb24pLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9JTVBPUlRTKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3BlY2lmaWNSYW5nZSgoKEltcG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGlvbikuZ2V0TW9kZWwoKSwgSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9JTVBPUlRTLAorICAgICAgICAgICAgICAgICAgICAgICAgKChJbXBvcnRQYWNrYWdlT2JqZWN0KSBzZWxlY3Rpb24pLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5VTlZFUlNJT05FRF9JTVBPUlRTKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3BlY2lmaWNSYW5nZSgoKEltcG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGlvbikuZ2V0TW9kZWwoKSwgSUhlYWRlckNvbnN0YW50cy5VTlZFUlNJT05FRF9JTVBPUlRTLAorICAgICAgICAgICAgICAgICAgICAgICAgKChJbXBvcnRQYWNrYWdlT2JqZWN0KSBzZWxlY3Rpb24pLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgRXhwb3J0UGFja2FnZU9iamVjdCkgeworICAgICAgICAgICAgICAgIEV4cG9ydFBhY2thZ2VPYmplY3QgZXhwT2JqID0gKEV4cG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGlvbjsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gZXhwT2JqLmdldEhlYWRlcigpLmdldEtleSgpOworICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCAmJiBrZXkuZXF1YWxzSWdub3JlQ2FzZShJSGVhZGVyQ29uc3RhbnRzLkVYUE9SVF9URU1QTEFURSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNwZWNpZmljUmFuZ2UoKChFeHBvcnRQYWNrYWdlT2JqZWN0KSBzZWxlY3Rpb24pLmdldE1vZGVsKCksIElIZWFkZXJDb25zdGFudHMuRVhQT1JUX1RFTVBMQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgKChFeHBvcnRQYWNrYWdlT2JqZWN0KSBzZWxlY3Rpb24pLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9FWFBPUlRTKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3BlY2lmaWNSYW5nZSgoKEV4cG9ydFBhY2thZ2VPYmplY3QpIHNlbGVjdGlvbikuZ2V0TW9kZWwoKSwgSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9FWFBPUlRTLAorICAgICAgICAgICAgICAgICAgICAgICAgKChFeHBvcnRQYWNrYWdlT2JqZWN0KSBzZWxlY3Rpb24pLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuZmluZFJhbmdlKCk7CisgICAgfQogCi0JcHJpdmF0ZSBjbGFzcyBTcHJpbmdCdW5kbGVPdXRsaW5lQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKKyAgICBwcml2YXRlIGNsYXNzIFNwcmluZ0J1bmRsZU91dGxpbmVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewogCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQkvLyBOZWVkIGFuIGlkZW50aWZ5aW5nIGNsYXNzIGZvciBsYWJlbCBwcm92aWRlcgotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEltcG9ydFBhY2thZ2VIZWFkZXIpIHsKLQkJCQlyZXR1cm4gKChJbXBvcnRQYWNrYWdlSGVhZGVyKSBwYXJlbnQpLmdldFBhY2thZ2VzKCk7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEV4cG9ydFBhY2thZ2VIZWFkZXIpIHsKLQkJCQlyZXR1cm4gKChFeHBvcnRQYWNrYWdlSGVhZGVyKSBwYXJlbnQpLmdldFBhY2thZ2VzKCk7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnRIZWFkZXIpIHsKLQkJCQlyZXR1cm4gKChSZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50SGVhZGVyKSBwYXJlbnQpLmdldEVudmlyb25tZW50cygpOwotCQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBSZXF1aXJlQnVuZGxlSGVhZGVyKSB7Ci0JCQkJcmV0dXJuICgoUmVxdWlyZUJ1bmRsZUhlYWRlcikgcGFyZW50KS5nZXRSZXF1aXJlZEJ1bmRsZXMoKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQnVuZGxlQ2xhc3NwYXRoSGVhZGVyKSB7Ci0JCQkJcmV0dXJuIGdldFBsdWdpbkxpYnJhcmllcygpOwotCQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJbXBvcnRCdW5kbGVIZWFkZXIpIHsKLQkJCQlyZXR1cm4gKChJbXBvcnRCdW5kbGVIZWFkZXIpIHBhcmVudCkuZ2V0SW1wb3J0ZWRCdW5kbGVzKCk7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEltcG9ydExpYnJhcnlIZWFkZXIpIHsKLQkJCQlyZXR1cm4gKChJbXBvcnRMaWJyYXJ5SGVhZGVyKSBwYXJlbnQpLmdldEltcG9ydGVkTGlicmFyaWVzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQorICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgeworICAgICAgICAgICAgLy8gTmVlZCBhbiBpZGVudGlmeWluZyBjbGFzcyBmb3IgbGFiZWwgcHJvdmlkZXIKKyAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJbXBvcnRQYWNrYWdlSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoSW1wb3J0UGFja2FnZUhlYWRlcikgcGFyZW50KS5nZXRQYWNrYWdlcygpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBFeHBvcnRQYWNrYWdlSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoRXhwb3J0UGFja2FnZUhlYWRlcikgcGFyZW50KS5nZXRQYWNrYWdlcygpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBSZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50SGVhZGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudEhlYWRlcikgcGFyZW50KS5nZXRFbnZpcm9ubWVudHMoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgUmVxdWlyZUJ1bmRsZUhlYWRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiAoKFJlcXVpcmVCdW5kbGVIZWFkZXIpIHBhcmVudCkuZ2V0UmVxdWlyZWRCdW5kbGVzKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJ1bmRsZUNsYXNzcGF0aEhlYWRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRQbHVnaW5MaWJyYXJpZXMoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgSW1wb3J0QnVuZGxlSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoSW1wb3J0QnVuZGxlSGVhZGVyKSBwYXJlbnQpLmdldEltcG9ydGVkQnVuZGxlcygpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBJbXBvcnRMaWJyYXJ5SGVhZGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoSW1wb3J0TGlicmFyeUhlYWRlcikgcGFyZW50KS5nZXRJbXBvcnRlZExpYnJhcmllcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07CisgICAgICAgIH0KIAotCQlwcml2YXRlIE9iamVjdFtdIGdldFBsdWdpbkxpYnJhcmllcygpIHsKLQkJCUlQbHVnaW5MaWJyYXJ5W10gbGlicmFyaWVzID0gZ2V0QnVuZGxlQ2xhc3NwYXRoTGlicmFyaWVzKCk7Ci0JCQlpZiAoKGxpYnJhcmllcyA9PSBudWxsKSB8fCAobGlicmFyaWVzLmxlbmd0aCA9PSAwKSkgewotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCQkJcmV0dXJuIGxpYnJhcmllczsKLQkJfQorICAgICAgICBwcml2YXRlIE9iamVjdFtdIGdldFBsdWdpbkxpYnJhcmllcygpIHsKKyAgICAgICAgICAgIElQbHVnaW5MaWJyYXJ5W10gbGlicmFyaWVzID0gZ2V0QnVuZGxlQ2xhc3NwYXRoTGlicmFyaWVzKCk7CisgICAgICAgICAgICBpZiAobGlicmFyaWVzID09IG51bGwgfHwgbGlicmFyaWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGlicmFyaWVzOworICAgICAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuKHBhcmVudCkubGVuZ3RoID4gMDsKLQkJfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hpbGRyZW4ocGFyZW50KS5sZW5ndGggPiAwOworICAgICAgICB9CiAKLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGNoaWxkKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgY2hpbGQpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CiAKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnVuZGxlTW9kZWwpIHsKLQkJCQlCdW5kbGVNb2RlbCBtb2RlbCA9IChCdW5kbGVNb2RlbCkgcGFyZW50OwotCQkJCU1hcCBtYW5pZmVzdCA9ICgoQnVuZGxlKSBtb2RlbC5nZXRCdW5kbGUoKSkuZ2V0SGVhZGVycygpOwotCQkJCUFycmF5TGlzdCBrZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgZWxlbWVudHMgPSBtYW5pZmVzdC5rZXlTZXQoKS5pdGVyYXRvcigpOyBlbGVtZW50cy5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlEb2N1bWVudEtleSBrZXkgPSAoSURvY3VtZW50S2V5KSBtYW5pZmVzdC5nZXQoZWxlbWVudHMubmV4dCgpKTsKLQkJCQkJaWYgKGtleS5nZXRPZmZzZXQoKSA+IC0xKSB7Ci0JCQkJCQlrZXlzLmFkZChrZXkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBrZXlzLnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0JfQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBwYXJlbnQpIHsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBCdW5kbGVNb2RlbCkgeworICAgICAgICAgICAgICAgIEJ1bmRsZU1vZGVsIG1vZGVsID0gKEJ1bmRsZU1vZGVsKSBwYXJlbnQ7CisgICAgICAgICAgICAgICAgTWFwIG1hbmlmZXN0ID0gKChCdW5kbGUpIG1vZGVsLmdldEJ1bmRsZSgpKS5nZXRIZWFkZXJzKCk7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0IGtleXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBlbGVtZW50cyA9IG1hbmlmZXN0LmtleVNldCgpLml0ZXJhdG9yKCk7IGVsZW1lbnRzLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgICAgICAgICAgSURvY3VtZW50S2V5IGtleSA9IChJRG9jdW1lbnRLZXkpIG1hbmlmZXN0LmdldChlbGVtZW50cy5uZXh0KCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmdldE9mZnNldCgpID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleXMuYWRkKGtleSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGtleXMudG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbMF07CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIElQbHVnaW5MaWJyYXJ5W10gZ2V0QnVuZGxlQ2xhc3NwYXRoTGlicmFyaWVzKCkgewotCQkvLyBUaGUgYnVuZGxlIGNsYXNzcGF0aCBoZWFkZXIgaGFzIG5vIG1vZGVsIGRhdGEgbWVtYmVycwotCQkvLyBSZXRyaWV2ZSB0aGUgcGx1Zy1pbiBsaWJyYXJ5IGVxdWl2YWxlbnRzIGZyb20gdGhlIGVkaXRvciBtb2RlbAotCQlGb3JtRWRpdG9yIGVkaXRvciA9IGdldEVkaXRvcigpOwotCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgUERFRm9ybUVkaXRvcikgewotCQkJUERFRm9ybUVkaXRvciBmb3JtRWRpdG9yID0gKFBERUZvcm1FZGl0b3IpIGVkaXRvcjsKLQkJCUlCYXNlTW9kZWwgYmFzZU1vZGVsID0gZm9ybUVkaXRvci5nZXRBZ2dyZWdhdGVNb2RlbCgpOwotCQkJaWYgKGJhc2VNb2RlbCBpbnN0YW5jZW9mIElQbHVnaW5Nb2RlbEJhc2UpIHsKLQkJCQlJUGx1Z2luTGlicmFyeVtdIGxpYnJhcmllcyA9ICgoSVBsdWdpbk1vZGVsQmFzZSkgYmFzZU1vZGVsKS5nZXRQbHVnaW5CYXNlKCkuZ2V0TGlicmFyaWVzKCk7Ci0JCQkJcmV0dXJuIGxpYnJhcmllczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgcHJpdmF0ZSBJUGx1Z2luTGlicmFyeVtdIGdldEJ1bmRsZUNsYXNzcGF0aExpYnJhcmllcygpIHsKKyAgICAgICAgLy8gVGhlIGJ1bmRsZSBjbGFzc3BhdGggaGVhZGVyIGhhcyBubyBtb2RlbCBkYXRhIG1lbWJlcnMKKyAgICAgICAgLy8gUmV0cmlldmUgdGhlIHBsdWctaW4gbGlicmFyeSBlcXVpdmFsZW50cyBmcm9tIHRoZSBlZGl0b3IgbW9kZWwKKyAgICAgICAgRm9ybUVkaXRvciBlZGl0b3IgPSBnZXRFZGl0b3IoKTsKKyAgICAgICAgaWYgKGVkaXRvciBpbnN0YW5jZW9mIFBERUZvcm1FZGl0b3IpIHsKKyAgICAgICAgICAgIFBERUZvcm1FZGl0b3IgZm9ybUVkaXRvciA9IChQREVGb3JtRWRpdG9yKSBlZGl0b3I7CisgICAgICAgICAgICBJQmFzZU1vZGVsIGJhc2VNb2RlbCA9IGZvcm1FZGl0b3IuZ2V0QWdncmVnYXRlTW9kZWwoKTsKKyAgICAgICAgICAgIGlmIChiYXNlTW9kZWwgaW5zdGFuY2VvZiBJUGx1Z2luTW9kZWxCYXNlKSB7CisgICAgICAgICAgICAgICAgSVBsdWdpbkxpYnJhcnlbXSBsaWJyYXJpZXMgPSAoKElQbHVnaW5Nb2RlbEJhc2UpIGJhc2VNb2RlbCkuZ2V0UGx1Z2luQmFzZSgpLmdldExpYnJhcmllcygpOworICAgICAgICAgICAgICAgIHJldHVybiBsaWJyYXJpZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JcHJpdmF0ZSBjbGFzcyBTcHJpbmdCdW5kbGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCS8vIFRPRE86IE1QOiBRTzogTE9XOiBNb3ZlIHRvIFBERUxhYmVsUHJvdmlkZXIKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUGFja2FnZU9iamVjdCkgewotCQkJCXJldHVybiAoKFBhY2thZ2VPYmplY3QpIG9iaikuZ2V0TmFtZSgpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFeGVjdXRpb25FbnZpcm9ubWVudCkgewotCQkJCXJldHVybiAoKEV4ZWN1dGlvbkVudmlyb25tZW50KSBvYmopLmdldE5hbWUoKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUmVxdWlyZUJ1bmRsZU9iamVjdCkgewotCQkJCXJldHVybiBnZXRUZXh0UmVxdWlyZUJ1bmRsZSgoKFJlcXVpcmVCdW5kbGVPYmplY3QpIG9iaikpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJbXBvcnRMaWJyYXJ5T2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoSW1wb3J0TGlicmFyeU9iamVjdCkgb2JqKS5nZXRJZCgpOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJbXBvcnRCdW5kbGVPYmplY3QpIHsKLQkJCQlyZXR1cm4gKChJbXBvcnRCdW5kbGVPYmplY3QpIG9iaikuZ2V0SWQoKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWFuaWZlc3RIZWFkZXIpIHsKLQkJCQlyZXR1cm4gKChNYW5pZmVzdEhlYWRlcikgb2JqKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCQl9CisgICAgcHJpdmF0ZSBjbGFzcyBTcHJpbmdCdW5kbGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7CiAKLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dFJlcXVpcmVCdW5kbGUoUmVxdWlyZUJ1bmRsZU9iamVjdCBidW5kbGUpIHsKLQkJCVN0cmluZ0J1ZmZlciBsYWJlbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCS8vIEFwcGVuZCB0aGUgSUQKLQkJCWxhYmVsLmFwcGVuZChidW5kbGUuZ2V0SWQoKSk7Ci0JCQkvLyBHZXQgdGhlIHZlcnNpb24KLQkJCVN0cmluZyB2ZXJzaW9uID0gYnVuZGxlLmdldFZlcnNpb24oKTsKLQkJCS8vIElmIHRoZXJlIGlzIG5vIHZlcnNpb24sIGp1c3QgcmV0dXJuIHdoYXQgd2UgaGF2ZQotCQkJaWYgKCh2ZXJzaW9uID09IG51bGwpIHx8ICh2ZXJzaW9uLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQkvLyBBcHBlbmQgYSBzcGFjZQotCQkJbGFiZWwuYXBwZW5kKCcgJyk7Ci0JCQkvLyBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGRvZXMgbm90IGhhdmUgYSByYW5nZSBpbmRpY2F0b3IsCi0JCQkvLyBhZGQgYSBkZWZhdWx0IG9uZS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlcmUgaXMgb25seSBvbmUKLQkJCS8vIHZhbHVlIHNwZWNpZmllZCBmb3IgZWl0aGVyIG1pbiBvciBtYXgKLQkJCWNoYXIgZmlyc3RDaGFyID0gdmVyc2lvbi5jaGFyQXQoMCk7Ci0JCQlpZiAoKGZpcnN0Q2hhciAhPSAnKCcpICYmIChmaXJzdENoYXIgIT0gJ1snKSkgewotCQkJCWxhYmVsLmFwcGVuZCgnKCcpOwotCQkJfQotCQkJLy8gQXBwZW5kIHRoZSB2ZXJzaW9uCi0JCQlsYWJlbC5hcHBlbmQodmVyc2lvbik7Ci0JCQkvLyBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgZG9lcyBub3QgaGF2ZSBhIHJhbmdlIGluZGljYXRvciwKLQkJCS8vIGFkZCBhIGRlZmF1bHQgb25lLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGVyZSBpcyBvbmx5IG9uZQotCQkJLy8gdmFsdWUgc3BlY2lmaWVkIGZvciBlaXRoZXIgbWluIG9yIG1heAotCQkJY2hhciBsYXN0Q2hhciA9IHZlcnNpb24uY2hhckF0KHZlcnNpb24ubGVuZ3RoKCkgLSAxKTsKLQkJCWlmICgobGFzdENoYXIgIT0gJyknKSAmJiAobGFzdENoYXIgIT0gJ10nKSkgewotCQkJCWxhYmVsLmFwcGVuZCgnKScpOwotCQkJfQotCQkJLy8gUmV0dXJuIHdoYXQgd2UgaGF2ZQotCQkJcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCk7Ci0JCX0KKyAgICAgICAgLy8gVE9ETzogTVA6IFFPOiBMT1c6IE1vdmUgdG8gUERFTGFiZWxQcm92aWRlcgorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBQYWNrYWdlT2JqZWN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoUGFja2FnZU9iamVjdCkgb2JqKS5nZXROYW1lKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEV4ZWN1dGlvbkVudmlyb25tZW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoRXhlY3V0aW9uRW52aXJvbm1lbnQpIG9iaikuZ2V0TmFtZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSZXF1aXJlQnVuZGxlT2JqZWN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFRleHRSZXF1aXJlQnVuZGxlKChSZXF1aXJlQnVuZGxlT2JqZWN0KSBvYmopOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJbXBvcnRMaWJyYXJ5T2JqZWN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoSW1wb3J0TGlicmFyeU9iamVjdCkgb2JqKS5nZXRJZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJbXBvcnRCdW5kbGVPYmplY3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChJbXBvcnRCdW5kbGVPYmplY3QpIG9iaikuZ2V0SWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWFuaWZlc3RIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChNYW5pZmVzdEhlYWRlcikgb2JqKS5nZXROYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQlQREVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBQREVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQYWNrYWdlT2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0KFBERVBsdWdpbkltYWdlcy5ERVNDX1BBQ0tBR0VfT0JKKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRXhlY3V0aW9uRW52aXJvbm1lbnQpIHsKLQkJCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfSkFWQV9MSUJfT0JKKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUmVxdWlyZUJ1bmRsZU9iamVjdCkgewotCQkJCWludCBmbGFncyA9IFNoYXJlZExhYmVsUHJvdmlkZXIuRl9FWFRFUk5BTDsKLQkJCQlpZiAoKChSZXF1aXJlQnVuZGxlT2JqZWN0KSBvYmopLmlzUmVleHBvcnRlZCgpKSB7Ci0JCQkJCWZsYWdzID0gZmxhZ3MgfCBTaGFyZWRMYWJlbFByb3ZpZGVyLkZfRVhQT1JUOwotCQkJCX0KLQkJCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfUkVRX1BMVUdJTl9PQkosIGZsYWdzKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSW1wb3J0TGlicmFyeU9iamVjdCkgewotCQkJCXJldHVybiBsYWJlbFByb3ZpZGVyLmdldChQREVQbHVnaW5JbWFnZXMuREVTQ19KQVJfTElCX09CSik7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEltcG9ydEJ1bmRsZU9iamVjdCkgewotCQkJCXJldHVybiBsYWJlbFByb3ZpZGVyLmdldChQREVQbHVnaW5JbWFnZXMuREVTQ19CVU5ETEVfT0JKKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWFuaWZlc3RIZWFkZXIpIHsKLQkJCQlpZiAoaXNTcHJpbmdIZWFkZXIoKChNYW5pZmVzdEhlYWRlcikgb2JqKS5nZXRLZXkoKSkpIHsKLQkJCQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0KFNlcnZlcklkZVVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC92aWV3MTYvZ3JlZW5fYmFsbF9vYmouZ2lmIikpOwotCQkJCX0KLQkJCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfQlVJTERfVkFSX09CSik7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElQbHVnaW5MaWJyYXJ5KSB7Ci0JCQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0KFBERVBsdWdpbkltYWdlcy5ERVNDX0pBVkFfTElCX09CSik7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dFJlcXVpcmVCdW5kbGUoUmVxdWlyZUJ1bmRsZU9iamVjdCBidW5kbGUpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBsYWJlbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgSUQKKyAgICAgICAgICAgIGxhYmVsLmFwcGVuZChidW5kbGUuZ2V0SWQoKSk7CisgICAgICAgICAgICAvLyBHZXQgdGhlIHZlcnNpb24KKyAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gYnVuZGxlLmdldFZlcnNpb24oKTsKKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHZlcnNpb24sIGp1c3QgcmV0dXJuIHdoYXQgd2UgaGF2ZQorICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gbnVsbCB8fCB2ZXJzaW9uLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWwudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFwcGVuZCBhIHNwYWNlCisgICAgICAgICAgICBsYWJlbC5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZG9lcyBub3QgaGF2ZSBhIHJhbmdlIGluZGljYXRvciwKKyAgICAgICAgICAgIC8vIGFkZCBhIGRlZmF1bHQgb25lLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGVyZSBpcyBvbmx5IG9uZQorICAgICAgICAgICAgLy8gdmFsdWUgc3BlY2lmaWVkIGZvciBlaXRoZXIgbWluIG9yIG1heAorICAgICAgICAgICAgY2hhciBmaXJzdENoYXIgPSB2ZXJzaW9uLmNoYXJBdCgwKTsKKyAgICAgICAgICAgIGlmIChmaXJzdENoYXIgIT0gJygnICYmIGZpcnN0Q2hhciAhPSAnWycpIHsKKyAgICAgICAgICAgICAgICBsYWJlbC5hcHBlbmQoJygnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFwcGVuZCB0aGUgdmVyc2lvbgorICAgICAgICAgICAgbGFiZWwuYXBwZW5kKHZlcnNpb24pOworICAgICAgICAgICAgLy8gSWYgdGhlIGxhc3QgY2hhcmFjdGVyIGRvZXMgbm90IGhhdmUgYSByYW5nZSBpbmRpY2F0b3IsCisgICAgICAgICAgICAvLyBhZGQgYSBkZWZhdWx0IG9uZS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlcmUgaXMgb25seSBvbmUKKyAgICAgICAgICAgIC8vIHZhbHVlIHNwZWNpZmllZCBmb3IgZWl0aGVyIG1pbiBvciBtYXgKKyAgICAgICAgICAgIGNoYXIgbGFzdENoYXIgPSB2ZXJzaW9uLmNoYXJBdCh2ZXJzaW9uLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICBpZiAobGFzdENoYXIgIT0gJyknICYmIGxhc3RDaGFyICE9ICddJykgeworICAgICAgICAgICAgICAgIGxhYmVsLmFwcGVuZCgnKScpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmV0dXJuIHdoYXQgd2UgaGF2ZQorICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCk7CisgICAgICAgIH0KIAotCXByaXZhdGUgYm9vbGVhbiBpc1NwcmluZ0hlYWRlcihTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnMudGV4dC5oZWFkZXJzIik7Ci0JCUxpc3Q8U3RyaW5nPiBoZWFkZXJzID0gQ29sbGVjdGlvbnMubGlzdChidW5kbGUuZ2V0S2V5cygpKTsKLQkJcmV0dXJuIGhlYWRlcnMuY29udGFpbnMoa2V5KTsKLQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgUERFTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gUERFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgUGFja2FnZU9iamVjdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbFByb3ZpZGVyLmdldChQREVQbHVnaW5JbWFnZXMuREVTQ19QQUNLQUdFX09CSik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEV4ZWN1dGlvbkVudmlyb25tZW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0KFBERVBsdWdpbkltYWdlcy5ERVNDX0pBVkFfTElCX09CSik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJlcXVpcmVCdW5kbGVPYmplY3QpIHsKKyAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgPSBTaGFyZWRMYWJlbFByb3ZpZGVyLkZfRVhURVJOQUw7CisgICAgICAgICAgICAgICAgaWYgKCgoUmVxdWlyZUJ1bmRsZU9iamVjdCkgb2JqKS5pc1JlZXhwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGZsYWdzIHwgU2hhcmVkTGFiZWxQcm92aWRlci5GX0VYUE9SVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0KFBERVBsdWdpbkltYWdlcy5ERVNDX1JFUV9QTFVHSU5fT0JKLCBmbGFncyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEltcG9ydExpYnJhcnlPYmplY3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxQcm92aWRlci5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfSkFSX0xJQl9PQkopOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJbXBvcnRCdW5kbGVPYmplY3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxQcm92aWRlci5nZXQoUERFUGx1Z2luSW1hZ2VzLkRFU0NfQlVORExFX09CSik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1hbmlmZXN0SGVhZGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzU3ByaW5nSGVhZGVyKCgoTWFuaWZlc3RIZWFkZXIpIG9iaikuZ2V0S2V5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbFByb3ZpZGVyLmdldChTZXJ2ZXJJZGVVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvdmlldzE2L2dyZWVuX2JhbGxfb2JqLmdpZiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0KFBERVBsdWdpbkltYWdlcy5ERVNDX0JVSUxEX1ZBUl9PQkopOworICAgICAgICAgICAgfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJUGx1Z2luTGlicmFyeSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbFByb3ZpZGVyLmdldChQREVQbHVnaW5JbWFnZXMuREVTQ19KQVZBX0xJQl9PQkopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoSUh5cGVybGlua0RldGVjdG9yLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJcmV0dXJuIG5ldyBTcHJpbmdCdW5kbGVIeXBlcmxpbmtEZXRlY3Rvcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQl9CisgICAgcHJpdmF0ZSBib29sZWFuIGlzU3ByaW5nSGVhZGVyKFN0cmluZyBrZXkpIHsKKyAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9ycy50ZXh0LmhlYWRlcnMiKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGhlYWRlcnMgPSBDb2xsZWN0aW9ucy5saXN0KGJ1bmRsZS5nZXRLZXlzKCkpOworICAgICAgICByZXR1cm4gaGVhZGVycy5jb250YWlucyhrZXkpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7CisgICAgICAgIGlmIChJSHlwZXJsaW5rRGV0ZWN0b3IuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNwcmluZ0J1bmRsZUh5cGVybGlua0RldGVjdG9yKHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvbW9kZWwvQnVuZGxlTW9kZWxNb2RpZmljYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvbW9kZWwvQnVuZGxlTW9kZWxNb2RpZmljYXRpb24uamF2YQppbmRleCA4ZDM3MzM5Li44NzI1OWZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL21vZGVsL0J1bmRsZU1vZGVsTW9kaWZpY2F0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9tb2RlbC9CdW5kbGVNb2RlbE1vZGlmaWNhdGlvbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzLm1vZGVsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CkBAIC0yMCw1OCArMjEsNTUgQEAKIC8qKgogICogQWRhcHRlZCBmcm9tIE1vZGVsTW9kaWZpY2F0aW9uIGZvciB1c2Ugd2hlbiBtb2RpZnlpbmcgU3ByaW5nQnVuZGxlTW9kZWxzLiBUaGlzIGVzc2VudGlhbGx5IHByb3ZpZGVzIGFjY2VzcyB0byBuZWVkZWQKICAqIHByaXZhdGUgZmluYWwgbWV0aG9kcy4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBMZW8gRG9zIFNhbnRvcwogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnVuZGxlTW9kZWxNb2RpZmljYXRpb24gZXh0ZW5kcyBNb2RlbE1vZGlmaWNhdGlvbiB7CiAKLQlwcml2YXRlIElGaWxlIG1vZGVsRmlsZTsKKyAgICBwcml2YXRlIElGaWxlIG1vZGVsRmlsZTsKIAotCS8qKgotCSAqIENyZWF0ZSBhIHNpbmdsZSBtb2RlbCBtb2RpZmljYXRpb24gLSB1c2VkIGZvciBtb2RpZnlpbmcgc2luZ2xlIEFic3RyYWN0RWRpdGluZ01vZGVscwotCSAqIAotCSAqIEBwYXJhbSBtb2RlbEZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBiYXNpYyB1bmRlcmx5aW5nIGZpbGUgZm9yIHRoZSBtb2RlbCB5b3Ugd2lzaCB0byBtb2RpZnkuCi0JICovCi0JcHVibGljIEJ1bmRsZU1vZGVsTW9kaWZpY2F0aW9uKElGaWxlIG1vZGVsRmlsZSkgewotCQlzdXBlcihtb2RlbEZpbGUpOwotCQl0aGlzLm1vZGVsRmlsZSA9IG1vZGVsRmlsZTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc2luZ2xlIG1vZGVsIG1vZGlmaWNhdGlvbiAtIHVzZWQgZm9yIG1vZGlmeWluZyBzaW5nbGUgQWJzdHJhY3RFZGl0aW5nTW9kZWxzCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZWxGaWxlIHRoZSBiYXNpYyB1bmRlcmx5aW5nIGZpbGUgZm9yIHRoZSBtb2RlbCB5b3Ugd2lzaCB0byBtb2RpZnkuCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZU1vZGVsTW9kaWZpY2F0aW9uKElGaWxlIG1vZGVsRmlsZSkgeworICAgICAgICBzdXBlcihtb2RlbEZpbGUpOworICAgICAgICB0aGlzLm1vZGVsRmlsZSA9IG1vZGVsRmlsZTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGUgYSBmdWxsIElCdW5kbGVQbHVnaW5Nb2RlbEJhc2UgbW9kaWZpY2F0aW9uCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZUZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBNQU5JRkVTVC5NRiBmaWxlCi0JICogQHBhcmFtIHhtbEZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBwbHVnaW4ueG1sL2ZyYWdtZW50LnhtbCBmaWxlIGZvciB0aGlzIG1vZGlmaWNhdGlvbiAob3B0aW9uYWwgLSBjYW4gYmUgbnVsbCkKLQkgKiBAcHJlIGJ1bmRsZUZpbGUgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQnVuZGxlTW9kZWxNb2RpZmljYXRpb24oSUZpbGUgYnVuZGxlRmlsZSwgSUZpbGUgeG1sRmlsZSkgewotCQlzdXBlcihidW5kbGVGaWxlLCB4bWxGaWxlKTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZnVsbCBJQnVuZGxlUGx1Z2luTW9kZWxCYXNlIG1vZGlmaWNhdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZUZpbGUgdGhlIE1BTklGRVNULk1GIGZpbGUKKyAgICAgKiBAcGFyYW0geG1sRmlsZSB0aGUgcGx1Z2luLnhtbC9mcmFnbWVudC54bWwgZmlsZSBmb3IgdGhpcyBtb2RpZmljYXRpb24gKG9wdGlvbmFsIC0gY2FuIGJlIG51bGwpCisgICAgICogQHByZSBidW5kbGVGaWxlIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgcHVibGljIEJ1bmRsZU1vZGVsTW9kaWZpY2F0aW9uKElGaWxlIGJ1bmRsZUZpbGUsIElGaWxlIHhtbEZpbGUpIHsKKyAgICAgICAgc3VwZXIoYnVuZGxlRmlsZSwgeG1sRmlsZSk7CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlIGEgTW9kZWxNb2RpZmljYXRpb24gYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9qZWN0IGllLiBpZiB0aGUgcHJvamVjdCBjb250YWlucyBhIE1BTklGRVNULk1GIHRoaXMKLQkgKiB3aWxsIGJlIHRhZ2dlZCBhcyBhIGZ1bGxCdW5kbGVNb2RpZmljYXRpb24sIG90aGVyd2lzZSAodGhpcyBwcm9qZWN0IGlzIGFuIG9sZC1zdHlsZSBwbHVnaW4pIHRoaXMgd2lsbCBiZSBhCi0JICogUGx1Z2luTW9kZWwvRnJhZ21lbnRNb2RlbCBtb2RpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgQnVuZGxlTW9kZWxNb2RpZmljYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcihwcm9qZWN0KTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgTW9kZWxNb2RpZmljYXRpb24gYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9qZWN0IGllLiBpZiB0aGUgcHJvamVjdCBjb250YWlucyBhIE1BTklGRVNULk1GIHRoaXMKKyAgICAgKiB3aWxsIGJlIHRhZ2dlZCBhcyBhIGZ1bGxCdW5kbGVNb2RpZmljYXRpb24sIG90aGVyd2lzZSAodGhpcyBwcm9qZWN0IGlzIGFuIG9sZC1zdHlsZSBwbHVnaW4pIHRoaXMgd2lsbCBiZSBhCisgICAgICogUGx1Z2luTW9kZWwvRnJhZ21lbnRNb2RlbCBtb2RpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvamVjdAorICAgICAqLworICAgIHB1YmxpYyBCdW5kbGVNb2RlbE1vZGlmaWNhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHN1cGVyKHByb2plY3QpOworICAgIH0KIAotCXB1YmxpYyBJRmlsZSBnZXRJZmlsZSgpIHsKLQkJaWYgKHRoaXMuZ2V0RmlsZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmdldEZpbGUoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5tb2RlbEZpbGU7Ci0JfQorICAgIHB1YmxpYyBJRmlsZSBnZXRJZmlsZSgpIHsKKyAgICAgICAgaWYgKHRoaXMuZ2V0RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZpbGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5tb2RlbEZpbGU7CisgICAgfQogCi0JcHVibGljIHZvaWQgbW9kaWZ5U3ByaW5nQnVuZGxlKElCYXNlTW9kZWwgbW9kZWwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLm1vZGlmeU1vZGVsKG1vZGVsLCBtb25pdG9yKTsKLQl9CisgICAgcHVibGljIHZvaWQgbW9kaWZ5U3ByaW5nQnVuZGxlKElCYXNlTW9kZWwgbW9kZWwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICB0aGlzLm1vZGlmeU1vZGVsKG1vZGVsLCBtb25pdG9yKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvbW9kZWwvQnVuZGxlTW9kZWxVdGlsaXR5LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL21vZGVsL0J1bmRsZU1vZGVsVXRpbGl0eS5qYXZhCmluZGV4IDQ1NmEwODMuLjQ3N2QzN2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvbW9kZWwvQnVuZGxlTW9kZWxVdGlsaXR5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9tb2RlbC9CdW5kbGVNb2RlbFV0aWxpdHkuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9ycy5tb2RlbDsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwpAQCAtNjAsNyArNjEsNyBAQAogLyoqCiAgKiBBZGFwdGVkIGZyb20gUERFTW9kZWxVdGlsaXR5IHRvIGNyZWF0ZSBTcHJpbmdCdW5kbGVNb2RlbHMgZm9yIG1vZGlmaWNhdGlvbi4gVGhpcyB3aWxsIGVpdGhlciByZXRyaWV2ZSBhIG1vZGVsIGZyb20gYW4KICAqIG9wZW4gZWRpdG9yIGlmIG9uZSBleGlzdHMgb3IgY3JlYXRlIGEgbmV3IFNwcmluZ0J1bmRsZU1vZGVsIGZyb20gZmlsZS4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQGF1dGhvciBMZW8gRG9zIFNhbnRvcwogICogQHNlZSBQREVNb2RlbFV0aWxpdHkKQEAgLTY4LDQyNyArNjksNDI2IEBACiBAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiIH0pCiBwdWJsaWMgY2xhc3MgQnVuZGxlTW9kZWxVdGlsaXR5IHsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZfTUFOSUZFU1QgPSAiTUFOSUZFU1QuTUYiOyAvLyROT04tTkxTLTEkCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRl9NQU5JRkVTVCA9ICJNQU5JRkVTVC5NRiI7IC8vJE5PTi1OTFMtMSQKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZfTUFOSUZFU1RfRlAgPSAiTUVUQS1JTkYvIiArIEZfTUFOSUZFU1Q7IC8vJE5PTi1OTFMtMSQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGX01BTklGRVNUX0ZQID0gIk1FVEEtSU5GLyIgKyBGX01BTklGRVNUOyAvLyROT04tTkxTLTEkCiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGX1BMVUdJTiA9ICJwbHVnaW4ueG1sIjsgLy8kTk9OLU5MUy0xJAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZfUExVR0lOID0gInBsdWdpbi54bWwiOyAvLyROT04tTkxTLTEkCiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGX0ZSQUdNRU5UID0gImZyYWdtZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGX0ZSQUdNRU5UID0gImZyYWdtZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZfUFJPUEVSVElFUyA9ICIucHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGX1BST1BFUlRJRVMgPSAiLnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGX0JVSUxEID0gImJ1aWxkIiArIEZfUFJPUEVSVElFUzsgLy8kTk9OLU5MUy0xJAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZfQlVJTEQgPSAiYnVpbGQiICsgRl9QUk9QRVJUSUVTOyAvLyROT04tTkxTLTEkCiAKLQlwdWJsaWMgc3RhdGljIHZvaWQgbW9kaWZ5TW9kZWwoZmluYWwgTW9kZWxNb2RpZmljYXRpb24gbW9kaWZpY2F0aW9uLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gTW9kZWxNb2RpZmljYXRpb24gd2FzIG5vdCBzdXBwbGllZCB3aXRoIHRoZSByaWdodCBmaWxlcwotCQkvLyBUT0RPIHNob3VsZCB3ZSBqdXN0IGZhaWwgc2lsZW50bHk/Ci0JCWlmIChnZXRGaWxlKG1vZGlmaWNhdGlvbikgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1vZGlmeU1vZGVsKGZpbmFsIE1vZGVsTW9kaWZpY2F0aW9uIG1vZGlmaWNhdGlvbiwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisgICAgICAgIC8vIE1vZGVsTW9kaWZpY2F0aW9uIHdhcyBub3Qgc3VwcGxpZWQgd2l0aCB0aGUgcmlnaHQgZmlsZXMKKyAgICAgICAgLy8gVE9ETyBzaG91bGQgd2UganVzdCBmYWlsIHNpbGVudGx5PworICAgICAgICBpZiAoZ2V0RmlsZShtb2RpZmljYXRpb24pID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0JCVBERUZvcm1FZGl0b3IgZWRpdG9yID0gZ2V0T3BlbkVkaXRvcihtb2RpZmljYXRpb24pOwotCQlJQmFzZU1vZGVsIG1vZGVsID0gZ2V0TW9kZWxGcm9tRWRpdG9yKGVkaXRvciwgbW9kaWZpY2F0aW9uKTsKKyAgICAgICAgUERFRm9ybUVkaXRvciBlZGl0b3IgPSBnZXRPcGVuRWRpdG9yKG1vZGlmaWNhdGlvbik7CisgICAgICAgIElCYXNlTW9kZWwgbW9kZWwgPSBnZXRNb2RlbEZyb21FZGl0b3IoZWRpdG9yLCBtb2RpZmljYXRpb24pOwogCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBvcGVuIGVkaXRvciBmb3VuZCwgc2hvdWxkIGhhdmUgdW5kZXJseWluZyB0ZXh0IGxpc3RlbmVycyAtPiBhcHBseQotCQkJLy8gbW9kaWZpY2F0aW9uCi0JCQltb2RpZnlFZGl0b3JNb2RlbCgoQnVuZGxlTW9kZWxNb2RpZmljYXRpb24pIG1vZGlmaWNhdGlvbiwgZWRpdG9yLCBtb2RlbCwgbW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQlnZW5lcmF0ZU1vZGVsRWRpdHMoKEJ1bmRsZU1vZGVsTW9kaWZpY2F0aW9uKSBtb2RpZmljYXRpb24sIG1vbml0b3IsIHRydWUpOwotCQl9Ci0JfQorICAgICAgICBpZiAobW9kZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gb3BlbiBlZGl0b3IgZm91bmQsIHNob3VsZCBoYXZlIHVuZGVybHlpbmcgdGV4dCBsaXN0ZW5lcnMgLT4gYXBwbHkKKyAgICAgICAgICAgIC8vIG1vZGlmaWNhdGlvbgorICAgICAgICAgICAgbW9kaWZ5RWRpdG9yTW9kZWwoKEJ1bmRsZU1vZGVsTW9kaWZpY2F0aW9uKSBtb2RpZmljYXRpb24sIGVkaXRvciwgbW9kZWwsIG1vbml0b3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2VuZXJhdGVNb2RlbEVkaXRzKChCdW5kbGVNb2RlbE1vZGlmaWNhdGlvbikgbW9kaWZpY2F0aW9uLCBtb25pdG9yLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgc3RhdGljIFRleHRGaWxlQ2hhbmdlW10gZ2VuZXJhdGVNb2RlbEVkaXRzKGZpbmFsIEJ1bmRsZU1vZGVsTW9kaWZpY2F0aW9uIG1vZGlmaWNhdGlvbiwKLQkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgYm9vbGVhbiBwZXJmb3JtRWRpdHMpIHsKLQkJQXJyYXlMaXN0IGVkaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBjcmVhdGUgb3duIG1vZGVsLCBhdHRhY2ggbGlzdGVuZXJzIGFuZCBncmFiIHRleHQgZWRpdHMKLQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciBtYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCUlGaWxlW10gZmlsZXM7Ci0JCWlmIChpc0Z1bGxCdW5kbGVNb2RpZmljYXRpb24obW9kaWZpY2F0aW9uKSkgewotCQkJZmlsZXMgPSBuZXcgSUZpbGVbMl07Ci0JCQlmaWxlc1tGX0JpXSA9IGdldE1hbmlmZXN0RmlsZShtb2RpZmljYXRpb24pOwotCQkJZmlsZXNbRl9YaV0gPSBnZXRYTUxGaWxlKG1vZGlmaWNhdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlmaWxlcyA9IG5ldyBJRmlsZVtdIHsgZ2V0RmlsZShtb2RpZmljYXRpb24pIH07Ci0JCX0KLQkJLy8gbmVlZCB0byBtb25pdG9yIG51bWJlciBvZiBzdWNjZXNzZnVsIGJ1ZmZlciBjb25uZWN0aW9ucyBmb3IKLQkJLy8gZGlzY29ubmVjdGlvbiBwdXJwb3NlcwotCQkvLyBAc2VlIH0gZmluYWxseSB7IHN0YXRlbWVudAotCQlpbnQgc2MgPSAwOwotCQl0cnkgewotCQkJSVRleHRGaWxlQnVmZmVyW10gYnVmZmVycyA9IG5ldyBJVGV4dEZpbGVCdWZmZXJbZmlsZXMubGVuZ3RoXTsKLQkJCUlEb2N1bWVudFtdIGRvY3VtZW50cyA9IG5ldyBJRG9jdW1lbnRbZmlsZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0gPT0gbnVsbCB8fCAhZmlsZXNbaV0uZXhpc3RzKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCW1hbmFnZXIuY29ubmVjdChmaWxlc1tpXS5nZXRGdWxsUGF0aCgpLCBMb2NhdGlvbktpbmQuTk9STUFMSVpFLCBtb25pdG9yKTsKLQkJCQlzYysrOwotCQkJCWJ1ZmZlcnNbaV0gPSBtYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKGZpbGVzW2ldLmdldEZ1bGxQYXRoKCksIExvY2F0aW9uS2luZC5OT1JNQUxJWkUpOwotCQkJCWlmIChwZXJmb3JtRWRpdHMgJiYgYnVmZmVyc1tpXS5pc0RpcnR5KCkpIHsKLQkJCQkJYnVmZmVyc1tpXS5jb21taXQobW9uaXRvciwgdHJ1ZSk7Ci0JCQkJfQotCQkJCWRvY3VtZW50c1tpXSA9IGJ1ZmZlcnNbaV0uZ2V0RG9jdW1lbnQoKTsKLQkJCX0KKyAgICBwcml2YXRlIHN0YXRpYyBUZXh0RmlsZUNoYW5nZVtdIGdlbmVyYXRlTW9kZWxFZGl0cyhmaW5hbCBCdW5kbGVNb2RlbE1vZGlmaWNhdGlvbiBtb2RpZmljYXRpb24sIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKKyAgICAgICAgYm9vbGVhbiBwZXJmb3JtRWRpdHMpIHsKKyAgICAgICAgQXJyYXlMaXN0IGVkaXRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAvLyBjcmVhdGUgb3duIG1vZGVsLCBhdHRhY2ggbGlzdGVuZXJzIGFuZCBncmFiIHRleHQgZWRpdHMKKyAgICAgICAgSVRleHRGaWxlQnVmZmVyTWFuYWdlciBtYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7CisgICAgICAgIElGaWxlW10gZmlsZXM7CisgICAgICAgIGlmIChpc0Z1bGxCdW5kbGVNb2RpZmljYXRpb24obW9kaWZpY2F0aW9uKSkgeworICAgICAgICAgICAgZmlsZXMgPSBuZXcgSUZpbGVbMl07CisgICAgICAgICAgICBmaWxlc1tGX0JpXSA9IGdldE1hbmlmZXN0RmlsZShtb2RpZmljYXRpb24pOworICAgICAgICAgICAgZmlsZXNbRl9YaV0gPSBnZXRYTUxGaWxlKG1vZGlmaWNhdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxlcyA9IG5ldyBJRmlsZVtdIHsgZ2V0RmlsZShtb2RpZmljYXRpb24pIH07CisgICAgICAgIH0KKyAgICAgICAgLy8gbmVlZCB0byBtb25pdG9yIG51bWJlciBvZiBzdWNjZXNzZnVsIGJ1ZmZlciBjb25uZWN0aW9ucyBmb3IKKyAgICAgICAgLy8gZGlzY29ubmVjdGlvbiBwdXJwb3NlcworICAgICAgICAvLyBAc2VlIH0gZmluYWxseSB7IHN0YXRlbWVudAorICAgICAgICBpbnQgc2MgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgSVRleHRGaWxlQnVmZmVyW10gYnVmZmVycyA9IG5ldyBJVGV4dEZpbGVCdWZmZXJbZmlsZXMubGVuZ3RoXTsKKyAgICAgICAgICAgIElEb2N1bWVudFtdIGRvY3VtZW50cyA9IG5ldyBJRG9jdW1lbnRbZmlsZXMubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZXNbaV0gPT0gbnVsbCB8fCAhZmlsZXNbaV0uZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hbmFnZXIuY29ubmVjdChmaWxlc1tpXS5nZXRGdWxsUGF0aCgpLCBMb2NhdGlvbktpbmQuTk9STUFMSVpFLCBtb25pdG9yKTsKKyAgICAgICAgICAgICAgICBzYysrOworICAgICAgICAgICAgICAgIGJ1ZmZlcnNbaV0gPSBtYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKGZpbGVzW2ldLmdldEZ1bGxQYXRoKCksIExvY2F0aW9uS2luZC5OT1JNQUxJWkUpOworICAgICAgICAgICAgICAgIGlmIChwZXJmb3JtRWRpdHMgJiYgYnVmZmVyc1tpXS5pc0RpcnR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyc1tpXS5jb21taXQobW9uaXRvciwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvY3VtZW50c1tpXSA9IGJ1ZmZlcnNbaV0uZ2V0RG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0KIAotCQkJSUJhc2VNb2RlbCBlZGl0TW9kZWw7Ci0JCQlpZiAoaXNGdWxsQnVuZGxlTW9kaWZpY2F0aW9uKG1vZGlmaWNhdGlvbikpIHsKLQkJCQllZGl0TW9kZWwgPSBwcmVwYXJlQnVuZGxlUGx1Z2luTW9kZWwoZmlsZXMsIGRvY3VtZW50cywgIXBlcmZvcm1FZGl0cyk7Ci0JCQl9IGVsc2UgewotCQkJCWVkaXRNb2RlbCA9IHByZXBhcmVBYnN0cmFjdEVkaXRpbmdNb2RlbChmaWxlc1swXSwgZG9jdW1lbnRzWzBdLCAhcGVyZm9ybUVkaXRzKTsKLQkJCX0KKyAgICAgICAgICAgIElCYXNlTW9kZWwgZWRpdE1vZGVsOworICAgICAgICAgICAgaWYgKGlzRnVsbEJ1bmRsZU1vZGlmaWNhdGlvbihtb2RpZmljYXRpb24pKSB7CisgICAgICAgICAgICAgICAgZWRpdE1vZGVsID0gcHJlcGFyZUJ1bmRsZVBsdWdpbk1vZGVsKGZpbGVzLCBkb2N1bWVudHMsICFwZXJmb3JtRWRpdHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlZGl0TW9kZWwgPSBwcmVwYXJlQWJzdHJhY3RFZGl0aW5nTW9kZWwoZmlsZXNbMF0sIGRvY3VtZW50c1swXSwgIXBlcmZvcm1FZGl0cyk7CisgICAgICAgICAgICB9CiAKLQkJCW1vZGlmaWNhdGlvbi5tb2RpZnlTcHJpbmdCdW5kbGUoZWRpdE1vZGVsLCBtb25pdG9yKTsKKyAgICAgICAgICAgIG1vZGlmaWNhdGlvbi5tb2RpZnlTcHJpbmdCdW5kbGUoZWRpdE1vZGVsLCBtb25pdG9yKTsKIAotCQkJSU1vZGVsVGV4dENoYW5nZUxpc3RlbmVyW10gbGlzdGVuZXJzID0gZ2F0aGVyTGlzdGVuZXJzKGVkaXRNb2RlbCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChsaXN0ZW5lcnNbaV0gPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJVGV4dEVkaXRbXSBjdXJyZW50RWRpdHMgPSBsaXN0ZW5lcnNbaV0uZ2V0VGV4dE9wZXJhdGlvbnMoKTsKLQkJCQlpZiAoY3VycmVudEVkaXRzLmxlbmd0aCA+IDApIHsKLQkJCQkJTXVsdGlUZXh0RWRpdCBtdWx0aSA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQkJCW11bHRpLmFkZENoaWxkcmVuKGN1cnJlbnRFZGl0cyk7Ci0JCQkJCWlmIChwZXJmb3JtRWRpdHMpIHsKLQkJCQkJCW11bHRpLmFwcGx5KGRvY3VtZW50c1tpXSk7Ci0JCQkJCQlidWZmZXJzW2ldLmNvbW1pdChtb25pdG9yLCB0cnVlKTsKLQkJCQkJfQotCQkJCQlUZXh0RmlsZUNoYW5nZSBjaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoZmlsZXNbaV0uZ2V0TmFtZSgpLCBmaWxlc1tpXSk7Ci0JCQkJCWNoYW5nZS5zZXRFZGl0KG11bHRpKTsKLQkJCQkJLy8gSWYgdGhlIGVkaXRzIHdlcmUgcGVyZm9ybWVkIHJpZ2h0IGF3YXkgKHBlcmZvcm1FZGl0cyA9PQotCQkJCQkvLyB0cnVlKSB0aGVuCi0JCQkJCS8vIGFsbCB0aGUgbmFtZXMgYXJlIG51bGwgYW5kIHdlIGRvbid0IG5lZWQgdGhlIGdyYW51bGFyCi0JCQkJCS8vIGRldGFpbCBhbnl3YXkuCi0JCQkJCWlmICghcGVyZm9ybUVkaXRzKSB7Ci0JCQkJCQlmb3IgKFRleHRFZGl0IGN1cnJlbnRFZGl0IDogY3VycmVudEVkaXRzKSB7Ci0JCQkJCQkJU3RyaW5nIG5hbWUgPSBsaXN0ZW5lcnNbaV0uZ2V0UmVhZGFibGVOYW1lKGN1cnJlbnRFZGl0KTsKLQkJCQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWNoYW5nZS5hZGRUZXh0RWRpdEdyb3VwKG5ldyBUZXh0RWRpdEdyb3VwKG5hbWUsIGN1cnJlbnRFZGl0KSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHNhdmUgdGhlIGZpbGUgYWZ0ZXIgdGhlIGNoYW5nZSBhcHBsaWVkCi0JCQkJCWNoYW5nZS5zZXRTYXZlTW9kZShUZXh0RmlsZUNoYW5nZS5GT1JDRV9TQVZFKTsKLQkJCQkJUERFTW9kZWxVdGlsaXR5LnNldENoYW5nZVRleHRUeXBlKGNoYW5nZSwgZmlsZXNbaV0pOwotCQkJCQllZGl0cy5hZGQoY2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJUERFUGx1Z2luLmxvZyhlKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQlQREVQbHVnaW4ubG9nKGUpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlQREVQbHVnaW4ubG9nKGUpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gZG9uJ3Qgd2FudCB0byBvdmVyLWRpc2Nvbm5lY3QgaW4gY2FzZSB3ZSByYW4gaW50byBhbiBleGNlcHRpb24KLQkJCS8vIGR1cmluZyBjb25uZWN0aW9ucwotCQkJLy8gZGMgPD0gc2Mgc3RvcHMgdGhpcyBmcm9tIGhhcHBlbmluZwotCQkJaW50IGRjID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmIGRjIDw9IHNjOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0gPT0gbnVsbCB8fCAhZmlsZXNbaV0uZXhpc3RzKCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCW1hbmFnZXIuZGlzY29ubmVjdChmaWxlc1tpXS5nZXRGdWxsUGF0aCgpLCBMb2NhdGlvbktpbmQuTk9STUFMSVpFLCBtb25pdG9yKTsKLQkJCQkJZGMrKzsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJUERFUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChUZXh0RmlsZUNoYW5nZVtdKSBlZGl0cy50b0FycmF5KG5ldyBUZXh0RmlsZUNoYW5nZVtlZGl0cy5zaXplKCldKTsKLQl9CisgICAgICAgICAgICBJTW9kZWxUZXh0Q2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBnYXRoZXJMaXN0ZW5lcnMoZWRpdE1vZGVsKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyc1tpXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUZXh0RWRpdFtdIGN1cnJlbnRFZGl0cyA9IGxpc3RlbmVyc1tpXS5nZXRUZXh0T3BlcmF0aW9ucygpOworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWRpdHMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgICAgICBNdWx0aVRleHRFZGl0IG11bHRpID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgbXVsdGkuYWRkQ2hpbGRyZW4oY3VycmVudEVkaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBlcmZvcm1FZGl0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGkuYXBwbHkoZG9jdW1lbnRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNbaV0uY29tbWl0KG1vbml0b3IsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFRleHRGaWxlQ2hhbmdlIGNoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZShmaWxlc1tpXS5nZXROYW1lKCksIGZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlLnNldEVkaXQobXVsdGkpOworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZWRpdHMgd2VyZSBwZXJmb3JtZWQgcmlnaHQgYXdheSAocGVyZm9ybUVkaXRzID09CisgICAgICAgICAgICAgICAgICAgIC8vIHRydWUpIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsIHRoZSBuYW1lcyBhcmUgbnVsbCBhbmQgd2UgZG9uJ3QgbmVlZCB0aGUgZ3JhbnVsYXIKKyAgICAgICAgICAgICAgICAgICAgLy8gZGV0YWlsIGFueXdheS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwZXJmb3JtRWRpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoVGV4dEVkaXQgY3VycmVudEVkaXQgOiBjdXJyZW50RWRpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGxpc3RlbmVyc1tpXS5nZXRSZWFkYWJsZU5hbWUoY3VycmVudEVkaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlLmFkZFRleHRFZGl0R3JvdXAobmV3IFRleHRFZGl0R3JvdXAobmFtZSwgY3VycmVudEVkaXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgZmlsZSBhZnRlciB0aGUgY2hhbmdlIGFwcGxpZWQKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlLnNldFNhdmVNb2RlKFRleHRGaWxlQ2hhbmdlLkZPUkNFX1NBVkUpOworICAgICAgICAgICAgICAgICAgICBQREVNb2RlbFV0aWxpdHkuc2V0Q2hhbmdlVGV4dFR5cGUoY2hhbmdlLCBmaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGVkaXRzLmFkZChjaGFuZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBQREVQbHVnaW4ubG9nKGUpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFBERVBsdWdpbi5sb2coZSk7CisgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFBERVBsdWdpbi5sb2coZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBkb24ndCB3YW50IHRvIG92ZXItZGlzY29ubmVjdCBpbiBjYXNlIHdlIHJhbiBpbnRvIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgLy8gZHVyaW5nIGNvbm5lY3Rpb25zCisgICAgICAgICAgICAvLyBkYyA8PSBzYyBzdG9wcyB0aGlzIGZyb20gaGFwcGVuaW5nCisgICAgICAgICAgICBpbnQgZGMgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGggJiYgZGMgPD0gc2M7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChmaWxlc1tpXSA9PSBudWxsIHx8ICFmaWxlc1tpXS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5kaXNjb25uZWN0KGZpbGVzW2ldLmdldEZ1bGxQYXRoKCksIExvY2F0aW9uS2luZC5OT1JNQUxJWkUsIG1vbml0b3IpOworICAgICAgICAgICAgICAgICAgICBkYysrOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBQREVQbHVnaW4ubG9nKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKFRleHRGaWxlQ2hhbmdlW10pIGVkaXRzLnRvQXJyYXkobmV3IFRleHRGaWxlQ2hhbmdlW2VkaXRzLnNpemUoKV0pOworICAgIH0KIAotCXByaXZhdGUgc3RhdGljIElCYXNlTW9kZWwgcHJlcGFyZUJ1bmRsZVBsdWdpbk1vZGVsKElGaWxlW10gZmlsZXMsIElEb2N1bWVudFtdIGRvY3MsIGJvb2xlYW4gZ2VuZXJhdGVFZGl0TmFtZXMpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0RWRpdGluZ01vZGVsW10gbW9kZWxzID0gbmV3IEFic3RyYWN0RWRpdGluZ01vZGVsW2RvY3MubGVuZ3RoXTsKKyAgICBwcml2YXRlIHN0YXRpYyBJQmFzZU1vZGVsIHByZXBhcmVCdW5kbGVQbHVnaW5Nb2RlbChJRmlsZVtdIGZpbGVzLCBJRG9jdW1lbnRbXSBkb2NzLCBib29sZWFuIGdlbmVyYXRlRWRpdE5hbWVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIEFic3RyYWN0RWRpdGluZ01vZGVsW10gbW9kZWxzID0gbmV3IEFic3RyYWN0RWRpdGluZ01vZGVsW2RvY3MubGVuZ3RoXTsKIAotCQlib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsKLQkJbW9kZWxzW0ZfQmldID0gcHJlcGFyZUFic3RyYWN0RWRpdGluZ01vZGVsKGZpbGVzW0ZfQmldLCBkb2NzW0ZfQmldLCBnZW5lcmF0ZUVkaXROYW1lcyk7Ci0JCWlmIChtb2RlbHNbRl9CaV0gaW5zdGFuY2VvZiBJQnVuZGxlTW9kZWwpIHsKLQkJCWlzRnJhZ21lbnQgPSAoKElCdW5kbGVNb2RlbCkgbW9kZWxzW0ZfQmldKS5nZXRCdW5kbGUoKS5nZXRIZWFkZXIoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QpICE9IG51bGw7Ci0JCX0KKyAgICAgICAgYm9vbGVhbiBpc0ZyYWdtZW50ID0gZmFsc2U7CisgICAgICAgIG1vZGVsc1tGX0JpXSA9IHByZXBhcmVBYnN0cmFjdEVkaXRpbmdNb2RlbChmaWxlc1tGX0JpXSwgZG9jc1tGX0JpXSwgZ2VuZXJhdGVFZGl0TmFtZXMpOworICAgICAgICBpZiAobW9kZWxzW0ZfQmldIGluc3RhbmNlb2YgSUJ1bmRsZU1vZGVsKSB7CisgICAgICAgICAgICBpc0ZyYWdtZW50ID0gKChJQnVuZGxlTW9kZWwpIG1vZGVsc1tGX0JpXSkuZ2V0QnVuZGxlKCkuZ2V0SGVhZGVyKENvbnN0YW50cy5GUkFHTUVOVF9IT1NUKSAhPSBudWxsOworICAgICAgICB9CiAKLQkJSUJ1bmRsZVBsdWdpbk1vZGVsQmFzZSBwbHVnaW5Nb2RlbDsKLQkJaWYgKGlzRnJhZ21lbnQpIHsKLQkJCXBsdWdpbk1vZGVsID0gbmV3IEJ1bmRsZUZyYWdtZW50TW9kZWwoKTsKLQkJfSBlbHNlIHsKLQkJCXBsdWdpbk1vZGVsID0gbmV3IEJ1bmRsZVBsdWdpbk1vZGVsKCk7Ci0JCX0KKyAgICAgICAgSUJ1bmRsZVBsdWdpbk1vZGVsQmFzZSBwbHVnaW5Nb2RlbDsKKyAgICAgICAgaWYgKGlzRnJhZ21lbnQpIHsKKyAgICAgICAgICAgIHBsdWdpbk1vZGVsID0gbmV3IEJ1bmRsZUZyYWdtZW50TW9kZWwoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBsdWdpbk1vZGVsID0gbmV3IEJ1bmRsZVBsdWdpbk1vZGVsKCk7CisgICAgICAgIH0KIAotCQlwbHVnaW5Nb2RlbC5zZXRCdW5kbGVNb2RlbCgoSUJ1bmRsZU1vZGVsKSBtb2RlbHNbRl9CaV0pOwotCQlpZiAoZmlsZXMubGVuZ3RoID4gRl9YaSAmJiBmaWxlc1tGX1hpXSAhPSBudWxsKSB7Ci0JCQltb2RlbHNbRl9YaV0gPSBwcmVwYXJlQWJzdHJhY3RFZGl0aW5nTW9kZWwoZmlsZXNbRl9YaV0sIGRvY3NbRl9YaV0sIGdlbmVyYXRlRWRpdE5hbWVzKTsKLQkJCXBsdWdpbk1vZGVsLnNldEV4dGVuc2lvbnNNb2RlbCgoSVNoYXJlZEV4dGVuc2lvbnNNb2RlbCkgbW9kZWxzW0ZfWGldKTsKLQkJfQotCQlyZXR1cm4gcGx1Z2luTW9kZWw7Ci0JfQorICAgICAgICBwbHVnaW5Nb2RlbC5zZXRCdW5kbGVNb2RlbCgoSUJ1bmRsZU1vZGVsKSBtb2RlbHNbRl9CaV0pOworICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gRl9YaSAmJiBmaWxlc1tGX1hpXSAhPSBudWxsKSB7CisgICAgICAgICAgICBtb2RlbHNbRl9YaV0gPSBwcmVwYXJlQWJzdHJhY3RFZGl0aW5nTW9kZWwoZmlsZXNbRl9YaV0sIGRvY3NbRl9YaV0sIGdlbmVyYXRlRWRpdE5hbWVzKTsKKyAgICAgICAgICAgIHBsdWdpbk1vZGVsLnNldEV4dGVuc2lvbnNNb2RlbCgoSVNoYXJlZEV4dGVuc2lvbnNNb2RlbCkgbW9kZWxzW0ZfWGldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGx1Z2luTW9kZWw7CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgQWJzdHJhY3RFZGl0aW5nTW9kZWwgcHJlcGFyZUFic3RyYWN0RWRpdGluZ01vZGVsKElGaWxlIGZpbGUsIElEb2N1bWVudCBkb2MsIGJvb2xlYW4gZ2VuZXJhdGVFZGl0TmFtZXMpIHsKLQkJQWJzdHJhY3RFZGl0aW5nTW9kZWwgbW9kZWw7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQlpZiAoZmlsZW5hbWUuZXF1YWxzKEZfTUFOSUZFU1QpKSB7Ci0JCQkvLyBUT0RPOiBpbmNsdWRlIHRlbXBsYXRlLm1mICYmIFRFU1QuTUY/PwotCQkJbW9kZWwgPSBuZXcgU3ByaW5nQnVuZGxlTW9kZWwoZG9jLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCW1vZGVsLnNldFVuZGVybHlpbmdSZXNvdXJjZShmaWxlKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmxvYWQoKTsKLQkJCUlNb2RlbFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IGNyZWF0ZUxpc3RlbmVyKGZpbGVuYW1lLCBkb2MsIGdlbmVyYXRlRWRpdE5hbWVzKTsKLQkJCW1vZGVsLmFkZE1vZGVsQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlQREVQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9CisgICAgcHJpdmF0ZSBzdGF0aWMgQWJzdHJhY3RFZGl0aW5nTW9kZWwgcHJlcGFyZUFic3RyYWN0RWRpdGluZ01vZGVsKElGaWxlIGZpbGUsIElEb2N1bWVudCBkb2MsIGJvb2xlYW4gZ2VuZXJhdGVFZGl0TmFtZXMpIHsKKyAgICAgICAgQWJzdHJhY3RFZGl0aW5nTW9kZWwgbW9kZWw7CisgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOworICAgICAgICBpZiAoZmlsZW5hbWUuZXF1YWxzKEZfTUFOSUZFU1QpKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBpbmNsdWRlIHRlbXBsYXRlLm1mICYmIFRFU1QuTUY/PworICAgICAgICAgICAgbW9kZWwgPSBuZXcgU3ByaW5nQnVuZGxlTW9kZWwoZG9jLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIG1vZGVsLnNldFVuZGVybHlpbmdSZXNvdXJjZShmaWxlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1vZGVsLmxvYWQoKTsKKyAgICAgICAgICAgIElNb2RlbFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IGNyZWF0ZUxpc3RlbmVyKGZpbGVuYW1lLCBkb2MsIGdlbmVyYXRlRWRpdE5hbWVzKTsKKyAgICAgICAgICAgIG1vZGVsLmFkZE1vZGVsQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBQREVQbHVnaW4ubG9nKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtb2RlbDsKKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBQREVGb3JtRWRpdG9yIGdldE9wZW5FZGl0b3IoTW9kZWxNb2RpZmljYXRpb24gbW9kaWZpY2F0aW9uKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRGaWxlKG1vZGlmaWNhdGlvbikuZ2V0UHJvamVjdCgpOwotCQlTdHJpbmcgbmFtZSA9IGdldEZpbGUobW9kaWZpY2F0aW9uKS5nZXROYW1lKCk7Ci0JCWlmIChuYW1lLmVxdWFscyhGX1BMVUdJTikgfHwgbmFtZS5lcXVhbHMoRl9GUkFHTUVOVCkgfHwgbmFtZS5lcXVhbHMoRl9NQU5JRkVTVCkKLQkJCQl8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInRlbXBsYXRlLm1mIikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJURVNULk1GIikpIHsKLQkJCXJldHVybiBnZXRPcGVuTWFuaWZlc3RFZGl0b3IocHJvamVjdCwgZ2V0RmlsZShtb2RpZmljYXRpb24pKTsKLQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscyhGX0JVSUxEKSkgewotCQkJUERFRm9ybUVkaXRvciBvcGVuRWRpdG9yID0gUERFTW9kZWxVdGlsaXR5LmdldE9wZW5CdWlsZFByb3BlcnRpZXNFZGl0b3IocHJvamVjdCk7Ci0JCQlpZiAob3BlbkVkaXRvciA9PSBudWxsKSB7Ci0JCQkJb3BlbkVkaXRvciA9IGdldE9wZW5NYW5pZmVzdEVkaXRvcihwcm9qZWN0LCBnZXRGaWxlKG1vZGlmaWNhdGlvbikpOwotCQkJfQotCQkJcmV0dXJuIG9wZW5FZGl0b3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIHByaXZhdGUgc3RhdGljIFBERUZvcm1FZGl0b3IgZ2V0T3BlbkVkaXRvcihNb2RlbE1vZGlmaWNhdGlvbiBtb2RpZmljYXRpb24pIHsKKyAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IGdldEZpbGUobW9kaWZpY2F0aW9uKS5nZXRQcm9qZWN0KCk7CisgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0RmlsZShtb2RpZmljYXRpb24pLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKEZfUExVR0lOKSB8fCBuYW1lLmVxdWFscyhGX0ZSQUdNRU5UKSB8fCBuYW1lLmVxdWFscyhGX01BTklGRVNUKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInRlbXBsYXRlLm1mIikKKyAgICAgICAgICAgIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiVEVTVC5NRiIpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0T3Blbk1hbmlmZXN0RWRpdG9yKHByb2plY3QsIGdldEZpbGUobW9kaWZpY2F0aW9uKSk7CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoRl9CVUlMRCkpIHsKKyAgICAgICAgICAgIFBERUZvcm1FZGl0b3Igb3BlbkVkaXRvciA9IFBERU1vZGVsVXRpbGl0eS5nZXRPcGVuQnVpbGRQcm9wZXJ0aWVzRWRpdG9yKHByb2plY3QpOworICAgICAgICAgICAgaWYgKG9wZW5FZGl0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG9wZW5FZGl0b3IgPSBnZXRPcGVuTWFuaWZlc3RFZGl0b3IocHJvamVjdCwgZ2V0RmlsZShtb2RpZmljYXRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBvcGVuRWRpdG9yOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgTWFuaWZlc3RFZGl0b3IgZ2V0T3Blbk1hbmlmZXN0RWRpdG9yKElQcm9qZWN0IHByb2plY3QsIElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIChNYW5pZmVzdEVkaXRvcikgZ2V0T3BlbkVkaXRvcihwcm9qZWN0LCBCdW5kbGVNYW5pZmVzdEVkaXRvci5JRF9FRElUT1IsIGZpbGUpOwotCX0KKyAgICBwdWJsaWMgc3RhdGljIE1hbmlmZXN0RWRpdG9yIGdldE9wZW5NYW5pZmVzdEVkaXRvcihJUHJvamVjdCBwcm9qZWN0LCBJRmlsZSBmaWxlKSB7CisgICAgICAgIHJldHVybiAoTWFuaWZlc3RFZGl0b3IpIGdldE9wZW5FZGl0b3IocHJvamVjdCwgQnVuZGxlTWFuaWZlc3RFZGl0b3IuSURfRURJVE9SLCBmaWxlKTsKKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBQREVGb3JtRWRpdG9yIGdldE9wZW5FZGl0b3IoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGVkaXRvcklkLCBJRmlsZSBmaWxlKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgZ2V0T3BlblBERUVkaXRvcnMoKS5nZXQocHJvamVjdCk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJUERFRm9ybUVkaXRvciBlZGl0b3IgPSAoUERFRm9ybUVkaXRvcikgbGlzdC5nZXQoaSk7Ci0JCQlpZiAoZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRJZCgpLmVxdWFscyhlZGl0b3JJZCkpIHsKLQkJCQlpZiAoZWRpdG9yLmdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkJCWlmICgoKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCkuZXF1YWxzKGZpbGUpKSB7Ci0JCQkJCQlyZXR1cm4gZWRpdG9yOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBQREVGb3JtRWRpdG9yIGdldE9wZW5FZGl0b3IoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGVkaXRvcklkLCBJRmlsZSBmaWxlKSB7CisgICAgICAgIEFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgZ2V0T3BlblBERUVkaXRvcnMoKS5nZXQocHJvamVjdCk7CisgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgUERFRm9ybUVkaXRvciBlZGl0b3IgPSAoUERFRm9ybUVkaXRvcikgbGlzdC5nZXQoaSk7CisgICAgICAgICAgICBpZiAoZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRJZCgpLmVxdWFscyhlZGl0b3JJZCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZWRpdG9yLmdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCkuZXF1YWxzKGZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWRpdG9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXByaXZhdGUgc3RhdGljIElCYXNlTW9kZWwgZ2V0TW9kZWxGcm9tRWRpdG9yKFBERUZvcm1FZGl0b3Igb3BlbkVkaXRvciwgTW9kZWxNb2RpZmljYXRpb24gbW9kaWZpY2F0aW9uKSB7Ci0JCWlmIChvcGVuRWRpdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gZ2V0RmlsZShtb2RpZmljYXRpb24pLmdldE5hbWUoKTsKLQkJSUJhc2VNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChuYW1lLmVxdWFscyhGX1BMVUdJTikgfHwgbmFtZS5lcXVhbHMoRl9GUkFHTUVOVCkpIHsKLQkJCW1vZGVsID0gb3BlbkVkaXRvci5nZXRBZ2dyZWdhdGVNb2RlbCgpOwotCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSUJ1bmRsZVBsdWdpbk1vZGVsQmFzZSkgewotCQkJCW1vZGVsID0gKChJQnVuZGxlUGx1Z2luTW9kZWxCYXNlKSBtb2RlbCkuZ2V0RXh0ZW5zaW9uc01vZGVsKCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoRl9CVUlMRCkpIHsKLQkJCWlmIChvcGVuRWRpdG9yIGluc3RhbmNlb2YgQnVpbGRFZGl0b3IpIHsKLQkJCQltb2RlbCA9IG9wZW5FZGl0b3IuZ2V0QWdncmVnYXRlTW9kZWwoKTsKLQkJCX0gZWxzZSBpZiAob3BlbkVkaXRvciBpbnN0YW5jZW9mIE1hbmlmZXN0RWRpdG9yKSB7Ci0JCQkJSUZvcm1QYWdlIHBhZ2UgPSBvcGVuRWRpdG9yLmZpbmRQYWdlKEJ1aWxkSW5wdXRDb250ZXh0LkNPTlRFWFRfSUQpOwotCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgQnVpbGRTb3VyY2VQYWdlKSB7Ci0JCQkJCW1vZGVsID0gKChCdWlsZFNvdXJjZVBhZ2UpIHBhZ2UpLmdldElucHV0Q29udGV4dCgpLmdldE1vZGVsKCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEZfTUFOSUZFU1QpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidGVtcGxhdGUubWYiKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlRFU1QuTUYiKSkgewotCQkJbW9kZWwgPSBvcGVuRWRpdG9yLmdldEFnZ3JlZ2F0ZU1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJQnVuZGxlUGx1Z2luTW9kZWxCYXNlKSB7Ci0JCQkJcmV0dXJuIG1vZGVsOwotCQkJfQotCQl9Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0RWRpdGluZ01vZGVsKSB7Ci0JCQlyZXR1cm4gbW9kZWw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIHByaXZhdGUgc3RhdGljIElCYXNlTW9kZWwgZ2V0TW9kZWxGcm9tRWRpdG9yKFBERUZvcm1FZGl0b3Igb3BlbkVkaXRvciwgTW9kZWxNb2RpZmljYXRpb24gbW9kaWZpY2F0aW9uKSB7CisgICAgICAgIGlmIChvcGVuRWRpdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0RmlsZShtb2RpZmljYXRpb24pLmdldE5hbWUoKTsKKyAgICAgICAgSUJhc2VNb2RlbCBtb2RlbCA9IG51bGw7CisgICAgICAgIGlmIChuYW1lLmVxdWFscyhGX1BMVUdJTikgfHwgbmFtZS5lcXVhbHMoRl9GUkFHTUVOVCkpIHsKKyAgICAgICAgICAgIG1vZGVsID0gb3BlbkVkaXRvci5nZXRBZ2dyZWdhdGVNb2RlbCgpOworICAgICAgICAgICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgSUJ1bmRsZVBsdWdpbk1vZGVsQmFzZSkgeworICAgICAgICAgICAgICAgIG1vZGVsID0gKChJQnVuZGxlUGx1Z2luTW9kZWxCYXNlKSBtb2RlbCkuZ2V0RXh0ZW5zaW9uc01vZGVsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobmFtZS5lcXVhbHMoRl9CVUlMRCkpIHsKKyAgICAgICAgICAgIGlmIChvcGVuRWRpdG9yIGluc3RhbmNlb2YgQnVpbGRFZGl0b3IpIHsKKyAgICAgICAgICAgICAgICBtb2RlbCA9IG9wZW5FZGl0b3IuZ2V0QWdncmVnYXRlTW9kZWwoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3BlbkVkaXRvciBpbnN0YW5jZW9mIE1hbmlmZXN0RWRpdG9yKSB7CisgICAgICAgICAgICAgICAgSUZvcm1QYWdlIHBhZ2UgPSBvcGVuRWRpdG9yLmZpbmRQYWdlKEJ1aWxkSW5wdXRDb250ZXh0LkNPTlRFWFRfSUQpOworICAgICAgICAgICAgICAgIGlmIChwYWdlIGluc3RhbmNlb2YgQnVpbGRTb3VyY2VQYWdlKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gKChCdWlsZFNvdXJjZVBhZ2UpIHBhZ2UpLmdldElucHV0Q29udGV4dCgpLmdldE1vZGVsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKEZfTUFOSUZFU1QpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgidGVtcGxhdGUubWYiKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlRFU1QuTUYiKSkgeworICAgICAgICAgICAgbW9kZWwgPSBvcGVuRWRpdG9yLmdldEFnZ3JlZ2F0ZU1vZGVsKCk7CisgICAgICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJQnVuZGxlUGx1Z2luTW9kZWxCYXNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0RWRpdGluZ01vZGVsKSB7CisgICAgICAgICAgICByZXR1cm4gbW9kZWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtb2RpZnlFZGl0b3JNb2RlbChmaW5hbCBCdW5kbGVNb2RlbE1vZGlmaWNhdGlvbiBtb2QsIGZpbmFsIFBERUZvcm1FZGl0b3IgZWRpdG9yLAotCQkJZmluYWwgSUJhc2VNb2RlbCBtb2RlbCwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9kLm1vZGlmeVNwcmluZ0J1bmRsZShtb2RlbCwgbW9uaXRvcik7Ci0JCQkJCUlGaWxlW10gZmlsZXMgPSBuZXcgSUZpbGVbXSB7IGdldE1hbmlmZXN0RmlsZShtb2QpLCBnZXRYTUxGaWxlKG1vZCksIGdldFByb3BlcnRpZXNGaWxlKG1vZCkgfTsKLQkJCQkJZm9yIChJRmlsZSBlbGVtZW50IDogZmlsZXMpIHsKLQkJCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCUlucHV0Q29udGV4dCBjb24gPSBlZGl0b3IuZ2V0Q29udGV4dE1hbmFnZXIoKS5maW5kQ29udGV4dChlbGVtZW50KTsKLQkJCQkJCWlmIChjb24gIT0gbnVsbCkgewotCQkJCQkJCWNvbi5mbHVzaEVkaXRvcklucHV0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG1vZC5zYXZlT3BlbkVkaXRvcigpKSB7Ci0JCQkJCQllZGl0b3IuZG9TYXZlKG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBQREVQbHVnaW4ubG9nKGUpOwotCQkJCS8vIH0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUERFUGx1Z2luLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1vZGlmeUVkaXRvck1vZGVsKGZpbmFsIEJ1bmRsZU1vZGVsTW9kaWZpY2F0aW9uIG1vZCwgZmluYWwgUERFRm9ybUVkaXRvciBlZGl0b3IsIGZpbmFsIElCYXNlTW9kZWwgbW9kZWwsCisgICAgICAgIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworICAgICAgICBnZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewogCi0JcHJpdmF0ZSBzdGF0aWMgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5OwotCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBtb2QubW9kaWZ5U3ByaW5nQnVuZGxlKG1vZGVsLCBtb25pdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVtdIHsgZ2V0TWFuaWZlc3RGaWxlKG1vZCksIGdldFhNTEZpbGUobW9kKSwgZ2V0UHJvcGVydGllc0ZpbGUobW9kKSB9OworICAgICAgICAgICAgICAgICAgICBmb3IgKElGaWxlIGVsZW1lbnQgOiBmaWxlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRDb250ZXh0IGNvbiA9IGVkaXRvci5nZXRDb250ZXh0TWFuYWdlcigpLmZpbmRDb250ZXh0KGVsZW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uLmZsdXNoRWRpdG9ySW5wdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobW9kLnNhdmVPcGVuRWRpdG9yKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvci5kb1NhdmUobW9uaXRvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIFBERVBsdWdpbi5sb2coZSk7CisgICAgICAgICAgICAgICAgLy8gfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBQREVQbHVnaW4ubG9nKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGdldE9wZW5QREVFZGl0b3JzKCkgewotCQl0cnkgewotCQkJRmllbGQgb3BlbkVkaXRvcnNGaWVsZCA9IFBERU1vZGVsVXRpbGl0eS5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJmT3BlblBERUVkaXRvcnMiKTsKLQkJCW9wZW5FZGl0b3JzRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCUhhc2h0YWJsZSBvcGVuRWRpdG9ycyA9IChIYXNodGFibGUpIG9wZW5FZGl0b3JzRmllbGQuZ2V0KG51bGwpOwotCQkJcmV0dXJuIG9wZW5FZGl0b3JzOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBIYXNodGFibGUoKTsKLQkJfQotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBEaXNwbGF5IGdldERpc3BsYXkoKSB7CisgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOworICAgICAgICBpZiAoZGlzcGxheSA9PSBudWxsKSB7CisgICAgICAgICAgICBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRpc3BsYXk7CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgSUZpbGUgZ2V0RmlsZShNb2RlbE1vZGlmaWNhdGlvbiBtb2QpIHsKLQkJdHJ5IHsKLQkJCU1ldGhvZCBnZXRGaWxlTWV0aG9kID0gTW9kZWxNb2RpZmljYXRpb24uY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImdldEZpbGUiLCAoQ2xhc3NbXSkgbnVsbCk7Ci0JCQlnZXRGaWxlTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCQlPYmplY3Qgb2JqID0gZ2V0RmlsZU1ldGhvZC5pbnZva2UobW9kLCAoT2JqZWN0W10pIG51bGwpOwotCQkJaWYgKG9iaiA9PSBudWxsKSB7Ci0JCQkJaWYgKG1vZCBpbnN0YW5jZW9mIEJ1bmRsZU1vZGVsTW9kaWZpY2F0aW9uKSB7Ci0JCQkJCXJldHVybiAoKEJ1bmRsZU1vZGVsTW9kaWZpY2F0aW9uKSBtb2QpLmdldElmaWxlKCk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gKElGaWxlKSBvYmo7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgZ2V0T3BlblBERUVkaXRvcnMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWVsZCBvcGVuRWRpdG9yc0ZpZWxkID0gUERFTW9kZWxVdGlsaXR5LmNsYXNzLmdldERlY2xhcmVkRmllbGQoImZPcGVuUERFRWRpdG9ycyIpOworICAgICAgICAgICAgb3BlbkVkaXRvcnNGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgSGFzaHRhYmxlIG9wZW5FZGl0b3JzID0gKEhhc2h0YWJsZSkgb3BlbkVkaXRvcnNGaWVsZC5nZXQobnVsbCk7CisgICAgICAgICAgICByZXR1cm4gb3BlbkVkaXRvcnM7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgSUZpbGUgZ2V0TWFuaWZlc3RGaWxlKE1vZGVsTW9kaWZpY2F0aW9uIG1vZCkgewotCQl0cnkgewotCQkJTWV0aG9kIGdldEZpbGVNZXRob2QgPSBNb2RlbE1vZGlmaWNhdGlvbi5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0TWFuaWZlc3RGaWxlIiwgKENsYXNzW10pIG51bGwpOwotCQkJZ2V0RmlsZU1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQkJT2JqZWN0IG9iaiA9IGdldEZpbGVNZXRob2QuaW52b2tlKG1vZCwgKE9iamVjdFtdKSBudWxsKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCXJldHVybiAoSUZpbGUpIG9iajsKLQkJCX0gZWxzZSBpZiAobW9kIGluc3RhbmNlb2YgQnVuZGxlTW9kZWxNb2RpZmljYXRpb24pIHsKLQkJCQlyZXR1cm4gKChCdW5kbGVNb2RlbE1vZGlmaWNhdGlvbikgbW9kKS5nZXRJZmlsZSgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBJRmlsZSBnZXRGaWxlKE1vZGVsTW9kaWZpY2F0aW9uIG1vZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIGdldEZpbGVNZXRob2QgPSBNb2RlbE1vZGlmaWNhdGlvbi5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0RmlsZSIsIChDbGFzc1tdKSBudWxsKTsKKyAgICAgICAgICAgIGdldEZpbGVNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBnZXRGaWxlTWV0aG9kLmludm9rZShtb2QsIChPYmplY3RbXSkgbnVsbCk7CisgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobW9kIGluc3RhbmNlb2YgQnVuZGxlTW9kZWxNb2RpZmljYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoQnVuZGxlTW9kZWxNb2RpZmljYXRpb24pIG1vZCkuZ2V0SWZpbGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAoSUZpbGUpIG9iajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgSUZpbGUgZ2V0WE1MRmlsZShNb2RlbE1vZGlmaWNhdGlvbiBtb2QpIHsKLQkJdHJ5IHsKLQkJCU1ldGhvZCBnZXRGaWxlTWV0aG9kID0gTW9kZWxNb2RpZmljYXRpb24uY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImdldFhNTEZpbGUiLCAoQ2xhc3NbXSkgbnVsbCk7Ci0JCQlnZXRGaWxlTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCQlPYmplY3Qgb2JqID0gZ2V0RmlsZU1ldGhvZC5pbnZva2UobW9kLCAoT2JqZWN0W10pIG51bGwpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJcmV0dXJuIChJRmlsZSkgb2JqOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBJRmlsZSBnZXRNYW5pZmVzdEZpbGUoTW9kZWxNb2RpZmljYXRpb24gbW9kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgZ2V0RmlsZU1ldGhvZCA9IE1vZGVsTW9kaWZpY2F0aW9uLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRNYW5pZmVzdEZpbGUiLCAoQ2xhc3NbXSkgbnVsbCk7CisgICAgICAgICAgICBnZXRGaWxlTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICBPYmplY3Qgb2JqID0gZ2V0RmlsZU1ldGhvZC5pbnZva2UobW9kLCAoT2JqZWN0W10pIG51bGwpOworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElGaWxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChJRmlsZSkgb2JqOworICAgICAgICAgICAgfSBlbHNlIGlmIChtb2QgaW5zdGFuY2VvZiBCdW5kbGVNb2RlbE1vZGlmaWNhdGlvbikgeworICAgICAgICAgICAgICAgIHJldHVybiAoKEJ1bmRsZU1vZGVsTW9kaWZpY2F0aW9uKSBtb2QpLmdldElmaWxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgSUZpbGUgZ2V0UHJvcGVydGllc0ZpbGUoTW9kZWxNb2RpZmljYXRpb24gbW9kKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2QgZ2V0RmlsZU1ldGhvZCA9IE1vZGVsTW9kaWZpY2F0aW9uLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRQcm9wZXJ0aWVzRmlsZSIsIChDbGFzc1tdKSBudWxsKTsKLQkJCWdldEZpbGVNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCU9iamVjdCBvYmogPSBnZXRGaWxlTWV0aG9kLmludm9rZShtb2QsIChPYmplY3RbXSkgbnVsbCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlyZXR1cm4gKElGaWxlKSBvYmo7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQorICAgIHByaXZhdGUgc3RhdGljIElGaWxlIGdldFhNTEZpbGUoTW9kZWxNb2RpZmljYXRpb24gbW9kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgZ2V0RmlsZU1ldGhvZCA9IE1vZGVsTW9kaWZpY2F0aW9uLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRYTUxGaWxlIiwgKENsYXNzW10pIG51bGwpOworICAgICAgICAgICAgZ2V0RmlsZU1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGdldEZpbGVNZXRob2QuaW52b2tlKG1vZCwgKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJRmlsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoSUZpbGUpIG9iajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRnVsbEJ1bmRsZU1vZGlmaWNhdGlvbihNb2RlbE1vZGlmaWNhdGlvbiBtb2QpIHsKLQkJdHJ5IHsKLQkJCU1ldGhvZCBnZXRCb29sZWFuTWV0aG9kID0gTW9kZWxNb2RpZmljYXRpb24uY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImlzRnVsbEJ1bmRsZU1vZGlmaWNhdGlvbiIsCi0JCQkJCShDbGFzc1tdKSBudWxsKTsKLQkJCWdldEJvb2xlYW5NZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCU9iamVjdCBvYmogPSBnZXRCb29sZWFuTWV0aG9kLmludm9rZShtb2QsIChPYmplY3RbXSkgbnVsbCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJCUJvb2xlYW4gYm9vbCA9IChCb29sZWFuKSBvYmo7Ci0JCQkJcmV0dXJuIGJvb2wuYm9vbGVhblZhbHVlKCk7Ci0JCQl9IGVsc2UgaWYgKG1vZCBpbnN0YW5jZW9mIEJ1bmRsZU1vZGVsTW9kaWZpY2F0aW9uKSB7Ci0JCQkJSUZpbGUgZmlsZSA9ICgoQnVuZGxlTW9kZWxNb2RpZmljYXRpb24pIG1vZCkuZ2V0SWZpbGUoKTsKLQkJCQlyZXR1cm4gZmlsZS5nZXROYW1lKCkuZXF1YWxzKEZfTUFOSUZFU1QpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKG1vZCBpbnN0YW5jZW9mIEJ1bmRsZU1vZGVsTW9kaWZpY2F0aW9uKSB7Ci0JCQkJSUZpbGUgZmlsZSA9ICgoQnVuZGxlTW9kZWxNb2RpZmljYXRpb24pIG1vZCkuZ2V0SWZpbGUoKTsKLQkJCQlyZXR1cm4gZmlsZS5nZXROYW1lKCkuZXF1YWxzKEZfTUFOSUZFU1QpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9CisgICAgcHJpdmF0ZSBzdGF0aWMgSUZpbGUgZ2V0UHJvcGVydGllc0ZpbGUoTW9kZWxNb2RpZmljYXRpb24gbW9kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgZ2V0RmlsZU1ldGhvZCA9IE1vZGVsTW9kaWZpY2F0aW9uLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRQcm9wZXJ0aWVzRmlsZSIsIChDbGFzc1tdKSBudWxsKTsKKyAgICAgICAgICAgIGdldEZpbGVNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBnZXRGaWxlTWV0aG9kLmludm9rZShtb2QsIChPYmplY3RbXSkgbnVsbCk7CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUZpbGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKElGaWxlKSBvYmo7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQogCi0JfQorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGdWxsQnVuZGxlTW9kaWZpY2F0aW9uKE1vZGVsTW9kaWZpY2F0aW9uIG1vZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIGdldEJvb2xlYW5NZXRob2QgPSBNb2RlbE1vZGlmaWNhdGlvbi5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiaXNGdWxsQnVuZGxlTW9kaWZpY2F0aW9uIiwgKENsYXNzW10pIG51bGwpOworICAgICAgICAgICAgZ2V0Qm9vbGVhbk1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGdldEJvb2xlYW5NZXRob2QuaW52b2tlKG1vZCwgKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBCb29sZWFuKSB7CisgICAgICAgICAgICAgICAgQm9vbGVhbiBib29sID0gKEJvb2xlYW4pIG9iajsKKyAgICAgICAgICAgICAgICByZXR1cm4gYm9vbC5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kIGluc3RhbmNlb2YgQnVuZGxlTW9kZWxNb2RpZmljYXRpb24pIHsKKyAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKChCdW5kbGVNb2RlbE1vZGlmaWNhdGlvbikgbW9kKS5nZXRJZmlsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLmdldE5hbWUoKS5lcXVhbHMoRl9NQU5JRkVTVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAobW9kIGluc3RhbmNlb2YgQnVuZGxlTW9kZWxNb2RpZmljYXRpb24pIHsKKyAgICAgICAgICAgICAgICBJRmlsZSBmaWxlID0gKChCdW5kbGVNb2RlbE1vZGlmaWNhdGlvbikgbW9kKS5nZXRJZmlsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLmdldE5hbWUoKS5lcXVhbHMoRl9NQU5JRkVTVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KIAotCXByaXZhdGUgc3RhdGljIElNb2RlbFRleHRDaGFuZ2VMaXN0ZW5lcltdIGdhdGhlckxpc3RlbmVycyhJQmFzZU1vZGVsIGVkaXRNb2RlbCkgewotCQlJTW9kZWxUZXh0Q2hhbmdlTGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBuZXcgSU1vZGVsVGV4dENoYW5nZUxpc3RlbmVyWzBdOwotCQlpZiAoZWRpdE1vZGVsIGluc3RhbmNlb2YgQWJzdHJhY3RFZGl0aW5nTW9kZWwpIHsKLQkJCWxpc3RlbmVycyA9IG5ldyBJTW9kZWxUZXh0Q2hhbmdlTGlzdGVuZXJbXSB7ICgoQWJzdHJhY3RFZGl0aW5nTW9kZWwpIGVkaXRNb2RlbCkuZ2V0TGFzdFRleHRDaGFuZ2VMaXN0ZW5lcigpIH07Ci0JCX0KLQkJaWYgKGVkaXRNb2RlbCBpbnN0YW5jZW9mIElCdW5kbGVQbHVnaW5Nb2RlbEJhc2UpIHsKLQkJCUlCdW5kbGVQbHVnaW5Nb2RlbEJhc2UgbW9kZWxCYXNlID0gKElCdW5kbGVQbHVnaW5Nb2RlbEJhc2UpIGVkaXRNb2RlbDsKLQkJCWxpc3RlbmVycyA9IG5ldyBJTW9kZWxUZXh0Q2hhbmdlTGlzdGVuZXJbMl07Ci0JCQlsaXN0ZW5lcnNbRl9CaV0gPSBnYXRoZXJMaXN0ZW5lcihtb2RlbEJhc2UuZ2V0QnVuZGxlTW9kZWwoKSk7Ci0JCQlsaXN0ZW5lcnNbRl9YaV0gPSBnYXRoZXJMaXN0ZW5lcihtb2RlbEJhc2UuZ2V0RXh0ZW5zaW9uc01vZGVsKCkpOwotCQkJcmV0dXJuIGxpc3RlbmVyczsKLQkJfQotCQlyZXR1cm4gbGlzdGVuZXJzOwotCX0KKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBJTW9kZWxUZXh0Q2hhbmdlTGlzdGVuZXIgY3JlYXRlTGlzdGVuZXIoU3RyaW5nIGZpbGVuYW1lLCBJRG9jdW1lbnQgZG9jLCBib29sZWFuIGdlbmVyYXRlRWRpdE5hbWVzKSB7Ci0JCWlmIChmaWxlbmFtZS5lcXVhbHMoRl9QTFVHSU4pIHx8IGZpbGVuYW1lLmVxdWFscyhGX0ZSQUdNRU5UKSkgewotCQkJcmV0dXJuIG5ldyBYTUxUZXh0Q2hhbmdlTGlzdGVuZXIoZG9jLCBnZW5lcmF0ZUVkaXROYW1lcyk7Ci0JCX0gZWxzZSBpZiAoZmlsZW5hbWUuZXF1YWxzKEZfTUFOSUZFU1QpKSB7Ci0JCQkvLyBUT0RPOiBpbmNsdWRlIHRlbXBsYXRlLm1mICYmIFRFU1QuTUY/PwotCQkJcmV0dXJuIG5ldyBCdW5kbGVUZXh0Q2hhbmdlTGlzdGVuZXIoZG9jLCBnZW5lcmF0ZUVkaXROYW1lcyk7Ci0JCX0gZWxzZSBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoRl9QUk9QRVJUSUVTKSkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0aWVzVGV4dENoYW5nZUxpc3RlbmVyKGRvYywgZ2VuZXJhdGVFZGl0TmFtZXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwcml2YXRlIHN0YXRpYyBJTW9kZWxUZXh0Q2hhbmdlTGlzdGVuZXJbXSBnYXRoZXJMaXN0ZW5lcnMoSUJhc2VNb2RlbCBlZGl0TW9kZWwpIHsKKyAgICAgICAgSU1vZGVsVGV4dENoYW5nZUxpc3RlbmVyW10gbGlzdGVuZXJzID0gbmV3IElNb2RlbFRleHRDaGFuZ2VMaXN0ZW5lclswXTsKKyAgICAgICAgaWYgKGVkaXRNb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0RWRpdGluZ01vZGVsKSB7CisgICAgICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgSU1vZGVsVGV4dENoYW5nZUxpc3RlbmVyW10geyAoKEFic3RyYWN0RWRpdGluZ01vZGVsKSBlZGl0TW9kZWwpLmdldExhc3RUZXh0Q2hhbmdlTGlzdGVuZXIoKSB9OworICAgICAgICB9CisgICAgICAgIGlmIChlZGl0TW9kZWwgaW5zdGFuY2VvZiBJQnVuZGxlUGx1Z2luTW9kZWxCYXNlKSB7CisgICAgICAgICAgICBJQnVuZGxlUGx1Z2luTW9kZWxCYXNlIG1vZGVsQmFzZSA9IChJQnVuZGxlUGx1Z2luTW9kZWxCYXNlKSBlZGl0TW9kZWw7CisgICAgICAgICAgICBsaXN0ZW5lcnMgPSBuZXcgSU1vZGVsVGV4dENoYW5nZUxpc3RlbmVyWzJdOworICAgICAgICAgICAgbGlzdGVuZXJzW0ZfQmldID0gZ2F0aGVyTGlzdGVuZXIobW9kZWxCYXNlLmdldEJ1bmRsZU1vZGVsKCkpOworICAgICAgICAgICAgbGlzdGVuZXJzW0ZfWGldID0gZ2F0aGVyTGlzdGVuZXIobW9kZWxCYXNlLmdldEV4dGVuc2lvbnNNb2RlbCgpKTsKKyAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3RlbmVyczsKKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyBJTW9kZWxUZXh0Q2hhbmdlTGlzdGVuZXIgZ2F0aGVyTGlzdGVuZXIoSUJhc2VNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBBYnN0cmFjdEVkaXRpbmdNb2RlbCkgewotCQkJcmV0dXJuICgoQWJzdHJhY3RFZGl0aW5nTW9kZWwpIG1vZGVsKS5nZXRMYXN0VGV4dENoYW5nZUxpc3RlbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIHByaXZhdGUgc3RhdGljIElNb2RlbFRleHRDaGFuZ2VMaXN0ZW5lciBjcmVhdGVMaXN0ZW5lcihTdHJpbmcgZmlsZW5hbWUsIElEb2N1bWVudCBkb2MsIGJvb2xlYW4gZ2VuZXJhdGVFZGl0TmFtZXMpIHsKKyAgICAgICAgaWYgKGZpbGVuYW1lLmVxdWFscyhGX1BMVUdJTikgfHwgZmlsZW5hbWUuZXF1YWxzKEZfRlJBR01FTlQpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFhNTFRleHRDaGFuZ2VMaXN0ZW5lcihkb2MsIGdlbmVyYXRlRWRpdE5hbWVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChmaWxlbmFtZS5lcXVhbHMoRl9NQU5JRkVTVCkpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGluY2x1ZGUgdGVtcGxhdGUubWYgJiYgVEVTVC5NRj8/CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1bmRsZVRleHRDaGFuZ2VMaXN0ZW5lcihkb2MsIGdlbmVyYXRlRWRpdE5hbWVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChmaWxlbmFtZS5lbmRzV2l0aChGX1BST1BFUlRJRVMpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnRpZXNUZXh0Q2hhbmdlTGlzdGVuZXIoZG9jLCBnZW5lcmF0ZUVkaXROYW1lcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLy8gYnVuZGxlIC8geG1sIHZhcmlvdXMgT2JqZWN0W10gaW5kaWNlcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGX0JpID0gMDsgLy8gdGhlIG1hbmlmZXN0Lm1mLXJlbGF0ZWQgb2JqZWN0IHdpbGwKKyAgICBwcml2YXRlIHN0YXRpYyBJTW9kZWxUZXh0Q2hhbmdlTGlzdGVuZXIgZ2F0aGVyTGlzdGVuZXIoSUJhc2VNb2RlbCBtb2RlbCkgeworICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBBYnN0cmFjdEVkaXRpbmdNb2RlbCkgeworICAgICAgICAgICAgcmV0dXJuICgoQWJzdHJhY3RFZGl0aW5nTW9kZWwpIG1vZGVsKS5nZXRMYXN0VGV4dENoYW5nZUxpc3RlbmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLy8gYWx3YXlzIGJlIDFzdAorICAgIC8vIGJ1bmRsZSAvIHhtbCB2YXJpb3VzIE9iamVjdFtdIGluZGljZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRl9CaSA9IDA7IC8vIHRoZSBtYW5pZmVzdC5tZi1yZWxhdGVkIG9iamVjdCB3aWxsCiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRl9YaSA9IDE7IC8vIHRoZSB4bWwtcmVsYXRlZCBvYmplY3Qgd2lsbCBhbHdheXMgYmUKLQkvLyAybmQKKyAgICAvLyBhbHdheXMgYmUgMXN0CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRl9YaSA9IDE7IC8vIHRoZSB4bWwtcmVsYXRlZCBvYmplY3Qgd2lsbCBhbHdheXMgYmUKKyAgICAvLyAybmQKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvcGxhbi9QbGFuQWRhcHRlckZhY3RvcnlQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9wbGFuL1BsYW5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKaW5kZXggMjgwMWJmNS4uYjg2NjY1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9wbGFuL1BsYW5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9wbGFuL1BsYW5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnMucGxhbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwpAQCAtMTksOSArMjAsOSBAQAogICovCiBwdWJsaWMgY2xhc3MgUGxhbkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yWE1MIHsKIAotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRm9yKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIChjb250ZW50VHlwZURlc2NyaXB0aW9uIGluc3RhbmNlb2YgUGxhbk1vZGVsSGFuZGxlcik7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRm9yKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBQbGFuTW9kZWxIYW5kbGVyOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9wbGFuL1BsYW5Db250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3BsYW4vUGxhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQppbmRleCBhODE5N2EwLi5jY2M0MzU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3BsYW4vUGxhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3BsYW4vUGxhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9ycy5wbGFuOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTQyLDE0OCArNDMsMTQ1IEBACiAKIC8qKgogICogQ29udGVudCBhc3Npc3QgcHJvY2Vzc29yIGZvciBwbGFuIGZpbGVzLgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAYXV0aG9yIExlbyBEb3MgU2FudG9zCiAgKiBAc2luY2UgMi4zLjEKICAqLwogcHVibGljIGNsYXNzIFBsYW5Db250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgRGVmYXVsdFhNTENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBUWVBFUyA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImNvbmZpZ3VyYXRpb24iLCAiYnVuZGxlIiwgInBsYW4iLCAicGFyIiB9KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gVFlQRVMgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJjb25maWd1cmF0aW9uIiwgImJ1bmRsZSIsICJwbGFuIiwgInBhciIgfSk7CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0LCBDb21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyLmFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKHJlcXVlc3QsIGNvbnRleHQpOwotCQlTdHJpbmcgYXR0ciA9IGZpbmRBdHRyaWJ1dGUocmVxdWVzdCk7Ci0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCWlmIChhdHRyLmVxdWFscygidHlwZSIpKSB7Ci0JCQkJY29tcHV0ZVR5cGVDb250ZW50UHJvcG9zYWxzKHJlcXVlc3QsIGNvbnRleHQpOwotCQkJfSBlbHNlIGlmIChhdHRyLmVxdWFscygibmFtZSIpKSB7Ci0JCQkJY29tcHV0ZU5hbWVDb250ZW50UHJvcG9zYWxzKHJlcXVlc3QsIGNvbnRleHQpOwotCQkJfSBlbHNlIGlmIChhdHRyLmVxdWFscygidmVyc2lvbiIpKSB7Ci0JCQkJY29tcHV0ZVZlcnNpb25Db250ZW50UHJvcG9zYWxzKHJlcXVlc3QsIGNvbnRleHQpOwotCQkJfQotCQl9Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QsIENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIuYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMocmVxdWVzdCwgY29udGV4dCk7CisgICAgICAgIFN0cmluZyBhdHRyID0gZmluZEF0dHJpYnV0ZShyZXF1ZXN0KTsKKyAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGF0dHIuZXF1YWxzKCJ0eXBlIikpIHsKKyAgICAgICAgICAgICAgICBjb21wdXRlVHlwZUNvbnRlbnRQcm9wb3NhbHMocmVxdWVzdCwgY29udGV4dCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHIuZXF1YWxzKCJuYW1lIikpIHsKKyAgICAgICAgICAgICAgICBjb21wdXRlTmFtZUNvbnRlbnRQcm9wb3NhbHMocmVxdWVzdCwgY29udGV4dCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHIuZXF1YWxzKCJ2ZXJzaW9uIikpIHsKKyAgICAgICAgICAgICAgICBjb21wdXRlVmVyc2lvbkNvbnRlbnRQcm9wb3NhbHMocmVxdWVzdCwgY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgY29tcHV0ZU5hbWVDb250ZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QsIENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nIHByZWZpeCA9IGNsZWFuSW5wdXQocmVxdWVzdC5nZXRNYXRjaFN0cmluZygpKTsKLQkJU3RyaW5nIHR5cGUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShyZXF1ZXN0LmdldE5vZGUoKSwgInR5cGUiKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCB8fCAiYnVuZGxlIi5lcXVhbHModHlwZSkpIHsKLQkJCUlGaWxlIGZpbGUgPSBnZXRGaWxlKHJlcXVlc3QpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCVNldDxBcnRlZmFjdD4gYnVuZGxlcyA9IFJlcG9zaXRvcnlVdGlscy5nZXRJbXBvcnRCdW5kbGVQcm9wb3NhbHMoZmlsZS5nZXRQcm9qZWN0KCksIHByZWZpeCk7Ci0JCQkJZm9yIChJQXJ0ZWZhY3QgYnVuZGxlIDogYnVuZGxlcykgewotCQkJCQlTdHJpbmcgdmFsdWUgPSAiXCIiICsgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpICsgIlwiIjsKLQkJCQkJcmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ29tcGxldGlvblByb3Bvc2FsKHZhbHVlLCByZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJCXJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgdmFsdWUubGVuZ3RoKCksCi0JCQkJCQkJU2VydmVySWRlVWlQbHVnaW4uZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvb3NnaV9vYmouZ2lmIiksIHZhbHVlLCBudWxsLCBudWxsKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgIHByaXZhdGUgdm9pZCBjb21wdXRlTmFtZUNvbnRlbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgcmVxdWVzdCwgQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgeworICAgICAgICBTdHJpbmcgcHJlZml4ID0gY2xlYW5JbnB1dChyZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkpOworICAgICAgICBTdHJpbmcgdHlwZSA9IGdldEF0dHJpYnV0ZVZhbHVlKHJlcXVlc3QuZ2V0Tm9kZSgpLCAidHlwZSIpOworICAgICAgICBpZiAodHlwZSA9PSBudWxsIHx8ICJidW5kbGUiLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgSUZpbGUgZmlsZSA9IGdldEZpbGUocmVxdWVzdCk7CisgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU2V0PEFydGVmYWN0PiBidW5kbGVzID0gUmVwb3NpdG9yeVV0aWxzLmdldEltcG9ydEJ1bmRsZVByb3Bvc2FscyhmaWxlLmdldFByb2plY3QoKSwgcHJlZml4KTsKKyAgICAgICAgICAgICAgICBmb3IgKElBcnRlZmFjdCBidW5kbGUgOiBidW5kbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICJcIiIgKyBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkgKyAiXCIiOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZFByb3Bvc2FsKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwodmFsdWUsIHJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIHJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmxlbmd0aCgpLCBTZXJ2ZXJJZGVVaVBsdWdpbi5nZXRJbWFnZSgiZnVsbC9vYmoxNi9vc2dpX29iai5naWYiKSwgdmFsdWUsIG51bGwsIG51bGwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgY29tcHV0ZVR5cGVDb250ZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QsIENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nIHByZWZpeCA9IGNsZWFuSW5wdXQocmVxdWVzdC5nZXRNYXRjaFN0cmluZygpKTsKLQkJZm9yIChTdHJpbmcgdHlwZSA6IFRZUEVTKSB7Ci0JCQlpZiAodHlwZS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLQkJCQlTdHJpbmcgdmFsdWUgPSAiXCIiICsgdHlwZSArICJcIiI7Ci0JCQkJcmVxdWVzdC5hZGRQcm9wb3NhbChuZXcgQ29tcGxldGlvblByb3Bvc2FsKHZhbHVlLCByZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJcmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCB2YWx1ZS5sZW5ndGgoKSkpOwotCQkJCTsKLQkJCX0KLQkJfQotCX0KKyAgICBwcml2YXRlIHZvaWQgY29tcHV0ZVR5cGVDb250ZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QsIENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgU3RyaW5nIHByZWZpeCA9IGNsZWFuSW5wdXQocmVxdWVzdC5nZXRNYXRjaFN0cmluZygpKTsKKyAgICAgICAgZm9yIChTdHJpbmcgdHlwZSA6IFRZUEVTKSB7CisgICAgICAgICAgICBpZiAodHlwZS5zdGFydHNXaXRoKHByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAiXCIiICsgdHlwZSArICJcIiI7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRQcm9wb3NhbCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBsZXRpb25Qcm9wb3NhbCh2YWx1ZSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCB2YWx1ZS5sZW5ndGgoKSkpOworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXByaXZhdGUgdm9pZCBjb21wdXRlVmVyc2lvbkNvbnRlbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgcmVxdWVzdCwKLQkJCUNvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nIHByZWZpeCA9IGNsZWFuSW5wdXQocmVxdWVzdC5nZXRNYXRjaFN0cmluZygpKTsKLQkJU3RyaW5nIGJ1bmRsZUlkID0gZ2V0QXR0cmlidXRlVmFsdWUocmVxdWVzdC5nZXROb2RlKCksICJuYW1lIik7Ci0JCVN0cmluZyB0eXBlID0gZ2V0QXR0cmlidXRlVmFsdWUocmVxdWVzdC5nZXROb2RlKCksICJ0eXBlIik7Ci0JCWlmICh0eXBlID09IG51bGwgfHwgImJ1bmRsZSIuZXF1YWxzKHR5cGUpKSB7Ci0JCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShyZXF1ZXN0KTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlTZXQ8QXJ0ZWZhY3Q+IGJ1bmRsZXMgPSBSZXBvc2l0b3J5VXRpbHMuZ2V0SW1wb3J0QnVuZGxlUHJvcG9zYWxzKGZpbGUuZ2V0UHJvamVjdCgpLCBidW5kbGVJZCk7Ci0JCQkJZm9yIChJQXJ0ZWZhY3QgZWxlbWVudCA6IGJ1bmRsZXMpIHsKLQkJCQkJaWYgKGVsZW1lbnQuZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShidW5kbGVJZCkpIHsKLQkJCQkJCUxpc3Q8U3RyaW5nPiBwcm9wb3NhbFZhbHVlcyA9IGdldFZlcnNpb25Qcm9wb3NhbHMoZWxlbWVudC5nZXRWZXJzaW9uKCkpOwotCQkJCQkJZm9yIChTdHJpbmcgcHJvcG9zYWxWYWx1ZSA6IHByb3Bvc2FsVmFsdWVzKSB7Ci0JCQkJCQkJaWYgKHByb3Bvc2FsVmFsdWUucmVnaW9uTWF0Y2hlcygwLCBwcmVmaXgsIDAsIHByZWZpeC5sZW5ndGgoKSkpIHsKLQkJCQkJCQkJU3RyaW5nIHZhbHVlID0gIlwiIiArIHByb3Bvc2FsVmFsdWUgKyAiXCIiOwotCQkJCQkJCQlyZXF1ZXN0LmFkZFByb3Bvc2FsKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwodmFsdWUsCi0JCQkJCQkJCQkJcmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLAotCQkJCQkJCQkJCXZhbHVlLmxlbmd0aCgpKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgIHByaXZhdGUgdm9pZCBjb21wdXRlVmVyc2lvbkNvbnRlbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgcmVxdWVzdCwgQ29tcGxldGlvblByb3Bvc2FsSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgeworICAgICAgICBTdHJpbmcgcHJlZml4ID0gY2xlYW5JbnB1dChyZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkpOworICAgICAgICBTdHJpbmcgYnVuZGxlSWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShyZXF1ZXN0LmdldE5vZGUoKSwgIm5hbWUiKTsKKyAgICAgICAgU3RyaW5nIHR5cGUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShyZXF1ZXN0LmdldE5vZGUoKSwgInR5cGUiKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCB8fCAiYnVuZGxlIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgIElGaWxlIGZpbGUgPSBnZXRGaWxlKHJlcXVlc3QpOworICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNldDxBcnRlZmFjdD4gYnVuZGxlcyA9IFJlcG9zaXRvcnlVdGlscy5nZXRJbXBvcnRCdW5kbGVQcm9wb3NhbHMoZmlsZS5nZXRQcm9qZWN0KCksIGJ1bmRsZUlkKTsKKyAgICAgICAgICAgICAgICBmb3IgKElBcnRlZmFjdCBlbGVtZW50IDogYnVuZGxlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGJ1bmRsZUlkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3Bvc2FsVmFsdWVzID0gZ2V0VmVyc2lvblByb3Bvc2FscyhlbGVtZW50LmdldFZlcnNpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwcm9wb3NhbFZhbHVlIDogcHJvcG9zYWxWYWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcG9zYWxWYWx1ZS5yZWdpb25NYXRjaGVzKDAsIHByZWZpeCwgMCwgcHJlZml4Lmxlbmd0aCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAiXCIiICsgcHJvcG9zYWxWYWx1ZSArICJcIiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IENvbXBsZXRpb25Qcm9wb3NhbCh2YWx1ZSwgcmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgdmFsdWUubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlwcml2YXRlIFN0cmluZyBjbGVhbklucHV0KFN0cmluZyBpbnB1dCkgewotCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5zdGFydHNXaXRoKCJcIiIpKSB7Ci0JCQlpbnB1dCA9IGlucHV0LnN1YnN0cmluZygxKTsKLQkJfQotCQlpZiAoaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5lbmRzV2l0aCgiXCIiKSkgewotCQkJaW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoMCwgaW5wdXQubGVuZ3RoKCkgLSAxKTsKLQkJfQotCQlyZXR1cm4gaW5wdXQ7Ci0JfQorICAgIHByaXZhdGUgU3RyaW5nIGNsZWFuSW5wdXQoU3RyaW5nIGlucHV0KSB7CisgICAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0LnN0YXJ0c1dpdGgoIlwiIikpIHsKKyAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuc3Vic3RyaW5nKDEpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0LmVuZHNXaXRoKCJcIiIpKSB7CisgICAgICAgICAgICBpbnB1dCA9IGlucHV0LnN1YnN0cmluZygwLCBpbnB1dC5sZW5ndGgoKSAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CiAKLQlwcml2YXRlIFN0cmluZyBmaW5kQXR0cmlidXRlKENvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgcmVxdWVzdC5nZXROb2RlKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZVJlZ2lvbiA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSBub2RlUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSByZWdpb25MaXN0LmluZGV4T2YocmVxdWVzdC5nZXRSZWdpb24oKSk7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbkxpc3QuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJcmV0dXJuIG5vZGVSZWdpb24uZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQkJaS0tOwotCQl9Ci0JCXJldHVybiAiIjsKLQl9CisgICAgcHJpdmF0ZSBTdHJpbmcgZmluZEF0dHJpYnV0ZShDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIElET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIHJlcXVlc3QuZ2V0Tm9kZSgpOworICAgICAgICBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGVSZWdpb24gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7CisgICAgICAgIElUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gbm9kZVJlZ2lvbi5nZXRSZWdpb25zKCk7CisgICAgICAgIGludCBpID0gcmVnaW9uTGlzdC5pbmRleE9mKHJlcXVlc3QuZ2V0UmVnaW9uKCkpOworICAgICAgICB3aGlsZSAoaSA+PSAwKSB7CisgICAgICAgICAgICBJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25MaXN0LmdldChpKTsKKyAgICAgICAgICAgIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBub2RlUmVnaW9uLmdldFRleHQocmVnaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIiI7CisgICAgfQogCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlLmhhc0F0dHJpYnV0ZXMoKSAmJiBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpICE9IG51bGwpIHsKLQkJCXJldHVybiBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpLmdldE5vZGVWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgeworICAgICAgICBpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuaGFzQXR0cmlidXRlcygpICYmIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSkuZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKENvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24gPSByZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChkb2NSZWdpb24gIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZG9jUmVnaW9uLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCQlsb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJCXJldHVybiByb290LmdldEZpbGUocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIHByaXZhdGUgSUZpbGUgZ2V0RmlsZShDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7CisgICAgICAgIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gcmVxdWVzdC5nZXREb2N1bWVudFJlZ2lvbigpOworICAgICAgICBpZiAoZG9jUmVnaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IGRvY1JlZ2lvbi5nZXRQYXJlbnREb2N1bWVudCgpOworICAgICAgICAgICAgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7CisgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKG1vZGVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKKyAgICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gcm9vdC5nZXRGaWxlKHBhdGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIAotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGdldFZlcnNpb25Qcm9wb3NhbHMoT3NnaVZlcnNpb24gdmVyc2lvbikgewotCQlTZXQ8U3RyaW5nPiB2ZXJzaW9uU3RyaW5ncyA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsKLQkJdmVyc2lvblN0cmluZ3MuYWRkKHZlcnNpb24udG9TdHJpbmcoKSk7Ci0JCUxpc3Q8U3RyaW5nPiB2ZXJzaW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyB2ZXIgOiBSZXBvc2l0b3J5VXRpbHMuZ2V0VmVyc2lvblByb3Bvc2Fscyh2ZXJzaW9uU3RyaW5ncykpIHsKLQkJCXZlcnNpb25zLmFkZCh2ZXIpOwotCQl9Ci0JCXJldHVybiB2ZXJzaW9uczsKLQl9CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0VmVyc2lvblByb3Bvc2FscyhPc2dpVmVyc2lvbiB2ZXJzaW9uKSB7CisgICAgICAgIFNldDxTdHJpbmc+IHZlcnNpb25TdHJpbmdzID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICB2ZXJzaW9uU3RyaW5ncy5hZGQodmVyc2lvbi50b1N0cmluZygpKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHZlcnNpb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIHZlciA6IFJlcG9zaXRvcnlVdGlscy5nZXRWZXJzaW9uUHJvcG9zYWxzKHZlcnNpb25TdHJpbmdzKSkgeworICAgICAgICAgICAgdmVyc2lvbnMuYWRkKHZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZlcnNpb25zOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9wbGFuL1BsYW5Nb2RlbEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvcGxhbi9QbGFuTW9kZWxIYW5kbGVyLmphdmEKaW5kZXggZmYzMmJkOS4uNDE0MTM2MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9wbGFuL1BsYW5Nb2RlbEhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3BsYW4vUGxhbk1vZGVsSGFuZGxlci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzLnBsYW47CiAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwpAQCAtMjUsMjUgKzI2LDI1IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQbGFuTW9kZWxIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEhhbmRsZXIgaW1wbGVtZW50cyBJTW9kZWxIYW5kbGVyIHsKIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtb2RlbEhhbmRsZXJJRCA9ICJvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuaGFuZGxlci5wbGFuQ29uZmlnIjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbW9kZWxIYW5kbGVySUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmhhbmRsZXIucGxhbkNvbmZpZyI7CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUucGxhbkNvbnRlbnRUeXBlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSAib3JnLmVjbGlwc2UudmlyZ28uaWRlLmZhY2V0LmNvcmUucGxhbkNvbnRlbnRUeXBlIjsKIAotCXB1YmxpYyBQbGFuTW9kZWxIYW5kbGVyKCkgewotCQlzZXRJZChtb2RlbEhhbmRsZXJJRCk7Ci0JCXNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKGFzc29jaWF0ZWRDb250ZW50VHlwZUlEKTsKLQl9CisgICAgcHVibGljIFBsYW5Nb2RlbEhhbmRsZXIoKSB7CisgICAgICAgIHNldElkKG1vZGVsSGFuZGxlcklEKTsKKyAgICAgICAgc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoYXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldEVuY29kaW5nRGV0ZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKTsKKyAgICB9CiAKLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IFhNTERvY3VtZW50TG9hZGVyKCk7Ci0JfQorICAgIHB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgWE1MRG9jdW1lbnRMb2FkZXIoKTsKKyAgICB9CiAKLQlwdWJsaWMgSU1vZGVsTG9hZGVyIGdldE1vZGVsTG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IFhNTE1vZGVsTG9hZGVyKCk7Ci0JfQorICAgIHB1YmxpYyBJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgWE1MTW9kZWxMb2FkZXIoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3BsYW4vUGxhbk91dGxpbmVMYWJlbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3BsYW4vUGxhbk91dGxpbmVMYWJlbFByb3ZpZGVyLmphdmEKaW5kZXggMWQzMjlhZS4uZWRjYjc3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy9wbGFuL1BsYW5PdXRsaW5lTGFiZWxQcm92aWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvcGxhbi9QbGFuT3V0bGluZUxhYmVsUHJvdmlkZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9ycy5wbGFuOwogCiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVMYWJlbFByb3ZpZGVyOwpAQCAtMTksMTMgKzIwLDEzIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQbGFuT3V0bGluZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyIHsKIAotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgbykgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgbykgewogCi0JCU5vZGUgbm9kZSA9IChOb2RlKSBvOwotCQlTdHJpbmcgc2hvcnROb2RlTmFtZSA9IG5vZGUuZ2V0TG9jYWxOYW1lKCk7Ci0JCVN0cmluZyB0ZXh0ID0gc2hvcnROb2RlTmFtZTsKKyAgICAgICAgTm9kZSBub2RlID0gKE5vZGUpIG87CisgICAgICAgIFN0cmluZyBzaG9ydE5vZGVOYW1lID0gbm9kZS5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIHRleHQgPSBzaG9ydE5vZGVOYW1lOwogCi0JCXJldHVybiB0ZXh0OwotCX0KKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy90ZXh0L0Fic3RyYWN0UGRlTWFuaWZlc3RDb25maWd1cmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvQWJzdHJhY3RQZGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uamF2YQppbmRleCBmMzRiYWU3Li4xYTQyYzczIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvQWJzdHJhY3RQZGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvQWJzdHJhY3RQZGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9ycy50ZXh0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7CkBAIC00NywzMDEgKzQ4LDI5OCBAQAogICovCiBwdWJsaWMgY2xhc3MgQWJzdHJhY3RQZGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBDaGFuZ2VBd2FyZVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gewogCi0JcHJvdGVjdGVkIElBbm5vdGF0aW9uSG92ZXIgZkFubm90YXRpb25Ib3ZlcjsKKyAgICBwcm90ZWN0ZWQgSUFubm90YXRpb25Ib3ZlciBmQW5ub3RhdGlvbkhvdmVyOwogCi0JcHJvdGVjdGVkIEJhc2VQREVTY2FubmVyIGZQcm9wZXJ0eUtleVNjYW5uZXI7CisgICAgcHJvdGVjdGVkIEJhc2VQREVTY2FubmVyIGZQcm9wZXJ0eUtleVNjYW5uZXI7CiAKLQlwcm90ZWN0ZWQgQmFzZVBERVNjYW5uZXIgZlByb3BlcnR5VmFsdWVTY2FubmVyOworICAgIHByb3RlY3RlZCBCYXNlUERFU2Nhbm5lciBmUHJvcGVydHlWYWx1ZVNjYW5uZXI7CiAKLQlwcm90ZWN0ZWQgQnVuZGxlUXVpY2tBc3Npc3RBc3Npc3RhbnQgZlF1aWNrQXNzaXN0YW50OworICAgIHByb3RlY3RlZCBCdW5kbGVRdWlja0Fzc2lzdEFzc2lzdGFudCBmUXVpY2tBc3Npc3RhbnQ7CiAKLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdGFudCBmQ29udGVudEFzc2lzdGFudDsKKyAgICBwcm90ZWN0ZWQgQ29udGVudEFzc2lzdGFudCBmQ29udGVudEFzc2lzdGFudDsKIAotCXByaXZhdGUgTWFuaWZlc3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIGZDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yOworICAgIHByaXZhdGUgTWFuaWZlc3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIGZDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yOwogCi0JcHJvdGVjdGVkIE1hbmlmZXN0VGV4dEhvdmVyIGZUZXh0SG92ZXI7CisgICAgcHJvdGVjdGVkIE1hbmlmZXN0VGV4dEhvdmVyIGZUZXh0SG92ZXI7CiAKLQlwcm90ZWN0ZWQgU3RyaW5nIGZEb2N1bWVudFBhcnRpdGlvbmluZzsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZEb2N1bWVudFBhcnRpdGlvbmluZzsKIAotCXByb3RlY3RlZCBjbGFzcyBNYW5pZmVzdEhlYWRlclNjYW5uZXIgZXh0ZW5kcyBCYXNlUERFU2Nhbm5lciB7CisgICAgcHJvdGVjdGVkIGNsYXNzIE1hbmlmZXN0SGVhZGVyU2Nhbm5lciBleHRlbmRzIEJhc2VQREVTY2FubmVyIHsKIAotCQlwcm90ZWN0ZWQgVG9rZW4gZlRva2VuOworICAgICAgICBwcm90ZWN0ZWQgVG9rZW4gZlRva2VuOwogCi0JCXB1YmxpYyBNYW5pZmVzdEhlYWRlclNjYW5uZXIoKSB7Ci0JCQlzdXBlcihmQ29sb3JNYW5hZ2VyKTsKLQkJfQorICAgICAgICBwdWJsaWMgTWFuaWZlc3RIZWFkZXJTY2FubmVyKCkgeworICAgICAgICAgICAgc3VwZXIoQWJzdHJhY3RQZGVNYW5pZmVzdENvbmZpZ3VyYXRpb24udGhpcy5mQ29sb3JNYW5hZ2VyKTsKKyAgICAgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBhZmZlY3RzVGV4dFByZXNlbnRhdGlvbihTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBwcm9wZXJ0eS5zdGFydHNXaXRoKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9LRVkpCi0JCQkJCXx8IHByb3BlcnR5LnN0YXJ0c1dpdGgoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX09TR0kpOwotCQl9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZmZlY3RzVGV4dFByZXNlbnRhdGlvbihTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS5zdGFydHNXaXRoKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9LRVkpIHx8IHByb3BlcnR5LnN0YXJ0c1dpdGgoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX09TR0kpOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBUb2tlbiBnZXRUb2tlbkFmZmVjdGVkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLnN0YXJ0c1dpdGgoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX09TR0kpKSB7Ci0JCQkJcmV0dXJuIGZUb2tlbjsKLQkJCX0KLQkJCXJldHVybiAoVG9rZW4pIGZEZWZhdWx0UmV0dXJuVG9rZW47Ci0JCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUb2tlbiBnZXRUb2tlbkFmZmVjdGVkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRQcm9wZXJ0eSgpLnN0YXJ0c1dpdGgoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX09TR0kpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZlRva2VuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChUb2tlbikgdGhpcy5mRGVmYXVsdFJldHVyblRva2VuOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCQlmVG9rZW4gPSBuZXcgVG9rZW4oY3JlYXRlVGV4dEF0dHJpYnV0ZShJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfT1NHSSkpOwotCQkJV29yZFJ1bGUgcnVsZSA9IG5ldyBXb3JkUnVsZShuZXcgS2V5d29yZERldGVjdG9yKCksIFRva2VuLlVOREVGSU5FRCwgdHJ1ZSk7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9BQ1RJVkFUT1IsIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9DQVRFR09SWSwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0NMQVNTUEFUSCwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0NPTlRBQ1RBRERSRVNTLCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfQ09QWVJJR0hULCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfREVTQ1JJUFRJT04sIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9ET0NVUkwsIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9MT0NBTElaQVRJT04sIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9OQU1FLCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfTkFUSVZFQ09ERSwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX1JFUVVJUkVERVhFQ1VUSU9ORU5WSVJPTk1FTlQsIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9VUERBVEVMT0NBVElPTiwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX1ZFTkRPUiwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5EWU5BTUlDSU1QT1JUX1BBQ0tBR0UsIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKElDb3JlQ29uc3RhbnRzLkVYUE9SVF9TRVJWSUNFLCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChJQ29yZUNvbnN0YW50cy5JTVBPUlRfU0VSVklDRSwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChJQ29yZUNvbnN0YW50cy5QUk9WSURFX1BBQ0tBR0UsIGZUb2tlbik7Ci0JCQlzZXRSdWxlcyhuZXcgSVJ1bGVbXSB7IHJ1bGUgfSk7Ci0JCQlzZXREZWZhdWx0UmV0dXJuVG9rZW4obmV3IFRva2VuKGNyZWF0ZVRleHRBdHRyaWJ1dGUoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX0tFWSkpKTsKLQkJfQotCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgICAgICB0aGlzLmZUb2tlbiA9IG5ldyBUb2tlbihjcmVhdGVUZXh0QXR0cmlidXRlKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9PU0dJKSk7CisgICAgICAgICAgICBXb3JkUnVsZSBydWxlID0gbmV3IFdvcmRSdWxlKG5ldyBLZXl3b3JkRGV0ZWN0b3IoKSwgVG9rZW4uVU5ERUZJTkVELCB0cnVlKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0FDVElWQVRPUiwgdGhpcy5mVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfQ0FURUdPUlksIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0NMQVNTUEFUSCwgdGhpcy5mVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfQ09OVEFDVEFERFJFU1MsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0NPUFlSSUdIVCwgdGhpcy5mVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfREVTQ1JJUFRJT04sIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0RPQ1VSTCwgdGhpcy5mVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfTE9DQUxJWkFUSU9OLCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX05BTUUsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX05BVElWRUNPREUsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX1JFUVVJUkVERVhFQ1VUSU9ORU5WSVJPTk1FTlQsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgdGhpcy5mVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfVVBEQVRFTE9DQVRJT04sIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX1ZFTkRPUiwgdGhpcy5mVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgdGhpcy5mVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgdGhpcy5mVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5EWU5BTUlDSU1QT1JUX1BBQ0tBR0UsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChJQ29yZUNvbnN0YW50cy5FWFBPUlRfU0VSVklDRSwgdGhpcy5mVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoSUNvcmVDb25zdGFudHMuSU1QT1JUX1NFUlZJQ0UsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChJQ29yZUNvbnN0YW50cy5QUk9WSURFX1BBQ0tBR0UsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHNldFJ1bGVzKG5ldyBJUnVsZVtdIHsgcnVsZSB9KTsKKyAgICAgICAgICAgIHNldERlZmF1bHRSZXR1cm5Ub2tlbihuZXcgVG9rZW4oY3JlYXRlVGV4dEF0dHJpYnV0ZShJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfS0VZKSkpOworICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIGNsYXNzIE1hbmlmZXN0VmFsdWVTY2FubmVyIGV4dGVuZHMgQmFzZVBERVNjYW5uZXIgeworICAgIHByb3RlY3RlZCBjbGFzcyBNYW5pZmVzdFZhbHVlU2Nhbm5lciBleHRlbmRzIEJhc2VQREVTY2FubmVyIHsKIAotCQlwcm90ZWN0ZWQgVG9rZW4gZkFzc2lnbm1lbnRUb2tlbjsKKyAgICAgICAgcHJvdGVjdGVkIFRva2VuIGZBc3NpZ25tZW50VG9rZW47CiAKLQkJcHJvdGVjdGVkIFRva2VuIGZBdHRyaWJ1dGVUb2tlbjsKKyAgICAgICAgcHJvdGVjdGVkIFRva2VuIGZBdHRyaWJ1dGVUb2tlbjsKIAotCQlwdWJsaWMgTWFuaWZlc3RWYWx1ZVNjYW5uZXIoKSB7Ci0JCQlzdXBlcihmQ29sb3JNYW5hZ2VyKTsKLQkJfQorICAgICAgICBwdWJsaWMgTWFuaWZlc3RWYWx1ZVNjYW5uZXIoKSB7CisgICAgICAgICAgICBzdXBlcihBYnN0cmFjdFBkZU1hbmlmZXN0Q29uZmlndXJhdGlvbi50aGlzLmZDb2xvck1hbmFnZXIpOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGFmZmVjdHNUZXh0UHJlc2VudGF0aW9uKFN0cmluZyBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIHByb3BlcnR5LnN0YXJ0c1dpdGgoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX0FTU0lHTk1FTlQpCi0JCQkJCXx8IHByb3BlcnR5LnN0YXJ0c1dpdGgoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX1ZBTFVFKQotCQkJCQl8fCBwcm9wZXJ0eS5zdGFydHNXaXRoKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9BVFRSSUJVVEVTKTsKLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWZmZWN0c1RleHRQcmVzZW50YXRpb24oU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGVydHkuc3RhcnRzV2l0aChJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfQVNTSUdOTUVOVCkgfHwgcHJvcGVydHkuc3RhcnRzV2l0aChJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfVkFMVUUpCisgICAgICAgICAgICAgICAgfHwgcHJvcGVydHkuc3RhcnRzV2l0aChJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfQVRUUklCVVRFUyk7CisgICAgICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFRva2VuIGdldFRva2VuQWZmZWN0ZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCWlmIChwcm9wZXJ0eS5zdGFydHNXaXRoKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9BU1NJR05NRU5UKSkgewotCQkJCXJldHVybiBmQXNzaWdubWVudFRva2VuOwotCQkJfQotCQkJaWYgKHByb3BlcnR5LnN0YXJ0c1dpdGgoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX0FUVFJJQlVURVMpKSB7Ci0JCQkJcmV0dXJuIGZBdHRyaWJ1dGVUb2tlbjsKLQkJCX0KLQkJCXJldHVybiAoVG9rZW4pIGZEZWZhdWx0UmV0dXJuVG9rZW47Ci0JCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUb2tlbiBnZXRUb2tlbkFmZmVjdGVkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7CisgICAgICAgICAgICBpZiAocHJvcGVydHkuc3RhcnRzV2l0aChJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfQVNTSUdOTUVOVCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mQXNzaWdubWVudFRva2VuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHByb3BlcnR5LnN0YXJ0c1dpdGgoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX0FUVFJJQlVURVMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZkF0dHJpYnV0ZVRva2VuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChUb2tlbikgdGhpcy5mRGVmYXVsdFJldHVyblRva2VuOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCQlJUnVsZVtdIHJ1bGVzID0gbmV3IElSdWxlWzJdOwotCQkJZkFzc2lnbm1lbnRUb2tlbiA9IG5ldyBUb2tlbihjcmVhdGVUZXh0QXR0cmlidXRlKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9BU1NJR05NRU5UKSk7Ci0JCQlydWxlc1swXSA9IG5ldyBXb3JkUnVsZShuZXcgQXNzaWdubWVudERldGVjdG9yKCksIGZBc3NpZ25tZW50VG9rZW4pOworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgICAgIElSdWxlW10gcnVsZXMgPSBuZXcgSVJ1bGVbMl07CisgICAgICAgICAgICB0aGlzLmZBc3NpZ25tZW50VG9rZW4gPSBuZXcgVG9rZW4oY3JlYXRlVGV4dEF0dHJpYnV0ZShJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfQVNTSUdOTUVOVCkpOworICAgICAgICAgICAgcnVsZXNbMF0gPSBuZXcgV29yZFJ1bGUobmV3IEFzc2lnbm1lbnREZXRlY3RvcigpLCB0aGlzLmZBc3NpZ25tZW50VG9rZW4pOwogCi0JCQlmQXR0cmlidXRlVG9rZW4gPSBuZXcgVG9rZW4oY3JlYXRlVGV4dEF0dHJpYnV0ZShJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfQVRUUklCVVRFUykpOwotCQkJV29yZFJ1bGUgcnVsZSA9IG5ldyBXb3JkUnVsZShuZXcgS2V5d29yZERldGVjdG9yKCkpOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfTkFUSVZFQ09ERV9MQU5HVUFHRSwgZkF0dHJpYnV0ZVRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX05BVElWRUNPREVfT1NOQU1FLCBmQXR0cmlidXRlVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfTkFUSVZFQ09ERV9PU1ZFUlNJT04sIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9OQVRJVkVDT0RFX1BST0NFU1NPUiwgZkF0dHJpYnV0ZVRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRV9BVFRSSUJVVEUsIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OX0FUVFJJQlVURSwgZkF0dHJpYnV0ZVRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuRVhDTFVERV9ESVJFQ1RJVkUsIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkZSQUdNRU5UX0FUVEFDSE1FTlRfRElSRUNUSVZFLCBmQXR0cmlidXRlVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5JTkNMVURFX0RJUkVDVElWRSwgZkF0dHJpYnV0ZVRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuTUFOREFUT1JZX0RJUkVDVElWRSwgZkF0dHJpYnV0ZVRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUsIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUsIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLlVTRVNfRElSRUNUSVZFLCBmQXR0cmlidXRlVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURSwgZkF0dHJpYnV0ZVRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuVklTSUJJTElUWV9ESVJFQ1RJVkUsIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoSUNvcmVDb25zdGFudHMuRlJJRU5EU19ESVJFQ1RJVkUsIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoSUNvcmVDb25zdGFudHMuSU5URVJOQUxfRElSRUNUSVZFLCBmQXR0cmlidXRlVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKElDb3JlQ29uc3RhbnRzLlBBQ0tBR0VfU1BFQ0lGSUNBVElPTl9WRVJTSU9OLCBmQXR0cmlidXRlVG9rZW4pOwotCQkJLy8gRUFTVEVSIEVHRwotCQkJZm9yIChTdHJpbmcgZWxlbWVudCA6IElDb3JlQ29uc3RhbnRzLkVFX1RPS0VOUykgewotCQkJCXJ1bGUuYWRkV29yZChlbGVtZW50LCBmQXR0cmlidXRlVG9rZW4pOwotCQkJfQotCQkJcnVsZXNbMV0gPSBydWxlOworICAgICAgICAgICAgdGhpcy5mQXR0cmlidXRlVG9rZW4gPSBuZXcgVG9rZW4oY3JlYXRlVGV4dEF0dHJpYnV0ZShJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfQVRUUklCVVRFUykpOworICAgICAgICAgICAgV29yZFJ1bGUgcnVsZSA9IG5ldyBXb3JkUnVsZShuZXcgS2V5d29yZERldGVjdG9yKCkpOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfTkFUSVZFQ09ERV9MQU5HVUFHRSwgdGhpcy5mQXR0cmlidXRlVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfTkFUSVZFQ09ERV9PU05BTUUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX05BVElWRUNPREVfT1NWRVJTSU9OLCB0aGlzLmZBdHRyaWJ1dGVUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9OQVRJVkVDT0RFX1BST0NFU1NPUiwgdGhpcy5mQXR0cmlidXRlVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FX0FUVFJJQlVURSwgdGhpcy5mQXR0cmlidXRlVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTl9BVFRSSUJVVEUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuRVhDTFVERV9ESVJFQ1RJVkUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuRlJBR01FTlRfQVRUQUNITUVOVF9ESVJFQ1RJVkUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuSU5DTFVERV9ESVJFQ1RJVkUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuTUFOREFUT1JZX0RJUkVDVElWRSwgdGhpcy5mQXR0cmlidXRlVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSwgdGhpcy5mQXR0cmlidXRlVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFLCB0aGlzLmZBdHRyaWJ1dGVUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLlVTRVNfRElSRUNUSVZFLCB0aGlzLmZBdHRyaWJ1dGVUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLCB0aGlzLmZBdHRyaWJ1dGVUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLlZJU0lCSUxJVFlfRElSRUNUSVZFLCB0aGlzLmZBdHRyaWJ1dGVUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoSUNvcmVDb25zdGFudHMuRlJJRU5EU19ESVJFQ1RJVkUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChJQ29yZUNvbnN0YW50cy5JTlRFUk5BTF9ESVJFQ1RJVkUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChJQ29yZUNvbnN0YW50cy5QQUNLQUdFX1NQRUNJRklDQVRJT05fVkVSU0lPTiwgdGhpcy5mQXR0cmlidXRlVG9rZW4pOworICAgICAgICAgICAgLy8gRUFTVEVSIEVHRworICAgICAgICAgICAgZm9yIChTdHJpbmcgZWxlbWVudCA6IElDb3JlQ29uc3RhbnRzLkVFX1RPS0VOUykgeworICAgICAgICAgICAgICAgIHJ1bGUuYWRkV29yZChlbGVtZW50LCB0aGlzLmZBdHRyaWJ1dGVUb2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydWxlc1sxXSA9IHJ1bGU7CiAKLQkJCXNldFJ1bGVzKHJ1bGVzKTsKLQkJCXNldERlZmF1bHRSZXR1cm5Ub2tlbihuZXcgVG9rZW4oY3JlYXRlVGV4dEF0dHJpYnV0ZShJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfVkFMVUUpKSk7Ci0JCX0KLQl9CisgICAgICAgICAgICBzZXRSdWxlcyhydWxlcyk7CisgICAgICAgICAgICBzZXREZWZhdWx0UmV0dXJuVG9rZW4obmV3IFRva2VuKGNyZWF0ZVRleHRBdHRyaWJ1dGUoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX1ZBTFVFKSkpOworICAgICAgICB9CisgICAgfQogCi0JY2xhc3MgQXNzaWdubWVudERldGVjdG9yIGltcGxlbWVudHMgSVdvcmREZXRlY3RvciB7Ci0JCXB1YmxpYyBib29sZWFuIGlzV29yZFN0YXJ0KGNoYXIgYykgewotCQkJcmV0dXJuIGMgPT0gJzonIHx8IGMgPT0gJz0nOwotCQl9CisgICAgY2xhc3MgQXNzaWdubWVudERldGVjdG9yIGltcGxlbWVudHMgSVdvcmREZXRlY3RvciB7CiAKLQkJcHVibGljIGJvb2xlYW4gaXNXb3JkUGFydChjaGFyIGMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXb3JkU3RhcnQoY2hhciBjKSB7CisgICAgICAgICAgICByZXR1cm4gYyA9PSAnOicgfHwgYyA9PSAnPSc7CisgICAgICAgIH0KIAotCWNsYXNzIEtleXdvcmREZXRlY3RvciBpbXBsZW1lbnRzIElXb3JkRGV0ZWN0b3IgewotCQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRTdGFydChjaGFyIGMpIHsKLQkJCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGMpOwotCQl9CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV29yZFBhcnQoY2hhciBjKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CiAKLQkJcHVibGljIGJvb2xlYW4gaXNXb3JkUGFydChjaGFyIGMpIHsKLQkJCXJldHVybiBjICE9ICc6JyAmJiBjICE9ICc9JyAmJiAhQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKGMpOwotCQl9Ci0JfQorICAgIGNsYXNzIEtleXdvcmREZXRlY3RvciBpbXBsZW1lbnRzIElXb3JkRGV0ZWN0b3IgewogCi0JcHVibGljIEFic3RyYWN0UGRlTWFuaWZlc3RDb25maWd1cmF0aW9uKElDb2xvck1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzKG1hbmFnZXIsIG51bGwsIG51bGwpOwotCX0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXb3JkU3RhcnQoY2hhciBjKSB7CisgICAgICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKTsKKyAgICAgICAgfQogCi0JcHVibGljIEFic3RyYWN0UGRlTWFuaWZlc3RDb25maWd1cmF0aW9uKElDb2xvck1hbmFnZXIgbWFuYWdlciwgUERFU291cmNlUGFnZSBwYWdlKSB7Ci0JCXRoaXMobWFuYWdlciwgcGFnZSwgbnVsbCk7Ci0JfQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dvcmRQYXJ0KGNoYXIgYykgeworICAgICAgICAgICAgcmV0dXJuIGMgIT0gJzonICYmIGMgIT0gJz0nICYmICFDaGFyYWN0ZXIuaXNTcGFjZUNoYXIoYyk7CisgICAgICAgIH0KKyAgICB9CiAKLQlwdWJsaWMgQWJzdHJhY3RQZGVNYW5pZmVzdENvbmZpZ3VyYXRpb24oSUNvbG9yTWFuYWdlciBtYW5hZ2VyLCBQREVTb3VyY2VQYWdlIHBhZ2UsIFN0cmluZyBkb2N1bWVudFBhcnRpdGlvbmluZykgewotCQlzdXBlcihwYWdlLCBtYW5hZ2VyKTsKLQkJZlByb3BlcnR5S2V5U2Nhbm5lciA9IG5ldyBNYW5pZmVzdEhlYWRlclNjYW5uZXIoKTsKLQkJZlByb3BlcnR5VmFsdWVTY2FubmVyID0gbmV3IE1hbmlmZXN0VmFsdWVTY2FubmVyKCk7Ci0JCXRoaXMuZkRvY3VtZW50UGFydGl0aW9uaW5nID0gZG9jdW1lbnRQYXJ0aXRpb25pbmc7Ci0JfQorICAgIHB1YmxpYyBBYnN0cmFjdFBkZU1hbmlmZXN0Q29uZmlndXJhdGlvbihJQ29sb3JNYW5hZ2VyIG1hbmFnZXIpIHsKKyAgICAgICAgdGhpcyhtYW5hZ2VyLCBudWxsLCBudWxsKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlTdHJpbmdbXSBwYXJ0aXRpb25zID0gTWFuaWZlc3RQYXJ0aXRpb25TY2FubmVyLlBBUlRJVElPTlM7Ci0JCVN0cmluZ1tdIGFsbCA9IG5ldyBTdHJpbmdbcGFydGl0aW9ucy5sZW5ndGggKyAxXTsKLQkJYWxsWzBdID0gSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFOwotCQlTeXN0ZW0uYXJyYXljb3B5KHBhcnRpdGlvbnMsIDAsIGFsbCwgMSwgcGFydGl0aW9ucy5sZW5ndGgpOwotCQlyZXR1cm4gYWxsOwotCX0KKyAgICBwdWJsaWMgQWJzdHJhY3RQZGVNYW5pZmVzdENvbmZpZ3VyYXRpb24oSUNvbG9yTWFuYWdlciBtYW5hZ2VyLCBQREVTb3VyY2VQYWdlIHBhZ2UpIHsKKyAgICAgICAgdGhpcyhtYW5hZ2VyLCBwYWdlLCBudWxsKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUFubm90YXRpb25Ib3ZlciBnZXRBbm5vdGF0aW9uSG92ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKGZBbm5vdGF0aW9uSG92ZXIgPT0gbnVsbCkgewotCQkJZkFubm90YXRpb25Ib3ZlciA9IG5ldyBBbm5vdGF0aW9uSG92ZXIoKTsKLQkJfQotCQlyZXR1cm4gZkFubm90YXRpb25Ib3ZlcjsKLQl9CisgICAgcHVibGljIEFic3RyYWN0UGRlTWFuaWZlc3RDb25maWd1cmF0aW9uKElDb2xvck1hbmFnZXIgbWFuYWdlciwgUERFU291cmNlUGFnZSBwYWdlLCBTdHJpbmcgZG9jdW1lbnRQYXJ0aXRpb25pbmcpIHsKKyAgICAgICAgc3VwZXIocGFnZSwgbWFuYWdlcik7CisgICAgICAgIHRoaXMuZlByb3BlcnR5S2V5U2Nhbm5lciA9IG5ldyBNYW5pZmVzdEhlYWRlclNjYW5uZXIoKTsKKyAgICAgICAgdGhpcy5mUHJvcGVydHlWYWx1ZVNjYW5uZXIgPSBuZXcgTWFuaWZlc3RWYWx1ZVNjYW5uZXIoKTsKKyAgICAgICAgdGhpcy5mRG9jdW1lbnRQYXJ0aXRpb25pbmcgPSBkb2N1bWVudFBhcnRpdGlvbmluZzsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVByZXNlbnRhdGlvblJlY29uY2lsZXIgZ2V0UHJlc2VudGF0aW9uUmVjb25jaWxlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlQcmVzZW50YXRpb25SZWNvbmNpbGVyIHJlY29uY2lsZXIgPSBuZXcgUHJlc2VudGF0aW9uUmVjb25jaWxlcigpOwotCQlyZWNvbmNpbGVyLnNldERvY3VtZW50UGFydGl0aW9uaW5nKGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhzb3VyY2VWaWV3ZXIpKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgeworICAgICAgICBTdHJpbmdbXSBwYXJ0aXRpb25zID0gTWFuaWZlc3RQYXJ0aXRpb25TY2FubmVyLlBBUlRJVElPTlM7CisgICAgICAgIFN0cmluZ1tdIGFsbCA9IG5ldyBTdHJpbmdbcGFydGl0aW9ucy5sZW5ndGggKyAxXTsKKyAgICAgICAgYWxsWzBdID0gSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHBhcnRpdGlvbnMsIDAsIGFsbCwgMSwgcGFydGl0aW9ucy5sZW5ndGgpOworICAgICAgICByZXR1cm4gYWxsOworICAgIH0KIAotCQlEZWZhdWx0RGFtYWdlclJlcGFpcmVyIGRyID0gbmV3IERlZmF1bHREYW1hZ2VyUmVwYWlyZXIoZlByb3BlcnR5S2V5U2Nhbm5lcik7Ci0JCXJlY29uY2lsZXIuc2V0RGFtYWdlcihkciwgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKLQkJcmVjb25jaWxlci5zZXRSZXBhaXJlcihkciwgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUFubm90YXRpb25Ib3ZlciBnZXRBbm5vdGF0aW9uSG92ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKKyAgICAgICAgaWYgKHRoaXMuZkFubm90YXRpb25Ib3ZlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmZBbm5vdGF0aW9uSG92ZXIgPSBuZXcgQW5ub3RhdGlvbkhvdmVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZkFubm90YXRpb25Ib3ZlcjsKKyAgICB9CiAKLQkJZHIgPSBuZXcgRGVmYXVsdERhbWFnZXJSZXBhaXJlcihmUHJvcGVydHlWYWx1ZVNjYW5uZXIpOwotCQlyZWNvbmNpbGVyLnNldERhbWFnZXIoZHIsIE1hbmlmZXN0UGFydGl0aW9uU2Nhbm5lci5NQU5JRkVTVF9IRUFERVJfVkFMVUUpOwotCQlyZWNvbmNpbGVyLnNldFJlcGFpcmVyKGRyLCBNYW5pZmVzdFBhcnRpdGlvblNjYW5uZXIuTUFOSUZFU1RfSEVBREVSX1ZBTFVFKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVByZXNlbnRhdGlvblJlY29uY2lsZXIgZ2V0UHJlc2VudGF0aW9uUmVjb25jaWxlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgeworICAgICAgICBQcmVzZW50YXRpb25SZWNvbmNpbGVyIHJlY29uY2lsZXIgPSBuZXcgUHJlc2VudGF0aW9uUmVjb25jaWxlcigpOworICAgICAgICByZWNvbmNpbGVyLnNldERvY3VtZW50UGFydGl0aW9uaW5nKGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhzb3VyY2VWaWV3ZXIpKTsKIAotCQlyZXR1cm4gcmVjb25jaWxlcjsKLQl9CisgICAgICAgIERlZmF1bHREYW1hZ2VyUmVwYWlyZXIgZHIgPSBuZXcgRGVmYXVsdERhbWFnZXJSZXBhaXJlcih0aGlzLmZQcm9wZXJ0eUtleVNjYW5uZXIpOworICAgICAgICByZWNvbmNpbGVyLnNldERhbWFnZXIoZHIsIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk7CisgICAgICAgIHJlY29uY2lsZXIuc2V0UmVwYWlyZXIoZHIsIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk7CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBhZmZlY3RzVGV4dFByZXNlbnRhdGlvbihQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCXJldHVybiBwcm9wZXJ0eS5zdGFydHNXaXRoKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9LRVkpCi0JCQkJfHwgcHJvcGVydHkuc3RhcnRzV2l0aChJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfT1NHSSkKLQkJCQl8fCBwcm9wZXJ0eS5zdGFydHNXaXRoKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9WQUxVRSkKLQkJCQl8fCBwcm9wZXJ0eS5zdGFydHNXaXRoKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9BVFRSSUJVVEVTKQotCQkJCXx8IHByb3BlcnR5LnN0YXJ0c1dpdGgoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX0FTU0lHTk1FTlQpOwotCX0KKyAgICAgICAgZHIgPSBuZXcgRGVmYXVsdERhbWFnZXJSZXBhaXJlcih0aGlzLmZQcm9wZXJ0eVZhbHVlU2Nhbm5lcik7CisgICAgICAgIHJlY29uY2lsZXIuc2V0RGFtYWdlcihkciwgTWFuaWZlc3RQYXJ0aXRpb25TY2FubmVyLk1BTklGRVNUX0hFQURFUl9WQUxVRSk7CisgICAgICAgIHJlY29uY2lsZXIuc2V0UmVwYWlyZXIoZHIsIE1hbmlmZXN0UGFydGl0aW9uU2Nhbm5lci5NQU5JRkVTVF9IRUFERVJfVkFMVUUpOwogCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gYWZmZWN0c0NvbG9yUHJlc2VudGF0aW9uKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJcmV0dXJuIHByb3BlcnR5LmVxdWFscyhJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfS0VZKSB8fCBwcm9wZXJ0eS5lcXVhbHMoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX09TR0kpCi0JCQkJfHwgcHJvcGVydHkuZXF1YWxzKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9WQUxVRSkKLQkJCQl8fCBwcm9wZXJ0eS5lcXVhbHMoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX0FUVFJJQlVURVMpCi0JCQkJfHwgcHJvcGVydHkuZXF1YWxzKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9BU1NJR05NRU5UKTsKLQl9CisgICAgICAgIHJldHVybiByZWNvbmNpbGVyOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkYXB0VG9QcmVmZXJlbmNlQ2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGFmZmVjdHNDb2xvclByZXNlbnRhdGlvbihldmVudCkpIHsKLQkJCWZDb2xvck1hbmFnZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2VFdmVudChldmVudCk7Ci0JCX0KLQkJZlByb3BlcnR5S2V5U2Nhbm5lci5hZGFwdFRvUHJlZmVyZW5jZUNoYW5nZShldmVudCk7Ci0JCWZQcm9wZXJ0eVZhbHVlU2Nhbm5lci5hZGFwdFRvUHJlZmVyZW5jZUNoYW5nZShldmVudCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGFmZmVjdHNUZXh0UHJlc2VudGF0aW9uKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5LnN0YXJ0c1dpdGgoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX0tFWSkgfHwgcHJvcGVydHkuc3RhcnRzV2l0aChJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfT1NHSSkKKyAgICAgICAgICAgIHx8IHByb3BlcnR5LnN0YXJ0c1dpdGgoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX1ZBTFVFKSB8fCBwcm9wZXJ0eS5zdGFydHNXaXRoKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9BVFRSSUJVVEVTKQorICAgICAgICAgICAgfHwgcHJvcGVydHkuc3RhcnRzV2l0aChJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfQVNTSUdOTUVOVCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElRdWlja0Fzc2lzdEFzc2lzdGFudCBnZXRRdWlja0Fzc2lzdEFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoc291cmNlVmlld2VyLmlzRWRpdGFibGUoKSkgewotCQkJaWYgKGZRdWlja0Fzc2lzdGFudCA9PSBudWxsKSB7Ci0JCQkJZlF1aWNrQXNzaXN0YW50ID0gbmV3IEJ1bmRsZVF1aWNrQXNzaXN0QXNzaXN0YW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZlF1aWNrQXNzaXN0YW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBhZmZlY3RzQ29sb3JQcmVzZW50YXRpb24oUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOworICAgICAgICByZXR1cm4gcHJvcGVydHkuZXF1YWxzKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9LRVkpIHx8IHByb3BlcnR5LmVxdWFscyhJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfT1NHSSkKKyAgICAgICAgICAgIHx8IHByb3BlcnR5LmVxdWFscyhJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfVkFMVUUpIHx8IHByb3BlcnR5LmVxdWFscyhJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfQVRUUklCVVRFUykKKyAgICAgICAgICAgIHx8IHByb3BlcnR5LmVxdWFscyhJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfQVNTSUdOTUVOVCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZRdWlja0Fzc2lzdGFudCAhPSBudWxsKSB7Ci0JCQlmUXVpY2tBc3Npc3RhbnQuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChmQ29udGVudEFzc2lzdGFudCAhPSBudWxsKSB7Ci0JCQlmQ29udGVudEFzc2lzdGFudFByb2Nlc3Nvci5kaXNwb3NlKCk7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRhcHRUb1ByZWZlcmVuY2VDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworICAgICAgICBpZiAoYWZmZWN0c0NvbG9yUHJlc2VudGF0aW9uKGV2ZW50KSkgeworICAgICAgICAgICAgdGhpcy5mQ29sb3JNYW5hZ2VyLmhhbmRsZVByb3BlcnR5Q2hhbmdlRXZlbnQoZXZlbnQpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZlByb3BlcnR5S2V5U2Nhbm5lci5hZGFwdFRvUHJlZmVyZW5jZUNoYW5nZShldmVudCk7CisgICAgICAgIHRoaXMuZlByb3BlcnR5VmFsdWVTY2FubmVyLmFkYXB0VG9QcmVmZXJlbmNlQ2hhbmdlKGV2ZW50KTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29udGVudEFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZlNvdXJjZVBhZ2UgIT0gbnVsbCAmJiBmU291cmNlUGFnZS5pc0VkaXRhYmxlKCkpIHsKLQkJCWlmIChmQ29udGVudEFzc2lzdGFudCA9PSBudWxsKSB7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQgPSBuZXcgQ29udGVudEFzc2lzdGFudCgpOwotCQkJCWZDb250ZW50QXNzaXN0YW50LnNldERvY3VtZW50UGFydGl0aW9uaW5nKGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhzb3VyY2VWaWV3ZXIpKTsKLQkJCQlmQ29udGVudEFzc2lzdGFudFByb2Nlc3NvciA9IG5ldyBNYW5pZmVzdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoZlNvdXJjZVBhZ2UpOwotCQkJCWZDb250ZW50QXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoZkNvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3IsIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihmQ29udGVudEFzc2lzdGFudFByb2Nlc3NvciwKLQkJCQkJCU1hbmlmZXN0UGFydGl0aW9uU2Nhbm5lci5NQU5JRkVTVF9IRUFERVJfVkFMVUUpOwotCQkJCWZDb250ZW50QXNzaXN0YW50LmFkZENvbXBsZXRpb25MaXN0ZW5lcihmQ29udGVudEFzc2lzdGFudFByb2Nlc3Nvcik7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0SW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcihuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQkJCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGNyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQpIHsKLQkJCQkJCXJldHVybiBuZXcgSkZhY2VEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKHBhcmVudCwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0Q29udGV4dEluZm9ybWF0aW9uUG9wdXBPcmllbnRhdGlvbihJQ29udGVudEFzc2lzdGFudC5DT05URVhUX0lORk9fQUJPVkUpOwotCQkJfQotCQkJcmV0dXJuIGZDb250ZW50QXNzaXN0YW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVF1aWNrQXNzaXN0QXNzaXN0YW50IGdldFF1aWNrQXNzaXN0QXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7CisgICAgICAgIGlmIChzb3VyY2VWaWV3ZXIuaXNFZGl0YWJsZSgpKSB7CisgICAgICAgICAgICBpZiAodGhpcy5mUXVpY2tBc3Npc3RhbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuZlF1aWNrQXNzaXN0YW50ID0gbmV3IEJ1bmRsZVF1aWNrQXNzaXN0QXNzaXN0YW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpcy5mUXVpY2tBc3Npc3RhbnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElUZXh0SG92ZXIgZ2V0VGV4dEhvdmVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJaWYgKGZUZXh0SG92ZXIgPT0gbnVsbCAmJiBmU291cmNlUGFnZSAhPSBudWxsKSB7Ci0JCQlmVGV4dEhvdmVyID0gbmV3IE1hbmlmZXN0VGV4dEhvdmVyKGZTb3VyY2VQYWdlKTsKLQkJfQotCQlyZXR1cm4gZlRleHRIb3ZlcjsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgaWYgKHRoaXMuZlF1aWNrQXNzaXN0YW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZlF1aWNrQXNzaXN0YW50LmRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5mQ29udGVudEFzc2lzdGFudCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmZDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yLmRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0SW5mb0ltcGxlbWVudGF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIFNvdXJjZUluZm9ybWF0aW9uUHJvdmlkZXIuRl9NQU5JRkVTVF9JTVA7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQ29udGVudEFzc2lzdGFudCBnZXRDb250ZW50QXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7CisgICAgICAgIGlmICh0aGlzLmZTb3VyY2VQYWdlICE9IG51bGwgJiYgdGhpcy5mU291cmNlUGFnZS5pc0VkaXRhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmZDb250ZW50QXNzaXN0YW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZDb250ZW50QXNzaXN0YW50ID0gbmV3IENvbnRlbnRBc3Npc3RhbnQoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZDb250ZW50QXNzaXN0YW50LnNldERvY3VtZW50UGFydGl0aW9uaW5nKGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhzb3VyY2VWaWV3ZXIpKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yID0gbmV3IE1hbmlmZXN0Q29udGVudEFzc2lzdFByb2Nlc3Nvcih0aGlzLmZTb3VyY2VQYWdlKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZDb250ZW50QXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IodGhpcy5mQ29udGVudEFzc2lzdGFudFByb2Nlc3NvciwgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZDb250ZW50QXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IodGhpcy5mQ29udGVudEFzc2lzdGFudFByb2Nlc3NvciwgTWFuaWZlc3RQYXJ0aXRpb25TY2FubmVyLk1BTklGRVNUX0hFQURFUl9WQUxVRSk7CisgICAgICAgICAgICAgICAgdGhpcy5mQ29udGVudEFzc2lzdGFudC5hZGRDb21wbGV0aW9uTGlzdGVuZXIodGhpcy5mQ29udGVudEFzc2lzdGFudFByb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgdGhpcy5mQ29udGVudEFzc2lzdGFudC5zZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKG5ldyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKIAotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25pbmcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZEb2N1bWVudFBhcnRpdGlvbmluZzsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlcik7Ci0JfQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpGYWNlRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChwYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHRoaXMuZkNvbnRlbnRBc3Npc3RhbnQuc2V0Q29udGV4dEluZm9ybWF0aW9uUG9wdXBPcmllbnRhdGlvbihJQ29udGVudEFzc2lzdGFudC5DT05URVhUX0lORk9fQUJPVkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuZkNvbnRlbnRBc3Npc3RhbnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElUZXh0SG92ZXIgZ2V0VGV4dEhvdmVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKKyAgICAgICAgaWYgKHRoaXMuZlRleHRIb3ZlciA9PSBudWxsICYmIHRoaXMuZlNvdXJjZVBhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5mVGV4dEhvdmVyID0gbmV3IE1hbmlmZXN0VGV4dEhvdmVyKHRoaXMuZlNvdXJjZVBhZ2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmZUZXh0SG92ZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBnZXRJbmZvSW1wbGVtZW50YXRpb25UeXBlKCkgeworICAgICAgICByZXR1cm4gU291cmNlSW5mb3JtYXRpb25Qcm92aWRlci5GX01BTklGRVNUX0lNUDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgeworICAgICAgICBpZiAodGhpcy5mRG9jdW1lbnRQYXJ0aXRpb25pbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZkRvY3VtZW50UGFydGl0aW9uaW5nOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5nZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvQWJzdHJhY3RQZGVNYW5pZmVzdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvdGV4dC9BYnN0cmFjdFBkZU1hbmlmZXN0Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmluZGV4IGU2NTQ4MTYuLmY3ZDY4MGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvdGV4dC9BYnN0cmFjdFBkZU1hbmlmZXN0Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvdGV4dC9BYnN0cmFjdFBkZU1hbmlmZXN0Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzLnRleHQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtNjAsODU5ICs2MSw4MDQgQEAKIC8qKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKi8KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFBkZU1hbmlmZXN0Q29udGVudEFzc2lzdFByb2Nlc3NvciBleHRlbmRzIFR5cGVQYWNrYWdlQ29tcGxldGlvblByb2Nlc3NvciBpbXBsZW1lbnRzCi0JCUlDb21wbGV0aW9uTGlzdGVuZXIgeworcHVibGljIGNsYXNzIEFic3RyYWN0UGRlTWFuaWZlc3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgVHlwZVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbXBsZXRpb25MaXN0ZW5lciB7CiAKLQlwcm90ZWN0ZWQgUERFU291cmNlUGFnZSBmU291cmNlUGFnZTsKKyAgICBwcm90ZWN0ZWQgUERFU291cmNlUGFnZSBmU291cmNlUGFnZTsKIAotCXByaXZhdGUgSUphdmFQcm9qZWN0IGZKUDsKKyAgICBwcml2YXRlIElKYXZhUHJvamVjdCBmSlA7CiAKLQkvLyBpZiB3ZSBvcmRlciB0aGUgaGVhZGVycyBhbHBoYWJldGljYWxseSBpbiB0aGUgYXJyYXksIHRoZXJlIGlzIG5vIG5lZWQgdG8KLQkvLyBzb3J0IGFuZCB3ZSBjYW4gc2F2ZSB0aW1lCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBmSGVhZGVyID0geyBDb25zdGFudHMuQlVORExFX0FDVElWQVRPUiwgQ29uc3RhbnRzLkJVTkRMRV9BQ1RJVkFUSU9OUE9MSUNZLAotCQkJQ29uc3RhbnRzLkJVTkRMRV9DQVRFR09SWSwgQ29uc3RhbnRzLkJVTkRMRV9DTEFTU1BBVEgsIENvbnN0YW50cy5CVU5ETEVfQ09OVEFDVEFERFJFU1MsCi0JCQlDb25zdGFudHMuQlVORExFX0NPUFlSSUdIVCwgQ29uc3RhbnRzLkJVTkRMRV9ERVNDUklQVElPTiwgQ29uc3RhbnRzLkJVTkRMRV9ET0NVUkwsCi0JCQlDb25zdGFudHMuQlVORExFX0xPQ0FMSVpBVElPTiwgQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sIENvbnN0YW50cy5CVU5ETEVfTkFNRSwKLQkJCUNvbnN0YW50cy5CVU5ETEVfTkFUSVZFQ09ERSwgQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5ULCBDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwKLQkJCUNvbnN0YW50cy5CVU5ETEVfVVBEQVRFTE9DQVRJT04sIENvbnN0YW50cy5CVU5ETEVfVkVORE9SLCBDb25zdGFudHMuQlVORExFX1ZFUlNJT04sCi0JCQlDb25zdGFudHMuRFlOQU1JQ0lNUE9SVF9QQUNLQUdFLCBJQ29yZUNvbnN0YW50cy5FQ0xJUFNFX0JVRERZX1BPTElDWSwKLQkJCUlDb3JlQ29uc3RhbnRzLkVDTElQU0VfR0VORVJJQ19DQVBBQklMSVRZLCBJQ29yZUNvbnN0YW50cy5FQ0xJUFNFX0dFTkVSSUNfUkVRVUlSRUQsCi0JCQlJQ29yZUNvbnN0YW50cy5FQ0xJUFNFX0xBWllTVEFSVCwgQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCBJQ29yZUNvbnN0YW50cy5QTEFURk9STV9GSUxURVIsCi0JCQlJQ29yZUNvbnN0YW50cy5FQ0xJUFNFX1JFR0lTVEVSX0JVRERZLCBJQ29yZUNvbnN0YW50cy5FWFBPUlRfU0VSVklDRSwgQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLAotCQkJSUNvcmVDb25zdGFudHMuSU1QT1JUX1NFUlZJQ0UsIENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QgfTsKKyAgICAvLyBpZiB3ZSBvcmRlciB0aGUgaGVhZGVycyBhbHBoYWJldGljYWxseSBpbiB0aGUgYXJyYXksIHRoZXJlIGlzIG5vIG5lZWQgdG8KKyAgICAvLyBzb3J0IGFuZCB3ZSBjYW4gc2F2ZSB0aW1lCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBmSGVhZGVyID0geyBDb25zdGFudHMuQlVORExFX0FDVElWQVRPUiwgQ29uc3RhbnRzLkJVTkRMRV9BQ1RJVkFUSU9OUE9MSUNZLCBDb25zdGFudHMuQlVORExFX0NBVEVHT1JZLAorICAgICAgICBDb25zdGFudHMuQlVORExFX0NMQVNTUEFUSCwgQ29uc3RhbnRzLkJVTkRMRV9DT05UQUNUQUREUkVTUywgQ29uc3RhbnRzLkJVTkRMRV9DT1BZUklHSFQsIENvbnN0YW50cy5CVU5ETEVfREVTQ1JJUFRJT04sCisgICAgICAgIENvbnN0YW50cy5CVU5ETEVfRE9DVVJMLCBDb25zdGFudHMuQlVORExFX0xPQ0FMSVpBVElPTiwgQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04sIENvbnN0YW50cy5CVU5ETEVfTkFNRSwgQ29uc3RhbnRzLkJVTkRMRV9OQVRJVkVDT0RFLAorICAgICAgICBDb25zdGFudHMuQlVORExFX1JFUVVJUkVERVhFQ1VUSU9ORU5WSVJPTk1FTlQsIENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCBDb25zdGFudHMuQlVORExFX1VQREFURUxPQ0FUSU9OLCBDb25zdGFudHMuQlVORExFX1ZFTkRPUiwKKyAgICAgICAgQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OLCBDb25zdGFudHMuRFlOQU1JQ0lNUE9SVF9QQUNLQUdFLCBJQ29yZUNvbnN0YW50cy5FQ0xJUFNFX0JVRERZX1BPTElDWSwgSUNvcmVDb25zdGFudHMuRUNMSVBTRV9HRU5FUklDX0NBUEFCSUxJVFksCisgICAgICAgIElDb3JlQ29uc3RhbnRzLkVDTElQU0VfR0VORVJJQ19SRVFVSVJFRCwgSUNvcmVDb25zdGFudHMuRUNMSVBTRV9MQVpZU1RBUlQsIENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgSUNvcmVDb25zdGFudHMuUExBVEZPUk1fRklMVEVSLAorICAgICAgICBJQ29yZUNvbnN0YW50cy5FQ0xJUFNFX1JFR0lTVEVSX0JVRERZLCBJQ29yZUNvbnN0YW50cy5FWFBPUlRfU0VSVklDRSwgQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCBJQ29yZUNvbnN0YW50cy5JTVBPUlRfU0VSVklDRSwKKyAgICAgICAgQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLCBDb25zdGFudHMuRlJBR01FTlRfSE9TVCB9OwogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBVU1BTiA9ICJCcmlhbiBCYXVtYW4iOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBVU1BTiA9ICJCcmlhbiBCYXVtYW4iOyAvLyROT04tTkxTLTEkCiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5JU1pDWllLID0gIkNocmlzIEFuaXN6Y3p5ayI7IC8vJE5PTi1OTFMtMSQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5JU1pDWllLID0gIkNocmlzIEFuaXN6Y3p5ayI7IC8vJE5PTi1OTFMtMSQKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNPQ0tJX0JJQ1pZU0tPID0gIkphbmVrIExhc29ja2ktQmljenlza28iOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBU09DS0lfQklDWllTS08gPSAiSmFuZWsgTGFzb2NraS1CaWN6eXNrbyI7IC8vJE5PTi1OTFMtMSQKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVdMT1dTS0kgPSAiTWlrZSBQYXdsb3dza2kiOyAvLyROT04tTkxTLTEkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBV0xPV1NLSSA9ICJNaWtlIFBhd2xvd3NraSI7IC8vJE5PTi1OTFMtMSQKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRUxIRU0gPSAiV2Fzc2ltIE1lbGhlbSI7IC8vJE5PTi1OTFMtMSQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVMSEVNID0gIldhc3NpbSBNZWxoZW0iOyAvLyROT04tTkxTLTEkCiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBmTmFtZXMgPSB7IEJBVU1BTiwgQU5JU1pDWllLLCBMQVNPQ0tJX0JJQ1pZU0tPLCBQQVdMT1dTS0ksIE1FTEhFTSB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGZOYW1lcyA9IHsgQkFVTUFOLCBBTklTWkNaWUssIExBU09DS0lfQklDWllTS08sIFBBV0xPV1NLSSwgTUVMSEVNIH07CiAKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IEZfVFlQRV9IRUFERVIgPSAwLCAvLyBoZWFkZXIgcHJvcG9zYWwKLQkJCUZfVFlQRV9QS0cgPSAxLCAvLyBwYWNrYWdlIHByb3Bvc2FsCi0JCQlGX1RZUEVfQlVORExFID0gMiwgLy8gYnVuZGxlIHByb3Bvc2FsCi0JCQlGX1RZUEVfQ0xBU1MgPSAzLCAvLyBjbGFzcyBwcm9wb3NhbAotCQkJRl9UWVBFX0RJUkVDVElWRSA9IDQsIC8vIGRpcmVjdGl2ZSBwcm9wb3NhbAotCQkJRl9UWVBFX0FUVFJJQlVURSA9IDUsIC8vIGF0dHJpYnV0ZSBwcm9wb3NhbAotCQkJRl9UWVBFX1ZBTFVFID0gNiwgLy8gdmFsdWUgb2YgYXR0cmlidXRlIG9yIGRpcmVjdGl2ZSBwcm9wb3NhbAotCQkJRl9UWVBFX0VYRUNfRU5WID0gNywgLy8gdmFsdWUgb2YgZXhlY3V0aW9uIGVudi4sIGFkZGVkIHNpbmNlIHdlCi0JCQkvLyB1c2UgYSB1bmlxdWUgaWNvbiBmb3IgZXhlYyBlbnZzLgotCQkJRl9UWVBFX0xJQiA9IDgsIEZfVE9UQUxfVFlQRVMgPSA5OworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgRl9UWVBFX0hFQURFUiA9IDAsIC8vIGhlYWRlciBwcm9wb3NhbAorICAgICAgICBGX1RZUEVfUEtHID0gMSwgLy8gcGFja2FnZSBwcm9wb3NhbAorICAgICAgICBGX1RZUEVfQlVORExFID0gMiwgLy8gYnVuZGxlIHByb3Bvc2FsCisgICAgICAgIEZfVFlQRV9DTEFTUyA9IDMsIC8vIGNsYXNzIHByb3Bvc2FsCisgICAgICAgIEZfVFlQRV9ESVJFQ1RJVkUgPSA0LCAvLyBkaXJlY3RpdmUgcHJvcG9zYWwKKyAgICAgICAgRl9UWVBFX0FUVFJJQlVURSA9IDUsIC8vIGF0dHJpYnV0ZSBwcm9wb3NhbAorICAgICAgICBGX1RZUEVfVkFMVUUgPSA2LCAvLyB2YWx1ZSBvZiBhdHRyaWJ1dGUgb3IgZGlyZWN0aXZlIHByb3Bvc2FsCisgICAgICAgIEZfVFlQRV9FWEVDX0VOViA9IDcsIC8vIHZhbHVlIG9mIGV4ZWN1dGlvbiBlbnYuLCBhZGRlZCBzaW5jZSB3ZQorICAgICAgICAvLyB1c2UgYSB1bmlxdWUgaWNvbiBmb3IgZXhlYyBlbnZzLgorICAgICAgICBGX1RZUEVfTElCID0gOCwgRl9UT1RBTF9UWVBFUyA9IDk7CiAKLQlwcm90ZWN0ZWQgZmluYWwgSW1hZ2VbXSBmSW1hZ2VzID0gbmV3IEltYWdlW0ZfVE9UQUxfVFlQRVNdOworICAgIHByb3RlY3RlZCBmaW5hbCBJbWFnZVtdIGZJbWFnZXMgPSBuZXcgSW1hZ2VbRl9UT1RBTF9UWVBFU107CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBmRXhlY0VudnM7Ci0Jc3RhdGljIHsKLQkJSUV4ZWN1dGlvbkVudmlyb25tZW50W10gZW52cyA9IEphdmFSdW50aW1lLmdldEV4ZWN1dGlvbkVudmlyb25tZW50c01hbmFnZXIoKS5nZXRFeGVjdXRpb25FbnZpcm9ubWVudHMoKTsKLQkJZkV4ZWNFbnZzID0gbmV3IFN0cmluZ1tlbnZzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW52cy5sZW5ndGg7IGkrKykgewotCQkJZkV4ZWNFbnZzW2ldID0gZW52c1tpXS5nZXRJZCgpOwotCQl9Ci0JCUFycmF5cy5zb3J0KGZFeGVjRW52cywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQlyZXR1cm4gKChTdHJpbmcpIG8xKS5jb21wYXJlVG9JZ25vcmVDYXNlKChTdHJpbmcpIG8yKTsKLQkJCX0KLQkJfSk7Ci0JfQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGZFeGVjRW52czsKIAotCXByb3RlY3RlZCBNYXAgZkhlYWRlcnM7CisgICAgc3RhdGljIHsKKyAgICAgICAgSUV4ZWN1dGlvbkVudmlyb25tZW50W10gZW52cyA9IEphdmFSdW50aW1lLmdldEV4ZWN1dGlvbkVudmlyb25tZW50c01hbmFnZXIoKS5nZXRFeGVjdXRpb25FbnZpcm9ubWVudHMoKTsKKyAgICAgICAgZkV4ZWNFbnZzID0gbmV3IFN0cmluZ1tlbnZzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW52cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZkV4ZWNFbnZzW2ldID0gZW52c1tpXS5nZXRJZCgpOworICAgICAgICB9CisgICAgICAgIEFycmF5cy5zb3J0KGZFeGVjRW52cywgbmV3IENvbXBhcmF0b3IoKSB7CiAKLQlwdWJsaWMgQWJzdHJhY3RQZGVNYW5pZmVzdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoUERFU291cmNlUGFnZSBzb3VyY2VQYWdlKSB7Ci0JCWZTb3VyY2VQYWdlID0gc291cmNlUGFnZTsKLQl9CisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChTdHJpbmcpIG8xKS5jb21wYXJlVG9JZ25vcmVDYXNlKChTdHJpbmcpIG8yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJSURvY3VtZW50IGRvYyA9IGZTb3VyY2VQYWdlLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChmU291cmNlUGFnZS5nZXRJbnB1dENvbnRleHQoKS5nZXRJbnB1dCgpKTsKLQkJaWYgKGZIZWFkZXJzID09IG51bGwpIHsKLQkJCXBhcnNlRG9jdW1lbnQoZG9jKTsKLQkJfQotCQl0cnkgewotCQkJaW50IGxpbmVOdW0gPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KG9mZnNldCk7Ci0JCQlpbnQgbGluZVN0YXJ0ID0gZG9jLmdldExpbmVPZmZzZXQobGluZU51bSk7Ci0JCQlyZXR1cm4gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZG9jLCBsaW5lU3RhcnQsIG9mZnNldCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgcHJvdGVjdGVkIE1hcCBmSGVhZGVyczsKIAotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHBhcnNlRG9jdW1lbnQoSURvY3VtZW50IGRvYykgewotCQlmSGVhZGVycyA9IG5ldyBIZWFkZXJNYXAoKTsKLQkJaW50IG51bUxpbmVzID0gZG9jLmdldE51bWJlck9mTGluZXMoKTsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtTGluZXM7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmUgPSBkb2MuZ2V0TGluZUluZm9ybWF0aW9uKGkpOwotCQkJCVN0cmluZyB2YWx1ZSA9IGRvYy5nZXQob2Zmc2V0LCBsaW5lLmdldE9mZnNldCgpICsgbGluZS5nZXRMZW5ndGgoKSAtIG9mZnNldCk7Ci0JCQkJaWYgKHZhbHVlLmluZGV4T2YoJzonKSAhPSB2YWx1ZS5sYXN0SW5kZXhPZignOicpIHx8IGkgPT0gKG51bUxpbmVzIC0gMSkpIHsKLQkJCQkJdmFsdWUgPSBkb2MuZ2V0KG9mZnNldCwgbGluZS5nZXRPZmZzZXQoKSAtIG9mZnNldCAtIDEpLnRyaW0oKTsKLQkJCQkJaW50IGluZGV4ID0gdmFsdWUuaW5kZXhPZignOicpOwotCQkJCQlTdHJpbmcgaGVhZGVyID0gKGluZGV4ID09IC0xKSA/IHZhbHVlIDogdmFsdWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmICh2YWx1ZS5lbmRzV2l0aCgiLCIpKSB7Ci0JCQkJCQkJdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoKCkgLSAxKTsKLQkJCQkJCX0KLQkJCQkJCU1hbmlmZXN0RWxlbWVudFtdIGVsZW1zID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlSGVhZGVyKGhlYWRlciwgdmFsdWUuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotCQkJCQkJaWYgKHNob3VsZFN0b3JlU2V0KGhlYWRlcikpIHsKLQkJCQkJCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCg0IC8gMykgKiBlbGVtcy5sZW5ndGggKyAxKTsKLQkJCQkJCQlmb3IgKE1hbmlmZXN0RWxlbWVudCBlbGVtZW50IDogZWxlbXMpIHsKLQkJCQkJCQkJc2V0LmFkZChlbGVtZW50LmdldFZhbHVlKCkpOwotCQkJCQkJCX0KLQkJCQkJCQlmSGVhZGVycy5wdXQoaGVhZGVyLCBzZXQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlmSGVhZGVycy5wdXQoaGVhZGVyLCBlbGVtcyk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQkJb2Zmc2V0ID0gbGluZS5nZXRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHVibGljIEFic3RyYWN0UGRlTWFuaWZlc3RDb250ZW50QXNzaXN0UHJvY2Vzc29yKFBERVNvdXJjZVBhZ2Ugc291cmNlUGFnZSkgeworICAgICAgICB0aGlzLmZTb3VyY2VQYWdlID0gc291cmNlUGFnZTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTdG9yZVNldChTdHJpbmcgaGVhZGVyKSB7Ci0JCXJldHVybiBoZWFkZXIuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UpIHx8IGhlYWRlci5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSkKLQkJCQl8fCBoZWFkZXIuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUpCi0JCQkJfHwgaGVhZGVyLmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5UKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKKyAgICAgICAgSURvY3VtZW50IGRvYyA9IHRoaXMuZlNvdXJjZVBhZ2UuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRoaXMuZlNvdXJjZVBhZ2UuZ2V0SW5wdXRDb250ZXh0KCkuZ2V0SW5wdXQoKSk7CisgICAgICAgIGlmICh0aGlzLmZIZWFkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcnNlRG9jdW1lbnQoZG9jKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGxpbmVOdW0gPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KG9mZnNldCk7CisgICAgICAgICAgICBpbnQgbGluZVN0YXJ0ID0gZG9jLmdldExpbmVPZmZzZXQobGluZU51bSk7CisgICAgICAgICAgICByZXR1cm4gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZG9jLCBsaW5lU3RhcnQsIG9mZnNldCk7CisgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElEb2N1bWVudCBkb2MsIGludCBzdGFydE9mZnNldCwgaW50IG9mZnNldCkgewotCQl0cnkgewotCQkJaWYgKCFpc0hlYWRlcihkb2MsIHN0YXJ0T2Zmc2V0LCBvZmZzZXQpKSB7Ci0JCQkJcmV0dXJuIGNvbXB1dGVWYWx1ZShkb2MsIHN0YXJ0T2Zmc2V0LCBvZmZzZXQpOwotCQkJfQotCQkJcmV0dXJuIGNvbXB1dGVIZWFkZXIoZG9jLmdldChzdGFydE9mZnNldCwgb2Zmc2V0IC0gc3RhcnRPZmZzZXQpLCBzdGFydE9mZnNldCwgb2Zmc2V0KTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQl9CisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgcGFyc2VEb2N1bWVudChJRG9jdW1lbnQgZG9jKSB7CisgICAgICAgIHRoaXMuZkhlYWRlcnMgPSBuZXcgSGVhZGVyTWFwKCk7CisgICAgICAgIGludCBudW1MaW5lcyA9IGRvYy5nZXROdW1iZXJPZkxpbmVzKCk7CisgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUxpbmVzOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSVJlZ2lvbiBsaW5lID0gZG9jLmdldExpbmVJbmZvcm1hdGlvbihpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBkb2MuZ2V0KG9mZnNldCwgbGluZS5nZXRPZmZzZXQoKSArIGxpbmUuZ2V0TGVuZ3RoKCkgLSBvZmZzZXQpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCc6JykgIT0gdmFsdWUubGFzdEluZGV4T2YoJzonKSB8fCBpID09IG51bUxpbmVzIC0gMSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRvYy5nZXQob2Zmc2V0LCBsaW5lLmdldE9mZnNldCgpIC0gb2Zmc2V0IC0gMSkudHJpbSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSB2YWx1ZS5pbmRleE9mKCc6Jyk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWFkZXIgPSBpbmRleCA9PSAtMSA/IHZhbHVlIDogdmFsdWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5lbmRzV2l0aCgiLCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIE1hbmlmZXN0RWxlbWVudFtdIGVsZW1zID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlSGVhZGVyKGhlYWRlciwgdmFsdWUuc3Vic3RyaW5nKGluZGV4ICsgMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFN0b3JlU2V0KGhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KDQgLyAzICogZWxlbXMubGVuZ3RoICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCA6IGVsZW1zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC5hZGQoZWxlbWVudC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mSGVhZGVycy5wdXQoaGVhZGVyLCBzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZIZWFkZXJzLnB1dChoZWFkZXIsIGVsZW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBsaW5lLmdldE9mZnNldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzSGVhZGVyKElEb2N1bWVudCBkb2MsIGludCBzdGFydE9mZnNldCwgaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHZhbHVlID0gZG9jLmdldChzdGFydE9mZnNldCwgb2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQlpZiAodmFsdWUuaW5kZXhPZignOicpICE9IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yICgtLXN0YXJ0T2Zmc2V0OyBzdGFydE9mZnNldCA+PSAwOyAtLXN0YXJ0T2Zmc2V0KSB7Ci0JCQljaGFyIGNoID0gZG9jLmdldENoYXIoc3RhcnRPZmZzZXQpOwotCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoKSkgewotCQkJCXJldHVybiBjaCAhPSAnLCcgJiYgY2ggIT0gJzonICYmIGNoICE9ICc7JzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU3RvcmVTZXQoU3RyaW5nIGhlYWRlcikgeworICAgICAgICByZXR1cm4gaGVhZGVyLmVxdWFsc0lnbm9yZUNhc2UoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFKSB8fCBoZWFkZXIuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UpCisgICAgICAgICAgICB8fCBoZWFkZXIuZXF1YWxzSWdub3JlQ2FzZShDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUpIHx8IGhlYWRlci5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5CVU5ETEVfUkVRVUlSRURFWEVDVVRJT05FTlZJUk9OTUVOVCk7CisgICAgfQogCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlSGVhZGVyKFN0cmluZyBjdXJyZW50VmFsdWUsIGludCBzdGFydE9mZnNldCwgaW50IG9mZnNldCkgewotCQlBcnJheUxpc3QgY29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlCYXNlTW9kZWwgbW9kZWwgPSBmU291cmNlUGFnZS5nZXRJbnB1dENvbnRleHQoKS5nZXRNb2RlbCgpOwotCQlpbnQgbGVuZ3RoID0gZkhlYWRlci5sZW5ndGg7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIElCdW5kbGVNb2RlbCAmJiAhKChJQnVuZGxlTW9kZWwpIG1vZGVsKS5pc0ZyYWdtZW50TW9kZWwoKSkgewotCQkJLS1sZW5ndGg7Ci0JCX0KLQkJZm9yIChTdHJpbmcgZWxlbWVudCA6IGZIZWFkZXIpIHsKLQkJCWlmIChlbGVtZW50LnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgY3VycmVudFZhbHVlLCAwLCBjdXJyZW50VmFsdWUubGVuZ3RoKCkpICYmIGZIZWFkZXJzLmdldChlbGVtZW50KSA9PSBudWxsKSB7Ci0JCQkJQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkJZWxlbWVudCArICI6ICIsIGdldEltYWdlKEZfVFlQRV9IRUFERVIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQllbGVtZW50LCBzdGFydE9mZnNldCwgY3VycmVudFZhbHVlLmxlbmd0aCgpKTsKLQkJCQlwcm9wb3NhbC5zZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKGdldEphdmFEb2MoZWxlbWVudCkpOwotCQkJCWNvbXBsZXRpb25zLmFkZChwcm9wb3NhbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIGNvbXBsZXRpb25zLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbY29tcGxldGlvbnMuc2l6ZSgpXSk7Ci0JfQorICAgIHByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSURvY3VtZW50IGRvYywgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWlzSGVhZGVyKGRvYywgc3RhcnRPZmZzZXQsIG9mZnNldCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcHV0ZVZhbHVlKGRvYywgc3RhcnRPZmZzZXQsIG9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29tcHV0ZUhlYWRlcihkb2MuZ2V0KHN0YXJ0T2Zmc2V0LCBvZmZzZXQgLSBzdGFydE9mZnNldCksIHN0YXJ0T2Zmc2V0LCBvZmZzZXQpOworICAgICAgICB9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOworICAgIH0KIAotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZVZhbHVlKElEb2N1bWVudCBkb2MsIGludCBzdGFydE9mZnNldCwgaW50IG9mZnNldCkKLQkJCXRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB2YWx1ZSA9IGRvYy5nZXQoc3RhcnRPZmZzZXQsIG9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKLQkJaW50IGxpbmVOdW0gPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0T2Zmc2V0KSAtIDE7Ci0JCWludCBpbmRleDsKLQkJd2hpbGUgKChpbmRleCA9IHZhbHVlLmluZGV4T2YoJzonKSkgPT0gLTEKLQkJCQl8fCAoKHZhbHVlLmxlbmd0aCgpIC0gMSAhPSBpbmRleCkgJiYgKHZhbHVlLmNoYXJBdChpbmRleCArIDEpID09ICc9JykpKSB7Ci0JCQlpbnQgc3RhcnRMaW5lID0gZG9jLmdldExpbmVPZmZzZXQobGluZU51bSk7Ci0JCQl2YWx1ZSA9IGRvYy5nZXQoc3RhcnRMaW5lLCBvZmZzZXQgLSBzdGFydExpbmUpOwotCQkJbGluZU51bS0tOwotCQl9CisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNIZWFkZXIoSURvY3VtZW50IGRvYywgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdmFsdWUgPSBkb2MuZ2V0KHN0YXJ0T2Zmc2V0LCBvZmZzZXQgLSBzdGFydE9mZnNldCk7CisgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCc6JykgIT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKC0tc3RhcnRPZmZzZXQ7IHN0YXJ0T2Zmc2V0ID49IDA7IC0tc3RhcnRPZmZzZXQpIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBkb2MuZ2V0Q2hhcihzdGFydE9mZnNldCk7CisgICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoICE9ICcsJyAmJiBjaCAhPSAnOicgJiYgY2ggIT0gJzsnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAotCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCWlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgMCwKLQkJCQlNYXRoLm1pbihsZW5ndGgsIENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRS5sZW5ndGgoKSkpKSB7Ci0JCQlyZXR1cm4gaGFuZGxlSW1wb3J0UGFja2FnZUNvbXBsZXRpb24odmFsdWUuc3Vic3RyaW5nKENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRS5sZW5ndGgoKSArIDEpLCBvZmZzZXQpOwotCQl9Ci0JCWlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIENvbnN0YW50cy5GUkFHTUVOVF9IT1NULCAwLCBNYXRoLm1pbihsZW5ndGgsIENvbnN0YW50cy5GUkFHTUVOVF9IT1NULmxlbmd0aCgpKSkpIHsKLQkJCXJldHVybiBoYW5kbGVGcmFnbWVudEhvc3RDb21wbGV0aW9uKHZhbHVlLnN1YnN0cmluZyhDb25zdGFudHMuRlJBR01FTlRfSE9TVC5sZW5ndGgoKSArIDEpLCBvZmZzZXQpOwotCQl9Ci0JCWlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSwgMCwKLQkJCQlNYXRoLm1pbihsZW5ndGgsIENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRS5sZW5ndGgoKSkpKSB7Ci0JCQlyZXR1cm4gaGFuZGxlUmVxdWlyZUJ1bmRsZUNvbXBsZXRpb24odmFsdWUuc3Vic3RyaW5nKENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRS5sZW5ndGgoKSArIDEpLCBvZmZzZXQpOwotCQl9Ci0JCWlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRSwgMCwKLQkJCQlNYXRoLm1pbihsZW5ndGgsIENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRS5sZW5ndGgoKSkpKSB7Ci0JCQlyZXR1cm4gaGFuZGxlRXhwb3J0UGFja2FnZUNvbXBsZXRpb24odmFsdWUuc3Vic3RyaW5nKENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRS5sZW5ndGgoKSArIDEpLCBvZmZzZXQpOwotCQl9Ci0JCWlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIENvbnN0YW50cy5CVU5ETEVfQUNUSVZBVE9SLCAwLAotCQkJCU1hdGgubWluKGxlbmd0aCwgQ29uc3RhbnRzLkJVTkRMRV9BQ1RJVkFUT1IubGVuZ3RoKCkpKSkgewotCQkJcmV0dXJuIGhhbmRsZUJ1bmRsZUFjdGl2YXRvckNvbXBsZXRpb24oCi0JCQkJCXJlbW92ZUxlYWRpbmdTcGFjZXModmFsdWUuc3Vic3RyaW5nKENvbnN0YW50cy5CVU5ETEVfQUNUSVZBVE9SLmxlbmd0aCgpICsgMSkpLCBvZmZzZXQpOwotCQl9Ci0JCWlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAwLAotCQkJCU1hdGgubWluKGxlbmd0aCwgQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUubGVuZ3RoKCkpKSkgewotCQkJcmV0dXJuIGhhbmRsZUJ1bmRsZVN5bWJvbGljTmFtZUNvbXBsZXRpb24odmFsdWUuc3Vic3RyaW5nKENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLmxlbmd0aCgpICsgMSksCi0JCQkJCW9mZnNldCk7Ci0JCX0KLQkJaWYgKHZhbHVlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5ULCAwLAotCQkJCU1hdGgubWluKGxlbmd0aCwgQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5ULmxlbmd0aCgpKSkpIHsKLQkJCXJldHVybiBoYW5kbGVSZXF1aXJlZEV4ZWNFbnYodmFsdWUuc3Vic3RyaW5nKENvbnN0YW50cy5CVU5ETEVfUkVRVUlSRURFWEVDVVRJT05FTlZJUk9OTUVOVC5sZW5ndGgoKSArIDEpLAotCQkJCQlvZmZzZXQpOwotCQl9Ci0JCWlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIElDb3JlQ29uc3RhbnRzLkVDTElQU0VfTEFaWVNUQVJULCAwLAotCQkJCU1hdGgubWluKGxlbmd0aCwgSUNvcmVDb25zdGFudHMuRUNMSVBTRV9MQVpZU1RBUlQubGVuZ3RoKCkpKSkgewotCQkJcmV0dXJuIGhhbmRsZVRydWVGYWxzZVZhbHVlKHZhbHVlLnN1YnN0cmluZyhJQ29yZUNvbnN0YW50cy5FQ0xJUFNFX0xBWllTVEFSVC5sZW5ndGgoKSArIDEpLCBvZmZzZXQpOwotCQl9Ci0JCWlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIENvbnN0YW50cy5CVU5ETEVfTkFNRSwgMCwgTWF0aC5taW4obGVuZ3RoLCBDb25zdGFudHMuQlVORExFX05BTUUubGVuZ3RoKCkpKSkgewotCQkJcmV0dXJuIGhhbmRsZUJ1bmRsZU5hbWVDb21wbGV0aW9uKHZhbHVlLnN1YnN0cmluZyhDb25zdGFudHMuQlVORExFX05BTUUubGVuZ3RoKCkgKyAxKSwgb2Zmc2V0KTsKLQkJfQotCQlpZiAodmFsdWUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBDb25zdGFudHMuQlVORExFX0FDVElWQVRJT05QT0xJQ1ksIDAsCi0JCQkJTWF0aC5taW4obGVuZ3RoLCBDb25zdGFudHMuQlVORExFX0FDVElWQVRJT05QT0xJQ1kubGVuZ3RoKCkpKSkgewotCQkJcmV0dXJuIGhhbmRsZUJ1bmRsZUFjdGl2YXRpb25Qb2xpY3lDb21wbGV0aW9uKAotCQkJCQl2YWx1ZS5zdWJzdHJpbmcoQ29uc3RhbnRzLkJVTkRMRV9BQ1RJVkFUSU9OUE9MSUNZLmxlbmd0aCgpICsgMSksIG9mZnNldCk7Ci0JCX0KLQkJaWYgKHZhbHVlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgSUNvcmVDb25zdGFudHMuRUNMSVBTRV9CVUREWV9QT0xJQ1ksIDAsCi0JCQkJTWF0aC5taW4obGVuZ3RoLCBJQ29yZUNvbnN0YW50cy5FQ0xJUFNFX0JVRERZX1BPTElDWS5sZW5ndGgoKSkpKSB7Ci0JCQlyZXR1cm4gaGFuZGxlQnVkZHlQb2xpY3lDb21wbGV0aW9uKHZhbHVlLnN1YnN0cmluZyhJQ29yZUNvbnN0YW50cy5FQ0xJUFNFX0JVRERZX1BPTElDWS5sZW5ndGgoKSArIDEpLAotCQkJCQlvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQl9CisgICAgcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlSGVhZGVyKFN0cmluZyBjdXJyZW50VmFsdWUsIGludCBzdGFydE9mZnNldCwgaW50IG9mZnNldCkgeworICAgICAgICBBcnJheUxpc3QgY29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIElCYXNlTW9kZWwgbW9kZWwgPSB0aGlzLmZTb3VyY2VQYWdlLmdldElucHV0Q29udGV4dCgpLmdldE1vZGVsKCk7CisgICAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElCdW5kbGVNb2RlbCAmJiAhKChJQnVuZGxlTW9kZWwpIG1vZGVsKS5pc0ZyYWdtZW50TW9kZWwoKSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiBmSGVhZGVyKSB7CisgICAgICAgICAgICBpZiAoZWxlbWVudC5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGN1cnJlbnRWYWx1ZSwgMCwgY3VycmVudFZhbHVlLmxlbmd0aCgpKSAmJiB0aGlzLmZIZWFkZXJzLmdldChlbGVtZW50KSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKGVsZW1lbnQgKyAiOiAiLCBnZXRJbWFnZShGX1RZUEVfSEVBREVSKSwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCBzdGFydE9mZnNldCwgY3VycmVudFZhbHVlLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBwcm9wb3NhbC5zZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKGdldEphdmFEb2MoZWxlbWVudCkpOworICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLmFkZChwcm9wb3NhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIGNvbXBsZXRpb25zLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbY29tcGxldGlvbnMuc2l6ZSgpXSk7CisgICAgfQogCi0JLyoKLQkgKiBFYXN0ZXIgRWdnCi0JICovCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBoYW5kbGVCdW5kbGVOYW1lQ29tcGxldGlvbihTdHJpbmcgY3VycmVudFZhbHVlLCBpbnQgb2Zmc2V0KSB7Ci0JCWN1cnJlbnRWYWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlKTsKLQkJaW50IGxlbmd0aCA9IGN1cnJlbnRWYWx1ZS5sZW5ndGgoKTsKKyAgICBwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVWYWx1ZShJRG9jdW1lbnQgZG9jLCBpbnQgc3RhcnRPZmZzZXQsIGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGRvYy5nZXQoc3RhcnRPZmZzZXQsIG9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKKyAgICAgICAgaW50IGxpbmVOdW0gPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0T2Zmc2V0KSAtIDE7CisgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgd2hpbGUgKChpbmRleCA9IHZhbHVlLmluZGV4T2YoJzonKSkgPT0gLTEgfHwgdmFsdWUubGVuZ3RoKCkgLSAxICE9IGluZGV4ICYmIHZhbHVlLmNoYXJBdChpbmRleCArIDEpID09ICc9JykgeworICAgICAgICAgICAgaW50IHN0YXJ0TGluZSA9IGRvYy5nZXRMaW5lT2Zmc2V0KGxpbmVOdW0pOworICAgICAgICAgICAgdmFsdWUgPSBkb2MuZ2V0KHN0YXJ0TGluZSwgb2Zmc2V0IC0gc3RhcnRMaW5lKTsKKyAgICAgICAgICAgIGxpbmVOdW0tLTsKKyAgICAgICAgfQogCi0JCS8vIG9ubHkgc2hvdyB3aGVuIHRoZXJlIGlzIG5vIGJ1bmRsZSBuYW1lCi0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW10gewotCQkJCQluZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChCQVVNQU4sIG51bGwsIEJBVU1BTiwgb2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpLAotCQkJCQluZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChBTklTWkNaWUssIG51bGwsIEFOSVNaQ1pZSywgb2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpLAotCQkJCQluZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChMQVNPQ0tJX0JJQ1pZU0tPLCBudWxsLCBMQVNPQ0tJX0JJQ1pZU0tPLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCksCi0JCQkJCW5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKFBBV0xPV1NLSSwgbnVsbCwgUEFXTE9XU0tJLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCksCi0JCQkJCW5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKE1FTEhFTSwgbnVsbCwgTUVMSEVNLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCkgfTsKLQkJfQorICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7CisgICAgICAgIGlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgMCwgTWF0aC5taW4obGVuZ3RoLCBDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UubGVuZ3RoKCkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUltcG9ydFBhY2thZ2VDb21wbGV0aW9uKHZhbHVlLnN1YnN0cmluZyhDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UubGVuZ3RoKCkgKyAxKSwgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgMCwgTWF0aC5taW4obGVuZ3RoLCBDb25zdGFudHMuRlJBR01FTlRfSE9TVC5sZW5ndGgoKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlRnJhZ21lbnRIb3N0Q29tcGxldGlvbih2YWx1ZS5zdWJzdHJpbmcoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QubGVuZ3RoKCkgKyAxKSwgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsIDAsIE1hdGgubWluKGxlbmd0aCwgQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLmxlbmd0aCgpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVSZXF1aXJlQnVuZGxlQ29tcGxldGlvbih2YWx1ZS5zdWJzdHJpbmcoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFLmxlbmd0aCgpICsgMSksIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCAwLCBNYXRoLm1pbihsZW5ndGgsIENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRS5sZW5ndGgoKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlRXhwb3J0UGFja2FnZUNvbXBsZXRpb24odmFsdWUuc3Vic3RyaW5nKENvbnN0YW50cy5FWFBPUlRfUEFDS0FHRS5sZW5ndGgoKSArIDEpLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIENvbnN0YW50cy5CVU5ETEVfQUNUSVZBVE9SLCAwLCBNYXRoLm1pbihsZW5ndGgsIENvbnN0YW50cy5CVU5ETEVfQUNUSVZBVE9SLmxlbmd0aCgpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVCdW5kbGVBY3RpdmF0b3JDb21wbGV0aW9uKHJlbW92ZUxlYWRpbmdTcGFjZXModmFsdWUuc3Vic3RyaW5nKENvbnN0YW50cy5CVU5ETEVfQUNUSVZBVE9SLmxlbmd0aCgpICsgMSkpLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCAwLCBNYXRoLm1pbihsZW5ndGgsIENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLmxlbmd0aCgpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVCdW5kbGVTeW1ib2xpY05hbWVDb21wbGV0aW9uKHZhbHVlLnN1YnN0cmluZyhDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRS5sZW5ndGgoKSArIDEpLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIENvbnN0YW50cy5CVU5ETEVfUkVRVUlSRURFWEVDVVRJT05FTlZJUk9OTUVOVCwgMCwKKyAgICAgICAgICAgIE1hdGgubWluKGxlbmd0aCwgQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5ULmxlbmd0aCgpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVSZXF1aXJlZEV4ZWNFbnYodmFsdWUuc3Vic3RyaW5nKENvbnN0YW50cy5CVU5ETEVfUkVRVUlSRURFWEVDVVRJT05FTlZJUk9OTUVOVC5sZW5ndGgoKSArIDEpLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIElDb3JlQ29uc3RhbnRzLkVDTElQU0VfTEFaWVNUQVJULCAwLCBNYXRoLm1pbihsZW5ndGgsIElDb3JlQ29uc3RhbnRzLkVDTElQU0VfTEFaWVNUQVJULmxlbmd0aCgpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVUcnVlRmFsc2VWYWx1ZSh2YWx1ZS5zdWJzdHJpbmcoSUNvcmVDb25zdGFudHMuRUNMSVBTRV9MQVpZU1RBUlQubGVuZ3RoKCkgKyAxKSwgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBDb25zdGFudHMuQlVORExFX05BTUUsIDAsIE1hdGgubWluKGxlbmd0aCwgQ29uc3RhbnRzLkJVTkRMRV9OQU1FLmxlbmd0aCgpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVCdW5kbGVOYW1lQ29tcGxldGlvbih2YWx1ZS5zdWJzdHJpbmcoQ29uc3RhbnRzLkJVTkRMRV9OQU1FLmxlbmd0aCgpICsgMSksIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgQ29uc3RhbnRzLkJVTkRMRV9BQ1RJVkFUSU9OUE9MSUNZLCAwLCBNYXRoLm1pbihsZW5ndGgsIENvbnN0YW50cy5CVU5ETEVfQUNUSVZBVElPTlBPTElDWS5sZW5ndGgoKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlQnVuZGxlQWN0aXZhdGlvblBvbGljeUNvbXBsZXRpb24odmFsdWUuc3Vic3RyaW5nKENvbnN0YW50cy5CVU5ETEVfQUNUSVZBVElPTlBPTElDWS5sZW5ndGgoKSArIDEpLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIElDb3JlQ29uc3RhbnRzLkVDTElQU0VfQlVERFlfUE9MSUNZLCAwLCBNYXRoLm1pbihsZW5ndGgsIElDb3JlQ29uc3RhbnRzLkVDTElQU0VfQlVERFlfUE9MSUNZLmxlbmd0aCgpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVCdWRkeVBvbGljeUNvbXBsZXRpb24odmFsdWUuc3Vic3RyaW5nKElDb3JlQ29uc3RhbnRzLkVDTElQU0VfQlVERFlfUE9MSUNZLmxlbmd0aCgpICsgMSksIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOworICAgIH0KIAotCQkvLyBvbmx5IHNob3cgd2hlbiB3ZSBhcmUgdHJ5aW5nIHRvIGNvbXBsZXRlIGEgbmFtZQotCQlmb3IgKFN0cmluZyBlbGVtZW50IDogZk5hbWVzKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjdXJyZW50VmFsdWUsICIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCWlmIChlbGVtZW50LnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgdG9rZW4sIDAsIHRva2VuLmxlbmd0aCgpKSkgewotCQkJCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKGVsZW1lbnQsIG51bGwsIGVsZW1lbnQsIG9mZnNldAotCQkJCQkJCS0gdG9rZW4ubGVuZ3RoKCksIHRva2VuLmxlbmd0aCgpKSB9OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JfQorICAgIC8qCisgICAgICogRWFzdGVyIEVnZworICAgICAqLworICAgIHByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gaGFuZGxlQnVuZGxlTmFtZUNvbXBsZXRpb24oU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IG9mZnNldCkgeworICAgICAgICBjdXJyZW50VmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZSk7CisgICAgICAgIGludCBsZW5ndGggPSBjdXJyZW50VmFsdWUubGVuZ3RoKCk7CiAKLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZUltcG9ydFBhY2thZ2VDb21wbGV0aW9uKFN0cmluZyBjdXJyZW50VmFsdWUsIGludCBvZmZzZXQpIHsKLQkJaW50IGNvbW1hID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCcsJyk7Ci0JCWludCBzZW1pY29sb24gPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJzsnKTsKLQkJU3RyaW5nIHZhbHVlID0gY29tbWEgIT0gLTEgPyBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGNvbW1hICsgMSkgOiBjdXJyZW50VmFsdWU7Ci0JCWlmIChjb21tYSA+IHNlbWljb2xvbiB8fCBjb21tYSA9PSBzZW1pY29sb24pIHsKLQkJCUhhc2hTZXQgc2V0ID0gKEhhc2hTZXQpIGZIZWFkZXJzLmdldChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UpOwotCQkJaWYgKHNldCA9PSBudWxsKSB7Ci0JCQkJc2V0ID0gcGFyc2VIZWFkZXJGb3JWYWx1ZXMoY3VycmVudFZhbHVlLCBvZmZzZXQpOwotCQkJfQotCQkJSGFzaFNldCBpbXBvcnRlZEJ1bmRsZXMgPSAoSGFzaFNldCkgZkhlYWRlcnMuZ2V0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSk7Ci0JCQlpZiAoaW1wb3J0ZWRCdW5kbGVzID09IG51bGwpIHsKLQkJCQlpbXBvcnRlZEJ1bmRsZXMgPSBuZXcgSGFzaFNldCgwKTsKLQkJCX0KLQkJCXZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyh2YWx1ZSk7Ci0JCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCQlzZXQucmVtb3ZlKHZhbHVlKTsKLQkJCUFycmF5TGlzdCBjb21wbGV0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlQbHVnaW5Nb2RlbEJhc2VbXSBiYXNlcyA9IFBsdWdpblJlZ2lzdHJ5LmdldEFjdGl2ZU1vZGVscygpOworICAgICAgICAvLyBvbmx5IHNob3cgd2hlbiB0aGVyZSBpcyBubyBidW5kbGUgbmFtZQorICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHsgbmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwoQkFVTUFOLCBudWxsLCBCQVVNQU4sIG9mZnNldCAtIGxlbmd0aCwgbGVuZ3RoKSwKKyAgICAgICAgICAgICAgICBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChBTklTWkNaWUssIG51bGwsIEFOSVNaQ1pZSywgb2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpLAorICAgICAgICAgICAgICAgIG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKExBU09DS0lfQklDWllTS08sIG51bGwsIExBU09DS0lfQklDWllTS08sIG9mZnNldCAtIGxlbmd0aCwgbGVuZ3RoKSwKKyAgICAgICAgICAgICAgICBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChQQVdMT1dTS0ksIG51bGwsIFBBV0xPV1NLSSwgb2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpLAorICAgICAgICAgICAgICAgIG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKE1FTEhFTSwgbnVsbCwgTUVMSEVNLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCkgfTsKKyAgICAgICAgfQogCi0JCQlmb3IgKElQbHVnaW5Nb2RlbEJhc2UgZWxlbWVudCA6IGJhc2VzKSB7IC8vIFJlbW92ZSBhbnkgcGFja2FnZXMKLQkJCQkvLyBhbHJlYWR5IGltcG9ydGVkCi0JCQkJLy8gdGhyb3VnaAotCQkJCS8vIFJlcXVpcmUtQnVuZGxlCi0JCQkJQnVuZGxlRGVzY3JpcHRpb24gZGVzYyA9IGVsZW1lbnQuZ2V0QnVuZGxlRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoZGVzYyA9PSBudWxsIHx8IGltcG9ydGVkQnVuZGxlcy5jb250YWlucyhkZXNjLmdldFN5bWJvbGljTmFtZSgpKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uW10gZXhwUGtncyA9IGRlc2MuZ2V0RXhwb3J0UGFja2FnZXMoKTsKLQkJCQlmb3IgKEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBlbGVtZW50MiA6IGV4cFBrZ3MpIHsKLQkJCQkJU3RyaW5nIHBrZ05hbWUgPSBlbGVtZW50Mi5nZXROYW1lKCk7Ci0JCQkJCWlmIChwa2dOYW1lLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgdmFsdWUsIDAsIGxlbmd0aCkgJiYgIXNldC5jb250YWlucyhwa2dOYW1lKSkgewotCQkJCQkJY29tcGxldGlvbnMuYWRkKG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKHBrZ05hbWUsIGdldEltYWdlKEZfVFlQRV9QS0cpLCBwa2dOYW1lLCBvZmZzZXQKLQkJCQkJCQkJLSBsZW5ndGgsIGxlbmd0aCkpOwotCQkJCQkJc2V0LmFkZChwa2dOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBjb21wbGV0aW9ucy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2NvbXBsZXRpb25zLnNpemUoKV0pOwotCQkJc29ydENvbXBsZXRpb25zKHByb3Bvc2Fscyk7Ci0JCQlyZXR1cm4gcHJvcG9zYWxzOwotCQl9Ci0JCWludCBlcXVhbHMgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJz0nKTsKLQkJaWYgKGVxdWFscyA9PSAtMSB8fCBzZW1pY29sb24gPiBlcXVhbHMpIHsKLQkJCVN0cmluZ1tdIHZhbGlkQXR0cyA9IG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSwgQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFIH07Ci0JCQlJbnRlZ2VyW10gdmFsaWRUeXBlcyA9IG5ldyBJbnRlZ2VyW10geyBuZXcgSW50ZWdlcihGX1RZUEVfRElSRUNUSVZFKSwgbmV3IEludGVnZXIoRl9UWVBFX0FUVFJJQlVURSkgfTsKLQkJCXJldHVybiBoYW5kbGVBdHRyc0FuZERpcmVjdGl2ZXModmFsdWUsIGluaXRpYWxpemVOZXdMaXN0KHZhbGlkQXR0cyksIGluaXRpYWxpemVOZXdMaXN0KHZhbGlkVHlwZXMpLCBvZmZzZXQpOwotCQl9Ci0JCVN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhzZW1pY29sb24gKyAxKSk7Ci0JCWlmIChDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwKLQkJCQlDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUubGVuZ3RoKCkpKSB7Ci0JCQlyZXR1cm4gbWF0Y2hWYWx1ZUNvbXBsZXRpb24oY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSwgbmV3IFN0cmluZ1tdIHsKLQkJCQkJQ29uc3RhbnRzLlJFU09MVVRJT05fTUFOREFUT1JZLCBDb25zdGFudHMuUkVTT0xVVElPTl9PUFRJT05BTCB9LCBuZXcgaW50W10geyBGX1RZUEVfVkFMVUUsCi0JCQkJCUZfVFlQRV9WQUxVRSB9LCBvZmZzZXQsICJSRVNPTFVUSU9OXyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZVZhbHVlLCAwLCBDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUubGVuZ3RoKCkpKSB7Ci0JCQl2YWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSk7Ci0JCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHsgbmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCQkiXCJcIiIsIGdldEltYWdlKEZfVFlQRV9WQUxVRSksICJcIlwiIiwgb2Zmc2V0LCAwKSB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JfQorICAgICAgICAvLyBvbmx5IHNob3cgd2hlbiB3ZSBhcmUgdHJ5aW5nIHRvIGNvbXBsZXRlIGEgbmFtZQorICAgICAgICBmb3IgKFN0cmluZyBlbGVtZW50IDogZk5hbWVzKSB7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjdXJyZW50VmFsdWUsICIgIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgdG9rZW4sIDAsIHRva2VuLmxlbmd0aCgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChlbGVtZW50LCBudWxsLCBlbGVtZW50LCBvZmZzZXQgLSB0b2tlbi5sZW5ndGgoKSwgdG9rZW4ubGVuZ3RoKCkpIH07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZVhGcmllbmRzQ29tcGxldGlvbihTdHJpbmcgdmFsdWUsIGZpbmFsIGludCBvZmZzZXQpIHsKLQkJTWFuaWZlc3RFbGVtZW50W10gZWxlbXMgPSAoTWFuaWZlc3RFbGVtZW50W10pIGZIZWFkZXJzLmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSk7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKGVsZW1zICE9IG51bGwgJiYgZWxlbXMubGVuZ3RoID4gMCkgewotCQkJc2V0LmFkZChlbGVtc1swXS5nZXRWYWx1ZSgpKTsKLQkJfQotCQl2YWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXModmFsdWUpOwotCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW10geyBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJIlwiXCIiLCBnZXRJbWFnZShGX1RZUEVfVkFMVUUpLCAiXCJcIiIsIG9mZnNldCwgMCkgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHZhbHVlLmNoYXJBdCgwKSA9PSAnIicpIHsKLQkJCXZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEpOwotCQl9Ci0JCWludCBpbmRleCA9IHZhbHVlLmxhc3RJbmRleE9mKCcsJyk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlzZXQuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZUJ1bmRsZUNvbXBsZXRpb25zKHZhbHVlLnN1YnN0cmluZygoaW5kZXggPT0gLTEpID8gMCA6IGluZGV4ICsgMSksIHNldCwgRl9UWVBFX1ZBTFVFLCBvZmZzZXQsIHRydWUpOwotCX0KKyAgICBwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZUltcG9ydFBhY2thZ2VDb21wbGV0aW9uKFN0cmluZyBjdXJyZW50VmFsdWUsIGludCBvZmZzZXQpIHsKKyAgICAgICAgaW50IGNvbW1hID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCcsJyk7CisgICAgICAgIGludCBzZW1pY29sb24gPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJzsnKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gY29tbWEgIT0gLTEgPyBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGNvbW1hICsgMSkgOiBjdXJyZW50VmFsdWU7CisgICAgICAgIGlmIChjb21tYSA+IHNlbWljb2xvbiB8fCBjb21tYSA9PSBzZW1pY29sb24pIHsKKyAgICAgICAgICAgIEhhc2hTZXQgc2V0ID0gKEhhc2hTZXQpIHRoaXMuZkhlYWRlcnMuZ2V0KENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSk7CisgICAgICAgICAgICBpZiAoc2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXQgPSBwYXJzZUhlYWRlckZvclZhbHVlcyhjdXJyZW50VmFsdWUsIG9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBIYXNoU2V0IGltcG9ydGVkQnVuZGxlcyA9IChIYXNoU2V0KSB0aGlzLmZIZWFkZXJzLmdldChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUpOworICAgICAgICAgICAgaWYgKGltcG9ydGVkQnVuZGxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW1wb3J0ZWRCdW5kbGVzID0gbmV3IEhhc2hTZXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXModmFsdWUpOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOworICAgICAgICAgICAgc2V0LnJlbW92ZSh2YWx1ZSk7CisgICAgICAgICAgICBBcnJheUxpc3QgY29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBJUGx1Z2luTW9kZWxCYXNlW10gYmFzZXMgPSBQbHVnaW5SZWdpc3RyeS5nZXRBY3RpdmVNb2RlbHMoKTsKIAotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gaGFuZGxlRnJhZ21lbnRIb3N0Q29tcGxldGlvbihTdHJpbmcgY3VycmVudFZhbHVlLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBpbmRleCA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignOycpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCUhhc2hNYXAgY29tcGxldGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJSVBsdWdpbk1vZGVsQmFzZSBiYXNlID0gUGx1Z2luUmVnaXN0cnkuZmluZE1vZGVsKCgoTWFuaWZlc3RFZGl0b3IpIGZTb3VyY2VQYWdlLmdldEVkaXRvcigpKS5nZXRDb21tb25Qcm9qZWN0KCkpOwotCQkJQnVuZGxlRGVzY3JpcHRpb24gZGVzYyA9IGJhc2UuZ2V0QnVuZGxlRGVzY3JpcHRpb24oKTsKLQkJCVN0cmluZyBjdXJyZW50SWQgPSBkZXNjICE9IG51bGwgPyBkZXNjLmdldFN5bWJvbGljTmFtZSgpIDogbnVsbDsKKyAgICAgICAgICAgIGZvciAoSVBsdWdpbk1vZGVsQmFzZSBlbGVtZW50IDogYmFzZXMpIHsgLy8gUmVtb3ZlIGFueSBwYWNrYWdlcworICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaW1wb3J0ZWQKKyAgICAgICAgICAgICAgICAvLyB0aHJvdWdoCisgICAgICAgICAgICAgICAgLy8gUmVxdWlyZS1CdW5kbGUKKyAgICAgICAgICAgICAgICBCdW5kbGVEZXNjcmlwdGlvbiBkZXNjID0gZWxlbWVudC5nZXRCdW5kbGVEZXNjcmlwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChkZXNjID09IG51bGwgfHwgaW1wb3J0ZWRCdW5kbGVzLmNvbnRhaW5zKGRlc2MuZ2V0U3ltYm9saWNOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFeHBvcnRQYWNrYWdlRGVzY3JpcHRpb25bXSBleHBQa2dzID0gZGVzYy5nZXRFeHBvcnRQYWNrYWdlcygpOworICAgICAgICAgICAgICAgIGZvciAoRXhwb3J0UGFja2FnZURlc2NyaXB0aW9uIGVsZW1lbnQyIDogZXhwUGtncykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGtnTmFtZSA9IGVsZW1lbnQyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBrZ05hbWUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCB2YWx1ZSwgMCwgbGVuZ3RoKSAmJiAhc2V0LmNvbnRhaW5zKHBrZ05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9ucy5hZGQobmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwocGtnTmFtZSwgZ2V0SW1hZ2UoRl9UWVBFX1BLRyksIHBrZ05hbWUsIG9mZnNldCAtIGxlbmd0aCwgbGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKHBrZ05hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IChJQ29tcGxldGlvblByb3Bvc2FsW10pIGNvbXBsZXRpb25zLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbY29tcGxldGlvbnMuc2l6ZSgpXSk7CisgICAgICAgICAgICBzb3J0Q29tcGxldGlvbnMocHJvcG9zYWxzKTsKKyAgICAgICAgICAgIHJldHVybiBwcm9wb3NhbHM7CisgICAgICAgIH0KKyAgICAgICAgaW50IGVxdWFscyA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignPScpOworICAgICAgICBpZiAoZXF1YWxzID09IC0xIHx8IHNlbWljb2xvbiA+IGVxdWFscykgeworICAgICAgICAgICAgU3RyaW5nW10gdmFsaWRBdHRzID0gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLCBDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUgfTsKKyAgICAgICAgICAgIEludGVnZXJbXSB2YWxpZFR5cGVzID0gbmV3IEludGVnZXJbXSB7IG5ldyBJbnRlZ2VyKEZfVFlQRV9ESVJFQ1RJVkUpLCBuZXcgSW50ZWdlcihGX1RZUEVfQVRUUklCVVRFKSB9OworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUF0dHJzQW5kRGlyZWN0aXZlcyh2YWx1ZSwgaW5pdGlhbGl6ZU5ld0xpc3QodmFsaWRBdHRzKSwgaW5pdGlhbGl6ZU5ld0xpc3QodmFsaWRUeXBlcyksIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKHNlbWljb2xvbiArIDEpKTsKKyAgICAgICAgaWYgKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZVZhbHVlLCAwLCBDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hWYWx1ZUNvbXBsZXRpb24oY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuUkVTT0xVVElPTl9NQU5EQVRPUlksIENvbnN0YW50cy5SRVNPTFVUSU9OX09QVElPTkFMIH0sIG5ldyBpbnRbXSB7IEZfVFlQRV9WQUxVRSwgRl9UWVBFX1ZBTFVFIH0sIG9mZnNldCwKKyAgICAgICAgICAgICAgICAiUkVTT0xVVElPTl8iKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIGlmIChDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwgQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLmxlbmd0aCgpKSkgeworICAgICAgICAgICAgdmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZXF1YWxzICsgMSkpOworICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKCJcIlwiIiwgZ2V0SW1hZ2UoRl9UWVBFX1ZBTFVFKSwgIlwiXCIiLCBvZmZzZXQsIDApIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKKyAgICB9CiAKLQkJCVN0cmluZyBwbHVnaW5TdGFydCA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlKTsKLQkJCWludCBsZW5ndGggPSBwbHVnaW5TdGFydC5sZW5ndGgoKTsKLQkJCUlQbHVnaW5Nb2RlbEJhc2VbXSBiYXNlcyA9IFBsdWdpblJlZ2lzdHJ5LmdldEFjdGl2ZU1vZGVscygpOwotCQkJZm9yIChJUGx1Z2luTW9kZWxCYXNlIGVsZW1lbnQgOiBiYXNlcykgewotCQkJCWRlc2MgPSBlbGVtZW50LmdldEJ1bmRsZURlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKGRlc2MgIT0gbnVsbCAmJiBkZXNjLmdldEhvc3QoKSA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwbHVnaW5JRCA9IGVsZW1lbnQuZ2V0QnVuZGxlRGVzY3JpcHRpb24oKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCQkJaWYgKCFjb21wbGV0aW9ucy5jb250YWluc0tleShwbHVnaW5JRCkgJiYgcGx1Z2luSUQucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBwbHVnaW5TdGFydCwgMCwgbGVuZ3RoKQotCQkJCQkJCSYmICFwbHVnaW5JRC5lcXVhbHMoY3VycmVudElkKSkgewotCQkJCQkJY29tcGxldGlvbnMucHV0KHBsdWdpbklELCBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChwbHVnaW5JRCwgZ2V0SW1hZ2UoRl9UWVBFX0JVTkRMRSksCi0JCQkJCQkJCXBsdWdpbklELCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIGNvbXBsZXRpb25zLnZhbHVlcygpLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbY29tcGxldGlvbnMuc2l6ZSgpXSk7Ci0JCX0KLQkJaW50IGVxdWFscyA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignPScpOwotCQlpZiAoZXF1YWxzID09IC0xIHx8IGluZGV4ID4gZXF1YWxzKSB7Ci0JCQlyZXR1cm4gbWF0Y2hWYWx1ZUNvbXBsZXRpb24ocmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGluZGV4ICsgMSkpLAotCQkJCQluZXcgU3RyaW5nW10geyBDb25zdGFudHMuQlVORExFX1ZFUlNJT05fQVRUUklCVVRFIH0sIG5ldyBpbnRbXSB7IEZfVFlQRV9BVFRSSUJVVEUgfSwgb2Zmc2V0KTsKLQkJfQotCQlTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoaW5kZXggKyAxKSk7Ci0JCWlmIChDb25zdGFudHMuQlVORExFX1ZFUlNJT05fQVRUUklCVVRFLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgYXR0cmlidXRlVmFsdWUsIDAsCi0JCQkJQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OX0FUVFJJQlVURS5sZW5ndGgoKSkpIHsKLQkJCXJldHVybiBnZXRCdW5kbGVWZXJzaW9uQ29tcGxldGlvbnMoY3VycmVudFZhbHVlLnN1YnN0cmluZygwLCBpbmRleCkudHJpbSgpLAotCQkJCQlyZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZXF1YWxzICsgMSkpLCBvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQl9CisgICAgcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBoYW5kbGVYRnJpZW5kc0NvbXBsZXRpb24oU3RyaW5nIHZhbHVlLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIE1hbmlmZXN0RWxlbWVudFtdIGVsZW1zID0gKE1hbmlmZXN0RWxlbWVudFtdKSB0aGlzLmZIZWFkZXJzLmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSk7CisgICAgICAgIEhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgaWYgKGVsZW1zICE9IG51bGwgJiYgZWxlbXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgc2V0LmFkZChlbGVtc1swXS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXModmFsdWUpOworICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW10geyBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCgiXCJcIiIsIGdldEltYWdlKEZfVFlQRV9WQUxVRSksICJcIlwiIiwgb2Zmc2V0LCAwKSB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUuY2hhckF0KDApID09ICciJykgeworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGluZGV4ID0gdmFsdWUubGFzdEluZGV4T2YoJywnKTsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIsIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIHNldC5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFuZGxlQnVuZGxlQ29tcGxldGlvbnModmFsdWUuc3Vic3RyaW5nKGluZGV4ID09IC0xID8gMCA6IGluZGV4ICsgMSksIHNldCwgRl9UWVBFX1ZBTFVFLCBvZmZzZXQsIHRydWUpOworICAgIH0KIAotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gaGFuZGxlUmVxdWlyZUJ1bmRsZUNvbXBsZXRpb24oU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IG9mZnNldCkgewotCQlpbnQgY29tbWEgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJywnKTsKLQkJaW50IHNlbWljb2xvbiA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignOycpOwotCQlTdHJpbmcgdmFsdWUgPSBjb21tYSAhPSAtMSA/IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY29tbWEgKyAxKSA6IGN1cnJlbnRWYWx1ZTsKLQkJaWYgKGNvbW1hID4gc2VtaWNvbG9uIHx8IGNvbW1hID09IHNlbWljb2xvbikgewotCQkJSGFzaFNldCBzZXQgPSAoSGFzaFNldCkgZkhlYWRlcnMuZ2V0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSk7Ci0JCQlpZiAoc2V0ID09IG51bGwpIHsKLQkJCQlzZXQgPSBwYXJzZUhlYWRlckZvclZhbHVlcyhjdXJyZW50VmFsdWUsIG9mZnNldCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaGFuZGxlQnVuZGxlQ29tcGxldGlvbnModmFsdWUsIHNldCwgRl9UWVBFX0JVTkRMRSwgb2Zmc2V0LCBmYWxzZSk7Ci0JCX0KLQkJaW50IGVxdWFscyA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignPScpOwotCQlpZiAoZXF1YWxzID09IC0xIHx8IHNlbWljb2xvbiA+IGVxdWFscykgewotCQkJU3RyaW5nW10gdmFsaWRBdHRycyA9IG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTl9BVFRSSUJVVEUsIENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSwKLQkJCQkJQ29uc3RhbnRzLlZJU0lCSUxJVFlfRElSRUNUSVZFIH07Ci0JCQlJbnRlZ2VyW10gdmFsaWRUeXBlcyA9IG5ldyBJbnRlZ2VyW10geyBuZXcgSW50ZWdlcihGX1RZUEVfQVRUUklCVVRFKSwgbmV3IEludGVnZXIoRl9UWVBFX0RJUkVDVElWRSksCi0JCQkJCW5ldyBJbnRlZ2VyKEZfVFlQRV9ESVJFQ1RJVkUpIH07Ci0JCQlyZXR1cm4gaGFuZGxlQXR0cnNBbmREaXJlY3RpdmVzKHZhbHVlLCBpbml0aWFsaXplTmV3TGlzdCh2YWxpZEF0dHJzKSwgaW5pdGlhbGl6ZU5ld0xpc3QodmFsaWRUeXBlcyksIG9mZnNldCk7Ci0JCX0KLQkJU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKHNlbWljb2xvbiArIDEpKTsKLQkJaWYgKENvbnN0YW50cy5WSVNJQklMSVRZX0RJUkVDVElWRS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZVZhbHVlLCAwLAotCQkJCUNvbnN0YW50cy5WSVNJQklMSVRZX0RJUkVDVElWRS5sZW5ndGgoKSkpIHsKLQkJCXJldHVybiBtYXRjaFZhbHVlQ29tcGxldGlvbihjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGVxdWFscyArIDEpLCBuZXcgU3RyaW5nW10gewotCQkJCQlDb25zdGFudHMuVklTSUJJTElUWV9QUklWQVRFLCBDb25zdGFudHMuVklTSUJJTElUWV9SRUVYUE9SVCB9LCBuZXcgaW50W10geyBGX1RZUEVfVkFMVUUsCi0JCQkJCUZfVFlQRV9WQUxVRSB9LCBvZmZzZXQsICJWSVNJQklMSVRZXyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZVZhbHVlLCAwLAotCQkJCUNvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRS5sZW5ndGgoKSkpIHsKLQkJCXJldHVybiBtYXRjaFZhbHVlQ29tcGxldGlvbihjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGVxdWFscyArIDEpLCBuZXcgU3RyaW5nW10gewotCQkJCQlDb25zdGFudHMuUkVTT0xVVElPTl9NQU5EQVRPUlksIENvbnN0YW50cy5SRVNPTFVUSU9OX09QVElPTkFMIH0sIG5ldyBpbnRbXSB7IEZfVFlQRV9WQUxVRSwKLQkJCQkJRl9UWVBFX1ZBTFVFIH0sIG9mZnNldCwgIlJFU09MVVRJT05fIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OX0FUVFJJQlVURS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZVZhbHVlLCAwLAotCQkJCUNvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRS5sZW5ndGgoKSkpIHsKLQkJCVN0cmluZyBwbHVnaW5JZCA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZygoY29tbWEgPT0gLTEpID8gMCA6IGNvbW1hICsgMSwgc2VtaWNvbG9uKSk7Ci0JCQlyZXR1cm4gZ2V0QnVuZGxlVmVyc2lvbkNvbXBsZXRpb25zKHBsdWdpbklkLCByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZXF1YWxzICsgMSkpLAotCQkJCQlvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQl9CisgICAgcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBoYW5kbGVGcmFnbWVudEhvc3RDb21wbGV0aW9uKFN0cmluZyBjdXJyZW50VmFsdWUsIGludCBvZmZzZXQpIHsKKyAgICAgICAgaW50IGluZGV4ID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCc7Jyk7CisgICAgICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICAgICAgSGFzaE1hcCBjb21wbGV0aW9ucyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICBJUGx1Z2luTW9kZWxCYXNlIGJhc2UgPSBQbHVnaW5SZWdpc3RyeS5maW5kTW9kZWwoKChNYW5pZmVzdEVkaXRvcikgdGhpcy5mU291cmNlUGFnZS5nZXRFZGl0b3IoKSkuZ2V0Q29tbW9uUHJvamVjdCgpKTsKKyAgICAgICAgICAgIEJ1bmRsZURlc2NyaXB0aW9uIGRlc2MgPSBiYXNlLmdldEJ1bmRsZURlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICBTdHJpbmcgY3VycmVudElkID0gZGVzYyAhPSBudWxsID8gZGVzYy5nZXRTeW1ib2xpY05hbWUoKSA6IG51bGw7CiAKLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldEJ1bmRsZVZlcnNpb25Db21wbGV0aW9ucyhTdHJpbmcgcGx1Z2luSUQsIFN0cmluZyBleGlzdGluZ1ZhbHVlLCBpbnQgb2Zmc2V0KSB7Ci0JCU1vZGVsRW50cnkgZW50cnkgPSBQbHVnaW5SZWdpc3RyeS5maW5kRW50cnkocGx1Z2luSUQpOwotCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJSVBsdWdpbk1vZGVsQmFzZVtdIGhvc3RzID0gZW50cnkuZ2V0QWN0aXZlTW9kZWxzKCk7Ci0JCQlBcnJheUxpc3QgcHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdChob3N0cy5sZW5ndGgpOwotCQkJZm9yIChJUGx1Z2luTW9kZWxCYXNlIGVsZW1lbnQgOiBob3N0cykgewotCQkJCVN0cmluZyBwcm9wb3NhbFZhbHVlID0gZ2V0VmVyc2lvblByb3Bvc2FsKGVsZW1lbnQpOwotCQkJCWlmIChwcm9wb3NhbFZhbHVlLnJlZ2lvbk1hdGNoZXMoMCwgZXhpc3RpbmdWYWx1ZSwgMCwgZXhpc3RpbmdWYWx1ZS5sZW5ndGgoKSkpIHsKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbFZhbHVlLnN1YnN0cmluZyhleGlzdGluZ1ZhbHVlLmxlbmd0aCgpKSwKLQkJCQkJCQlnZXRJbWFnZShGX1RZUEVfVkFMVUUpLCBwcm9wb3NhbFZhbHVlLCBvZmZzZXQsIDApKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pOwotCQl9IGVsc2UgaWYgKGV4aXN0aW5nVmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW10geyBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJIlwiXCIiLCBnZXRJbWFnZShGX1RZUEVfVkFMVUUpLCAiXCJcIiIsIG9mZnNldCwgMCkgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCX0KKyAgICAgICAgICAgIFN0cmluZyBwbHVnaW5TdGFydCA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBwbHVnaW5TdGFydC5sZW5ndGgoKTsKKyAgICAgICAgICAgIElQbHVnaW5Nb2RlbEJhc2VbXSBiYXNlcyA9IFBsdWdpblJlZ2lzdHJ5LmdldEFjdGl2ZU1vZGVscygpOworICAgICAgICAgICAgZm9yIChJUGx1Z2luTW9kZWxCYXNlIGVsZW1lbnQgOiBiYXNlcykgeworICAgICAgICAgICAgICAgIGRlc2MgPSBlbGVtZW50LmdldEJ1bmRsZURlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCAmJiBkZXNjLmdldEhvc3QoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwbHVnaW5JRCA9IGVsZW1lbnQuZ2V0QnVuZGxlRGVzY3JpcHRpb24oKS5nZXRTeW1ib2xpY05hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wbGV0aW9ucy5jb250YWluc0tleShwbHVnaW5JRCkgJiYgcGx1Z2luSUQucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBwbHVnaW5TdGFydCwgMCwgbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXBsdWdpbklELmVxdWFscyhjdXJyZW50SWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9ucy5wdXQocGx1Z2luSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwocGx1Z2luSUQsIGdldEltYWdlKEZfVFlQRV9CVU5ETEUpLCBwbHVnaW5JRCwgb2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBjb21wbGV0aW9ucy52YWx1ZXMoKS50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2NvbXBsZXRpb25zLnNpemUoKV0pOworICAgICAgICB9CisgICAgICAgIGludCBlcXVhbHMgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJz0nKTsKKyAgICAgICAgaWYgKGVxdWFscyA9PSAtMSB8fCBpbmRleCA+IGVxdWFscykgeworICAgICAgICAgICAgcmV0dXJuIG1hdGNoVmFsdWVDb21wbGV0aW9uKHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhpbmRleCArIDEpKSwgbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OX0FUVFJJQlVURSB9LAorICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7IEZfVFlQRV9BVFRSSUJVVEUgfSwgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoaW5kZXggKyAxKSk7CisgICAgICAgIGlmIChDb25zdGFudHMuQlVORExFX1ZFUlNJT05fQVRUUklCVVRFLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgYXR0cmlidXRlVmFsdWUsIDAsIENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTl9BVFRSSUJVVEUubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0QnVuZGxlVmVyc2lvbkNvbXBsZXRpb25zKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoMCwgaW5kZXgpLnRyaW0oKSwgcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGVxdWFscyArIDEpKSwKKyAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZlcnNpb25Qcm9wb3NhbChJUGx1Z2luTW9kZWxCYXNlIGJhc2UpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJQnVuZGxlRGVzY3JpcHRpb24gZGVzYyA9IGJhc2UuZ2V0QnVuZGxlRGVzY3JpcHRpb24oKTsKLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJVmVyc2lvbiB2ZXJzaW9uID0gZGVzYy5nZXRWZXJzaW9uKCk7Ci0JCQlidWZmZXIuYXBwZW5kKHZlcnNpb24uZ2V0TWFqb3IoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCcuJyk7Ci0JCQlidWZmZXIuYXBwZW5kKHZlcnNpb24uZ2V0TWlub3IoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCcuJyk7Ci0JCQlidWZmZXIuYXBwZW5kKHZlcnNpb24uZ2V0TWljcm8oKSk7Ci0JCX0gZWxzZSB7Ci0JCQljaGFyW10gY2hhcnMgPSBiYXNlLmdldFBsdWdpbkJhc2UoKS5nZXRWZXJzaW9uKCkudG9DaGFyQXJyYXkoKTsKLQkJCWludCBwZXJpb2RDb3VudCA9IDA7Ci0JCQlmb3IgKGNoYXIgZWxlbWVudCA6IGNoYXJzKSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gJy4nKSB7Ci0JCQkJCWlmIChwZXJpb2RDb3VudCA9PSAyKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQkrK3BlcmlvZENvdW50OwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXIuYXBwZW5kKCdcIicpLnRvU3RyaW5nKCk7Ci0JfQorICAgIHByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gaGFuZGxlUmVxdWlyZUJ1bmRsZUNvbXBsZXRpb24oU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IG9mZnNldCkgeworICAgICAgICBpbnQgY29tbWEgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJywnKTsKKyAgICAgICAgaW50IHNlbWljb2xvbiA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignOycpOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBjb21tYSAhPSAtMSA/IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY29tbWEgKyAxKSA6IGN1cnJlbnRWYWx1ZTsKKyAgICAgICAgaWYgKGNvbW1hID4gc2VtaWNvbG9uIHx8IGNvbW1hID09IHNlbWljb2xvbikgeworICAgICAgICAgICAgSGFzaFNldCBzZXQgPSAoSGFzaFNldCkgdGhpcy5mSGVhZGVycy5nZXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFKTsKKyAgICAgICAgICAgIGlmIChzZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldCA9IHBhcnNlSGVhZGVyRm9yVmFsdWVzKGN1cnJlbnRWYWx1ZSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVCdW5kbGVDb21wbGV0aW9ucyh2YWx1ZSwgc2V0LCBGX1RZUEVfQlVORExFLCBvZmZzZXQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgZXF1YWxzID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCc9Jyk7CisgICAgICAgIGlmIChlcXVhbHMgPT0gLTEgfHwgc2VtaWNvbG9uID4gZXF1YWxzKSB7CisgICAgICAgICAgICBTdHJpbmdbXSB2YWxpZEF0dHJzID0gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OX0FUVFJJQlVURSwgQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLCBDb25zdGFudHMuVklTSUJJTElUWV9ESVJFQ1RJVkUgfTsKKyAgICAgICAgICAgIEludGVnZXJbXSB2YWxpZFR5cGVzID0gbmV3IEludGVnZXJbXSB7IG5ldyBJbnRlZ2VyKEZfVFlQRV9BVFRSSUJVVEUpLCBuZXcgSW50ZWdlcihGX1RZUEVfRElSRUNUSVZFKSwgbmV3IEludGVnZXIoRl9UWVBFX0RJUkVDVElWRSkgfTsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVBdHRyc0FuZERpcmVjdGl2ZXModmFsdWUsIGluaXRpYWxpemVOZXdMaXN0KHZhbGlkQXR0cnMpLCBpbml0aWFsaXplTmV3TGlzdCh2YWxpZFR5cGVzKSwgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoc2VtaWNvbG9uICsgMSkpOworICAgICAgICBpZiAoQ29uc3RhbnRzLlZJU0lCSUxJVFlfRElSRUNUSVZFLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgYXR0cmlidXRlVmFsdWUsIDAsIENvbnN0YW50cy5WSVNJQklMSVRZX0RJUkVDVElWRS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaFZhbHVlQ29tcGxldGlvbihjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGVxdWFscyArIDEpLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5WSVNJQklMSVRZX1BSSVZBVEUsIENvbnN0YW50cy5WSVNJQklMSVRZX1JFRVhQT1JUIH0sIG5ldyBpbnRbXSB7IEZfVFlQRV9WQUxVRSwgRl9UWVBFX1ZBTFVFIH0sIG9mZnNldCwKKyAgICAgICAgICAgICAgICAiVklTSUJJTElUWV8iKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIGlmIChDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwgQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLmxlbmd0aCgpKSkgeworICAgICAgICAgICAgcmV0dXJuIG1hdGNoVmFsdWVDb21wbGV0aW9uKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZXF1YWxzICsgMSksCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLlJFU09MVVRJT05fTUFOREFUT1JZLCBDb25zdGFudHMuUkVTT0xVVElPTl9PUFRJT05BTCB9LCBuZXcgaW50W10geyBGX1RZUEVfVkFMVUUsIEZfVFlQRV9WQUxVRSB9LCBvZmZzZXQsCisgICAgICAgICAgICAgICAgIlJFU09MVVRJT05fIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQorICAgICAgICBpZiAoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OX0FUVFJJQlVURS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZVZhbHVlLCAwLCBDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGx1Z2luSWQgPSByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY29tbWEgPT0gLTEgPyAwIDogY29tbWEgKyAxLCBzZW1pY29sb24pKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRCdW5kbGVWZXJzaW9uQ29tcGxldGlvbnMocGx1Z2luSWQsIHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSksIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOworICAgIH0KIAotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gaGFuZGxlQnVuZGxlQ29tcGxldGlvbnMoU3RyaW5nIHZhbHVlLCBDb2xsZWN0aW9uIGRvTm90SW5jbHVkZSwgaW50IHR5cGUsCi0JCQlpbnQgb2Zmc2V0LCBib29sZWFuIGluY2x1ZGVGcmFnbWVudHMpIHsKLQkJdmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKHZhbHVlKTsKLQkJaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotCQlkb05vdEluY2x1ZGUucmVtb3ZlKHZhbHVlKTsKLQkJQXJyYXlMaXN0IGNvbXBsZXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUGx1Z2luTW9kZWxCYXNlW10gYmFzZXMgPSBQbHVnaW5SZWdpc3RyeS5nZXRBY3RpdmVNb2RlbHMoKTsKLQkJZm9yIChJUGx1Z2luTW9kZWxCYXNlIGVsZW1lbnQgOiBiYXNlcykgewotCQkJQnVuZGxlRGVzY3JpcHRpb24gZGVzYyA9IGVsZW1lbnQuZ2V0QnVuZGxlRGVzY3JpcHRpb24oKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQlpZiAoIWluY2x1ZGVGcmFnbWVudHMgJiYgZGVzYy5nZXRIb3N0KCkgIT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJU3RyaW5nIGJ1bmRsZUlkID0gZGVzYy5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCQlpZiAoYnVuZGxlSWQucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCB2YWx1ZSwgMCwgdmFsdWUubGVuZ3RoKCkpICYmICFkb05vdEluY2x1ZGUuY29udGFpbnMoYnVuZGxlSWQpKSB7Ci0JCQkJCWNvbXBsZXRpb25zLmFkZChuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChidW5kbGVJZCwgZ2V0SW1hZ2UodHlwZSksIGJ1bmRsZUlkLCBvZmZzZXQKLQkJCQkJCQktIGxlbmd0aCwgbGVuZ3RoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBjb21wbGV0aW9ucy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2NvbXBsZXRpb25zLnNpemUoKV0pOwotCX0KKyAgICBwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldEJ1bmRsZVZlcnNpb25Db21wbGV0aW9ucyhTdHJpbmcgcGx1Z2luSUQsIFN0cmluZyBleGlzdGluZ1ZhbHVlLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIE1vZGVsRW50cnkgZW50cnkgPSBQbHVnaW5SZWdpc3RyeS5maW5kRW50cnkocGx1Z2luSUQpOworICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgSVBsdWdpbk1vZGVsQmFzZVtdIGhvc3RzID0gZW50cnkuZ2V0QWN0aXZlTW9kZWxzKCk7CisgICAgICAgICAgICBBcnJheUxpc3QgcHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdChob3N0cy5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChJUGx1Z2luTW9kZWxCYXNlIGVsZW1lbnQgOiBob3N0cykgeworICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wb3NhbFZhbHVlID0gZ2V0VmVyc2lvblByb3Bvc2FsKGVsZW1lbnQpOworICAgICAgICAgICAgICAgIGlmIChwcm9wb3NhbFZhbHVlLnJlZ2lvbk1hdGNoZXMoMCwgZXhpc3RpbmdWYWx1ZSwgMCwgZXhpc3RpbmdWYWx1ZS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWxzLmFkZChuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbFZhbHVlLnN1YnN0cmluZyhleGlzdGluZ1ZhbHVlLmxlbmd0aCgpKSwgZ2V0SW1hZ2UoRl9UWVBFX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3Bvc2FsVmFsdWUsIG9mZnNldCwgMCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7CisgICAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmdWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKCJcIlwiIiwgZ2V0SW1hZ2UoRl9UWVBFX1ZBTFVFKSwgIlwiXCIiLCBvZmZzZXQsIDApIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZUV4cG9ydFBhY2thZ2VDb21wbGV0aW9uKFN0cmluZyBjdXJyZW50VmFsdWUsIGludCBvZmZzZXQpIHsKLQkJaW50IGNvbW1hID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCcsJyk7Ci0JCWludCBzZW1pY29sb24gPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJzsnKTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghaW5zaWRlUXVvdGVzKGN1cnJlbnRWYWx1ZSkgJiYgY29tbWEgPiBzZW1pY29sb24gfHwgY29tbWEgPT0gc2VtaWNvbG9uKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBjb21tYSAhPSAtMSA/IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY29tbWEgKyAxKSA6IGN1cnJlbnRWYWx1ZTsKLQkJCUhhc2hTZXQgc2V0ID0gKEhhc2hTZXQpIGZIZWFkZXJzLmdldChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UpOwotCQkJaWYgKHNldCA9PSBudWxsKSB7Ci0JCQkJc2V0ID0gcGFyc2VIZWFkZXJGb3JWYWx1ZXMoY3VycmVudFZhbHVlLCBvZmZzZXQpOwotCQkJfQotCQkJdmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKHZhbHVlKTsKLQkJCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJCUlQcm9qZWN0IHByb2ogPSAoKFBERUZvcm1FZGl0b3IpIGZTb3VyY2VQYWdlLmdldEVkaXRvcigpKS5nZXRDb21tb25Qcm9qZWN0KCk7Ci0JCQlpZiAocHJvaiAhPSBudWxsKSB7Ci0JCQkJSUphdmFQcm9qZWN0IGpwID0gSmF2YUNvcmUuY3JlYXRlKHByb2opOwotCQkJCUlQYWNrYWdlRnJhZ21lbnRbXSBmcmFncyA9IFBERUphdmFIZWxwZXIuZ2V0UGFja2FnZUZyYWdtZW50cyhqcCwgc2V0LCBmYWxzZSk7Ci0JCQkJZm9yIChJUGFja2FnZUZyYWdtZW50IGVsZW1lbnQgOiBmcmFncykgewotCQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQkJaWYgKG5hbWUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCB2YWx1ZSwgMCwgbGVuZ3RoKSkgewotCQkJCQkJbGlzdC5hZGQobmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwobmFtZSwgZ2V0SW1hZ2UoRl9UWVBFX1BLRyksIG5hbWUsIG9mZnNldCAtIGxlbmd0aCwKLQkJCQkJCQkJbGVuZ3RoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBjdXJyZW50VmFsdWU7Ci0JCQlpZiAoY29tbWEgPiAwKSB7Ci0JCQkJZG8gewotCQkJCQlTdHJpbmcgcHJlZml4ID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygwLCBjb21tYSk7Ci0JCQkJCWlmICghaW5zaWRlUXVvdGVzKHByZWZpeCkpIHsKLQkJCQkJCXZhbHVlID0gY3VycmVudFZhbHVlLnN1YnN0cmluZyhjb21tYSArIDEpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY29tbWEgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJywnLCBjb21tYSAtIDEpOwotCQkJCX0gd2hpbGUgKGNvbW1hID4gMCk7Ci0JCQl9Ci0JCQlpbnQgZXF1YWxzID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCc9Jyk7Ci0JCQlpZiAoZXF1YWxzID09IC0xIHx8IHNlbWljb2xvbiA+IGVxdWFscykgewotCQkJCVN0cmluZ1tdIHZhbGlkQXR0cnMgPSBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUsIElDb3JlQ29uc3RhbnRzLklOVEVSTkFMX0RJUkVDVElWRSwKLQkJCQkJCUlDb3JlQ29uc3RhbnRzLkZSSUVORFNfRElSRUNUSVZFIH07Ci0JCQkJSW50ZWdlcltdIHZhbGlkVHlwZXMgPSBuZXcgSW50ZWdlcltdIHsgbmV3IEludGVnZXIoRl9UWVBFX0FUVFJJQlVURSksIG5ldyBJbnRlZ2VyKEZfVFlQRV9ESVJFQ1RJVkUpLAotCQkJCQkJbmV3IEludGVnZXIoRl9UWVBFX0RJUkVDVElWRSkgfTsKLQkJCQlyZXR1cm4gaGFuZGxlQXR0cnNBbmREaXJlY3RpdmVzKHZhbHVlLCBpbml0aWFsaXplTmV3TGlzdCh2YWxpZEF0dHJzKSwgaW5pdGlhbGl6ZU5ld0xpc3QodmFsaWRUeXBlcyksCi0JCQkJCQlvZmZzZXQpOwotCQkJfQotCQkJU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKHNlbWljb2xvbiArIDEpKTsKLQkJCWlmIChJQ29yZUNvbnN0YW50cy5GUklFTkRTX0RJUkVDVElWRS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZVZhbHVlLCAwLAotCQkJCQlJQ29yZUNvbnN0YW50cy5GUklFTkRTX0RJUkVDVElWRS5sZW5ndGgoKSkpIHsKLQkJCQlyZXR1cm4gaGFuZGxlWEZyaWVuZHNDb21wbGV0aW9uKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZXF1YWxzICsgMSksIG9mZnNldCk7Ci0JCQl9Ci0JCQlpZiAoSUNvcmVDb25zdGFudHMuSU5URVJOQUxfRElSRUNUSVZFLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgYXR0cmlidXRlVmFsdWUsIDAsCi0JCQkJCUlDb3JlQ29uc3RhbnRzLklOVEVSTkFMX0RJUkVDVElWRS5sZW5ndGgoKSkpIHsKLQkJCQlyZXR1cm4gaGFuZGxlVHJ1ZUZhbHNlVmFsdWUoY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSwgb2Zmc2V0KTsKLQkJCX0KLQkJCWlmIChDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwKLQkJCQkJQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLmxlbmd0aCgpKSkgewotCQkJCXZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGVxdWFscyArIDEpKTsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkJCSJcIlwiIiwgZ2V0SW1hZ2UoRl9UWVBFX1ZBTFVFKSwgIlwiXCIiLCBvZmZzZXQsIDApIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgbGlzdC50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2xpc3Quc2l6ZSgpXSk7Ci0JfQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmVyc2lvblByb3Bvc2FsKElQbHVnaW5Nb2RlbEJhc2UgYmFzZSkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiXCIiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBCdW5kbGVEZXNjcmlwdGlvbiBkZXNjID0gYmFzZS5nZXRCdW5kbGVEZXNjcmlwdGlvbigpOworICAgICAgICBpZiAoZGVzYyAhPSBudWxsKSB7CisgICAgICAgICAgICBWZXJzaW9uIHZlcnNpb24gPSBkZXNjLmdldFZlcnNpb24oKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodmVyc2lvbi5nZXRNYWpvcigpKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJy4nKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodmVyc2lvbi5nZXRNaW5vcigpKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJy4nKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodmVyc2lvbi5nZXRNaWNybygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXJbXSBjaGFycyA9IGJhc2UuZ2V0UGx1Z2luQmFzZSgpLmdldFZlcnNpb24oKS50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgaW50IHBlcmlvZENvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoY2hhciBlbGVtZW50IDogY2hhcnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBlcmlvZENvdW50ID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrcGVyaW9kQ291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZWxlbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5hcHBlbmQoJ1wiJykudG9TdHJpbmcoKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZUJ1bmRsZUFjdGl2YXRvckNvbXBsZXRpb24oZmluYWwgU3RyaW5nIGN1cnJlbnRWYWx1ZSwgZmluYWwgaW50IG9mZnNldCkgewotCQlBcnJheUxpc3QgY29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoKFBERUZvcm1FZGl0b3IpIGZTb3VyY2VQYWdlLmdldEVkaXRvcigpKS5nZXRDb21tb25Qcm9qZWN0KCk7Ci0JCWludCBzdGFydE9mZnNldCA9IG9mZnNldCAtIGN1cnJlbnRWYWx1ZS5sZW5ndGgoKTsKLQkJZ2VuZXJhdGVUeXBlUGFja2FnZVByb3Bvc2FscyhjdXJyZW50VmFsdWUsIHByb2plY3QsIGNvbXBsZXRpb25zLCBzdGFydE9mZnNldCwgSUphdmFTZWFyY2hDb25zdGFudHMuQ0xBU1MpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgY29tcGxldGlvbnMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtjb21wbGV0aW9ucy5zaXplKCldKTsKLQkJc29ydENvbXBsZXRpb25zKHByb3Bvc2Fscyk7Ci0JCXJldHVybiBwcm9wb3NhbHM7Ci0JfQorICAgIHByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gaGFuZGxlQnVuZGxlQ29tcGxldGlvbnMoU3RyaW5nIHZhbHVlLCBDb2xsZWN0aW9uIGRvTm90SW5jbHVkZSwgaW50IHR5cGUsIGludCBvZmZzZXQsIGJvb2xlYW4gaW5jbHVkZUZyYWdtZW50cykgeworICAgICAgICB2YWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXModmFsdWUpOworICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7CisgICAgICAgIGRvTm90SW5jbHVkZS5yZW1vdmUodmFsdWUpOworICAgICAgICBBcnJheUxpc3QgY29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIElQbHVnaW5Nb2RlbEJhc2VbXSBiYXNlcyA9IFBsdWdpblJlZ2lzdHJ5LmdldEFjdGl2ZU1vZGVscygpOworICAgICAgICBmb3IgKElQbHVnaW5Nb2RlbEJhc2UgZWxlbWVudCA6IGJhc2VzKSB7CisgICAgICAgICAgICBCdW5kbGVEZXNjcmlwdGlvbiBkZXNjID0gZWxlbWVudC5nZXRCdW5kbGVEZXNjcmlwdGlvbigpOworICAgICAgICAgICAgaWYgKGRlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICghaW5jbHVkZUZyYWdtZW50cyAmJiBkZXNjLmdldEhvc3QoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgYnVuZGxlSWQgPSBkZXNjLmdldFN5bWJvbGljTmFtZSgpOworICAgICAgICAgICAgICAgIGlmIChidW5kbGVJZC5yZWdpb25NYXRjaGVzKHRydWUsIDAsIHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgoKSkgJiYgIWRvTm90SW5jbHVkZS5jb250YWlucyhidW5kbGVJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbnMuYWRkKG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKGJ1bmRsZUlkLCBnZXRJbWFnZSh0eXBlKSwgYnVuZGxlSWQsIG9mZnNldCAtIGxlbmd0aCwgbGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBjb21wbGV0aW9ucy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2NvbXBsZXRpb25zLnNpemUoKV0pOworICAgIH0KIAotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gaGFuZGxlQnVuZGxlU3ltYm9saWNOYW1lQ29tcGxldGlvbihTdHJpbmcgY3VycmVudFZhbHVlLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBzZW1pY29sb24gPSBjdXJyZW50VmFsdWUuaW5kZXhPZignOycpOwotCQlpZiAoc2VtaWNvbG9uICE9IC0xKSB7Ci0JCQlpbnQgZXF1YWxzID0gY3VycmVudFZhbHVlLmluZGV4T2YoJz0nKTsKLQkJCWlmIChlcXVhbHMgPT0gLTEpIHsKLQkJCQlTdHJpbmcgYXR0cmlidXRlID0gY3VycmVudFZhbHVlLnN1YnN0cmluZyhzZW1pY29sb24gKyAxKTsKLQkJCQlhdHRyaWJ1dGUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKGF0dHJpYnV0ZSk7Ci0JCQkJT2JqZWN0IG8gPSBmSGVhZGVycy5nZXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04pOwotCQkJCWludCB0eXBlID0gKG8gPT0gbnVsbCB8fCBvLnRvU3RyaW5nKCkuZXF1YWxzKCIxIikpID8gRl9UWVBFX0FUVFJJQlVURSA6IEZfVFlQRV9ESVJFQ1RJVkU7Ly8kTk9OLU5MUy0xJAotCQkJCWlmIChDb25zdGFudHMuU0lOR0xFVE9OX0RJUkVDVElWRS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZSwgMCwgYXR0cmlidXRlLmxlbmd0aCgpKSkgewotCQkJCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlLmxlbmd0aCgpOwotCQkJCQlCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCQkJQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUgKyAiOj0iLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJZ2V0SW1hZ2UodHlwZSksIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCk7Ci0JCQkJCXByb3Bvc2FsLnNldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oZ2V0SmF2YURvYygiU0lOR0xFVE9OX0RJUkVDVElWRSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7IHByb3Bvc2FsIH07Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlcXVhbHMgPiBzZW1pY29sb24pIHsKLQkJCQlyZXR1cm4gaGFuZGxlVHJ1ZUZhbHNlVmFsdWUoY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSwgb2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JfQorICAgIHByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gaGFuZGxlRXhwb3J0UGFja2FnZUNvbXBsZXRpb24oU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IG9mZnNldCkgeworICAgICAgICBpbnQgY29tbWEgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJywnKTsKKyAgICAgICAgaW50IHNlbWljb2xvbiA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignOycpOworICAgICAgICBBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgaWYgKCFpbnNpZGVRdW90ZXMoY3VycmVudFZhbHVlKSAmJiBjb21tYSA+IHNlbWljb2xvbiB8fCBjb21tYSA9PSBzZW1pY29sb24pIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbW1hICE9IC0xID8gY3VycmVudFZhbHVlLnN1YnN0cmluZyhjb21tYSArIDEpIDogY3VycmVudFZhbHVlOworICAgICAgICAgICAgSGFzaFNldCBzZXQgPSAoSGFzaFNldCkgdGhpcy5mSGVhZGVycy5nZXQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFKTsKKyAgICAgICAgICAgIGlmIChzZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldCA9IHBhcnNlSGVhZGVyRm9yVmFsdWVzKGN1cnJlbnRWYWx1ZSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyh2YWx1ZSk7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7CisgICAgICAgICAgICBJUHJvamVjdCBwcm9qID0gKChQREVGb3JtRWRpdG9yKSB0aGlzLmZTb3VyY2VQYWdlLmdldEVkaXRvcigpKS5nZXRDb21tb25Qcm9qZWN0KCk7CisgICAgICAgICAgICBpZiAocHJvaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSUphdmFQcm9qZWN0IGpwID0gSmF2YUNvcmUuY3JlYXRlKHByb2opOworICAgICAgICAgICAgICAgIElQYWNrYWdlRnJhZ21lbnRbXSBmcmFncyA9IFBERUphdmFIZWxwZXIuZ2V0UGFja2FnZUZyYWdtZW50cyhqcCwgc2V0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgZm9yIChJUGFja2FnZUZyYWdtZW50IGVsZW1lbnQgOiBmcmFncykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCB2YWx1ZSwgMCwgbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQobmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwobmFtZSwgZ2V0SW1hZ2UoRl9UWVBFX1BLRyksIG5hbWUsIG9mZnNldCAtIGxlbmd0aCwgbGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjdXJyZW50VmFsdWU7CisgICAgICAgICAgICBpZiAoY29tbWEgPiAwKSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygwLCBjb21tYSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaW5zaWRlUXVvdGVzKHByZWZpeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY3VycmVudFZhbHVlLnN1YnN0cmluZyhjb21tYSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29tbWEgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJywnLCBjb21tYSAtIDEpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvbW1hID4gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgZXF1YWxzID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCc9Jyk7CisgICAgICAgICAgICBpZiAoZXF1YWxzID09IC0xIHx8IHNlbWljb2xvbiA+IGVxdWFscykgeworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhbGlkQXR0cnMgPSBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUsIElDb3JlQ29uc3RhbnRzLklOVEVSTkFMX0RJUkVDVElWRSwKKyAgICAgICAgICAgICAgICAgICAgSUNvcmVDb25zdGFudHMuRlJJRU5EU19ESVJFQ1RJVkUgfTsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyW10gdmFsaWRUeXBlcyA9IG5ldyBJbnRlZ2VyW10geyBuZXcgSW50ZWdlcihGX1RZUEVfQVRUUklCVVRFKSwgbmV3IEludGVnZXIoRl9UWVBFX0RJUkVDVElWRSksIG5ldyBJbnRlZ2VyKEZfVFlQRV9ESVJFQ1RJVkUpIH07CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUF0dHJzQW5kRGlyZWN0aXZlcyh2YWx1ZSwgaW5pdGlhbGl6ZU5ld0xpc3QodmFsaWRBdHRycyksIGluaXRpYWxpemVOZXdMaXN0KHZhbGlkVHlwZXMpLCBvZmZzZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKHNlbWljb2xvbiArIDEpKTsKKyAgICAgICAgICAgIGlmIChJQ29yZUNvbnN0YW50cy5GUklFTkRTX0RJUkVDVElWRS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZVZhbHVlLCAwLCBJQ29yZUNvbnN0YW50cy5GUklFTkRTX0RJUkVDVElWRS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlWEZyaWVuZHNDb21wbGV0aW9uKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZXF1YWxzICsgMSksIG9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoSUNvcmVDb25zdGFudHMuSU5URVJOQUxfRElSRUNUSVZFLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgYXR0cmlidXRlVmFsdWUsIDAsIElDb3JlQ29uc3RhbnRzLklOVEVSTkFMX0RJUkVDVElWRS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJ1ZUZhbHNlVmFsdWUoY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwgQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLmxlbmd0aCgpKSkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGVxdWFscyArIDEpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKCJcIlwiIiwgZ2V0SW1hZ2UoRl9UWVBFX1ZBTFVFKSwgIlwiXCIiLCBvZmZzZXQsIDApIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgbGlzdC50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2xpc3Quc2l6ZSgpXSk7CisgICAgfQogCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBoYW5kbGVCdW5kbGVBY3RpdmF0aW9uUG9saWN5Q29tcGxldGlvbihmaW5hbCBTdHJpbmcgY3VycmVudFZhbHVlLCBmaW5hbCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBjb21tYSA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignLCcpOwotCQlpbnQgc2VtaWNvbG9uID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCc7Jyk7Ci0JCWlmICghaW5zaWRlUXVvdGVzKGN1cnJlbnRWYWx1ZSkgJiYgY29tbWEgPiBzZW1pY29sb24gfHwgY29tbWEgPT0gc2VtaWNvbG9uKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZSk7Ci0JCQlTdHJpbmcgbGF6eVZhbHVlID0gImxhenkiOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCQlpZiAobGF6eVZhbHVlLnJlZ2lvbk1hdGNoZXMoMCwgdmFsdWUsIDAsIGxlbmd0aCkpIHsKLQkJCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKGxhenlWYWx1ZSwgbnVsbCwgbGF6eVZhbHVlLCBvZmZzZXQKLQkJCQkJCS0gbGVuZ3RoLCBsZW5ndGgpIH07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCX0KKyAgICBwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZUJ1bmRsZUFjdGl2YXRvckNvbXBsZXRpb24oZmluYWwgU3RyaW5nIGN1cnJlbnRWYWx1ZSwgZmluYWwgaW50IG9mZnNldCkgeworICAgICAgICBBcnJheUxpc3QgY29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoKFBERUZvcm1FZGl0b3IpIHRoaXMuZlNvdXJjZVBhZ2UuZ2V0RWRpdG9yKCkpLmdldENvbW1vblByb2plY3QoKTsKKyAgICAgICAgaW50IHN0YXJ0T2Zmc2V0ID0gb2Zmc2V0IC0gY3VycmVudFZhbHVlLmxlbmd0aCgpOworICAgICAgICBnZW5lcmF0ZVR5cGVQYWNrYWdlUHJvcG9zYWxzKGN1cnJlbnRWYWx1ZSwgcHJvamVjdCwgY29tcGxldGlvbnMsIHN0YXJ0T2Zmc2V0LCBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUyk7CisgICAgICAgIElDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBjb21wbGV0aW9ucy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2NvbXBsZXRpb25zLnNpemUoKV0pOworICAgICAgICBzb3J0Q29tcGxldGlvbnMocHJvcG9zYWxzKTsKKyAgICAgICAgcmV0dXJuIHByb3Bvc2FsczsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZUJ1ZGR5UG9saWN5Q29tcGxldGlvbihTdHJpbmcgY3VycmVudFZhbHVlLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlKTsKLQkJLy8gdmFsdWVzIGZyb20gYnVnIDE3ODUxNyBjb21tZW50ICM3Ci0JCUFycmF5TGlzdCB2YWxpZFZhbHVlcyA9IGluaXRpYWxpemVOZXdMaXN0KG5ldyBTdHJpbmdbXSB7ICJkZXBlbmRlbnQiLCAiZ2xvYmFsIiwgInJlZ2lzdGVyZWQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSJhcHAiLCAiZXh0IiwgImJvb3QiLCAicGFyZW50IiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlBcnJheUxpc3QgdHlwZXMgPSBpbml0aWFsaXplTmV3TGlzdChuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihGX1RZUEVfVkFMVUUpLCBuZXcgSW50ZWdlcihGX1RZUEVfVkFMVUUpLAotCQkJCW5ldyBJbnRlZ2VyKEZfVFlQRV9WQUxVRSksIG5ldyBJbnRlZ2VyKEZfVFlQRV9WQUxVRSksIG5ldyBJbnRlZ2VyKEZfVFlQRV9WQUxVRSksCi0JCQkJbmV3IEludGVnZXIoRl9UWVBFX1ZBTFVFKSwgbmV3IEludGVnZXIoRl9UWVBFX1ZBTFVFKSB9KTsKLQkJcmV0dXJuIGhhbmRsZUF0dHJzQW5kRGlyZWN0aXZlcyh2YWx1ZSwgdmFsaWRWYWx1ZXMsIHR5cGVzLCBvZmZzZXQpOwotCX0KKyAgICBwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZUJ1bmRsZVN5bWJvbGljTmFtZUNvbXBsZXRpb24oU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IG9mZnNldCkgeworICAgICAgICBpbnQgc2VtaWNvbG9uID0gY3VycmVudFZhbHVlLmluZGV4T2YoJzsnKTsKKyAgICAgICAgaWYgKHNlbWljb2xvbiAhPSAtMSkgeworICAgICAgICAgICAgaW50IGVxdWFscyA9IGN1cnJlbnRWYWx1ZS5pbmRleE9mKCc9Jyk7CisgICAgICAgICAgICBpZiAoZXF1YWxzID09IC0xKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZSA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoc2VtaWNvbG9uICsgMSk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhhdHRyaWJ1dGUpOworICAgICAgICAgICAgICAgIE9iamVjdCBvID0gdGhpcy5mSGVhZGVycy5nZXQoQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04pOworICAgICAgICAgICAgICAgIGludCB0eXBlID0gbyA9PSBudWxsIHx8IG8udG9TdHJpbmcoKS5lcXVhbHMoIjEiKSA/IEZfVFlQRV9BVFRSSUJVVEUgOiBGX1RZUEVfRElSRUNUSVZFOy8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICBpZiAoQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGUsIDAsIGF0dHJpYnV0ZS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IGF0dHJpYnV0ZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFICsgIjo9IiwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW1hZ2UodHlwZSksIENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHByb3Bvc2FsLnNldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oZ2V0SmF2YURvYygiU0lOR0xFVE9OX0RJUkVDVElWRSIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7IHByb3Bvc2FsIH07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChlcXVhbHMgPiBzZW1pY29sb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJ1ZUZhbHNlVmFsdWUoY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07CisgICAgfQogCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBoYW5kbGVSZXF1aXJlZEV4ZWNFbnYoU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IG9mZnNldCkgewotCQlpbnQgY29tbWEgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJywnKTsKLQkJaWYgKGNvbW1hICE9IC0xKSB7Ci0JCQljdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGNvbW1hICsgMSk7Ci0JCX0KLQkJY3VycmVudFZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUpOwotCQlBcnJheUxpc3QgY29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUhhc2hTZXQgc2V0ID0gKEhhc2hTZXQpIGZIZWFkZXJzLmdldChDb25zdGFudHMuQlVORExFX1JFUVVJUkVERVhFQ1VUSU9ORU5WSVJPTk1FTlQpOwotCQlpZiAoc2V0ID09IG51bGwpIHsKLQkJCXNldCA9IG5ldyBIYXNoU2V0KDApOwotCQl9Ci0JCWludCBsZW5ndGggPSBjdXJyZW50VmFsdWUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkV4ZWNFbnZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZkV4ZWNFbnZzW2ldLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgY3VycmVudFZhbHVlLCAwLCBsZW5ndGgpICYmICFzZXQuY29udGFpbnMoZkV4ZWNFbnZzW2ldKSkgewotCQkJCWNvbXBsZXRpb25zLmFkZChuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChmRXhlY0VudnNbaV0sIGdldEltYWdlKEZfVFlQRV9FWEVDX0VOViksIGZFeGVjRW52c1tpXSwKLQkJCQkJCW9mZnNldCAtIGxlbmd0aCwgbGVuZ3RoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIGNvbXBsZXRpb25zLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbY29tcGxldGlvbnMuc2l6ZSgpXSk7Ci0JfQorICAgIHByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gaGFuZGxlQnVuZGxlQWN0aXZhdGlvblBvbGljeUNvbXBsZXRpb24oZmluYWwgU3RyaW5nIGN1cnJlbnRWYWx1ZSwgZmluYWwgaW50IG9mZnNldCkgeworICAgICAgICBpbnQgY29tbWEgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJywnKTsKKyAgICAgICAgaW50IHNlbWljb2xvbiA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignOycpOworICAgICAgICBpZiAoIWluc2lkZVF1b3RlcyhjdXJyZW50VmFsdWUpICYmIGNvbW1hID4gc2VtaWNvbG9uIHx8IGNvbW1hID09IHNlbWljb2xvbikgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUpOworICAgICAgICAgICAgU3RyaW5nIGxhenlWYWx1ZSA9ICJsYXp5IjsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKGxhenlWYWx1ZS5yZWdpb25NYXRjaGVzKDAsIHZhbHVlLCAwLCBsZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW10geyBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChsYXp5VmFsdWUsIG51bGwsIGxhenlWYWx1ZSwgb2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpIH07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOworICAgIH0KIAotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gaGFuZGxlVHJ1ZUZhbHNlVmFsdWUoU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IG9mZnNldCkgewotCQljdXJyZW50VmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZSk7Ci0JCWludCBsZW5ndGggPSBjdXJyZW50VmFsdWUubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW10gewotCQkJCQluZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCgidHJ1ZSIsIGdldEltYWdlKEZfVFlQRV9WQUxVRSksICJ0cnVlIiwgb2Zmc2V0LCAwKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCW5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKCJmYWxzZSIsIGdldEltYWdlKEZfVFlQRV9WQUxVRSksICJmYWxzZSIsIG9mZnNldCwgMCkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9OwotCQl9IGVsc2UgaWYgKGxlbmd0aCA8IDUgJiYgInRydWUiLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgY3VycmVudFZhbHVlLCAwLCBsZW5ndGgpKSB7Ci0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkidHJ1ZSIsIGdldEltYWdlKEZfVFlQRV9WQUxVRSksICJ0cnVlIiwgb2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfTsKLQkJfSBlbHNlIGlmIChsZW5ndGggPCA2ICYmICJmYWxzZSIucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBjdXJyZW50VmFsdWUsIDAsIGxlbmd0aCkpIHsKLQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHsgbmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCSJmYWxzZSIsIGdldEltYWdlKEZfVFlQRV9WQUxVRSksICJmYWxzZSIsIG9mZnNldCAtIGxlbmd0aCwgbGVuZ3RoKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX07Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCX0KKyAgICBwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZUJ1ZGR5UG9saWN5Q29tcGxldGlvbihTdHJpbmcgY3VycmVudFZhbHVlLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlKTsKKyAgICAgICAgLy8gdmFsdWVzIGZyb20gYnVnIDE3ODUxNyBjb21tZW50ICM3CisgICAgICAgIEFycmF5TGlzdCB2YWxpZFZhbHVlcyA9IGluaXRpYWxpemVOZXdMaXN0KG5ldyBTdHJpbmdbXSB7ICJkZXBlbmRlbnQiLCAiZ2xvYmFsIiwgInJlZ2lzdGVyZWQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorICAgICAgICAgICAgImFwcCIsICJleHQiLCAiYm9vdCIsICJwYXJlbnQiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCisgICAgICAgIEFycmF5TGlzdCB0eXBlcyA9IGluaXRpYWxpemVOZXdMaXN0KG5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKEZfVFlQRV9WQUxVRSksIG5ldyBJbnRlZ2VyKEZfVFlQRV9WQUxVRSksIG5ldyBJbnRlZ2VyKEZfVFlQRV9WQUxVRSksCisgICAgICAgICAgICBuZXcgSW50ZWdlcihGX1RZUEVfVkFMVUUpLCBuZXcgSW50ZWdlcihGX1RZUEVfVkFMVUUpLCBuZXcgSW50ZWdlcihGX1RZUEVfVkFMVUUpLCBuZXcgSW50ZWdlcihGX1RZUEVfVkFMVUUpIH0pOworICAgICAgICByZXR1cm4gaGFuZGxlQXR0cnNBbmREaXJlY3RpdmVzKHZhbHVlLCB2YWxpZFZhbHVlcywgdHlwZXMsIG9mZnNldCk7CisgICAgfQogCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBtYXRjaFZhbHVlQ29tcGxldGlvbihTdHJpbmcgdmFsdWUsIFN0cmluZ1tdIGF0dHJzLCBpbnRbXSB0eXBlcywgaW50IG9mZnNldCkgewotCQlyZXR1cm4gbWF0Y2hWYWx1ZUNvbXBsZXRpb24odmFsdWUsIGF0dHJzLCB0eXBlcywgb2Zmc2V0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9CisgICAgcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBoYW5kbGVSZXF1aXJlZEV4ZWNFbnYoU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IG9mZnNldCkgeworICAgICAgICBpbnQgY29tbWEgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJywnKTsKKyAgICAgICAgaWYgKGNvbW1hICE9IC0xKSB7CisgICAgICAgICAgICBjdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGNvbW1hICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudFZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUpOworICAgICAgICBBcnJheUxpc3QgY29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIEhhc2hTZXQgc2V0ID0gKEhhc2hTZXQpIHRoaXMuZkhlYWRlcnMuZ2V0KENvbnN0YW50cy5CVU5ETEVfUkVRVUlSRURFWEVDVVRJT05FTlZJUk9OTUVOVCk7CisgICAgICAgIGlmIChzZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0ID0gbmV3IEhhc2hTZXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGxlbmd0aCA9IGN1cnJlbnRWYWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmRXhlY0VudnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmRXhlY0VudnNbaV0ucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBjdXJyZW50VmFsdWUsIDAsIGxlbmd0aCkgJiYgIXNldC5jb250YWlucyhmRXhlY0VudnNbaV0pKSB7CisgICAgICAgICAgICAgICAgY29tcGxldGlvbnMuYWRkKG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKGZFeGVjRW52c1tpXSwgZ2V0SW1hZ2UoRl9UWVBFX0VYRUNfRU5WKSwgZkV4ZWNFbnZzW2ldLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBjb21wbGV0aW9ucy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2NvbXBsZXRpb25zLnNpemUoKV0pOworICAgIH0KIAotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gbWF0Y2hWYWx1ZUNvbXBsZXRpb24oU3RyaW5nIHZhbHVlLCBTdHJpbmdbXSBhdHRycywgaW50W10gdHlwZXMsIGludCBvZmZzZXQsCi0JCQlTdHJpbmcgcHJlZml4Q29zdGFudCkgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotCQlCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGF0dHJzW2ldLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgdmFsdWUsIDAsIGxlbmd0aCkpIHsKLQkJCQlpZiAodHlwZXNbaV0gPT0gRl9UWVBFX0FUVFJJQlVURSkgewotCQkJCQlwcm9wb3NhbCA9IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkJCWF0dHJzW2ldICsgIj0iLCBnZXRJbWFnZShGX1RZUEVfQVRUUklCVVRFKSwgYXR0cnNbaV0sIG9mZnNldCAtIGxlbmd0aCwgbGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9wb3NhbC5zZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKGdldEphdmFEb2MoYXR0cnNbaV0gKyAiX0FUVFJJQlVURSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAodHlwZXNbaV0gPT0gRl9UWVBFX0RJUkVDVElWRSkgewotCQkJCQlwcm9wb3NhbCA9IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkJCWF0dHJzW2ldICsgIjo9IiwgZ2V0SW1hZ2UoRl9UWVBFX0RJUkVDVElWRSksIGF0dHJzW2ldLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvcG9zYWwuc2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbyhnZXRKYXZhRG9jKGF0dHJzW2ldICsgIl9ESVJFQ1RJVkUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlwcm9wb3NhbCA9IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKGF0dHJzW2ldLCBnZXRJbWFnZSh0eXBlc1tpXSksIGF0dHJzW2ldLAotCQkJCQkJCW9mZnNldCAtIGxlbmd0aCwgbGVuZ3RoKTsKLQkJCQkJcHJvcG9zYWwuc2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbyhnZXRKYXZhRG9jKHByZWZpeENvc3RhbnQgKyBhdHRyc1tpXSkpOwotCQkJCX0KLQkJCQlsaXN0LmFkZChwcm9wb3NhbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIGxpc3QudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtsaXN0LnNpemUoKV0pOwotCX0KKyAgICBwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZVRydWVGYWxzZVZhbHVlKFN0cmluZyBjdXJyZW50VmFsdWUsIGludCBvZmZzZXQpIHsKKyAgICAgICAgY3VycmVudFZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUpOworICAgICAgICBpbnQgbGVuZ3RoID0gY3VycmVudFZhbHVlLmxlbmd0aCgpOworICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHsgbmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwoInRydWUiLCBnZXRJbWFnZShGX1RZUEVfVkFMVUUpLCAidHJ1ZSIsIG9mZnNldCwgMCksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICAgICAgICAgICAgICAgIG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKCJmYWxzZSIsIGdldEltYWdlKEZfVFlQRV9WQUxVRSksICJmYWxzZSIsIG9mZnNldCwgMCkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICB9OworICAgICAgICB9IGVsc2UgaWYgKGxlbmd0aCA8IDUgJiYgInRydWUiLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgY3VycmVudFZhbHVlLCAwLCBsZW5ndGgpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKCJ0cnVlIiwgZ2V0SW1hZ2UoRl9UWVBFX1ZBTFVFKSwgInRydWUiLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICB9OworICAgICAgICB9IGVsc2UgaWYgKGxlbmd0aCA8IDYgJiYgImZhbHNlIi5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGN1cnJlbnRWYWx1ZSwgMCwgbGVuZ3RoKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW10geyBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCgiZmFsc2UiLCBnZXRJbWFnZShGX1RZUEVfVkFMVUUpLCAiZmFsc2UiLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZUF0dHJzQW5kRGlyZWN0aXZlcyhTdHJpbmcgdmFsdWUsIEFycmF5TGlzdCBhdHRycywgQXJyYXlMaXN0IHR5cGVzLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBmdWxsVmFsdWUgPSBmaW5kRnVsbExpbmUodmFsdWUsIG9mZnNldCwgZmFsc2UpOwotCQlpbnQgc2VtaWNvbG9uID0gdmFsdWUubGFzdEluZGV4T2YoJzsnKTsKLQkJdmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKHZhbHVlLnN1YnN0cmluZyhzZW1pY29sb24gKyAxKSk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZ1bGxWYWx1ZSwgIjsiKTsgLy8kTk9OLU5MUy0xJAotCQl0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW5WYWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXModG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCWludCBpbmRleCA9IHRva2VuVmFsdWUuaW5kZXhPZignPScpOwotCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodG9rZW5WYWx1ZS5jaGFyQXQoaW5kZXggLSAxKSA9PSAnOicpIHsKLQkJCQktLWluZGV4OwotCQkJfQotCQkJdG9rZW5WYWx1ZSA9IHRva2VuVmFsdWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCWludCBpbmRleE9mT2JqZWN0ID0gYXR0cnMuaW5kZXhPZih0b2tlblZhbHVlKTsKLQkJCWlmIChpbmRleE9mT2JqZWN0ID49IDApIHsKLQkJCQlhdHRycy5yZW1vdmUoaW5kZXhPZk9iamVjdCk7Ci0JCQkJdHlwZXMucmVtb3ZlKGluZGV4T2ZPYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXRjaFZhbHVlQ29tcGxldGlvbih2YWx1ZSwgKFN0cmluZ1tdKSBhdHRycy50b0FycmF5KG5ldyBTdHJpbmdbYXR0cnMuc2l6ZSgpXSksIHRvSW50QXJyYXkodHlwZXMpLAotCQkJCW9mZnNldCk7Ci0JfQorICAgIHByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gbWF0Y2hWYWx1ZUNvbXBsZXRpb24oU3RyaW5nIHZhbHVlLCBTdHJpbmdbXSBhdHRycywgaW50W10gdHlwZXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIG1hdGNoVmFsdWVDb21wbGV0aW9uKHZhbHVlLCBhdHRycywgdHlwZXMsIG9mZnNldCwgIiIpOyAvLyROT04tTkxTLTEkCisgICAgfQogCi0JcHJvdGVjdGVkIEhhc2hTZXQgcGFyc2VIZWFkZXJGb3JWYWx1ZXMoU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IG9mZnNldCkgewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCVN0cmluZyBmdWxsVmFsdWUgPSBmaW5kRnVsbExpbmUoY3VycmVudFZhbHVlLCBvZmZzZXQsIHRydWUpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihmdWxsVmFsdWUsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyBwa2dWYWx1ZSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWludCBpbmRleCA9IHBrZ1ZhbHVlLmluZGV4T2YoJzsnKTsKLQkJCXNldC5hZGQoaW5kZXggPT0gLTEgPyBwa2dWYWx1ZS50cmltKCkgOiBwa2dWYWx1ZS5zdWJzdHJpbmcoMCwgaW5kZXgpLnRyaW0oKSk7Ci0JCX0KLQkJcmV0dXJuIHNldDsKLQl9CisgICAgcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBtYXRjaFZhbHVlQ29tcGxldGlvbihTdHJpbmcgdmFsdWUsIFN0cmluZ1tdIGF0dHJzLCBpbnRbXSB0eXBlcywgaW50IG9mZnNldCwgU3RyaW5nIHByZWZpeENvc3RhbnQpIHsKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1tpXS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIHZhbHVlLCAwLCBsZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVzW2ldID09IEZfVFlQRV9BVFRSSUJVVEUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWwgPSBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChhdHRyc1tpXSArICI9IiwgZ2V0SW1hZ2UoRl9UWVBFX0FUVFJJQlVURSksIGF0dHJzW2ldLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWwuc2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbyhnZXRKYXZhRG9jKGF0dHJzW2ldICsgIl9BVFRSSUJVVEUiKSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVzW2ldID09IEZfVFlQRV9ESVJFQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWwgPSBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChhdHRyc1tpXSArICI6PSIsIGdldEltYWdlKEZfVFlQRV9ESVJFQ1RJVkUpLCBhdHRyc1tpXSwgb2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgICAgIHByb3Bvc2FsLnNldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oZ2V0SmF2YURvYyhhdHRyc1tpXSArICJfRElSRUNUSVZFIikpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWwgPSBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChhdHRyc1tpXSwgZ2V0SW1hZ2UodHlwZXNbaV0pLCBhdHRyc1tpXSwgb2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBwcm9wb3NhbC5zZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKGdldEphdmFEb2MocHJlZml4Q29zdGFudCArIGF0dHJzW2ldKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpc3QuYWRkKHByb3Bvc2FsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgbGlzdC50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2xpc3Quc2l6ZSgpXSk7CisgICAgfQogCi0JcHJvdGVjdGVkIFN0cmluZyBmaW5kRnVsbExpbmUoU3RyaW5nIHZhbHVlLCBpbnQgb2Zmc2V0LCBib29sZWFuIGVudGlyZUhlYWRlcikgewotCQlJRG9jdW1lbnQgZG9jID0gZlNvdXJjZVBhZ2UuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGZTb3VyY2VQYWdlLmdldElucHV0Q29udGV4dCgpLmdldElucHV0KCkpOwotCQl0cnkgewotCQkJaW50IGxpbmUgPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KG9mZnNldCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaW50IHN0YXJ0T2ZMaW5lID0gMDsKLQkJCWludCBjb2xvbiA9IC0xOwotCQkJZG8gewotCQkJCXN0YXJ0T2ZMaW5lID0gZG9jLmdldExpbmVPZmZzZXQobGluZSk7Ci0JCQkJbmV3VmFsdWUgPSBkb2MuZ2V0KG9mZnNldCwgZG9jLmdldExpbmVMZW5ndGgobGluZSkgLSBvZmZzZXQgKyBzdGFydE9mTGluZSk7Ci0JCQkJKytsaW5lOwotCQkJCWNvbG9uID0gbmV3VmFsdWUubGFzdEluZGV4T2YoJzonKTsKLQkJCX0gd2hpbGUgKChjb2xvbiA9PSAtMSB8fCAobmV3VmFsdWUubGVuZ3RoKCkgPiBjb2xvbiAmJiBuZXdWYWx1ZS5jaGFyQXQoY29sb24gKyAxKSA9PSAnPScpKQotCQkJCQkmJiAoZW50aXJlSGVhZGVyIHx8IG5ld1ZhbHVlLmluZGV4T2YoJywnKSA9PSAtMSkgJiYgIShkb2MuZ2V0TnVtYmVyT2ZMaW5lcygpID09IGxpbmUpKTsKLQkJCWludCBmaXJzdENvbG9uID0gbmV3VmFsdWUuaW5kZXhPZignOicpOwotCQkJaWYgKGNvbG9uID4gMCAmJiBuZXdWYWx1ZS5jaGFyQXQoY29sb24gKyAxKSAhPSAnPScpIHsKLQkJCQluZXdWYWx1ZSA9IGRvYy5nZXQob2Zmc2V0LCBzdGFydE9mTGluZSAtIDEgLSBvZmZzZXQpOwotCQkJfSBlbHNlIGlmIChmaXJzdENvbG9uID4gMCAmJiBuZXdWYWx1ZS5jaGFyQXQoZmlyc3RDb2xvbiArIDEpID09ICcgJykgewotCQkJCW5ld1ZhbHVlID0gZG9jLmdldChvZmZzZXQsIHN0YXJ0T2ZMaW5lIC0gMSAtIG9mZnNldCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGJyZWFrIG9uIHRoZSBjb21tYSB0byBmaW5kIG91ciBlbGVtZW50LCBidXQgb25seSBicmVhayBvbiBhCi0JCQkJLy8gY29tbWEgdGhhdCBpcyBub3QgZW5jbG9zZWQgaW4gcGFyZW50aGVzaXMKLQkJCQlpbnQgY29tbWEgPSBuZXdWYWx1ZS5pbmRleE9mKCcsJyk7Ci0JCQkJaW50IHBhcmVudGhlc2lzID0gbmV3VmFsdWUuaW5kZXhPZignIicpOwotCQkJCWlmICghKHBhcmVudGhlc2lzIDwgY29tbWEgJiYgbmV3VmFsdWUuaW5kZXhPZignIicsIHBhcmVudGhlc2lzICsgMSkgPiBjb21tYSkpIHsKLQkJCQkJbmV3VmFsdWUgPSAoY29tbWEgIT0gLTEpID8gbmV3VmFsdWUuc3Vic3RyaW5nKDAsIGNvbW1hKSA6IG5ld1ZhbHVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB2YWx1ZS5jb25jYXQobmV3VmFsdWUpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQorICAgIHByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gaGFuZGxlQXR0cnNBbmREaXJlY3RpdmVzKFN0cmluZyB2YWx1ZSwgQXJyYXlMaXN0IGF0dHJzLCBBcnJheUxpc3QgdHlwZXMsIGludCBvZmZzZXQpIHsKKyAgICAgICAgU3RyaW5nIGZ1bGxWYWx1ZSA9IGZpbmRGdWxsTGluZSh2YWx1ZSwgb2Zmc2V0LCBmYWxzZSk7CisgICAgICAgIGludCBzZW1pY29sb24gPSB2YWx1ZS5sYXN0SW5kZXhPZignOycpOworICAgICAgICB2YWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXModmFsdWUuc3Vic3RyaW5nKHNlbWljb2xvbiArIDEpKTsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZnVsbFZhbHVlLCAiOyIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIHRva2VuaXplci5uZXh0VG9rZW4oKTsKKyAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyB0b2tlblZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyh0b2tlbml6ZXIubmV4dFRva2VuKCkpOworICAgICAgICAgICAgaW50IGluZGV4ID0gdG9rZW5WYWx1ZS5pbmRleE9mKCc9Jyk7CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0b2tlblZhbHVlLmNoYXJBdChpbmRleCAtIDEpID09ICc6JykgeworICAgICAgICAgICAgICAgIC0taW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b2tlblZhbHVlID0gdG9rZW5WYWx1ZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgaW50IGluZGV4T2ZPYmplY3QgPSBhdHRycy5pbmRleE9mKHRva2VuVmFsdWUpOworICAgICAgICAgICAgaWYgKGluZGV4T2ZPYmplY3QgPj0gMCkgeworICAgICAgICAgICAgICAgIGF0dHJzLnJlbW92ZShpbmRleE9mT2JqZWN0KTsKKyAgICAgICAgICAgICAgICB0eXBlcy5yZW1vdmUoaW5kZXhPZk9iamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoVmFsdWVDb21wbGV0aW9uKHZhbHVlLCAoU3RyaW5nW10pIGF0dHJzLnRvQXJyYXkobmV3IFN0cmluZ1thdHRycy5zaXplKCldKSwgdG9JbnRBcnJheSh0eXBlcyksIG9mZnNldCk7CisgICAgfQogCi0JcHJvdGVjdGVkIGludFtdIHRvSW50QXJyYXkoQXJyYXlMaXN0IGxpc3QpIHsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtsaXN0LnNpemUoKV07Ci0JCWludCBpID0gLTE7Ci0JCXdoaWxlICgrK2kgPCByZXN1bHQubGVuZ3RoKSB7Ci0JCQlPYmplY3QgbyA9IGxpc3QuZ2V0KGkpOwotCQkJaWYgKCEobyBpbnN0YW5jZW9mIEludGVnZXIpKSB7Ci0JCQkJcmV0dXJuIG5ldyBpbnRbMF07Ci0JCQl9Ci0JCQlyZXN1bHRbaV0gPSAoKEludGVnZXIpIG8pLmludFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgcHJvdGVjdGVkIEhhc2hTZXQgcGFyc2VIZWFkZXJGb3JWYWx1ZXMoU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IG9mZnNldCkgeworICAgICAgICBIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIFN0cmluZyBmdWxsVmFsdWUgPSBmaW5kRnVsbExpbmUoY3VycmVudFZhbHVlLCBvZmZzZXQsIHRydWUpOworICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihmdWxsVmFsdWUsICIsIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwa2dWYWx1ZSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IHBrZ1ZhbHVlLmluZGV4T2YoJzsnKTsKKyAgICAgICAgICAgIHNldC5hZGQoaW5kZXggPT0gLTEgPyBwa2dWYWx1ZS50cmltKCkgOiBwa2dWYWx1ZS5zdWJzdHJpbmcoMCwgaW5kZXgpLnRyaW0oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNldDsKKyAgICB9CiAKLQkvLyBpZiB5b3UgdXNlIGphdmEudXRpbC5BcnJheXMuYXNMaXN0KCksIHdlIGdldCBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbgotCS8vIGxhdGVyIGluIHRoZSBjb2RlCi0JcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdCBpbml0aWFsaXplTmV3TGlzdChPYmplY3RbXSB2YWx1ZXMpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHZhbHVlcy5sZW5ndGgpOwotCQlmb3IgKE9iamVjdCBlbGVtZW50IDogdmFsdWVzKSB7Ci0JCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9CisgICAgcHJvdGVjdGVkIFN0cmluZyBmaW5kRnVsbExpbmUoU3RyaW5nIHZhbHVlLCBpbnQgb2Zmc2V0LCBib29sZWFuIGVudGlyZUhlYWRlcikgeworICAgICAgICBJRG9jdW1lbnQgZG9jID0gdGhpcy5mU291cmNlUGFnZS5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGhpcy5mU291cmNlUGFnZS5nZXRJbnB1dENvbnRleHQoKS5nZXRJbnB1dCgpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChvZmZzZXQpOworICAgICAgICAgICAgU3RyaW5nIG5ld1ZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGludCBzdGFydE9mTGluZSA9IDA7CisgICAgICAgICAgICBpbnQgY29sb24gPSAtMTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBzdGFydE9mTGluZSA9IGRvYy5nZXRMaW5lT2Zmc2V0KGxpbmUpOworICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gZG9jLmdldChvZmZzZXQsIGRvYy5nZXRMaW5lTGVuZ3RoKGxpbmUpIC0gb2Zmc2V0ICsgc3RhcnRPZkxpbmUpOworICAgICAgICAgICAgICAgICsrbGluZTsKKyAgICAgICAgICAgICAgICBjb2xvbiA9IG5ld1ZhbHVlLmxhc3RJbmRleE9mKCc6Jyk7CisgICAgICAgICAgICB9IHdoaWxlICgoY29sb24gPT0gLTEgfHwgbmV3VmFsdWUubGVuZ3RoKCkgPiBjb2xvbiAmJiBuZXdWYWx1ZS5jaGFyQXQoY29sb24gKyAxKSA9PSAnPScpICYmIChlbnRpcmVIZWFkZXIgfHwgbmV3VmFsdWUuaW5kZXhPZignLCcpID09IC0xKQorICAgICAgICAgICAgICAgICYmICEoZG9jLmdldE51bWJlck9mTGluZXMoKSA9PSBsaW5lKSk7CisgICAgICAgICAgICBpbnQgZmlyc3RDb2xvbiA9IG5ld1ZhbHVlLmluZGV4T2YoJzonKTsKKyAgICAgICAgICAgIGlmIChjb2xvbiA+IDAgJiYgbmV3VmFsdWUuY2hhckF0KGNvbG9uICsgMSkgIT0gJz0nKSB7CisgICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBkb2MuZ2V0KG9mZnNldCwgc3RhcnRPZkxpbmUgLSAxIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlyc3RDb2xvbiA+IDAgJiYgbmV3VmFsdWUuY2hhckF0KGZpcnN0Q29sb24gKyAxKSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IGRvYy5nZXQob2Zmc2V0LCBzdGFydE9mTGluZSAtIDEgLSBvZmZzZXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBicmVhayBvbiB0aGUgY29tbWEgdG8gZmluZCBvdXIgZWxlbWVudCwgYnV0IG9ubHkgYnJlYWsgb24gYQorICAgICAgICAgICAgICAgIC8vIGNvbW1hIHRoYXQgaXMgbm90IGVuY2xvc2VkIGluIHBhcmVudGhlc2lzCisgICAgICAgICAgICAgICAgaW50IGNvbW1hID0gbmV3VmFsdWUuaW5kZXhPZignLCcpOworICAgICAgICAgICAgICAgIGludCBwYXJlbnRoZXNpcyA9IG5ld1ZhbHVlLmluZGV4T2YoJyInKTsKKyAgICAgICAgICAgICAgICBpZiAoIShwYXJlbnRoZXNpcyA8IGNvbW1hICYmIG5ld1ZhbHVlLmluZGV4T2YoJyInLCBwYXJlbnRoZXNpcyArIDEpID4gY29tbWEpKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gY29tbWEgIT0gLTEgPyBuZXdWYWx1ZS5zdWJzdHJpbmcoMCwgY29tbWEpIDogbmV3VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmNvbmNhdChuZXdWYWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKyAgICB9CiAKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNpZGVRdW90ZXMoU3RyaW5nIHZhbHVlKSB7Ci0JCWNoYXJbXSBjaGFycyA9IHZhbHVlLnRvQ2hhckFycmF5KCk7Ci0JCWludCBudW1PZlF1b3RlcyA9IDA7Ci0JCWZvciAoY2hhciBlbGVtZW50IDogY2hhcnMpIHsKLQkJCWlmIChlbGVtZW50ID09ICdcIicpIHsKLQkJCQkrK251bU9mUXVvdGVzOwotCQkJfQotCQl9Ci0JCWludCBqID0gbnVtT2ZRdW90ZXMgJSAyOwotCQlyZXR1cm4gaiA9PSAxOwotCX0KKyAgICBwcm90ZWN0ZWQgaW50W10gdG9JbnRBcnJheShBcnJheUxpc3QgbGlzdCkgeworICAgICAgICBpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xpc3Quc2l6ZSgpXTsKKyAgICAgICAgaW50IGkgPSAtMTsKKyAgICAgICAgd2hpbGUgKCsraSA8IHJlc3VsdC5sZW5ndGgpIHsKKyAgICAgICAgICAgIE9iamVjdCBvID0gbGlzdC5nZXQoaSk7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSW50ZWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGludFswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdFtpXSA9ICgoSW50ZWdlcikgbykuaW50VmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIAotCXB1YmxpYyB2b2lkIGFzc2lzdFNlc3Npb25FbmRlZChDb250ZW50QXNzaXN0RXZlbnQgZXZlbnQpIHsKLQkJZkhlYWRlcnMgPSBudWxsOwotCX0KKyAgICAvLyBpZiB5b3UgdXNlIGphdmEudXRpbC5BcnJheXMuYXNMaXN0KCksIHdlIGdldCBhbiBVbnN1cHBvcnRlZE9wZXJhdGlvbgorICAgIC8vIGxhdGVyIGluIHRoZSBjb2RlCisgICAgcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdCBpbml0aWFsaXplTmV3TGlzdChPYmplY3RbXSB2YWx1ZXMpIHsKKyAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHZhbHVlcy5sZW5ndGgpOworICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogdmFsdWVzKSB7CisgICAgICAgICAgICBsaXN0LmFkZChlbGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBhc3Npc3RTZXNzaW9uU3RhcnRlZChDb250ZW50QXNzaXN0RXZlbnQgZXZlbnQpIHsKLQl9CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5zaWRlUXVvdGVzKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBjaGFyW10gY2hhcnMgPSB2YWx1ZS50b0NoYXJBcnJheSgpOworICAgICAgICBpbnQgbnVtT2ZRdW90ZXMgPSAwOworICAgICAgICBmb3IgKGNoYXIgZWxlbWVudCA6IGNoYXJzKSB7CisgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSAnXCInKSB7CisgICAgICAgICAgICAgICAgKytudW1PZlF1b3RlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgaiA9IG51bU9mUXVvdGVzICUgMjsKKyAgICAgICAgcmV0dXJuIGogPT0gMTsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwsIGJvb2xlYW4gc21hcnRUb2dnbGUpIHsKLQl9CisgICAgcHVibGljIHZvaWQgYXNzaXN0U2Vzc2lvbkVuZGVkKENvbnRlbnRBc3Npc3RFdmVudCBldmVudCkgeworICAgICAgICB0aGlzLmZIZWFkZXJzID0gbnVsbDsKKyAgICB9CiAKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoaW50IHR5cGUpIHsKLQkJaWYgKHR5cGUgPj0gMCAmJiB0eXBlIDwgRl9UT1RBTF9UWVBFUykgewotCQkJaWYgKGZJbWFnZXNbdHlwZV0gPT0gbnVsbCkgewotCQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgRl9UWVBFX0hFQURFUjoKLQkJCQkJcmV0dXJuIGZJbWFnZXNbdHlwZV0gPSBQREVQbHVnaW5JbWFnZXMuREVTQ19CVUlMRF9WQVJfT0JKLmNyZWF0ZUltYWdlKCk7Ci0JCQkJY2FzZSBGX1RZUEVfUEtHOgotCQkJCQlyZXR1cm4gUERFUGx1Z2luSW1hZ2VzLmdldChQREVQbHVnaW5JbWFnZXMuT0JKX0RFU0NfUEFDS0FHRSk7Ci0JCQkJY2FzZSBGX1RZUEVfQlVORExFOgotCQkJCQlyZXR1cm4gZkltYWdlc1t0eXBlXSA9IFBERVBsdWdpbkltYWdlcy5ERVNDX1BMVUdJTl9PQkouY3JlYXRlSW1hZ2UoKTsKLQkJCQljYXNlIEZfVFlQRV9DTEFTUzoKLQkJCQkJcmV0dXJuIFBERVBsdWdpbkltYWdlcy5nZXQoUERFUGx1Z2luSW1hZ2VzLk9CSl9ERVNDX0dFTkVSQVRFX0NMQVNTKTsKLQkJCQljYXNlIEZfVFlQRV9BVFRSSUJVVEU6Ci0JCQkJCXJldHVybiBmSW1hZ2VzW3R5cGVdID0gUERFUGx1Z2luSW1hZ2VzLkRFU0NfQVRUX1VSSV9PQkouY3JlYXRlSW1hZ2UoKTsKLQkJCQljYXNlIEZfVFlQRV9ESVJFQ1RJVkU6Ci0JCQkJCWZJbWFnZXNbRl9UWVBFX0FUVFJJQlVURV0gPSBQREVQbHVnaW5JbWFnZXMuREVTQ19BVFRfVVJJX09CSi5jcmVhdGVJbWFnZSgpOwotCQkJCQlJbWFnZU92ZXJsYXlJY29uIGljb24gPSBuZXcgSW1hZ2VPdmVybGF5SWNvbihmSW1hZ2VzW0ZfVFlQRV9BVFRSSUJVVEVdLCBuZXcgSW1hZ2VEZXNjcmlwdG9yW11bXSB7Ci0JCQkJCQkJbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgUERFUGx1Z2luSW1hZ2VzLkRFU0NfRE9DX0NPIH0sIG51bGwsIG51bGwsIG51bGwgfSk7Ci0JCQkJCXJldHVybiBmSW1hZ2VzW3R5cGVdID0gaWNvbi5jcmVhdGVJbWFnZSgpOwotCQkJCWNhc2UgRl9UWVBFX0VYRUNfRU5WOgotCQkJCQlyZXR1cm4gZkltYWdlc1t0eXBlXSA9IFBERVBsdWdpbkltYWdlcy5ERVNDX0pBVkFfTElCX09CSi5jcmVhdGVJbWFnZSgpOwotCQkJCWNhc2UgRl9UWVBFX1ZBTFVFOgotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmSW1hZ2VzW3R5cGVdOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBwdWJsaWMgdm9pZCBhc3Npc3RTZXNzaW9uU3RhcnRlZChDb250ZW50QXNzaXN0RXZlbnQgZXZlbnQpIHsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZJbWFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmSW1hZ2VzW2ldICE9IG51bGwgJiYgIWZJbWFnZXNbaV0uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJZkltYWdlc1tpXS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsLCBib29sZWFuIHNtYXJ0VG9nZ2xlKSB7CisgICAgfQogCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRKYXZhRG9jKFN0cmluZyBjb25zdGFudCkgewotCQlpZiAoZkpQID09IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoKFBERUZvcm1FZGl0b3IpIGZTb3VyY2VQYWdlLmdldEVkaXRvcigpKS5nZXRDb21tb25Qcm9qZWN0KCk7Ci0JCQlmSlAgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIFBERUphdmFIZWxwZXJVSS5nZXRPU0dJQ29uc3RhbnRKYXZhRG9jKGNvbnN0YW50LCBmSlApOwotCX0KKyAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoaW50IHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgPj0gMCAmJiB0eXBlIDwgRl9UT1RBTF9UWVBFUykgeworICAgICAgICAgICAgaWYgKHRoaXMuZkltYWdlc1t0eXBlXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRl9UWVBFX0hFQURFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZJbWFnZXNbdHlwZV0gPSBQREVQbHVnaW5JbWFnZXMuREVTQ19CVUlMRF9WQVJfT0JKLmNyZWF0ZUltYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRl9UWVBFX1BLRzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQREVQbHVnaW5JbWFnZXMuZ2V0KFBERVBsdWdpbkltYWdlcy5PQkpfREVTQ19QQUNLQUdFKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGX1RZUEVfQlVORExFOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZkltYWdlc1t0eXBlXSA9IFBERVBsdWdpbkltYWdlcy5ERVNDX1BMVUdJTl9PQkouY3JlYXRlSW1hZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGX1RZUEVfQ0xBU1M6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUERFUGx1Z2luSW1hZ2VzLmdldChQREVQbHVnaW5JbWFnZXMuT0JKX0RFU0NfR0VORVJBVEVfQ0xBU1MpOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZfVFlQRV9BVFRSSUJVVEU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mSW1hZ2VzW3R5cGVdID0gUERFUGx1Z2luSW1hZ2VzLkRFU0NfQVRUX1VSSV9PQkouY3JlYXRlSW1hZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGX1RZUEVfRElSRUNUSVZFOgorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mSW1hZ2VzW0ZfVFlQRV9BVFRSSUJVVEVdID0gUERFUGx1Z2luSW1hZ2VzLkRFU0NfQVRUX1VSSV9PQkouY3JlYXRlSW1hZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlT3ZlcmxheUljb24gaWNvbiA9IG5ldyBJbWFnZU92ZXJsYXlJY29uKHRoaXMuZkltYWdlc1tGX1RZUEVfQVRUUklCVVRFXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW1hZ2VEZXNjcmlwdG9yW11bXSB7IG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFBERVBsdWdpbkltYWdlcy5ERVNDX0RPQ19DTyB9LCBudWxsLCBudWxsLCBudWxsIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZkltYWdlc1t0eXBlXSA9IGljb24uY3JlYXRlSW1hZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGX1RZUEVfRVhFQ19FTlY6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mSW1hZ2VzW3R5cGVdID0gUERFUGx1Z2luSW1hZ2VzLkRFU0NfSkFWQV9MSUJfT0JKLmNyZWF0ZUltYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRl9UWVBFX1ZBTFVFOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mSW1hZ2VzW3R5cGVdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5mSW1hZ2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGhpcy5mSW1hZ2VzW2ldICE9IG51bGwgJiYgIXRoaXMuZkltYWdlc1tpXS5pc0Rpc3Bvc2VkKCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZJbWFnZXNbaV0uZGlzcG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRKYXZhRG9jKFN0cmluZyBjb25zdGFudCkgeworICAgICAgICBpZiAodGhpcy5mSlAgPT0gbnVsbCkgeworICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9ICgoUERFRm9ybUVkaXRvcikgdGhpcy5mU291cmNlUGFnZS5nZXRFZGl0b3IoKSkuZ2V0Q29tbW9uUHJvamVjdCgpOworICAgICAgICAgICAgdGhpcy5mSlAgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFBERUphdmFIZWxwZXJVSS5nZXRPU0dJQ29uc3RhbnRKYXZhRG9jKGNvbnN0YW50LCB0aGlzLmZKUCk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvQnVuZGxlQ29sb3JNYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvQnVuZGxlQ29sb3JNYW5hZ2VyLmphdmEKaW5kZXggMTczYWY5Mi4uMTA5YWI2YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy90ZXh0L0J1bmRsZUNvbG9yTWFuYWdlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvdGV4dC9CdW5kbGVDb2xvck1hbmFnZXIuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9ycy50ZXh0OwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC0zMiwxMDkgKzMzLDEwOSBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlQ29sb3JNYW5hZ2VyIGltcGxlbWVudHMgSUNvbG9yTWFuYWdlciwgSVBERUNvbG9yQ29uc3RhbnRzLCBJU3ByaW5nQ29sb3JDb25zdGFudHMgewogCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29sb3JNYW5hZ2VyIGZDb2xvck1hbmFnZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29sb3JNYW5hZ2VyIGZDb2xvck1hbmFnZXI7CiAKLQlwcml2YXRlIGZpbmFsIE1hcCBmQ29sb3JUYWJsZSA9IG5ldyBIYXNoTWFwKDUpOworICAgIHByaXZhdGUgZmluYWwgTWFwIGZDb2xvclRhYmxlID0gbmV3IEhhc2hNYXAoNSk7CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgY291bnRlciA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50ZXIgPSAwOwogCi0JcHVibGljIEJ1bmRsZUNvbG9yTWFuYWdlcigpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KKyAgICBwdWJsaWMgQnVuZGxlQ29sb3JNYW5hZ2VyKCkgeworICAgICAgICBpbml0aWFsaXplKCk7CisgICAgfQogCi0JcHVibGljIHN0YXRpYyBJQ29sb3JNYW5hZ2VyIGdldERlZmF1bHQoKSB7Ci0JCWlmIChmQ29sb3JNYW5hZ2VyID09IG51bGwpIHsKLQkJCWZDb2xvck1hbmFnZXIgPSBuZXcgQnVuZGxlQ29sb3JNYW5hZ2VyKCk7Ci0JCX0KKyAgICBwdWJsaWMgc3RhdGljIElDb2xvck1hbmFnZXIgZ2V0RGVmYXVsdCgpIHsKKyAgICAgICAgaWYgKGZDb2xvck1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgZkNvbG9yTWFuYWdlciA9IG5ldyBCdW5kbGVDb2xvck1hbmFnZXIoKTsKKyAgICAgICAgfQogCi0JCWNvdW50ZXIgKz0gMTsKLQkJcmV0dXJuIGZDb2xvck1hbmFnZXI7Ci0JfQorICAgICAgICBjb3VudGVyICs9IDE7CisgICAgICAgIHJldHVybiBmQ29sb3JNYW5hZ2VyOworICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoc3RvcmUsIFBfREVGQVVMVCwgREVGQVVMVCk7Ci0JCVByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdChzdG9yZSwgUF9QUk9DX0lOU1RSLCBQUk9DX0lOU1RSKTsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBQX1NUUklORywgU1RSSU5HKTsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBQX1RBRywgVEFHKTsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBQX1hNTF9DT01NRU5ULCBYTUxfQ09NTUVOVCk7Ci0JCVByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdChzdG9yZSwgUF9IRUFERVJfS0VZLCBIRUFERVJfS0VZKTsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBQX0hFQURFUl9PU0dJLCBIRUFERVJfT1NHSSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoUF9IRUFERVJfT1NHSSArIElQREVDb2xvckNvbnN0YW50cy5QX0JPTERfU1VGRklYLCB0cnVlKTsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBQX0hFQURFUl9WQUxVRSwgSEVBREVSX1ZBTFVFKTsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBQX0hFQURFUl9BVFRSSUJVVEVTLCBIRUFERVJfQVRUUklCVVRFUyk7Ci0JCXN0b3JlLnNldERlZmF1bHQoUF9IRUFERVJfQVRUUklCVVRFUyArIElQREVDb2xvckNvbnN0YW50cy5QX0lUQUxJQ19TVUZGSVgsIHRydWUpOwotCQlQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoc3RvcmUsIFBfSEVBREVSX0FTU0lHTk1FTlQsIEhFQURFUl9BU1NJR05NRU5UKTsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBQX0hFQURFUl9TUFJJTkcsIEhFQURFUl9TUFJJTkcpOwotCQlzdG9yZS5zZXREZWZhdWx0KFBfSEVBREVSX1NQUklORyArIElQREVDb2xvckNvbnN0YW50cy5QX0JPTERfU1VGRklYLCB0cnVlKTsKLQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0cyhJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7CisgICAgICAgIFByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdChzdG9yZSwgUF9ERUZBVUxULCBERUZBVUxUKTsKKyAgICAgICAgUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBQX1BST0NfSU5TVFIsIFBST0NfSU5TVFIpOworICAgICAgICBQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoc3RvcmUsIFBfU1RSSU5HLCBTVFJJTkcpOworICAgICAgICBQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoc3RvcmUsIFBfVEFHLCBUQUcpOworICAgICAgICBQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoc3RvcmUsIFBfWE1MX0NPTU1FTlQsIFhNTF9DT01NRU5UKTsKKyAgICAgICAgUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBQX0hFQURFUl9LRVksIEhFQURFUl9LRVkpOworICAgICAgICBQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoc3RvcmUsIFBfSEVBREVSX09TR0ksIEhFQURFUl9PU0dJKTsKKyAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChQX0hFQURFUl9PU0dJICsgSVBERUNvbG9yQ29uc3RhbnRzLlBfQk9MRF9TVUZGSVgsIHRydWUpOworICAgICAgICBQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoc3RvcmUsIFBfSEVBREVSX1ZBTFVFLCBIRUFERVJfVkFMVUUpOworICAgICAgICBQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoc3RvcmUsIFBfSEVBREVSX0FUVFJJQlVURVMsIEhFQURFUl9BVFRSSUJVVEVTKTsKKyAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChQX0hFQURFUl9BVFRSSUJVVEVTICsgSVBERUNvbG9yQ29uc3RhbnRzLlBfSVRBTElDX1NVRkZJWCwgdHJ1ZSk7CisgICAgICAgIFByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdChzdG9yZSwgUF9IRUFERVJfQVNTSUdOTUVOVCwgSEVBREVSX0FTU0lHTk1FTlQpOworICAgICAgICBQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoc3RvcmUsIFBfSEVBREVSX1NQUklORywgSEVBREVSX1NQUklORyk7CisgICAgICAgIHN0b3JlLnNldERlZmF1bHQoUF9IRUFERVJfU1BSSU5HICsgSVBERUNvbG9yQ29uc3RhbnRzLlBfQk9MRF9TVUZGSVgsIHRydWUpOworICAgIH0KIAotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHBzdG9yZSA9IFBERVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXB1dENvbG9yKHBzdG9yZSwgUF9ERUZBVUxUKTsKLQkJcHV0Q29sb3IocHN0b3JlLCBQX1BST0NfSU5TVFIpOwotCQlwdXRDb2xvcihwc3RvcmUsIFBfU1RSSU5HKTsKLQkJcHV0Q29sb3IocHN0b3JlLCBQX1RBRyk7Ci0JCXB1dENvbG9yKHBzdG9yZSwgUF9YTUxfQ09NTUVOVCk7Ci0JCXB1dENvbG9yKHBzdG9yZSwgUF9IRUFERVJfS0VZKTsKLQkJcHV0Q29sb3IocHN0b3JlLCBQX0hFQURFUl9PU0dJKTsKLQkJcHV0Q29sb3IocHN0b3JlLCBQX0hFQURFUl9WQUxVRSk7Ci0JCXB1dENvbG9yKHBzdG9yZSwgUF9IRUFERVJfQVRUUklCVVRFUyk7Ci0JCXB1dENvbG9yKHBzdG9yZSwgUF9IRUFERVJfQVNTSUdOTUVOVCk7Ci0JCXB1dENvbG9yKHBzdG9yZSwgUF9IRUFERVJfU1BSSU5HKTsKLQkJcHN0b3JlID0gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29tYmluZWRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJZm9yIChTdHJpbmcgZWxlbWVudCA6IElDb2xvck1hbmFnZXIuUFJPUEVSVElFU19DT0xPUlMpIHsKLQkJCXB1dENvbG9yKHBzdG9yZSwgZWxlbWVudCk7Ci0JCX0KLQl9CisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgIElQcmVmZXJlbmNlU3RvcmUgcHN0b3JlID0gUERFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKKyAgICAgICAgcHV0Q29sb3IocHN0b3JlLCBQX0RFRkFVTFQpOworICAgICAgICBwdXRDb2xvcihwc3RvcmUsIFBfUFJPQ19JTlNUUik7CisgICAgICAgIHB1dENvbG9yKHBzdG9yZSwgUF9TVFJJTkcpOworICAgICAgICBwdXRDb2xvcihwc3RvcmUsIFBfVEFHKTsKKyAgICAgICAgcHV0Q29sb3IocHN0b3JlLCBQX1hNTF9DT01NRU5UKTsKKyAgICAgICAgcHV0Q29sb3IocHN0b3JlLCBQX0hFQURFUl9LRVkpOworICAgICAgICBwdXRDb2xvcihwc3RvcmUsIFBfSEVBREVSX09TR0kpOworICAgICAgICBwdXRDb2xvcihwc3RvcmUsIFBfSEVBREVSX1ZBTFVFKTsKKyAgICAgICAgcHV0Q29sb3IocHN0b3JlLCBQX0hFQURFUl9BVFRSSUJVVEVTKTsKKyAgICAgICAgcHV0Q29sb3IocHN0b3JlLCBQX0hFQURFUl9BU1NJR05NRU5UKTsKKyAgICAgICAgcHV0Q29sb3IocHN0b3JlLCBQX0hFQURFUl9TUFJJTkcpOworICAgICAgICBwc3RvcmUgPSBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb21iaW5lZFByZWZlcmVuY2VTdG9yZSgpOworICAgICAgICBmb3IgKFN0cmluZyBlbGVtZW50IDogSUNvbG9yTWFuYWdlci5QUk9QRVJUSUVTX0NPTE9SUykgeworICAgICAgICAgICAgcHV0Q29sb3IocHN0b3JlLCBlbGVtZW50KTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIGRpc3Bvc2VDb2xvcnMoYm9vbGVhbiByZXNldFNpbmdsZXRvbikgewotCQlJdGVyYXRvciBlID0gZkNvbG9yVGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkoKENvbG9yKSBlLm5leHQoKSkuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChyZXNldFNpbmdsZXRvbikgewotCQkJZkNvbG9yTWFuYWdlciA9IG51bGw7Ci0JCX0KKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlQ29sb3JzKGJvb2xlYW4gcmVzZXRTaW5nbGV0b24pIHsKKyAgICAgICAgSXRlcmF0b3IgZSA9IHRoaXMuZkNvbG9yVGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGUuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAoKENvbG9yKSBlLm5leHQoKSkuZGlzcG9zZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXNldFNpbmdsZXRvbikgeworICAgICAgICAgICAgZkNvbG9yTWFuYWdlciA9IG51bGw7CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljb3VudGVyLS07Ci0JCWlmIChjb3VudGVyID09IDApIHsKLQkJCWRpc3Bvc2VDb2xvcnModHJ1ZSk7Ci0JCX0KLQl9CisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgY291bnRlci0tOworICAgICAgICBpZiAoY291bnRlciA9PSAwKSB7CisgICAgICAgICAgICBkaXNwb3NlQ29sb3JzKHRydWUpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIHB1dENvbG9yKElQcmVmZXJlbmNlU3RvcmUgcHN0b3JlLCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcHV0Q29sb3IocHJvcGVydHksIFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IocHN0b3JlLCBwcm9wZXJ0eSkpOwotCX0KKyAgICBwcml2YXRlIHZvaWQgcHV0Q29sb3IoSVByZWZlcmVuY2VTdG9yZSBwc3RvcmUsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICBwdXRDb2xvcihwcm9wZXJ0eSwgUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihwc3RvcmUsIHByb3BlcnR5KSk7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIHB1dENvbG9yKFN0cmluZyBwcm9wZXJ0eSwgUkdCIHNldHRpbmcpIHsKLQkJQ29sb3Igb2xkQ29sb3IgPSAoQ29sb3IpIGZDb2xvclRhYmxlLmdldChwcm9wZXJ0eSk7Ci0JCWlmIChvbGRDb2xvciAhPSBudWxsKSB7Ci0JCQlpZiAob2xkQ29sb3IuZ2V0UkdCKCkuZXF1YWxzKHNldHRpbmcpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJb2xkQ29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCWZDb2xvclRhYmxlLnB1dChwcm9wZXJ0eSwgbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBzZXR0aW5nKSk7Ci0JfQorICAgIHByaXZhdGUgdm9pZCBwdXRDb2xvcihTdHJpbmcgcHJvcGVydHksIFJHQiBzZXR0aW5nKSB7CisgICAgICAgIENvbG9yIG9sZENvbG9yID0gKENvbG9yKSB0aGlzLmZDb2xvclRhYmxlLmdldChwcm9wZXJ0eSk7CisgICAgICAgIGlmIChvbGRDb2xvciAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAob2xkQ29sb3IuZ2V0UkdCKCkuZXF1YWxzKHNldHRpbmcpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2xkQ29sb3IuZGlzcG9zZSgpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZkNvbG9yVGFibGUucHV0KHByb3BlcnR5LCBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIHNldHRpbmcpKTsKKyAgICB9CiAKLQlwdWJsaWMgQ29sb3IgZ2V0Q29sb3IoU3RyaW5nIGtleSkgewotCQlDb2xvciBjb2xvciA9IChDb2xvcikgZkNvbG9yVGFibGUuZ2V0KGtleSk7Ci0JCWlmIChjb2xvciA9PSBudWxsKSB7Ci0JCQljb2xvciA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOwotCQl9Ci0JCXJldHVybiBjb2xvcjsKLQl9CisgICAgcHVibGljIENvbG9yIGdldENvbG9yKFN0cmluZyBrZXkpIHsKKyAgICAgICAgQ29sb3IgY29sb3IgPSAoQ29sb3IpIHRoaXMuZkNvbG9yVGFibGUuZ2V0KGtleSk7CisgICAgICAgIGlmIChjb2xvciA9PSBudWxsKSB7CisgICAgICAgICAgICBjb2xvciA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0ZPUkVHUk9VTkQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb2xvcjsKKyAgICB9CiAKLQlwdWJsaWMgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0IGNvbG9yID0gZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJaWYgKGNvbG9yIGluc3RhbmNlb2YgUkdCKSB7Ci0JCQlwdXRDb2xvcihldmVudC5nZXRQcm9wZXJ0eSgpLCAoUkdCKSBjb2xvcik7Ci0JCX0gZWxzZSB7Ci0JCQlwdXRDb2xvcihldmVudC5nZXRQcm9wZXJ0eSgpLCBTdHJpbmdDb252ZXJ0ZXIuYXNSR0IoY29sb3IudG9TdHJpbmcoKSkpOwotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlRXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworICAgICAgICBPYmplY3QgY29sb3IgPSBldmVudC5nZXROZXdWYWx1ZSgpOworICAgICAgICBpZiAoY29sb3IgaW5zdGFuY2VvZiBSR0IpIHsKKyAgICAgICAgICAgIHB1dENvbG9yKGV2ZW50LmdldFByb3BlcnR5KCksIChSR0IpIGNvbG9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB1dENvbG9yKGV2ZW50LmdldFByb3BlcnR5KCksIFN0cmluZ0NvbnZlcnRlci5hc1JHQihjb2xvci50b1N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvdGV4dC9CdW5kbGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvdGV4dC9CdW5kbGVNYW5pZmVzdENvbmZpZ3VyYXRpb24uamF2YQppbmRleCBkNzIyODYzLi45ZjM4MWYyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvQnVuZGxlTWFuaWZlc3RDb25maWd1cmF0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy90ZXh0L0J1bmRsZU1hbmlmZXN0Q29uZmlndXJhdGlvbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzLnRleHQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CkBAIC0zNiwxNzYgKzM3LDE3NiBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlTWFuaWZlc3RDb25maWd1cmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RQZGVNYW5pZmVzdENvbmZpZ3VyYXRpb24gewogCi0JcHJpdmF0ZSBCdW5kbGVNYW5pZmVzdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZkNvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3I7CisgICAgcHJpdmF0ZSBCdW5kbGVNYW5pZmVzdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZkNvbnRlbnRBc3Npc3RhbnRQcm9jZXNzb3I7CiAKLQlwcm90ZWN0ZWQgY2xhc3MgQnVuZGxlTWFuaWZlc3RIZWFkZXJTY2FubmVyIGV4dGVuZHMgTWFuaWZlc3RIZWFkZXJTY2FubmVyIHsKKyAgICBwcm90ZWN0ZWQgY2xhc3MgQnVuZGxlTWFuaWZlc3RIZWFkZXJTY2FubmVyIGV4dGVuZHMgTWFuaWZlc3RIZWFkZXJTY2FubmVyIHsKIAotCQlwcml2YXRlIFRva2VuIHNwcmluZ1Rva2VuOworICAgICAgICBwcml2YXRlIFRva2VuIHNwcmluZ1Rva2VuOwogCi0JCXB1YmxpYyBCdW5kbGVNYW5pZmVzdEhlYWRlclNjYW5uZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9CisgICAgICAgIHB1YmxpYyBCdW5kbGVNYW5pZmVzdEhlYWRlclNjYW5uZXIoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGFmZmVjdHNUZXh0UHJlc2VudGF0aW9uKFN0cmluZyBwcm9wZXJ0eSkgewotCQkJaWYgKHByb3BlcnR5LnN0YXJ0c1dpdGgoSVNwcmluZ0NvbG9yQ29uc3RhbnRzLlBfSEVBREVSX1NQUklORykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5hZmZlY3RzVGV4dFByZXNlbnRhdGlvbihwcm9wZXJ0eSk7Ci0JCX0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFmZmVjdHNUZXh0UHJlc2VudGF0aW9uKFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICAgICAgaWYgKHByb3BlcnR5LnN0YXJ0c1dpdGgoSVNwcmluZ0NvbG9yQ29uc3RhbnRzLlBfSEVBREVSX1NQUklORykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5hZmZlY3RzVGV4dFByZXNlbnRhdGlvbihwcm9wZXJ0eSk7CisgICAgICAgIH0KIAotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFRva2VuIGdldFRva2VuQWZmZWN0ZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuc3RhcnRzV2l0aChJU3ByaW5nQ29sb3JDb25zdGFudHMuUF9IRUFERVJfU1BSSU5HKSkgewotCQkJCXJldHVybiBzcHJpbmdUb2tlbjsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRUb2tlbkFmZmVjdGVkKGV2ZW50KTsKLQkJfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRva2VuIGdldFRva2VuQWZmZWN0ZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuc3RhcnRzV2l0aChJU3ByaW5nQ29sb3JDb25zdGFudHMuUF9IRUFERVJfU1BSSU5HKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNwcmluZ1Rva2VuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRva2VuQWZmZWN0ZWQoZXZlbnQpOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCQlmVG9rZW4gPSBuZXcgVG9rZW4oY3JlYXRlVGV4dEF0dHJpYnV0ZShJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfT1NHSSkpOwotCQkJc3ByaW5nVG9rZW4gPSBuZXcgVG9rZW4oY3JlYXRlVGV4dEF0dHJpYnV0ZShJU3ByaW5nQ29sb3JDb25zdGFudHMuUF9IRUFERVJfU1BSSU5HKSk7Ci0JCQlXb3JkUnVsZSBydWxlID0gbmV3IFdvcmRSdWxlKG5ldyBLZXl3b3JkRGV0ZWN0b3IoKSwgVG9rZW4uVU5ERUZJTkVELCB0cnVlKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0FDVElWQVRPUiwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0NBVEVHT1JZLCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfQ0xBU1NQQVRILCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfQ09OVEFDVEFERFJFU1MsIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9DT1BZUklHSFQsIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9ERVNDUklQVElPTiwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0RPQ1VSTCwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0xPQ0FMSVpBVElPTiwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX01BTklGRVNUVkVSU0lPTiwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX05BTUUsIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9OQVRJVkVDT0RFLCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfUkVRVUlSRURFWEVDVVRJT05FTlZJUk9OTUVOVCwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX1VQREFURUxPQ0FUSU9OLCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfVkVORE9SLCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkRZTkFNSUNJTVBPUlRfUEFDS0FHRSwgZlRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuRVhQT1JUX1BBQ0tBR0UsIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoSUNvcmVDb25zdGFudHMuRVhQT1JUX1NFUlZJQ0UsIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QsIGZUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLklNUE9SVF9QQUNLQUdFLCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKElDb3JlQ29uc3RhbnRzLklNUE9SVF9TRVJWSUNFLCBmVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKElDb3JlQ29uc3RhbnRzLlBST1ZJREVfUEFDS0FHRSwgZlRva2VuKTsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgICAgICAgICB0aGlzLmZUb2tlbiA9IG5ldyBUb2tlbihjcmVhdGVUZXh0QXR0cmlidXRlKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9PU0dJKSk7CisgICAgICAgICAgICB0aGlzLnNwcmluZ1Rva2VuID0gbmV3IFRva2VuKGNyZWF0ZVRleHRBdHRyaWJ1dGUoSVNwcmluZ0NvbG9yQ29uc3RhbnRzLlBfSEVBREVSX1NQUklORykpOworICAgICAgICAgICAgV29yZFJ1bGUgcnVsZSA9IG5ldyBXb3JkUnVsZShuZXcgS2V5d29yZERldGVjdG9yKCksIFRva2VuLlVOREVGSU5FRCwgdHJ1ZSk7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9BQ1RJVkFUT1IsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0NBVEVHT1JZLCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9DTEFTU1BBVEgsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0NPTlRBQ1RBRERSRVNTLCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9DT1BZUklHSFQsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0RFU0NSSVBUSU9OLCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9ET0NVUkwsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX0xPQ0FMSVpBVElPTiwgdGhpcy5mVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfTUFOSUZFU1RWRVJTSU9OLCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9OQU1FLCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9OQVRJVkVDT0RFLCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9SRVFVSVJFREVYRUNVVElPTkVOVklST05NRU5ULCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX1VQREFURUxPQ0FUSU9OLCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9WRU5ET1IsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX1ZFUlNJT04sIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuUkVRVUlSRV9CVU5ETEUsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuRFlOQU1JQ0lNUE9SVF9QQUNLQUdFLCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkVYUE9SVF9QQUNLQUdFLCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoSUNvcmVDb25zdGFudHMuRVhQT1JUX1NFUlZJQ0UsIHRoaXMuZlRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuRlJBR01FTlRfSE9TVCwgdGhpcy5mVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5JTVBPUlRfUEFDS0FHRSwgdGhpcy5mVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKElDb3JlQ29uc3RhbnRzLklNUE9SVF9TRVJWSUNFLCB0aGlzLmZUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoSUNvcmVDb25zdGFudHMuUFJPVklERV9QQUNLQUdFLCB0aGlzLmZUb2tlbik7CiAKLQkJCWFkZFJ1bGVzRm9ySGVhZGVycyhydWxlKTsKKyAgICAgICAgICAgIGFkZFJ1bGVzRm9ySGVhZGVycyhydWxlKTsKIAotCQkJc2V0UnVsZXMobmV3IElSdWxlW10geyBydWxlIH0pOwotCQkJc2V0RGVmYXVsdFJldHVyblRva2VuKG5ldyBUb2tlbihjcmVhdGVUZXh0QXR0cmlidXRlKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9LRVkpKSk7Ci0JCX0KKyAgICAgICAgICAgIHNldFJ1bGVzKG5ldyBJUnVsZVtdIHsgcnVsZSB9KTsKKyAgICAgICAgICAgIHNldERlZmF1bHRSZXR1cm5Ub2tlbihuZXcgVG9rZW4oY3JlYXRlVGV4dEF0dHJpYnV0ZShJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfS0VZKSkpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIGFkZFJ1bGVzRm9ySGVhZGVycyhXb3JkUnVsZSBydWxlKSB7Ci0JCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzLnRleHQuaGVhZGVycyIpOwotCQkJRW51bWVyYXRpb248U3RyaW5nPiBoZWFkZXJzID0gYnVuZGxlLmdldEtleXMoKTsKLQkJCXdoaWxlIChoZWFkZXJzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJcnVsZS5hZGRXb3JkKGhlYWRlcnMubmV4dEVsZW1lbnQoKSwgc3ByaW5nVG9rZW4pOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBwcml2YXRlIHZvaWQgYWRkUnVsZXNGb3JIZWFkZXJzKFdvcmRSdWxlIHJ1bGUpIHsKKyAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnMudGV4dC5oZWFkZXJzIik7CisgICAgICAgICAgICBFbnVtZXJhdGlvbjxTdHJpbmc+IGhlYWRlcnMgPSBidW5kbGUuZ2V0S2V5cygpOworICAgICAgICAgICAgd2hpbGUgKGhlYWRlcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBydWxlLmFkZFdvcmQoaGVhZGVycy5uZXh0RWxlbWVudCgpLCB0aGlzLnNwcmluZ1Rva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXByb3RlY3RlZCBjbGFzcyBCdW5kbGVNYW5pZmVzdFZhbHVlU2Nhbm5lciBleHRlbmRzIE1hbmlmZXN0VmFsdWVTY2FubmVyIHsKKyAgICBwcm90ZWN0ZWQgY2xhc3MgQnVuZGxlTWFuaWZlc3RWYWx1ZVNjYW5uZXIgZXh0ZW5kcyBNYW5pZmVzdFZhbHVlU2Nhbm5lciB7CiAKLQkJcHVibGljIEJ1bmRsZU1hbmlmZXN0VmFsdWVTY2FubmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgQnVuZGxlTWFuaWZlc3RWYWx1ZVNjYW5uZXIoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CiAKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCQlJUnVsZVtdIHJ1bGVzID0gbmV3IElSdWxlWzJdOwotCQkJZkFzc2lnbm1lbnRUb2tlbiA9IG5ldyBUb2tlbihjcmVhdGVUZXh0QXR0cmlidXRlKElQREVDb2xvckNvbnN0YW50cy5QX0hFQURFUl9BU1NJR05NRU5UKSk7Ci0JCQlydWxlc1swXSA9IG5ldyBXb3JkUnVsZShuZXcgQXNzaWdubWVudERldGVjdG9yKCksIGZBc3NpZ25tZW50VG9rZW4pOworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgICAgIElSdWxlW10gcnVsZXMgPSBuZXcgSVJ1bGVbMl07CisgICAgICAgICAgICB0aGlzLmZBc3NpZ25tZW50VG9rZW4gPSBuZXcgVG9rZW4oY3JlYXRlVGV4dEF0dHJpYnV0ZShJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfQVNTSUdOTUVOVCkpOworICAgICAgICAgICAgcnVsZXNbMF0gPSBuZXcgV29yZFJ1bGUobmV3IEFzc2lnbm1lbnREZXRlY3RvcigpLCB0aGlzLmZBc3NpZ25tZW50VG9rZW4pOwogCi0JCQlmQXR0cmlidXRlVG9rZW4gPSBuZXcgVG9rZW4oY3JlYXRlVGV4dEF0dHJpYnV0ZShJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfQVRUUklCVVRFUykpOwotCQkJV29yZFJ1bGUgcnVsZSA9IG5ldyBXb3JkUnVsZShuZXcgS2V5d29yZERldGVjdG9yKCkpOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfTkFUSVZFQ09ERV9MQU5HVUFHRSwgZkF0dHJpYnV0ZVRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX05BVElWRUNPREVfT1NOQU1FLCBmQXR0cmlidXRlVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfTkFUSVZFQ09ERV9PU1ZFUlNJT04sIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9OQVRJVkVDT0RFX1BST0NFU1NPUiwgZkF0dHJpYnV0ZVRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRV9BVFRSSUJVVEUsIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OX0FUVFJJQlVURSwgZkF0dHJpYnV0ZVRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuRVhDTFVERV9ESVJFQ1RJVkUsIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkZSQUdNRU5UX0FUVEFDSE1FTlRfRElSRUNUSVZFLCBmQXR0cmlidXRlVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5JTkNMVURFX0RJUkVDVElWRSwgZkF0dHJpYnV0ZVRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuTUFOREFUT1JZX0RJUkVDVElWRSwgZkF0dHJpYnV0ZVRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUsIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLlNJTkdMRVRPTl9ESVJFQ1RJVkUsIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoQ29uc3RhbnRzLlVTRVNfRElSRUNUSVZFLCBmQXR0cmlidXRlVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURSwgZkF0dHJpYnV0ZVRva2VuKTsKLQkJCXJ1bGUuYWRkV29yZChDb25zdGFudHMuVklTSUJJTElUWV9ESVJFQ1RJVkUsIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoSUNvcmVDb25zdGFudHMuRlJJRU5EU19ESVJFQ1RJVkUsIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQlydWxlLmFkZFdvcmQoSUNvcmVDb25zdGFudHMuSU5URVJOQUxfRElSRUNUSVZFLCBmQXR0cmlidXRlVG9rZW4pOwotCQkJcnVsZS5hZGRXb3JkKElDb3JlQ29uc3RhbnRzLlBBQ0tBR0VfU1BFQ0lGSUNBVElPTl9WRVJTSU9OLCBmQXR0cmlidXRlVG9rZW4pOworICAgICAgICAgICAgdGhpcy5mQXR0cmlidXRlVG9rZW4gPSBuZXcgVG9rZW4oY3JlYXRlVGV4dEF0dHJpYnV0ZShJUERFQ29sb3JDb25zdGFudHMuUF9IRUFERVJfQVRUUklCVVRFUykpOworICAgICAgICAgICAgV29yZFJ1bGUgcnVsZSA9IG5ldyBXb3JkUnVsZShuZXcgS2V5d29yZERldGVjdG9yKCkpOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfTkFUSVZFQ09ERV9MQU5HVUFHRSwgdGhpcy5mQXR0cmlidXRlVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfTkFUSVZFQ09ERV9PU05BTUUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuQlVORExFX05BVElWRUNPREVfT1NWRVJTSU9OLCB0aGlzLmZBdHRyaWJ1dGVUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLkJVTkRMRV9OQVRJVkVDT0RFX1BST0NFU1NPUiwgdGhpcy5mQXR0cmlidXRlVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FX0FUVFJJQlVURSwgdGhpcy5mQXR0cmlidXRlVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTl9BVFRSSUJVVEUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuRVhDTFVERV9ESVJFQ1RJVkUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuRlJBR01FTlRfQVRUQUNITUVOVF9ESVJFQ1RJVkUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuSU5DTFVERV9ESVJFQ1RJVkUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChDb25zdGFudHMuTUFOREFUT1JZX0RJUkVDVElWRSwgdGhpcy5mQXR0cmlidXRlVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSwgdGhpcy5mQXR0cmlidXRlVG9rZW4pOworICAgICAgICAgICAgcnVsZS5hZGRXb3JkKENvbnN0YW50cy5TSU5HTEVUT05fRElSRUNUSVZFLCB0aGlzLmZBdHRyaWJ1dGVUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLlVTRVNfRElSRUNUSVZFLCB0aGlzLmZBdHRyaWJ1dGVUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLCB0aGlzLmZBdHRyaWJ1dGVUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoQ29uc3RhbnRzLlZJU0lCSUxJVFlfRElSRUNUSVZFLCB0aGlzLmZBdHRyaWJ1dGVUb2tlbik7CisgICAgICAgICAgICBydWxlLmFkZFdvcmQoSUNvcmVDb25zdGFudHMuRlJJRU5EU19ESVJFQ1RJVkUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChJQ29yZUNvbnN0YW50cy5JTlRFUk5BTF9ESVJFQ1RJVkUsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIHJ1bGUuYWRkV29yZChJQ29yZUNvbnN0YW50cy5QQUNLQUdFX1NQRUNJRklDQVRJT05fVkVSU0lPTiwgdGhpcy5mQXR0cmlidXRlVG9rZW4pOwogCi0JCQkvLyBFQVNURVIgRUdHCi0JCQlmb3IgKFN0cmluZyBlbGVtZW50IDogSUNvcmVDb25zdGFudHMuRUVfVE9LRU5TKSB7Ci0JCQkJcnVsZS5hZGRXb3JkKGVsZW1lbnQsIGZBdHRyaWJ1dGVUb2tlbik7Ci0JCQl9CisgICAgICAgICAgICAvLyBFQVNURVIgRUdHCisgICAgICAgICAgICBmb3IgKFN0cmluZyBlbGVtZW50IDogSUNvcmVDb25zdGFudHMuRUVfVE9LRU5TKSB7CisgICAgICAgICAgICAgICAgcnVsZS5hZGRXb3JkKGVsZW1lbnQsIHRoaXMuZkF0dHJpYnV0ZVRva2VuKTsKKyAgICAgICAgICAgIH0KIAotCQkJYWRkUnVsZXNGb3JBdHRyaWJ1dGVzKHJ1bGUpOwotCQkJcnVsZXNbMV0gPSBydWxlOworICAgICAgICAgICAgYWRkUnVsZXNGb3JBdHRyaWJ1dGVzKHJ1bGUpOworICAgICAgICAgICAgcnVsZXNbMV0gPSBydWxlOwogCi0JCQlzZXRSdWxlcyhydWxlcyk7Ci0JCQlzZXREZWZhdWx0UmV0dXJuVG9rZW4obmV3IFRva2VuKGNyZWF0ZVRleHRBdHRyaWJ1dGUoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX1ZBTFVFKSkpOwotCQl9CisgICAgICAgICAgICBzZXRSdWxlcyhydWxlcyk7CisgICAgICAgICAgICBzZXREZWZhdWx0UmV0dXJuVG9rZW4obmV3IFRva2VuKGNyZWF0ZVRleHRBdHRyaWJ1dGUoSVBERUNvbG9yQ29uc3RhbnRzLlBfSEVBREVSX1ZBTFVFKSkpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIGFkZFJ1bGVzRm9yQXR0cmlidXRlcyhXb3JkUnVsZSBydWxlKSB7Ci0JCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzLnRleHQuYXR0cmlidXRlcyIpOwotCQkJRW51bWVyYXRpb248U3RyaW5nPiBhdHRyaWJ1dGVzID0gYnVuZGxlLmdldEtleXMoKTsKLQkJCXdoaWxlIChhdHRyaWJ1dGVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJcnVsZS5hZGRXb3JkKGF0dHJpYnV0ZXMubmV4dEVsZW1lbnQoKSwgZkF0dHJpYnV0ZVRva2VuKTsKLQkJCX0KLQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgYWRkUnVsZXNGb3JBdHRyaWJ1dGVzKFdvcmRSdWxlIHJ1bGUpIHsKKyAgICAgICAgICAgIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnMudGV4dC5hdHRyaWJ1dGVzIik7CisgICAgICAgICAgICBFbnVtZXJhdGlvbjxTdHJpbmc+IGF0dHJpYnV0ZXMgPSBidW5kbGUuZ2V0S2V5cygpOworICAgICAgICAgICAgd2hpbGUgKGF0dHJpYnV0ZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBydWxlLmFkZFdvcmQoYXR0cmlidXRlcy5uZXh0RWxlbWVudCgpLCB0aGlzLmZBdHRyaWJ1dGVUb2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCX0KKyAgICB9CiAKLQlwdWJsaWMgQnVuZGxlTWFuaWZlc3RDb25maWd1cmF0aW9uKElDb2xvck1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzKG1hbmFnZXIsIG51bGwsIG51bGwpOwotCX0KKyAgICBwdWJsaWMgQnVuZGxlTWFuaWZlc3RDb25maWd1cmF0aW9uKElDb2xvck1hbmFnZXIgbWFuYWdlcikgeworICAgICAgICB0aGlzKG1hbmFnZXIsIG51bGwsIG51bGwpOworICAgIH0KIAotCXB1YmxpYyBCdW5kbGVNYW5pZmVzdENvbmZpZ3VyYXRpb24oSUNvbG9yTWFuYWdlciBtYW5hZ2VyLCBQREVTb3VyY2VQYWdlIHBhZ2UpIHsKLQkJdGhpcyhtYW5hZ2VyLCBwYWdlLCBudWxsKTsKLQl9CisgICAgcHVibGljIEJ1bmRsZU1hbmlmZXN0Q29uZmlndXJhdGlvbihJQ29sb3JNYW5hZ2VyIG1hbmFnZXIsIFBERVNvdXJjZVBhZ2UgcGFnZSkgeworICAgICAgICB0aGlzKG1hbmFnZXIsIHBhZ2UsIG51bGwpOworICAgIH0KIAotCXB1YmxpYyBCdW5kbGVNYW5pZmVzdENvbmZpZ3VyYXRpb24oSUNvbG9yTWFuYWdlciBtYW5hZ2VyLCBQREVTb3VyY2VQYWdlIHBhZ2UsIFN0cmluZyBkb2N1bWVudFBhcnRpdGlvbmluZykgewotCQlzdXBlcihtYW5hZ2VyLCBwYWdlLCBkb2N1bWVudFBhcnRpdGlvbmluZyk7Ci0JCWZQcm9wZXJ0eUtleVNjYW5uZXIgPSBuZXcgQnVuZGxlTWFuaWZlc3RIZWFkZXJTY2FubmVyKCk7Ci0JCWZQcm9wZXJ0eVZhbHVlU2Nhbm5lciA9IG5ldyBCdW5kbGVNYW5pZmVzdFZhbHVlU2Nhbm5lcigpOwotCX0KKyAgICBwdWJsaWMgQnVuZGxlTWFuaWZlc3RDb25maWd1cmF0aW9uKElDb2xvck1hbmFnZXIgbWFuYWdlciwgUERFU291cmNlUGFnZSBwYWdlLCBTdHJpbmcgZG9jdW1lbnRQYXJ0aXRpb25pbmcpIHsKKyAgICAgICAgc3VwZXIobWFuYWdlciwgcGFnZSwgZG9jdW1lbnRQYXJ0aXRpb25pbmcpOworICAgICAgICB0aGlzLmZQcm9wZXJ0eUtleVNjYW5uZXIgPSBuZXcgQnVuZGxlTWFuaWZlc3RIZWFkZXJTY2FubmVyKCk7CisgICAgICAgIHRoaXMuZlByb3BlcnR5VmFsdWVTY2FubmVyID0gbmV3IEJ1bmRsZU1hbmlmZXN0VmFsdWVTY2FubmVyKCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZRdWlja0Fzc2lzdGFudCAhPSBudWxsKSB7Ci0JCQlmUXVpY2tBc3Npc3RhbnQuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChmQ29udGVudEFzc2lzdGFudCAhPSBudWxsKSB7Ci0JCQlmQ29udGVudEFzc2lzdGFudFByb2Nlc3Nvci5kaXNwb3NlKCk7Ci0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgaWYgKHRoaXMuZlF1aWNrQXNzaXN0YW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZlF1aWNrQXNzaXN0YW50LmRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5mQ29udGVudEFzc2lzdGFudCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmZDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yLmRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJQ29udGVudEFzc2lzdGFudCBnZXRDb250ZW50QXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmU291cmNlUGFnZSAhPSBudWxsICYmIGZTb3VyY2VQYWdlLmlzRWRpdGFibGUoKSkgewotCQkJaWYgKGZDb250ZW50QXNzaXN0YW50ID09IG51bGwpIHsKLQkJCQlmQ29udGVudEFzc2lzdGFudCA9IG5ldyBDb250ZW50QXNzaXN0YW50KCk7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlcikpOwotCQkJCWZDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yID0gbmV3IEJ1bmRsZU1hbmlmZXN0Q29udGVudEFzc2lzdFByb2Nlc3NvcihmU291cmNlUGFnZSk7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihmQ29udGVudEFzc2lzdGFudFByb2Nlc3NvciwgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKLQkJCQlmQ29udGVudEFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGZDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yLAotCQkJCQkJTWFuaWZlc3RQYXJ0aXRpb25TY2FubmVyLk1BTklGRVNUX0hFQURFUl9WQUxVRSk7Ci0JCQkJZkNvbnRlbnRBc3Npc3RhbnQuYWRkQ29tcGxldGlvbkxpc3RlbmVyKGZDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yKTsKLQkJCQlmQ29udGVudEFzc2lzdGFudC5zZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKG5ldyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLQkJCQkJcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2wgY3JlYXRlSW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCkgewotCQkJCQkJcmV0dXJuIG5ldyBKRmFjZURlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wocGFyZW50LCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlmQ29udGVudEFzc2lzdGFudC5zZXRDb250ZXh0SW5mb3JtYXRpb25Qb3B1cE9yaWVudGF0aW9uKElDb250ZW50QXNzaXN0YW50LkNPTlRFWFRfSU5GT19BQk9WRSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZkNvbnRlbnRBc3Npc3RhbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJQ29udGVudEFzc2lzdGFudCBnZXRDb250ZW50QXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7CisgICAgICAgIGlmICh0aGlzLmZTb3VyY2VQYWdlICE9IG51bGwgJiYgdGhpcy5mU291cmNlUGFnZS5pc0VkaXRhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmZDb250ZW50QXNzaXN0YW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZDb250ZW50QXNzaXN0YW50ID0gbmV3IENvbnRlbnRBc3Npc3RhbnQoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZDb250ZW50QXNzaXN0YW50LnNldERvY3VtZW50UGFydGl0aW9uaW5nKGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhzb3VyY2VWaWV3ZXIpKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZDb250ZW50QXNzaXN0YW50UHJvY2Vzc29yID0gbmV3IEJ1bmRsZU1hbmlmZXN0Q29udGVudEFzc2lzdFByb2Nlc3Nvcih0aGlzLmZTb3VyY2VQYWdlKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZDb250ZW50QXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IodGhpcy5mQ29udGVudEFzc2lzdGFudFByb2Nlc3NvciwgSURvY3VtZW50LkRFRkFVTFRfQ09OVEVOVF9UWVBFKTsKKyAgICAgICAgICAgICAgICB0aGlzLmZDb250ZW50QXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IodGhpcy5mQ29udGVudEFzc2lzdGFudFByb2Nlc3NvciwgTWFuaWZlc3RQYXJ0aXRpb25TY2FubmVyLk1BTklGRVNUX0hFQURFUl9WQUxVRSk7CisgICAgICAgICAgICAgICAgdGhpcy5mQ29udGVudEFzc2lzdGFudC5hZGRDb21wbGV0aW9uTGlzdGVuZXIodGhpcy5mQ29udGVudEFzc2lzdGFudFByb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgdGhpcy5mQ29udGVudEFzc2lzdGFudC5zZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKG5ldyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKKworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpGYWNlRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChwYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHRoaXMuZkNvbnRlbnRBc3Npc3RhbnQuc2V0Q29udGV4dEluZm9ybWF0aW9uUG9wdXBPcmllbnRhdGlvbihJQ29udGVudEFzc2lzdGFudC5DT05URVhUX0lORk9fQUJPVkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuZkNvbnRlbnRBc3Npc3RhbnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy90ZXh0L0J1bmRsZU1hbmlmZXN0Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy90ZXh0L0J1bmRsZU1hbmlmZXN0Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmluZGV4IDRlNzAxY2IuLmZhNzZkOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvdGV4dC9CdW5kbGVNYW5pZmVzdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvQnVuZGxlTWFuaWZlc3RDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnMudGV4dDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC00Niw0OTkgKzQ3LDQ1NCBAQAogICovCiBwdWJsaWMgY2xhc3MgQnVuZGxlTWFuaWZlc3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RQZGVNYW5pZmVzdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewogCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZkpQOworICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGZKUDsKIAotCXB1YmxpYyBCdW5kbGVNYW5pZmVzdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoUERFU291cmNlUGFnZSBzb3VyY2VQYWdlKSB7Ci0JCXN1cGVyKHNvdXJjZVBhZ2UpOwotCX0KKyAgICBwdWJsaWMgQnVuZGxlTWFuaWZlc3RDb250ZW50QXNzaXN0UHJvY2Vzc29yKFBERVNvdXJjZVBhZ2Ugc291cmNlUGFnZSkgeworICAgICAgICBzdXBlcihzb3VyY2VQYWdlKTsKKyAgICB9CiAKLQlzdGF0aWMgewotCQlMaXN0PFN0cmluZz4gaGVhZGVycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KGZIZWFkZXIpKTsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9ycy50ZXh0LmhlYWRlcnMiKTsKLQkJRW51bWVyYXRpb248U3RyaW5nPiB2YWx1ZXMgPSBidW5kbGUuZ2V0S2V5cygpOwotCQl3aGlsZSAodmFsdWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQloZWFkZXJzLmFkZCh2YWx1ZXMubmV4dEVsZW1lbnQoKSk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChoZWFkZXJzKTsKLQkJZkhlYWRlciA9IGhlYWRlcnMudG9BcnJheShuZXcgU3RyaW5nW2hlYWRlcnMuc2l6ZSgpXSk7Ci0JfQorICAgIHN0YXRpYyB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBoZWFkZXJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoZkhlYWRlcikpOworICAgICAgICBSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzLnRleHQuaGVhZGVycyIpOworICAgICAgICBFbnVtZXJhdGlvbjxTdHJpbmc+IHZhbHVlcyA9IGJ1bmRsZS5nZXRLZXlzKCk7CisgICAgICAgIHdoaWxlICh2YWx1ZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIGhlYWRlcnMuYWRkKHZhbHVlcy5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGhlYWRlcnMpOworICAgICAgICBmSGVhZGVyID0gaGVhZGVycy50b0FycmF5KG5ldyBTdHJpbmdbaGVhZGVycy5zaXplKCldKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVIZWFkZXIoU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgb2Zmc2V0KSB7Ci0JCUFycmF5TGlzdDxCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsPiBjb21wbGV0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKLQkJSUJhc2VNb2RlbCBtb2RlbCA9IGZTb3VyY2VQYWdlLmdldElucHV0Q29udGV4dCgpLmdldE1vZGVsKCk7Ci0JCWludCBsZW5ndGggPSBmSGVhZGVyLmxlbmd0aDsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSUJ1bmRsZU1vZGVsICYmICEoKElCdW5kbGVNb2RlbCkgbW9kZWwpLmlzRnJhZ21lbnRNb2RlbCgpKSB7Ci0JCQktLWxlbmd0aDsKLQkJfQotCQlmb3IgKFN0cmluZyBlbGVtZW50IDogZkhlYWRlcikgewotCQkJaWYgKGVsZW1lbnQucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBjdXJyZW50VmFsdWUsIDAsIGN1cnJlbnRWYWx1ZS5sZW5ndGgoKSkgJiYgZkhlYWRlcnMuZ2V0KGVsZW1lbnQpID09IG51bGwpIHsKLQkJCQlCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCQllbGVtZW50ICsgIjogIiwgZ2V0SW1hZ2UoRl9UWVBFX0hFQURFUiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWVsZW1lbnQsIHN0YXJ0T2Zmc2V0LCBjdXJyZW50VmFsdWUubGVuZ3RoKCkpOwotCQkJCXByb3Bvc2FsLnNldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oZ2V0SmF2YURvYyhlbGVtZW50KSk7Ci0JCQkJY29tcGxldGlvbnMuYWRkKHByb3Bvc2FsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tcGxldGlvbnMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtjb21wbGV0aW9ucy5zaXplKCldKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlSGVhZGVyKFN0cmluZyBjdXJyZW50VmFsdWUsIGludCBzdGFydE9mZnNldCwgaW50IG9mZnNldCkgeworICAgICAgICBBcnJheUxpc3Q8QnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWw+KCk7CisgICAgICAgIElCYXNlTW9kZWwgbW9kZWwgPSB0aGlzLmZTb3VyY2VQYWdlLmdldElucHV0Q29udGV4dCgpLmdldE1vZGVsKCk7CisgICAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIElCdW5kbGVNb2RlbCAmJiAhKChJQnVuZGxlTW9kZWwpIG1vZGVsKS5pc0ZyYWdtZW50TW9kZWwoKSkgeworICAgICAgICB9CisgICAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiBmSGVhZGVyKSB7CisgICAgICAgICAgICBpZiAoZWxlbWVudC5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGN1cnJlbnRWYWx1ZSwgMCwgY3VycmVudFZhbHVlLmxlbmd0aCgpKSAmJiB0aGlzLmZIZWFkZXJzLmdldChlbGVtZW50KSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKGVsZW1lbnQgKyAiOiAiLCBnZXRJbWFnZShGX1RZUEVfSEVBREVSKSwgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCBzdGFydE9mZnNldCwgY3VycmVudFZhbHVlLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBwcm9wb3NhbC5zZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKGdldEphdmFEb2MoZWxlbWVudCkpOworICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLmFkZChwcm9wb3NhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXBsZXRpb25zLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbY29tcGxldGlvbnMuc2l6ZSgpXSk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gc2hvdWxkU3RvcmVTZXQoU3RyaW5nIGhlYWRlcikgewotCQlpZiAoaGVhZGVyLmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfQlVORExFKQotCQkJCXx8IGhlYWRlci5lcXVhbHNJZ25vcmVDYXNlKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlkpCi0JCQkJfHwgaGVhZGVyLmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5FWFBPUlRfVEVNUExBVEUpCi0JCQkJfHwgaGVhZGVyLmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfVEVNUExBVEUpCi0JCQkJfHwgaGVhZGVyLmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9JTVBPUlRTKQotCQkJCXx8IGhlYWRlci5lcXVhbHNJZ25vcmVDYXNlKElIZWFkZXJDb25zdGFudHMuRVhDTFVERURfRVhQT1JUUykKLQkJCQl8fCBoZWFkZXIuZXF1YWxzSWdub3JlQ2FzZShJSGVhZGVyQ29uc3RhbnRzLlVOVkVSU0lPTkVEX0lNUE9SVFMpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuc2hvdWxkU3RvcmVTZXQoaGVhZGVyKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gc2hvdWxkU3RvcmVTZXQoU3RyaW5nIGhlYWRlcikgeworICAgICAgICBpZiAoaGVhZGVyLmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfQlVORExFKSB8fCBoZWFkZXIuZXF1YWxzSWdub3JlQ2FzZShJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9MSUJSQVJZKQorICAgICAgICAgICAgfHwgaGVhZGVyLmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5FWFBPUlRfVEVNUExBVEUpIHx8IGhlYWRlci5lcXVhbHNJZ25vcmVDYXNlKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX1RFTVBMQVRFKQorICAgICAgICAgICAgfHwgaGVhZGVyLmVxdWFsc0lnbm9yZUNhc2UoSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9JTVBPUlRTKSB8fCBoZWFkZXIuZXF1YWxzSWdub3JlQ2FzZShJSGVhZGVyQ29uc3RhbnRzLkVYQ0xVREVEX0VYUE9SVFMpCisgICAgICAgICAgICB8fCBoZWFkZXIuZXF1YWxzSWdub3JlQ2FzZShJSGVhZGVyQ29uc3RhbnRzLlVOVkVSU0lPTkVEX0lNUE9SVFMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuc2hvdWxkU3RvcmVTZXQoaGVhZGVyKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVWYWx1ZShJRG9jdW1lbnQgZG9jLCBpbnQgc3RhcnRPZmZzZXQsIGludCBvZmZzZXQpCi0JCQl0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgdmFsdWUgPSBkb2MuZ2V0KHN0YXJ0T2Zmc2V0LCBvZmZzZXQgLSBzdGFydE9mZnNldCk7Ci0JCWludCBsaW5lTnVtID0gZG9jLmdldExpbmVPZk9mZnNldChzdGFydE9mZnNldCkgLSAxOwotCQlpbnQgaW5kZXg7Ci0JCXdoaWxlICgoaW5kZXggPSB2YWx1ZS5pbmRleE9mKCc6JykpID09IC0xCi0JCQkJfHwgKCh2YWx1ZS5sZW5ndGgoKSAtIDEgIT0gaW5kZXgpICYmICh2YWx1ZS5jaGFyQXQoaW5kZXggKyAxKSA9PSAnPScpKSkgewotCQkJaW50IHN0YXJ0TGluZSA9IGRvYy5nZXRMaW5lT2Zmc2V0KGxpbmVOdW0pOwotCQkJdmFsdWUgPSBkb2MuZ2V0KHN0YXJ0TGluZSwgb2Zmc2V0IC0gc3RhcnRMaW5lKTsKLQkJCWxpbmVOdW0tLTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCWlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSwgMCwKLQkJCQlNYXRoLm1pbihsZW5ndGgsIElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRS5sZW5ndGgoKSkpKSB7Ci0JCQlyZXR1cm4gaGFuZGxlSW1wb3J0QnVuZGxlQ29tcGxldGlvbih2YWx1ZS5zdWJzdHJpbmcoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfQlVORExFLmxlbmd0aCgpICsgMSksIG9mZnNldCk7Ci0JCX0KLQkJaWYgKHZhbHVlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSwgMCwKLQkJCQlNYXRoLm1pbihsZW5ndGgsIElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlkubGVuZ3RoKCkpKSkgewotCQkJcmV0dXJuIGhhbmRsZUltcG9ydExpYnJhcnlDb21wbGV0aW9uKHZhbHVlLnN1YnN0cmluZyhJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9MSUJSQVJZLmxlbmd0aCgpICsgMSksIG9mZnNldCk7Ci0JCX0KLQkJaWYgKHZhbHVlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfVEVNUExBVEUsIDAsCi0JCQkJTWF0aC5taW4obGVuZ3RoLCBJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9URU1QTEFURS5sZW5ndGgoKSkpKSB7Ci0JCQlyZXR1cm4gaGFuZGxlSW1wb3J0UGFja2FnZUNvbXBsZXRpb24odmFsdWUuc3Vic3RyaW5nKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX1RFTVBMQVRFLmxlbmd0aCgpICsgMSksIG9mZnNldCk7Ci0JCX0KLQkJaWYgKHZhbHVlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgSUhlYWRlckNvbnN0YW50cy5FWFBPUlRfVEVNUExBVEUsIDAsCi0JCQkJTWF0aC5taW4obGVuZ3RoLCBJSGVhZGVyQ29uc3RhbnRzLkVYUE9SVF9URU1QTEFURS5sZW5ndGgoKSkpKSB7Ci0JCQlyZXR1cm4gaGFuZGxlRXhwb3J0UGFja2FnZUNvbXBsZXRpb24odmFsdWUuc3Vic3RyaW5nKElIZWFkZXJDb25zdGFudHMuRVhQT1JUX1RFTVBMQVRFLmxlbmd0aCgpICsgMSksIG9mZnNldCk7Ci0JCX0KLQkJaWYgKHZhbHVlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9JTVBPUlRTLCAwLAotCQkJCU1hdGgubWluKGxlbmd0aCwgSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9JTVBPUlRTLmxlbmd0aCgpKSkpIHsKLQkJCXJldHVybiBoYW5kbGVJbXBvcnRQYWNrYWdlQ29tcGxldGlvbih2YWx1ZS5zdWJzdHJpbmcoSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9JTVBPUlRTLmxlbmd0aCgpICsgMSksCi0JCQkJCW9mZnNldCk7Ci0JCX0KLQkJaWYgKHZhbHVlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9FWFBPUlRTLCAwLAotCQkJCU1hdGgubWluKGxlbmd0aCwgSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9FWFBPUlRTLmxlbmd0aCgpKSkpIHsKLQkJCXJldHVybiBoYW5kbGVFeHBvcnRQYWNrYWdlQ29tcGxldGlvbih2YWx1ZS5zdWJzdHJpbmcoSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9FWFBPUlRTLmxlbmd0aCgpICsgMSksCi0JCQkJCW9mZnNldCk7Ci0JCX0KLQkJaWYgKHZhbHVlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgSUhlYWRlckNvbnN0YW50cy5VTlZFUlNJT05FRF9JTVBPUlRTLCAwLAotCQkJCU1hdGgubWluKGxlbmd0aCwgSUhlYWRlckNvbnN0YW50cy5VTlZFUlNJT05FRF9JTVBPUlRTLmxlbmd0aCgpKSkpIHsKLQkJCXJldHVybiBoYW5kbGVJbXBvcnRQYWNrYWdlQ29tcGxldGlvbih2YWx1ZS5zdWJzdHJpbmcoSUhlYWRlckNvbnN0YW50cy5VTlZFUlNJT05FRF9JTVBPUlRTLmxlbmd0aCgpICsgMSksCi0JCQkJCW9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVWYWx1ZShkb2MsIHN0YXJ0T2Zmc2V0LCBvZmZzZXQpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVWYWx1ZShJRG9jdW1lbnQgZG9jLCBpbnQgc3RhcnRPZmZzZXQsIGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGRvYy5nZXQoc3RhcnRPZmZzZXQsIG9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKKyAgICAgICAgaW50IGxpbmVOdW0gPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0T2Zmc2V0KSAtIDE7CisgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgd2hpbGUgKChpbmRleCA9IHZhbHVlLmluZGV4T2YoJzonKSkgPT0gLTEgfHwgdmFsdWUubGVuZ3RoKCkgLSAxICE9IGluZGV4ICYmIHZhbHVlLmNoYXJBdChpbmRleCArIDEpID09ICc9JykgeworICAgICAgICAgICAgaW50IHN0YXJ0TGluZSA9IGRvYy5nZXRMaW5lT2Zmc2V0KGxpbmVOdW0pOworICAgICAgICAgICAgdmFsdWUgPSBkb2MuZ2V0KHN0YXJ0TGluZSwgb2Zmc2V0IC0gc3RhcnRMaW5lKTsKKyAgICAgICAgICAgIGxpbmVOdW0tLTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7CisgICAgICAgIGlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSwgMCwgTWF0aC5taW4obGVuZ3RoLCBJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9CVU5ETEUubGVuZ3RoKCkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUltcG9ydEJ1bmRsZUNvbXBsZXRpb24odmFsdWUuc3Vic3RyaW5nKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRS5sZW5ndGgoKSArIDEpLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlksIDAsIE1hdGgubWluKGxlbmd0aCwgSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWS5sZW5ndGgoKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlSW1wb3J0TGlicmFyeUNvbXBsZXRpb24odmFsdWUuc3Vic3RyaW5nKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlkubGVuZ3RoKCkgKyAxKSwgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9URU1QTEFURSwgMCwgTWF0aC5taW4obGVuZ3RoLCBJSGVhZGVyQ29uc3RhbnRzLklNUE9SVF9URU1QTEFURS5sZW5ndGgoKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlSW1wb3J0UGFja2FnZUNvbXBsZXRpb24odmFsdWUuc3Vic3RyaW5nKElIZWFkZXJDb25zdGFudHMuSU1QT1JUX1RFTVBMQVRFLmxlbmd0aCgpICsgMSksIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgSUhlYWRlckNvbnN0YW50cy5FWFBPUlRfVEVNUExBVEUsIDAsIE1hdGgubWluKGxlbmd0aCwgSUhlYWRlckNvbnN0YW50cy5FWFBPUlRfVEVNUExBVEUubGVuZ3RoKCkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUV4cG9ydFBhY2thZ2VDb21wbGV0aW9uKHZhbHVlLnN1YnN0cmluZyhJSGVhZGVyQ29uc3RhbnRzLkVYUE9SVF9URU1QTEFURS5sZW5ndGgoKSArIDEpLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIElIZWFkZXJDb25zdGFudHMuRVhDTFVERURfSU1QT1JUUywgMCwgTWF0aC5taW4obGVuZ3RoLCBJSGVhZGVyQ29uc3RhbnRzLkVYQ0xVREVEX0lNUE9SVFMubGVuZ3RoKCkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUltcG9ydFBhY2thZ2VDb21wbGV0aW9uKHZhbHVlLnN1YnN0cmluZyhJSGVhZGVyQ29uc3RhbnRzLkVYQ0xVREVEX0lNUE9SVFMubGVuZ3RoKCkgKyAxKSwgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBJSGVhZGVyQ29uc3RhbnRzLkVYQ0xVREVEX0VYUE9SVFMsIDAsIE1hdGgubWluKGxlbmd0aCwgSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9FWFBPUlRTLmxlbmd0aCgpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVFeHBvcnRQYWNrYWdlQ29tcGxldGlvbih2YWx1ZS5zdWJzdHJpbmcoSUhlYWRlckNvbnN0YW50cy5FWENMVURFRF9FWFBPUlRTLmxlbmd0aCgpICsgMSksIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgSUhlYWRlckNvbnN0YW50cy5VTlZFUlNJT05FRF9JTVBPUlRTLCAwLCBNYXRoLm1pbihsZW5ndGgsIElIZWFkZXJDb25zdGFudHMuVU5WRVJTSU9ORURfSU1QT1JUUy5sZW5ndGgoKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlSW1wb3J0UGFja2FnZUNvbXBsZXRpb24odmFsdWUuc3Vic3RyaW5nKElIZWFkZXJDb25zdGFudHMuVU5WRVJTSU9ORURfSU1QT1JUUy5sZW5ndGgoKSArIDEpLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5jb21wdXRlVmFsdWUoZG9jLCBzdGFydE9mZnNldCwgb2Zmc2V0KTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZUltcG9ydFBhY2thZ2VDb21wbGV0aW9uKFN0cmluZyBjdXJyZW50VmFsdWUsIGludCBvZmZzZXQpIHsKLQkJaW50IGNvbW1hID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCcsJyk7Ci0JCWludCBzZW1pY29sb24gPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJzsnKTsKLQkJU3RyaW5nIHZhbHVlID0gY29tbWEgIT0gLTEgPyBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGNvbW1hICsgMSkgOiBjdXJyZW50VmFsdWU7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBoYW5kbGVJbXBvcnRQYWNrYWdlQ29tcGxldGlvbihTdHJpbmcgY3VycmVudFZhbHVlLCBpbnQgb2Zmc2V0KSB7CisgICAgICAgIGludCBjb21tYSA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignLCcpOworICAgICAgICBpbnQgc2VtaWNvbG9uID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCc7Jyk7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNvbW1hICE9IC0xID8gY3VycmVudFZhbHVlLnN1YnN0cmluZyhjb21tYSArIDEpIDogY3VycmVudFZhbHVlOwogCi0JCWlmIChjb21tYSA+IHNlbWljb2xvbiB8fCBjb21tYSA9PSBzZW1pY29sb24pIHsKLQkJCUhhc2hTZXQgc2V0ID0gKEhhc2hTZXQpIGZIZWFkZXJzLmdldChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UpOwotCQkJaWYgKHNldCA9PSBudWxsKSB7Ci0JCQkJc2V0ID0gcGFyc2VIZWFkZXJGb3JWYWx1ZXMoY3VycmVudFZhbHVlLCBvZmZzZXQpOwotCQkJfQorICAgICAgICBpZiAoY29tbWEgPiBzZW1pY29sb24gfHwgY29tbWEgPT0gc2VtaWNvbG9uKSB7CisgICAgICAgICAgICBIYXNoU2V0IHNldCA9IChIYXNoU2V0KSB0aGlzLmZIZWFkZXJzLmdldChDb25zdGFudHMuSU1QT1JUX1BBQ0tBR0UpOworICAgICAgICAgICAgaWYgKHNldCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0ID0gcGFyc2VIZWFkZXJGb3JWYWx1ZXMoY3VycmVudFZhbHVlLCBvZmZzZXQpOworICAgICAgICAgICAgfQogCi0JCQl2YWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXModmFsdWUpOwotCQkJaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotCQkJc2V0LnJlbW92ZSh2YWx1ZSk7Ci0JCQlBcnJheUxpc3Q8QnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWw+KCk7CisgICAgICAgICAgICB2YWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXModmFsdWUpOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOworICAgICAgICAgICAgc2V0LnJlbW92ZSh2YWx1ZSk7CisgICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWw+KCk7CiAKLQkJCVNldDxQYWNrYWdlRXhwb3J0PiBwYWNrYWdlcyA9IFJlcG9zaXRvcnlVdGlscy5nZXRJbXBvcnRQYWNrYWdlUHJvcG9zYWxzKGdldFByb2plY3QoKSwgdmFsdWUpOwotCQkJZm9yIChQYWNrYWdlRXhwb3J0IHByb3Bvc2FsIDogcGFja2FnZXMpIHsKLQkJCQlpZiAoIXNldC5jb250YWlucyhwcm9wb3NhbC5nZXROYW1lKCkpKSB7Ci0JCQkJCWNvbXBsZXRpb25zLmFkZChuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbC5nZXROYW1lKCksIGdldEltYWdlKEZfVFlQRV9QS0cpLAotCQkJCQkJCXByb3Bvc2FsLmdldE5hbWUoKSwgb2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpKTsKLQkJCQkJc2V0LmFkZChwcm9wb3NhbC5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIFNldDxQYWNrYWdlRXhwb3J0PiBwYWNrYWdlcyA9IFJlcG9zaXRvcnlVdGlscy5nZXRJbXBvcnRQYWNrYWdlUHJvcG9zYWxzKGdldFByb2plY3QoKSwgdmFsdWUpOworICAgICAgICAgICAgZm9yIChQYWNrYWdlRXhwb3J0IHByb3Bvc2FsIDogcGFja2FnZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNldC5jb250YWlucyhwcm9wb3NhbC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsLmdldE5hbWUoKSwgZ2V0SW1hZ2UoRl9UWVBFX1BLRyksIHByb3Bvc2FsLmdldE5hbWUoKSwgb2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChwcm9wb3NhbC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGNvbXBsZXRpb25zLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbY29tcGxldGlvbnMuc2l6ZSgpXSk7Ci0JCQlzb3J0Q29tcGxldGlvbnMocHJvcG9zYWxzKTsKLQkJCXJldHVybiBwcm9wb3NhbHM7Ci0JCX0KKyAgICAgICAgICAgIElDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBjb21wbGV0aW9ucy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2NvbXBsZXRpb25zLnNpemUoKV0pOworICAgICAgICAgICAgc29ydENvbXBsZXRpb25zKHByb3Bvc2Fscyk7CisgICAgICAgICAgICByZXR1cm4gcHJvcG9zYWxzOworICAgICAgICB9CiAKLQkJaW50IGVxdWFscyA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignPScpOwotCQlpZiAoZXF1YWxzID09IC0xIHx8IHNlbWljb2xvbiA+IGVxdWFscykgewotCQkJU3RyaW5nW10gdmFsaWRBdHRzID0gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLCBDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUgfTsKLQkJCUludGVnZXJbXSB2YWxpZFR5cGVzID0gbmV3IEludGVnZXJbXSB7IG5ldyBJbnRlZ2VyKEZfVFlQRV9BVFRSSUJVVEUpLCBuZXcgSW50ZWdlcihGX1RZUEVfRElSRUNUSVZFKSB9OwotCQkJcmV0dXJuIGhhbmRsZUF0dHJzQW5kRGlyZWN0aXZlcyh2YWx1ZSwgaW5pdGlhbGl6ZU5ld0xpc3QodmFsaWRBdHRzKSwgaW5pdGlhbGl6ZU5ld0xpc3QodmFsaWRUeXBlcyksIG9mZnNldCk7Ci0JCX0KKyAgICAgICAgaW50IGVxdWFscyA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignPScpOworICAgICAgICBpZiAoZXF1YWxzID09IC0xIHx8IHNlbWljb2xvbiA+IGVxdWFscykgeworICAgICAgICAgICAgU3RyaW5nW10gdmFsaWRBdHRzID0gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLCBDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUgfTsKKyAgICAgICAgICAgIEludGVnZXJbXSB2YWxpZFR5cGVzID0gbmV3IEludGVnZXJbXSB7IG5ldyBJbnRlZ2VyKEZfVFlQRV9BVFRSSUJVVEUpLCBuZXcgSW50ZWdlcihGX1RZUEVfRElSRUNUSVZFKSB9OworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUF0dHJzQW5kRGlyZWN0aXZlcyh2YWx1ZSwgaW5pdGlhbGl6ZU5ld0xpc3QodmFsaWRBdHRzKSwgaW5pdGlhbGl6ZU5ld0xpc3QodmFsaWRUeXBlcyksIG9mZnNldCk7CisgICAgICAgIH0KIAotCQlTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoc2VtaWNvbG9uICsgMSkpOwotCQlpZiAoQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgYXR0cmlidXRlVmFsdWUsIDAsCi0JCQkJQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLmxlbmd0aCgpKSkgewotCQkJcmV0dXJuIG1hdGNoVmFsdWVDb21wbGV0aW9uKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZXF1YWxzICsgMSksIG5ldyBTdHJpbmdbXSB7Ci0JCQkJCUNvbnN0YW50cy5SRVNPTFVUSU9OX01BTkRBVE9SWSwgQ29uc3RhbnRzLlJFU09MVVRJT05fT1BUSU9OQUwgfSwgbmV3IGludFtdIHsgRl9UWVBFX1ZBTFVFLAotCQkJCQlGX1RZUEVfVkFMVUUgfSwgb2Zmc2V0LCAiUkVTT0xVVElPTl8iKTsKLQkJfQotCQlpZiAoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgYXR0cmlidXRlVmFsdWUsIDAsIENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURS5sZW5ndGgoKSkpIHsKLQkJCVN0cmluZyBwbHVnaW5JZCA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZygoY29tbWEgPT0gLTEpID8gMCA6IGNvbW1hICsgMSwgc2VtaWNvbG9uKSk7Ci0JCQlyZXR1cm4gZ2V0UGFja2FnZVZlcnNpb25Db21wbGV0aW9ucyhwbHVnaW5JZCwgcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGVxdWFscyArIDEpKSwKLQkJCQkJb2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JfQorICAgICAgICBTdHJpbmcgYXR0cmlidXRlVmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoc2VtaWNvbG9uICsgMSkpOworICAgICAgICBpZiAoQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgYXR0cmlidXRlVmFsdWUsIDAsIENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaFZhbHVlQ29tcGxldGlvbihjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGVxdWFscyArIDEpLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5SRVNPTFVUSU9OX01BTkRBVE9SWSwgQ29uc3RhbnRzLlJFU09MVVRJT05fT1BUSU9OQUwgfSwgbmV3IGludFtdIHsgRl9UWVBFX1ZBTFVFLCBGX1RZUEVfVkFMVUUgfSwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICJSRVNPTFVUSU9OXyIpOworICAgICAgICB9CisgICAgICAgIGlmIChDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwgQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLmxlbmd0aCgpKSkgeworICAgICAgICAgICAgU3RyaW5nIHBsdWdpbklkID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGNvbW1hID09IC0xID8gMCA6IGNvbW1hICsgMSwgc2VtaWNvbG9uKSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UGFja2FnZVZlcnNpb25Db21wbGV0aW9ucyhwbHVnaW5JZCwgcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGVxdWFscyArIDEpKSwgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07CisgICAgfQogCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBoYW5kbGVGcmFnbWVudEhvc3RDb21wbGV0aW9uKFN0cmluZyBjdXJyZW50VmFsdWUsIGludCBvZmZzZXQpIHsKLQkJaW50IGNvbW1hID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCcsJyk7Ci0JCWludCBzZW1pY29sb24gPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJzsnKTsKLQkJU3RyaW5nIHZhbHVlID0gY29tbWEgIT0gLTEgPyBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGNvbW1hICsgMSkgOiBjdXJyZW50VmFsdWU7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBoYW5kbGVGcmFnbWVudEhvc3RDb21wbGV0aW9uKFN0cmluZyBjdXJyZW50VmFsdWUsIGludCBvZmZzZXQpIHsKKyAgICAgICAgaW50IGNvbW1hID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCcsJyk7CisgICAgICAgIGludCBzZW1pY29sb24gPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJzsnKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gY29tbWEgIT0gLTEgPyBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGNvbW1hICsgMSkgOiBjdXJyZW50VmFsdWU7CiAKLQkJaWYgKGNvbW1hID4gc2VtaWNvbG9uIHx8IGNvbW1hID09IHNlbWljb2xvbikgewotCQkJU2V0PFN0cmluZz4gc2V0ID0gKEhhc2hTZXQ8U3RyaW5nPikgZkhlYWRlcnMuZ2V0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSk7Ci0JCQlpZiAoc2V0ID09IG51bGwpIHsKLQkJCQlzZXQgPSBwYXJzZUhlYWRlckZvclZhbHVlcyhjdXJyZW50VmFsdWUsIG9mZnNldCk7Ci0JCQl9CisgICAgICAgIGlmIChjb21tYSA+IHNlbWljb2xvbiB8fCBjb21tYSA9PSBzZW1pY29sb24pIHsKKyAgICAgICAgICAgIFNldDxTdHJpbmc+IHNldCA9IChIYXNoU2V0PFN0cmluZz4pIHRoaXMuZkhlYWRlcnMuZ2V0KENvbnN0YW50cy5SRVFVSVJFX0JVTkRMRSk7CisgICAgICAgICAgICBpZiAoc2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXQgPSBwYXJzZUhlYWRlckZvclZhbHVlcyhjdXJyZW50VmFsdWUsIG9mZnNldCk7CisgICAgICAgICAgICB9CiAKLQkJCXZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyh2YWx1ZSk7Ci0JCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCQlzZXQucmVtb3ZlKHZhbHVlKTsKLQkJCUFycmF5TGlzdDxCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsPiBjb21wbGV0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKKyAgICAgICAgICAgIHZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyh2YWx1ZSk7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7CisgICAgICAgICAgICBzZXQucmVtb3ZlKHZhbHVlKTsKKyAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsPiBjb21wbGV0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKIAotCQkJU2V0PEFydGVmYWN0PiBidW5kbGVzID0gUmVwb3NpdG9yeVV0aWxzLmdldEltcG9ydEJ1bmRsZVByb3Bvc2FscyhnZXRQcm9qZWN0KCksIHZhbHVlKTsKLQkJCWZvciAoSUFydGVmYWN0IHByb3Bvc2FsIDogYnVuZGxlcykgewotCQkJCWlmICghc2V0LmNvbnRhaW5zKHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpKSkgewotCQkJCQljb21wbGV0aW9ucy5hZGQobmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJZ2V0SW1hZ2UoRl9UWVBFX0JVTkRMRSksIHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCkpOwotCQkJCQlzZXQuYWRkKHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBTZXQ8QXJ0ZWZhY3Q+IGJ1bmRsZXMgPSBSZXBvc2l0b3J5VXRpbHMuZ2V0SW1wb3J0QnVuZGxlUHJvcG9zYWxzKGdldFByb2plY3QoKSwgdmFsdWUpOworICAgICAgICAgICAgZm9yIChJQXJ0ZWZhY3QgcHJvcG9zYWwgOiBidW5kbGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzZXQuY29udGFpbnMocHJvcG9zYWwuZ2V0U3ltYm9saWNOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLmFkZChuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbC5nZXRTeW1ib2xpY05hbWUoKSwgZ2V0SW1hZ2UoRl9UWVBFX0JVTkRMRSksIHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChwcm9wb3NhbC5nZXRTeW1ib2xpY05hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gY29tcGxldGlvbnMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtjb21wbGV0aW9ucy5zaXplKCldKTsKLQkJCXNvcnRDb21wbGV0aW9ucyhwcm9wb3NhbHMpOwotCQkJcmV0dXJuIHByb3Bvc2FsczsKLQkJfQotCQlpbnQgZXF1YWxzID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCc9Jyk7Ci0JCWlmIChlcXVhbHMgPT0gLTEgfHwgc2VtaWNvbG9uID4gZXF1YWxzKSB7Ci0JCQlyZXR1cm4gbWF0Y2hWYWx1ZUNvbXBsZXRpb24ocmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKHNlbWljb2xvbiArIDEpKSwKLQkJCQkJbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OX0FUVFJJQlVURSB9LCBuZXcgaW50W10geyBGX1RZUEVfQVRUUklCVVRFIH0sIG9mZnNldCk7Ci0JCX0KLQkJU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKHNlbWljb2xvbiArIDEpKTsKLQkJaWYgKENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTl9BVFRSSUJVVEUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwKLQkJCQlDb25zdGFudHMuQlVORExFX1ZFUlNJT05fQVRUUklCVVRFLmxlbmd0aCgpKSkgewotCQkJU3RyaW5nIHBsdWdpbklkID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKChjb21tYSA9PSAtMSkgPyAwIDogY29tbWEgKyAxLCBzZW1pY29sb24pKTsKLQkJCXJldHVybiBnZXRTcHJpbmdCdW5kbGVWZXJzaW9uQ29tcGxldGlvbnMocGx1Z2luSWQsIHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSksCi0JCQkJCW9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCX0KKyAgICAgICAgICAgIElDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBjb21wbGV0aW9ucy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2NvbXBsZXRpb25zLnNpemUoKV0pOworICAgICAgICAgICAgc29ydENvbXBsZXRpb25zKHByb3Bvc2Fscyk7CisgICAgICAgICAgICByZXR1cm4gcHJvcG9zYWxzOworICAgICAgICB9CisgICAgICAgIGludCBlcXVhbHMgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJz0nKTsKKyAgICAgICAgaWYgKGVxdWFscyA9PSAtMSB8fCBzZW1pY29sb24gPiBlcXVhbHMpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRjaFZhbHVlQ29tcGxldGlvbihyZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoc2VtaWNvbG9uICsgMSkpLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTl9BVFRSSUJVVEUgfSwgbmV3IGludFtdIHsgRl9UWVBFX0FUVFJJQlVURSB9LCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhzZW1pY29sb24gKyAxKSk7CisgICAgICAgIGlmIChDb25zdGFudHMuQlVORExFX1ZFUlNJT05fQVRUUklCVVRFLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgYXR0cmlidXRlVmFsdWUsIDAsIENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTl9BVFRSSUJVVEUubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICBTdHJpbmcgcGx1Z2luSWQgPSByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY29tbWEgPT0gLTEgPyAwIDogY29tbWEgKyAxLCBzZW1pY29sb24pKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRTcHJpbmdCdW5kbGVWZXJzaW9uQ29tcGxldGlvbnMocGx1Z2luSWQsIHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSksIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOworICAgIH0KIAotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZUltcG9ydExpYnJhcnlDb21wbGV0aW9uKFN0cmluZyBjdXJyZW50VmFsdWUsIGludCBvZmZzZXQpIHsKLQkJaW50IGNvbW1hID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCcsJyk7Ci0JCWludCBzZW1pY29sb24gPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJzsnKTsKLQkJU3RyaW5nIHZhbHVlID0gY29tbWEgIT0gLTEgPyBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGNvbW1hICsgMSkgOiBjdXJyZW50VmFsdWU7CisgICAgcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsW10gaGFuZGxlSW1wb3J0TGlicmFyeUNvbXBsZXRpb24oU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IG9mZnNldCkgeworICAgICAgICBpbnQgY29tbWEgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJywnKTsKKyAgICAgICAgaW50IHNlbWljb2xvbiA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignOycpOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBjb21tYSAhPSAtMSA/IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY29tbWEgKyAxKSA6IGN1cnJlbnRWYWx1ZTsKIAotCQlpZiAoY29tbWEgPiBzZW1pY29sb24gfHwgY29tbWEgPT0gc2VtaWNvbG9uKSB7Ci0JCQlIYXNoU2V0IHNldCA9IChIYXNoU2V0KSBmSGVhZGVycy5nZXQoSUhlYWRlckNvbnN0YW50cy5JTVBPUlRfTElCUkFSWSk7Ci0JCQlpZiAoc2V0ID09IG51bGwpIHsKLQkJCQlzZXQgPSBwYXJzZUhlYWRlckZvclZhbHVlcyhjdXJyZW50VmFsdWUsIG9mZnNldCk7Ci0JCQl9CisgICAgICAgIGlmIChjb21tYSA+IHNlbWljb2xvbiB8fCBjb21tYSA9PSBzZW1pY29sb24pIHsKKyAgICAgICAgICAgIEhhc2hTZXQgc2V0ID0gKEhhc2hTZXQpIHRoaXMuZkhlYWRlcnMuZ2V0KElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0xJQlJBUlkpOworICAgICAgICAgICAgaWYgKHNldCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0ID0gcGFyc2VIZWFkZXJGb3JWYWx1ZXMoY3VycmVudFZhbHVlLCBvZmZzZXQpOworICAgICAgICAgICAgfQogCi0JCQl2YWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXModmFsdWUpOwotCQkJaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotCQkJc2V0LnJlbW92ZSh2YWx1ZSk7Ci0JCQlBcnJheUxpc3Q8QnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWw+KCk7CisgICAgICAgICAgICB2YWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXModmFsdWUpOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOworICAgICAgICAgICAgc2V0LnJlbW92ZSh2YWx1ZSk7CisgICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcGxldGlvbnMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWw+KCk7CiAKLQkJCVNldDxBcnRlZmFjdD4gbGlicmFyaWVzID0gUmVwb3NpdG9yeVV0aWxzLmdldEltcG9ydExpYnJhcnlQcm9wb3NhbHMoZ2V0UHJvamVjdCgpLCB2YWx1ZSk7Ci0JCQlmb3IgKElBcnRlZmFjdCBwcm9wb3NhbCA6IGxpYnJhcmllcykgewotCQkJCWlmICghc2V0LmNvbnRhaW5zKHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpKSkgewotCQkJCQljb21wbGV0aW9ucy5hZGQobmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwuZ2V0U3ltYm9saWNOYW1lKCksIGdldEltYWdlKEZfVFlQRV9MSUIpLAotCQkJCQkJCXByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCkpOwotCQkJCQlzZXQuYWRkKHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBTZXQ8QXJ0ZWZhY3Q+IGxpYnJhcmllcyA9IFJlcG9zaXRvcnlVdGlscy5nZXRJbXBvcnRMaWJyYXJ5UHJvcG9zYWxzKGdldFByb2plY3QoKSwgdmFsdWUpOworICAgICAgICAgICAgZm9yIChJQXJ0ZWZhY3QgcHJvcG9zYWwgOiBsaWJyYXJpZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNldC5jb250YWlucyhwcm9wb3NhbC5nZXRTeW1ib2xpY05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbnMuYWRkKG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpLCBnZXRJbWFnZShGX1RZUEVfTElCKSwgcHJvcG9zYWwuZ2V0U3ltYm9saWNOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBjb21wbGV0aW9ucy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2NvbXBsZXRpb25zLnNpemUoKV0pOwotCQkJc29ydENvbXBsZXRpb25zKHByb3Bvc2Fscyk7Ci0JCQlyZXR1cm4gcHJvcG9zYWxzOwotCQl9CisgICAgICAgICAgICBJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gY29tcGxldGlvbnMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtjb21wbGV0aW9ucy5zaXplKCldKTsKKyAgICAgICAgICAgIHNvcnRDb21wbGV0aW9ucyhwcm9wb3NhbHMpOworICAgICAgICAgICAgcmV0dXJuIHByb3Bvc2FsczsKKyAgICAgICAgfQogCi0JCWludCBlcXVhbHMgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJz0nKTsKLQkJaWYgKGVxdWFscyA9PSAtMSB8fCBzZW1pY29sb24gPiBlcXVhbHMpIHsKLQkJCVN0cmluZ1tdIHZhbGlkQXR0cyA9IG5ldyBTdHJpbmdbXSB7IENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURSwgQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLAotCQkJCQlJSGVhZGVyQ29uc3RhbnRzLlBST01PVEVTX0RJUkVDVElWRSB9OwotCQkJSW50ZWdlcltdIHZhbGlkVHlwZXMgPSBuZXcgSW50ZWdlcltdIHsgbmV3IEludGVnZXIoRl9UWVBFX0FUVFJJQlVURSksIG5ldyBJbnRlZ2VyKEZfVFlQRV9ESVJFQ1RJVkUpLAotCQkJCQluZXcgSW50ZWdlcihGX1RZUEVfRElSRUNUSVZFKSB9OwotCQkJcmV0dXJuIGhhbmRsZUF0dHJzQW5kRGlyZWN0aXZlcyh2YWx1ZSwgaW5pdGlhbGl6ZU5ld0xpc3QodmFsaWRBdHRzKSwgaW5pdGlhbGl6ZU5ld0xpc3QodmFsaWRUeXBlcyksIG9mZnNldCk7Ci0JCX0KKyAgICAgICAgaW50IGVxdWFscyA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignPScpOworICAgICAgICBpZiAoZXF1YWxzID09IC0xIHx8IHNlbWljb2xvbiA+IGVxdWFscykgeworICAgICAgICAgICAgU3RyaW5nW10gdmFsaWRBdHRzID0gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLCBDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUsIElIZWFkZXJDb25zdGFudHMuUFJPTU9URVNfRElSRUNUSVZFIH07CisgICAgICAgICAgICBJbnRlZ2VyW10gdmFsaWRUeXBlcyA9IG5ldyBJbnRlZ2VyW10geyBuZXcgSW50ZWdlcihGX1RZUEVfQVRUUklCVVRFKSwgbmV3IEludGVnZXIoRl9UWVBFX0RJUkVDVElWRSksIG5ldyBJbnRlZ2VyKEZfVFlQRV9ESVJFQ1RJVkUpIH07CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlQXR0cnNBbmREaXJlY3RpdmVzKHZhbHVlLCBpbml0aWFsaXplTmV3TGlzdCh2YWxpZEF0dHMpLCBpbml0aWFsaXplTmV3TGlzdCh2YWxpZFR5cGVzKSwgb2Zmc2V0KTsKKyAgICAgICAgfQogCi0JCVN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhzZW1pY29sb24gKyAxKSk7Ci0JCWlmIChDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwKLQkJCQlDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUubGVuZ3RoKCkpKSB7Ci0JCQlyZXR1cm4gbWF0Y2hWYWx1ZUNvbXBsZXRpb24oY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSwgbmV3IFN0cmluZ1tdIHsKLQkJCQkJQ29uc3RhbnRzLlJFU09MVVRJT05fTUFOREFUT1JZLCBDb25zdGFudHMuUkVTT0xVVElPTl9PUFRJT05BTCB9LCBuZXcgaW50W10geyBGX1RZUEVfVkFMVUUsCi0JCQkJCUZfVFlQRV9WQUxVRSB9LCBvZmZzZXQsICJSRVNPTFVUSU9OXyIpOwotCQl9Ci0JCWlmIChJSGVhZGVyQ29uc3RhbnRzLlBST01PVEVTX0RJUkVDVElWRS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZVZhbHVlLCAwLAotCQkJCUlIZWFkZXJDb25zdGFudHMuUFJPTU9URVNfRElSRUNUSVZFLmxlbmd0aCgpKSkgewotCQkJcmV0dXJuIGhhbmRsZVRydWVGYWxzZVZhbHVlKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZXF1YWxzICsgMSksIG9mZnNldCk7Ci0JCX0KLQkJaWYgKENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZVZhbHVlLCAwLCBDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUubGVuZ3RoKCkpKSB7Ci0JCQlTdHJpbmcgcGx1Z2luSWQgPSByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoKGNvbW1hID09IC0xKSA/IDAgOiBjb21tYSArIDEsIHNlbWljb2xvbikpOwotCQkJcmV0dXJuIGdldExpYnJhcnlWZXJzaW9uQ29tcGxldGlvbnMocGx1Z2luSWQsIHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSksCi0JCQkJCW9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCX0KKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKHNlbWljb2xvbiArIDEpKTsKKyAgICAgICAgaWYgKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZVZhbHVlLCAwLCBDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hWYWx1ZUNvbXBsZXRpb24oY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuUkVTT0xVVElPTl9NQU5EQVRPUlksIENvbnN0YW50cy5SRVNPTFVUSU9OX09QVElPTkFMIH0sIG5ldyBpbnRbXSB7IEZfVFlQRV9WQUxVRSwgRl9UWVBFX1ZBTFVFIH0sIG9mZnNldCwKKyAgICAgICAgICAgICAgICAiUkVTT0xVVElPTl8iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoSUhlYWRlckNvbnN0YW50cy5QUk9NT1RFU19ESVJFQ1RJVkUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwgSUhlYWRlckNvbnN0YW50cy5QUk9NT1RFU19ESVJFQ1RJVkUubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlVHJ1ZUZhbHNlVmFsdWUoY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSwgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgYXR0cmlidXRlVmFsdWUsIDAsIENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwbHVnaW5JZCA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhjb21tYSA9PSAtMSA/IDAgOiBjb21tYSArIDEsIHNlbWljb2xvbikpOworICAgICAgICAgICAgcmV0dXJuIGdldExpYnJhcnlWZXJzaW9uQ29tcGxldGlvbnMocGx1Z2luSWQsIHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSksIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOworICAgIH0KIAotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGhhbmRsZUltcG9ydEJ1bmRsZUNvbXBsZXRpb24oU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IG9mZnNldCkgewotCQlpbnQgY29tbWEgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJywnKTsKLQkJaW50IHNlbWljb2xvbiA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignOycpOwotCQlTdHJpbmcgdmFsdWUgPSBjb21tYSAhPSAtMSA/IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY29tbWEgKyAxKSA6IGN1cnJlbnRWYWx1ZTsKKyAgICBwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWxbXSBoYW5kbGVJbXBvcnRCdW5kbGVDb21wbGV0aW9uKFN0cmluZyBjdXJyZW50VmFsdWUsIGludCBvZmZzZXQpIHsKKyAgICAgICAgaW50IGNvbW1hID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCcsJyk7CisgICAgICAgIGludCBzZW1pY29sb24gPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJzsnKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gY29tbWEgIT0gLTEgPyBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGNvbW1hICsgMSkgOiBjdXJyZW50VmFsdWU7CiAKLQkJaWYgKGNvbW1hID4gc2VtaWNvbG9uIHx8IGNvbW1hID09IHNlbWljb2xvbikgewotCQkJSGFzaFNldCBzZXQgPSAoSGFzaFNldCkgZkhlYWRlcnMuZ2V0KElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSk7Ci0JCQlpZiAoc2V0ID09IG51bGwpIHsKLQkJCQlzZXQgPSBwYXJzZUhlYWRlckZvclZhbHVlcyhjdXJyZW50VmFsdWUsIG9mZnNldCk7Ci0JCQl9CisgICAgICAgIGlmIChjb21tYSA+IHNlbWljb2xvbiB8fCBjb21tYSA9PSBzZW1pY29sb24pIHsKKyAgICAgICAgICAgIEhhc2hTZXQgc2V0ID0gKEhhc2hTZXQpIHRoaXMuZkhlYWRlcnMuZ2V0KElIZWFkZXJDb25zdGFudHMuSU1QT1JUX0JVTkRMRSk7CisgICAgICAgICAgICBpZiAoc2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXQgPSBwYXJzZUhlYWRlckZvclZhbHVlcyhjdXJyZW50VmFsdWUsIG9mZnNldCk7CisgICAgICAgICAgICB9CiAKLQkJCXZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyh2YWx1ZSk7Ci0JCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCQlzZXQucmVtb3ZlKHZhbHVlKTsKLQkJCUFycmF5TGlzdDxCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsPiBjb21wbGV0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKKyAgICAgICAgICAgIHZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyh2YWx1ZSk7CisgICAgICAgICAgICBpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7CisgICAgICAgICAgICBzZXQucmVtb3ZlKHZhbHVlKTsKKyAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsPiBjb21wbGV0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKIAotCQkJU2V0PEFydGVmYWN0PiBidW5kbGVzID0gUmVwb3NpdG9yeVV0aWxzLmdldEltcG9ydEJ1bmRsZVByb3Bvc2FscyhnZXRQcm9qZWN0KCksIHZhbHVlKTsKLQkJCWZvciAoSUFydGVmYWN0IHByb3Bvc2FsIDogYnVuZGxlcykgewotCQkJCWlmICghc2V0LmNvbnRhaW5zKHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpKSkgewotCQkJCQljb21wbGV0aW9ucy5hZGQobmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJZ2V0SW1hZ2UoRl9UWVBFX0JVTkRMRSksIHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpLCBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCkpOwotCQkJCQlzZXQuYWRkKHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBTZXQ8QXJ0ZWZhY3Q+IGJ1bmRsZXMgPSBSZXBvc2l0b3J5VXRpbHMuZ2V0SW1wb3J0QnVuZGxlUHJvcG9zYWxzKGdldFByb2plY3QoKSwgdmFsdWUpOworICAgICAgICAgICAgZm9yIChJQXJ0ZWZhY3QgcHJvcG9zYWwgOiBidW5kbGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzZXQuY29udGFpbnMocHJvcG9zYWwuZ2V0U3ltYm9saWNOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25zLmFkZChuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbC5nZXRTeW1ib2xpY05hbWUoKSwgZ2V0SW1hZ2UoRl9UWVBFX0JVTkRMRSksIHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IC0gbGVuZ3RoLCBsZW5ndGgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0LmFkZChwcm9wb3NhbC5nZXRTeW1ib2xpY05hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gY29tcGxldGlvbnMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtjb21wbGV0aW9ucy5zaXplKCldKTsKLQkJCXNvcnRDb21wbGV0aW9ucyhwcm9wb3NhbHMpOwotCQkJcmV0dXJuIHByb3Bvc2FsczsKLQkJfQorICAgICAgICAgICAgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGNvbXBsZXRpb25zLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbY29tcGxldGlvbnMuc2l6ZSgpXSk7CisgICAgICAgICAgICBzb3J0Q29tcGxldGlvbnMocHJvcG9zYWxzKTsKKyAgICAgICAgICAgIHJldHVybiBwcm9wb3NhbHM7CisgICAgICAgIH0KIAotCQlpbnQgZXF1YWxzID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCc9Jyk7Ci0JCWlmIChlcXVhbHMgPT0gLTEgfHwgc2VtaWNvbG9uID4gZXF1YWxzKSB7Ci0JCQlTdHJpbmdbXSB2YWxpZEF0dHMgPSBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUsIENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSB9OwotCQkJSW50ZWdlcltdIHZhbGlkVHlwZXMgPSBuZXcgSW50ZWdlcltdIHsgbmV3IEludGVnZXIoRl9UWVBFX0FUVFJJQlVURSksIG5ldyBJbnRlZ2VyKEZfVFlQRV9ESVJFQ1RJVkUpIH07Ci0JCQlyZXR1cm4gaGFuZGxlQXR0cnNBbmREaXJlY3RpdmVzKHZhbHVlLCBpbml0aWFsaXplTmV3TGlzdCh2YWxpZEF0dHMpLCBpbml0aWFsaXplTmV3TGlzdCh2YWxpZFR5cGVzKSwgb2Zmc2V0KTsKLQkJfQorICAgICAgICBpbnQgZXF1YWxzID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCc9Jyk7CisgICAgICAgIGlmIChlcXVhbHMgPT0gLTEgfHwgc2VtaWNvbG9uID4gZXF1YWxzKSB7CisgICAgICAgICAgICBTdHJpbmdbXSB2YWxpZEF0dHMgPSBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUsIENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSB9OworICAgICAgICAgICAgSW50ZWdlcltdIHZhbGlkVHlwZXMgPSBuZXcgSW50ZWdlcltdIHsgbmV3IEludGVnZXIoRl9UWVBFX0FUVFJJQlVURSksIG5ldyBJbnRlZ2VyKEZfVFlQRV9ESVJFQ1RJVkUpIH07CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlQXR0cnNBbmREaXJlY3RpdmVzKHZhbHVlLCBpbml0aWFsaXplTmV3TGlzdCh2YWxpZEF0dHMpLCBpbml0aWFsaXplTmV3TGlzdCh2YWxpZFR5cGVzKSwgb2Zmc2V0KTsKKyAgICAgICAgfQogCi0JCVN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhzZW1pY29sb24gKyAxKSk7Ci0JCWlmIChDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwKLQkJCQlDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUubGVuZ3RoKCkpKSB7Ci0JCQlyZXR1cm4gbWF0Y2hWYWx1ZUNvbXBsZXRpb24oY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSwgbmV3IFN0cmluZ1tdIHsKLQkJCQkJQ29uc3RhbnRzLlJFU09MVVRJT05fTUFOREFUT1JZLCBDb25zdGFudHMuUkVTT0xVVElPTl9PUFRJT05BTCB9LCBuZXcgaW50W10geyBGX1RZUEVfVkFMVUUsCi0JCQkJCUZfVFlQRV9WQUxVRSB9LCBvZmZzZXQsICJSRVNPTFVUSU9OXyIpOwotCQl9Ci0JCWlmIChDb25zdGFudHMuVkVSU0lPTl9BVFRSSUJVVEUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwgQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLmxlbmd0aCgpKSkgewotCQkJU3RyaW5nIHBsdWdpbklkID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKChjb21tYSA9PSAtMSkgPyAwIDogY29tbWEgKyAxLCBzZW1pY29sb24pKTsKLQkJCXJldHVybiBnZXRTcHJpbmdCdW5kbGVWZXJzaW9uQ29tcGxldGlvbnMocGx1Z2luSWQsIHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSksCi0JCQkJCW9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCX0KKyAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKHNlbWljb2xvbiArIDEpKTsKKyAgICAgICAgaWYgKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZVZhbHVlLCAwLCBDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hWYWx1ZUNvbXBsZXRpb24oY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuUkVTT0xVVElPTl9NQU5EQVRPUlksIENvbnN0YW50cy5SRVNPTFVUSU9OX09QVElPTkFMIH0sIG5ldyBpbnRbXSB7IEZfVFlQRV9WQUxVRSwgRl9UWVBFX1ZBTFVFIH0sIG9mZnNldCwKKyAgICAgICAgICAgICAgICAiUkVTT0xVVElPTl8iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ29uc3RhbnRzLlZFUlNJT05fQVRUUklCVVRFLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgYXR0cmlidXRlVmFsdWUsIDAsIENvbnN0YW50cy5WRVJTSU9OX0FUVFJJQlVURS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwbHVnaW5JZCA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhjb21tYSA9PSAtMSA/IDAgOiBjb21tYSArIDEsIHNlbWljb2xvbikpOworICAgICAgICAgICAgcmV0dXJuIGdldFNwcmluZ0J1bmRsZVZlcnNpb25Db21wbGV0aW9ucyhwbHVnaW5JZCwgcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGVxdWFscyArIDEpKSwgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElDb21wbGV0aW9uUHJvcG9zYWxbXSBoYW5kbGVSZXF1aXJlQnVuZGxlQ29tcGxldGlvbihTdHJpbmcgY3VycmVudFZhbHVlLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBjb21tYSA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignLCcpOwotCQlpbnQgc2VtaWNvbG9uID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCc7Jyk7Ci0JCVN0cmluZyB2YWx1ZSA9IGNvbW1hICE9IC0xID8gY3VycmVudFZhbHVlLnN1YnN0cmluZyhjb21tYSArIDEpIDogY3VycmVudFZhbHVlOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gaGFuZGxlUmVxdWlyZUJ1bmRsZUNvbXBsZXRpb24oU3RyaW5nIGN1cnJlbnRWYWx1ZSwgaW50IG9mZnNldCkgeworICAgICAgICBpbnQgY29tbWEgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJywnKTsKKyAgICAgICAgaW50IHNlbWljb2xvbiA9IGN1cnJlbnRWYWx1ZS5sYXN0SW5kZXhPZignOycpOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBjb21tYSAhPSAtMSA/IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoY29tbWEgKyAxKSA6IGN1cnJlbnRWYWx1ZTsKIAotCQlpZiAoY29tbWEgPiBzZW1pY29sb24gfHwgY29tbWEgPT0gc2VtaWNvbG9uKSB7Ci0JCQlIYXNoU2V0IHNldCA9IChIYXNoU2V0KSBmSGVhZGVycy5nZXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFKTsKLQkJCWlmIChzZXQgPT0gbnVsbCkgewotCQkJCXNldCA9IHBhcnNlSGVhZGVyRm9yVmFsdWVzKGN1cnJlbnRWYWx1ZSwgb2Zmc2V0KTsKLQkJCX0KKyAgICAgICAgaWYgKGNvbW1hID4gc2VtaWNvbG9uIHx8IGNvbW1hID09IHNlbWljb2xvbikgeworICAgICAgICAgICAgSGFzaFNldCBzZXQgPSAoSGFzaFNldCkgdGhpcy5mSGVhZGVycy5nZXQoQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFKTsKKyAgICAgICAgICAgIGlmIChzZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNldCA9IHBhcnNlSGVhZGVyRm9yVmFsdWVzKGN1cnJlbnRWYWx1ZSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KIAotCQkJdmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKHZhbHVlKTsKLQkJCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJCXNldC5yZW1vdmUodmFsdWUpOwotCQkJQXJyYXlMaXN0PEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXBsZXRpb25zID0gbmV3IEFycmF5TGlzdDxCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsPigpOworICAgICAgICAgICAgdmFsdWUgPSByZW1vdmVMZWFkaW5nU3BhY2VzKHZhbHVlKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKKyAgICAgICAgICAgIHNldC5yZW1vdmUodmFsdWUpOworICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXBsZXRpb25zID0gbmV3IEFycmF5TGlzdDxCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsPigpOwogCi0JCQlTZXQ8QXJ0ZWZhY3Q+IGJ1bmRsZXMgPSBSZXBvc2l0b3J5VXRpbHMuZ2V0SW1wb3J0QnVuZGxlUHJvcG9zYWxzKGdldFByb2plY3QoKSwgdmFsdWUpOwotCQkJZm9yIChJQXJ0ZWZhY3QgcHJvcG9zYWwgOiBidW5kbGVzKSB7Ci0JCQkJaWYgKCFzZXQuY29udGFpbnMocHJvcG9zYWwuZ2V0U3ltYm9saWNOYW1lKCkpKSB7Ci0JCQkJCWNvbXBsZXRpb25zLmFkZChuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbC5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQlnZXRJbWFnZShGX1RZUEVfQlVORExFKSwgcHJvcG9zYWwuZ2V0U3ltYm9saWNOYW1lKCksIG9mZnNldCAtIGxlbmd0aCwgbGVuZ3RoKSk7Ci0JCQkJCXNldC5hZGQocHJvcG9zYWwuZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIFNldDxBcnRlZmFjdD4gYnVuZGxlcyA9IFJlcG9zaXRvcnlVdGlscy5nZXRJbXBvcnRCdW5kbGVQcm9wb3NhbHMoZ2V0UHJvamVjdCgpLCB2YWx1ZSk7CisgICAgICAgICAgICBmb3IgKElBcnRlZmFjdCBwcm9wb3NhbCA6IGJ1bmRsZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNldC5jb250YWlucyhwcm9wb3NhbC5nZXRTeW1ib2xpY05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbnMuYWRkKG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpLCBnZXRJbWFnZShGX1RZUEVfQlVORExFKSwgcHJvcG9zYWwuZ2V0U3ltYm9saWNOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLSBsZW5ndGgsIGxlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKHByb3Bvc2FsLmdldFN5bWJvbGljTmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBjb21wbGV0aW9ucy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2NvbXBsZXRpb25zLnNpemUoKV0pOwotCQkJc29ydENvbXBsZXRpb25zKHByb3Bvc2Fscyk7Ci0JCQlyZXR1cm4gcHJvcG9zYWxzOwotCQl9Ci0JCWludCBlcXVhbHMgPSBjdXJyZW50VmFsdWUubGFzdEluZGV4T2YoJz0nKTsKLQkJaWYgKGVxdWFscyA9PSAtMSB8fCBzZW1pY29sb24gPiBlcXVhbHMpIHsKLQkJCVN0cmluZ1tdIHZhbGlkQXR0cnMgPSBuZXcgU3RyaW5nW10geyBDb25zdGFudHMuQlVORExFX1ZFUlNJT05fQVRUUklCVVRFLCBDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUsCi0JCQkJCUNvbnN0YW50cy5WSVNJQklMSVRZX0RJUkVDVElWRSB9OwotCQkJSW50ZWdlcltdIHZhbGlkVHlwZXMgPSBuZXcgSW50ZWdlcltdIHsgbmV3IEludGVnZXIoRl9UWVBFX0FUVFJJQlVURSksIG5ldyBJbnRlZ2VyKEZfVFlQRV9ESVJFQ1RJVkUpLAotCQkJCQluZXcgSW50ZWdlcihGX1RZUEVfRElSRUNUSVZFKSB9OwotCQkJcmV0dXJuIGhhbmRsZUF0dHJzQW5kRGlyZWN0aXZlcyh2YWx1ZSwgaW5pdGlhbGl6ZU5ld0xpc3QodmFsaWRBdHRycyksIGluaXRpYWxpemVOZXdMaXN0KHZhbGlkVHlwZXMpLCBvZmZzZXQpOwotCQl9CisgICAgICAgICAgICBJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gY29tcGxldGlvbnMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtjb21wbGV0aW9ucy5zaXplKCldKTsKKyAgICAgICAgICAgIHNvcnRDb21wbGV0aW9ucyhwcm9wb3NhbHMpOworICAgICAgICAgICAgcmV0dXJuIHByb3Bvc2FsczsKKyAgICAgICAgfQorICAgICAgICBpbnQgZXF1YWxzID0gY3VycmVudFZhbHVlLmxhc3RJbmRleE9mKCc9Jyk7CisgICAgICAgIGlmIChlcXVhbHMgPT0gLTEgfHwgc2VtaWNvbG9uID4gZXF1YWxzKSB7CisgICAgICAgICAgICBTdHJpbmdbXSB2YWxpZEF0dHJzID0gbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OX0FUVFJJQlVURSwgQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLCBDb25zdGFudHMuVklTSUJJTElUWV9ESVJFQ1RJVkUgfTsKKyAgICAgICAgICAgIEludGVnZXJbXSB2YWxpZFR5cGVzID0gbmV3IEludGVnZXJbXSB7IG5ldyBJbnRlZ2VyKEZfVFlQRV9BVFRSSUJVVEUpLCBuZXcgSW50ZWdlcihGX1RZUEVfRElSRUNUSVZFKSwgbmV3IEludGVnZXIoRl9UWVBFX0RJUkVDVElWRSkgfTsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVBdHRyc0FuZERpcmVjdGl2ZXModmFsdWUsIGluaXRpYWxpemVOZXdMaXN0KHZhbGlkQXR0cnMpLCBpbml0aWFsaXplTmV3TGlzdCh2YWxpZFR5cGVzKSwgb2Zmc2V0KTsKKyAgICAgICAgfQogCi0JCVN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhzZW1pY29sb24gKyAxKSk7Ci0JCWlmIChDb25zdGFudHMuVklTSUJJTElUWV9ESVJFQ1RJVkUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwKLQkJCQlDb25zdGFudHMuVklTSUJJTElUWV9ESVJFQ1RJVkUubGVuZ3RoKCkpKSB7Ci0JCQlyZXR1cm4gbWF0Y2hWYWx1ZUNvbXBsZXRpb24oY3VycmVudFZhbHVlLnN1YnN0cmluZyhlcXVhbHMgKyAxKSwgbmV3IFN0cmluZ1tdIHsKLQkJCQkJQ29uc3RhbnRzLlZJU0lCSUxJVFlfUFJJVkFURSwgQ29uc3RhbnRzLlZJU0lCSUxJVFlfUkVFWFBPUlQgfSwgbmV3IGludFtdIHsgRl9UWVBFX1ZBTFVFLAotCQkJCQlGX1RZUEVfVkFMVUUgfSwgb2Zmc2V0LCAiVklTSUJJTElUWV8iKTsKLQkJfQotCQlpZiAoQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLnJlZ2lvbk1hdGNoZXModHJ1ZSwgMCwgYXR0cmlidXRlVmFsdWUsIDAsCi0JCQkJQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLmxlbmd0aCgpKSkgewotCQkJcmV0dXJuIG1hdGNoVmFsdWVDb21wbGV0aW9uKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZXF1YWxzICsgMSksIG5ldyBTdHJpbmdbXSB7Ci0JCQkJCUNvbnN0YW50cy5SRVNPTFVUSU9OX01BTkRBVE9SWSwgQ29uc3RhbnRzLlJFU09MVVRJT05fT1BUSU9OQUwgfSwgbmV3IGludFtdIHsgRl9UWVBFX1ZBTFVFLAotCQkJCQlGX1RZUEVfVkFMVUUgfSwgb2Zmc2V0LCAiUkVTT0xVVElPTl8iKTsKLQkJfQotCQlpZiAoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OX0FUVFJJQlVURS5yZWdpb25NYXRjaGVzKHRydWUsIDAsIGF0dHJpYnV0ZVZhbHVlLCAwLAotCQkJCUNvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRS5sZW5ndGgoKSkpIHsKLQkJCVN0cmluZyBwbHVnaW5JZCA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZygoY29tbWEgPT0gLTEpID8gMCA6IGNvbW1hICsgMSwgc2VtaWNvbG9uKSk7Ci0JCQlyZXR1cm4gZ2V0U3ByaW5nQnVuZGxlVmVyc2lvbkNvbXBsZXRpb25zKHBsdWdpbklkLCByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZXF1YWxzICsgMSkpLAotCQkJCQlvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQl9CisgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IHJlbW92ZUxlYWRpbmdTcGFjZXMoY3VycmVudFZhbHVlLnN1YnN0cmluZyhzZW1pY29sb24gKyAxKSk7CisgICAgICAgIGlmIChDb25zdGFudHMuVklTSUJJTElUWV9ESVJFQ1RJVkUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwgQ29uc3RhbnRzLlZJU0lCSUxJVFlfRElSRUNUSVZFLmxlbmd0aCgpKSkgeworICAgICAgICAgICAgcmV0dXJuIG1hdGNoVmFsdWVDb21wbGV0aW9uKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZXF1YWxzICsgMSksCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLlZJU0lCSUxJVFlfUFJJVkFURSwgQ29uc3RhbnRzLlZJU0lCSUxJVFlfUkVFWFBPUlQgfSwgbmV3IGludFtdIHsgRl9UWVBFX1ZBTFVFLCBGX1RZUEVfVkFMVUUgfSwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICJWSVNJQklMSVRZXyIpOworICAgICAgICB9CisgICAgICAgIGlmIChDb25zdGFudHMuUkVTT0xVVElPTl9ESVJFQ1RJVkUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwgQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLmxlbmd0aCgpKSkgeworICAgICAgICAgICAgcmV0dXJuIG1hdGNoVmFsdWVDb21wbGV0aW9uKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZXF1YWxzICsgMSksCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQ29uc3RhbnRzLlJFU09MVVRJT05fTUFOREFUT1JZLCBDb25zdGFudHMuUkVTT0xVVElPTl9PUFRJT05BTCB9LCBuZXcgaW50W10geyBGX1RZUEVfVkFMVUUsIEZfVFlQRV9WQUxVRSB9LCBvZmZzZXQsCisgICAgICAgICAgICAgICAgIlJFU09MVVRJT05fIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTl9BVFRSSUJVVEUucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBhdHRyaWJ1dGVWYWx1ZSwgMCwgQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFLmxlbmd0aCgpKSkgeworICAgICAgICAgICAgU3RyaW5nIHBsdWdpbklkID0gcmVtb3ZlTGVhZGluZ1NwYWNlcyhjdXJyZW50VmFsdWUuc3Vic3RyaW5nKGNvbW1hID09IC0xID8gMCA6IGNvbW1hICsgMSwgc2VtaWNvbG9uKSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0U3ByaW5nQnVuZGxlVmVyc2lvbkNvbXBsZXRpb25zKHBsdWdpbklkLCByZW1vdmVMZWFkaW5nU3BhY2VzKGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoZXF1YWxzICsgMSkpLCBvZmZzZXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKKyAgICB9CiAKLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCWlmIChmSlAgPT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9ICgoUERFRm9ybUVkaXRvcikgZlNvdXJjZVBhZ2UuZ2V0RWRpdG9yKCkpLmdldENvbW1vblByb2plY3QoKTsKLQkJCWZKUCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJfQotCQlyZXR1cm4gZkpQLmdldFByb2plY3QoKTsKLQl9CisgICAgcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KCkgeworICAgICAgICBpZiAodGhpcy5mSlAgPT0gbnVsbCkgeworICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9ICgoUERFRm9ybUVkaXRvcikgdGhpcy5mU291cmNlUGFnZS5nZXRFZGl0b3IoKSkuZ2V0Q29tbW9uUHJvamVjdCgpOworICAgICAgICAgICAgdGhpcy5mSlAgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZkpQLmdldFByb2plY3QoKTsKKyAgICB9CiAKLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRTcHJpbmdCdW5kbGVWZXJzaW9uQ29tcGxldGlvbnMoU3RyaW5nIGJ1bmRsZUlkLCBTdHJpbmcgZXhpc3RpbmdWYWx1ZSwgaW50IG9mZnNldCkgewotCQlidW5kbGVJZCA9IGdldFN5bWJvbGljTmFtZShidW5kbGVJZCk7Ci0JCVNldDxBcnRlZmFjdD4gYnVuZGxlcyA9IFJlcG9zaXRvcnlVdGlscy5nZXRJbXBvcnRCdW5kbGVQcm9wb3NhbHMoZ2V0UHJvamVjdCgpLCBidW5kbGVJZCk7Ci0JCWlmIChidW5kbGVzLnNpemUoKSA+IDApIHsKLQkJCUFycmF5TGlzdDxCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWw+KAotCQkJCQlidW5kbGVzLnNpemUoKSk7Ci0JCQlmb3IgKElBcnRlZmFjdCBlbGVtZW50IDogYnVuZGxlcykgewotCQkJCWlmIChlbGVtZW50LmdldFN5bWJvbGljTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoYnVuZGxlSWQpKSB7Ci0JCQkJCUxpc3Q8U3RyaW5nPiBwcm9wb3NhbFZhbHVlcyA9IGdldFZlcnNpb25Qcm9wb3NhbHMoZWxlbWVudC5nZXRWZXJzaW9uKCkpOwotCQkJCQlmb3IgKFN0cmluZyBwcm9wb3NhbFZhbHVlIDogcHJvcG9zYWxWYWx1ZXMpIHsKLQkJCQkJCWlmIChwcm9wb3NhbFZhbHVlLnJlZ2lvbk1hdGNoZXMoMCwgZXhpc3RpbmdWYWx1ZSwgMCwgZXhpc3RpbmdWYWx1ZS5sZW5ndGgoKSkpIHsKLQkJCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKAotCQkJCQkJCQkJcHJvcG9zYWxWYWx1ZS5zdWJzdHJpbmcoZXhpc3RpbmdWYWx1ZS5sZW5ndGgoKSksIGdldEltYWdlKEZfVFlQRV9WQUxVRSksCi0JCQkJCQkJCQlwcm9wb3NhbFZhbHVlLCBvZmZzZXQsIDApKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JCX0gZWxzZSBpZiAoZXhpc3RpbmdWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKCJcIlwiIiwgZ2V0SW1hZ2UoRl9UWVBFX1ZBTFVFKSwgIlwiXCIiLAotCQkJCQlvZmZzZXQsIDApIH07Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCX0KKyAgICBwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRTcHJpbmdCdW5kbGVWZXJzaW9uQ29tcGxldGlvbnMoU3RyaW5nIGJ1bmRsZUlkLCBTdHJpbmcgZXhpc3RpbmdWYWx1ZSwgaW50IG9mZnNldCkgeworICAgICAgICBidW5kbGVJZCA9IGdldFN5bWJvbGljTmFtZShidW5kbGVJZCk7CisgICAgICAgIFNldDxBcnRlZmFjdD4gYnVuZGxlcyA9IFJlcG9zaXRvcnlVdGlscy5nZXRJbXBvcnRCdW5kbGVQcm9wb3NhbHMoZ2V0UHJvamVjdCgpLCBidW5kbGVJZCk7CisgICAgICAgIGlmIChidW5kbGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWw+KGJ1bmRsZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoSUFydGVmYWN0IGVsZW1lbnQgOiBidW5kbGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShidW5kbGVJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb3Bvc2FsVmFsdWVzID0gZ2V0VmVyc2lvblByb3Bvc2FscyhlbGVtZW50LmdldFZlcnNpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHByb3Bvc2FsVmFsdWUgOiBwcm9wb3NhbFZhbHVlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3Bvc2FsVmFsdWUucmVnaW9uTWF0Y2hlcygwLCBleGlzdGluZ1ZhbHVlLCAwLCBleGlzdGluZ1ZhbHVlLmxlbmd0aCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3Bvc2Fscy5hZGQobmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWxWYWx1ZS5zdWJzdHJpbmcoZXhpc3RpbmdWYWx1ZS5sZW5ndGgoKSksIGdldEltYWdlKEZfVFlQRV9WQUxVRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3Bvc2FsVmFsdWUsIG9mZnNldCwgMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHByb3Bvc2Fscy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2Fscy5zaXplKCldKTsKKyAgICAgICAgfSBlbHNlIGlmIChleGlzdGluZ1ZhbHVlLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHsgbmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwoIlwiXCIiLCBnZXRJbWFnZShGX1RZUEVfVkFMVUUpLCAiXCJcIiIsIG9mZnNldCwgMCkgfTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07CisgICAgfQogCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0TGlicmFyeVZlcnNpb25Db21wbGV0aW9ucyhTdHJpbmcgbGlicmFyeUlkLCBTdHJpbmcgZXhpc3RpbmdWYWx1ZSwgaW50IG9mZnNldCkgewotCQlsaWJyYXJ5SWQgPSBnZXRTeW1ib2xpY05hbWUobGlicmFyeUlkKTsKLQkJU2V0PEFydGVmYWN0PiBsaWJyYXJpZXMgPSBSZXBvc2l0b3J5VXRpbHMuZ2V0SW1wb3J0TGlicmFyeVByb3Bvc2FscyhnZXRQcm9qZWN0KCksIGxpYnJhcnlJZCk7Ci0JCWlmIChsaWJyYXJpZXMuc2l6ZSgpID4gMCkgewotCQkJQXJyYXlMaXN0PEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbD4oCi0JCQkJCWxpYnJhcmllcy5zaXplKCkpOwotCQkJZm9yIChJQXJ0ZWZhY3QgZWxlbWVudCA6IGxpYnJhcmllcykgewotCQkJCWlmIChlbGVtZW50LmdldFN5bWJvbGljTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobGlicmFyeUlkKSkgewotCQkJCQlMaXN0PFN0cmluZz4gcHJvcG9zYWxWYWx1ZXMgPSBnZXRWZXJzaW9uUHJvcG9zYWxzKGVsZW1lbnQuZ2V0VmVyc2lvbigpKTsKLQkJCQkJZm9yIChTdHJpbmcgcHJvcG9zYWxWYWx1ZSA6IHByb3Bvc2FsVmFsdWVzKSB7Ci0JCQkJCQlpZiAocHJvcG9zYWxWYWx1ZS5yZWdpb25NYXRjaGVzKDAsIGV4aXN0aW5nVmFsdWUsIDAsIGV4aXN0aW5nVmFsdWUubGVuZ3RoKCkpKSB7Ci0JCQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCQkJCQkJCXByb3Bvc2FsVmFsdWUuc3Vic3RyaW5nKGV4aXN0aW5nVmFsdWUubGVuZ3RoKCkpLCBnZXRJbWFnZShGX1RZUEVfVkFMVUUpLAotCQkJCQkJCQkJcHJvcG9zYWxWYWx1ZSwgb2Zmc2V0LCAwKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pOwotCQl9IGVsc2UgaWYgKGV4aXN0aW5nVmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW10geyBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCgiXCJcIiIsIGdldEltYWdlKEZfVFlQRV9WQUxVRSksICJcIlwiIiwKLQkJCQkJb2Zmc2V0LCAwKSB9OwotCQl9Ci0JCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQl9CisgICAgcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0TGlicmFyeVZlcnNpb25Db21wbGV0aW9ucyhTdHJpbmcgbGlicmFyeUlkLCBTdHJpbmcgZXhpc3RpbmdWYWx1ZSwgaW50IG9mZnNldCkgeworICAgICAgICBsaWJyYXJ5SWQgPSBnZXRTeW1ib2xpY05hbWUobGlicmFyeUlkKTsKKyAgICAgICAgU2V0PEFydGVmYWN0PiBsaWJyYXJpZXMgPSBSZXBvc2l0b3J5VXRpbHMuZ2V0SW1wb3J0TGlicmFyeVByb3Bvc2FscyhnZXRQcm9qZWN0KCksIGxpYnJhcnlJZCk7CisgICAgICAgIGlmIChsaWJyYXJpZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbD4obGlicmFyaWVzLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKElBcnRlZmFjdCBlbGVtZW50IDogbGlicmFyaWVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShsaWJyYXJ5SWQpKSB7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9wb3NhbFZhbHVlcyA9IGdldFZlcnNpb25Qcm9wb3NhbHMoZWxlbWVudC5nZXRWZXJzaW9uKCkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwcm9wb3NhbFZhbHVlIDogcHJvcG9zYWxWYWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wb3NhbFZhbHVlLnJlZ2lvbk1hdGNoZXMoMCwgZXhpc3RpbmdWYWx1ZSwgMCwgZXhpc3RpbmdWYWx1ZS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wb3NhbHMuYWRkKG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsVmFsdWUuc3Vic3RyaW5nKGV4aXN0aW5nVmFsdWUubGVuZ3RoKCkpLCBnZXRJbWFnZShGX1RZUEVfVkFMVUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wb3NhbFZhbHVlLCBvZmZzZXQsIDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7CisgICAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmdWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbXSB7IG5ldyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKCJcIlwiIiwgZ2V0SW1hZ2UoRl9UWVBFX1ZBTFVFKSwgIlwiXCIiLCBvZmZzZXQsIDApIH07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOworICAgIH0KIAotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFBhY2thZ2VWZXJzaW9uQ29tcGxldGlvbnMoU3RyaW5nIHBhY2thZ2VJZCwgU3RyaW5nIGV4aXN0aW5nVmFsdWUsIGludCBvZmZzZXQpIHsKLQkJU2V0PFN0cmluZz4gcHJvcG9zZWRWZXJzaW9ucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJYm9vbGVhbiB3aWxkY2FyZCA9IHBhY2thZ2VJZC5lbmRzV2l0aCgiLioiKTsKLQkJcGFja2FnZUlkID0gZ2V0U3ltYm9saWNOYW1lKHBhY2thZ2VJZCk7Ci0JCVNldDxQYWNrYWdlRXhwb3J0PiBwYWNrYWdlcyA9IFJlcG9zaXRvcnlVdGlscy5nZXRJbXBvcnRQYWNrYWdlUHJvcG9zYWxzKGdldFByb2plY3QoKSwgcGFja2FnZUlkKTsKLQkJaWYgKHBhY2thZ2VzLnNpemUoKSA+IDApIHsKLQkJCUFycmF5TGlzdDxCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWw+KAotCQkJCQlwYWNrYWdlcy5zaXplKCkpOwotCQkJZm9yIChQYWNrYWdlRXhwb3J0IGVsZW1lbnQgOiBwYWNrYWdlcykgewotCQkJCWlmICh3aWxkY2FyZCB8fCBlbGVtZW50LmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHBhY2thZ2VJZCkpIHsKLQkJCQkJTGlzdDxTdHJpbmc+IHByb3Bvc2FsVmFsdWVzID0gZ2V0VmVyc2lvblByb3Bvc2FscyhlbGVtZW50LmdldFZlcnNpb24oKSk7Ci0JCQkJCWZvciAoU3RyaW5nIHByb3Bvc2FsVmFsdWUgOiBwcm9wb3NhbFZhbHVlcykgewotCQkJCQkJaWYgKCFwcm9wb3NlZFZlcnNpb25zLmNvbnRhaW5zKHByb3Bvc2FsVmFsdWUpCi0JCQkJCQkJCSYmIHByb3Bvc2FsVmFsdWUucmVnaW9uTWF0Y2hlcygwLCBleGlzdGluZ1ZhbHVlLCAwLCBleGlzdGluZ1ZhbHVlLmxlbmd0aCgpKSkgewotCQkJCQkJCXByb3Bvc2VkVmVyc2lvbnMuYWRkKHByb3Bvc2FsVmFsdWUpOwotCQkJCQkJCXByb3Bvc2Fscy5hZGQobmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwoCi0JCQkJCQkJCQlwcm9wb3NhbFZhbHVlLnN1YnN0cmluZyhleGlzdGluZ1ZhbHVlLmxlbmd0aCgpKSwgZ2V0SW1hZ2UoRl9UWVBFX1ZBTFVFKSwKLQkJCQkJCQkJCXByb3Bvc2FsVmFsdWUsIG9mZnNldCwgMCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHByb3Bvc2Fscy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2Fscy5zaXplKCldKTsKLQkJfSBlbHNlIGlmIChleGlzdGluZ1ZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHsgbmV3IEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwoIlwiXCIiLCBnZXRJbWFnZShGX1RZUEVfVkFMVUUpLCAiXCJcIiIsCi0JCQkJCW9mZnNldCwgMCkgfTsKLQkJfQotCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JfQorICAgIHByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFBhY2thZ2VWZXJzaW9uQ29tcGxldGlvbnMoU3RyaW5nIHBhY2thZ2VJZCwgU3RyaW5nIGV4aXN0aW5nVmFsdWUsIGludCBvZmZzZXQpIHsKKyAgICAgICAgU2V0PFN0cmluZz4gcHJvcG9zZWRWZXJzaW9ucyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgYm9vbGVhbiB3aWxkY2FyZCA9IHBhY2thZ2VJZC5lbmRzV2l0aCgiLioiKTsKKyAgICAgICAgcGFja2FnZUlkID0gZ2V0U3ltYm9saWNOYW1lKHBhY2thZ2VJZCk7CisgICAgICAgIFNldDxQYWNrYWdlRXhwb3J0PiBwYWNrYWdlcyA9IFJlcG9zaXRvcnlVdGlscy5nZXRJbXBvcnRQYWNrYWdlUHJvcG9zYWxzKGdldFByb2plY3QoKSwgcGFja2FnZUlkKTsKKyAgICAgICAgaWYgKHBhY2thZ2VzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PEJ1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWw+KHBhY2thZ2VzLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKFBhY2thZ2VFeHBvcnQgZWxlbWVudCA6IHBhY2thZ2VzKSB7CisgICAgICAgICAgICAgICAgaWYgKHdpbGRjYXJkIHx8IGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocGFja2FnZUlkKSkgeworICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gcHJvcG9zYWxWYWx1ZXMgPSBnZXRWZXJzaW9uUHJvcG9zYWxzKGVsZW1lbnQuZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcHJvcG9zYWxWYWx1ZSA6IHByb3Bvc2FsVmFsdWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb3Bvc2VkVmVyc2lvbnMuY29udGFpbnMocHJvcG9zYWxWYWx1ZSkgJiYgcHJvcG9zYWxWYWx1ZS5yZWdpb25NYXRjaGVzKDAsIGV4aXN0aW5nVmFsdWUsIDAsIGV4aXN0aW5nVmFsdWUubGVuZ3RoKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcG9zZWRWZXJzaW9ucy5hZGQocHJvcG9zYWxWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWxzLmFkZChuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NhbFZhbHVlLnN1YnN0cmluZyhleGlzdGluZ1ZhbHVlLmxlbmd0aCgpKSwgZ2V0SW1hZ2UoRl9UWVBFX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWxWYWx1ZSwgb2Zmc2V0LCAwKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pOworICAgICAgICB9IGVsc2UgaWYgKGV4aXN0aW5nVmFsdWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW10geyBuZXcgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCgiXCJcIiIsIGdldEltYWdlKEZfVFlQRV9WQUxVRSksICJcIlwiIiwgb2Zmc2V0LCAwKSB9OworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKKyAgICB9CiAKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRWZXJzaW9uUHJvcG9zYWxzKE9zZ2lWZXJzaW9uIHZlcnNpb24pIHsKLQkJU2V0PFN0cmluZz4gdmVyc2lvblN0cmluZ3MgPSBuZXcgTGlua2VkSGFzaFNldDxTdHJpbmc+KCk7Ci0JCXZlcnNpb25TdHJpbmdzLmFkZCh2ZXJzaW9uLnRvU3RyaW5nKCkpOwotCQlMaXN0PFN0cmluZz4gdmVyc2lvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgdmVyIDogUmVwb3NpdG9yeVV0aWxzLmdldFZlcnNpb25Qcm9wb3NhbHModmVyc2lvblN0cmluZ3MpKSB7Ci0JCQl2ZXJzaW9ucy5hZGQobmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQoIlwiIikuYXBwZW5kKHZlcikuYXBwZW5kKCJcIiIpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiB2ZXJzaW9uczsKLQl9CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0VmVyc2lvblByb3Bvc2FscyhPc2dpVmVyc2lvbiB2ZXJzaW9uKSB7CisgICAgICAgIFNldDxTdHJpbmc+IHZlcnNpb25TdHJpbmdzID0gbmV3IExpbmtlZEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICB2ZXJzaW9uU3RyaW5ncy5hZGQodmVyc2lvbi50b1N0cmluZygpKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHZlcnNpb25zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIHZlciA6IFJlcG9zaXRvcnlVdGlscy5nZXRWZXJzaW9uUHJvcG9zYWxzKHZlcnNpb25TdHJpbmdzKSkgeworICAgICAgICAgICAgdmVyc2lvbnMuYWRkKG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKCJcIiIpLmFwcGVuZCh2ZXIpLmFwcGVuZCgiXCIiKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmVyc2lvbnM7CisgICAgfQogCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZy5lbmRzV2l0aCgiLioiKSkgewotCQkJc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBzdHJpbmcubGVuZ3RoKCkgLSAyKTsKLQkJfQotCQlpbnQgaXggPSBzdHJpbmcuaW5kZXhPZignOycpOwotCQlpZiAoaXggPiAwKSB7Ci0JCQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBpeCk7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZzsKLQl9CisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgaWYgKHN0cmluZy5lbmRzV2l0aCgiLioiKSkgeworICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBzdHJpbmcubGVuZ3RoKCkgLSAyKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaXggPSBzdHJpbmcuaW5kZXhPZignOycpOworICAgICAgICBpZiAoaXggPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBpeCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0cmluZzsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoaW50IHR5cGUpIHsKLQkJaWYgKHR5cGUgPj0gMCAmJiB0eXBlIDwgRl9UT1RBTF9UWVBFUykgewotCQkJaWYgKGZJbWFnZXNbdHlwZV0gPT0gbnVsbCkgewotCQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgRl9UWVBFX0xJQjoKLQkJCQkJcmV0dXJuIGZJbWFnZXNbdHlwZV0gPSBQREVQbHVnaW5JbWFnZXMuREVTQ19KQVJfTElCX09CSi5jcmVhdGVJbWFnZSgpOwotCQkJCWNhc2UgRl9UWVBFX0JVTkRMRToKLQkJCQkJcmV0dXJuIGZJbWFnZXNbdHlwZV0gPSBQREVQbHVnaW5JbWFnZXMuREVTQ19CVU5ETEVfT0JKLmNyZWF0ZUltYWdlKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZkltYWdlc1t0eXBlXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UodHlwZSk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShpbnQgdHlwZSkgeworICAgICAgICBpZiAodHlwZSA+PSAwICYmIHR5cGUgPCBGX1RPVEFMX1RZUEVTKSB7CisgICAgICAgICAgICBpZiAodGhpcy5mSW1hZ2VzW3R5cGVdID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGX1RZUEVfTElCOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZkltYWdlc1t0eXBlXSA9IFBERVBsdWdpbkltYWdlcy5ERVNDX0pBUl9MSUJfT0JKLmNyZWF0ZUltYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRl9UWVBFX0JVTkRMRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZJbWFnZXNbdHlwZV0gPSBQREVQbHVnaW5JbWFnZXMuREVTQ19CVU5ETEVfT0JKLmNyZWF0ZUltYWdlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mSW1hZ2VzW3R5cGVdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5nZXRJbWFnZSh0eXBlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy90ZXh0L0J1bmRsZVR5cGVDb21wbGV0aW9uUHJvcG9zYWwuamF2YQppbmRleCA2MTZmN2NmLi4yNWNhYzE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvdGV4dC9CdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnMudGV4dDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7CkBAIC0zNCwyMDcgKzM1LDE5NyBAQAogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAYXV0aG9yIFN0ZWZmZW4gUGluZ2VsCiAgKi8KLXB1YmxpYyBjbGFzcyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsIGltcGxlbWVudHMgSUNvbXBsZXRpb25Qcm9wb3NhbCwgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbiwKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjMsIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb241IHsKK3B1YmxpYyBjbGFzcyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsCisgICAgaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsLCBJQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uLCBJQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMywgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjUgewogCi0JcHJvdGVjdGVkIFN0cmluZyBmUmVwbGFjZW1lbnRTdHJpbmc7CisgICAgcHJvdGVjdGVkIFN0cmluZyBmUmVwbGFjZW1lbnRTdHJpbmc7CiAKLQlwcm90ZWN0ZWQgSW1hZ2UgZkltYWdlOworICAgIHByb3RlY3RlZCBJbWFnZSBmSW1hZ2U7CiAKLQlwcm90ZWN0ZWQgU3RyaW5nIGZEaXNwbGF5U3RyaW5nOworICAgIHByb3RlY3RlZCBTdHJpbmcgZkRpc3BsYXlTdHJpbmc7CiAKLQlwcm90ZWN0ZWQgaW50IGZCZWdpbkluc2VydFBvaW50OworICAgIHByb3RlY3RlZCBpbnQgZkJlZ2luSW5zZXJ0UG9pbnQ7CiAKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGg7CisgICAgcHJvdGVjdGVkIGludCBmTGVuZ3RoOwogCi0JcHJvdGVjdGVkIFN0cmluZyBmQWRkaXRpb25hbEluZm87CisgICAgcHJvdGVjdGVkIFN0cmluZyBmQWRkaXRpb25hbEluZm87CiAKLQlwcml2YXRlIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGZDcmVhdG9yOworICAgIHByaXZhdGUgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZkNyZWF0b3I7CiAKLQlwdWJsaWMgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZykgewotCQl0aGlzKHJlcGxhY2VtZW50U3RyaW5nLCBpbWFnZSwgZGlzcGxheVN0cmluZywgMCwgMCk7Ci0JfQorICAgIHB1YmxpYyBCdW5kbGVUeXBlQ29tcGxldGlvblByb3Bvc2FsKFN0cmluZyByZXBsYWNlbWVudFN0cmluZywgSW1hZ2UgaW1hZ2UsIFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7CisgICAgICAgIHRoaXMocmVwbGFjZW1lbnRTdHJpbmcsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCAwLCAwKTsKKyAgICB9CiAKLQlwdWJsaWMgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywgaW50IHN0YXJ0T2Zmc2V0LAotCQkJaW50IGxlbmd0aCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHJlcGxhY2VtZW50U3RyaW5nKTsKKyAgICBwdWJsaWMgQnVuZGxlVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIEFzc2VydC5pc05vdE51bGwocmVwbGFjZW1lbnRTdHJpbmcpOwogCi0JCWZSZXBsYWNlbWVudFN0cmluZyA9IHJlcGxhY2VtZW50U3RyaW5nOwotCQlmSW1hZ2UgPSBpbWFnZTsKLQkJZkRpc3BsYXlTdHJpbmcgPSBkaXNwbGF5U3RyaW5nOwotCQlmQmVnaW5JbnNlcnRQb2ludCA9IHN0YXJ0T2Zmc2V0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KKyAgICAgICAgdGhpcy5mUmVwbGFjZW1lbnRTdHJpbmcgPSByZXBsYWNlbWVudFN0cmluZzsKKyAgICAgICAgdGhpcy5mSW1hZ2UgPSBpbWFnZTsKKyAgICAgICAgdGhpcy5mRGlzcGxheVN0cmluZyA9IGRpc3BsYXlTdHJpbmc7CisgICAgICAgIHRoaXMuZkJlZ2luSW5zZXJ0UG9pbnQgPSBzdGFydE9mZnNldDsKKyAgICAgICAgdGhpcy5mTGVuZ3RoID0gbGVuZ3RoOworICAgIH0KIAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUKLQkgKiBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNhcHBseShvcmcuZWNsaXBzZQotCSAqIC5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGZMZW5ndGggPT0gLTEpIHsKLQkJCVN0cmluZyBjdXJyZW50ID0gZG9jdW1lbnQuZ2V0KCk7Ci0JCQlmTGVuZ3RoID0gY3VycmVudC5sZW5ndGgoKTsKLQkJfQotCQl0cnkgewotCQkJZG9jdW1lbnQucmVwbGFjZShmQmVnaW5JbnNlcnRQb2ludCwgZkxlbmd0aCwgZlJlcGxhY2VtZW50U3RyaW5nKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gREVCVUcKLQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9CisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2FwcGx5KG9yZy5lY2xpcHNlIC5qZmFjZS50ZXh0LklEb2N1bWVudCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhcHBseShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKKyAgICAgICAgaWYgKHRoaXMuZkxlbmd0aCA9PSAtMSkgeworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBkb2N1bWVudC5nZXQoKTsKKyAgICAgICAgICAgIHRoaXMuZkxlbmd0aCA9IGN1cnJlbnQubGVuZ3RoKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRvY3VtZW50LnJlcGxhY2UodGhpcy5mQmVnaW5JbnNlcnRQb2ludCwgdGhpcy5mTGVuZ3RoLCB0aGlzLmZSZXBsYWNlbWVudFN0cmluZyk7CisgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIERFQlVHCisgICAgICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsIwotCSAqIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJLy8gTm8gYWRkaXRpb25hbCBwcm9wb3NhbCBpbmZvcm1hdGlvbgotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgLyoKKyAgICAgKiAobm9uLUphdmFkb2MpCisgICAgICoKKyAgICAgKiBAc2Vlb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKKyAgICAgICAgLy8gTm8gYWRkaXRpb25hbCBwcm9wb3NhbCBpbmZvcm1hdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2Vlb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjCi0JICogZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0JCS8vIE5vIGNvbnRleHQgaW5mb3JtYXRpb24KLQkJcmV0dXJuIG51bGw7Ci0JfQorICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsIyBnZXRDb250ZXh0SW5mb3JtYXRpb24oKQorICAgICAqLworICAgIHB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uIGdldENvbnRleHRJbmZvcm1hdGlvbigpIHsKKyAgICAgICAgLy8gTm8gY29udGV4dCBpbmZvcm1hdGlvbgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlCi0JICogb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0RGlzcGxheVN0cmluZwotCSAqICgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gZkRpc3BsYXlTdHJpbmc7Ci0JfQorICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXREaXNwbGF5U3RyaW5nICgpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gdGhpcy5mRGlzcGxheVN0cmluZzsKKyAgICB9CiAKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBmSW1hZ2U7Ci0JfQorICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRJbWFnZSgpCisgICAgICovCisgICAgcHVibGljIEltYWdlIGdldEltYWdlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5mSW1hZ2U7CisgICAgfQogCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZQotCSAqIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldFNlbGVjdGlvbgotCSAqIChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZlJlcGxhY2VtZW50U3RyaW5nLmVxdWFscygiXCJcIiIpKSB7Ci0JCQlyZXR1cm4gbmV3IFBvaW50KGZCZWdpbkluc2VydFBvaW50ICsgMSwgMCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQb2ludChmQmVnaW5JbnNlcnRQb2ludCArIGZSZXBsYWNlbWVudFN0cmluZy5sZW5ndGgoKSwgMCk7Ci0JfQorICAgIC8qCisgICAgICogKG5vbi1KYXZhZG9jKQorICAgICAqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRTZWxlY3Rpb24gKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQorICAgICAqLworICAgIHB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7CisgICAgICAgIGlmICh0aGlzLmZSZXBsYWNlbWVudFN0cmluZy5lcXVhbHMoIlwiXCIiKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLmZCZWdpbkluc2VydFBvaW50ICsgMSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLmZCZWdpbkluc2VydFBvaW50ICsgdGhpcy5mUmVwbGFjZW1lbnRTdHJpbmcubGVuZ3RoKCksIDApOworICAgIH0KIAotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlcGxhY2VtZW50U3RyaW5nKCkgewotCQlyZXR1cm4gZlJlcGxhY2VtZW50U3RyaW5nOwotCX0KKyAgICAvKioKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXBsYWNlbWVudFN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZlJlcGxhY2VtZW50U3RyaW5nOworICAgIH0KIAotCXB1YmxpYyBPYmplY3QgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGZBZGRpdGlvbmFsSW5mbzsKLQl9CisgICAgcHVibGljIE9iamVjdCBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworICAgICAgICByZXR1cm4gdGhpcy5mQWRkaXRpb25hbEluZm87CisgICAgfQogCi0JcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbyhTdHJpbmcgaW5mbykgewotCQlmQWRkaXRpb25hbEluZm8gPSBpbmZvOwotCX0KKyAgICBwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKFN0cmluZyBpbmZvKSB7CisgICAgICAgIHRoaXMuZkFkZGl0aW9uYWxJbmZvID0gaW5mbzsKKyAgICB9CiAKLQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZ2V0SW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLQkJU2hlbGwgc2hlbGwgPSBKYXZhUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCk7Ci0JCWlmIChzaGVsbCA9PSBudWxsIHx8ICFCcm93c2VySW5mb3JtYXRpb25Db250cm9sLmlzQXZhaWxhYmxlKHNoZWxsKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KKyAgICBwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZ2V0SW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKKyAgICAgICAgU2hlbGwgc2hlbGwgPSBKYXZhUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCk7CisgICAgICAgIGlmIChzaGVsbCA9PSBudWxsIHx8ICFCcm93c2VySW5mb3JtYXRpb25Db250cm9sLmlzQXZhaWxhYmxlKHNoZWxsKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAotCQlpZiAoZkNyZWF0b3IgPT0gbnVsbCkgewotCQkJZkNyZWF0b3IgPSBuZXcgQWJzdHJhY3RSZXVzYWJsZUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7CisgICAgICAgIGlmICh0aGlzLmZDcmVhdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuZkNyZWF0b3IgPSBuZXcgQWJzdHJhY3RSZXVzYWJsZUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7CiAKLQkJCQkvKgotCQkJCSAqIEBzZWVvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5qYXZhLmhvdmVyLgotCQkJCSAqIEFic3RyYWN0UmV1c2FibGVJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yCi0JCQkJICogI2RvQ3JlYXRlSW5mb3JtYXRpb25Db250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCQkJCSAqLwotCQkJCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGRvQ3JlYXRlSW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCkgewotCQkJCQlyZXR1cm4gbmV3IEJyb3dzZXJJbmZvcm1hdGlvbkNvbnRyb2wocGFyZW50LCBKRmFjZVJlc291cmNlcy5ESUFMT0dfRk9OVCwKLQkJCQkJCQlFZGl0b3JzVUkuZ2V0VG9vbHRpcEFmZm9yZGFuY2VTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gZkNyZWF0b3I7Ci0JfQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQHNlZW9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuaG92ZXIuIEFic3RyYWN0UmV1c2FibGVJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yCisgICAgICAgICAgICAgICAgICogI2RvQ3JlYXRlSW5mb3JtYXRpb25Db250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGRvQ3JlYXRlSW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJyb3dzZXJJbmZvcm1hdGlvbkNvbnRyb2wocGFyZW50LCBKRmFjZVJlc291cmNlcy5ESUFMT0dfRk9OVCwgRWRpdG9yc1VJLmdldFRvb2x0aXBBZmZvcmRhbmNlU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZkNyZWF0b3I7CisgICAgfQogCi0JcHVibGljIGludCBnZXRQcmVmaXhDb21wbGV0aW9uU3RhcnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgY29tcGxldGlvbk9mZnNldCkgewotCQlyZXR1cm4gZkJlZ2luSW5zZXJ0UG9pbnQ7Ci0JfQorICAgIHB1YmxpYyBpbnQgZ2V0UHJlZml4Q29tcGxldGlvblN0YXJ0KElEb2N1bWVudCBkb2N1bWVudCwgaW50IGNvbXBsZXRpb25PZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZkJlZ2luSW5zZXJ0UG9pbnQ7CisgICAgfQogCi0JcHVibGljIENoYXJTZXF1ZW5jZSBnZXRQcmVmaXhDb21wbGV0aW9uVGV4dChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBjb21wbGV0aW9uT2Zmc2V0KSB7Ci0JCXJldHVybiBmUmVwbGFjZW1lbnRTdHJpbmc7Ci0JfQorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0UHJlZml4Q29tcGxldGlvblRleHQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgY29tcGxldGlvbk9mZnNldCkgeworICAgICAgICByZXR1cm4gdGhpcy5mUmVwbGFjZW1lbnRTdHJpbmc7CisgICAgfQogCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50LCBjaGFyIHRyaWdnZXIsIGludCBvZmZzZXQpIHsKLQkJaWYgKGZMZW5ndGggPT0gLTEpIHsKLQkJCVN0cmluZyBjdXJyZW50ID0gZG9jdW1lbnQuZ2V0KCk7Ci0JCQlmTGVuZ3RoID0gY3VycmVudC5sZW5ndGgoKTsKLQkJfQotCQl0cnkgewotCQkJZG9jdW1lbnQucmVwbGFjZShmQmVnaW5JbnNlcnRQb2ludCwgZkxlbmd0aCwgZlJlcGxhY2VtZW50U3RyaW5nKTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gREVCVUcKLQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9CisgICAgcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50LCBjaGFyIHRyaWdnZXIsIGludCBvZmZzZXQpIHsKKyAgICAgICAgaWYgKHRoaXMuZkxlbmd0aCA9PSAtMSkgeworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBkb2N1bWVudC5nZXQoKTsKKyAgICAgICAgICAgIHRoaXMuZkxlbmd0aCA9IGN1cnJlbnQubGVuZ3RoKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRvY3VtZW50LnJlcGxhY2UodGhpcy5mQmVnaW5JbnNlcnRQb2ludCwgdGhpcy5mTGVuZ3RoLCB0aGlzLmZSZXBsYWNlbWVudFN0cmluZyk7CisgICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIERFQlVHCisgICAgICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIGludCBnZXRDb250ZXh0SW5mb3JtYXRpb25Qb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZCZWdpbkluc2VydFBvaW50OwotCX0KKyAgICBwdWJsaWMgaW50IGdldENvbnRleHRJbmZvcm1hdGlvblBvc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5mQmVnaW5JbnNlcnRQb2ludDsKKyAgICB9CiAKLQlwdWJsaWMgY2hhcltdIGdldFRyaWdnZXJDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbmV3IGNoYXJbMF07Ci0JfQorICAgIHB1YmxpYyBjaGFyW10gZ2V0VHJpZ2dlckNoYXJhY3RlcnMoKSB7CisgICAgICAgIHJldHVybiBuZXcgY2hhclswXTsKKyAgICB9CiAKLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkRm9yKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQlpZiAob2Zmc2V0IDwgZkJlZ2luSW5zZXJ0UG9pbnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgbmV3TGVuZ3RoID0gb2Zmc2V0IC0gZkJlZ2luSW5zZXJ0UG9pbnQ7Ci0JCWludCBkZWx0YSA9IG5ld0xlbmd0aCAtIGZMZW5ndGg7Ci0JCWZMZW5ndGggPSBkZWx0YSArIGZMZW5ndGg7CisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZEZvcihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKKyAgICAgICAgaWYgKG9mZnNldCA8IHRoaXMuZkJlZ2luSW5zZXJ0UG9pbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbmV3TGVuZ3RoID0gb2Zmc2V0IC0gdGhpcy5mQmVnaW5JbnNlcnRQb2ludDsKKyAgICAgICAgaW50IGRlbHRhID0gbmV3TGVuZ3RoIC0gdGhpcy5mTGVuZ3RoOworICAgICAgICB0aGlzLmZMZW5ndGggPSBkZWx0YSArIHRoaXMuZkxlbmd0aDsKIAotCQlyZXR1cm4gc3RhcnRzV2l0aChkb2N1bWVudCwgb2Zmc2V0LCBmRGlzcGxheVN0cmluZyk7Ci0JfQorICAgICAgICByZXR1cm4gc3RhcnRzV2l0aChkb2N1bWVudCwgb2Zmc2V0LCB0aGlzLmZEaXNwbGF5U3RyaW5nKTsKKyAgICB9CiAKLQkvLyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gSmF2YUNvbXBsZXRpb25Qcm9wb3NhbAotCXByb3RlY3RlZCBib29sZWFuIHN0YXJ0c1dpdGgoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBTdHJpbmcgd29yZCkgewotCQlpbnQgd29yZExlbmd0aCA9IHdvcmQgPT0gbnVsbCA/IDAgOiB3b3JkLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0ID4gZkJlZ2luSW5zZXJ0UG9pbnQgKyB3b3JkTGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKyAgICAvLyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gSmF2YUNvbXBsZXRpb25Qcm9wb3NhbAorICAgIHByb3RlY3RlZCBib29sZWFuIHN0YXJ0c1dpdGgoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBTdHJpbmcgd29yZCkgeworICAgICAgICBpbnQgd29yZExlbmd0aCA9IHdvcmQgPT0gbnVsbCA/IDAgOiB3b3JkLmxlbmd0aCgpOworICAgICAgICBpZiAob2Zmc2V0ID4gdGhpcy5mQmVnaW5JbnNlcnRQb2ludCArIHdvcmRMZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQlpbnQgbGVuZ3RoID0gb2Zmc2V0IC0gZkJlZ2luSW5zZXJ0UG9pbnQ7Ci0JCQlTdHJpbmcgc3RhcnQgPSBkb2N1bWVudC5nZXQoZkJlZ2luSW5zZXJ0UG9pbnQsIGxlbmd0aCk7Ci0JCQkvLyBSZW1vdmUgIiBmb3IgY29tcGFyaXNvbgotCQkJcmV0dXJuIHdvcmQgIT0gbnVsbCAmJiB3b3JkLnN1YnN0cmluZygwLCBzdGFydC5sZW5ndGgoKSkuZXF1YWxzSWdub3JlQ2FzZShzdGFydCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IG9mZnNldCAtIHRoaXMuZkJlZ2luSW5zZXJ0UG9pbnQ7CisgICAgICAgICAgICBTdHJpbmcgc3RhcnQgPSBkb2N1bWVudC5nZXQodGhpcy5mQmVnaW5JbnNlcnRQb2ludCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSAiIGZvciBjb21wYXJpc29uCisgICAgICAgICAgICByZXR1cm4gd29yZCAhPSBudWxsICYmIHdvcmQuc3Vic3RyaW5nKDAsIHN0YXJ0Lmxlbmd0aCgpKS5lcXVhbHNJZ25vcmVDYXNlKHN0YXJ0KTsKKyAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgeworICAgICAgICB9CiAKLQkJcmV0dXJuIGZhbHNlOwotCX0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvSVNwcmluZ0NvbG9yQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvSVNwcmluZ0NvbG9yQ29uc3RhbnRzLmphdmEKaW5kZXggZjNiZDYwZS4uMGYzMWQ5NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy90ZXh0L0lTcHJpbmdDb2xvckNvbnN0YW50cy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvdGV4dC9JU3ByaW5nQ29sb3JDb25zdGFudHMuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9ycy50ZXh0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKQEAgLTE3LDggKzE4LDggQEAKICAqLwogcHVibGljIGludGVyZmFjZSBJU3ByaW5nQ29sb3JDb25zdGFudHMgewogCi0JcHVibGljIFJHQiBIRUFERVJfU1BSSU5HID0gbmV3IFJHQigwLCAxMTIsIDYwKTsKKyAgICBwdWJsaWMgUkdCIEhFQURFUl9TUFJJTkcgPSBuZXcgUkdCKDAsIDExMiwgNjApOwogCi0JcHVibGljIFN0cmluZyBQX0hFQURFUl9TUFJJTkcgPSAiZWRpdG9yLmNvbG9yLmhlYWRlcl9zcHJpbmciOworICAgIHB1YmxpYyBTdHJpbmcgUF9IRUFERVJfU1BSSU5HID0gImVkaXRvci5jb2xvci5oZWFkZXJfc3ByaW5nIjsKIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy90ZXh0L0pGYWNlQWJzdHJhY3RJbmZvcm1hdGlvbkNvbnRyb2wuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvdGV4dC9KRmFjZUFic3RyYWN0SW5mb3JtYXRpb25Db250cm9sLmphdmEKaW5kZXggYjQwNDg2MS4uMGFjOWNkOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy90ZXh0L0pGYWNlQWJzdHJhY3RJbmZvcm1hdGlvbkNvbnRyb2wuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvSkZhY2VBYnN0cmFjdEluZm9ybWF0aW9uQ29udHJvbC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5lZGl0b3JzLnRleHQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwpAQCAtNjQsNzE0ICs2NSw2OTggQEAKICAqIHtAbGluayBJSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uMn0uIFRoZXkgc2hvdWxkIGFsc28gZXh0ZW5kIHtAbGluayAjY29tcHV0ZVRyaW0oKX0gaWYgdGhleSBjcmVhdGUgYSBjb250ZW50IGFyZWEKICAqIHdpdGggYWRkaXRpb25hbCB0cmltIChlLmcuIHNjcm9sbGJhcnMpIGFuZCBvdmVycmlkZSB7QGxpbmsgI2dldEluZm9ybWF0aW9uUHJlc2VudGVyQ29udHJvbENyZWF0b3IoKX0uCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAzLjQKICAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpGYWNlQWJzdHJhY3RJbmZvcm1hdGlvbkNvbnRyb2wgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Db250cm9sLCBJSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uLAotCQlJSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uMywgSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbjQsIEpGYWNlSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbjUgeworcHVibGljIGFic3RyYWN0IGNsYXNzIEpGYWNlQWJzdHJhY3RJbmZvcm1hdGlvbkNvbnRyb2wgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Db250cm9sLCBJSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uLCBJSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uMywKKyAgICBJSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uNCwgSkZhY2VJSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uNSB7CiAKLQkvKiogVGhlIGluZm9ybWF0aW9uIGNvbnRyb2wncyBzaGVsbC4gKi8KLQlwcml2YXRlIGZpbmFsIFNoZWxsIGZTaGVsbDsKKyAgICAvKiogVGhlIGluZm9ybWF0aW9uIGNvbnRyb2wncyBzaGVsbC4gKi8KKyAgICBwcml2YXRlIGZpbmFsIFNoZWxsIGZTaGVsbDsKIAotCS8qKiBDb21wb3NpdGUgY29udGFpbmluZyB0aGUgY29udGVudCBjcmVhdGVkIGJ5IHN1YmNsYXNzZXMuICovCi0JcHJpdmF0ZSBmaW5hbCBDb21wb3NpdGUgZkNvbnRlbnRDb21wb3NpdGU7CisgICAgLyoqIENvbXBvc2l0ZSBjb250YWluaW5nIHRoZSBjb250ZW50IGNyZWF0ZWQgYnkgc3ViY2xhc3Nlcy4gKi8KKyAgICBwcml2YXRlIGZpbmFsIENvbXBvc2l0ZSBmQ29udGVudENvbXBvc2l0ZTsKIAotCS8qKiBXaGV0aGVyIHRoZSBpbmZvcm1hdGlvbiBjb250cm9sIGlzIHJlc2l6YWJsZS4gKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZlJlc2l6YWJsZTsKKyAgICAvKiogV2hldGhlciB0aGUgaW5mb3JtYXRpb24gY29udHJvbCBpcyByZXNpemFibGUuICovCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZSZXNpemFibGU7CiAKLQkvKioKLQkgKiBDb21wb3NpdGUgY29udGFpbmluZyB0aGUgc3RhdHVzIGxpbmUgY29udGVudCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGZTdGF0dXNDb21wb3NpdGU7CisgICAgLyoqCisgICAgICogQ29tcG9zaXRlIGNvbnRhaW5pbmcgdGhlIHN0YXR1cyBsaW5lIGNvbnRlbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbXBvc2l0ZSBmU3RhdHVzQ29tcG9zaXRlOwogCi0JLyoqIFNlcGFyYXRvciBiZXR3ZWVuIGNvbnRlbnQgYW5kIHN0YXR1cyBsaW5lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuICovCi0JcHJpdmF0ZSBMYWJlbCBmU2VwYXJhdG9yOworICAgIC8qKiBTZXBhcmF0b3IgYmV0d2VlbiBjb250ZW50IGFuZCBzdGF0dXMgbGluZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLiAqLworICAgIHByaXZhdGUgTGFiZWwgZlNlcGFyYXRvcjsKIAotCS8qKiBMYWJlbCBpbiB0aGUgc3RhdHVzIGxpbmUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gKi8KLQlwcml2YXRlIExhYmVsIGZTdGF0dXNMYWJlbDsKKyAgICAvKiogTGFiZWwgaW4gdGhlIHN0YXR1cyBsaW5lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuICovCisgICAgcHJpdmF0ZSBMYWJlbCBmU3RhdHVzTGFiZWw7CiAKLQkvKiogVGhlIHRvb2xiYXIgbWFuYWdlciB1c2VkIGJ5IHRoZSB0b29sYmFyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuICovCi0JcHJpdmF0ZSBmaW5hbCBUb29sQmFyTWFuYWdlciBmVG9vbEJhck1hbmFnZXI7CisgICAgLyoqIFRoZSB0b29sYmFyIG1hbmFnZXIgdXNlZCBieSB0aGUgdG9vbGJhciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLiAqLworICAgIHByaXZhdGUgZmluYWwgVG9vbEJhck1hbmFnZXIgZlRvb2xCYXJNYW5hZ2VyOwogCi0JLyoqIFN0YXR1cyBsaW5lIHRvb2xiYXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gKi8KLQlwcml2YXRlIFRvb2xCYXIgZlRvb2xCYXI7CisgICAgLyoqIFN0YXR1cyBsaW5lIHRvb2xiYXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gKi8KKyAgICBwcml2YXRlIFRvb2xCYXIgZlRvb2xCYXI7CiAKLQkvKiogTGlzdGVuZXIgZm9yIHNoZWxsIGFjdGl2YXRpb24gYW5kIGRlYWN0aXZhdGlvbi4gKi8KLQlwcml2YXRlIExpc3RlbmVyIGZTaGVsbExpc3RlbmVyOworICAgIC8qKiBMaXN0ZW5lciBmb3Igc2hlbGwgYWN0aXZhdGlvbiBhbmQgZGVhY3RpdmF0aW9uLiAqLworICAgIHByaXZhdGUgTGlzdGVuZXIgZlNoZWxsTGlzdGVuZXI7CiAKLQkvKiogQWxsIGZvY3VzIGxpc3RlbmVycyByZWdpc3RlcmVkIHRvIHRoaXMgaW5mb3JtYXRpb24gY29udHJvbC4gKi8KLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdCBmRm9jdXNMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KExpc3RlbmVyTGlzdC5JREVOVElUWSk7CisgICAgLyoqIEFsbCBmb2N1cyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCB0byB0aGlzIGluZm9ybWF0aW9uIGNvbnRyb2wuICovCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3QgZkZvY3VzTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdChMaXN0ZW5lckxpc3QuSURFTlRJVFkpOwogCi0JLyoqCi0JICogU2l6ZSBjb25zdHJhaW50cywgeCBpcyB0aGUgbWF4V2lkdGggYW5kIHkgaXMgdGhlIG1heEhlaWdodCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KLQkgKi8KLQlwcml2YXRlIFBvaW50IGZTaXplQ29uc3RyYWludHM7CisgICAgLyoqCisgICAgICogU2l6ZSBjb25zdHJhaW50cywgeCBpcyB0aGUgbWF4V2lkdGggYW5kIHkgaXMgdGhlIG1heEhlaWdodCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFBvaW50IGZTaXplQ29uc3RyYWludHM7CiAKLQkvKiogVGhlIHNpemUgb2YgdGhlIHJlc2l6ZSBoYW5kbGUgaWYgYWxyZWFkeSBzZXQsIC0xIG90aGVyd2lzZSAqLwotCXByaXZhdGUgaW50IGZSZXNpemVIYW5kbGVTaXplOworICAgIC8qKiBUaGUgc2l6ZSBvZiB0aGUgcmVzaXplIGhhbmRsZSBpZiBhbHJlYWR5IHNldCwgLTEgb3RoZXJ3aXNlICovCisgICAgcHJpdmF0ZSBpbnQgZlJlc2l6ZUhhbmRsZVNpemU7CiAKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFic3RyYWN0IGluZm9ybWF0aW9uIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gc2hlbGwgYXMgcGFyZW50LiBUaGUgY29udHJvbCB3aWxsIG5vdCBiZSByZXNpemFibGUgYW5kCi0JICogb3B0aW9uYWxseSBzaG93IGEgc3RhdHVzIGxpbmUgd2l0aCB0aGUgZ2l2ZW4gc3RhdHVzIGZpZWxkIHRleHQuCi0JICogPHA+Ci0JICogPGVtPkltcG9ydGFudDogU3ViY2xhc3NlcyBhcmUgcmVxdWlyZWQgdG8gY2FsbCB7QGxpbmsgI2NyZWF0ZSgpfSBhdCB0aGUgZW5kIG9mIHRoZWlyIGNvbnN0cnVjdG9yLjwvZW0+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvZiB0aGlzIGNvbnRyb2wncyBzaGVsbAotCSAqIEBwYXJhbSBzdGF0dXNGaWVsZFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIGJlIHVzZWQgaW4gdGhlIHN0YXR1cyBmaWVsZCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBoaWRlIHRoZSBzdGF0dXMgZmllbGQKLQkgKi8KLQlwdWJsaWMgSkZhY2VBYnN0cmFjdEluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIHN0YXR1c0ZpZWxkVGV4dCkgewotCQl0aGlzKHBhcmVudFNoZWxsLCBTV1QuVE9PTCB8IFNXVC5PTl9UT1AsIHN0YXR1c0ZpZWxkVGV4dCwgbnVsbCk7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gYWJzdHJhY3QgaW5mb3JtYXRpb24gY29udHJvbCB3aXRoIHRoZSBnaXZlbiBzaGVsbCBhcyBwYXJlbnQuIFRoZSBjb250cm9sIHdpbGwgbm90IGJlIHJlc2l6YWJsZSBhbmQKKyAgICAgKiBvcHRpb25hbGx5IHNob3cgYSBzdGF0dXMgbGluZSB3aXRoIHRoZSBnaXZlbiBzdGF0dXMgZmllbGQgdGV4dC4KKyAgICAgKiA8cD4KKyAgICAgKiA8ZW0+SW1wb3J0YW50OiBTdWJjbGFzc2VzIGFyZSByZXF1aXJlZCB0byBjYWxsIHtAbGluayAjY3JlYXRlKCl9IGF0IHRoZSBlbmQgb2YgdGhlaXIgY29uc3RydWN0b3IuPC9lbT4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhlIHBhcmVudCBvZiB0aGlzIGNvbnRyb2wncyBzaGVsbAorICAgICAqIEBwYXJhbSBzdGF0dXNGaWVsZFRleHQgdGhlIHRleHQgdG8gYmUgdXNlZCBpbiB0aGUgc3RhdHVzIGZpZWxkIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGhpZGUgdGhlIHN0YXR1cyBmaWVsZAorICAgICAqLworICAgIHB1YmxpYyBKRmFjZUFic3RyYWN0SW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgc3RhdHVzRmllbGRUZXh0KSB7CisgICAgICAgIHRoaXMocGFyZW50U2hlbGwsIFNXVC5UT09MIHwgU1dULk9OX1RPUCwgc3RhdHVzRmllbGRUZXh0LCBudWxsKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFic3RyYWN0IGluZm9ybWF0aW9uIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gc2hlbGwgYXMgcGFyZW50LiBUaGUgY29udHJvbCB3aWxsIGJlIHJlc2l6YWJsZSBhbmQKLQkgKiBvcHRpb25hbGx5IHNob3cgYSB0b29sIGJhciBtYW5hZ2VkIGJ5IHRoZSBnaXZlbiB0b29sIGJhciBtYW5hZ2VyLgotCSAqIDxwPgotCSAqIDxlbT5JbXBvcnRhbnQ6IFN1YmNsYXNzZXMgYXJlIHJlcXVpcmVkIHRvIGNhbGwge0BsaW5rICNjcmVhdGUoKX0gYXQgdGhlIGVuZCBvZiB0aGVpciBjb25zdHJ1Y3Rvci48L2VtPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2YgdGhpcyBjb250cm9sJ3Mgc2hlbGwKLQkgKiBAcGFyYW0gdG9vbEJhck1hbmFnZXIKLQkgKiAgICAgICAgICAgIHRoZSBtYW5hZ2VyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRvb2xiYXIgaXMgbm90IGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgSkZhY2VBYnN0cmFjdEluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnRTaGVsbCwgVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJdGhpcyhwYXJlbnRTaGVsbCwgU1dULlRPT0wgfCBTV1QuT05fVE9QIHwgU1dULlJFU0laRSwgbnVsbCwgdG9vbEJhck1hbmFnZXIpOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGFic3RyYWN0IGluZm9ybWF0aW9uIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gc2hlbGwgYXMgcGFyZW50LiBUaGUgY29udHJvbCB3aWxsIGJlIHJlc2l6YWJsZSBhbmQKKyAgICAgKiBvcHRpb25hbGx5IHNob3cgYSB0b29sIGJhciBtYW5hZ2VkIGJ5IHRoZSBnaXZlbiB0b29sIGJhciBtYW5hZ2VyLgorICAgICAqIDxwPgorICAgICAqIDxlbT5JbXBvcnRhbnQ6IFN1YmNsYXNzZXMgYXJlIHJlcXVpcmVkIHRvIGNhbGwge0BsaW5rICNjcmVhdGUoKX0gYXQgdGhlIGVuZCBvZiB0aGVpciBjb25zdHJ1Y3Rvci48L2VtPgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnRTaGVsbCB0aGUgcGFyZW50IG9mIHRoaXMgY29udHJvbCdzIHNoZWxsCisgICAgICogQHBhcmFtIHRvb2xCYXJNYW5hZ2VyIHRoZSBtYW5hZ2VyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRvb2xiYXIgaXMgbm90IGRlc2lyZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgSkZhY2VBYnN0cmFjdEluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnRTaGVsbCwgVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKKyAgICAgICAgdGhpcyhwYXJlbnRTaGVsbCwgU1dULlRPT0wgfCBTV1QuT05fVE9QIHwgU1dULlJFU0laRSwgbnVsbCwgdG9vbEJhck1hbmFnZXIpOworICAgIH0KIAotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWJzdHJhY3QgaW5mb3JtYXRpb24gY29udHJvbCB3aXRoIHRoZSBnaXZlbiBzaGVsbCBhcyBwYXJlbnQuCi0JICogPHA+Ci0JICogPGVtPkltcG9ydGFudDogU3ViY2xhc3NlcyBhcmUgcmVxdWlyZWQgdG8gY2FsbCB7QGxpbmsgI2NyZWF0ZSgpfSBhdCB0aGUgZW5kIG9mIHRoZWlyIGNvbnN0cnVjdG9yLjwvZW0+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvZiB0aGlzIGNvbnRyb2wncyBzaGVsbAotCSAqIEBwYXJhbSBpc1Jlc2l6YWJsZQotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRyb2wgc2hvdWxkIGJlIHJlc2l6YWJsZQotCSAqLwotCXB1YmxpYyBKRmFjZUFic3RyYWN0SW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudFNoZWxsLCBib29sZWFuIGlzUmVzaXphYmxlKSB7Ci0JCXRoaXMocGFyZW50U2hlbGwsIFNXVC5UT09MIHwgU1dULk9OX1RPUCB8IChpc1Jlc2l6YWJsZSA/IFNXVC5SRVNJWkUgOiAwKSwgbnVsbCwgbnVsbCk7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gYWJzdHJhY3QgaW5mb3JtYXRpb24gY29udHJvbCB3aXRoIHRoZSBnaXZlbiBzaGVsbCBhcyBwYXJlbnQuCisgICAgICogPHA+CisgICAgICogPGVtPkltcG9ydGFudDogU3ViY2xhc3NlcyBhcmUgcmVxdWlyZWQgdG8gY2FsbCB7QGxpbmsgI2NyZWF0ZSgpfSBhdCB0aGUgZW5kIG9mIHRoZWlyIGNvbnN0cnVjdG9yLjwvZW0+CisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBwYXJlbnQgb2YgdGhpcyBjb250cm9sJ3Mgc2hlbGwKKyAgICAgKiBAcGFyYW0gaXNSZXNpemFibGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRyb2wgc2hvdWxkIGJlIHJlc2l6YWJsZQorICAgICAqLworICAgIHB1YmxpYyBKRmFjZUFic3RyYWN0SW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudFNoZWxsLCBib29sZWFuIGlzUmVzaXphYmxlKSB7CisgICAgICAgIHRoaXMocGFyZW50U2hlbGwsIFNXVC5UT09MIHwgU1dULk9OX1RPUCB8IChpc1Jlc2l6YWJsZSA/IFNXVC5SRVNJWkUgOiAwKSwgbnVsbCwgbnVsbCk7CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhYnN0cmFjdCBpbmZvcm1hdGlvbiBjb250cm9sIHdpdGggdGhlIGdpdmVuIHNoZWxsIGFzIHBhcmVudC4gVGhlIGdpdmVuIHNoZWxsIHN0eWxlIGlzIHVzZWQgZm9yIHRoZQotCSAqIHNoZWxsIChOT19UUklNIHdpbGwgYmUgcmVtb3ZlZCB0byBtYWtlIHN1cmUgdGhlcmUncyBhIGJvcmRlcikuCi0JICogPHA+Ci0JICogVGhlIGNvbnRyb2wgd2lsbCBvcHRpb25hbGx5IHNob3cgZWl0aGVyIGEgc3RhdHVzIGxpbmUgb3IgYSB0b29sIGJhci4gQXQgbW9zdCBvbmUgb2YgPGNvZGU+dG9vbEJhck1hbmFnZXI8L2NvZGU+Ci0JICogb3IgPGNvZGU+c3RhdHVzRmllbGRUZXh0PC9jb2RlPiBjYW4gYmUgbm9uLW51bGwuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxzdHJvbmc+SW1wb3J0YW50Ojwvc3Ryb25nPjogU3ViY2xhc3NlcyBhcmUgcmVxdWlyZWQgdG8gY2FsbCB7QGxpbmsgI2NyZWF0ZSgpfSBhdCB0aGUgZW5kIG9mIHRoZWlyIGNvbnN0cnVjdG9yLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2YgdGhpcyBjb250cm9sJ3Mgc2hlbGwKLQkgKiBAcGFyYW0gc2hlbGxTdHlsZQotCSAqICAgICAgICAgICAgc3R5bGUgb2YgdGhpcyBjb250cm9sJ3Mgc2hlbGwKLQkgKiBAcGFyYW0gc3RhdHVzRmllbGRUZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB0byBiZSB1c2VkIGluIHRoZSBzdGF0dXMgZmllbGQgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gaGlkZSB0aGUgc3RhdHVzIGZpZWxkCi0JICogQHBhcmFtIHRvb2xCYXJNYW5hZ2VyCi0JICogICAgICAgICAgICB0aGUgbWFuYWdlciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0b29sYmFyIGlzIG5vdCBkZXNpcmVkCi0JICogQGRlcHJlY2F0ZWQgY2xpZW50cyBzaG91bGQgdXNlIG9uZSBvZiB0aGUgcHVibGljIGNvbnN0cnVjdG9ycwotCSAqLwotCUBEZXByZWNhdGVkCi0JSkZhY2VBYnN0cmFjdEluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnRTaGVsbCwgaW50IHNoZWxsU3R5bGUsIGZpbmFsIFN0cmluZyBzdGF0dXNGaWVsZFRleHQsCi0JCQlmaW5hbCBUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQlBc3NlcnQuaXNUcnVlKHN0YXR1c0ZpZWxkVGV4dCA9PSBudWxsIHx8IHRvb2xCYXJNYW5hZ2VyID09IG51bGwpOwotCQlmUmVzaXplSGFuZGxlU2l6ZSA9IC0xOwotCQlmVG9vbEJhck1hbmFnZXIgPSB0b29sQmFyTWFuYWdlcjsKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGFic3RyYWN0IGluZm9ybWF0aW9uIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gc2hlbGwgYXMgcGFyZW50LiBUaGUgZ2l2ZW4gc2hlbGwgc3R5bGUgaXMgdXNlZCBmb3IgdGhlCisgICAgICogc2hlbGwgKE5PX1RSSU0gd2lsbCBiZSByZW1vdmVkIHRvIG1ha2Ugc3VyZSB0aGVyZSdzIGEgYm9yZGVyKS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY29udHJvbCB3aWxsIG9wdGlvbmFsbHkgc2hvdyBlaXRoZXIgYSBzdGF0dXMgbGluZSBvciBhIHRvb2wgYmFyLiBBdCBtb3N0IG9uZSBvZiA8Y29kZT50b29sQmFyTWFuYWdlcjwvY29kZT4KKyAgICAgKiBvciA8Y29kZT5zdGF0dXNGaWVsZFRleHQ8L2NvZGU+IGNhbiBiZSBub24tbnVsbC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogPHN0cm9uZz5JbXBvcnRhbnQ6PC9zdHJvbmc+OiBTdWJjbGFzc2VzIGFyZSByZXF1aXJlZCB0byBjYWxsIHtAbGluayAjY3JlYXRlKCl9IGF0IHRoZSBlbmQgb2YgdGhlaXIgY29uc3RydWN0b3IuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudFNoZWxsIHRoZSBwYXJlbnQgb2YgdGhpcyBjb250cm9sJ3Mgc2hlbGwKKyAgICAgKiBAcGFyYW0gc2hlbGxTdHlsZSBzdHlsZSBvZiB0aGlzIGNvbnRyb2wncyBzaGVsbAorICAgICAqIEBwYXJhbSBzdGF0dXNGaWVsZFRleHQgdGhlIHRleHQgdG8gYmUgdXNlZCBpbiB0aGUgc3RhdHVzIGZpZWxkIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGhpZGUgdGhlIHN0YXR1cyBmaWVsZAorICAgICAqIEBwYXJhbSB0b29sQmFyTWFuYWdlciB0aGUgbWFuYWdlciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0b29sYmFyIGlzIG5vdCBkZXNpcmVkCisgICAgICogQGRlcHJlY2F0ZWQgY2xpZW50cyBzaG91bGQgdXNlIG9uZSBvZiB0aGUgcHVibGljIGNvbnN0cnVjdG9ycworICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgSkZhY2VBYnN0cmFjdEluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnRTaGVsbCwgaW50IHNoZWxsU3R5bGUsIGZpbmFsIFN0cmluZyBzdGF0dXNGaWVsZFRleHQsIGZpbmFsIFRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7CisgICAgICAgIEFzc2VydC5pc1RydWUoc3RhdHVzRmllbGRUZXh0ID09IG51bGwgfHwgdG9vbEJhck1hbmFnZXIgPT0gbnVsbCk7CisgICAgICAgIHRoaXMuZlJlc2l6ZUhhbmRsZVNpemUgPSAtMTsKKyAgICAgICAgdGhpcy5mVG9vbEJhck1hbmFnZXIgPSB0b29sQmFyTWFuYWdlcjsKIAotCQlpZiAoKHNoZWxsU3R5bGUgJiBTV1QuTk9fVFJJTSkgIT0gMCkgewotCQkJc2hlbGxTdHlsZSAmPSB+KFNXVC5OT19UUklNIHwgU1dULlNIRUxMX1RSSU0pOyAvLyBtYWtlIHN1cmUgd2UgZ2V0Ci0JCQkvLyB0aGUgT1MgYm9yZGVyIGJ1dAotCQkJLy8gbm8gb3RoZXIgdHJpbXMKLQkJfQorICAgICAgICBpZiAoKHNoZWxsU3R5bGUgJiBTV1QuTk9fVFJJTSkgIT0gMCkgeworICAgICAgICAgICAgc2hlbGxTdHlsZSAmPSB+KFNXVC5OT19UUklNIHwgU1dULlNIRUxMX1RSSU0pOyAvLyBtYWtlIHN1cmUgd2UgZ2V0CisgICAgICAgICAgICAvLyB0aGUgT1MgYm9yZGVyIGJ1dAorICAgICAgICAgICAgLy8gbm8gb3RoZXIgdHJpbXMKKyAgICAgICAgfQogCi0JCWZSZXNpemFibGUgPSAoc2hlbGxTdHlsZSAmIFNXVC5SRVNJWkUpICE9IDA7IC8vIG9uIEdUSywgU2hlbGwgcmVtb3ZlcwotCQkvLyBTV1QuUkVTSVpFIGlmIFNXVC5PTl9UT1AKLQkJLy8gaXMgc2V0Ci0JCWZTaGVsbCA9IG5ldyBTaGVsbChwYXJlbnRTaGVsbCwgc2hlbGxTdHlsZSk7Ci0JCURpc3BsYXkgZGlzcGxheSA9IGZTaGVsbC5nZXREaXNwbGF5KCk7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpOwotCQlDb2xvciBiYWNrZ3JvdW5kID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfSU5GT19CQUNLR1JPVU5EKTsKLQkJc2V0Q29sb3IoZlNoZWxsLCBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kKTsKKyAgICAgICAgdGhpcy5mUmVzaXphYmxlID0gKHNoZWxsU3R5bGUgJiBTV1QuUkVTSVpFKSAhPSAwOyAvLyBvbiBHVEssIFNoZWxsIHJlbW92ZXMKKyAgICAgICAgLy8gU1dULlJFU0laRSBpZiBTV1QuT05fVE9QCisgICAgICAgIC8vIGlzIHNldAorICAgICAgICB0aGlzLmZTaGVsbCA9IG5ldyBTaGVsbChwYXJlbnRTaGVsbCwgc2hlbGxTdHlsZSk7CisgICAgICAgIERpc3BsYXkgZGlzcGxheSA9IHRoaXMuZlNoZWxsLmdldERpc3BsYXkoKTsKKyAgICAgICAgQ29sb3IgZm9yZWdyb3VuZCA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fRk9SRUdST1VORCk7CisgICAgICAgIENvbG9yIGJhY2tncm91bmQgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9JTkZPX0JBQ0tHUk9VTkQpOworICAgICAgICBzZXRDb2xvcih0aGlzLmZTaGVsbCwgZm9yZWdyb3VuZCwgYmFja2dyb3VuZCk7CiAKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJZlNoZWxsLnNldExheW91dChsYXlvdXQpOworICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKKyAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisgICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IDA7CisgICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAwOworICAgICAgICB0aGlzLmZTaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKIAotCQlmQ29udGVudENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZlNoZWxsLCBTV1QuTk9ORSk7Ci0JCWZDb250ZW50Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlmQ29udGVudENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXNldENvbG9yKGZDb250ZW50Q29tcG9zaXRlLCBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kKTsKKyAgICAgICAgdGhpcy5mQ29udGVudENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcy5mU2hlbGwsIFNXVC5OT05FKTsKKyAgICAgICAgdGhpcy5mQ29udGVudENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKKyAgICAgICAgdGhpcy5mQ29udGVudENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7CisgICAgICAgIHNldENvbG9yKHRoaXMuZkNvbnRlbnRDb21wb3NpdGUsIGZvcmVncm91bmQsIGJhY2tncm91bmQpOwogCi0JCWNyZWF0ZVN0YXR1c0NvbXBvc2l0ZShzdGF0dXNGaWVsZFRleHQsIHRvb2xCYXJNYW5hZ2VyLCBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kKTsKLQl9CisgICAgICAgIGNyZWF0ZVN0YXR1c0NvbXBvc2l0ZShzdGF0dXNGaWVsZFRleHQsIHRvb2xCYXJNYW5hZ2VyLCBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kKTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgY3JlYXRlU3RhdHVzQ29tcG9zaXRlKGZpbmFsIFN0cmluZyBzdGF0dXNGaWVsZFRleHQsIGZpbmFsIFRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLAotCQkJQ29sb3IgZm9yZWdyb3VuZCwgQ29sb3IgYmFja2dyb3VuZCkgewotCQlpZiAodG9vbEJhck1hbmFnZXIgPT0gbnVsbCAmJiBzdGF0dXNGaWVsZFRleHQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9CisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVN0YXR1c0NvbXBvc2l0ZShmaW5hbCBTdHJpbmcgc3RhdHVzRmllbGRUZXh0LCBmaW5hbCBUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgQ29sb3IgZm9yZWdyb3VuZCwgQ29sb3IgYmFja2dyb3VuZCkgeworICAgICAgICBpZiAodG9vbEJhck1hbmFnZXIgPT0gbnVsbCAmJiBzdGF0dXNGaWVsZFRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJZlN0YXR1c0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZlNoZWxsLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQk9UVE9NLCB0cnVlLCBmYWxzZSk7Ci0JCWZTdGF0dXNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCUdyaWRMYXlvdXQgc3RhdHVzTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlzdGF0dXNMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJc3RhdHVzTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJc3RhdHVzTGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE7Ci0JCWZTdGF0dXNDb21wb3NpdGUuc2V0TGF5b3V0KHN0YXR1c0xheW91dCk7CisgICAgICAgIHRoaXMuZlN0YXR1c0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcy5mU2hlbGwsIFNXVC5OT05FKTsKKyAgICAgICAgR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CT1RUT00sIHRydWUsIGZhbHNlKTsKKyAgICAgICAgdGhpcy5mU3RhdHVzQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOworICAgICAgICBHcmlkTGF5b3V0IHN0YXR1c0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKKyAgICAgICAgc3RhdHVzTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisgICAgICAgIHN0YXR1c0xheW91dC5tYXJnaW5XaWR0aCA9IDA7CisgICAgICAgIHN0YXR1c0xheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxOworICAgICAgICB0aGlzLmZTdGF0dXNDb21wb3NpdGUuc2V0TGF5b3V0KHN0YXR1c0xheW91dCk7CiAKLQkJZlNlcGFyYXRvciA9IG5ldyBMYWJlbChmU3RhdHVzQ29tcG9zaXRlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlmU2VwYXJhdG9yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworICAgICAgICB0aGlzLmZTZXBhcmF0b3IgPSBuZXcgTGFiZWwodGhpcy5mU3RhdHVzQ29tcG9zaXRlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOworICAgICAgICB0aGlzLmZTZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CiAKLQkJaWYgKHN0YXR1c0ZpZWxkVGV4dCAhPSBudWxsKSB7Ci0JCQljcmVhdGVTdGF0dXNMYWJlbChzdGF0dXNGaWVsZFRleHQsIGZvcmVncm91bmQsIGJhY2tncm91bmQpOwotCQl9IGVsc2UgewotCQkJY3JlYXRlVG9vbEJhcih0b29sQmFyTWFuYWdlcik7Ci0JCX0KLQl9CisgICAgICAgIGlmIChzdGF0dXNGaWVsZFRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgY3JlYXRlU3RhdHVzTGFiZWwoc3RhdHVzRmllbGRUZXh0LCBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNyZWF0ZVRvb2xCYXIodG9vbEJhck1hbmFnZXIpOworICAgICAgICB9CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVN0YXR1c0xhYmVsKGZpbmFsIFN0cmluZyBzdGF0dXNGaWVsZFRleHQsIENvbG9yIGZvcmVncm91bmQsIENvbG9yIGJhY2tncm91bmQpIHsKLQkJZlN0YXR1c0xhYmVsID0gbmV3IExhYmVsKGZTdGF0dXNDb21wb3NpdGUsIFNXVC5SSUdIVCk7Ci0JCWZTdGF0dXNMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJZlN0YXR1c0xhYmVsLnNldFRleHQoc3RhdHVzRmllbGRUZXh0KTsKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlU3RhdHVzTGFiZWwoZmluYWwgU3RyaW5nIHN0YXR1c0ZpZWxkVGV4dCwgQ29sb3IgZm9yZWdyb3VuZCwgQ29sb3IgYmFja2dyb3VuZCkgeworICAgICAgICB0aGlzLmZTdGF0dXNMYWJlbCA9IG5ldyBMYWJlbCh0aGlzLmZTdGF0dXNDb21wb3NpdGUsIFNXVC5SSUdIVCk7CisgICAgICAgIHRoaXMuZlN0YXR1c0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOworICAgICAgICB0aGlzLmZTdGF0dXNMYWJlbC5zZXRUZXh0KHN0YXR1c0ZpZWxkVGV4dCk7CiAKLQkJRm9udERhdGFbXSBmb250RGF0YXMgPSBKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJZm9yIChGb250RGF0YSBlbGVtZW50IDogZm9udERhdGFzKSB7Ci0JCQllbGVtZW50LnNldEhlaWdodChlbGVtZW50LmdldEhlaWdodCgpICogOSAvIDEwKTsKLQkJfQotCQlmU3RhdHVzTGFiZWwuc2V0Rm9udChuZXcgRm9udChmU3RhdHVzTGFiZWwuZ2V0RGlzcGxheSgpLCBmb250RGF0YXMpKTsKKyAgICAgICAgRm9udERhdGFbXSBmb250RGF0YXMgPSBKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkuZ2V0Rm9udERhdGEoKTsKKyAgICAgICAgZm9yIChGb250RGF0YSBlbGVtZW50IDogZm9udERhdGFzKSB7CisgICAgICAgICAgICBlbGVtZW50LnNldEhlaWdodChlbGVtZW50LmdldEhlaWdodCgpICogOSAvIDEwKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmZTdGF0dXNMYWJlbC5zZXRGb250KG5ldyBGb250KHRoaXMuZlN0YXR1c0xhYmVsLmdldERpc3BsYXkoKSwgZm9udERhdGFzKSk7CiAKLQkJZlN0YXR1c0xhYmVsLnNldEZvcmVncm91bmQoZlN0YXR1c0xhYmVsLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0RBUktfU0hBRE9XKSk7Ci0JCWZTdGF0dXNMYWJlbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCQlzZXRDb2xvcihmU3RhdHVzQ29tcG9zaXRlLCBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kKTsKLQl9CisgICAgICAgIHRoaXMuZlN0YXR1c0xhYmVsLnNldEZvcmVncm91bmQodGhpcy5mU3RhdHVzTGFiZWwuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfREFSS19TSEFET1cpKTsKKyAgICAgICAgdGhpcy5mU3RhdHVzTGFiZWwuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKKyAgICAgICAgc2V0Q29sb3IodGhpcy5mU3RhdHVzQ29tcG9zaXRlLCBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kKTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgY3JlYXRlVG9vbEJhcihUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQlmaW5hbCBDb21wb3NpdGUgYmFycyA9IG5ldyBDb21wb3NpdGUoZlN0YXR1c0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQliYXJzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7CisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVRvb2xCYXIoVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKKyAgICAgICAgZmluYWwgQ29tcG9zaXRlIGJhcnMgPSBuZXcgQ29tcG9zaXRlKHRoaXMuZlN0YXR1c0NvbXBvc2l0ZSwgU1dULk5PTkUpOworICAgICAgICBiYXJzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7CiAKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJYmFycy5zZXRMYXlvdXQobGF5b3V0KTsKKyAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7CisgICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOworICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOworICAgICAgICBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOworICAgICAgICBsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKKyAgICAgICAgYmFycy5zZXRMYXlvdXQobGF5b3V0KTsKIAotCQlmVG9vbEJhciA9IHRvb2xCYXJNYW5hZ2VyLmNyZWF0ZUNvbnRyb2woYmFycyk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLCBmYWxzZSk7Ci0JCWZUb29sQmFyLnNldExheW91dERhdGEoZ2QpOworICAgICAgICB0aGlzLmZUb29sQmFyID0gdG9vbEJhck1hbmFnZXIuY3JlYXRlQ29udHJvbChiYXJzKTsKKyAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkJFR0lOTklORywgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgdGhpcy5mVG9vbEJhci5zZXRMYXlvdXREYXRhKGdkKTsKIAotCQlDb21wb3NpdGUgc3BhY2VyID0gbmV3IENvbXBvc2l0ZShiYXJzLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdkLndpZHRoSGludCA9IDA7Ci0JCWdkLmhlaWdodEhpbnQgPSAwOwotCQlzcGFjZXIuc2V0TGF5b3V0RGF0YShnZCk7CisgICAgICAgIENvbXBvc2l0ZSBzcGFjZXIgPSBuZXcgQ29tcG9zaXRlKGJhcnMsIFNXVC5OT05FKTsKKyAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgZ2Qud2lkdGhIaW50ID0gMDsKKyAgICAgICAgZ2QuaGVpZ2h0SGludCA9IDA7CisgICAgICAgIHNwYWNlci5zZXRMYXlvdXREYXRhKGdkKTsKIAotCQlhZGRNb3ZlU3VwcG9ydChzcGFjZXIpOwotCQlhZGRSZXNpemVTdXBwb3J0SWZOZWNlc3NhcnkoYmFycyk7Ci0JfQorICAgICAgICBhZGRNb3ZlU3VwcG9ydChzcGFjZXIpOworICAgICAgICBhZGRSZXNpemVTdXBwb3J0SWZOZWNlc3NhcnkoYmFycyk7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGFkZFJlc2l6ZVN1cHBvcnRJZk5lY2Vzc2FyeShmaW5hbCBDb21wb3NpdGUgYmFycykgewotCQkvLyBYWFg6IHdvcmthcm91bmRzIGZvcgotCQkvLyAtIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTkxMzkgOiBBUEkgdG8gYWRkCi0JCS8vIHJlc2l6ZSBncmlwIC8gZ3JvdyBib3ggaW4gbG93ZXIgcmlnaHQgY29ybmVyIG9mIHNoZWxsCi0JCS8vIC0gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIzOTgwIDogcGxhdGZvcm0KLQkJLy8gc3BlY2lmaWMgc2hlbGwgcmVzaXplIGJlaGF2aW9yCi0JCVN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotCQlmaW5hbCBib29sZWFuIGlzV2luID0gcGxhdGZvcm0uZXF1YWxzKCJ3aW4zMiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICghaXNXaW4gJiYgIXBsYXRmb3JtLmVxdWFscygiZ3RrIikpIHsKLQkJCXJldHVybjsKLQkJfQorICAgIHByaXZhdGUgdm9pZCBhZGRSZXNpemVTdXBwb3J0SWZOZWNlc3NhcnkoZmluYWwgQ29tcG9zaXRlIGJhcnMpIHsKKyAgICAgICAgLy8gWFhYOiB3b3JrYXJvdW5kcyBmb3IKKyAgICAgICAgLy8gLSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE5MTM5IDogQVBJIHRvIGFkZAorICAgICAgICAvLyByZXNpemUgZ3JpcCAvIGdyb3cgYm94IGluIGxvd2VyIHJpZ2h0IGNvcm5lciBvZiBzaGVsbAorICAgICAgICAvLyAtIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMzk4MCA6IHBsYXRmb3JtCisgICAgICAgIC8vIHNwZWNpZmljIHNoZWxsIHJlc2l6ZSBiZWhhdmlvcgorICAgICAgICBTdHJpbmcgcGxhdGZvcm0gPSBTV1QuZ2V0UGxhdGZvcm0oKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc1dpbiA9IHBsYXRmb3JtLmVxdWFscygid2luMzIiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICBpZiAoIWlzV2luICYmICFwbGF0Zm9ybS5lcXVhbHMoImd0ayIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAotCQlmaW5hbCBDYW52YXMgcmVzaXplciA9IG5ldyBDYW52YXMoYmFycywgU1dULk5PTkUpOworICAgICAgICBmaW5hbCBDYW52YXMgcmVzaXplciA9IG5ldyBDYW52YXMoYmFycywgU1dULk5PTkUpOwogCi0JCWludCBzaXplID0gZ2V0UmVzaXplSGFuZGxlU2l6ZShiYXJzKTsKKyAgICAgICAgaW50IHNpemUgPSBnZXRSZXNpemVIYW5kbGVTaXplKGJhcnMpOwogCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkVORCwgZmFsc2UsIHRydWUpOwotCQlkYXRhLndpZHRoSGludCA9IHNpemU7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IHNpemU7Ci0JCXJlc2l6ZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmVzaXplci5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZSkgewotCQkJCVBvaW50IHMgPSByZXNpemVyLmdldFNpemUoKTsKLQkJCQlpbnQgeCA9IHMueCAtIDI7Ci0JCQkJaW50IHkgPSBzLnkgLSAyOwotCQkJCWludCBtaW4gPSBNYXRoLm1pbih4LCB5KTsKLQkJCQlpZiAoaXNXaW4pIHsKLQkJCQkJLy8gZHJhdyBkb3RzCi0JCQkJCWUuZ2Muc2V0QmFja2dyb3VuZChyZXNpemVyLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0hJR0hMSUdIVF9TSEFET1cpKTsKLQkJCQkJaW50IGVuZCA9IG1pbiAtIDE7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IDI7IGkrKykgewotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPD0gMiAtIGk7IGorKykgewotCQkJCQkJCWUuZ2MuZmlsbFJlY3RhbmdsZShlbmQgLSA0ICogaSwgZW5kIC0gNCAqIGosIDIsIDIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVuZC0tOwotCQkJCQllLmdjLnNldEJhY2tncm91bmQocmVzaXplci5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XKSk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IDI7IGkrKykgewotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPD0gMiAtIGk7IGorKykgewotCQkJCQkJCWUuZ2MuZmlsbFJlY3RhbmdsZShlbmQgLSA0ICogaSwgZW5kIC0gNCAqIGosIDIsIDIpOwotCQkJCQkJfQotCQkJCQl9CisgICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkVORCwgU1dULkVORCwgZmFsc2UsIHRydWUpOworICAgICAgICBkYXRhLndpZHRoSGludCA9IHNpemU7CisgICAgICAgIGRhdGEuaGVpZ2h0SGludCA9IHNpemU7CisgICAgICAgIHJlc2l6ZXIuc2V0TGF5b3V0RGF0YShkYXRhKTsKKyAgICAgICAgcmVzaXplci5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgewogCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZHJhdyBkaWFnb25hbCBsaW5lcwotCQkJCQllLmdjLnNldEZvcmVncm91bmQocmVzaXplci5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9OT1JNQUxfU0hBRE9XKSk7Ci0JCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbWluOyBpICs9IDQpIHsKLQkJCQkJCWUuZ2MuZHJhd0xpbmUoaSwgeSwgeCwgaSk7Ci0JCQkJCX0KLQkJCQkJZS5nYy5zZXRGb3JlZ3JvdW5kKHJlc2l6ZXIuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfSElHSExJR0hUX1NIQURPVykpOwotCQkJCQlmb3IgKGludCBpID0gMjsgaSA8IG1pbjsgaSArPSA0KSB7Ci0JCQkJCQllLmdjLmRyYXdMaW5lKGksIHksIHgsIGkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBQb2ludCBzID0gcmVzaXplci5nZXRTaXplKCk7CisgICAgICAgICAgICAgICAgaW50IHggPSBzLnggLSAyOworICAgICAgICAgICAgICAgIGludCB5ID0gcy55IC0gMjsKKyAgICAgICAgICAgICAgICBpbnQgbWluID0gTWF0aC5taW4oeCwgeSk7CisgICAgICAgICAgICAgICAgaWYgKGlzV2luKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgZG90cworICAgICAgICAgICAgICAgICAgICBlLmdjLnNldEJhY2tncm91bmQocmVzaXplci5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1dJREdFVF9ISUdITElHSFRfU0hBRE9XKSk7CisgICAgICAgICAgICAgICAgICAgIGludCBlbmQgPSBtaW4gLSAxOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDw9IDIgLSBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdjLmZpbGxSZWN0YW5nbGUoZW5kIC0gNCAqIGksIGVuZCAtIDQgKiBqLCAyLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbmQtLTsKKyAgICAgICAgICAgICAgICAgICAgZS5nYy5zZXRCYWNrZ3JvdW5kKHJlc2l6ZXIuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfTk9STUFMX1NIQURPVykpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDw9IDIgLSBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdjLmZpbGxSZWN0YW5nbGUoZW5kIC0gNCAqIGksIGVuZCAtIDQgKiBqLCAyLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCXJlc2l6ZXIuc2V0Q3Vyc29yKG5ldyBDdXJzb3IocmVzaXplci5nZXREaXNwbGF5KCksIFNXVC5DVVJTT1JfU0laRVNFKSk7Ci0JCU1vdXNlQWRhcHRlciByZXNpemVTdXBwb3J0ID0gbmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCXByaXZhdGUgTW91c2VNb3ZlTGlzdGVuZXIgZlJlc2l6ZUxpc3RlbmVyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRyYXcgZGlhZ29uYWwgbGluZXMKKyAgICAgICAgICAgICAgICAgICAgZS5nYy5zZXRGb3JlZ3JvdW5kKHJlc2l6ZXIuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfTk9STUFMX1NIQURPVykpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG1pbjsgaSArPSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlLmdjLmRyYXdMaW5lKGksIHksIHgsIGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGUuZ2Muc2V0Rm9yZWdyb3VuZChyZXNpemVyLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0hJR0hMSUdIVF9TSEFET1cpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPCBtaW47IGkgKz0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZS5nYy5kcmF3TGluZShpLCB5LCB4LCBpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CiAKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCVBvaW50IHNoZWxsU2l6ZSA9IGZTaGVsbC5nZXRTaXplKCk7Ci0JCQkJZmluYWwgaW50IHNoZWxsWCA9IHNoZWxsU2l6ZS54OwotCQkJCWZpbmFsIGludCBzaGVsbFkgPSBzaGVsbFNpemUueTsKLQkJCQlQb2ludCBtb3VzZUxvYyA9IHJlc2l6ZXIudG9EaXNwbGF5KGUueCwgZS55KTsKLQkJCQlmaW5hbCBpbnQgbW91c2VYID0gbW91c2VMb2MueDsKLQkJCQlmaW5hbCBpbnQgbW91c2VZID0gbW91c2VMb2MueTsKLQkJCQlmUmVzaXplTGlzdGVuZXIgPSBuZXcgTW91c2VNb3ZlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUyKSB7Ci0JCQkJCQlQb2ludCBtb3VzZUxvYzIgPSByZXNpemVyLnRvRGlzcGxheShlMi54LCBlMi55KTsKLQkJCQkJCWludCBkeCA9IG1vdXNlTG9jMi54IC0gbW91c2VYOwotCQkJCQkJaW50IGR5ID0gbW91c2VMb2MyLnkgLSBtb3VzZVk7Ci0JCQkJCQlzZXRTaXplKHNoZWxsWCArIGR4LCBzaGVsbFkgKyBkeSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXJlc2l6ZXIuYWRkTW91c2VNb3ZlTGlzdGVuZXIoZlJlc2l6ZUxpc3RlbmVyKTsKLQkJCX0KKyAgICAgICAgcmVzaXplci5zZXRDdXJzb3IobmV3IEN1cnNvcihyZXNpemVyLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9TSVpFU0UpKTsKKyAgICAgICAgTW91c2VBZGFwdGVyIHJlc2l6ZVN1cHBvcnQgPSBuZXcgTW91c2VBZGFwdGVyKCkgewogCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJcmVzaXplci5yZW1vdmVNb3VzZU1vdmVMaXN0ZW5lcihmUmVzaXplTGlzdGVuZXIpOwotCQkJCWZSZXNpemVMaXN0ZW5lciA9IG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJlc2l6ZXIuYWRkTW91c2VMaXN0ZW5lcihyZXNpemVTdXBwb3J0KTsKLQl9CisgICAgICAgICAgICBwcml2YXRlIE1vdXNlTW92ZUxpc3RlbmVyIGZSZXNpemVMaXN0ZW5lcjsKIAotCXByaXZhdGUgaW50IGdldFJlc2l6ZUhhbmRsZVNpemUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoZlJlc2l6ZUhhbmRsZVNpemUgPT0gLTEpIHsKLQkJCVNsaWRlciBzbGlkZXJWID0gbmV3IFNsaWRlcihwYXJlbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCQlTbGlkZXIgc2xpZGVySCA9IG5ldyBTbGlkZXIocGFyZW50LCBTV1QuSE9SSVpPTlRBTCk7Ci0JCQlpbnQgd2lkdGggPSBzbGlkZXJWLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLQkJCWludCBoZWlnaHQgPSBzbGlkZXJILmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLQkJCXNsaWRlclYuZGlzcG9zZSgpOwotCQkJc2xpZGVySC5kaXNwb3NlKCk7Ci0JCQlmUmVzaXplSGFuZGxlU2l6ZSA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpOwotCQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBQb2ludCBzaGVsbFNpemUgPSBKRmFjZUFic3RyYWN0SW5mb3JtYXRpb25Db250cm9sLnRoaXMuZlNoZWxsLmdldFNpemUoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2hlbGxYID0gc2hlbGxTaXplLng7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHNoZWxsWSA9IHNoZWxsU2l6ZS55OworICAgICAgICAgICAgICAgIFBvaW50IG1vdXNlTG9jID0gcmVzaXplci50b0Rpc3BsYXkoZS54LCBlLnkpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBtb3VzZVggPSBtb3VzZUxvYy54OworICAgICAgICAgICAgICAgIGZpbmFsIGludCBtb3VzZVkgPSBtb3VzZUxvYy55OworICAgICAgICAgICAgICAgIHRoaXMuZlJlc2l6ZUxpc3RlbmVyID0gbmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewogCi0JCXJldHVybiBmUmVzaXplSGFuZGxlU2l6ZTsKLQl9CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQb2ludCBtb3VzZUxvYzIgPSByZXNpemVyLnRvRGlzcGxheShlMi54LCBlMi55KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkeCA9IG1vdXNlTG9jMi54IC0gbW91c2VYOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGR5ID0gbW91c2VMb2MyLnkgLSBtb3VzZVk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaXplKHNoZWxsWCArIGR4LCBzaGVsbFkgKyBkeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJlc2l6ZXIuYWRkTW91c2VNb3ZlTGlzdGVuZXIodGhpcy5mUmVzaXplTGlzdGVuZXIpOworICAgICAgICAgICAgfQogCi0JLyoqCi0JICogQWRkcyBzdXBwb3J0IHRvIG1vdmUgdGhlIHNoZWxsIGJ5IGRyYWdnaW5nIHRoZSBnaXZlbiBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgY29udHJvbCB0aGF0IGNhbiBiZSB1c2VkIHRvIG1vdmUgdGhlIHNoZWxsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE1vdmVTdXBwb3J0KGZpbmFsIENvbnRyb2wgY29udHJvbCkgewotCQlNb3VzZUFkYXB0ZXIgbW92ZVN1cHBvcnQgPSBuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHJpdmF0ZSBNb3VzZU1vdmVMaXN0ZW5lciBmTW92ZUxpc3RlbmVyOworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIHJlc2l6ZXIucmVtb3ZlTW91c2VNb3ZlTGlzdGVuZXIodGhpcy5mUmVzaXplTGlzdGVuZXIpOworICAgICAgICAgICAgICAgIHRoaXMuZlJlc2l6ZUxpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcmVzaXplci5hZGRNb3VzZUxpc3RlbmVyKHJlc2l6ZVN1cHBvcnQpOworICAgIH0KIAotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJUG9pbnQgc2hlbGxMb2MgPSBmU2hlbGwuZ2V0TG9jYXRpb24oKTsKLQkJCQlmaW5hbCBpbnQgc2hlbGxYID0gc2hlbGxMb2MueDsKLQkJCQlmaW5hbCBpbnQgc2hlbGxZID0gc2hlbGxMb2MueTsKLQkJCQlQb2ludCBtb3VzZUxvYyA9IGNvbnRyb2wudG9EaXNwbGF5KGUueCwgZS55KTsKLQkJCQlmaW5hbCBpbnQgbW91c2VYID0gbW91c2VMb2MueDsKLQkJCQlmaW5hbCBpbnQgbW91c2VZID0gbW91c2VMb2MueTsKLQkJCQlmTW92ZUxpc3RlbmVyID0gbmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlMikgewotCQkJCQkJUG9pbnQgbW91c2VMb2MyID0gY29udHJvbC50b0Rpc3BsYXkoZTIueCwgZTIueSk7Ci0JCQkJCQlpbnQgZHggPSBtb3VzZUxvYzIueCAtIG1vdXNlWDsKLQkJCQkJCWludCBkeSA9IG1vdXNlTG9jMi55IC0gbW91c2VZOwotCQkJCQkJZlNoZWxsLnNldExvY2F0aW9uKHNoZWxsWCArIGR4LCBzaGVsbFkgKyBkeSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWNvbnRyb2wuYWRkTW91c2VNb3ZlTGlzdGVuZXIoZk1vdmVMaXN0ZW5lcik7Ci0JCQl9CisgICAgcHJpdmF0ZSBpbnQgZ2V0UmVzaXplSGFuZGxlU2l6ZShDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIGlmICh0aGlzLmZSZXNpemVIYW5kbGVTaXplID09IC0xKSB7CisgICAgICAgICAgICBTbGlkZXIgc2xpZGVyViA9IG5ldyBTbGlkZXIocGFyZW50LCBTV1QuVkVSVElDQUwpOworICAgICAgICAgICAgU2xpZGVyIHNsaWRlckggPSBuZXcgU2xpZGVyKHBhcmVudCwgU1dULkhPUklaT05UQUwpOworICAgICAgICAgICAgaW50IHdpZHRoID0gc2xpZGVyVi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7CisgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gc2xpZGVySC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnk7CisgICAgICAgICAgICBzbGlkZXJWLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgIHNsaWRlckguZGlzcG9zZSgpOworICAgICAgICAgICAgdGhpcy5mUmVzaXplSGFuZGxlU2l6ZSA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpOworICAgICAgICB9CiAKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCQljb250cm9sLnJlbW92ZU1vdXNlTW92ZUxpc3RlbmVyKGZNb3ZlTGlzdGVuZXIpOwotCQkJCWZNb3ZlTGlzdGVuZXIgPSBudWxsOwotCQkJfQotCQl9OwotCQljb250cm9sLmFkZE1vdXNlTGlzdGVuZXIobW92ZVN1cHBvcnQpOwotCX0KKyAgICAgICAgcmV0dXJuIHRoaXMuZlJlc2l6ZUhhbmRsZVNpemU7CisgICAgfQogCi0JLyoqCi0JICogVXRpbGl0eSB0byBzZXQgdGhlIGZvcmVncm91bmQgYW5kIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBnaXZlbiBjb250cm9sCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiAgICAgICAgICAgIHRoZSBjb250cm9sIHRvIG1vZGlmeQotCSAqIEBwYXJhbSBmb3JlZ3JvdW5kCi0JICogICAgICAgICAgICB0aGUgY29sb3IgdG8gdXNlIGZvciB0aGUgZm9yZWdyb3VuZAotCSAqIEBwYXJhbSBiYWNrZ3JvdW5kCi0JICogICAgICAgICAgICB0aGUgY29sb3IgdG8gdXNlIGZvciB0aGUgYmFja2dyb3VuZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0Q29sb3IoQ29udHJvbCBjb250cm9sLCBDb2xvciBmb3JlZ3JvdW5kLCBDb2xvciBiYWNrZ3JvdW5kKSB7Ci0JCWNvbnRyb2wuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQkJY29udHJvbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOwotCX0KKyAgICAvKioKKyAgICAgKiBBZGRzIHN1cHBvcnQgdG8gbW92ZSB0aGUgc2hlbGwgYnkgZHJhZ2dpbmcgdGhlIGdpdmVuIGNvbnRyb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udHJvbCB0aGUgY29udHJvbCB0aGF0IGNhbiBiZSB1c2VkIHRvIG1vdmUgdGhlIHNoZWxsCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZE1vdmVTdXBwb3J0KGZpbmFsIENvbnRyb2wgY29udHJvbCkgeworICAgICAgICBNb3VzZUFkYXB0ZXIgbW92ZVN1cHBvcnQgPSBuZXcgTW91c2VBZGFwdGVyKCkgeworCisgICAgICAgICAgICBwcml2YXRlIE1vdXNlTW92ZUxpc3RlbmVyIGZNb3ZlTGlzdGVuZXI7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgeworICAgICAgICAgICAgICAgIFBvaW50IHNoZWxsTG9jID0gSkZhY2VBYnN0cmFjdEluZm9ybWF0aW9uQ29udHJvbC50aGlzLmZTaGVsbC5nZXRMb2NhdGlvbigpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzaGVsbFggPSBzaGVsbExvYy54OworICAgICAgICAgICAgICAgIGZpbmFsIGludCBzaGVsbFkgPSBzaGVsbExvYy55OworICAgICAgICAgICAgICAgIFBvaW50IG1vdXNlTG9jID0gY29udHJvbC50b0Rpc3BsYXkoZS54LCBlLnkpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBtb3VzZVggPSBtb3VzZUxvYy54OworICAgICAgICAgICAgICAgIGZpbmFsIGludCBtb3VzZVkgPSBtb3VzZUxvYy55OworICAgICAgICAgICAgICAgIHRoaXMuZk1vdmVMaXN0ZW5lciA9IG5ldyBNb3VzZU1vdmVMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtb3VzZU1vdmUoTW91c2VFdmVudCBlMikgeworICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQgbW91c2VMb2MyID0gY29udHJvbC50b0Rpc3BsYXkoZTIueCwgZTIueSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHggPSBtb3VzZUxvYzIueCAtIG1vdXNlWDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkeSA9IG1vdXNlTG9jMi55IC0gbW91c2VZOworICAgICAgICAgICAgICAgICAgICAgICAgSkZhY2VBYnN0cmFjdEluZm9ybWF0aW9uQ29udHJvbC50aGlzLmZTaGVsbC5zZXRMb2NhdGlvbihzaGVsbFggKyBkeCwgc2hlbGxZICsgZHkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBjb250cm9sLmFkZE1vdXNlTW92ZUxpc3RlbmVyKHRoaXMuZk1vdmVMaXN0ZW5lcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBjb250cm9sLnJlbW92ZU1vdXNlTW92ZUxpc3RlbmVyKHRoaXMuZk1vdmVMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgdGhpcy5mTW92ZUxpc3RlbmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgY29udHJvbC5hZGRNb3VzZUxpc3RlbmVyKG1vdmVTdXBwb3J0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IHRvIHNldCB0aGUgZm9yZWdyb3VuZCBhbmQgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGdpdmVuIGNvbnRyb2wKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250cm9sIHRoZSBjb250cm9sIHRvIG1vZGlmeQorICAgICAqIEBwYXJhbSBmb3JlZ3JvdW5kIHRoZSBjb2xvciB0byB1c2UgZm9yIHRoZSBmb3JlZ3JvdW5kCisgICAgICogQHBhcmFtIGJhY2tncm91bmQgdGhlIGNvbG9yIHRvIHVzZSBmb3IgdGhlIGJhY2tncm91bmQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldENvbG9yKENvbnRyb2wgY29udHJvbCwgQ29sb3IgZm9yZWdyb3VuZCwgQ29sb3IgYmFja2dyb3VuZCkgeworICAgICAgICBjb250cm9sLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7CisgICAgICAgIGNvbnRyb2wuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKKyAgICB9CiAKLQkvKioKLQkgKiBUaGUgc2hlbGwgb2YgdGhlIHBvcHVwIHdpbmRvdy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGVsbCB1c2VkIGZvciB0aGUgcG9wdXAgd2luZG93Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gZlNoZWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBUaGUgc2hlbGwgb2YgdGhlIHBvcHVwIHdpbmRvdy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNoZWxsIHVzZWQgZm9yIHRoZSBwb3B1cCB3aW5kb3cKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgU2hlbGwgZ2V0U2hlbGwoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZTaGVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBUaGUgdG9vbGJhciBtYW5hZ2VyIHVzZWQgdG8gbWFuYWdlIHRoZSB0b29sYmFyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyB0b29sYmFyIGlzIHNob3duLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvb2wgYmFyIG1hbmFnZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVG9vbEJhck1hbmFnZXIgZ2V0VG9vbEJhck1hbmFnZXIoKSB7Ci0JCXJldHVybiBmVG9vbEJhck1hbmFnZXI7Ci0JfQorICAgIC8qKgorICAgICAqIFRoZSB0b29sYmFyIG1hbmFnZXIgdXNlZCB0byBtYW5hZ2UgdGhlIHRvb2xiYXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHRvb2xiYXIgaXMgc2hvd24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB0b29sIGJhciBtYW5hZ2VyIG9yIDxjb2RlPm51bGw8L2NvZGU+CisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFRvb2xCYXJNYW5hZ2VyIGdldFRvb2xCYXJNYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5mVG9vbEJhck1hbmFnZXI7CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udGVudCBvZiB0aGlzIGluZm9ybWF0aW9uIGNvbnRyb2wuIFN1YmNsYXNzZXMgbXVzdCBjYWxsIHRoaXMgbWV0aG9kIGF0IHRoZSBlbmQgb2YgdGhlaXIKLQkgKiBjb25zdHJ1Y3RvcihzKS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjcmVhdGUoKSB7Ci0JCWNyZWF0ZUNvbnRlbnQoZkNvbnRlbnRDb21wb3NpdGUpOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBjb250ZW50IG9mIHRoaXMgaW5mb3JtYXRpb24gY29udHJvbC4gU3ViY2xhc3NlcyBtdXN0IGNhbGwgdGhpcyBtZXRob2QgYXQgdGhlIGVuZCBvZiB0aGVpcgorICAgICAqIGNvbnN0cnVjdG9yKHMpLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNyZWF0ZSgpIHsKKyAgICAgICAgY3JlYXRlQ29udGVudCh0aGlzLmZDb250ZW50Q29tcG9zaXRlKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250ZW50IG9mIHRoZSBwb3B1cCB3aW5kb3cuCi0JICogPHA+Ci0JICogSW1wbGVtZW50b3JzIHdpbGwgdXN1YWxseSB0YWtlIG92ZXIge0BsaW5rIENvbXBvc2l0ZSNnZXRCYWNrZ3JvdW5kKCl9IGFuZCB7QGxpbmsgQ29tcG9zaXRlI2dldEZvcmVncm91bmQoKX0gZnJvbQotCSAqIDxjb2RlPnBhcmVudDwvY29kZT4uCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEltcGxlbWVudG9ycyBhcmUgZXhwZWN0ZWQgdG8gY29uc2lkZXIge0BsaW5rICNpc1Jlc2l6YWJsZSgpfTogSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZXkgc2hvdWxkIHNob3cgc2Nyb2xsYmFycwotCSAqIGlmIHRoZWlyIGNvbnRlbnQgbWF5IGV4Y2VlZCB0aGUgc2l6ZSBvZiB0aGUgaW5mb3JtYXRpb24gY29udHJvbC4gSWYgPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGV5IHNob3VsZCBuZXZlciBzaG93Ci0JICogc2Nyb2xsYmFycy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhlIGdpdmVuIDxjb2RlPnBhcmVudDwvY29kZT4gY29tZXMgd2l0aCBhIHtAbGluayBGaWxsTGF5b3V0fS4gU3ViY2xhc3NlcyBtYXkgc2V0IGEgZGlmZmVyZW50IGxheW91dC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIGNvbnRhaW5lciBvZiB0aGUgY29udGVudAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUNvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCk7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgY29udGVudCBvZiB0aGUgcG9wdXAgd2luZG93LgorICAgICAqIDxwPgorICAgICAqIEltcGxlbWVudG9ycyB3aWxsIHVzdWFsbHkgdGFrZSBvdmVyIHtAbGluayBDb21wb3NpdGUjZ2V0QmFja2dyb3VuZCgpfSBhbmQge0BsaW5rIENvbXBvc2l0ZSNnZXRGb3JlZ3JvdW5kKCl9IGZyb20KKyAgICAgKiA8Y29kZT5wYXJlbnQ8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJbXBsZW1lbnRvcnMgYXJlIGV4cGVjdGVkIHRvIGNvbnNpZGVyIHtAbGluayAjaXNSZXNpemFibGUoKX06IElmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGV5IHNob3VsZCBzaG93IHNjcm9sbGJhcnMKKyAgICAgKiBpZiB0aGVpciBjb250ZW50IG1heSBleGNlZWQgdGhlIHNpemUgb2YgdGhlIGluZm9ybWF0aW9uIGNvbnRyb2wuIElmIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhleSBzaG91bGQgbmV2ZXIgc2hvdworICAgICAqIHNjcm9sbGJhcnMuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBnaXZlbiA8Y29kZT5wYXJlbnQ8L2NvZGU+IGNvbWVzIHdpdGggYSB7QGxpbmsgRmlsbExheW91dH0uIFN1YmNsYXNzZXMgbWF5IHNldCBhIGRpZmZlcmVudCBsYXlvdXQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCB0aGUgY29udGFpbmVyIG9mIHRoZSBjb250ZW50CisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlQ29udGVudChDb21wb3NpdGUgcGFyZW50KTsKIAotCS8qKgotCSAqIFNldHMgdGhlIGluZm9ybWF0aW9uIHRvIGJlIHByZXNlbnRlZCBieSB0aGlzIGluZm9ybWF0aW9uIGNvbnRyb2wuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiBTdWJjbGFzc2VzIG11c3QgZWl0aGVyIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9yIGltcGxlbWVudAotCSAqIHtAbGluayBJSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uMn0uCi0JICogCi0JICogQHBhcmFtIGluZm9ybWF0aW9uCi0JICogICAgICAgICAgICB0aGUgaW5mb3JtYXRpb24gdG8gYmUgcHJlc2VudGVkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2wjc2V0SW5mb3JtYXRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmZvcm1hdGlvbihTdHJpbmcgaW5mb3JtYXRpb24pIHsKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBwcmVzZW50ZWQgYnkgdGhpcyBpbmZvcm1hdGlvbiBjb250cm9sLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4gU3ViY2xhc3NlcyBtdXN0IGVpdGhlciBvdmVycmlkZSB0aGlzIG1ldGhvZCBvciBpbXBsZW1lbnQKKyAgICAgKiB7QGxpbmsgSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbjJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGluZm9ybWF0aW9uIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBwcmVzZW50ZWQKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbCNzZXRJbmZvcm1hdGlvbihqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluZm9ybWF0aW9uKFN0cmluZyBpbmZvcm1hdGlvbikgewogCi0JfQorICAgIH0KIAotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgaW5mb3JtYXRpb24gY29udHJvbCBpcyByZXNpemFibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaW5mb3JtYXRpb24gY29udHJvbCBpcyByZXNpemFibGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub3QgcmVzaXphYmxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzaXphYmxlKCkgewotCQlyZXR1cm4gZlJlc2l6YWJsZTsKLQl9CisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpbmZvcm1hdGlvbiBjb250cm9sIGlzIHJlc2l6YWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGluZm9ybWF0aW9uIGNvbnRyb2wgaXMgcmVzaXphYmxlLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgaXMgbm90IHJlc2l6YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc2l6YWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZlJlc2l6YWJsZTsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgSUluZm9ybWF0aW9uQ29udHJvbCNzZXRWaXNpYmxlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKGZTaGVsbC5pc1Zpc2libGUoKSA9PSB2aXNpYmxlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KKyAgICAvKgorICAgICAqIEBzZWUgSUluZm9ybWF0aW9uQ29udHJvbCNzZXRWaXNpYmxlKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgaWYgKHRoaXMuZlNoZWxsLmlzVmlzaWJsZSgpID09IHZpc2libGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0JCWZTaGVsbC5zZXRWaXNpYmxlKHZpc2libGUpOwotCX0KKyAgICAgICAgdGhpcy5mU2hlbGwuc2V0VmlzaWJsZSh2aXNpYmxlKTsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgSUluZm9ybWF0aW9uQ29udHJvbCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZlNoZWxsICE9IG51bGwgJiYgIWZTaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWZTaGVsbC5kaXNwb3NlKCk7Ci0JCX0KLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjZGlzcG9zZSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgaWYgKHRoaXMuZlNoZWxsICE9IG51bGwgJiYgIXRoaXMuZlNoZWxsLmlzRGlzcG9zZWQoKSkgeworICAgICAgICAgICAgdGhpcy5mU2hlbGwuZGlzcG9zZSgpOworICAgICAgICB9CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjc2V0U2l6ZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlmU2hlbGwuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjc2V0U2l6ZShpbnQsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICB0aGlzLmZTaGVsbC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOworICAgIH0KIAotCS8qCi0JICogQHNlZSBJSW5mb3JtYXRpb25Db250cm9sI3NldExvY2F0aW9uKFBvaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IGxvY2F0aW9uKSB7Ci0JCWZTaGVsbC5zZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JfQorICAgIC8qCisgICAgICogQHNlZSBJSW5mb3JtYXRpb25Db250cm9sI3NldExvY2F0aW9uKFBvaW50KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IGxvY2F0aW9uKSB7CisgICAgICAgIHRoaXMuZlNoZWxsLnNldExvY2F0aW9uKGxvY2F0aW9uKTsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgSUluZm9ybWF0aW9uQ29udHJvbCNzZXRTaXplQ29uc3RyYWludHMoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZUNvbnN0cmFpbnRzKGludCBtYXhXaWR0aCwgaW50IG1heEhlaWdodCkgewotCQlmU2l6ZUNvbnN0cmFpbnRzID0gbmV3IFBvaW50KG1heFdpZHRoLCBtYXhIZWlnaHQpOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgSUluZm9ybWF0aW9uQ29udHJvbCNzZXRTaXplQ29uc3RyYWludHMoaW50LCBpbnQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2l6ZUNvbnN0cmFpbnRzKGludCBtYXhXaWR0aCwgaW50IG1heEhlaWdodCkgeworICAgICAgICB0aGlzLmZTaXplQ29uc3RyYWludHMgPSBuZXcgUG9pbnQobWF4V2lkdGgsIG1heEhlaWdodCk7CisgICAgfQogCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l6ZSBjb25zdHJhaW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIGNvbnN0cmFpbnRzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQKLQkgKiBAc2VlICNzZXRTaXplQ29uc3RyYWludHMoaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFBvaW50IGdldFNpemVDb25zdHJhaW50cygpIHsKLQkJcmV0dXJuIGZTaXplQ29uc3RyYWludHMgIT0gbnVsbCA/IEdlb21ldHJ5LmNvcHkoZlNpemVDb25zdHJhaW50cykgOiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIGNvbnN0cmFpbnRzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2l6ZSBjb25zdHJhaW50cyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qgc2V0CisgICAgICogQHNlZSAjc2V0U2l6ZUNvbnN0cmFpbnRzKGludCwgaW50KQorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBQb2ludCBnZXRTaXplQ29uc3RyYWludHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZTaXplQ29uc3RyYWludHMgIT0gbnVsbCA/IEdlb21ldHJ5LmNvcHkodGhpcy5mU2l6ZUNvbnN0cmFpbnRzKSA6IG51bGw7CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjY29tcHV0ZVNpemVIaW50KCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemVIaW50KCkgewotCQkvLyBYWFg6IFZlcmlmeSB3aGV0aGVyIHRoaXMgaXMgYSBnb29kIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uIElmIHllcywKLQkJLy8gZG9jdW1lbnQgaXQuCi0JCVBvaW50IGNvbnN0cmFpbnMgPSBnZXRTaXplQ29uc3RyYWludHMoKTsKLQkJaWYgKGNvbnN0cmFpbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZTaGVsbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOwotCQl9CisgICAgLyoKKyAgICAgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjY29tcHV0ZVNpemVIaW50KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemVIaW50KCkgeworICAgICAgICAvLyBYWFg6IFZlcmlmeSB3aGV0aGVyIHRoaXMgaXMgYSBnb29kIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uIElmIHllcywKKyAgICAgICAgLy8gZG9jdW1lbnQgaXQuCisgICAgICAgIFBvaW50IGNvbnN0cmFpbnMgPSBnZXRTaXplQ29uc3RyYWludHMoKTsKKyAgICAgICAgaWYgKGNvbnN0cmFpbnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZlNoZWxsLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSk7CisgICAgICAgIH0KIAotCQlyZXR1cm4gZlNoZWxsLmNvbXB1dGVTaXplKGNvbnN0cmFpbnMueCwgY29uc3RyYWlucy55LCB0cnVlKTsKLQl9CisgICAgICAgIHJldHVybiB0aGlzLmZTaGVsbC5jb21wdXRlU2l6ZShjb25zdHJhaW5zLngsIGNvbnN0cmFpbnMueSwgdHJ1ZSk7CisgICAgfQogCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHRyaW0gKHN0YXR1cyB0ZXh0IGFuZCB0b29sIGJhciBhcmUgY29uc2lkZXJlZCBhcyB0cmltKS4gU3ViY2xhc3NlcyBjYW4gZXh0ZW5kIHRoaXMgbWV0aG9kIHRvIGFkZAotCSAqIGFkZGl0aW9uYWwgdHJpbSAoZS5nLiBzY3JvbGwgYmFycyBmb3IgcmVzaXphYmxlIGluZm9ybWF0aW9uIGNvbnRyb2xzKS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbjMjY29tcHV0ZVRyaW0oKQotCSAqLwotCXB1YmxpYyBSZWN0YW5nbGUgY29tcHV0ZVRyaW0oKSB7Ci0JCVJlY3RhbmdsZSB0cmltID0gZlNoZWxsLmNvbXB1dGVUcmltKDAsIDAsIDAsIDApOworICAgIC8qKgorICAgICAqIENvbXB1dGVzIHRoZSB0cmltIChzdGF0dXMgdGV4dCBhbmQgdG9vbCBiYXIgYXJlIGNvbnNpZGVyZWQgYXMgdHJpbSkuIFN1YmNsYXNzZXMgY2FuIGV4dGVuZCB0aGlzIG1ldGhvZCB0byBhZGQKKyAgICAgKiBhZGRpdGlvbmFsIHRyaW0gKGUuZy4gc2Nyb2xsIGJhcnMgZm9yIHJlc2l6YWJsZSBpbmZvcm1hdGlvbiBjb250cm9scykuCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbjMjY29tcHV0ZVRyaW0oKQorICAgICAqLworICAgIHB1YmxpYyBSZWN0YW5nbGUgY29tcHV0ZVRyaW0oKSB7CisgICAgICAgIFJlY3RhbmdsZSB0cmltID0gdGhpcy5mU2hlbGwuY29tcHV0ZVRyaW0oMCwgMCwgMCwgMCk7CiAKLQkJaWYgKGZTdGF0dXNDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJdHJpbS5oZWlnaHQgKz0gZlN0YXR1c0NvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLnk7Ci0JCX0KKyAgICAgICAgaWYgKHRoaXMuZlN0YXR1c0NvbXBvc2l0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cmltLmhlaWdodCArPSB0aGlzLmZTdGF0dXNDb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OworICAgICAgICB9CiAKLQkJcmV0dXJuIHRyaW07Ci0JfQorICAgICAgICByZXR1cm4gdHJpbTsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uMyNnZXRCb3VuZHMoKQotCSAqLwotCXB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgewotCQlyZXR1cm4gZlNoZWxsLmdldEJvdW5kcygpOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uMyNnZXRCb3VuZHMoKQorICAgICAqLworICAgIHB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5mU2hlbGwuZ2V0Qm91bmRzKCk7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb24zI3Jlc3RvcmVzTG9jYXRpb24oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlc3RvcmVzTG9jYXRpb24oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbjMjcmVzdG9yZXNMb2NhdGlvbigpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVzdG9yZXNMb2NhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uMyNyZXN0b3Jlc1NpemUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlc3RvcmVzU2l6ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uMyNyZXN0b3Jlc1NpemUoKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlc3RvcmVzU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotCS8qCi0JICogQHNlZSBJSW5mb3JtYXRpb25Db250cm9sI2FkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmU2hlbGwuYWRkRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHRoaXMuZlNoZWxsLmFkZERpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZTaGVsbC5yZW1vdmVEaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KKyAgICAvKgorICAgICAqIEBzZWUgSUluZm9ybWF0aW9uQ29udHJvbCNyZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZURpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgdGhpcy5mU2hlbGwucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgSUluZm9ybWF0aW9uQ29udHJvbCNzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGZvcmVncm91bmQpIHsKLQkJZkNvbnRlbnRDb21wb3NpdGUuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBmb3JlZ3JvdW5kKSB7CisgICAgICAgIHRoaXMuZkNvbnRlbnRDb21wb3NpdGUuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgSUluZm9ybWF0aW9uQ29udHJvbCNzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yIGJhY2tncm91bmQpIHsKLQkJZkNvbnRlbnRDb21wb3NpdGUuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjc2V0QmFja2dyb3VuZENvbG9yKENvbG9yKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcihDb2xvciBiYWNrZ3JvdW5kKSB7CisgICAgICAgIHRoaXMuZkNvbnRlbnRDb21wb3NpdGUuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9IFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb2N1c0NvbnRyb2woKSB7Ci0JCXJldHVybiBmU2hlbGwuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkgPT0gZlNoZWxsOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9IFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGb2N1c0NvbnRyb2woKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZTaGVsbC5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSA9PSB0aGlzLmZTaGVsbDsKKyAgICB9CiAKLQkvKioKLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGUgZm9jdXMgb24gdGhlIHBvcHVwIHNoZWxsLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBvciBleHRlbmQuCi0JICogCi0JICogQHNlZSBJSW5mb3JtYXRpb25Db250cm9sI3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJYm9vbGVhbiBmb2N1c1Rha2VuID0gZlNoZWxsLnNldEZvY3VzKCk7Ci0JCWlmICghZm9jdXNUYWtlbikgewotCQkJZlNoZWxsLmZvcmNlRm9jdXMoKTsKLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGUgZm9jdXMgb24gdGhlIHBvcHVwIHNoZWxsLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBvciBleHRlbmQuCisgICAgICoKKyAgICAgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjc2V0Rm9jdXMoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvY3VzKCkgeworICAgICAgICBib29sZWFuIGZvY3VzVGFrZW4gPSB0aGlzLmZTaGVsbC5zZXRGb2N1cygpOworICAgICAgICBpZiAoIWZvY3VzVGFrZW4pIHsKKyAgICAgICAgICAgIHRoaXMuZlNoZWxsLmZvcmNlRm9jdXMoKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qKgotCSAqIHtAaW5oZXJpdERvY30gVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRGb2N1c0xpc3RlbmVyKGZpbmFsIEZvY3VzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZGb2N1c0xpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZTaGVsbExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgeworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30gVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRGb2N1c0xpc3RlbmVyKGZpbmFsIEZvY3VzTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKHRoaXMuZkZvY3VzTGlzdGVuZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhpcy5mU2hlbGxMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKIAotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9iamVjdFtdIGxpc3RlbmVycyA9IGZGb2N1c0xpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCQkJZm9yIChPYmplY3QgZWxlbWVudCA6IGxpc3RlbmVycykgewotCQkJCQkJRm9jdXNMaXN0ZW5lciBmb2N1c0xpc3RlbmVyID0gKEZvY3VzTGlzdGVuZXIpIGVsZW1lbnQ7Ci0JCQkJCQlpZiAoZXZlbnQudHlwZSA9PSBTV1QuQWN0aXZhdGUpIHsKLQkJCQkJCQlmb2N1c0xpc3RlbmVyLmZvY3VzR2FpbmVkKG5ldyBGb2N1c0V2ZW50KGV2ZW50KSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWZvY3VzTGlzdGVuZXIuZm9jdXNMb3N0KG5ldyBGb2N1c0V2ZW50KGV2ZW50KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJZlNoZWxsLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBmU2hlbGxMaXN0ZW5lcik7Ci0JCQlmU2hlbGwuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBmU2hlbGxMaXN0ZW5lcik7Ci0JCX0KLQkJZkZvY3VzTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGxpc3RlbmVycyA9IEpGYWNlQWJzdHJhY3RJbmZvcm1hdGlvbkNvbnRyb2wudGhpcy5mRm9jdXNMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiBsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZvY3VzTGlzdGVuZXIgZm9jdXNMaXN0ZW5lciA9IChGb2N1c0xpc3RlbmVyKSBlbGVtZW50OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gU1dULkFjdGl2YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNMaXN0ZW5lci5mb2N1c0dhaW5lZChuZXcgRm9jdXNFdmVudChldmVudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c0xpc3RlbmVyLmZvY3VzTG9zdChuZXcgRm9jdXNFdmVudChldmVudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuZlNoZWxsLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCB0aGlzLmZTaGVsbExpc3RlbmVyKTsKKyAgICAgICAgICAgIHRoaXMuZlNoZWxsLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgdGhpcy5mU2hlbGxMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5mRm9jdXNMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CiAKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9IFRoaXMgbWV0aG9kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZGb2N1c0xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQlpZiAoZkZvY3VzTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJZlNoZWxsLnJlbW92ZUxpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgZlNoZWxsTGlzdGVuZXIpOwotCQkJZlNoZWxsLnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBmU2hlbGxMaXN0ZW5lcik7Ci0JCQlmU2hlbGxMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfSBUaGlzIG1ldGhvZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUZvY3VzTGlzdGVuZXIoRm9jdXNMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICB0aGlzLmZGb2N1c0xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgICAgICBpZiAodGhpcy5mRm9jdXNMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aGlzLmZTaGVsbC5yZW1vdmVMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIHRoaXMuZlNoZWxsTGlzdGVuZXIpOworICAgICAgICAgICAgdGhpcy5mU2hlbGwucmVtb3ZlTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIHRoaXMuZlNoZWxsTGlzdGVuZXIpOworICAgICAgICAgICAgdGhpcy5mU2hlbGxMaXN0ZW5lciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKioKLQkgKiBTZXRzIHRoZSB0ZXh0IG9mIHRoZSBzdGF0dXMgZmllbGQuCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY3VycmVudGx5IG9ubHkgdXBkYXRlcyB0aGUgc3RhdHVzIGZpZWxkIHdoZW4gdGhlIHBvcHVwIHNoZWxsIGlzIG5vdCB2aXNpYmxlLiBUaGUKLQkgKiBzdGF0dXMgZmllbGQgY2FuIGN1cnJlbnRseSBvbmx5IGJlIHNob3duIGlmIHRoZSBpbmZvcm1hdGlvbiBjb250cm9sIGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCBhIG5vbi1udWxsIHN0YXR1cyBmaWVsZAotCSAqIHRleHQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXNGaWVsZFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIGJlIHVzZWQgaW4gdGhlIG9wdGlvbmFsIHN0YXR1cyBmaWVsZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3RhdHVzIGZpZWxkIHNob3VsZCBiZQotCSAqICAgICAgICAgICAgaGlkZGVuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb240I3NldFN0YXR1c1RleHQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXNUZXh0KFN0cmluZyBzdGF0dXNGaWVsZFRleHQpIHsKLQkJaWYgKGZTdGF0dXNMYWJlbCAhPSBudWxsICYmICFnZXRTaGVsbCgpLmlzVmlzaWJsZSgpKSB7Ci0JCQlpZiAoc3RhdHVzRmllbGRUZXh0ID09IG51bGwpIHsKLQkJCQlmU3RhdHVzQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlmU3RhdHVzTGFiZWwuc2V0VGV4dChzdGF0dXNGaWVsZFRleHQpOwotCQkJCWZTdGF0dXNDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCX0KLQkJfQotCX0KKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0ZXh0IG9mIHRoZSBzdGF0dXMgZmllbGQuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY3VycmVudGx5IG9ubHkgdXBkYXRlcyB0aGUgc3RhdHVzIGZpZWxkIHdoZW4gdGhlIHBvcHVwIHNoZWxsIGlzIG5vdCB2aXNpYmxlLiBUaGUKKyAgICAgKiBzdGF0dXMgZmllbGQgY2FuIGN1cnJlbnRseSBvbmx5IGJlIHNob3duIGlmIHRoZSBpbmZvcm1hdGlvbiBjb250cm9sIGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCBhIG5vbi1udWxsIHN0YXR1cyBmaWVsZAorICAgICAqIHRleHQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXR1c0ZpZWxkVGV4dCB0aGUgdGV4dCB0byBiZSB1c2VkIGluIHRoZSBvcHRpb25hbCBzdGF0dXMgZmllbGQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHN0YXR1cyBmaWVsZAorICAgICAqICAgICAgICBzaG91bGQgYmUgaGlkZGVuCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb240I3NldFN0YXR1c1RleHQoamF2YS5sYW5nLlN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXNUZXh0KFN0cmluZyBzdGF0dXNGaWVsZFRleHQpIHsKKyAgICAgICAgaWYgKHRoaXMuZlN0YXR1c0xhYmVsICE9IG51bGwgJiYgIWdldFNoZWxsKCkuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXNGaWVsZFRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuZlN0YXR1c0NvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5mU3RhdHVzTGFiZWwuc2V0VGV4dChzdGF0dXNGaWVsZFRleHQpOworICAgICAgICAgICAgICAgIHRoaXMuZlN0YXR1c0NvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JLyoKLQkgKiBAc2VlCi0JICogb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uNSNjb250YWluc0NvbnRyb2woCi0JICogb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0NvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCWRvIHsKLQkJCWlmIChjb250cm9sID09IGZTaGVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBTaGVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWNvbnRyb2wgPSBjb250cm9sLmdldFBhcmVudCgpOwotCQl9IHdoaWxlIChjb250cm9sICE9IG51bGwpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgIC8qCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb241I2NvbnRhaW5zQ29udHJvbCggb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0NvbnRyb2woQ29udHJvbCBjb250cm9sKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChjb250cm9sID09IHRoaXMuZlNoZWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFNoZWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2wuZ2V0UGFyZW50KCk7CisgICAgICAgIH0gd2hpbGUgKGNvbnRyb2wgIT0gbnVsbCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uNSNpc1Zpc2libGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIGZTaGVsbCAhPSBudWxsICYmICFmU2hlbGwuaXNEaXNwb3NlZCgpICYmIGZTaGVsbC5pc1Zpc2libGUoKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbjUjaXNWaXNpYmxlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZTaGVsbCAhPSBudWxsICYmICF0aGlzLmZTaGVsbC5pc0Rpc3Bvc2VkKCkgJiYgdGhpcy5mU2hlbGwuaXNWaXNpYmxlKCk7CisgICAgfQogCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfSBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICovCi0JcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldEluZm9ybWF0aW9uUHJlc2VudGVyQ29udHJvbENyZWF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZ2V0SW5mb3JtYXRpb25QcmVzZW50ZXJDb250cm9sQ3JlYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHNpemUgY29uc3RyYWludHMgYmFzZWQgb24gdGhlIHtAbGluayBKRmFjZVJlc291cmNlcyNnZXREaWFsb2dGb250KCkgZGlhbG9nIGZvbnR9LiBTdWJjbGFzc2VzIGNhbgotCSAqIG92ZXJyaWRlIG9yIGV4dGVuZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbjUjY29tcHV0ZVNpemVDb25zdHJhaW50cyhpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemVDb25zdHJhaW50cyhpbnQgd2lkdGhJbkNoYXJzLCBpbnQgaGVpZ2h0SW5DaGFycykgewotCQlHQyBnYyA9IG5ldyBHQyhmQ29udGVudENvbXBvc2l0ZSk7Ci0JCWdjLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJaW50IHdpZHRoID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCWludCBoZWlnaHQgPSBnYy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpOwotCQlnYy5kaXNwb3NlKCk7CisgICAgLyoqCisgICAgICogQ29tcHV0ZXMgdGhlIHNpemUgY29uc3RyYWludHMgYmFzZWQgb24gdGhlIHtAbGluayBKRmFjZVJlc291cmNlcyNnZXREaWFsb2dGb250KCkgZGlhbG9nIGZvbnR9LiBTdWJjbGFzc2VzIGNhbgorICAgICAqIG92ZXJyaWRlIG9yIGV4dGVuZC4KKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uNSNjb21wdXRlU2l6ZUNvbnN0cmFpbnRzKGludCwgaW50KQorICAgICAqLworICAgIHB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZUNvbnN0cmFpbnRzKGludCB3aWR0aEluQ2hhcnMsIGludCBoZWlnaHRJbkNoYXJzKSB7CisgICAgICAgIEdDIGdjID0gbmV3IEdDKHRoaXMuZkNvbnRlbnRDb21wb3NpdGUpOworICAgICAgICBnYy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7CisgICAgICAgIGludCB3aWR0aCA9IGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOworICAgICAgICBpbnQgaGVpZ2h0ID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKTsKKyAgICAgICAgZ2MuZGlzcG9zZSgpOwogCi0JCXJldHVybiBuZXcgUG9pbnQod2lkdGhJbkNoYXJzICogd2lkdGgsIGhlaWdodEluQ2hhcnMgKiBoZWlnaHQpOwotCX0KKyAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh3aWR0aEluQ2hhcnMgKiB3aWR0aCwgaGVpZ2h0SW5DaGFycyAqIGhlaWdodCk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvSkZhY2VEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvSkZhY2VEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sLmphdmEKaW5kZXggZWU5MTc5MC4uZTM5ZjhiZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy90ZXh0L0pGYWNlRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvdGV4dC9KRmFjZURlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuZWRpdG9ycy50ZXh0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOwpAQCAtMzcsNDMzICszOCwzOTIgQEAKICAqIDxwPgogICogRGlzcGxheXMgdGV4dHVhbCBpbmZvcm1hdGlvbiBpbiBhIHtAbGluayBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHR9d2lkZ2V0LiBCZWZvcmUgZGlzcGxheWluZywgdGhlIGluZm9ybWF0aW9uCiAgKiBzZXQgdG8gdGhpcyBpbmZvcm1hdGlvbiBjb250cm9sIGlzIHByb2Nlc3NlZCBieSBhbiA8Y29kZT5JSW5mb3JtYXRpb25QcmVzZW50ZXI8L2NvZGU+LgotICogCisgKgogICogQGF1dGhvciBDaHJpc3RpYW4gRHVwdWlzCiAgKiBAc2luY2UgMi4wCiAgKi8KIHB1YmxpYyBjbGFzcyBKRmFjZURlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wgZXh0ZW5kcyBKRmFjZUFic3RyYWN0SW5mb3JtYXRpb25Db250cm9sIGltcGxlbWVudHMgRGlzcG9zZUxpc3RlbmVyIHsKIAotCS8qKgotCSAqIEFuIGluZm9ybWF0aW9uIHByZXNlbnRlciBkZXRlcm1pbmVzIHRoZSBzdHlsZSBwcmVzZW50YXRpb24gb2YgaW5mb3JtYXRpb24gZGlzcGxheWVkIGluIHRoZSBkZWZhdWx0IGluZm9ybWF0aW9uCi0JICogY29udHJvbC4gVGhlIGludGVyZmFjZSBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLQkgKiAKLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJSW5mb3JtYXRpb25QcmVzZW50ZXJFeHRlbnNpb24geworICAgIC8qKgorICAgICAqIEFuIGluZm9ybWF0aW9uIHByZXNlbnRlciBkZXRlcm1pbmVzIHRoZSBzdHlsZSBwcmVzZW50YXRpb24gb2YgaW5mb3JtYXRpb24gZGlzcGxheWVkIGluIHRoZSBkZWZhdWx0IGluZm9ybWF0aW9uCisgICAgICogY29udHJvbC4gVGhlIGludGVyZmFjZSBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAzLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIElJbmZvcm1hdGlvblByZXNlbnRlckV4dGVuc2lvbiB7CiAKLQkJLyoqCi0JCSAqIFVwZGF0ZXMgdGhlIGdpdmVuIHByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24gYW5kIHRoZXJlYnkgbWF5IG1hbmlwdWxhdGUgdGhlIGluZm9ybWF0aW9uIHRvIGJlCi0JCSAqIGRpc3BsYXllZC4gVGhlIG1hbmlwdWxhdGlvbiBjb3VsZCBiZSB0aGUgZXh0cmFjdGlvbiBvZiB0ZXh0dWFsIGVuY29kZWQgc3R5bGUgaW5mb3JtYXRpb24gZXRjLiBSZXR1cm5zIHRoZQotCQkgKiBtYW5pcHVsYXRlZCBpbmZvcm1hdGlvbi4KLQkJICogPHA+Ci0JCSAqIFJlcGxhY2VzCi0JCSAqIHtAbGluayBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sLklJbmZvcm1hdGlvblByZXNlbnRlciN1cGRhdGVQcmVzZW50YXRpb24oRGlzcGxheSwgU3RyaW5nLCBUZXh0UHJlc2VudGF0aW9uLCBpbnQsIGludCl9Ci0JCSAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgdXNlIHRoZSBmb250IG9mIHRoZSBnaXZlbiA8Y29kZT5kcmF3YWJsZTwvY29kZT4gdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSB0ZXh0IHRvCi0JCSAqIGJlIHByZXNlbnRlZC4KLQkJICogPC9wPgotCQkgKiAKLQkJICogQHBhcmFtIGRyYXdhYmxlCi0JCSAqICAgICAgICAgICAgdGhlIGRyYXdhYmxlIG9mIHRoZSBpbmZvcm1hdGlvbiBjb250cm9sCi0JCSAqIEBwYXJhbSBob3ZlckluZm8KLQkJICogICAgICAgICAgICB0aGUgaW5mb3JtYXRpb24gdG8gYmUgcHJlc2VudGVkCi0JCSAqIEBwYXJhbSBwcmVzZW50YXRpb24KLQkJICogICAgICAgICAgICB0aGUgcHJlc2VudGF0aW9uIHRvIGJlIHVwZGF0ZWQKLQkJICogQHBhcmFtIG1heFdpZHRoCi0JCSAqICAgICAgICAgICAgdGhlIG1heGltYWwgd2lkdGggaW4gcGl4ZWxzCi0JCSAqIEBwYXJhbSBtYXhIZWlnaHQKLQkJICogICAgICAgICAgICB0aGUgbWF4aW1hbCBoZWlnaHQgaW4gcGl4ZWxzCi0JCSAqIEByZXR1cm4gdGhlIG1hbmlwdWxhdGVkIGluZm9ybWF0aW9uCi0JCSAqLwotCQlTdHJpbmcgdXBkYXRlUHJlc2VudGF0aW9uKERyYXdhYmxlIGRyYXdhYmxlLCBTdHJpbmcgaG92ZXJJbmZvLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbiwgaW50IG1heFdpZHRoLAotCQkJCWludCBtYXhIZWlnaHQpOwotCX0KKyAgICAgICAgLyoqCisgICAgICAgICAqIFVwZGF0ZXMgdGhlIGdpdmVuIHByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24gYW5kIHRoZXJlYnkgbWF5IG1hbmlwdWxhdGUgdGhlIGluZm9ybWF0aW9uIHRvIGJlCisgICAgICAgICAqIGRpc3BsYXllZC4gVGhlIG1hbmlwdWxhdGlvbiBjb3VsZCBiZSB0aGUgZXh0cmFjdGlvbiBvZiB0ZXh0dWFsIGVuY29kZWQgc3R5bGUgaW5mb3JtYXRpb24gZXRjLiBSZXR1cm5zIHRoZQorICAgICAgICAgKiBtYW5pcHVsYXRlZCBpbmZvcm1hdGlvbi4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFJlcGxhY2VzCisgICAgICAgICAqIHtAbGluayBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sLklJbmZvcm1hdGlvblByZXNlbnRlciN1cGRhdGVQcmVzZW50YXRpb24oRGlzcGxheSwgU3RyaW5nLCBUZXh0UHJlc2VudGF0aW9uLCBpbnQsIGludCl9CisgICAgICAgICAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgdXNlIHRoZSBmb250IG9mIHRoZSBnaXZlbiA8Y29kZT5kcmF3YWJsZTwvY29kZT4gdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSB0ZXh0IHRvCisgICAgICAgICAqIGJlIHByZXNlbnRlZC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZHJhd2FibGUgdGhlIGRyYXdhYmxlIG9mIHRoZSBpbmZvcm1hdGlvbiBjb250cm9sCisgICAgICAgICAqIEBwYXJhbSBob3ZlckluZm8gdGhlIGluZm9ybWF0aW9uIHRvIGJlIHByZXNlbnRlZAorICAgICAgICAgKiBAcGFyYW0gcHJlc2VudGF0aW9uIHRoZSBwcmVzZW50YXRpb24gdG8gYmUgdXBkYXRlZAorICAgICAgICAgKiBAcGFyYW0gbWF4V2lkdGggdGhlIG1heGltYWwgd2lkdGggaW4gcGl4ZWxzCisgICAgICAgICAqIEBwYXJhbSBtYXhIZWlnaHQgdGhlIG1heGltYWwgaGVpZ2h0IGluIHBpeGVscworICAgICAgICAgKiBAcmV0dXJuIHRoZSBtYW5pcHVsYXRlZCBpbmZvcm1hdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIHVwZGF0ZVByZXNlbnRhdGlvbihEcmF3YWJsZSBkcmF3YWJsZSwgU3RyaW5nIGhvdmVySW5mbywgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24sIGludCBtYXhXaWR0aCwgaW50IG1heEhlaWdodCk7CisgICAgfQogCi0JLyoqCi0JICogSW5uZXIgYm9yZGVyIHRoaWNrbmVzcyBpbiBwaXhlbHMuCi0JICogCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTk5FUl9CT1JERVIgPSAxOworICAgIC8qKgorICAgICAqIElubmVyIGJvcmRlciB0aGlja25lc3MgaW4gcGl4ZWxzLgorICAgICAqCisgICAgICogQHNpbmNlIDMuMQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTk5FUl9CT1JERVIgPSAxOwogCi0JLyoqIFRoZSBjb250cm9sJ3MgdGV4dCB3aWRnZXQgKi8KLQlwcml2YXRlIFN0eWxlZFRleHQgZlRleHQ7CisgICAgLyoqIFRoZSBjb250cm9sJ3MgdGV4dCB3aWRnZXQgKi8KKyAgICBwcml2YXRlIFN0eWxlZFRleHQgZlRleHQ7CiAKLQkvKiogVGhlIGluZm9ybWF0aW9uIHByZXNlbnRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4gKi8KLQlwcml2YXRlIGZpbmFsIElJbmZvcm1hdGlvblByZXNlbnRlciBmUHJlc2VudGVyOworICAgIC8qKiBUaGUgaW5mb3JtYXRpb24gcHJlc2VudGVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLiAqLworICAgIHByaXZhdGUgZmluYWwgSUluZm9ybWF0aW9uUHJlc2VudGVyIGZQcmVzZW50ZXI7CiAKLQkvKiogQSBjYWNoZWQgdGV4dCBwcmVzZW50YXRpb24gKi8KLQlwcml2YXRlIGZpbmFsIFRleHRQcmVzZW50YXRpb24gZlByZXNlbnRhdGlvbiA9IG5ldyBUZXh0UHJlc2VudGF0aW9uKCk7CisgICAgLyoqIEEgY2FjaGVkIHRleHQgcHJlc2VudGF0aW9uICovCisgICAgcHJpdmF0ZSBmaW5hbCBUZXh0UHJlc2VudGF0aW9uIGZQcmVzZW50YXRpb24gPSBuZXcgVGV4dFByZXNlbnRhdGlvbigpOwogCi0JLyoqCi0JICogQWRkaXRpb25hbCBzdHlsZXMgdG8gdXNlIGZvciB0aGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBzaW5jZSAzLjQsIHByZXZpb3VzbHkgY2FsbGVkIDxjb2RlPmZUZXh0U3R5bGU8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgZkFkZGl0aW9uYWxUZXh0U3R5bGVzOworICAgIC8qKgorICAgICAqIEFkZGl0aW9uYWwgc3R5bGVzIHRvIHVzZSBmb3IgdGhlIHRleHQgY29udHJvbC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAzLjQsIHByZXZpb3VzbHkgY2FsbGVkIDxjb2RlPmZUZXh0U3R5bGU8L2NvZGU+CisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZkFkZGl0aW9uYWxUZXh0U3R5bGVzOwogCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRlZmF1bHQgaW5mb3JtYXRpb24gY29udHJvbCB3aXRoIHRoZSBnaXZlbiBzaGVsbCBhcyBwYXJlbnQuIEFuIGluZm9ybWF0aW9uIHByZXNlbnRlciB0aGF0IGNhbiBoYW5kbGUKLQkgKiBzaW1wbGUgSFRNTCBpcyB1c2VkIHRvIHByb2Nlc3MgdGhlIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIGlzUmVzaXplYWJsZQotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbnRyb2wgc2hvdWxkIGJlIHJlc2l6YWJsZQotCSAqIEBzaW5jZSAzLjQKLQkgKi8KLQlwdWJsaWMgSkZhY2VEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCwgYm9vbGVhbiBpc1Jlc2l6ZWFibGUpIHsKLQkJc3VwZXIocGFyZW50LCBpc1Jlc2l6ZWFibGUpOwotCQlmQWRkaXRpb25hbFRleHRTdHlsZXMgPSBpc1Jlc2l6ZWFibGUgPyBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgOiBTV1QuTk9ORTsKLQkJZlByZXNlbnRlciA9IG5ldyBIVE1MVGV4dFByZXNlbnRlcighaXNSZXNpemVhYmxlKTsKLQkJY3JlYXRlKCk7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IGluZm9ybWF0aW9uIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gc2hlbGwgYXMgcGFyZW50LiBBbiBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgdGhhdCBjYW4gaGFuZGxlCisgICAgICogc2ltcGxlIEhUTUwgaXMgdXNlZCB0byBwcm9jZXNzIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgc2hlbGwKKyAgICAgKiBAcGFyYW0gaXNSZXNpemVhYmxlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250cm9sIHNob3VsZCBiZSByZXNpemFibGUKKyAgICAgKiBAc2luY2UgMy40CisgICAgICovCisgICAgcHVibGljIEpGYWNlRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQsIGJvb2xlYW4gaXNSZXNpemVhYmxlKSB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgaXNSZXNpemVhYmxlKTsKKyAgICAgICAgdGhpcy5mQWRkaXRpb25hbFRleHRTdHlsZXMgPSBpc1Jlc2l6ZWFibGUgPyBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgOiBTV1QuTk9ORTsKKyAgICAgICAgdGhpcy5mUHJlc2VudGVyID0gbmV3IEhUTUxUZXh0UHJlc2VudGVyKCFpc1Jlc2l6ZWFibGUpOworICAgICAgICBjcmVhdGUoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgZGVmYXVsdCBpbmZvcm1hdGlvbiBjb250cm9sIHdpdGggdGhlIGdpdmVuIHNoZWxsIGFzIHBhcmVudC4gQW4gaW5mb3JtYXRpb24gcHJlc2VudGVyIHRoYXQgY2FuIGhhbmRsZQotCSAqIHNpbXBsZSBIVE1MIGlzIHVzZWQgdG8gcHJvY2VzcyB0aGUgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gc3RhdHVzRmllbGRUZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB0byBiZSB1c2VkIGluIHRoZSBzdGF0dXMgZmllbGQgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gaGlkZSB0aGUgc3RhdHVzIGZpZWxkCi0JICogQHNpbmNlIDMuNAotCSAqLwotCXB1YmxpYyBKRmFjZURlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50LCBTdHJpbmcgc3RhdHVzRmllbGRUZXh0KSB7Ci0JCXRoaXMocGFyZW50LCBzdGF0dXNGaWVsZFRleHQsIG5ldyBIVE1MVGV4dFByZXNlbnRlcih0cnVlKSk7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IGluZm9ybWF0aW9uIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gc2hlbGwgYXMgcGFyZW50LiBBbiBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgdGhhdCBjYW4gaGFuZGxlCisgICAgICogc2ltcGxlIEhUTUwgaXMgdXNlZCB0byBwcm9jZXNzIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgc2hlbGwKKyAgICAgKiBAcGFyYW0gc3RhdHVzRmllbGRUZXh0IHRoZSB0ZXh0IHRvIGJlIHVzZWQgaW4gdGhlIHN0YXR1cyBmaWVsZCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBoaWRlIHRoZSBzdGF0dXMgZmllbGQKKyAgICAgKiBAc2luY2UgMy40CisgICAgICovCisgICAgcHVibGljIEpGYWNlRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQsIFN0cmluZyBzdGF0dXNGaWVsZFRleHQpIHsKKyAgICAgICAgdGhpcyhwYXJlbnQsIHN0YXR1c0ZpZWxkVGV4dCwgbmV3IEhUTUxUZXh0UHJlc2VudGVyKHRydWUpKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgZGVmYXVsdCBpbmZvcm1hdGlvbiBjb250cm9sIHdpdGggdGhlIGdpdmVuIHNoZWxsIGFzIHBhcmVudC4gVGhlIGdpdmVuIGluZm9ybWF0aW9uIHByZXNlbnRlciBpcyB1c2VkIHRvCi0JICogcHJvY2VzcyB0aGUgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gc3RhdHVzRmllbGRUZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB0byBiZSB1c2VkIGluIHRoZSBzdGF0dXMgZmllbGQgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gaGlkZSB0aGUgc3RhdHVzIGZpZWxkCi0JICogQHBhcmFtIHByZXNlbnRlcgotCSAqICAgICAgICAgICAgdGhlIHByZXNlbnRlciB0byBiZSB1c2VkLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcmVzZW50ZXIgc2hvdWxkIGJlIHVzZWQKLQkgKiBAc2luY2UgMy40Ci0JICovCi0JcHVibGljIEpGYWNlRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQsIFN0cmluZyBzdGF0dXNGaWVsZFRleHQsIElJbmZvcm1hdGlvblByZXNlbnRlciBwcmVzZW50ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBzdGF0dXNGaWVsZFRleHQpOwotCQlmQWRkaXRpb25hbFRleHRTdHlsZXMgPSBTV1QuTk9ORTsKLQkJZlByZXNlbnRlciA9IHByZXNlbnRlcjsKLQkJY3JlYXRlKCk7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IGluZm9ybWF0aW9uIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gc2hlbGwgYXMgcGFyZW50LiBUaGUgZ2l2ZW4gaW5mb3JtYXRpb24gcHJlc2VudGVyIGlzIHVzZWQgdG8KKyAgICAgKiBwcm9jZXNzIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgc2hlbGwKKyAgICAgKiBAcGFyYW0gc3RhdHVzRmllbGRUZXh0IHRoZSB0ZXh0IHRvIGJlIHVzZWQgaW4gdGhlIHN0YXR1cyBmaWVsZCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byBoaWRlIHRoZSBzdGF0dXMgZmllbGQKKyAgICAgKiBAcGFyYW0gcHJlc2VudGVyIHRoZSBwcmVzZW50ZXIgdG8gYmUgdXNlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJlc2VudGVyIHNob3VsZCBiZSB1c2VkCisgICAgICogQHNpbmNlIDMuNAorICAgICAqLworICAgIHB1YmxpYyBKRmFjZURlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50LCBTdHJpbmcgc3RhdHVzRmllbGRUZXh0LCBJSW5mb3JtYXRpb25QcmVzZW50ZXIgcHJlc2VudGVyKSB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgc3RhdHVzRmllbGRUZXh0KTsKKyAgICAgICAgdGhpcy5mQWRkaXRpb25hbFRleHRTdHlsZXMgPSBTV1QuTk9ORTsKKyAgICAgICAgdGhpcy5mUHJlc2VudGVyID0gcHJlc2VudGVyOworICAgICAgICBjcmVhdGUoKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVzaXphYmxlIGRlZmF1bHQgaW5mb3JtYXRpb24gY29udHJvbCB3aXRoIHRoZSBnaXZlbiBzaGVsbCBhcyBwYXJlbnQuIEFuIGluZm9ybWF0aW9uIHByZXNlbnRlciB0aGF0IGNhbgotCSAqIGhhbmRsZSBzaW1wbGUgSFRNTCBpcyB1c2VkIHRvIHByb2Nlc3MgdGhlIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIHRvb2xCYXJNYW5hZ2VyCi0JICogICAgICAgICAgICB0aGUgbWFuYWdlciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0b29sYmFyIGlzIG5vdCBkZXNpcmVkCi0JICogQHNpbmNlIDMuNAotCSAqLwotCXB1YmxpYyBKRmFjZURlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50LCBUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQl0aGlzKHBhcmVudCwgdG9vbEJhck1hbmFnZXIsIG5ldyBIVE1MVGV4dFByZXNlbnRlcihmYWxzZSkpOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVzaXphYmxlIGRlZmF1bHQgaW5mb3JtYXRpb24gY29udHJvbCB3aXRoIHRoZSBnaXZlbiBzaGVsbCBhcyBwYXJlbnQuIEFuIGluZm9ybWF0aW9uIHByZXNlbnRlciB0aGF0IGNhbgorICAgICAqIGhhbmRsZSBzaW1wbGUgSFRNTCBpcyB1c2VkIHRvIHByb2Nlc3MgdGhlIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBzaGVsbAorICAgICAqIEBwYXJhbSB0b29sQmFyTWFuYWdlciB0aGUgbWFuYWdlciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0b29sYmFyIGlzIG5vdCBkZXNpcmVkCisgICAgICogQHNpbmNlIDMuNAorICAgICAqLworICAgIHB1YmxpYyBKRmFjZURlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50LCBUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgeworICAgICAgICB0aGlzKHBhcmVudCwgdG9vbEJhck1hbmFnZXIsIG5ldyBIVE1MVGV4dFByZXNlbnRlcihmYWxzZSkpOworICAgIH0KIAotCS8qKgotCSAqIENyZWF0ZXMgYSByZXNpemFibGUgZGVmYXVsdCBpbmZvcm1hdGlvbiBjb250cm9sIHdpdGggdGhlIGdpdmVuIHNoZWxsIGFzIHBhcmVudC4gVGhlIGdpdmVuIGluZm9ybWF0aW9uIHByZXNlbnRlcgotCSAqIGlzIHVzZWQgdG8gcHJvY2VzcyB0aGUgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gdG9vbEJhck1hbmFnZXIKLQkgKiAgICAgICAgICAgIHRoZSBtYW5hZ2VyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRvb2xiYXIgaXMgbm90IGRlc2lyZWQKLQkgKiBAcGFyYW0gcHJlc2VudGVyCi0JICogICAgICAgICAgICB0aGUgcHJlc2VudGVyIHRvIGJlIHVzZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByZXNlbnRlciBzaG91bGQgYmUgdXNlZAotCSAqIEBzaW5jZSAzLjQKLQkgKi8KLQlwdWJsaWMgSkZhY2VEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCwgVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIsIElJbmZvcm1hdGlvblByZXNlbnRlciBwcmVzZW50ZXIpIHsKLQkJc3VwZXIocGFyZW50LCB0b29sQmFyTWFuYWdlcik7Ci0JCWZBZGRpdGlvbmFsVGV4dFN0eWxlcyA9IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTDsKLQkJZlByZXNlbnRlciA9IHByZXNlbnRlcjsKLQkJY3JlYXRlKCk7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSByZXNpemFibGUgZGVmYXVsdCBpbmZvcm1hdGlvbiBjb250cm9sIHdpdGggdGhlIGdpdmVuIHNoZWxsIGFzIHBhcmVudC4gVGhlIGdpdmVuIGluZm9ybWF0aW9uIHByZXNlbnRlcgorICAgICAqIGlzIHVzZWQgdG8gcHJvY2VzcyB0aGUgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IHNoZWxsCisgICAgICogQHBhcmFtIHRvb2xCYXJNYW5hZ2VyIHRoZSBtYW5hZ2VyIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRvb2xiYXIgaXMgbm90IGRlc2lyZWQKKyAgICAgKiBAcGFyYW0gcHJlc2VudGVyIHRoZSBwcmVzZW50ZXIgdG8gYmUgdXNlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJlc2VudGVyIHNob3VsZCBiZSB1c2VkCisgICAgICogQHNpbmNlIDMuNAorICAgICAqLworICAgIHB1YmxpYyBKRmFjZURlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50LCBUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSUluZm9ybWF0aW9uUHJlc2VudGVyIHByZXNlbnRlcikgeworICAgICAgICBzdXBlcihwYXJlbnQsIHRvb2xCYXJNYW5hZ2VyKTsKKyAgICAgICAgdGhpcy5mQWRkaXRpb25hbFRleHRTdHlsZXMgPSBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEw7CisgICAgICAgIHRoaXMuZlByZXNlbnRlciA9IHByZXNlbnRlcjsKKyAgICAgICAgY3JlYXRlKCk7CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRlZmF1bHQgaW5mb3JtYXRpb24gY29udHJvbCB3aXRoIHRoZSBnaXZlbiBzaGVsbCBhcyBwYXJlbnQuIE5vIGluZm9ybWF0aW9uIHByZXNlbnRlciBpcyB1c2VkIHRvIHByb2Nlc3MKLQkgKiB0aGUgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwKLQkgKi8KLQlwdWJsaWMgSkZhY2VEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCkgewotCQl0aGlzKHBhcmVudCwgKFN0cmluZykgbnVsbCwgbnVsbCk7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IGluZm9ybWF0aW9uIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gc2hlbGwgYXMgcGFyZW50LiBObyBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgaXMgdXNlZCB0byBwcm9jZXNzCisgICAgICogdGhlIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBzaGVsbAorICAgICAqLworICAgIHB1YmxpYyBKRmFjZURlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7CisgICAgICAgIHRoaXMocGFyZW50LCAoU3RyaW5nKSBudWxsLCBudWxsKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgZGVmYXVsdCBpbmZvcm1hdGlvbiBjb250cm9sIHdpdGggdGhlIGdpdmVuIHNoZWxsIGFzIHBhcmVudC4gVGhlIGdpdmVuIGluZm9ybWF0aW9uIHByZXNlbnRlciBpcyB1c2VkIHRvCi0JICogcHJvY2VzcyB0aGUgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gcHJlc2VudGVyCi0JICogICAgICAgICAgICB0aGUgcHJlc2VudGVyIHRvIGJlIHVzZWQKLQkgKi8KLQlwdWJsaWMgSkZhY2VEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCwgSUluZm9ybWF0aW9uUHJlc2VudGVyIHByZXNlbnRlcikgewotCQl0aGlzKHBhcmVudCwgKFN0cmluZykgbnVsbCwgcHJlc2VudGVyKTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGRlZmF1bHQgaW5mb3JtYXRpb24gY29udHJvbCB3aXRoIHRoZSBnaXZlbiBzaGVsbCBhcyBwYXJlbnQuIFRoZSBnaXZlbiBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgaXMgdXNlZCB0bworICAgICAqIHByb2Nlc3MgdGhlIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBzaGVsbAorICAgICAqIEBwYXJhbSBwcmVzZW50ZXIgdGhlIHByZXNlbnRlciB0byBiZSB1c2VkCisgICAgICovCisgICAgcHVibGljIEpGYWNlRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQsIElJbmZvcm1hdGlvblByZXNlbnRlciBwcmVzZW50ZXIpIHsKKyAgICAgICAgdGhpcyhwYXJlbnQsIChTdHJpbmcpIG51bGwsIHByZXNlbnRlcik7CisgICAgfQogCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRlZmF1bHQgaW5mb3JtYXRpb24gY29udHJvbCB3aXRoIHRoZSBnaXZlbiBzaGVsbCBhcyBwYXJlbnQuIFRoZSBnaXZlbiBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgaXMgdXNlZCB0bwotCSAqIHByb2Nlc3MgdGhlIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZC4gVGhlIGdpdmVuIHN0eWxlcyBhcmUgYXBwbGllZCB0byB0aGUgY3JlYXRlZCBzdHlsZWQgdGV4dCB3aWRnZXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBzaGVsbFN0eWxlCi0JICogICAgICAgICAgICB0aGUgYWRkaXRpb25hbCBzdHlsZXMgZm9yIHRoZSBzaGVsbAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIGFkZGl0aW9uYWwgc3R5bGVzIGZvciB0aGUgc3R5bGVkIHRleHQgd2lkZ2V0Ci0JICogQHBhcmFtIHByZXNlbnRlcgotCSAqICAgICAgICAgICAgdGhlIHByZXNlbnRlciB0byBiZSB1c2VkCi0JICogQGRlcHJlY2F0ZWQgQXMgb2YgMy40LCByZXBsYWNlZCBieSBzaW1wbGVyIGNvbnN0cnVjdG9ycwotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIEpGYWNlRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQsIGludCBzaGVsbFN0eWxlLCBpbnQgc3R5bGUsIElJbmZvcm1hdGlvblByZXNlbnRlciBwcmVzZW50ZXIpIHsKLQkJdGhpcyhwYXJlbnQsIHNoZWxsU3R5bGUsIHN0eWxlLCBwcmVzZW50ZXIsIG51bGwpOwotCX0KKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBpbmZvcm1hdGlvbiBjb250cm9sIHdpdGggdGhlIGdpdmVuIHNoZWxsIGFzIHBhcmVudC4gVGhlIGdpdmVuIGluZm9ybWF0aW9uIHByZXNlbnRlciBpcyB1c2VkIHRvCisgICAgICogcHJvY2VzcyB0aGUgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkLiBUaGUgZ2l2ZW4gc3R5bGVzIGFyZSBhcHBsaWVkIHRvIHRoZSBjcmVhdGVkIHN0eWxlZCB0ZXh0IHdpZGdldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBzaGVsbAorICAgICAqIEBwYXJhbSBzaGVsbFN0eWxlIHRoZSBhZGRpdGlvbmFsIHN0eWxlcyBmb3IgdGhlIHNoZWxsCisgICAgICogQHBhcmFtIHN0eWxlIHRoZSBhZGRpdGlvbmFsIHN0eWxlcyBmb3IgdGhlIHN0eWxlZCB0ZXh0IHdpZGdldAorICAgICAqIEBwYXJhbSBwcmVzZW50ZXIgdGhlIHByZXNlbnRlciB0byBiZSB1c2VkCisgICAgICogQGRlcHJlY2F0ZWQgQXMgb2YgMy40LCByZXBsYWNlZCBieSBzaW1wbGVyIGNvbnN0cnVjdG9ycworICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIEpGYWNlRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQsIGludCBzaGVsbFN0eWxlLCBpbnQgc3R5bGUsIElJbmZvcm1hdGlvblByZXNlbnRlciBwcmVzZW50ZXIpIHsKKyAgICAgICAgdGhpcyhwYXJlbnQsIHNoZWxsU3R5bGUsIHN0eWxlLCBwcmVzZW50ZXIsIG51bGwpOworICAgIH0KIAotCS8qKgotCSAqIENyZWF0ZXMgYSBkZWZhdWx0IGluZm9ybWF0aW9uIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gc2hlbGwgYXMgcGFyZW50LiBUaGUgZ2l2ZW4gaW5mb3JtYXRpb24gcHJlc2VudGVyIGlzIHVzZWQgdG8KLQkgKiBwcm9jZXNzIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQuIFRoZSBnaXZlbiBzdHlsZXMgYXJlIGFwcGxpZWQgdG8gdGhlIGNyZWF0ZWQgc3R5bGVkIHRleHQgd2lkZ2V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBzaGVsbFN0eWxlCi0JICogICAgICAgICAgICB0aGUgYWRkaXRpb25hbCBzdHlsZXMgZm9yIHRoZSBzaGVsbAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIGFkZGl0aW9uYWwgc3R5bGVzIGZvciB0aGUgc3R5bGVkIHRleHQgd2lkZ2V0Ci0JICogQHBhcmFtIHByZXNlbnRlcgotCSAqICAgICAgICAgICAgdGhlIHByZXNlbnRlciB0byBiZSB1c2VkCi0JICogQHBhcmFtIHN0YXR1c0ZpZWxkVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gYmUgdXNlZCBpbiB0aGUgc3RhdHVzIGZpZWxkIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGhpZGUgdGhlIHN0YXR1cyBmaWVsZAotCSAqIEBzaW5jZSAzLjAKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAzLjQsIHJlcGxhY2VkIGJ5IHNpbXBsZXIgY29uc3RydWN0b3JzCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgSkZhY2VEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudFNoZWxsLCBpbnQgc2hlbGxTdHlsZSwgZmluYWwgaW50IHN0eWxlLAotCQkJSUluZm9ybWF0aW9uUHJlc2VudGVyIHByZXNlbnRlciwgU3RyaW5nIHN0YXR1c0ZpZWxkVGV4dCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgU1dULk5PX0ZPQ1VTIHwgU1dULk9OX1RPUCB8IHNoZWxsU3R5bGUsIHN0YXR1c0ZpZWxkVGV4dCwgbnVsbCk7Ci0JCWZBZGRpdGlvbmFsVGV4dFN0eWxlcyA9IHN0eWxlOwotCQlmUHJlc2VudGVyID0gcHJlc2VudGVyOwotCQljcmVhdGUoKTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGRlZmF1bHQgaW5mb3JtYXRpb24gY29udHJvbCB3aXRoIHRoZSBnaXZlbiBzaGVsbCBhcyBwYXJlbnQuIFRoZSBnaXZlbiBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgaXMgdXNlZCB0bworICAgICAqIHByb2Nlc3MgdGhlIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZC4gVGhlIGdpdmVuIHN0eWxlcyBhcmUgYXBwbGllZCB0byB0aGUgY3JlYXRlZCBzdHlsZWQgdGV4dCB3aWRnZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50U2hlbGwgdGhlIHBhcmVudCBzaGVsbAorICAgICAqIEBwYXJhbSBzaGVsbFN0eWxlIHRoZSBhZGRpdGlvbmFsIHN0eWxlcyBmb3IgdGhlIHNoZWxsCisgICAgICogQHBhcmFtIHN0eWxlIHRoZSBhZGRpdGlvbmFsIHN0eWxlcyBmb3IgdGhlIHN0eWxlZCB0ZXh0IHdpZGdldAorICAgICAqIEBwYXJhbSBwcmVzZW50ZXIgdGhlIHByZXNlbnRlciB0byBiZSB1c2VkCisgICAgICogQHBhcmFtIHN0YXR1c0ZpZWxkVGV4dCB0aGUgdGV4dCB0byBiZSB1c2VkIGluIHRoZSBzdGF0dXMgZmllbGQgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gaGlkZSB0aGUgc3RhdHVzIGZpZWxkCisgICAgICogQHNpbmNlIDMuMAorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIDMuNCwgcmVwbGFjZWQgYnkgc2ltcGxlciBjb25zdHJ1Y3RvcnMKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBKRmFjZURlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50U2hlbGwsIGludCBzaGVsbFN0eWxlLCBmaW5hbCBpbnQgc3R5bGUsIElJbmZvcm1hdGlvblByZXNlbnRlciBwcmVzZW50ZXIsCisgICAgICAgIFN0cmluZyBzdGF0dXNGaWVsZFRleHQpIHsKKyAgICAgICAgc3VwZXIocGFyZW50U2hlbGwsIFNXVC5OT19GT0NVUyB8IFNXVC5PTl9UT1AgfCBzaGVsbFN0eWxlLCBzdGF0dXNGaWVsZFRleHQsIG51bGwpOworICAgICAgICB0aGlzLmZBZGRpdGlvbmFsVGV4dFN0eWxlcyA9IHN0eWxlOworICAgICAgICB0aGlzLmZQcmVzZW50ZXIgPSBwcmVzZW50ZXI7CisgICAgICAgIGNyZWF0ZSgpOworICAgIH0KIAotCS8qKgotCSAqIENyZWF0ZXMgYSBkZWZhdWx0IGluZm9ybWF0aW9uIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gc2hlbGwgYXMgcGFyZW50LiBUaGUgZ2l2ZW4gaW5mb3JtYXRpb24gcHJlc2VudGVyIGlzIHVzZWQgdG8KLQkgKiBwcm9jZXNzIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSB0ZXh0U3R5bGVzCi0JICogICAgICAgICAgICB0aGUgYWRkaXRpb25hbCBzdHlsZXMgZm9yIHRoZSBzdHlsZWQgdGV4dCB3aWRnZXQKLQkgKiBAcGFyYW0gcHJlc2VudGVyCi0JICogICAgICAgICAgICB0aGUgcHJlc2VudGVyIHRvIGJlIHVzZWQKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAzLjQsIHJlcGxhY2VkIGJ5Ci0JICogICAgICAgICAgICAge0BsaW5rICNEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKFNoZWxsLCBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sLklJbmZvcm1hdGlvblByZXNlbnRlcil9Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgSkZhY2VEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCwgaW50IHRleHRTdHlsZXMsIElJbmZvcm1hdGlvblByZXNlbnRlciBwcmVzZW50ZXIpIHsKLQkJdGhpcyhwYXJlbnQsIHRleHRTdHlsZXMsIHByZXNlbnRlciwgbnVsbCk7Ci0JfQorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IGluZm9ybWF0aW9uIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gc2hlbGwgYXMgcGFyZW50LiBUaGUgZ2l2ZW4gaW5mb3JtYXRpb24gcHJlc2VudGVyIGlzIHVzZWQgdG8KKyAgICAgKiBwcm9jZXNzIHRoZSBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgc2hlbGwKKyAgICAgKiBAcGFyYW0gdGV4dFN0eWxlcyB0aGUgYWRkaXRpb25hbCBzdHlsZXMgZm9yIHRoZSBzdHlsZWQgdGV4dCB3aWRnZXQKKyAgICAgKiBAcGFyYW0gcHJlc2VudGVyIHRoZSBwcmVzZW50ZXIgdG8gYmUgdXNlZAorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIDMuNCwgcmVwbGFjZWQgYnkKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI0RlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwsIERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wuSUluZm9ybWF0aW9uUHJlc2VudGVyKX0KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBKRmFjZURlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50LCBpbnQgdGV4dFN0eWxlcywgSUluZm9ybWF0aW9uUHJlc2VudGVyIHByZXNlbnRlcikgeworICAgICAgICB0aGlzKHBhcmVudCwgdGV4dFN0eWxlcywgcHJlc2VudGVyLCBudWxsKTsKKyAgICB9CiAKLQkvKioKLQkgKiBDcmVhdGVzIGEgZGVmYXVsdCBpbmZvcm1hdGlvbiBjb250cm9sIHdpdGggdGhlIGdpdmVuIHNoZWxsIGFzIHBhcmVudC4gVGhlIGdpdmVuIGluZm9ybWF0aW9uIHByZXNlbnRlciBpcyB1c2VkIHRvCi0JICogcHJvY2VzcyB0aGUgaW5mb3JtYXRpb24gdG8gYmUgZGlzcGxheWVkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gdGV4dFN0eWxlcwotCSAqICAgICAgICAgICAgdGhlIGFkZGl0aW9uYWwgc3R5bGVzIGZvciB0aGUgc3R5bGVkIHRleHQgd2lkZ2V0Ci0JICogQHBhcmFtIHByZXNlbnRlcgotCSAqICAgICAgICAgICAgdGhlIHByZXNlbnRlciB0byBiZSB1c2VkCi0JICogQHBhcmFtIHN0YXR1c0ZpZWxkVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gYmUgdXNlZCBpbiB0aGUgc3RhdHVzIGZpZWxkIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGhpZGUgdGhlIHN0YXR1cyBmaWVsZAotCSAqIEBzaW5jZSAzLjAKLQkgKiBAZGVwcmVjYXRlZCBBcyBvZiAzLjQsIHJlcGxhY2VkIGJ5Ci0JICogICAgICAgICAgICAge0BsaW5rICNEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKFNoZWxsLCBTdHJpbmcsIERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wuSUluZm9ybWF0aW9uUHJlc2VudGVyKX0KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBKRmFjZURlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50LCBpbnQgdGV4dFN0eWxlcywgSUluZm9ybWF0aW9uUHJlc2VudGVyIHByZXNlbnRlciwKLQkJCVN0cmluZyBzdGF0dXNGaWVsZFRleHQpIHsKLQkJc3VwZXIocGFyZW50LCBzdGF0dXNGaWVsZFRleHQpOwotCQlmQWRkaXRpb25hbFRleHRTdHlsZXMgPSB0ZXh0U3R5bGVzOwotCQlmUHJlc2VudGVyID0gcHJlc2VudGVyOwotCQljcmVhdGUoKTsKLQl9CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGRlZmF1bHQgaW5mb3JtYXRpb24gY29udHJvbCB3aXRoIHRoZSBnaXZlbiBzaGVsbCBhcyBwYXJlbnQuIFRoZSBnaXZlbiBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgaXMgdXNlZCB0bworICAgICAqIHByb2Nlc3MgdGhlIGluZm9ybWF0aW9uIHRvIGJlIGRpc3BsYXllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBzaGVsbAorICAgICAqIEBwYXJhbSB0ZXh0U3R5bGVzIHRoZSBhZGRpdGlvbmFsIHN0eWxlcyBmb3IgdGhlIHN0eWxlZCB0ZXh0IHdpZGdldAorICAgICAqIEBwYXJhbSBwcmVzZW50ZXIgdGhlIHByZXNlbnRlciB0byBiZSB1c2VkCisgICAgICogQHBhcmFtIHN0YXR1c0ZpZWxkVGV4dCB0aGUgdGV4dCB0byBiZSB1c2VkIGluIHRoZSBzdGF0dXMgZmllbGQgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gaGlkZSB0aGUgc3RhdHVzIGZpZWxkCisgICAgICogQHNpbmNlIDMuMAorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIDMuNCwgcmVwbGFjZWQgYnkKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgI0RlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwsIFN0cmluZywgRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbC5JSW5mb3JtYXRpb25QcmVzZW50ZXIpfQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIEpGYWNlRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQsIGludCB0ZXh0U3R5bGVzLCBJSW5mb3JtYXRpb25QcmVzZW50ZXIgcHJlc2VudGVyLCBTdHJpbmcgc3RhdHVzRmllbGRUZXh0KSB7CisgICAgICAgIHN1cGVyKHBhcmVudCwgc3RhdHVzRmllbGRUZXh0KTsKKyAgICAgICAgdGhpcy5mQWRkaXRpb25hbFRleHRTdHlsZXMgPSB0ZXh0U3R5bGVzOworICAgICAgICB0aGlzLmZQcmVzZW50ZXIgPSBwcmVzZW50ZXI7CisgICAgICAgIGNyZWF0ZSgpOworICAgIH0KIAotCS8qCi0JICogQHNlZQotCSAqIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQWJzdHJhY3RJbmZvcm1hdGlvbkNvbnRyb2wjY3JlYXRlQ29udGVudChvcmcuZWNsaXBzZQotCSAqIC5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZUZXh0ID0gbmV3IFN0eWxlZFRleHQocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgZkFkZGl0aW9uYWxUZXh0U3R5bGVzKTsKLQkJZlRleHQuc2V0Rm9yZWdyb3VuZChwYXJlbnQuZ2V0Rm9yZWdyb3VuZCgpKTsKLQkJZlRleHQuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLQkJZlRleHQuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlGaWxsTGF5b3V0IGxheW91dCA9IChGaWxsTGF5b3V0KSBwYXJlbnQuZ2V0TGF5b3V0KCk7Ci0JCWlmIChmVGV4dC5nZXRXb3JkV3JhcCgpKSB7Ci0JCQkvLyBpbmRlbnQgZG9lcyBub3Qgd29yayBmb3Igd3JhcHBpbmcgU3R5bGVkVGV4dCwgc2VlCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTYzNDIgYW5kCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE1NDMyCi0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gSU5ORVJfQk9SREVSOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gSU5ORVJfQk9SREVSOwotCQl9IGVsc2UgewotCQkJZlRleHQuc2V0SW5kZW50KElOTkVSX0JPUkRFUik7Ci0JCX0KLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQWJzdHJhY3RJbmZvcm1hdGlvbkNvbnRyb2wjY3JlYXRlQ29udGVudChvcmcuZWNsaXBzZSAuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkgeworICAgICAgICB0aGlzLmZUZXh0ID0gbmV3IFN0eWxlZFRleHQocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuUkVBRF9PTkxZIHwgdGhpcy5mQWRkaXRpb25hbFRleHRTdHlsZXMpOworICAgICAgICB0aGlzLmZUZXh0LnNldEZvcmVncm91bmQocGFyZW50LmdldEZvcmVncm91bmQoKSk7CisgICAgICAgIHRoaXMuZlRleHQuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKKyAgICAgICAgdGhpcy5mVGV4dC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7CisgICAgICAgIEZpbGxMYXlvdXQgbGF5b3V0ID0gKEZpbGxMYXlvdXQpIHBhcmVudC5nZXRMYXlvdXQoKTsKKyAgICAgICAgaWYgKHRoaXMuZlRleHQuZ2V0V29yZFdyYXAoKSkgeworICAgICAgICAgICAgLy8gaW5kZW50IGRvZXMgbm90IHdvcmsgZm9yIHdyYXBwaW5nIFN0eWxlZFRleHQsIHNlZQorICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTU2MzQyIGFuZAorICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNTQzMgorICAgICAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IElOTkVSX0JPUkRFUjsKKyAgICAgICAgICAgIGxheW91dC5tYXJnaW5XaWR0aCA9IElOTkVSX0JPUkRFUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuZlRleHQuc2V0SW5kZW50KElOTkVSX0JPUkRFUik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgSUluZm9ybWF0aW9uQ29udHJvbCNzZXRJbmZvcm1hdGlvbihTdHJpbmcpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGNvbnRlbnQpIHsKLQkJaWYgKGZQcmVzZW50ZXIgPT0gbnVsbCkgewotCQkJZlRleHQuc2V0VGV4dChjb250ZW50KTsKLQkJfSBlbHNlIHsKLQkJCWZQcmVzZW50YXRpb24uY2xlYXIoKTsKKyAgICAvKgorICAgICAqIEBzZWUgSUluZm9ybWF0aW9uQ29udHJvbCNzZXRJbmZvcm1hdGlvbihTdHJpbmcpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgaWYgKHRoaXMuZlByZXNlbnRlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmZUZXh0LnNldFRleHQoY29udGVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmZQcmVzZW50YXRpb24uY2xlYXIoKTsKIAotCQkJaW50IG1heFdpZHRoID0gLTE7Ci0JCQlpbnQgbWF4SGVpZ2h0ID0gLTE7Ci0JCQlQb2ludCBjb25zdHJhaW50cyA9IGdldFNpemVDb25zdHJhaW50cygpOwotCQkJaWYgKGNvbnN0cmFpbnRzICE9IG51bGwpIHsKLQkJCQltYXhXaWR0aCA9IGNvbnN0cmFpbnRzLng7Ci0JCQkJbWF4SGVpZ2h0ID0gY29uc3RyYWludHMueTsKLQkJCQlpZiAoZlRleHQuZ2V0V29yZFdyYXAoKSkgewotCQkJCQltYXhXaWR0aCAtPSBJTk5FUl9CT1JERVIgKiAyOwotCQkJCQltYXhIZWlnaHQgLT0gSU5ORVJfQk9SREVSICogMjsKLQkJCQl9IGVsc2UgewotCQkJCQltYXhXaWR0aCAtPSBJTk5FUl9CT1JERVI7IC8vIGluZGVudAotCQkJCX0KLQkJCQlSZWN0YW5nbGUgdHJpbSA9IGNvbXB1dGVUcmltKCk7Ci0JCQkJbWF4V2lkdGggLT0gdHJpbS53aWR0aDsKLQkJCQltYXhIZWlnaHQgLT0gdHJpbS5oZWlnaHQ7Ci0JCQkJbWF4V2lkdGggLT0gZlRleHQuZ2V0Q2FyZXQoKS5nZXRTaXplKCkueDsgLy8gU3R5bGVkVGV4dCBhZGRzIGEKLQkJCQkvLyBib3JkZXIgYXQgdGhlIGVuZAotCQkJCS8vIG9mIHRoZSBsaW5lIGZvcgotCQkJCS8vIHRoZSBjYXJldC4KLQkJCX0KLQkJCWlmIChpc1Jlc2l6YWJsZSgpKSB7Ci0JCQkJbWF4SGVpZ2h0ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQl9CisgICAgICAgICAgICBpbnQgbWF4V2lkdGggPSAtMTsKKyAgICAgICAgICAgIGludCBtYXhIZWlnaHQgPSAtMTsKKyAgICAgICAgICAgIFBvaW50IGNvbnN0cmFpbnRzID0gZ2V0U2l6ZUNvbnN0cmFpbnRzKCk7CisgICAgICAgICAgICBpZiAoY29uc3RyYWludHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1heFdpZHRoID0gY29uc3RyYWludHMueDsKKyAgICAgICAgICAgICAgICBtYXhIZWlnaHQgPSBjb25zdHJhaW50cy55OworICAgICAgICAgICAgICAgIGlmICh0aGlzLmZUZXh0LmdldFdvcmRXcmFwKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGggLT0gSU5ORVJfQk9SREVSICogMjsKKyAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0IC09IElOTkVSX0JPUkRFUiAqIDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGggLT0gSU5ORVJfQk9SREVSOyAvLyBpbmRlbnQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHRyaW0gPSBjb21wdXRlVHJpbSgpOworICAgICAgICAgICAgICAgIG1heFdpZHRoIC09IHRyaW0ud2lkdGg7CisgICAgICAgICAgICAgICAgbWF4SGVpZ2h0IC09IHRyaW0uaGVpZ2h0OworICAgICAgICAgICAgICAgIG1heFdpZHRoIC09IHRoaXMuZlRleHQuZ2V0Q2FyZXQoKS5nZXRTaXplKCkueDsgLy8gU3R5bGVkVGV4dCBhZGRzIGEKKyAgICAgICAgICAgICAgICAvLyBib3JkZXIgYXQgdGhlIGVuZAorICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBsaW5lIGZvcgorICAgICAgICAgICAgICAgIC8vIHRoZSBjYXJldC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc1Jlc2l6YWJsZSgpKSB7CisgICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChmUHJlc2VudGVyIGluc3RhbmNlb2YgSUluZm9ybWF0aW9uUHJlc2VudGVyRXh0ZW5zaW9uKSB7Ci0JCQkJY29udGVudCA9ICgoSUluZm9ybWF0aW9uUHJlc2VudGVyRXh0ZW5zaW9uKSBmUHJlc2VudGVyKS51cGRhdGVQcmVzZW50YXRpb24oZlRleHQsIGNvbnRlbnQsCi0JCQkJCQlmUHJlc2VudGF0aW9uLCBtYXhXaWR0aCwgbWF4SGVpZ2h0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29udGVudCA9IGZQcmVzZW50ZXIudXBkYXRlUHJlc2VudGF0aW9uKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBjb250ZW50LCBmUHJlc2VudGF0aW9uLCBtYXhXaWR0aCwKLQkJCQkJCW1heEhlaWdodCk7Ci0JCQl9CisgICAgICAgICAgICBpZiAodGhpcy5mUHJlc2VudGVyIGluc3RhbmNlb2YgSUluZm9ybWF0aW9uUHJlc2VudGVyRXh0ZW5zaW9uKSB7CisgICAgICAgICAgICAgICAgY29udGVudCA9ICgoSUluZm9ybWF0aW9uUHJlc2VudGVyRXh0ZW5zaW9uKSB0aGlzLmZQcmVzZW50ZXIpLnVwZGF0ZVByZXNlbnRhdGlvbih0aGlzLmZUZXh0LCBjb250ZW50LCB0aGlzLmZQcmVzZW50YXRpb24sIG1heFdpZHRoLAorICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb250ZW50ID0gdGhpcy5mUHJlc2VudGVyLnVwZGF0ZVByZXNlbnRhdGlvbihnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgY29udGVudCwgdGhpcy5mUHJlc2VudGF0aW9uLCBtYXhXaWR0aCwgbWF4SGVpZ2h0KTsKKyAgICAgICAgICAgIH0KIAotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJCWZUZXh0LnNldFRleHQoY29udGVudCk7Ci0JCQkJVGV4dFByZXNlbnRhdGlvbi5hcHBseVRleHRQcmVzZW50YXRpb24oZlByZXNlbnRhdGlvbiwgZlRleHQpOwotCQkJfSBlbHNlIHsKLQkJCQlmVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuZlRleHQuc2V0VGV4dChjb250ZW50KTsKKyAgICAgICAgICAgICAgICBUZXh0UHJlc2VudGF0aW9uLmFwcGx5VGV4dFByZXNlbnRhdGlvbih0aGlzLmZQcmVzZW50YXRpb24sIHRoaXMuZlRleHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLmZUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgSUluZm9ybWF0aW9uQ29udHJvbCNzZXRWaXNpYmxlKGJvb2xlYW4pCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHZpc2libGUpIHsKLQkJCWlmIChmVGV4dC5nZXRXb3JkV3JhcCgpKSB7Ci0JCQkJUG9pbnQgY3VycmVudFNpemUgPSBnZXRTaGVsbCgpLmdldFNpemUoKTsKLQkJCQlnZXRTaGVsbCgpLnBhY2sodHJ1ZSk7Ci0JCQkJUG9pbnQgbmV3U2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOwotCQkJCWlmIChuZXdTaXplLnggPiBjdXJyZW50U2l6ZS54IHx8IG5ld1NpemUueSA+IGN1cnJlbnRTaXplLnkpIHsKLQkJCQkJc2V0U2l6ZShjdXJyZW50U2l6ZS54LCBjdXJyZW50U2l6ZS55KTsgLy8gcmVzdG9yZSBwcmV2aW91cwotCQkJCQkvLyBzaXplCi0JCQkJfQotCQkJfQotCQl9CisgICAgLyoKKyAgICAgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjc2V0VmlzaWJsZShib29sZWFuKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICBpZiAodGhpcy5mVGV4dC5nZXRXb3JkV3JhcCgpKSB7CisgICAgICAgICAgICAgICAgUG9pbnQgY3VycmVudFNpemUgPSBnZXRTaGVsbCgpLmdldFNpemUoKTsKKyAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLnBhY2sodHJ1ZSk7CisgICAgICAgICAgICAgICAgUG9pbnQgbmV3U2l6ZSA9IGdldFNoZWxsKCkuZ2V0U2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChuZXdTaXplLnggPiBjdXJyZW50U2l6ZS54IHx8IG5ld1NpemUueSA+IGN1cnJlbnRTaXplLnkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZShjdXJyZW50U2l6ZS54LCBjdXJyZW50U2l6ZS55KTsgLy8gcmVzdG9yZSBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAvLyBzaXplCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQl9CisgICAgICAgIHN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjY29tcHV0ZVNpemVIaW50KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemVIaW50KCkgewotCQkvLyBzZWU6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTc2MDIKLQkJaW50IHdpZHRoSGludCA9IFNXVC5ERUZBVUxUOwotCQlQb2ludCBjb25zdHJhaW50cyA9IGdldFNpemVDb25zdHJhaW50cygpOwotCQlpZiAoY29uc3RyYWludHMgIT0gbnVsbCAmJiBmVGV4dC5nZXRXb3JkV3JhcCgpKSB7Ci0JCQl3aWR0aEhpbnQgPSBjb25zdHJhaW50cy54OwotCQl9CisgICAgLyoKKyAgICAgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjY29tcHV0ZVNpemVIaW50KCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemVIaW50KCkgeworICAgICAgICAvLyBzZWU6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTc2MDIKKyAgICAgICAgaW50IHdpZHRoSGludCA9IFNXVC5ERUZBVUxUOworICAgICAgICBQb2ludCBjb25zdHJhaW50cyA9IGdldFNpemVDb25zdHJhaW50cygpOworICAgICAgICBpZiAoY29uc3RyYWludHMgIT0gbnVsbCAmJiB0aGlzLmZUZXh0LmdldFdvcmRXcmFwKCkpIHsKKyAgICAgICAgICAgIHdpZHRoSGludCA9IGNvbnN0cmFpbnRzLng7CisgICAgICAgIH0KIAotCQlyZXR1cm4gZ2V0U2hlbGwoKS5jb21wdXRlU2l6ZSh3aWR0aEhpbnQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQl9CisgICAgICAgIHJldHVybiBnZXRTaGVsbCgpLmNvbXB1dGVTaXplKHdpZHRoSGludCwgU1dULkRFRkFVTFQsIHRydWUpOworICAgIH0KIAotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFic3RyYWN0SW5mb3JtYXRpb25Db250cm9sI2NvbXB1dGVUcmltKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVjdGFuZ2xlIGNvbXB1dGVUcmltKCkgewotCQlyZXR1cm4gR2VvbWV0cnkuYWRkKHN1cGVyLmNvbXB1dGVUcmltKCksIGZUZXh0LmNvbXB1dGVUcmltKDAsIDAsIDAsIDApKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQWJzdHJhY3RJbmZvcm1hdGlvbkNvbnRyb2wjY29tcHV0ZVRyaW0oKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZWN0YW5nbGUgY29tcHV0ZVRyaW0oKSB7CisgICAgICAgIHJldHVybiBHZW9tZXRyeS5hZGQoc3VwZXIuY29tcHV0ZVRyaW0oKSwgdGhpcy5mVGV4dC5jb21wdXRlVHJpbSgwLCAwLCAwLCAwKSk7CisgICAgfQogCi0JLyoKLQkgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBmb3JlZ3JvdW5kKSB7Ci0JCXN1cGVyLnNldEZvcmVncm91bmRDb2xvcihmb3JlZ3JvdW5kKTsKLQkJZlRleHQuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQl9CisgICAgLyoKKyAgICAgKiBAc2VlIElJbmZvcm1hdGlvbkNvbnRyb2wjc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEZvcmVncm91bmRDb2xvcihDb2xvciBmb3JlZ3JvdW5kKSB7CisgICAgICAgIHN1cGVyLnNldEZvcmVncm91bmRDb2xvcihmb3JlZ3JvdW5kKTsKKyAgICAgICAgdGhpcy5mVGV4dC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmQpOworICAgIH0KIAotCS8qCi0JICogQHNlZSBJSW5mb3JtYXRpb25Db250cm9sI3NldEJhY2tncm91bmRDb2xvcihDb2xvcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgYmFja2dyb3VuZCkgewotCQlzdXBlci5zZXRCYWNrZ3JvdW5kQ29sb3IoYmFja2dyb3VuZCk7Ci0JCWZUZXh0LnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7Ci0JfQorICAgIC8qCisgICAgICogQHNlZSBJSW5mb3JtYXRpb25Db250cm9sI3NldEJhY2tncm91bmRDb2xvcihDb2xvcikKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgYmFja2dyb3VuZCkgeworICAgICAgICBzdXBlci5zZXRCYWNrZ3JvdW5kQ29sb3IoYmFja2dyb3VuZCk7CisgICAgICAgIHRoaXMuZlRleHQuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kKTsKKyAgICB9CiAKLQkvKgotCSAqIEBzZWUgSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbiNoYXNDb250ZW50cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ29udGVudHMoKSB7Ci0JCXJldHVybiBmVGV4dC5nZXRDaGFyQ291bnQoKSA+IDA7Ci0JfQorICAgIC8qCisgICAgICogQHNlZSBJSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uI2hhc0NvbnRlbnRzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZlRleHQuZ2V0Q2hhckNvdW50KCkgPiAwOworICAgIH0KIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIjd2lkZ2V0RGlzcG9zZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQpCi0JICogQHNpbmNlIDMuMAotCSAqIEBkZXByZWNhdGVkIEFzIG9mIDMuMiwgbm8gbG9uZ2VyIHVzZWQgYW5kIGNhbGxlZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JfQorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXIjd2lkZ2V0RGlzcG9zZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQpCisgICAgICogQHNpbmNlIDMuMAorICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIDMuMiwgbm8gbG9uZ2VyIHVzZWQgYW5kIGNhbGxlZAorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7CisgICAgfQogCi0JLyoKLQkgKiBAc2Vlb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uNSMKLQkgKiBnZXRJbmZvcm1hdGlvblByZXNlbnRlckNvbnRyb2xDcmVhdG9yKCkKLQkgKiAKLQkgKiBAc2luY2UgMy40Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldEluZm9ybWF0aW9uUHJlc2VudGVyQ29udHJvbENyZWF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQkvKgotCQkJICogQHNlZW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IjCi0JCQkgKiBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JCQkgKi8KLQkJCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGNyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQpIHsKLQkJCQlyZXR1cm4gbmV3IEpGYWNlRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChwYXJlbnQsIChUb29sQmFyTWFuYWdlcikgbnVsbCwgZlByZXNlbnRlcik7Ci0JCQl9Ci0JCX07Ci0JfQorICAgIC8qCisgICAgICogQHNlZW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbjUjIGdldEluZm9ybWF0aW9uUHJlc2VudGVyQ29udHJvbENyZWF0b3IoKQorICAgICAqCisgICAgICogQHNpbmNlIDMuNAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBnZXRJbmZvcm1hdGlvblByZXNlbnRlckNvbnRyb2xDcmVhdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkgeworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQHNlZW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IjCisgICAgICAgICAgICAgKiBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGNyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpGYWNlRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChwYXJlbnQsIChUb29sQmFyTWFuYWdlcikgbnVsbCwgSkZhY2VEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sLnRoaXMuZlByZXNlbnRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvSkZhY2VJSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uNS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvZWRpdG9ycy90ZXh0L0pGYWNlSUluZm9ybWF0aW9uQ29udHJvbEV4dGVuc2lvbjUuamF2YQppbmRleCA0NzM2Mzg1Li5jZTNkY2FmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9lZGl0b3JzL3RleHQvSkZhY2VJSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uNS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2VkaXRvcnMvdGV4dC9KRmFjZUlJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb241LmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmVkaXRvcnMudGV4dDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwpAQCAtMzAsNzUgKzMxLDcyIEBACiAgKiA8cD4KICAqIDxiPkltcG9ydGFudDo8L2I+IEVucmljaGluZyB0aGlzIGluZm9ybWF0aW9uIGNvbnRyb2wgb25seSB3b3JrcyBwcm9wZXJseSBpZgogICoge0BsaW5rIElJbmZvcm1hdGlvbkNvbnRyb2wjaXNGb2N1c0NvbnRyb2woKX0gaXMgaW1wbGVtZW50ZWQgbGlrZSB0aGlzICggPGNvZGU+ZlNoZWxsPC9jb2RlPiBpcyB0aGUgY29udHJvbCdzIHNoZWxsKToKLSAqIAorICoKICAqIDxwcmU+CiAgKiByZXR1cm4gZlNoZWxsLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpID09IGZTaGVsbAogICogPC9wcmU+Ci0gKiAKKyAqCiAgKiBMaWtld2lzZSwge0BsaW5rIElJbmZvcm1hdGlvbkNvbnRyb2wjYWRkRm9jdXNMaXN0ZW5lcihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXIpfXNob3VsZCBpbnN0YWxsIGxpc3RlbmVycwogICogZm9yIHtAbGluayBTV1QjQWN0aXZhdGV9IGFuZCB7QGxpbmsgU1dUI0RlYWN0aXZhdGV9b24gdGhlIHNoZWxsIGFuZCBmb3J3YXJkIGV2ZW50cyB0byB0aGUgZm9jdXMgbGlzdGVuZXJzLiBDbGllbnRzCiAgKiBhcmUgZW5jb3VyYWdlZCB0byBzdWJjbGFzcyB7QGxpbmsgQWJzdHJhY3RJbmZvcm1hdGlvbkNvbnRyb2x9LCB3aGljaCBkb2VzIHRoaXMgZm9yIGZyZWUuCiAgKiA8L3A+Ci0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sCiAgKiBAc2luY2UgMy40CiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSkZhY2VJSW5mb3JtYXRpb25Db250cm9sRXh0ZW5zaW9uNSB7CiAKLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBjb250cm9sIGlzIHRoaXMgaW5mb3JtYXRpb24gY29udHJvbCBvciBhIGNoaWxkIG9mIHRoaXMgaW5mb3JtYXRpb24gY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqICAgICAgICAgICAgdGhlIGNvbnRyb2wgdG8gdGVzdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoZSBnaXZlbiBjb250cm9sIGlzIHRoaXMgaW5mb3JtYXRpb24gY29udHJvbCBvciBhIGNoaWxkIG9mIHRoaXMgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0NvbnRyb2woQ29udHJvbCBjb250cm9sKTsKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoZSBnaXZlbiBjb250cm9sIGlzIHRoaXMgaW5mb3JtYXRpb24gY29udHJvbCBvciBhIGNoaWxkIG9mIHRoaXMgaW5mb3JtYXRpb24gY29udHJvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250cm9sIHRoZSBjb250cm9sIHRvIHRlc3QKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgZ2l2ZW4gY29udHJvbCBpcyB0aGlzIGluZm9ybWF0aW9uIGNvbnRyb2wgb3IgYSBjaGlsZCBvZiB0aGlzIGluZm9ybWF0aW9uCisgICAgICogICAgICAgICBjb250cm9sCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNDb250cm9sKENvbnRyb2wgY29udHJvbCk7CiAKLQkvKioKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aGUgaW5mb3JtYXRpb24gY29udHJvbCBpcyBjdXJyZW50bHkgdmlzaWJsZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzVmlzaWJsZSgpOworICAgIC8qKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWZmIHRoZSBpbmZvcm1hdGlvbiBjb250cm9sIGlzIGN1cnJlbnRseSB2aXNpYmxlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNWaXNpYmxlKCk7CiAKLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgd2lkdGgtIGFuZCBoZWlnaHQgY29uc3RyYWludHMgb2YgdGhlIGluZm9ybWF0aW9uIGNvbnRyb2wgaW4gcGl4ZWxzLCBiYXNlZCBvbiB0aGUgZ2l2ZW4gd2lkdGggYW5kCi0JICogaGVpZ2h0IGluIGNoYXJhY3RlcnMuIEltcGxlbWVudG9ycyBzaG91bGQgdXNlIHRoZSBtYWluIGZvbnQgb2YgdGhlIGluZm9ybWF0aW9uIGNvbnRyb2wgdG8gZG8gdGhlCi0JICogY2hhcmFjdGVycy10by1waXhlbHMgY29udmVyc2lvbi4gVGhpcyBpcyB0eXBpY2FsbHkgdGhlIHtAbGluayBKRmFjZVJlc291cmNlcyNnZXREaWFsb2dGb250KCkgZGlhbG9nIGZvbnR9LgotCSAqIAotCSAqIEBwYXJhbSB3aWR0aEluQ2hhcnMKLQkgKiAgICAgICAgICAgIHRoZSB3aWR0aCBjb25zdHJhaW50IGluIG51bWJlciBvZiBjaGFyYWN0ZXJzCi0JICogQHBhcmFtIGhlaWdodEluQ2hhcnMKLQkgKiAgICAgICAgICAgIHRoZSBoZWlnaHQgY29uc3RyYWludCBpbiBudW1iZXIgb2YgY2hhcmFjdGVycwotCSAqIEByZXR1cm4gYSBwb2ludCB3aXRoIHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlIHN1YmplY3QgY29udHJvbCdzIGZvbnQgdG8KLQkgKiAgICAgICAgIGNhbGN1bGF0ZSB0aGUgc2l6ZQotCSAqLwotCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZUNvbnN0cmFpbnRzKGludCB3aWR0aEluQ2hhcnMsIGludCBoZWlnaHRJbkNoYXJzKTsKKyAgICAvKioKKyAgICAgKiBDb21wdXRlcyB0aGUgd2lkdGgtIGFuZCBoZWlnaHQgY29uc3RyYWludHMgb2YgdGhlIGluZm9ybWF0aW9uIGNvbnRyb2wgaW4gcGl4ZWxzLCBiYXNlZCBvbiB0aGUgZ2l2ZW4gd2lkdGggYW5kCisgICAgICogaGVpZ2h0IGluIGNoYXJhY3RlcnMuIEltcGxlbWVudG9ycyBzaG91bGQgdXNlIHRoZSBtYWluIGZvbnQgb2YgdGhlIGluZm9ybWF0aW9uIGNvbnRyb2wgdG8gZG8gdGhlCisgICAgICogY2hhcmFjdGVycy10by1waXhlbHMgY29udmVyc2lvbi4gVGhpcyBpcyB0eXBpY2FsbHkgdGhlIHtAbGluayBKRmFjZVJlc291cmNlcyNnZXREaWFsb2dGb250KCkgZGlhbG9nIGZvbnR9LgorICAgICAqCisgICAgICogQHBhcmFtIHdpZHRoSW5DaGFycyB0aGUgd2lkdGggY29uc3RyYWludCBpbiBudW1iZXIgb2YgY2hhcmFjdGVycworICAgICAqIEBwYXJhbSBoZWlnaHRJbkNoYXJzIHRoZSBoZWlnaHQgY29uc3RyYWludCBpbiBudW1iZXIgb2YgY2hhcmFjdGVycworICAgICAqIEByZXR1cm4gYSBwb2ludCB3aXRoIHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlIHN1YmplY3QgY29udHJvbCdzIGZvbnQgdG8KKyAgICAgKiAgICAgICAgIGNhbGN1bGF0ZSB0aGUgc2l6ZQorICAgICAqLworICAgIHB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZUNvbnN0cmFpbnRzKGludCB3aWR0aEluQ2hhcnMsIGludCBoZWlnaHRJbkNoYXJzKTsKIAotCS8qKgotCSAqIFJldHVybnMgdGhlIHJpY2ggaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yIGZvciB0aGlzIGluZm9ybWF0aW9uIGNvbnRyb2wuCi0JICogPHA+Ci0JICogVGhlIHJldHVybmVkIGluZm9ybWF0aW9uIGNvbnRyb2wgY3JlYXRvciBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBlbnJpY2hlZCB2ZXJzaW9uIG9mIHRoaXMgaW5mb3JtYXRpb24gY29udHJvbCwgZS5nLgotCSAqIHdoZW4gdGhlIG1vdXNlIGlzIG1vdmVkIGludG8gdGhpcyBjb250cm9sIGFuZCBpdCBuZWVkcyB0byBiZSBlbnJpY2hlZH0gb3Igd2hlbiBpdCBuZWVkcyB0byBiZSBtYWRlIHN0aWNreSBmb3IKLQkgKiBvdGhlciByZWFzb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgcmV0dXJuZWQgaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yIG11c3QgY3JlYXRlIGluZm9ybWF0aW9uIGNvbnRyb2xzIHRoYXQgaW1wbGVtZW50Ci0JICoge0BsaW5rIElJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb24zfSBhbmQge0BsaW5rIElJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb24yfSwgYW5kIHdob3NlCi0JICoge0BsaW5rIElJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb24yI3NldElucHV0KE9iamVjdCl9IGFjY2VwdHMgYWxsIGlucHV0cyB0aGF0IGFyZSBhbHNvIHN1cHBvcnRlZCBieSB0aGlzCi0JICogaW5mb3JtYXRpb24gY29udHJvbC4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZSB0aGF0IGF1dG9tYXRpYyBlbnJpY2hpbmcgb2YgdGhpcyBpbmZvcm1hdGlvbiBjb250cm9sIHdvcmtzIG9ubHkgaWYgaXQgYWxzbyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb24zfS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBmcmVxdWVudGx5LCBzbyBpbXBsZW1lbnRvcnMgc2hvdWxkIGVuc3VyZSBpdCByZXR1cm5zIHF1aWNrbHksIGUuZy4gYnkgY2FjaGluZyB0aGUKLQkgKiByZXR1cm5lZCBjcmVhdG9yLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgY29udHJvbCBjcmVhdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGRpc2FibGUgZW5yaWNoaW5nCi0JICovCi0JSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZ2V0SW5mb3JtYXRpb25QcmVzZW50ZXJDb250cm9sQ3JlYXRvcigpOworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJpY2ggaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yIGZvciB0aGlzIGluZm9ybWF0aW9uIGNvbnRyb2wuCisgICAgICogPHA+CisgICAgICogVGhlIHJldHVybmVkIGluZm9ybWF0aW9uIGNvbnRyb2wgY3JlYXRvciBpcyB1c2VkIHRvIGNyZWF0ZSBhbiBlbnJpY2hlZCB2ZXJzaW9uIG9mIHRoaXMgaW5mb3JtYXRpb24gY29udHJvbCwgZS5nLgorICAgICAqIHdoZW4gdGhlIG1vdXNlIGlzIG1vdmVkIGludG8gdGhpcyBjb250cm9sIGFuZCBpdCBuZWVkcyB0byBiZSBlbnJpY2hlZH0gb3Igd2hlbiBpdCBuZWVkcyB0byBiZSBtYWRlIHN0aWNreSBmb3IKKyAgICAgKiBvdGhlciByZWFzb25zLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmV0dXJuZWQgaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yIG11c3QgY3JlYXRlIGluZm9ybWF0aW9uIGNvbnRyb2xzIHRoYXQgaW1wbGVtZW50CisgICAgICoge0BsaW5rIElJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb24zfSBhbmQge0BsaW5rIElJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb24yfSwgYW5kIHdob3NlCisgICAgICoge0BsaW5rIElJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb24yI3NldElucHV0KE9iamVjdCl9IGFjY2VwdHMgYWxsIGlucHV0cyB0aGF0IGFyZSBhbHNvIHN1cHBvcnRlZCBieSB0aGlzCisgICAgICogaW5mb3JtYXRpb24gY29udHJvbC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IGF1dG9tYXRpYyBlbnJpY2hpbmcgb2YgdGhpcyBpbmZvcm1hdGlvbiBjb250cm9sIHdvcmtzIG9ubHkgaWYgaXQgYWxzbyBpbXBsZW1lbnRzCisgICAgICoge0BsaW5rIElJbmZvcm1hdGlvbkNvbnRyb2xFeHRlbnNpb24zfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBmcmVxdWVudGx5LCBzbyBpbXBsZW1lbnRvcnMgc2hvdWxkIGVuc3VyZSBpdCByZXR1cm5zIHF1aWNrbHksIGUuZy4gYnkgY2FjaGluZyB0aGUKKyAgICAgKiByZXR1cm5lZCBjcmVhdG9yLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGluZm9ybWF0aW9uIHByZXNlbnRlciBjb250cm9sIGNyZWF0b3Igb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gZGlzYWJsZSBlbnJpY2hpbmcKKyAgICAgKi8KKyAgICBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBnZXRJbmZvcm1hdGlvblByZXNlbnRlckNvbnRyb2xDcmVhdG9yKCk7CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2ludGVybmFsL2FjdGlvbnMvQ29udmVydFRvQnVuZGxlUHJvamVjdC5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db252ZXJ0VG9CdW5kbGVQcm9qZWN0LmphdmEKaW5kZXggYjRjYTZiNC4uMGQwNGZkNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db252ZXJ0VG9CdW5kbGVQcm9qZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db252ZXJ0VG9CdW5kbGVQcm9qZWN0LmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLmludGVybmFsLmFjdGlvbnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtMzMsODMgKzM0LDg1IEBACiAKIC8qKgogICogTWVudSBhY3Rpb24gdG8gYWRkIG9yIHJlbW92ZSB0aGUgU3ByaW5nU291cmNlIEFQIGJ1bmRsZSBwcm9qZWN0IG5hdHVyZS9mYWNldCBmcm9tIGEgZ2l2ZW4gcHJvamVjdC4KLSAqIAorICoKICAqIEBhdXRob3IgQ2hyaXN0aWFuIER1cHVpcwogICogQHNpbmNlIDEuMC4wCiAgKi8KIHB1YmxpYyBjbGFzcyBDb252ZXJ0VG9CdW5kbGVQcm9qZWN0IGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKIAotCXByaXZhdGUgZmluYWwgTGlzdDxJUHJvamVjdD4gc2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxJUHJvamVjdD4gc2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0PigpOwogCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUl0ZXJhdG9yPElQcm9qZWN0PiBpdGVyID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkpIHsKLQkJCQlyZW1vdmVGYWNldHNGcm9tUHJvamVjdChwcm9qZWN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWRkRmFjZXRzVG9Qcm9qZWN0KHByb2plY3QpOwotCQkJfQotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgeworICAgICAgICBJdGVyYXRvcjxJUHJvamVjdD4gaXRlciA9IHRoaXMuc2VsZWN0ZWQuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoRmFjZXRVdGlscy5pc0J1bmRsZVByb2plY3QocHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVGYWNldHNGcm9tUHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRkRmFjZXRzVG9Qcm9qZWN0KHByb2plY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWQuY2xlYXIoKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCQkJSXRlcmF0b3I8Pz4gaXRlciA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0JCQkJCW9iaiA9ICgoSUphdmFQcm9qZWN0KSBvYmopLmdldFByb2plY3QoKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG9iajsKLQkJCQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXNlbGVjdGVkLmFkZChwcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9CisgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKyAgICAgICAgdGhpcy5zZWxlY3RlZC5jbGVhcigpOworICAgICAgICBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBJdGVyYXRvcjw/PiBpdGVyID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgb2JqID0gKChJSmF2YVByb2plY3QpIG9iaikuZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSVByb2plY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgb2JqOworICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC5hZGQocHJvamVjdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICB9CisgICAgfQogCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCX0KKyAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7CisgICAgfQogCi0JcHJpdmF0ZSB2b2lkIGFkZEZhY2V0c1RvUHJvamVjdChmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlXb3Jrc3BhY2VSdW5uYWJsZSBvcGVyID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlJRmFjZXRlZFByb2plY3QgZlByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCwgdHJ1ZSwgbW9uaXRvcik7Ci0JCQkJZlByb2plY3QuaW5zdGFsbFByb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRmFjZXRDb3JlUGx1Z2luLkJVTkRMRV9GQUNFVF9JRCkKLQkJCQkJCS5nZXREZWZhdWx0VmVyc2lvbigpLCBudWxsLCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKKyAgICBwcml2YXRlIHZvaWQgYWRkRmFjZXRzVG9Qcm9qZWN0KGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgSVdvcmtzcGFjZVJ1bm5hYmxlIG9wZXIgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewogCi0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG9wZXIsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3QgZlByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCwgdHJ1ZSwgbW9uaXRvcik7CisgICAgICAgICAgICAgICAgZlByb2plY3QuaW5zdGFsbFByb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRmFjZXRDb3JlUGx1Z2luLkJVTkRMRV9GQUNFVF9JRCkuZ2V0RGVmYXVsdFZlcnNpb24oKSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgbW9uaXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAKLQlwcml2YXRlIHZvaWQgcmVtb3ZlRmFjZXRzRnJvbVByb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQlJV29ya3NwYWNlUnVubmFibGUgb3BlciA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QsIHRydWUsIG1vbml0b3IpOwotCQkJCWZQcm9qZWN0LnVuaW5zdGFsbFByb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRmFjZXRDb3JlUGx1Z2luLkJVTkRMRV9GQUNFVF9JRCkKLQkJCQkJCS5nZXREZWZhdWx0VmVyc2lvbigpLCBudWxsLCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ob3BlciwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgfQogCi0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG9wZXIsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlRmFjZXRzRnJvbVByb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCkgeworICAgICAgICBJV29ya3NwYWNlUnVubmFibGUgb3BlciA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3QgZlByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCwgdHJ1ZSwgbW9uaXRvcik7CisgICAgICAgICAgICAgICAgZlByb2plY3QudW5pbnN0YWxsUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChGYWNldENvcmVQbHVnaW4uQlVORExFX0ZBQ0VUX0lEKS5nZXREZWZhdWx0VmVyc2lvbigpLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBtb25pdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihvcGVyLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKyAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9pbnRlcm5hbC9hY3Rpb25zL0NvbnZlcnRUb1BsYW5Qcm9qZWN0LmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9pbnRlcm5hbC9hY3Rpb25zL0NvbnZlcnRUb1BsYW5Qcm9qZWN0LmphdmEKaW5kZXggOTJhNjIzNC4uNTZkODQ4YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db252ZXJ0VG9QbGFuUHJvamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2ludGVybmFsL2FjdGlvbnMvQ29udmVydFRvUGxhblByb2plY3QuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuaW50ZXJuYWwuYWN0aW9uczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0zMyw4MyArMzQsODQgQEAKIAogLyoqCiAgKiBNZW51IGFjdGlvbiB0byBhZGQgb3IgcmVtb3ZlIHRoZSBTcHJpbmdTb3VyY2UgUGxhbiBidW5kbGUgcHJvamVjdCBuYXR1cmUvZmFjZXQgZnJvbSBhIGdpdmVuIHByb2plY3QuCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqIEBzaW5jZSAyLjMuMQogICovCiBwdWJsaWMgY2xhc3MgQ29udmVydFRvUGxhblByb2plY3QgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewogCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PElQcm9qZWN0PiBzZWxlY3RlZCA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3Q+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PElQcm9qZWN0PiBzZWxlY3RlZCA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3Q+KCk7CiAKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJSXRlcmF0b3I8SVByb2plY3Q+IGl0ZXIgPSBzZWxlY3RlZC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChGYWNldFV0aWxzLmlzUGxhblByb2plY3QocHJvamVjdCkpIHsKLQkJCQlyZW1vdmVGYWNldHNGcm9tUHJvamVjdChwcm9qZWN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWRkRmFjZXRzVG9Qcm9qZWN0KHByb2plY3QpOwotCQkJfQotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgeworICAgICAgICBJdGVyYXRvcjxJUHJvamVjdD4gaXRlciA9IHRoaXMuc2VsZWN0ZWQuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBJUHJvamVjdCBwcm9qZWN0ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoRmFjZXRVdGlscy5pc1BsYW5Qcm9qZWN0KHByb2plY3QpKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlRmFjZXRzRnJvbVByb2plY3QocHJvamVjdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFkZEZhY2V0c1RvUHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkLmNsZWFyKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yPD8+IGl0ZXIgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCQlvYmogPSAoKElKYXZhUHJvamVjdCkgb2JqKS5nZXRQcm9qZWN0KCk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBvYmo7Ci0JCQkJCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzZWxlY3RlZC5hZGQocHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQorICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisgICAgICAgIHRoaXMuc2VsZWN0ZWQuY2xlYXIoKTsKKyAgICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7CisgICAgICAgICAgICBib29sZWFuIGVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgSXRlcmF0b3I8Pz4gaXRlciA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIG9iaiA9ICgoSUphdmFQcm9qZWN0KSBvYmopLmdldFByb2plY3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG9iajsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuYWRkKHByb2plY3QpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQl9CisgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgeworICAgIH0KIAotCXByaXZhdGUgdm9pZCBhZGRGYWNldHNUb1Byb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQlJV29ya3NwYWNlUnVubmFibGUgb3BlciA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QsIHRydWUsIG1vbml0b3IpOwotCQkJCWZQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEZhY2V0Q29yZVBsdWdpbi5QTEFOX0ZBQ0VUX0lEKQotCQkJCQkJLmdldERlZmF1bHRWZXJzaW9uKCksIG51bGwsIG1vbml0b3IpOwotCQkJfQotCQl9OworICAgIHByaXZhdGUgdm9pZCBhZGRGYWNldHNUb1Byb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCkgeworICAgICAgICBJV29ya3NwYWNlUnVubmFibGUgb3BlciA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CiAKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ob3BlciwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JfQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICAgICAgICAgIElGYWNldGVkUHJvamVjdCBmUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0LCB0cnVlLCBtb25pdG9yKTsKKyAgICAgICAgICAgICAgICBmUHJvamVjdC5pbnN0YWxsUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChGYWNldENvcmVQbHVnaW4uUExBTl9GQUNFVF9JRCkuZ2V0RGVmYXVsdFZlcnNpb24oKSwgbnVsbCwgbW9uaXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAKLQlwcml2YXRlIHZvaWQgcmVtb3ZlRmFjZXRzRnJvbVByb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQlJV29ya3NwYWNlUnVubmFibGUgb3BlciA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QsIHRydWUsIG1vbml0b3IpOwotCQkJCWZQcm9qZWN0LnVuaW5zdGFsbFByb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRmFjZXRDb3JlUGx1Z2luLlBMQU5fRkFDRVRfSUQpCi0JCQkJCQkuZ2V0RGVmYXVsdFZlcnNpb24oKSwgbnVsbCwgbW9uaXRvcik7Ci0JCQl9Ci0JCX07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG9wZXIsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIAotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihvcGVyLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9CisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUZhY2V0c0Zyb21Qcm9qZWN0KGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgSVdvcmtzcGFjZVJ1bm5hYmxlIG9wZXIgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QsIHRydWUsIG1vbml0b3IpOworICAgICAgICAgICAgICAgIGZQcm9qZWN0LnVuaW5zdGFsbFByb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRmFjZXRDb3JlUGx1Z2luLlBMQU5fRkFDRVRfSUQpLmdldERlZmF1bHRWZXJzaW9uKCksIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG1vbml0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG9wZXIsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2ludGVybmFsL2FjdGlvbnMvTWFuaWZlc3RGb3JtYXRBY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2ludGVybmFsL2FjdGlvbnMvTWFuaWZlc3RGb3JtYXRBY3Rpb24uamF2YQppbmRleCAxYjg0OTczLi45ZDE3ZGUxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9pbnRlcm5hbC9hY3Rpb25zL01hbmlmZXN0Rm9ybWF0QWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvaW50ZXJuYWwvYWN0aW9ucy9NYW5pZmVzdEZvcm1hdEFjdGlvbi5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS5pbnRlcm5hbC5hY3Rpb25zOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKQEAgLTIyLDIxICsyMywyMCBAQAogICovCiBwdWJsaWMgY2xhc3MgTWFuaWZlc3RGb3JtYXRBY3Rpb24gZXh0ZW5kcyBGb3JtYXRBY3Rpb24gewogCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZlRleHRFZGl0b3IgPT0gbnVsbCB8fCBmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgaWYgKHRoaXMuZlRleHRFZGl0b3IgPT0gbnVsbCB8fCB0aGlzLmZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJdHJ5IHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldFByb2dyZXNzU2VydmljZSgpCi0JCQkJCS5idXN5Q3Vyc29yV2hpbGUobmV3IE1hbmlmZXN0Rm9ybWF0T3BlcmF0aW9uKG5ldyBPYmplY3RbXSB7IGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkgfSkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVBERVBsdWdpbi5sb2coZSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCVBERVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpLmJ1c3lDdXJzb3JXaGlsZSgKKyAgICAgICAgICAgICAgICBuZXcgTWFuaWZlc3RGb3JtYXRPcGVyYXRpb24obmV3IE9iamVjdFtdIHsgdGhpcy5mVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpIH0pKTsKKyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBQREVQbHVnaW4ubG9nKGUpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBQREVQbHVnaW4ubG9nKGUpOworICAgICAgICB9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9pbnRlcm5hbC9hY3Rpb25zL01hbmlmZXN0Rm9ybWF0T3BlcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS9pbnRlcm5hbC9hY3Rpb25zL01hbmlmZXN0Rm9ybWF0T3BlcmF0aW9uLmphdmEKaW5kZXggNTJiY2JlMy4uZDZhM2VjZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvaW50ZXJuYWwvYWN0aW9ucy9NYW5pZmVzdEZvcm1hdE9wZXJhdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL2ludGVybmFsL2FjdGlvbnMvTWFuaWZlc3RGb3JtYXRPcGVyYXRpb24uamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkuaW50ZXJuYWwuYWN0aW9uczsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CkBAIC0zOCw2NCArMzksNjQgQEAKICAqLwogcHVibGljIGNsYXNzIE1hbmlmZXN0Rm9ybWF0T3BlcmF0aW9uIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKIAotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gZk9iamVjdHM7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBmT2JqZWN0czsKIAotCXB1YmxpYyBNYW5pZmVzdEZvcm1hdE9wZXJhdGlvbihPYmplY3RbXSBvYmplY3RzKSB7Ci0JCWZPYmplY3RzID0gb2JqZWN0czsKLQl9CisgICAgcHVibGljIE1hbmlmZXN0Rm9ybWF0T3BlcmF0aW9uKE9iamVjdFtdIG9iamVjdHMpIHsKKyAgICAgICAgdGhpcy5mT2JqZWN0cyA9IG9iamVjdHM7CisgICAgfQogCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQltb24uYmVnaW5UYXNrKFBERVVJTWVzc2FnZXMuRm9ybWF0TWFuaWZlc3RPcGVyYXRpb25fdGFzaywgZk9iamVjdHMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7ICFtb24uaXNDYW5jZWxlZCgpICYmIGkgPCBmT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGZPYmplY3RzW2ldOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQlvYmogPSAoKElGaWxlRWRpdG9ySW5wdXQpIG9iaikuZ2V0RmlsZSgpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJbW9uLnN1YlRhc2soTkxTLmJpbmQoUERFVUlNZXNzYWdlcy5Gb3JtYXRNYW5pZmVzdE9wZXJhdGlvbl9zdWJ0YXNrLCAoKElGaWxlKSBvYmopLmdldEZ1bGxQYXRoKCkKLQkJCQkJCS50b1N0cmluZygpKSk7Ci0JCQkJZm9ybWF0KChJRmlsZSkgb2JqLCBtb24pOwotCQkJfQotCQkJbW9uLndvcmtlZCgxKTsKLQkJfQotCX0KKyAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb24pIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIG1vbi5iZWdpblRhc2soUERFVUlNZXNzYWdlcy5Gb3JtYXRNYW5pZmVzdE9wZXJhdGlvbl90YXNrLCB0aGlzLmZPYmplY3RzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyAhbW9uLmlzQ2FuY2VsZWQoKSAmJiBpIDwgdGhpcy5mT2JqZWN0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHRoaXMuZk9iamVjdHNbaV07CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgeworICAgICAgICAgICAgICAgIG9iaiA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgb2JqKS5nZXRGaWxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgSUZpbGUpIHsKKyAgICAgICAgICAgICAgICBtb24uc3ViVGFzayhOTFMuYmluZChQREVVSU1lc3NhZ2VzLkZvcm1hdE1hbmlmZXN0T3BlcmF0aW9uX3N1YnRhc2ssICgoSUZpbGUpIG9iaikuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgZm9ybWF0KChJRmlsZSkgb2JqLCBtb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW9uLndvcmtlZCgxKTsKKyAgICAgICAgfQorICAgIH0KIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBmb3JtYXQoSUZpbGUgZmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb24pIHsKLQkJQnVuZGxlTW9kZWxVdGlsaXR5Lm1vZGlmeU1vZGVsKG5ldyBCdW5kbGVNb2RlbE1vZGlmaWNhdGlvbihmaWxlKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIG1vZGlmeU1vZGVsKElCYXNlTW9kZWwgbW9kZWwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElCdW5kbGVQbHVnaW5Nb2RlbEJhc2UpIHsKLQkJCQkJSUJ1bmRsZU1vZGVsIGJ1bmRsZU1vZGVsID0gKChJQnVuZGxlUGx1Z2luTW9kZWxCYXNlKSBtb2RlbCkuZ2V0QnVuZGxlTW9kZWwoKTsKLQkJCQkJaWYgKGJ1bmRsZU1vZGVsLmdldEJ1bmRsZSgpIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0JCQkJCQlmb3JtYXRCdW5kbGUoKEJ1bmRsZSkgYnVuZGxlTW9kZWwuZ2V0QnVuZGxlKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElQbHVnaW5Nb2RlbEJhc2UpIHsKLQkJCQkJSVBsdWdpbkJhc2UgcGx1Z2luTW9kZWwgPSAoKElQbHVnaW5Nb2RlbEJhc2UpIG1vZGVsKS5nZXRQbHVnaW5CYXNlKCk7Ci0JCQkJCWlmIChwbHVnaW5Nb2RlbCBpbnN0YW5jZW9mIFBsdWdpbkJhc2VOb2RlKSB7Ci0JCQkJCQlmb3JtYXRYTUwoKFBsdWdpbkJhc2VOb2RlKSBwbHVnaW5Nb2RlbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGZvcm1hdChJRmlsZSBmaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbikgeworICAgICAgICBCdW5kbGVNb2RlbFV0aWxpdHkubW9kaWZ5TW9kZWwobmV3IEJ1bmRsZU1vZGVsTW9kaWZpY2F0aW9uKGZpbGUpIHsKIAotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBzYXZlT3BlbkVkaXRvcigpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0sIG1vbik7Ci0JfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBtb2RpZnlNb2RlbChJQmFzZU1vZGVsIG1vZGVsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAobW9kZWwgaW5zdGFuY2VvZiBJQnVuZGxlUGx1Z2luTW9kZWxCYXNlKSB7CisgICAgICAgICAgICAgICAgICAgIElCdW5kbGVNb2RlbCBidW5kbGVNb2RlbCA9ICgoSUJ1bmRsZVBsdWdpbk1vZGVsQmFzZSkgbW9kZWwpLmdldEJ1bmRsZU1vZGVsKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGVNb2RlbC5nZXRCdW5kbGUoKSBpbnN0YW5jZW9mIEJ1bmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0QnVuZGxlKChCdW5kbGUpIGJ1bmRsZU1vZGVsLmdldEJ1bmRsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBJUGx1Z2luTW9kZWxCYXNlKSB7CisgICAgICAgICAgICAgICAgICAgIElQbHVnaW5CYXNlIHBsdWdpbk1vZGVsID0gKChJUGx1Z2luTW9kZWxCYXNlKSBtb2RlbCkuZ2V0UGx1Z2luQmFzZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocGx1Z2luTW9kZWwgaW5zdGFuY2VvZiBQbHVnaW5CYXNlTm9kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0WE1MKChQbHVnaW5CYXNlTm9kZSkgcGx1Z2luTW9kZWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb3JtYXRCdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotCQlJdGVyYXRvciBoZWFkZXJzID0gYnVuZGxlLmdldEhlYWRlcnMoKS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaGVhZGVycy5oYXNOZXh0KCkpIHsKLQkJCSgoSU1hbmlmZXN0SGVhZGVyKSBoZWFkZXJzLm5leHQoKSkudXBkYXRlKHRydWUpOwotCQl9Ci0JCUJ1bmRsZU1vZGVsIG1vZGVsID0gKEJ1bmRsZU1vZGVsKSBidW5kbGUuZ2V0TW9kZWwoKTsKLQkJbW9kZWwuYWRqdXN0T2Zmc2V0cyhtb2RlbC5nZXREb2N1bWVudCgpKTsKLQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHNhdmVPcGVuRWRpdG9yKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgbW9uKTsKKyAgICB9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdFhNTChQbHVnaW5CYXNlTm9kZSBub2RlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIEl0ZXJhdG9yIGhlYWRlcnMgPSBidW5kbGUuZ2V0SGVhZGVycygpLnZhbHVlcygpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChoZWFkZXJzLmhhc05leHQoKSkgeworICAgICAgICAgICAgKChJTWFuaWZlc3RIZWFkZXIpIGhlYWRlcnMubmV4dCgpKS51cGRhdGUodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgQnVuZGxlTW9kZWwgbW9kZWwgPSAoQnVuZGxlTW9kZWwpIGJ1bmRsZS5nZXRNb2RlbCgpOworICAgICAgICBtb2RlbC5hZGp1c3RPZmZzZXRzKG1vZGVsLmdldERvY3VtZW50KCkpOworICAgIH0KIAotCX0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdFhNTChQbHVnaW5CYXNlTm9kZSBub2RlKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworICAgIH0KIAogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvQWJzdHJhY3RQcm9wZXJ0aWVzUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9BYnN0cmFjdFByb3BlcnRpZXNQYWdlLmphdmEKaW5kZXggNmQ2MDhlMi4uZTUwNDVhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9BYnN0cmFjdFByb3BlcnRpZXNQYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9BYnN0cmFjdFByb3BlcnRpZXNQYWdlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLndpemFyZHM7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMjMsMzcgKzI0LDM2IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BlcnRpZXNQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7CiAKLQlwdWJsaWMgQWJzdHJhY3RQcm9wZXJ0aWVzUGFnZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJc2V0VGl0bGUoIkJ1bmRsZSBQcm9wZXJ0aWVzIik7Ci0JCXNldERlc2NyaXB0aW9uKCJTZXQgdGhlIGFkZGl0aW9uYWwgcHJvcGVydGllcyBvZiB0aGUgYnVuZGxlLiAiCi0JCQkJKyAiWW91IGNhbiBtb2RpZnkgdGhlIHByb3BlcnRpZXMgYXQgYW55IHRpbWUgaW4gdGhlIE1BTklGRVNULk1GIGZpbGUuIik7Ci0JfQorICAgIHB1YmxpYyBBYnN0cmFjdFByb3BlcnRpZXNQYWdlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgICAgICBzZXRUaXRsZSgiQnVuZGxlIFByb3BlcnRpZXMiKTsKKyAgICAgICAgc2V0RGVzY3JpcHRpb24oIlNldCB0aGUgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIG9mIHRoZSBidW5kbGUuICIgKyAiWW91IGNhbiBtb2RpZnkgdGhlIHByb3BlcnRpZXMgYXQgYW55IHRpbWUgaW4gdGhlIE1BTklGRVNULk1GIGZpbGUuIik7CisgICAgfQogCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgeworICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKyAgICAgICAgY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKIAotCQljcmVhdGVQcm9wZXJ0aWVzR3JvdXAoY29udGFpbmVyKTsKLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCX0KKyAgICAgICAgY3JlYXRlUHJvcGVydGllc0dyb3VwKGNvbnRhaW5lcik7CisgICAgICAgIHNldENvbnRyb2woY29udGFpbmVyKTsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVQcm9wZXJ0aWVzR3JvdXAoQ29tcG9zaXRlIGNvbnRhaW5lcik7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY3JlYXRlUHJvcGVydGllc0dyb3VwKENvbXBvc2l0ZSBjb250YWluZXIpOwogCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRNb2R1bGVUeXBlKCk7CisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRNb2R1bGVUeXBlKCk7CiAKLQlwdWJsaWMgYWJzdHJhY3QgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQcm9wZXJ0aWVzKCk7CisgICAgcHVibGljIGFic3RyYWN0IE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydGllcygpOwogCi0JQE92ZXJyaWRlCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlOZXdCdW5kbGVQcm9qZWN0V2l6YXJkIHdpemFyZCA9IChOZXdCdW5kbGVQcm9qZWN0V2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJcmV0dXJuIHdpemFyZC5nZXRGaW5hbFBhZ2UoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgeworICAgICAgICBOZXdCdW5kbGVQcm9qZWN0V2l6YXJkIHdpemFyZCA9IChOZXdCdW5kbGVQcm9qZWN0V2l6YXJkKSBnZXRXaXphcmQoKTsKKyAgICAgICAgcmV0dXJuIHdpemFyZC5nZXRGaW5hbFBhZ2UoKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UHJldmlvdXNQYWdlKCkgewotCQlOZXdCdW5kbGVQcm9qZWN0V2l6YXJkIHdpemFyZCA9IChOZXdCdW5kbGVQcm9qZWN0V2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJcmV0dXJuIHdpemFyZC5nZXRJbmZvcm1hdGlvblBhZ2UoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZSgpIHsKKyAgICAgICAgTmV3QnVuZGxlUHJvamVjdFdpemFyZCB3aXphcmQgPSAoTmV3QnVuZGxlUHJvamVjdFdpemFyZCkgZ2V0V2l6YXJkKCk7CisgICAgICAgIHJldHVybiB3aXphcmQuZ2V0SW5mb3JtYXRpb25QYWdlKCk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld0J1bmRsZUluZm9ybWF0aW9uUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9OZXdCdW5kbGVJbmZvcm1hdGlvblBhZ2UuamF2YQppbmRleCA1MWY0YzRiLi5lMzBhOWRkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld0J1bmRsZUluZm9ybWF0aW9uUGFnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3QnVuZGxlSW5mb3JtYXRpb25QYWdlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLndpemFyZHM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKQEAgLTM0LDE0MSArMzUsMTQwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBOZXdCdW5kbGVJbmZvcm1hdGlvblBhZ2UgZXh0ZW5kcyBSdW50aW1lQ29uZmlndXJhdGlvblBhZ2UgewogCi0JcHJpdmF0ZSBCdXR0b24gbW9kdWxlVHlwZTsKKyAgICBwcml2YXRlIEJ1dHRvbiBtb2R1bGVUeXBlOwogCi0JcHJpdmF0ZSBCdXR0b24gZW5hYmxlQ2xhc3NwYXRoQ29udGFpbmVyOworICAgIHByaXZhdGUgQnV0dG9uIGVuYWJsZUNsYXNzcGF0aENvbnRhaW5lcjsKIAotCXByaXZhdGUgZmluYWwgSURhdGFNb2RlbCBtb2RlbDsKKyAgICBwcml2YXRlIGZpbmFsIElEYXRhTW9kZWwgbW9kZWw7CiAKLQlwcml2YXRlIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIG1vZHVsZVR5cGVMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKKyAgICBwcml2YXRlIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIG1vZHVsZVR5cGVMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKIAotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlOZXdCdW5kbGVQcm9qZWN0V2l6YXJkIHdpemFyZCA9IChOZXdCdW5kbGVQcm9qZWN0V2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJCUFic3RyYWN0UHJvcGVydGllc1BhZ2UgcGFnZTsKLQkJCWlmICghbW9kdWxlVHlwZS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXBhZ2UgPSAoQWJzdHJhY3RQcm9wZXJ0aWVzUGFnZSkgd2l6YXJkLmdldFBhZ2UoTnVsbFByb3BlcnRpZXNQYWdlLklEX1BBR0UpOwotCQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQkJd2l6YXJkLnNldFByb3BlcnRpZXNQYWdlKHBhZ2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXdpemFyZC5zZXRQcm9wZXJ0aWVzUGFnZShuZXcgTnVsbFByb3BlcnRpZXNQYWdlKCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcGFnZSA9IChBYnN0cmFjdFByb3BlcnRpZXNQYWdlKSB3aXphcmQuZ2V0UGFnZShXZWJNb2R1bGVQcm9wZXJ0aWVzUGFnZS5JRF9QQUdFKTsKLQkJCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJCXdpemFyZC5zZXRQcm9wZXJ0aWVzUGFnZShwYWdlKTsKLQkJCQl9IGVsc2UgewotCQkJCQl3aXphcmQuc2V0UHJvcGVydGllc1BhZ2UobmV3IFdlYk1vZHVsZVByb3BlcnRpZXNQYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJCXZhbGlkYXRlUGFnZSgpOwotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKyAgICAgICAgICAgIE5ld0J1bmRsZVByb2plY3RXaXphcmQgd2l6YXJkID0gKE5ld0J1bmRsZVByb2plY3RXaXphcmQpIGdldFdpemFyZCgpOworICAgICAgICAgICAgQWJzdHJhY3RQcm9wZXJ0aWVzUGFnZSBwYWdlOworICAgICAgICAgICAgaWYgKCFOZXdCdW5kbGVJbmZvcm1hdGlvblBhZ2UudGhpcy5tb2R1bGVUeXBlLmdldFNlbGVjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgcGFnZSA9IChBYnN0cmFjdFByb3BlcnRpZXNQYWdlKSB3aXphcmQuZ2V0UGFnZShOdWxsUHJvcGVydGllc1BhZ2UuSURfUEFHRSk7CisgICAgICAgICAgICAgICAgaWYgKHBhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB3aXphcmQuc2V0UHJvcGVydGllc1BhZ2UocGFnZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd2l6YXJkLnNldFByb3BlcnRpZXNQYWdlKG5ldyBOdWxsUHJvcGVydGllc1BhZ2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYWdlID0gKEFic3RyYWN0UHJvcGVydGllc1BhZ2UpIHdpemFyZC5nZXRQYWdlKFdlYk1vZHVsZVByb3BlcnRpZXNQYWdlLklEX1BBR0UpOworICAgICAgICAgICAgICAgIGlmIChwYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgd2l6YXJkLnNldFByb3BlcnRpZXNQYWdlKHBhZ2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdpemFyZC5zZXRQcm9wZXJ0aWVzUGFnZShuZXcgV2ViTW9kdWxlUHJvcGVydGllc1BhZ2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsaWRhdGVQYWdlKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQl9CisgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgIH0KIAotCX07CisgICAgfTsKIAotCXByb3RlY3RlZCBOZXdCdW5kbGVJbmZvcm1hdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBJUHJvamVjdFByb3ZpZGVyIHByb3ZpZGVyLCBBYnN0cmFjdEZpZWxkRGF0YSBkYXRhLAotCQkJSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihwYWdlTmFtZSwgcHJvdmlkZXIsIGRhdGEsIG1vZGVsKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KKyAgICBwcm90ZWN0ZWQgTmV3QnVuZGxlSW5mb3JtYXRpb25QYWdlKFN0cmluZyBwYWdlTmFtZSwgSVByb2plY3RQcm92aWRlciBwcm92aWRlciwgQWJzdHJhY3RGaWVsZERhdGEgZGF0YSwgSURhdGFNb2RlbCBtb2RlbCkgeworICAgICAgICBzdXBlcihwYWdlTmFtZSwgcHJvdmlkZXIsIGRhdGEsIG1vZGVsKTsKKyAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxQcm9wZXJ0aWVzR3JvdXAoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcm91cCBwcm9wZXJ0aWVzR3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCXByb3BlcnRpZXNHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcHJvcGVydGllc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwcm9wZXJ0aWVzR3JvdXAuc2V0VGV4dCgiQWRkaXRpb25hbCBQcm9wZXJ0aWVzIik7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWRkaXRpb25hbFByb3BlcnRpZXNHcm91cChDb21wb3NpdGUgY29udGFpbmVyKSB7CisgICAgICAgIEdyb3VwIHByb3BlcnRpZXNHcm91cCA9IG5ldyBHcm91cChjb250YWluZXIsIFNXVC5OT05FKTsKKyAgICAgICAgcHJvcGVydGllc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOworICAgICAgICBwcm9wZXJ0aWVzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisgICAgICAgIHByb3BlcnRpZXNHcm91cC5zZXRUZXh0KCJBZGRpdGlvbmFsIFByb3BlcnRpZXMiKTsKIAotCQltb2R1bGVUeXBlID0gbmV3IEJ1dHRvbihwcm9wZXJ0aWVzR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1vZHVsZVR5cGUuc2V0VGV4dCgiV2ViIEFwcGxpY2F0aW9uIEJ1bmRsZSIpOwotCQltb2R1bGVUeXBlLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCW1vZHVsZVR5cGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobW9kdWxlVHlwZUxpc3RlbmVyKTsKKyAgICAgICAgdGhpcy5tb2R1bGVUeXBlID0gbmV3IEJ1dHRvbihwcm9wZXJ0aWVzR3JvdXAsIFNXVC5DSEVDSyk7CisgICAgICAgIHRoaXMubW9kdWxlVHlwZS5zZXRUZXh0KCJXZWIgQXBwbGljYXRpb24gQnVuZGxlIik7CisgICAgICAgIHRoaXMubW9kdWxlVHlwZS5zZXRTZWxlY3Rpb24oZmFsc2UpOworICAgICAgICB0aGlzLm1vZHVsZVR5cGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5tb2R1bGVUeXBlTGlzdGVuZXIpOwogCi0JCUdyb3VwIGNsYXNzcGF0aEdyb3VwID0gbmV3IEdyb3VwKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQljbGFzc3BhdGhHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJY2xhc3NwYXRoR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNsYXNzcGF0aEdyb3VwLnNldFRleHQoIkNsYXNzcGF0aCBNYW5hZ2VtZW50Iik7CisgICAgICAgIEdyb3VwIGNsYXNzcGF0aEdyb3VwID0gbmV3IEdyb3VwKGNvbnRhaW5lciwgU1dULk5PTkUpOworICAgICAgICBjbGFzc3BhdGhHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKKyAgICAgICAgY2xhc3NwYXRoR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisgICAgICAgIGNsYXNzcGF0aEdyb3VwLnNldFRleHQoIkNsYXNzcGF0aCBNYW5hZ2VtZW50Iik7CiAKLQkJZW5hYmxlQ2xhc3NwYXRoQ29udGFpbmVyID0gbmV3IEJ1dHRvbihjbGFzc3BhdGhHcm91cCwgU1dULkNIRUNLKTsKLQkJZW5hYmxlQ2xhc3NwYXRoQ29udGFpbmVyLnNldFRleHQoIkVuYWJsZSBCdW5kbGUgQ2xhc3NwYXRoIENvbnRhaW5lciIpOwotCQllbmFibGVDbGFzc3BhdGhDb250YWluZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KKyAgICAgICAgdGhpcy5lbmFibGVDbGFzc3BhdGhDb250YWluZXIgPSBuZXcgQnV0dG9uKGNsYXNzcGF0aEdyb3VwLCBTV1QuQ0hFQ0spOworICAgICAgICB0aGlzLmVuYWJsZUNsYXNzcGF0aENvbnRhaW5lci5zZXRUZXh0KCJFbmFibGUgQnVuZGxlIENsYXNzcGF0aCBDb250YWluZXIiKTsKKyAgICAgICAgdGhpcy5lbmFibGVDbGFzc3BhdGhDb250YWluZXIuc2V0U2VsZWN0aW9uKHRydWUpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIFByb2plY3RDb250ZW50UGFnZVN0cmluZ3MuQnVuZGxlX0NvbnRlbnRQYWdlX2Rlc2M7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VEZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIFByb2plY3RDb250ZW50UGFnZVN0cmluZ3MuQnVuZGxlX0NvbnRlbnRQYWdlX2Rlc2M7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50UGFnZUdyb3VwTGFiZWwoKSB7Ci0JCXJldHVybiBQcm9qZWN0Q29udGVudFBhZ2VTdHJpbmdzLkJ1bmRsZV9Db250ZW50UGFnZV9wR3JvdXA7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VHcm91cExhYmVsKCkgeworICAgICAgICByZXR1cm4gUHJvamVjdENvbnRlbnRQYWdlU3RyaW5ncy5CdW5kbGVfQ29udGVudFBhZ2VfcEdyb3VwOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VJZExhYmVsKCkgewotCQlyZXR1cm4gUHJvamVjdENvbnRlbnRQYWdlU3RyaW5ncy5CdW5kbGVfQ29udGVudFBhZ2VfcGlkOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRQYWdlSWRMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIFByb2plY3RDb250ZW50UGFnZVN0cmluZ3MuQnVuZGxlX0NvbnRlbnRQYWdlX3BpZDsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRQYWdlTmFtZUxhYmVsKCkgewotCQlyZXR1cm4gUHJvamVjdENvbnRlbnRQYWdlU3RyaW5ncy5CdW5kbGVfQ29udGVudFBhZ2VfcG5hbWU7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VOYW1lTGFiZWwoKSB7CisgICAgICAgIHJldHVybiBQcm9qZWN0Q29udGVudFBhZ2VTdHJpbmdzLkJ1bmRsZV9Db250ZW50UGFnZV9wbmFtZTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRQYWdlUGx1Z2luTGFiZWwoKSB7Ci0JCXJldHVybiBQcm9qZWN0Q29udGVudFBhZ2VTdHJpbmdzLkJ1bmRsZV9Db250ZW50UGFnZV9wbHVnaW47Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VQbHVnaW5MYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIFByb2plY3RDb250ZW50UGFnZVN0cmluZ3MuQnVuZGxlX0NvbnRlbnRQYWdlX3BsdWdpbjsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRQYWdlUHJvdmlkZXJMYWJlbCgpIHsKLQkJcmV0dXJuIFByb2plY3RDb250ZW50UGFnZVN0cmluZ3MuQnVuZGxlX0NvbnRlbnRQYWdlX3Bwcm92aWRlcjsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50UGFnZVByb3ZpZGVyTGFiZWwoKSB7CisgICAgICAgIHJldHVybiBQcm9qZWN0Q29udGVudFBhZ2VTdHJpbmdzLkJ1bmRsZV9Db250ZW50UGFnZV9wcHJvdmlkZXI7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50UGFnZVRpdGxlKCkgewotCQlyZXR1cm4gUHJvamVjdENvbnRlbnRQYWdlU3RyaW5ncy5CdW5kbGVfQ29udGVudFBhZ2VfdGl0bGU7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIFByb2plY3RDb250ZW50UGFnZVN0cmluZ3MuQnVuZGxlX0NvbnRlbnRQYWdlX3RpdGxlOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VWZXJzaW9uTGFiZWwoKSB7Ci0JCXJldHVybiBQcm9qZWN0Q29udGVudFBhZ2VTdHJpbmdzLkJ1bmRsZV9Db250ZW50UGFnZV9wdmVyc2lvbjsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50UGFnZVZlcnNpb25MYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIFByb2plY3RDb250ZW50UGFnZVN0cmluZ3MuQnVuZGxlX0NvbnRlbnRQYWdlX3B2ZXJzaW9uOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0JCXJldHVybiBTZXJ2ZXJJZGVVaVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKKyAgICAgICAgcmV0dXJuIFNlcnZlcklkZVVpUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlVHlwZUlEKCkgewotCQlyZXR1cm4gRmFjZXRDb3JlUGx1Z2luLkJVTkRMRV9GQUNFVF9JRDsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVUeXBlSUQoKSB7CisgICAgICAgIHJldHVybiBGYWNldENvcmVQbHVnaW4uQlVORExFX0ZBQ0VUX0lEOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZSgpIHsKLQkJc3VwZXIudmFsaWRhdGVQYWdlKCk7Ci0JCWlmIChpc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQkvLyB2YWxpZGF0ZSB0aGUgYWRkaXRpb25hbCBwcm9wZXJ0aWVzCi0JCX0KLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKCkgeworICAgICAgICBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKKyAgICAgICAgaWYgKGlzUGFnZUNvbXBsZXRlKCkpIHsKKyAgICAgICAgICAgIC8vIHZhbGlkYXRlIHRoZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMKKyAgICAgICAgfQorICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJTmV3QnVuZGxlUHJvamVjdFdpemFyZCB3aXphcmQgPSAoTmV3QnVuZGxlUHJvamVjdFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCWlmICh3aXphcmQuZ2V0UHJvcGVydGllc1BhZ2UoKSBpbnN0YW5jZW9mIE51bGxQcm9wZXJ0aWVzUGFnZSkgewotCQkJcmV0dXJuIHdpemFyZC5nZXRGaW5hbFBhZ2UoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB3aXphcmQuZ2V0UHJvcGVydGllc1BhZ2UoKTsKLQkJfQotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7CisgICAgICAgIE5ld0J1bmRsZVByb2plY3RXaXphcmQgd2l6YXJkID0gKE5ld0J1bmRsZVByb2plY3RXaXphcmQpIGdldFdpemFyZCgpOworICAgICAgICBpZiAod2l6YXJkLmdldFByb3BlcnRpZXNQYWdlKCkgaW5zdGFuY2VvZiBOdWxsUHJvcGVydGllc1BhZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiB3aXphcmQuZ2V0RmluYWxQYWdlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gd2l6YXJkLmdldFByb3BlcnRpZXNQYWdlKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwZXJmb3JtUGFnZUZpbmlzaCgpIHsKLQkJc3VwZXIucGVyZm9ybVBhZ2VGaW5pc2goKTsKLQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEJ1bmRsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLkVOQUJMRV9TRVJWRVJfQ0xBU1NQQVRIX0NPTlRBSU5FUiwKLQkJCQllbmFibGVDbGFzc3BhdGhDb250YWluZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQltb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoQnVuZGxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuRU5BQkxFX1dFQl9CVU5ETEUsIG1vZHVsZVR5cGUuZ2V0U2VsZWN0aW9uKCkpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwZXJmb3JtUGFnZUZpbmlzaCgpIHsKKyAgICAgICAgc3VwZXIucGVyZm9ybVBhZ2VGaW5pc2goKTsKKyAgICAgICAgdGhpcy5tb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoQnVuZGxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuRU5BQkxFX1NFUlZFUl9DTEFTU1BBVEhfQ09OVEFJTkVSLAorICAgICAgICAgICAgdGhpcy5lbmFibGVDbGFzc3BhdGhDb250YWluZXIuZ2V0U2VsZWN0aW9uKCkpOworICAgICAgICB0aGlzLm1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShCdW5kbGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5FTkFCTEVfV0VCX0JVTkRMRSwgdGhpcy5tb2R1bGVUeXBlLmdldFNlbGVjdGlvbigpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld0J1bmRsZVByb2plY3RDcmVhdGlvblBhZ2UuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3QnVuZGxlUHJvamVjdENyZWF0aW9uUGFnZS5qYXZhCmluZGV4IDgxOGIyY2YuLjdlOGQ3YTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3QnVuZGxlUHJvamVjdENyZWF0aW9uUGFnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3QnVuZGxlUHJvamVjdENyZWF0aW9uUGFnZS5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS53aXphcmRzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3SmF2YVByb2plY3RXaXphcmRQYWdlT25lOwpAQCAtMjAsMjMgKzIxLDIzIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBOZXdCdW5kbGVQcm9qZWN0Q3JlYXRpb25QYWdlIGV4dGVuZHMgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvIHsKIAotCXB1YmxpYyBOZXdCdW5kbGVQcm9qZWN0Q3JlYXRpb25QYWdlKE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZSBtYWluUGFnZSkgewotCQlzdXBlcihtYWluUGFnZSk7Ci0JfQorICAgIHB1YmxpYyBOZXdCdW5kbGVQcm9qZWN0Q3JlYXRpb25QYWdlKE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZU9uZSBtYWluUGFnZSkgeworICAgICAgICBzdXBlcihtYWluUGFnZSk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElXaXphcmRQYWdlIGdldFByZXZpb3VzUGFnZSgpIHsKLQkJTmV3QnVuZGxlUHJvamVjdFdpemFyZCB3aXphcmQgPSAoTmV3QnVuZGxlUHJvamVjdFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCWlmICh3aXphcmQuZ2V0UHJvcGVydGllc1BhZ2UoKSBpbnN0YW5jZW9mIE51bGxQcm9wZXJ0aWVzUGFnZSkgewotCQkJcmV0dXJuIHdpemFyZC5nZXRJbmZvcm1hdGlvblBhZ2UoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiB3aXphcmQuZ2V0UHJvcGVydGllc1BhZ2UoKTsKLQkJfQotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0UHJldmlvdXNQYWdlKCkgeworICAgICAgICBOZXdCdW5kbGVQcm9qZWN0V2l6YXJkIHdpemFyZCA9IChOZXdCdW5kbGVQcm9qZWN0V2l6YXJkKSBnZXRXaXphcmQoKTsKKyAgICAgICAgaWYgKHdpemFyZC5nZXRQcm9wZXJ0aWVzUGFnZSgpIGluc3RhbmNlb2YgTnVsbFByb3BlcnRpZXNQYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gd2l6YXJkLmdldEluZm9ybWF0aW9uUGFnZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHdpemFyZC5nZXRQcm9wZXJ0aWVzUGFnZSgpOworICAgICAgICB9CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3QnVuZGxlUHJvamVjdFNldHRpbmdzUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9OZXdCdW5kbGVQcm9qZWN0U2V0dGluZ3NQYWdlLmphdmEKaW5kZXggNzk4OTFkOC4uNDJmMDRjNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9OZXdCdW5kbGVQcm9qZWN0U2V0dGluZ3NQYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9OZXdCdW5kbGVQcm9qZWN0U2V0dGluZ3NQYWdlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLndpemFyZHM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmU7CkBAIC0xOCwxNCArMTksMTQgQEAKICAqLwogcHVibGljIGNsYXNzIE5ld0J1bmRsZVByb2plY3RTZXR0aW5nc1BhZ2UgZXh0ZW5kcyBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmUgewogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5FV19QUk9KRUNUX1NFVFRJTkdTX1RJVExFID0gIkNyZWF0ZSBhIEJ1bmRsZSBwcm9qZWN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTkVXX1BST0pFQ1RfU0VUVElOR1NfVElUTEUgPSAiQ3JlYXRlIGEgQnVuZGxlIHByb2plY3QiOwogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5FV19QUk9KRUNUX1NFVFRJTkdTX0RFU0NSSVBUSU9OID0gIkNyZWF0ZSBhIEJ1bmRsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2Ugb3IgaW4gYW4gZXh0ZXJuYWwgbG9jYXRpb24uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTkVXX1BST0pFQ1RfU0VUVElOR1NfREVTQ1JJUFRJT04gPSAiQ3JlYXRlIGEgQnVuZGxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSBvciBpbiBhbiBleHRlcm5hbCBsb2NhdGlvbi4iOwogCi0JcHVibGljIE5ld0J1bmRsZVByb2plY3RTZXR0aW5nc1BhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRpdGxlKE5FV19QUk9KRUNUX1NFVFRJTkdTX1RJVExFKTsKLQkJc2V0RGVzY3JpcHRpb24oTkVXX1BST0pFQ1RfU0VUVElOR1NfREVTQ1JJUFRJT04pOwotCX0KKyAgICBwdWJsaWMgTmV3QnVuZGxlUHJvamVjdFNldHRpbmdzUGFnZSgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc2V0VGl0bGUoTkVXX1BST0pFQ1RfU0VUVElOR1NfVElUTEUpOworICAgICAgICBzZXREZXNjcmlwdGlvbihORVdfUFJPSkVDVF9TRVRUSU5HU19ERVNDUklQVElPTik7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld0J1bmRsZVByb2plY3RXaXphcmQuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3QnVuZGxlUHJvamVjdFdpemFyZC5qYXZhCmluZGV4IDJhYmM2Y2UuLjU2MjYzODkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3QnVuZGxlUHJvamVjdFdpemFyZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3QnVuZGxlUHJvamVjdFdpemFyZC5qYXZhCkBAIC04LDYgKzgsNyBAQAogICogQ29udHJpYnV0b3JzOgogICogICAgIFNwcmluZ1NvdXJjZSwgYSBkaXZpc2lvbiBvZiBWTXdhcmUsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiBwYWNrYWdlIG9yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS53aXphcmRzOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKQEAgLTY5LDI1OCArNzAsMjQ5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBOZXdCdW5kbGVQcm9qZWN0V2l6YXJkIGV4dGVuZHMgTmV3RWxlbWVudFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewogCi0JcHJpdmF0ZSBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmUgcHJvamVjdFBhZ2U7CisgICAgcHJpdmF0ZSBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VPbmUgcHJvamVjdFBhZ2U7CiAKLQlwcml2YXRlIE5ld0J1bmRsZUluZm9ybWF0aW9uUGFnZSBidW5kbGVQYWdlOworICAgIHByaXZhdGUgTmV3QnVuZGxlSW5mb3JtYXRpb25QYWdlIGJ1bmRsZVBhZ2U7CiAKLQlwcml2YXRlIEFic3RyYWN0UHJvcGVydGllc1BhZ2UgcHJvcGVydGllc1BhZ2U7CisgICAgcHJpdmF0ZSBBYnN0cmFjdFByb3BlcnRpZXNQYWdlIHByb3BlcnRpZXNQYWdlOwogCi0JcHJpdmF0ZSBOZXdKYXZhUHJvamVjdFdpemFyZFBhZ2VUd28gZmluYWxQYWdlOworICAgIHByaXZhdGUgTmV3SmF2YVByb2plY3RXaXphcmRQYWdlVHdvIGZpbmFsUGFnZTsKIAotCXByaXZhdGUgSVByb2plY3RQcm92aWRlciBwcm9qZWN0UHJvdmlkZXI7CisgICAgcHJpdmF0ZSBJUHJvamVjdFByb3ZpZGVyIHByb2plY3RQcm92aWRlcjsKIAotCXByaXZhdGUgZmluYWwgQWJzdHJhY3RGaWVsZERhdGEgYnVuZGxlRGF0YTsKKyAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0RmllbGREYXRhIGJ1bmRsZURhdGE7CiAKLQlwcml2YXRlIGZpbmFsIElEYXRhTW9kZWwgbW9kZWw7CisgICAgcHJpdmF0ZSBmaW5hbCBJRGF0YU1vZGVsIG1vZGVsOwogCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGl0bGUgPSAiTmV3IEJ1bmRsZSBQcm9qZWN0IjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0aXRsZSA9ICJOZXcgQnVuZGxlIFByb2plY3QiOwogCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXM7CiAKLQlwcml2YXRlIFN0cmluZyBwbGF0Zm9ybU1vZHVsZTsKKyAgICBwcml2YXRlIFN0cmluZyBwbGF0Zm9ybU1vZHVsZTsKIAotCXB1YmxpYyBOZXdCdW5kbGVQcm9qZWN0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZSh0aXRsZSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKFNlcnZlcklkZVVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC93aXpiYW4vd2l6YmFuLWJ1bmRsZS5wbmciKSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCQlidW5kbGVEYXRhID0gbmV3IFBsdWdpbkZpZWxkRGF0YSgpOwotCQltb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBCdW5kbGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9CisgICAgcHVibGljIE5ld0J1bmRsZVByb2plY3RXaXphcmQoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHNldFdpbmRvd1RpdGxlKHRoaXMudGl0bGUpOworICAgICAgICBzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihTZXJ2ZXJJZGVVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvd2l6YmFuL3dpemJhbi1idW5kbGUucG5nIikpOworICAgICAgICBzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKKyAgICAgICAgdGhpcy5idW5kbGVEYXRhID0gbmV3IFBsdWdpbkZpZWxkRGF0YSgpOworICAgICAgICB0aGlzLm1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEJ1bmRsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkpOworICAgIH0KIAotCXByaXZhdGUgdm9pZCBhZGRGYWNldHNUb1Byb2plY3QoZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXIgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgYWRkRmFjZXRzVG9Qcm9qZWN0KGZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKIAotCQkJCUlGYWNldGVkUHJvamVjdCBmUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0LmdldFByb2plY3QoKSwgdHJ1ZSwgbW9uaXRvcik7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogCi0JCQkJLy8gV1NUIDMuMCBvbmx5CisgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QuZ2V0UHJvamVjdCgpLCB0cnVlLCBtb25pdG9yKTsKIAotCQkJCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoQnVuZGxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuRU5BQkxFX1dFQl9CVU5ETEUpKSB7Ci0JCQkJCWZQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCJqc3QuamF2YSIpLmdldERlZmF1bHRWZXJzaW9uKCksCi0JCQkJCQkJbnVsbCwgbW9uaXRvcik7Ci0JCQkJCWZQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEZhY2V0Q29yZVBsdWdpbi5XRUJfRkFDRVRfSUQpCi0JCQkJCQkJLmdldFZlcnNpb24oIjIuNSIpLCBudWxsLCBtb25pdG9yKTsKKyAgICAgICAgICAgICAgICAvLyBXU1QgMy4wIG9ubHkKIAotCQkJCQkvLyB3YW5uYSB1bmluc3RhbGwgSmF2YVNjcmlwdCBmYWNldCwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB0bwotCQkJCQkvLyBiZSB0aGVyZSB5ZXQKLQkJCQkJLy8gZlByb2plY3QudW5pbnN0YWxsUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyCi0JCQkJCS8vIC5nZXRQcm9qZWN0RmFjZXQoRmFjZXRDb3JlUGx1Z2luLldFQl9KU19GQUNFVF9JRCkuZ2V0RGVmYXVsdFZlcnNpb24oKSwKLQkJCQkJLy8gbnVsbCwgbW9uaXRvcik7CisgICAgICAgICAgICAgICAgaWYgKE5ld0J1bmRsZVByb2plY3RXaXphcmQudGhpcy5tb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoQnVuZGxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuRU5BQkxFX1dFQl9CVU5ETEUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCJqc3QuamF2YSIpLmdldERlZmF1bHRWZXJzaW9uKCksIG51bGwsIG1vbml0b3IpOworICAgICAgICAgICAgICAgICAgICBmUHJvamVjdC5pbnN0YWxsUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChGYWNldENvcmVQbHVnaW4uV0VCX0ZBQ0VUX0lEKS5nZXRWZXJzaW9uKCIyLjUiKSwgbnVsbCwgbW9uaXRvcik7CiAKLQkJCQkJcmVtb3ZlRnJvbUNsYXNzcGF0aChwcm9qZWN0LCAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmNvbnRhaW5lciIsIG1vbml0b3IpOwotCQkJCQlyZW1vdmVGcm9tQ2xhc3NwYXRoKHByb2plY3QsICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGUuY29udGFpbmVyIiwgbW9uaXRvcik7Ci0JCQkJfQorICAgICAgICAgICAgICAgICAgICAvLyB3YW5uYSB1bmluc3RhbGwgSmF2YVNjcmlwdCBmYWNldCwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB0bworICAgICAgICAgICAgICAgICAgICAvLyBiZSB0aGVyZSB5ZXQKKyAgICAgICAgICAgICAgICAgICAgLy8gZlByb2plY3QudW5pbnN0YWxsUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgIC8vIC5nZXRQcm9qZWN0RmFjZXQoRmFjZXRDb3JlUGx1Z2luLldFQl9KU19GQUNFVF9JRCkuZ2V0RGVmYXVsdFZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gbnVsbCwgbW9uaXRvcik7CiAKLQkJCQlmUHJvamVjdC5pbnN0YWxsUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChGYWNldENvcmVQbHVnaW4uQlVORExFX0ZBQ0VUX0lEKQotCQkJCQkJLmdldERlZmF1bHRWZXJzaW9uKCksIG51bGwsIG1vbml0b3IpOwotCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSk7Ci0JCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbAotCQkJCQkJJiYgcnVudGltZS5zdXBwb3J0cyhQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRmFjZXRDb3JlUGx1Z2luLkJVTkRMRV9GQUNFVF9JRCkKLQkJCQkJCQkJLmdldERlZmF1bHRWZXJzaW9uKCkpKSB7Ci0JCQkJCWZQcm9qZWN0LnNldFRhcmdldGVkUnVudGltZXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJ1bnRpbWUpLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShCdW5kbGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5FTkFCTEVfU0VSVkVSX0NMQVNTUEFUSF9DT05UQUlORVIpKSB7Ci0JCQkJCWFkZFRvQ2xhc3NwYXRoKHByb2plY3QsIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KEZhY2V0Q29yZVBsdWdpbi5DTEFTU1BBVEhfQ09OVEFJTkVSX1BBVEgpLAotCQkJCQkJCW1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQkJfTsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRnJvbUNsYXNzcGF0aChwcm9qZWN0LCAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmNvbnRhaW5lciIsIG1vbml0b3IpOworICAgICAgICAgICAgICAgICAgICByZW1vdmVGcm9tQ2xhc3NwYXRoKHByb2plY3QsICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGUuY29udGFpbmVyIiwgbW9uaXRvcik7CisgICAgICAgICAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgb3Blcik7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAotCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlcklkZVVpUGx1Z2luLlBMVUdJTl9JRCwgIkZhaWx1cmUgb3BlbmluZyBwcm9qZWN0IGZhY2V0cy4iLCBlKSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKLQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIFNlcnZlcklkZVVpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQkiSW50ZXJydXB0aW9uIHdoaWxlIG9wZW5pbmcgcHJvamVjdCBmYWNldHMuIiwgZSkpOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgIGZQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEZhY2V0Q29yZVBsdWdpbi5CVU5ETEVfRkFDRVRfSUQpLmdldERlZmF1bHRWZXJzaW9uKCksIG51bGwsCisgICAgICAgICAgICAgICAgICAgIG1vbml0b3IpOworICAgICAgICAgICAgICAgIElSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIE5ld0J1bmRsZVByb2plY3RXaXphcmQudGhpcy5tb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpOworICAgICAgICAgICAgICAgIGlmIChydW50aW1lICE9IG51bGwgJiYgcnVudGltZS5zdXBwb3J0cyhQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRmFjZXRDb3JlUGx1Z2luLkJVTkRMRV9GQUNFVF9JRCkuZ2V0RGVmYXVsdFZlcnNpb24oKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZlByb2plY3Quc2V0VGFyZ2V0ZWRSdW50aW1lcyhDb2xsZWN0aW9ucy5zaW5nbGV0b24ocnVudGltZSksIG1vbml0b3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoTmV3QnVuZGxlUHJvamVjdFdpemFyZC50aGlzLm1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShCdW5kbGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5FTkFCTEVfU0VSVkVSX0NMQVNTUEFUSF9DT05UQUlORVIpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFRvQ2xhc3NwYXRoKHByb2plY3QsIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KEZhY2V0Q29yZVBsdWdpbi5DTEFTU1BBVEhfQ09OVEFJTkVSX1BBVEgpLCBtb25pdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGVudHJ5UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0PElDbGFzc3BhdGhFbnRyeT4gcmF3Q2xhc3NwYXRoID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7Ci0JCXJhd0NsYXNzcGF0aC5hZGRBbGwoQXJyYXlzLmFzTGlzdChqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wZXIpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZShuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFNlcnZlcklkZVVpUGx1Z2luLlBMVUdJTl9JRCwgIkZhaWx1cmUgb3BlbmluZyBwcm9qZWN0IGZhY2V0cy4iLCBlKSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpLmhhbmRsZSgKKyAgICAgICAgICAgICAgICBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgU2VydmVySWRlVWlQbHVnaW4uUExVR0lOX0lELCAiSW50ZXJydXB0aW9uIHdoaWxlIG9wZW5pbmcgcHJvamVjdCBmYWNldHMuIiwgZSkpOworICAgICAgICB9CisgICAgfQogCi0JCUl0ZXJhdG9yPElDbGFzc3BhdGhFbnRyeT4gaXRlciA9IHJhd0NsYXNzcGF0aC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldFBhdGgoKSAhPSBudWxsICYmIGVudHJ5LmdldFBhdGgoKS50b1N0cmluZygpICE9IG51bGwKLQkJCQkJJiYgZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKGVudHJ5UGF0aCkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9CisgICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbUNsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBlbnRyeVBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgICBMaXN0PElDbGFzc3BhdGhFbnRyeT4gcmF3Q2xhc3NwYXRoID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7CisgICAgICAgIHJhd0NsYXNzcGF0aC5hZGRBbGwoQXJyYXlzLmFzTGlzdChqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSkpOwogCi0JCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChyYXdDbGFzc3BhdGgudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5WzBdKSwgbW9uaXRvcik7Ci0JfQorICAgICAgICBJdGVyYXRvcjxJQ2xhc3NwYXRoRW50cnk+IGl0ZXIgPSByYXdDbGFzc3BhdGguaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRQYXRoKCkgIT0gbnVsbCAmJiBlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKSAhPSBudWxsICYmIGVudHJ5LmdldFBhdGgoKS50b1N0cmluZygpLmVxdWFscyhlbnRyeVBhdGgpKSB7CisgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY3VycmVudCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSB1cGRhdGVkID0gbmV3IElDbGFzc3BhdGhFbnRyeVtjdXJyZW50Lmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnQsIDAsIHVwZGF0ZWQsIDAsIGN1cnJlbnQubGVuZ3RoKTsKLQkJdXBkYXRlZFtjdXJyZW50Lmxlbmd0aF0gPSBlbnRyeTsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKHVwZGF0ZWQsIG1vbml0b3IpOwotCX0KKyAgICAgICAgamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKHJhd0NsYXNzcGF0aC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbMF0pLCBtb25pdG9yKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJcHJvamVjdFBhZ2UgPSBuZXcgTmV3QnVuZGxlUHJvamVjdFNldHRpbmdzUGFnZSgpOwotCQlhZGRQYWdlKHByb2plY3RQYWdlKTsKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUb0NsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgICAgIElDbGFzc3BhdGhFbnRyeVtdIGN1cnJlbnQgPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKKyAgICAgICAgSUNsYXNzcGF0aEVudHJ5W10gdXBkYXRlZCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbY3VycmVudC5sZW5ndGggKyAxXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShjdXJyZW50LCAwLCB1cGRhdGVkLCAwLCBjdXJyZW50Lmxlbmd0aCk7CisgICAgICAgIHVwZGF0ZWRbY3VycmVudC5sZW5ndGhdID0gZW50cnk7CisgICAgICAgIGphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aCh1cGRhdGVkLCBtb25pdG9yKTsKKyAgICB9CiAKLQkJcHJvamVjdFByb3ZpZGVyID0gbmV3IElQcm9qZWN0UHJvdmlkZXIoKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7CisgICAgICAgIHRoaXMucHJvamVjdFBhZ2UgPSBuZXcgTmV3QnVuZGxlUHJvamVjdFNldHRpbmdzUGFnZSgpOworICAgICAgICBhZGRQYWdlKHRoaXMucHJvamVjdFBhZ2UpOwogCi0JCQlwdWJsaWMgSVBhdGggZ2V0TG9jYXRpb25QYXRoKCkgewotCQkJCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKTsKLQkJCX0KKyAgICAgICAgdGhpcy5wcm9qZWN0UHJvdmlkZXIgPSBuZXcgSVByb2plY3RQcm92aWRlcigpIHsKIAotCQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChnZXRQcm9qZWN0TmFtZSgpKTsKLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvblBhdGgoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpOworICAgICAgICAgICAgfQogCi0JCQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQkJCXJldHVybiBwcm9qZWN0UGFnZS5nZXRQcm9qZWN0TmFtZSgpOwotCQkJfQorICAgICAgICAgICAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChnZXRQcm9qZWN0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KIAotCQl9OworICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTmV3QnVuZGxlUHJvamVjdFdpemFyZC50aGlzLnByb2plY3RQYWdlLmdldFByb2plY3ROYW1lKCk7CisgICAgICAgICAgICB9CiAKLQkJYnVuZGxlUGFnZSA9IG5ldyBOZXdCdW5kbGVJbmZvcm1hdGlvblBhZ2UodGl0bGUsIHByb2plY3RQcm92aWRlciwgYnVuZGxlRGF0YSwgbW9kZWwpOwotCQlhZGRQYWdlKGJ1bmRsZVBhZ2UpOworICAgICAgICB9OwogCi0JCXNldFByb3BlcnRpZXNQYWdlKG5ldyBOdWxsUHJvcGVydGllc1BhZ2UoKSk7CisgICAgICAgIHRoaXMuYnVuZGxlUGFnZSA9IG5ldyBOZXdCdW5kbGVJbmZvcm1hdGlvblBhZ2UodGhpcy50aXRsZSwgdGhpcy5wcm9qZWN0UHJvdmlkZXIsIHRoaXMuYnVuZGxlRGF0YSwgdGhpcy5tb2RlbCk7CisgICAgICAgIGFkZFBhZ2UodGhpcy5idW5kbGVQYWdlKTsKIAotCQlmaW5hbFBhZ2UgPSBuZXcgTmV3QnVuZGxlUHJvamVjdENyZWF0aW9uUGFnZShwcm9qZWN0UGFnZSk7Ci0JCWFkZFBhZ2UoZmluYWxQYWdlKTsKLQl9CisgICAgICAgIHNldFByb3BlcnRpZXNQYWdlKG5ldyBOdWxsUHJvcGVydGllc1BhZ2UoKSk7CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCUlXaXphcmRQYWdlIHBhZ2UgPSBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpOwotCQlyZXR1cm4gc3VwZXIuY2FuRmluaXNoKCkgJiYgcGFnZSAhPSBwcm9qZWN0UGFnZTsKLQl9CisgICAgICAgIHRoaXMuZmluYWxQYWdlID0gbmV3IE5ld0J1bmRsZVByb2plY3RDcmVhdGlvblBhZ2UodGhpcy5wcm9qZWN0UGFnZSk7CisgICAgICAgIGFkZFBhZ2UodGhpcy5maW5hbFBhZ2UpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpbmlzaFBhZ2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlmaW5hbFBhZ2UucGVyZm9ybUZpbmlzaChtb25pdG9yKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgeworICAgICAgICBJV2l6YXJkUGFnZSBwYWdlID0gZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmNhbkZpbmlzaCgpICYmIHBhZ2UgIT0gdGhpcy5wcm9qZWN0UGFnZTsKKyAgICB9CiAKLQlwcml2YXRlIElXb3JrYmVuY2hQYXJ0IGdldEFjdGl2ZVBhcnQoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93ID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmIChhY3RpdmVXaW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IGFjdGl2ZVdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlUGFydCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hQYWdlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5maW5hbFBhZ2UucGVyZm9ybUZpbmlzaChtb25pdG9yKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUphdmFFbGVtZW50IGdldENyZWF0ZWRFbGVtZW50KCkgewotCQlyZXR1cm4gZmluYWxQYWdlLmdldEphdmFQcm9qZWN0KCk7Ci0JfQorICAgIHByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZ2V0QWN0aXZlUGFydCgpIHsKKyAgICAgICAgSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKKyAgICAgICAgaWYgKGFjdGl2ZVdpbmRvdyAhPSBudWxsKSB7CisgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gYWN0aXZlV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKKyAgICAgICAgICAgIGlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZlUGFnZS5nZXRBY3RpdmVQYXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKLQkJZmluYWxQYWdlLnBlcmZvcm1DYW5jZWwoKTsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1DYW5jZWwoKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElKYXZhRWxlbWVudCBnZXRDcmVhdGVkRWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZmluYWxQYWdlLmdldEphdmFQcm9qZWN0KCk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiByZXMgPSBzdXBlci5wZXJmb3JtRmluaXNoKCk7Ci0JCWlmIChyZXMpIHsKLQkJCWJ1bmRsZVBhZ2UucGVyZm9ybVBhZ2VGaW5pc2goKTsKLQkJCXByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzUGFnZS5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQlwbGF0Zm9ybU1vZHVsZSA9IHByb3BlcnRpZXNQYWdlLmdldE1vZHVsZVR5cGUoKTsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgeworICAgICAgICB0aGlzLmZpbmFsUGFnZS5wZXJmb3JtQ2FuY2VsKCk7CisgICAgICAgIHJldHVybiBzdXBlci5wZXJmb3JtQ2FuY2VsKCk7CisgICAgfQogCi0JCQlmaW5hbCBJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGdldENyZWF0ZWRFbGVtZW50KCk7Ci0JCQlJSmF2YVByb2plY3QgcHJvamVjdCA9IGVsZW1lbnQuZ2V0SmF2YVByb2plY3QoKTsKLQkJCWFkZEZhY2V0c1RvUHJvamVjdChwcm9qZWN0KTsKLQkJCXdyaXRlQnVuZGxlRGF0YShwcm9qZWN0LCBwbGF0Zm9ybU1vZHVsZSwgcHJvcGVydGllcyk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKKyAgICAgICAgYm9vbGVhbiByZXMgPSBzdXBlci5wZXJmb3JtRmluaXNoKCk7CisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgIHRoaXMuYnVuZGxlUGFnZS5wZXJmb3JtUGFnZUZpbmlzaCgpOworICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzUGFnZS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICB0aGlzLnBsYXRmb3JtTW9kdWxlID0gdGhpcy5wcm9wZXJ0aWVzUGFnZS5nZXRNb2R1bGVUeXBlKCk7CiAKLQkJCUlXb3JraW5nU2V0W10gd29ya2luZ1NldHMgPSBwcm9qZWN0UGFnZS5nZXRXb3JraW5nU2V0cygpOwotCQkJaWYgKHdvcmtpbmdTZXRzLmxlbmd0aCA+IDApIHsKLQkJCQlnZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpLmFkZFRvV29ya2luZ1NldHMoZWxlbWVudCwgd29ya2luZ1NldHMpOwotCQkJfQotCQkJc2VsZWN0QW5kUmV2ZWFsKHByb2plY3QuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGZpbmFsIElKYXZhRWxlbWVudCBlbGVtZW50ID0gZ2V0Q3JlYXRlZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIElKYXZhUHJvamVjdCBwcm9qZWN0ID0gZWxlbWVudC5nZXRKYXZhUHJvamVjdCgpOworICAgICAgICAgICAgYWRkRmFjZXRzVG9Qcm9qZWN0KHByb2plY3QpOworICAgICAgICAgICAgd3JpdGVCdW5kbGVEYXRhKHByb2plY3QsIHRoaXMucGxhdGZvcm1Nb2R1bGUsIHRoaXMucHJvcGVydGllcyk7CiAKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0ID0gZ2V0QWN0aXZlUGFydCgpOwotCQkJCQlpZiAoYWN0aXZlUGFydCBpbnN0YW5jZW9mIFBhY2thZ2VFeHBsb3JlclBhcnQpIHsKLQkJCQkJCSgoUGFja2FnZUV4cGxvcmVyUGFydCkgYWN0aXZlUGFydCkudHJ5VG9SZXZlYWwoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKKyAgICAgICAgICAgIElXb3JraW5nU2V0W10gd29ya2luZ1NldHMgPSB0aGlzLnByb2plY3RQYWdlLmdldFdvcmtpbmdTZXRzKCk7CisgICAgICAgICAgICBpZiAod29ya2luZ1NldHMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGdldFdvcmtiZW5jaCgpLmdldFdvcmtpbmdTZXRNYW5hZ2VyKCkuYWRkVG9Xb3JraW5nU2V0cyhlbGVtZW50LCB3b3JraW5nU2V0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZWxlY3RBbmRSZXZlYWwocHJvamVjdC5nZXRQcm9qZWN0KCkpOwogCi0JCQlJRmlsZSBtYW5pZmVzdEZpbGUgPSAoSUZpbGUpIHByb2plY3QuZ2V0UHJvamVjdCgpLmZpbmRNZW1iZXIoInNyYy9NRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotCQkJaWYgKG1hbmlmZXN0RmlsZSAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQl0cnkgewotCQkJCQlwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChtYW5pZmVzdEZpbGUpLCBCdW5kbGVNYW5pZmVzdEVkaXRvci5JRF9FRElUT1IpOwotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Iod29ya2JlbmNoV2luZG93LmdldFNoZWxsKCksICJFcnJvciBvcGVuaW5nIGVkaXRvciIsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CiAKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFydCBhY3RpdmVQYXJ0ID0gZ2V0QWN0aXZlUGFydCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlUGFydCBpbnN0YW5jZW9mIFBhY2thZ2VFeHBsb3JlclBhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoUGFja2FnZUV4cGxvcmVyUGFydCkgYWN0aXZlUGFydCkudHJ5VG9SZXZlYWwoZWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKIAotCXByaXZhdGUgdm9pZCB3cml0ZUJ1bmRsZURhdGEoZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3QsIGZpbmFsIFN0cmluZyBwbGF0Zm9ybU1vZHVsZSwKLQkJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcykgewotCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlciA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUJ1bmRsZU1hbmlmZXN0VXRpbHMuY3JlYXRlTmV3QnVuZGxlTWFuaWZlc3QocHJvamVjdCwgYnVuZGxlRGF0YS5nZXRJZCgpLCBidW5kbGVEYXRhLmdldFZlcnNpb24oKSwKLQkJCQkJCWJ1bmRsZURhdGEuZ2V0UHJvdmlkZXIoKSwgYnVuZGxlRGF0YS5nZXROYW1lKCksIHBsYXRmb3JtTW9kdWxlLCBwcm9wZXJ0aWVzKTsKLQkJCQlwcm9qZWN0LmdldFByb2plY3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKLQkJCX0KLQkJfTsKKyAgICAgICAgICAgIElGaWxlIG1hbmlmZXN0RmlsZSA9IChJRmlsZSkgcHJvamVjdC5nZXRQcm9qZWN0KCkuZmluZE1lbWJlcigic3JjL01FVEEtSU5GL01BTklGRVNULk1GIik7CisgICAgICAgICAgICBpZiAobWFuaWZlc3RGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOworICAgICAgICAgICAgICAgIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KG1hbmlmZXN0RmlsZSksIEJ1bmRsZU1hbmlmZXN0RWRpdG9yLklEX0VESVRPUik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwgIkVycm9yIG9wZW5pbmcgZWRpdG9yIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgb3Blcik7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0aWVzUGFnZShBYnN0cmFjdFByb3BlcnRpZXNQYWdlIHBhZ2UpIHsKLQkJcHJvcGVydGllc1BhZ2UgPSBwYWdlOwotCQlpZiAoZ2V0UGFnZShwYWdlLmdldE5hbWUoKSkgPT0gbnVsbCkgewotCQkJYWRkUGFnZShwYWdlKTsKLQkJfQotCX0KKyAgICBwcml2YXRlIHZvaWQgd3JpdGVCdW5kbGVEYXRhKGZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBTdHJpbmcgcGxhdGZvcm1Nb2R1bGUsIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcykgeworICAgICAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlciA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7CiAKLQlwcm90ZWN0ZWQgQWJzdHJhY3RQcm9wZXJ0aWVzUGFnZSBnZXRQcm9wZXJ0aWVzUGFnZSgpIHsKLQkJcmV0dXJuIHByb3BlcnRpZXNQYWdlOwotCX0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgQnVuZGxlTWFuaWZlc3RVdGlscy5jcmVhdGVOZXdCdW5kbGVNYW5pZmVzdChwcm9qZWN0LCBOZXdCdW5kbGVQcm9qZWN0V2l6YXJkLnRoaXMuYnVuZGxlRGF0YS5nZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICBOZXdCdW5kbGVQcm9qZWN0V2l6YXJkLnRoaXMuYnVuZGxlRGF0YS5nZXRWZXJzaW9uKCksIE5ld0J1bmRsZVByb2plY3RXaXphcmQudGhpcy5idW5kbGVEYXRhLmdldFByb3ZpZGVyKCksCisgICAgICAgICAgICAgICAgICAgIE5ld0J1bmRsZVByb2plY3RXaXphcmQudGhpcy5idW5kbGVEYXRhLmdldE5hbWUoKSwgcGxhdGZvcm1Nb2R1bGUsIHByb3BlcnRpZXMpOworICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0UHJvamVjdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9OwogCi0JcHJvdGVjdGVkIE5ld0J1bmRsZUluZm9ybWF0aW9uUGFnZSBnZXRJbmZvcm1hdGlvblBhZ2UoKSB7Ci0JCXJldHVybiBidW5kbGVQYWdlOwotCX0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBvcGVyKTsKKyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQogCi0JcHJvdGVjdGVkIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3byBnZXRGaW5hbFBhZ2UoKSB7Ci0JCXJldHVybiBmaW5hbFBhZ2U7Ci0JfQorICAgIHByb3RlY3RlZCB2b2lkIHNldFByb3BlcnRpZXNQYWdlKEFic3RyYWN0UHJvcGVydGllc1BhZ2UgcGFnZSkgeworICAgICAgICB0aGlzLnByb3BlcnRpZXNQYWdlID0gcGFnZTsKKyAgICAgICAgaWYgKGdldFBhZ2UocGFnZS5nZXROYW1lKCkpID09IG51bGwpIHsKKyAgICAgICAgICAgIGFkZFBhZ2UocGFnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RQcm9wZXJ0aWVzUGFnZSBnZXRQcm9wZXJ0aWVzUGFnZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvcGVydGllc1BhZ2U7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE5ld0J1bmRsZUluZm9ybWF0aW9uUGFnZSBnZXRJbmZvcm1hdGlvblBhZ2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJ1bmRsZVBhZ2U7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE5ld0phdmFQcm9qZWN0V2l6YXJkUGFnZVR3byBnZXRGaW5hbFBhZ2UoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZpbmFsUGFnZTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3UGFySW5mb3JtYXRpb25QYWdlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld1BhckluZm9ybWF0aW9uUGFnZS5qYXZhCmluZGV4IGYyZjg2ZGMuLjA4N2Q5NzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3UGFySW5mb3JtYXRpb25QYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9OZXdQYXJJbmZvcm1hdGlvblBhZ2UuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkud2l6YXJkczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwpAQCAtMjQsNjMgKzI1LDYzIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBOZXdQYXJJbmZvcm1hdGlvblBhZ2UgZXh0ZW5kcyBSdW50aW1lQ29uZmlndXJhdGlvblBhZ2UgewogCi0JcHJvdGVjdGVkIE5ld1BhckluZm9ybWF0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUsIElQcm9qZWN0UHJvdmlkZXIgcHJvdmlkZXIsIEFic3RyYWN0RmllbGREYXRhIGRhdGEsIElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIocGFnZU5hbWUsIHByb3ZpZGVyLCBkYXRhLCBtb2RlbCk7Ci0JfQorICAgIHByb3RlY3RlZCBOZXdQYXJJbmZvcm1hdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBJUHJvamVjdFByb3ZpZGVyIHByb3ZpZGVyLCBBYnN0cmFjdEZpZWxkRGF0YSBkYXRhLCBJRGF0YU1vZGVsIG1vZGVsKSB7CisgICAgICAgIHN1cGVyKHBhZ2VOYW1lLCBwcm92aWRlciwgZGF0YSwgbW9kZWwpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFkZGl0aW9uYWxQcm9wZXJ0aWVzR3JvdXAoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWRkaXRpb25hbFByb3BlcnRpZXNHcm91cChDb21wb3NpdGUgY29udGFpbmVyKSB7CisgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAotCX0KKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRQYWdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBQcm9qZWN0Q29udGVudFBhZ2VTdHJpbmdzLlBhcl9Db250ZW50UGFnZV9kZXNjOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRQYWdlRGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiBQcm9qZWN0Q29udGVudFBhZ2VTdHJpbmdzLlBhcl9Db250ZW50UGFnZV9kZXNjOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VHcm91cExhYmVsKCkgewotCQlyZXR1cm4gUHJvamVjdENvbnRlbnRQYWdlU3RyaW5ncy5QYXJfQ29udGVudFBhZ2VfcEdyb3VwOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRQYWdlR3JvdXBMYWJlbCgpIHsKKyAgICAgICAgcmV0dXJuIFByb2plY3RDb250ZW50UGFnZVN0cmluZ3MuUGFyX0NvbnRlbnRQYWdlX3BHcm91cDsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRQYWdlSWRMYWJlbCgpIHsKLQkJcmV0dXJuIFByb2plY3RDb250ZW50UGFnZVN0cmluZ3MuUGFyX0NvbnRlbnRQYWdlX3BpZDsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50UGFnZUlkTGFiZWwoKSB7CisgICAgICAgIHJldHVybiBQcm9qZWN0Q29udGVudFBhZ2VTdHJpbmdzLlBhcl9Db250ZW50UGFnZV9waWQ7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50UGFnZU5hbWVMYWJlbCgpIHsKLQkJcmV0dXJuIFByb2plY3RDb250ZW50UGFnZVN0cmluZ3MuUGFyX0NvbnRlbnRQYWdlX3BuYW1lOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRQYWdlTmFtZUxhYmVsKCkgeworICAgICAgICByZXR1cm4gUHJvamVjdENvbnRlbnRQYWdlU3RyaW5ncy5QYXJfQ29udGVudFBhZ2VfcG5hbWU7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50UGFnZVBsdWdpbkxhYmVsKCkgewotCQlyZXR1cm4gUHJvamVjdENvbnRlbnRQYWdlU3RyaW5ncy5QYXJfQ29udGVudFBhZ2VfcGx1Z2luOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRQYWdlUGx1Z2luTGFiZWwoKSB7CisgICAgICAgIHJldHVybiBQcm9qZWN0Q29udGVudFBhZ2VTdHJpbmdzLlBhcl9Db250ZW50UGFnZV9wbHVnaW47CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50UGFnZVByb3ZpZGVyTGFiZWwoKSB7Ci0JCXJldHVybiBQcm9qZWN0Q29udGVudFBhZ2VTdHJpbmdzLlBhcl9Db250ZW50UGFnZV9wcHJvdmlkZXI7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VQcm92aWRlckxhYmVsKCkgeworICAgICAgICByZXR1cm4gUHJvamVjdENvbnRlbnRQYWdlU3RyaW5ncy5QYXJfQ29udGVudFBhZ2VfcHByb3ZpZGVyOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VUaXRsZSgpIHsKLQkJcmV0dXJuIFByb2plY3RDb250ZW50UGFnZVN0cmluZ3MuUGFyX0NvbnRlbnRQYWdlX3RpdGxlOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRQYWdlVGl0bGUoKSB7CisgICAgICAgIHJldHVybiBQcm9qZWN0Q29udGVudFBhZ2VTdHJpbmdzLlBhcl9Db250ZW50UGFnZV90aXRsZTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRQYWdlVmVyc2lvbkxhYmVsKCkgewotCQlyZXR1cm4gUHJvamVjdENvbnRlbnRQYWdlU3RyaW5ncy5QYXJfQ29udGVudFBhZ2VfcHZlcnNpb247Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFBhZ2VWZXJzaW9uTGFiZWwoKSB7CisgICAgICAgIHJldHVybiBQcm9qZWN0Q29udGVudFBhZ2VTdHJpbmdzLlBhcl9Db250ZW50UGFnZV9wdmVyc2lvbjsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlyZXR1cm4gU2VydmVySWRlVWlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7CisgICAgICAgIHJldHVybiBTZXJ2ZXJJZGVVaVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZVR5cGVJRCgpIHsKLQkJcmV0dXJuIEZhY2V0Q29yZVBsdWdpbi5QQVJfRkFDRVRfSUQ7Ci0JfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlVHlwZUlEKCkgeworICAgICAgICByZXR1cm4gRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld1BhclByb2plY3RSZWZlcmVuY2VQYWdlLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld1BhclByb2plY3RSZWZlcmVuY2VQYWdlLmphdmEKaW5kZXggY2MzMWM3NS4uNDMyZWE1NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9OZXdQYXJQcm9qZWN0UmVmZXJlbmNlUGFnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3UGFyUHJvamVjdFJlZmVyZW5jZVBhZ2UuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkud2l6YXJkczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CkBAIC0yMSwyNyArMjIsMjggQEAKICAqLwogcHVibGljIGNsYXNzIE5ld1BhclByb2plY3RSZWZlcmVuY2VQYWdlIGV4dGVuZHMgV2l6YXJkTmV3UHJvamVjdFJlZmVyZW5jZVBhZ2UgewogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5FV19QUk9KRUNUX1JFRkVSRU5DRV9USVRMRSA9ICJCdW5kbGUgUmVmZXJlbmNlcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5FV19QUk9KRUNUX1JFRkVSRU5DRV9USVRMRSA9ICJCdW5kbGUgUmVmZXJlbmNlcyI7CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTkVXX1BST0pFQ1RfUkVGRVJFTkNFX0RFU0NSSVBUSU9OID0gIkFkZCBidW5kbGVzIHRvIFBBUiBwcm9qZWN0LiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5FV19QUk9KRUNUX1JFRkVSRU5DRV9ERVNDUklQVElPTiA9ICJBZGQgYnVuZGxlcyB0byBQQVIgcHJvamVjdC4iOwogCi0JcHVibGljIE5ld1BhclByb2plY3RSZWZlcmVuY2VQYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKE5FV19QUk9KRUNUX1JFRkVSRU5DRV9USVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKE5FV19QUk9KRUNUX1JFRkVSRU5DRV9ERVNDUklQVElPTik7Ci0JfQorICAgIHB1YmxpYyBOZXdQYXJQcm9qZWN0UmVmZXJlbmNlUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKKyAgICAgICAgc3VwZXIocGFnZU5hbWUpOworICAgICAgICBzZXRUaXRsZShORVdfUFJPSkVDVF9SRUZFUkVOQ0VfVElUTEUpOworICAgICAgICBzZXREZXNjcmlwdGlvbihORVdfUFJPSkVDVF9SRUZFUkVOQ0VfREVTQ1JJUFRJT04pOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSVdvcmtzcGFjZSkpIHsKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQkJfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkgewogCi0JCQkJcmV0dXJuIEZhY2V0VXRpbHMuZ2V0QnVuZGxlUHJvamVjdHMoKTsKLQkJCX0KLQkJfTsKLQl9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgeworICAgICAgICAgICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBJV29ya3NwYWNlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdFswXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFjZXRVdGlscy5nZXRCdW5kbGVQcm9qZWN0cygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTmV3UGFyUHJvamVjdFNldHRpbmdzUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9OZXdQYXJQcm9qZWN0U2V0dGluZ3NQYWdlLmphdmEKaW5kZXggZGNjNTI1Mi4uOGM5ZmZjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9OZXdQYXJQcm9qZWN0U2V0dGluZ3NQYWdlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9OZXdQYXJQcm9qZWN0U2V0dGluZ3NQYWdlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLndpemFyZHM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKQEAgLTIxLDI1ICsyMiwyNCBAQAogICovCiBwdWJsaWMgY2xhc3MgTmV3UGFyUHJvamVjdFNldHRpbmdzUGFnZSBleHRlbmRzIFdpemFyZE5ld1Byb2plY3RDcmVhdGlvblBhZ2UgewogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5FV19QUk9KRUNUX1NFVFRJTkdTX1RJVExFID0gIkNyZWF0ZSBhIFBBUiBwcm9qZWN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgTkVXX1BST0pFQ1RfU0VUVElOR1NfVElUTEUgPSAiQ3JlYXRlIGEgUEFSIHByb2plY3QiOwogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE5FV19QUk9KRUNUX1NFVFRJTkdTX0RFU0NSSVBUSU9OID0gIkVudGVyIGEgbmFtZSBhbmQgbG9jYXRpb24gZm9yIHRoZSBQQVIgcHJvamVjdC4iOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBORVdfUFJPSkVDVF9TRVRUSU5HU19ERVNDUklQVElPTiA9ICJFbnRlciBhIG5hbWUgYW5kIGxvY2F0aW9uIGZvciB0aGUgUEFSIHByb2plY3QuIjsKIAotCXByaXZhdGUgZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOworICAgIHByaXZhdGUgZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwogCi0JcHVibGljIE5ld1BhclByb2plY3RTZXR0aW5nc1BhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJc2V0VGl0bGUoTkVXX1BST0pFQ1RfU0VUVElOR1NfVElUTEUpOwotCQlzZXREZXNjcmlwdGlvbihORVdfUFJPSkVDVF9TRVRUSU5HU19ERVNDUklQVElPTik7Ci0JfQorICAgIHB1YmxpYyBOZXdQYXJQcm9qZWN0U2V0dGluZ3NQYWdlKFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7CisgICAgICAgIHN1cGVyKHBhZ2VOYW1lKTsKKyAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247CisgICAgICAgIHNldFRpdGxlKE5FV19QUk9KRUNUX1NFVFRJTkdTX1RJVExFKTsKKyAgICAgICAgc2V0RGVzY3JpcHRpb24oTkVXX1BST0pFQ1RfU0VUVElOR1NfREVTQ1JJUFRJT04pOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWNyZWF0ZVdvcmtpbmdTZXRHcm91cCgoQ29tcG9zaXRlKSBnZXRDb250cm9sKCksIHNlbGVjdGlvbiwKLQkJCQluZXcgU3RyaW5nW10geyAib3JnLmVjbGlwc2UuamR0LnVpLkphdmFXb3JraW5nU2V0UGFnZSIgfSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoZ2V0Q29udHJvbCgpKTsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7CisgICAgICAgIHN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKKyAgICAgICAgY3JlYXRlV29ya2luZ1NldEdyb3VwKChDb21wb3NpdGUpIGdldENvbnRyb2woKSwgdGhpcy5zZWxlY3Rpb24sIG5ldyBTdHJpbmdbXSB7ICJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVdvcmtpbmdTZXRQYWdlIiB9KTsKKyAgICAgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChnZXRDb250cm9sKCkpOworICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9OZXdQYXJQcm9qZWN0V2l6YXJkLmphdmEgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld1BhclByb2plY3RXaXphcmQuamF2YQppbmRleCAyMWMxZjJlLi4wYzA5ZDRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld1BhclByb2plY3RXaXphcmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL05ld1BhclByb2plY3RXaXphcmQuamF2YQpAQCAtOCw2ICs4LDcgQEAKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBTcHJpbmdTb3VyY2UsIGEgZGl2aXNpb24gb2YgVk13YXJlLCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogcGFja2FnZSBvcmcuZWNsaXBzZS52aXJnby5pZGUudWkud2l6YXJkczsKIAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CkBAIC03MSwyMzQgKzcyLDIzMyBAQAogICovCiBwdWJsaWMgY2xhc3MgTmV3UGFyUHJvamVjdFdpemFyZCBleHRlbmRzIEFic3RyYWN0TmV3UGFyUHJvamVjdFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUl9GSUxFX05BTUUgPSAiLnNldHRpbmdzL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUucGFyLnhtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUl9GSUxFX05BTUUgPSAiLnNldHRpbmdzL29yZy5lY2xpcHNlLnZpcmdvLmlkZS5ydW50aW1lLmNvcmUucGFyLnhtbCI7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfVVRGOCA9ICJVVEYtOCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1VURjggPSAiVVRGLTgiOwogCi0JcHJpdmF0ZSBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlIG1haW5QYWdlOworICAgIHByaXZhdGUgV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSBtYWluUGFnZTsKIAotCXByaXZhdGUgTmV3UGFySW5mb3JtYXRpb25QYWdlIGJ1bmRsZVBhZ2U7CisgICAgcHJpdmF0ZSBOZXdQYXJJbmZvcm1hdGlvblBhZ2UgYnVuZGxlUGFnZTsKIAotCXByaXZhdGUgV2l6YXJkTmV3UHJvamVjdFJlZmVyZW5jZVBhZ2UgcmVmZXJlbmNlUGFnZTsKKyAgICBwcml2YXRlIFdpemFyZE5ld1Byb2plY3RSZWZlcmVuY2VQYWdlIHJlZmVyZW5jZVBhZ2U7CiAKLQlwcml2YXRlIElQcm9qZWN0UHJvdmlkZXIgcHJvamVjdFByb3ZpZGVyOworICAgIHByaXZhdGUgSVByb2plY3RQcm92aWRlciBwcm9qZWN0UHJvdmlkZXI7CiAKLQlwcml2YXRlIGZpbmFsIEFic3RyYWN0RmllbGREYXRhIGJ1bmRsZURhdGE7CisgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdEZpZWxkRGF0YSBidW5kbGVEYXRhOwogCi0JcHJpdmF0ZSBmaW5hbCBJRGF0YU1vZGVsIG1vZGVsOworICAgIHByaXZhdGUgZmluYWwgSURhdGFNb2RlbCBtb2RlbDsKIAotCXByaXZhdGUgZmluYWwgU3RyaW5nIHRpdGxlID0gIk5ldyBQQVIgUHJvamVjdCI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGl0bGUgPSAiTmV3IFBBUiBQcm9qZWN0IjsKIAotCXByb3RlY3RlZCBQYXJQYWNrYWdlIHBhclBhY2thZ2UgPSBQYXJQYWNrYWdlLmVJTlNUQU5DRTsKKyAgICBwcm90ZWN0ZWQgUGFyUGFja2FnZSBwYXJQYWNrYWdlID0gUGFyUGFja2FnZS5lSU5TVEFOQ0U7CiAKLQlwcm90ZWN0ZWQgUGFyRmFjdG9yeSBwYXJGYWN0b3J5ID0gcGFyUGFja2FnZS5nZXRQYXJGYWN0b3J5KCk7CisgICAgcHJvdGVjdGVkIFBhckZhY3RvcnkgcGFyRmFjdG9yeSA9IHRoaXMucGFyUGFja2FnZS5nZXRQYXJGYWN0b3J5KCk7CiAKLQlwdWJsaWMgTmV3UGFyUHJvamVjdFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUodGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJYnVuZGxlRGF0YSA9IG5ldyBQbHVnaW5GaWVsZERhdGEoKTsKLQkJbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSmF2YVByb2plY3RGYWNldENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JfQorICAgIHB1YmxpYyBOZXdQYXJQcm9qZWN0V2l6YXJkKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBzZXRXaW5kb3dUaXRsZSh0aGlzLnRpdGxlKTsKKyAgICAgICAgc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7CisgICAgICAgIHRoaXMuYnVuZGxlRGF0YSA9IG5ldyBQbHVnaW5GaWVsZERhdGEoKTsKKyAgICAgICAgdGhpcy5tb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKYXZhUHJvamVjdEZhY2V0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKKyAgICB9CiAKLQlwcml2YXRlIHZvaWQgYWRkRmFjZXRzVG9Qcm9qZWN0KGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXIgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlJRmFjZXRlZFByb2plY3QgZlByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdC5nZXRQcm9qZWN0KCksIHRydWUsIG1vbml0b3IpOworICAgIHByaXZhdGUgdm9pZCBhZGRGYWNldHNUb1Byb2plY3QoZmluYWwgSVByb2plY3QgcHJvamVjdCkgeworICAgICAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlciA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7CiAKLQkJCQkvLyBXU1QgMy4wIG9ubHkKLQkJCQkvLyBmUHJvamVjdC5jcmVhdGVXb3JraW5nQ29weSgpLmFkZFByb2plY3RGYWNldCgKLQkJCQkvLyBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoImpzdC5qYXZhIikuCi0JCQkJLy8gZ2V0TGF0ZXN0VmVyc2lvbigpKTsKLQkJCQkvLyBmUHJvamVjdC5jcmVhdGVXb3JraW5nQ29weSgpLmFkZFByb2plY3RGYWNldCgKLQkJCQkvLyBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRmFjZXRDb3JlUGx1Z2luLgotCQkJCS8vIEJVTkRMRV9GQUNFVF9JRCkuZ2V0TGF0ZXN0VmVyc2lvbigpKTsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgSUZhY2V0ZWRQcm9qZWN0IGZQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QuZ2V0UHJvamVjdCgpLCB0cnVlLCBtb25pdG9yKTsKIAotCQkJCWZQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEZhY2V0Q29yZVBsdWdpbi5QQVJfRkFDRVRfSUQpCi0JCQkJCQkuZ2V0RGVmYXVsdFZlcnNpb24oKSwgbnVsbCwgbW9uaXRvcik7Ci0JCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FKTsKLQkJCQlpZiAocnVudGltZSAhPSBudWxsCi0JCQkJCQkmJiBydW50aW1lLnN1cHBvcnRzKFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChGYWNldENvcmVQbHVnaW4uUEFSX0ZBQ0VUX0lEKSkpIHsKLQkJCQkJZlByb2plY3Quc2V0VGFyZ2V0ZWRSdW50aW1lcyhDb2xsZWN0aW9ucy5zaW5nbGV0b24ocnVudGltZSksIG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQkJfTsKKyAgICAgICAgICAgICAgICAvLyBXU1QgMy4wIG9ubHkKKyAgICAgICAgICAgICAgICAvLyBmUHJvamVjdC5jcmVhdGVXb3JraW5nQ29weSgpLmFkZFByb2plY3RGYWNldCgKKyAgICAgICAgICAgICAgICAvLyBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoImpzdC5qYXZhIikuCisgICAgICAgICAgICAgICAgLy8gZ2V0TGF0ZXN0VmVyc2lvbigpKTsKKyAgICAgICAgICAgICAgICAvLyBmUHJvamVjdC5jcmVhdGVXb3JraW5nQ29weSgpLmFkZFByb2plY3RGYWNldCgKKyAgICAgICAgICAgICAgICAvLyBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRmFjZXRDb3JlUGx1Z2luLgorICAgICAgICAgICAgICAgIC8vIEJVTkRMRV9GQUNFVF9JRCkuZ2V0TGF0ZXN0VmVyc2lvbigpKTsKIAotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wZXIpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVN0YXR1c01hbmFnZXIuZ2V0TWFuYWdlcigpCi0JCQkJCS5oYW5kbGUobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJJZGVVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJIkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgcHJvamVjdCBmYWNldHMuIiwgZSkpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUoCi0JCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBTZXJ2ZXJJZGVVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQkJIkludGVycnVwdGlvbiB3aGlsZSBhZGRpbmcgcHJvamVjdCBmYWNldHMuIiwgZSkpOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgIGZQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEZhY2V0Q29yZVBsdWdpbi5QQVJfRkFDRVRfSUQpLmdldERlZmF1bHRWZXJzaW9uKCksIG51bGwsIG1vbml0b3IpOworICAgICAgICAgICAgICAgIElSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIE5ld1BhclByb2plY3RXaXphcmQudGhpcy5tb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpOworICAgICAgICAgICAgICAgIGlmIChydW50aW1lICE9IG51bGwgJiYgcnVudGltZS5zdXBwb3J0cyhQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRmFjZXRDb3JlUGx1Z2luLlBBUl9GQUNFVF9JRCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZQcm9qZWN0LnNldFRhcmdldGVkUnVudGltZXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJ1bnRpbWUpLCBtb25pdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJbWFpblBhZ2UgPSBuZXcgTmV3UGFyUHJvamVjdFNldHRpbmdzUGFnZSgiYmFzaWNOZXdQcm9qZWN0UGFnZSIsIGdldFNlbGVjdGlvbigpKTsKLQkJc2V0TWFpblBhZ2UobWFpblBhZ2UpOwotCQlhZGRQYWdlKG1haW5QYWdlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBvcGVyKTsKKyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTdGF0dXNNYW5hZ2VyLmdldE1hbmFnZXIoKS5oYW5kbGUobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTZXJ2ZXJJZGVVaVBsdWdpbi5QTFVHSU5fSUQsICJFeGNlcHRpb24gd2hpbGUgYWRkaW5nIHByb2plY3QgZmFjZXRzLiIsIGUpKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RhdHVzTWFuYWdlci5nZXRNYW5hZ2VyKCkuaGFuZGxlKAorICAgICAgICAgICAgICAgIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBTZXJ2ZXJJZGVVaVBsdWdpbi5QTFVHSU5fSUQsICJJbnRlcnJ1cHRpb24gd2hpbGUgYWRkaW5nIHByb2plY3QgZmFjZXRzLiIsIGUpKTsKKyAgICAgICAgfQorICAgIH0KIAotCQlwcm9qZWN0UHJvdmlkZXIgPSBuZXcgSVByb2plY3RQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvblBhdGgoKSB7Ci0JCQkJcmV0dXJuIGdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpOwotCQkJfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgeworICAgICAgICB0aGlzLm1haW5QYWdlID0gbmV3IE5ld1BhclByb2plY3RTZXR0aW5nc1BhZ2UoImJhc2ljTmV3UHJvamVjdFBhZ2UiLCBnZXRTZWxlY3Rpb24oKSk7CisgICAgICAgIHNldE1haW5QYWdlKHRoaXMubWFpblBhZ2UpOworICAgICAgICBhZGRQYWdlKHRoaXMubWFpblBhZ2UpOwogCi0JCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gbWFpblBhZ2UuZ2V0UHJvamVjdEhhbmRsZSgpOwotCQkJfQorICAgICAgICB0aGlzLnByb2plY3RQcm92aWRlciA9IG5ldyBJUHJvamVjdFByb3ZpZGVyKCkgewogCi0JCQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQkJCXJldHVybiBtYWluUGFnZS5nZXRQcm9qZWN0TmFtZSgpOwotCQkJfQotCQl9OworICAgICAgICAgICAgcHVibGljIElQYXRoIGdldExvY2F0aW9uUGF0aCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCk7CisgICAgICAgICAgICB9CiAKLQkJYnVuZGxlUGFnZSA9IG5ldyBOZXdQYXJJbmZvcm1hdGlvblBhZ2UodGl0bGUsIHByb2plY3RQcm92aWRlciwgYnVuZGxlRGF0YSwgbW9kZWwpOwotCQlhZGRQYWdlKGJ1bmRsZVBhZ2UpOworICAgICAgICAgICAgcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5ld1BhclByb2plY3RXaXphcmQudGhpcy5tYWluUGFnZS5nZXRQcm9qZWN0SGFuZGxlKCk7CisgICAgICAgICAgICB9CiAKLQkJLy8gb25seSBhZGQgcGFnZSBpZiB0aGVyZSBhcmUgYWxyZWFkeSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlCi0JCWlmIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkubGVuZ3RoID4gMCkgewotCQkJcmVmZXJlbmNlUGFnZSA9IG5ldyBOZXdQYXJQcm9qZWN0UmVmZXJlbmNlUGFnZSgiYmFzaWNSZWZlcmVuY2VQcm9qZWN0UGFnZSIpOwotCQkJYWRkUGFnZShyZWZlcmVuY2VQYWdlKTsKLQkJfQotCX0KKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5ld1BhclByb2plY3RXaXphcmQudGhpcy5tYWluUGFnZS5nZXRQcm9qZWN0TmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OwogCi0JcHJpdmF0ZSBJRmlsZSBhc3NvY2lhdGVQcm9qZWN0c1RvUGFyKElQcm9qZWN0W10gcmVmZXJlbmNlcywgZmluYWwgSUZpbGUgcGFyRmlsZSkgewotCQkvLyBBZGQgdGhlIGluaXRpYWwgbW9kZWwgb2JqZWN0IHRvIHRoZSBjb250ZW50cy4KLQkJLy8KLQkJZmluYWwgUGFyIHBhciA9IHBhckZhY3RvcnkuY3JlYXRlUGFyKCk7Ci0JCWZvciAoSVByb2plY3Qgd29ya3NwYWNlUHJvamVjdCA6IHJlZmVyZW5jZXMpIHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBwYXJGYWN0b3J5LmNyZWF0ZUJ1bmRsZSgpOwotCQkJYnVuZGxlLnNldFN5bWJvbGljTmFtZShQYXJVdGlscy5nZXRTeW1ib2xpY05hbWUod29ya3NwYWNlUHJvamVjdCkpOwotCQkJcGFyLmdldEJ1bmRsZSgpLmFkZChidW5kbGUpOwotCQl9CisgICAgICAgIHRoaXMuYnVuZGxlUGFnZSA9IG5ldyBOZXdQYXJJbmZvcm1hdGlvblBhZ2UodGhpcy50aXRsZSwgdGhpcy5wcm9qZWN0UHJvdmlkZXIsIHRoaXMuYnVuZGxlRGF0YSwgdGhpcy5tb2RlbCk7CisgICAgICAgIGFkZFBhZ2UodGhpcy5idW5kbGVQYWdlKTsKIAotCQl0cnkgewotCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQkJCQl0cnkgewotCQkJCQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2Ugc2V0Ci0JCQkJCQkvLwotCQkJCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7CisgICAgICAgIC8vIG9ubHkgYWRkIHBhZ2UgaWYgdGhlcmUgYXJlIGFscmVhZHkgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZQorICAgICAgICBpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlUGFnZSA9IG5ldyBOZXdQYXJQcm9qZWN0UmVmZXJlbmNlUGFnZSgiYmFzaWNSZWZlcmVuY2VQcm9qZWN0UGFnZSIpOworICAgICAgICAgICAgYWRkUGFnZSh0aGlzLnJlZmVyZW5jZVBhZ2UpOworICAgICAgICB9CisgICAgfQogCi0JCQkJCQkvLyBHZXQgdGhlIFVSSSBvZiB0aGUgbW9kZWwgZmlsZS4KLQkJCQkJCS8vCi0JCQkJCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIGZpbGVVUkkgPSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoCi0JCQkJCQkJCXBhckZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKTsKKyAgICBwcml2YXRlIElGaWxlIGFzc29jaWF0ZVByb2plY3RzVG9QYXIoSVByb2plY3RbXSByZWZlcmVuY2VzLCBmaW5hbCBJRmlsZSBwYXJGaWxlKSB7CisgICAgICAgIC8vIEFkZCB0aGUgaW5pdGlhbCBtb2RlbCBvYmplY3QgdG8gdGhlIGNvbnRlbnRzLgorICAgICAgICAvLworICAgICAgICBmaW5hbCBQYXIgcGFyID0gdGhpcy5wYXJGYWN0b3J5LmNyZWF0ZVBhcigpOworICAgICAgICBmb3IgKElQcm9qZWN0IHdvcmtzcGFjZVByb2plY3QgOiByZWZlcmVuY2VzKSB7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gdGhpcy5wYXJGYWN0b3J5LmNyZWF0ZUJ1bmRsZSgpOworICAgICAgICAgICAgYnVuZGxlLnNldFN5bWJvbGljTmFtZShQYXJVdGlscy5nZXRTeW1ib2xpY05hbWUod29ya3NwYWNlUHJvamVjdCkpOworICAgICAgICAgICAgcGFyLmdldEJ1bmRsZSgpLmFkZChidW5kbGUpOworICAgICAgICB9CiAKLQkJCQkJCS8vIENyZWF0ZSBhIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCi0JCQkJCQkvLwotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKLQkJCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHBhcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKIAotCQkJCQkJLy8gU2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIHJlc291cmNlIHRvIHRoZSBmaWxlCi0JCQkJCQkvLyBzeXN0ZW0uCi0JCQkJCQkvLwotCQkJCQkJTWFwPE9iamVjdCwgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7Ci0JCQkJCQlvcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsIEVOQ09ESU5HX1VURjgpOwotCQkJCQkJcmVzb3VyY2Uuc2F2ZShvcHRpb25zKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQkJU2VydmVySWRlVWlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZyhleGNlcHRpb24pOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIGZhbHNlLCBvcGVyYXRpb24pOwotCQkJcmV0dXJuIHBhckZpbGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCVNlcnZlcklkZVVpUGx1Z2luLmdldERlZmF1bHQoKS5sb2coZXhjZXB0aW9uKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHJlc291cmNlIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwogCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlJV2l6YXJkUGFnZSBwYWdlID0gZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKTsKLQkJcmV0dXJuIHN1cGVyLmNhbkZpbmlzaCgpICYmIHBhZ2UgIT0gZ2V0TWFpblBhZ2UoKTsKLQl9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIFVSSSBvZiB0aGUgbW9kZWwgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIGZpbGVVUkkgPSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpOwogCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJY3JlYXRlTmV3UHJvamVjdCgpOwotCQlpZiAoZ2V0TmV3UHJvamVjdCgpID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKGZpbGVVUkkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocGFyKTsKIAotCQlidW5kbGVQYWdlLnBlcmZvcm1QYWdlRmluaXNoKCk7Ci0JCWFkZEZhY2V0c1RvUHJvamVjdChnZXROZXdQcm9qZWN0KCkpOwotCQl3cml0ZUJ1bmRsZURhdGEoZ2V0TmV3UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXNvdXJjZSB0byB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3lzdGVtLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxPYmplY3QsIE9iamVjdD4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCBFTkNPRElOR19VVEY4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLnNhdmUob3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlcklkZVVpUGx1Z2luLmdldERlZmF1bHQoKS5sb2coZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzTW9uaXRvci5kb25lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkucnVuKGZhbHNlLCBmYWxzZSwgb3BlcmF0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBwYXJGaWxlOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBTZXJ2ZXJJZGVVaVBsdWdpbi5nZXREZWZhdWx0KCkubG9nKGV4Y2VwdGlvbik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KIAotCQlpZiAocmVmZXJlbmNlUGFnZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdFtdIHJlZmVyZW5jZXMgPSByZWZlcmVuY2VQYWdlLmdldFJlZmVyZW5jZWRQcm9qZWN0cygpOwotCQkJYXNzb2NpYXRlUHJvamVjdHNUb1BhcihyZWZlcmVuY2VzLCBnZXROZXdQcm9qZWN0KCkuZ2V0RmlsZShQQVJfRklMRV9OQU1FKSk7Ci0JCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7CisgICAgICAgIElXaXphcmRQYWdlIHBhZ2UgPSBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpOworICAgICAgICByZXR1cm4gc3VwZXIuY2FuRmluaXNoKCkgJiYgcGFnZSAhPSBnZXRNYWluUGFnZSgpOworICAgIH0KIAotCQlJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzID0gbWFpblBhZ2UuZ2V0U2VsZWN0ZWRXb3JraW5nU2V0cygpOwotCQlpZiAod29ya2luZ1NldHMubGVuZ3RoID4gMCkgewotCQkJZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2luZ1NldE1hbmFnZXIoKS5hZGRUb1dvcmtpbmdTZXRzKGdldE5ld1Byb2plY3QoKSwgd29ya2luZ1NldHMpOwotCQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKKyAgICAgICAgY3JlYXRlTmV3UHJvamVjdCgpOworICAgICAgICBpZiAoZ2V0TmV3UHJvamVjdCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogCi0JCUlGaWxlIG1hbmlmZXN0RmlsZSA9IChJRmlsZSkgZ2V0TmV3UHJvamVjdCgpLmZpbmRNZW1iZXIoIk1FVEEtSU5GL01BTklGRVNULk1GIik7Ci0JCWlmIChtYW5pZmVzdEZpbGUgIT0gbnVsbCkgewotCQkJLy8gU2VsZWN0IHRoZSBuZXcgZmlsZSByZXNvdXJjZSBpbiB0aGUgY3VycmVudCB2aWV3LgotCQkJLy8KLQkJCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWZpbmFsIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKLQkJCWlmIChhY3RpdmVQYXJ0IGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkgewotCQkJCWZpbmFsIElTZWxlY3Rpb24gdGFyZ2V0U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obWFuaWZlc3RGaWxlKTsKLQkJCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkoKElTZXRTZWxlY3Rpb25UYXJnZXQpIGFjdGl2ZVBhcnQpLnNlbGVjdFJldmVhbCh0YXJnZXRTZWxlY3Rpb24pOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9CisgICAgICAgIHRoaXMuYnVuZGxlUGFnZS5wZXJmb3JtUGFnZUZpbmlzaCgpOworICAgICAgICBhZGRGYWNldHNUb1Byb2plY3QoZ2V0TmV3UHJvamVjdCgpKTsKKyAgICAgICAgd3JpdGVCdW5kbGVEYXRhKGdldE5ld1Byb2plY3QoKSk7CiAKLQkJCS8vIE9wZW4gYW4gZWRpdG9yIG9uIHRoZSBuZXcgZmlsZS4KLQkJCS8vCi0JCQl0cnkgewotCQkJCXBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KG1hbmlmZXN0RmlsZSksIFBhck1hbmlmZXN0RWRpdG9yLklEX0VESVRPUik7Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcih3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwgIkVycm9yIG9wZW5pbmcgZWRpdG9yIiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQorICAgICAgICBpZiAodGhpcy5yZWZlcmVuY2VQYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIElQcm9qZWN0W10gcmVmZXJlbmNlcyA9IHRoaXMucmVmZXJlbmNlUGFnZS5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKKyAgICAgICAgICAgIGFzc29jaWF0ZVByb2plY3RzVG9QYXIocmVmZXJlbmNlcywgZ2V0TmV3UHJvamVjdCgpLmdldEZpbGUoUEFSX0ZJTEVfTkFNRSkpOworICAgICAgICB9CiAKLQlwcml2YXRlIHZvaWQgd3JpdGVCdW5kbGVEYXRhKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXIgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlCdW5kbGVNYW5pZmVzdFV0aWxzLmNyZWF0ZU5ld1Bhck1hbmlmZXN0KHByb2plY3QsIGJ1bmRsZURhdGEuZ2V0SWQoKSwgYnVuZGxlRGF0YS5nZXRWZXJzaW9uKCksCi0JCQkJCQlidW5kbGVEYXRhLmdldE5hbWUoKSwgYnVuZGxlRGF0YS5nZXRQcm92aWRlcigpKTsKLQkJCQlwcm9qZWN0LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCQkJfQotCQl9OworICAgICAgICBJV29ya2luZ1NldFtdIHdvcmtpbmdTZXRzID0gdGhpcy5tYWluUGFnZS5nZXRTZWxlY3RlZFdvcmtpbmdTZXRzKCk7CisgICAgICAgIGlmICh3b3JraW5nU2V0cy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBnZXRXb3JrYmVuY2goKS5nZXRXb3JraW5nU2V0TWFuYWdlcigpLmFkZFRvV29ya2luZ1NldHMoZ2V0TmV3UHJvamVjdCgpLCB3b3JraW5nU2V0cyk7CisgICAgICAgIH0KIAotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wZXIpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9CisgICAgICAgIElGaWxlIG1hbmlmZXN0RmlsZSA9IChJRmlsZSkgZ2V0TmV3UHJvamVjdCgpLmZpbmRNZW1iZXIoIk1FVEEtSU5GL01BTklGRVNULk1GIik7CisgICAgICAgIGlmIChtYW5pZmVzdEZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSBuZXcgZmlsZSByZXNvdXJjZSBpbiB0aGUgY3VycmVudCB2aWV3LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CisgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKKyAgICAgICAgICAgIGZpbmFsIElXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBwYWdlLmdldEFjdGl2ZVBhcnQoKTsKKyAgICAgICAgICAgIGlmIChhY3RpdmVQYXJ0IGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkgeworICAgICAgICAgICAgICAgIGZpbmFsIElTZWxlY3Rpb24gdGFyZ2V0U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obWFuaWZlc3RGaWxlKTsKKyAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihTZXJ2ZXJJZGVVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvd2l6YmFuL3dpemJhbi1wYXIucG5nIikpOwotCX0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKChJU2V0U2VsZWN0aW9uVGFyZ2V0KSBhY3RpdmVQYXJ0KS5zZWxlY3RSZXZlYWwodGFyZ2V0U2VsZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPcGVuIGFuIGVkaXRvciBvbiB0aGUgbmV3IGZpbGUuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChtYW5pZmVzdEZpbGUpLCBQYXJNYW5pZmVzdEVkaXRvci5JRF9FRElUT1IpOworICAgICAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgTWVzc2FnZURpYWxvZy5vcGVuRXJyb3Iod29ya2JlbmNoV2luZG93LmdldFNoZWxsKCksICJFcnJvciBvcGVuaW5nIGVkaXRvciIsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZUJ1bmRsZURhdGEoZmluYWwgSVByb2plY3QgcHJvamVjdCkgeworICAgICAgICBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlciA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgQnVuZGxlTWFuaWZlc3RVdGlscy5jcmVhdGVOZXdQYXJNYW5pZmVzdChwcm9qZWN0LCBOZXdQYXJQcm9qZWN0V2l6YXJkLnRoaXMuYnVuZGxlRGF0YS5nZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICBOZXdQYXJQcm9qZWN0V2l6YXJkLnRoaXMuYnVuZGxlRGF0YS5nZXRWZXJzaW9uKCksIE5ld1BhclByb2plY3RXaXphcmQudGhpcy5idW5kbGVEYXRhLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgTmV3UGFyUHJvamVjdFdpemFyZC50aGlzLmJ1bmRsZURhdGEuZ2V0UHJvdmlkZXIoKSk7CisgICAgICAgICAgICAgICAgcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBtb25pdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wZXIpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7CisgICAgICAgIHNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKFNlcnZlcklkZVVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC93aXpiYW4vd2l6YmFuLXBhci5wbmciKSk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL051bGxQcm9wZXJ0aWVzUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9OdWxsUHJvcGVydGllc1BhZ2UuamF2YQppbmRleCAyNmQ1ODA2Li5kZTcxZDJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL051bGxQcm9wZXJ0aWVzUGFnZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvTnVsbFByb3BlcnRpZXNQYWdlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLndpemFyZHM7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTIwLDI1ICsyMSwyNSBAQAogICovCiBwdWJsaWMgY2xhc3MgTnVsbFByb3BlcnRpZXNQYWdlIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0aWVzUGFnZSB7CiAKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBJRF9QQUdFID0gIm51bGwucHJvcGVydGllcyI7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgSURfUEFHRSA9ICJudWxsLnByb3BlcnRpZXMiOwogCi0JcHVibGljIE51bGxQcm9wZXJ0aWVzUGFnZSgpIHsKLQkJc3VwZXIoSURfUEFHRSk7Ci0JfQorICAgIHB1YmxpYyBOdWxsUHJvcGVydGllc1BhZ2UoKSB7CisgICAgICAgIHN1cGVyKElEX1BBR0UpOworICAgIH0KIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb3BlcnRpZXNHcm91cChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIGlnbm9yZQotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9wZXJ0aWVzR3JvdXAoQ29tcG9zaXRlIGNvbnRhaW5lcikgeworICAgICAgICAvLyBpZ25vcmUKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1vZHVsZVR5cGUoKSB7Ci0JCXJldHVybiAiIjsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRNb2R1bGVUeXBlKCkgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL1Byb2plY3RDb250ZW50UGFnZVN0cmluZ3MuamF2YSBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvUHJvamVjdENvbnRlbnRQYWdlU3RyaW5ncy5qYXZhCmluZGV4IGE3YmYwOTMuLjBlNTU3NDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvUHJvamVjdENvbnRlbnRQYWdlU3RyaW5ncy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvUHJvamVjdENvbnRlbnRQYWdlU3RyaW5ncy5qYXZhCkBAIC04LDQ2ICs4LDQ3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLndpemFyZHM7CiAKIC8qKgogICogU3RyaW5ncyB1c2VkIGJ5IGNsYXNzZXMgdGhhdCBleHRlbmQgUHJvamVjdENvbnRlbnRQYWdlCi0gKiAKKyAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBEdXB1aXMKICAqLwogcHVibGljIGNsYXNzIFByb2plY3RDb250ZW50UGFnZVN0cmluZ3MgewogCi0JLy8gUERFVUlNZXNzYWdlcyAobW9kaWZpZWQpCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlX0NvbnRlbnRQYWdlX3RpdGxlID0gIkJ1bmRsZSBDb250ZW50IjsKKyAgICAvLyBQREVVSU1lc3NhZ2VzIChtb2RpZmllZCkKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVfQ29udGVudFBhZ2VfdGl0bGUgPSAiQnVuZGxlIENvbnRlbnQiOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyX0NvbnRlbnRQYWdlX3RpdGxlID0gIlBBUiBDb250ZW50IjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJfQ29udGVudFBhZ2VfdGl0bGUgPSAiUEFSIENvbnRlbnQiOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlX0NvbnRlbnRQYWdlX2Rlc2MgPSAiRW50ZXIgdGhlIGRhdGEgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhlIGJ1bmRsZS4iOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZV9Db250ZW50UGFnZV9kZXNjID0gIkVudGVyIHRoZSBkYXRhIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoZSBidW5kbGUuIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcl9Db250ZW50UGFnZV9kZXNjID0gIkVudGVyIHRoZSBkYXRhIHJlcXVpcmVkIHRvIGdlbmVyYXRlIHRoZSBQQVIuIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJfQ29udGVudFBhZ2VfZGVzYyA9ICJFbnRlciB0aGUgZGF0YSByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGUgUEFSLiI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVfQ29udGVudFBhZ2VfcEdyb3VwID0gIkJ1bmRsZSBQcm9wZXJ0aWVzIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVfQ29udGVudFBhZ2VfcEdyb3VwID0gIkJ1bmRsZSBQcm9wZXJ0aWVzIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcl9Db250ZW50UGFnZV9wR3JvdXAgPSAiUEFSIFByb3BlcnRpZXMiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcl9Db250ZW50UGFnZV9wR3JvdXAgPSAiUEFSIFByb3BlcnRpZXMiOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlX0NvbnRlbnRQYWdlX3BpZCA9ICJCdW5kbGUgU3ltYm9saWMgTmFtZSI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlX0NvbnRlbnRQYWdlX3BpZCA9ICJCdW5kbGUgU3ltYm9saWMgTmFtZSI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJfQ29udGVudFBhZ2VfcGlkID0gIkFwcGxpY2F0aW9uIFN5bWJvbGljIE5hbWUiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcl9Db250ZW50UGFnZV9waWQgPSAiQXBwbGljYXRpb24gU3ltYm9saWMgTmFtZSI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVfQ29udGVudFBhZ2VfcHZlcnNpb24gPSAiQnVuZGxlIFZlcnNpb24iOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZV9Db250ZW50UGFnZV9wdmVyc2lvbiA9ICJCdW5kbGUgVmVyc2lvbiI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJfQ29udGVudFBhZ2VfcHZlcnNpb24gPSAiQXBwbGljYXRpb24gVmVyc2lvbiI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyX0NvbnRlbnRQYWdlX3B2ZXJzaW9uID0gIkFwcGxpY2F0aW9uIFZlcnNpb24iOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlX0NvbnRlbnRQYWdlX3BuYW1lID0gIkJ1bmRsZSBOYW1lIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVfQ29udGVudFBhZ2VfcG5hbWUgPSAiQnVuZGxlIE5hbWUiOwogCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyX0NvbnRlbnRQYWdlX3BuYW1lID0gIkFwcGxpY2F0aW9uIE5hbWUiOworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcl9Db250ZW50UGFnZV9wbmFtZSA9ICJBcHBsaWNhdGlvbiBOYW1lIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZV9Db250ZW50UGFnZV9wcHJvdmlkZXIgPSAiQnVuZGxlIERlc2NyaXB0aW9uIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVfQ29udGVudFBhZ2VfcHByb3ZpZGVyID0gIkJ1bmRsZSBEZXNjcmlwdGlvbiI7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJfQ29udGVudFBhZ2VfcHByb3ZpZGVyID0gIkFwcGxpY2F0aW9uIERlc2NyaXB0aW9uIjsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJfQ29udGVudFBhZ2VfcHByb3ZpZGVyID0gIkFwcGxpY2F0aW9uIERlc2NyaXB0aW9uIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1bmRsZV9Db250ZW50UGFnZV9wbHVnaW4gPSAiezB9IEJ1bmRsZSI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQnVuZGxlX0NvbnRlbnRQYWdlX3BsdWdpbiA9ICJ7MH0gQnVuZGxlIjsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhcl9Db250ZW50UGFnZV9wbHVnaW4gPSAiezB9IFBBUiI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyX0NvbnRlbnRQYWdlX3BsdWdpbiA9ICJ7MH0gUEFSIjsKIAogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9XZWJNb2R1bGVQcm9wZXJ0aWVzUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpL3NyYy9vcmcvZWNsaXBzZS92aXJnby9pZGUvdWkvd2l6YXJkcy9XZWJNb2R1bGVQcm9wZXJ0aWVzUGFnZS5qYXZhCmluZGV4IDUwZWFkY2MuLmVhNTliY2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLnZpcmdvLmlkZS51aS9zcmMvb3JnL2VjbGlwc2UvdmlyZ28vaWRlL3VpL3dpemFyZHMvV2ViTW9kdWxlUHJvcGVydGllc1BhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS52aXJnby5pZGUudWkvc3JjL29yZy9lY2xpcHNlL3ZpcmdvL2lkZS91aS93aXphcmRzL1dlYk1vZHVsZVByb3BlcnRpZXNQYWdlLmphdmEKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgU3ByaW5nU291cmNlLCBhIGRpdmlzaW9uIG9mIFZNd2FyZSwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UudmlyZ28uaWRlLnVpLndpemFyZHM7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTI4LDQ0ICsyOSw0MCBAQAogICovCiBwdWJsaWMgY2xhc3MgV2ViTW9kdWxlUHJvcGVydGllc1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnRpZXNQYWdlIHsKIAotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIElEX1BBR0UgPSAid2ViLnByb3BlcnRpZXMiOworICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIElEX1BBR0UgPSAid2ViLnByb3BlcnRpZXMiOwogCi0JcHJpdmF0ZSBMYWJlbCBjb250ZXh0UGF0aExhYmVsOworICAgIHByaXZhdGUgTGFiZWwgY29udGV4dFBhdGhMYWJlbDsKIAotCXByaXZhdGUgVGV4dCBjb250ZXh0UGF0aFRleHQ7CisgICAgcHJpdmF0ZSBUZXh0IGNvbnRleHRQYXRoVGV4dDsKIAotCXB1YmxpYyBXZWJNb2R1bGVQcm9wZXJ0aWVzUGFnZSgpIHsKLQkJc3VwZXIoSURfUEFHRSk7Ci0JfQorICAgIHB1YmxpYyBXZWJNb2R1bGVQcm9wZXJ0aWVzUGFnZSgpIHsKKyAgICAgICAgc3VwZXIoSURfUEFHRSk7CisgICAgfQogCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvcGVydGllc0dyb3VwKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JvdXAgcHJvcGVydGllc0dyb3VwID0gbmV3IEdyb3VwKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlwcm9wZXJ0aWVzR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXByb3BlcnRpZXNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHJvcGVydGllc0dyb3VwLnNldFRleHQoIldlYiBNb2R1bGUgUHJvcGVydGllcyIpOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb3BlcnRpZXNHcm91cChDb21wb3NpdGUgY29udGFpbmVyKSB7CisgICAgICAgIEdyb3VwIHByb3BlcnRpZXNHcm91cCA9IG5ldyBHcm91cChjb250YWluZXIsIFNXVC5OT05FKTsKKyAgICAgICAgcHJvcGVydGllc0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOworICAgICAgICBwcm9wZXJ0aWVzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CisgICAgICAgIHByb3BlcnRpZXNHcm91cC5zZXRUZXh0KCJXZWIgTW9kdWxlIFByb3BlcnRpZXMiKTsKIAotCQljb250ZXh0UGF0aExhYmVsID0gbmV3IExhYmVsKHByb3BlcnRpZXNHcm91cCwgU1dULk5PTkUpOwotCQljb250ZXh0UGF0aExhYmVsLnNldFRleHQoIldlYi1Db250ZXh0UGF0aCIpOworICAgICAgICB0aGlzLmNvbnRleHRQYXRoTGFiZWwgPSBuZXcgTGFiZWwocHJvcGVydGllc0dyb3VwLCBTV1QuTk9ORSk7CisgICAgICAgIHRoaXMuY29udGV4dFBhdGhMYWJlbC5zZXRUZXh0KCJXZWItQ29udGV4dFBhdGgiKTsKIAotCQljb250ZXh0UGF0aFRleHQgPSBuZXcgVGV4dChwcm9wZXJ0aWVzR3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpCi0JCQkJLmFsaWduKFNXVC5GSUxMLCBTV1QuQ0VOVEVSKQotCQkJCS5ncmFiKHRydWUsIGZhbHNlKQotCQkJCS5zcGFuKDIsIDEpCi0JCQkJLmFwcGx5VG8oY29udGV4dFBhdGhUZXh0KTsKLQl9CisgICAgICAgIHRoaXMuY29udGV4dFBhdGhUZXh0ID0gbmV3IFRleHQocHJvcGVydGllc0dyb3VwLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7CisgICAgICAgIEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5hbGlnbihTV1QuRklMTCwgU1dULkNFTlRFUikuZ3JhYih0cnVlLCBmYWxzZSkuc3BhbigyLCAxKS5hcHBseVRvKHRoaXMuY29udGV4dFBhdGhUZXh0KTsKKyAgICB9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQcm9wZXJ0aWVzKCkgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJcHJvcGVydGllcy5wdXQoY29udGV4dFBhdGhMYWJlbC5nZXRUZXh0KCksIGNvbnRleHRQYXRoVGV4dC5nZXRUZXh0KCkpOwotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIHByb3BlcnRpZXMucHV0KHRoaXMuY29udGV4dFBhdGhMYWJlbC5nZXRUZXh0KCksIHRoaXMuY29udGV4dFBhdGhUZXh0LmdldFRleHQoKSk7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOworICAgIH0KIAotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlVHlwZSgpIHsKLQkJcmV0dXJuICJXZWIiOwotCX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1vZHVsZVR5cGUoKSB7CisgICAgICAgIHJldHVybiAiV2ViIjsKKyAgICB9CiAKIH0K