LyoKICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCiAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy52ZnM7CgppbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5OwppbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CmltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKCmltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMudmZzLm9wZXJhdGlvbnMuRmlsZU9wZXJhdGlvblByb3ZpZGVyOwoKLyoqCiAqIEEgRmlsZVN5c3RlbU1hbmFnZXIgbWFuYWdlcyBhIHNldCBvZiBmaWxlIHN5c3RlbXMuICBUaGlzIGludGVyZmFjZSBpcwogKiB1c2VkIHRvIGxvY2F0ZSBhIHtAbGluayBGaWxlT2JqZWN0fSBieSBuYW1lIGZyb20gb25lIG9mIHRob3NlIGZpbGUgc3lzdGVtcy4KICogPHAvPgogKiA8cD5UbyBsb2NhdGUgYSB7QGxpbmsgRmlsZU9iamVjdH0sIHVzZSBvbmUgb2YgdGhlIDxjb2RlPnJlc29sdmVGaWxlKCk8L2NvZGU+CiAqIG1ldGhvZHMuPC9wPgogKiA8cC8+CiAqIDxoND48YSBuYW1lPSJuYW1pbmciPkZpbGUgTmFtaW5nPC9hPjwvaDQ+CiAqIDxwLz4KICogPHA+QSBmaWxlIHN5c3RlbSBtYW5hZ2VyIGNhbiByZWNvZ25pc2Ugc2V2ZXJhbCB0eXBlcyBvZiBmaWxlIG5hbWVzOgogKiA8cC8+CiAqIDx1bD4KICogPHAvPgogKiA8bGk+PHA+QWJzb2x1dGUgVVJJLiAgVGhlc2UgbXVzdCBzdGFydCB3aXRoIGEgc2NoZW1lLCBzdWNoIGFzCiAqIDxjb2RlPmZpbGU6PC9jb2RlPiBvciA8Y29kZT5mdHA6PC9jb2RlPiwgZm9sbG93ZWQgYnkgYSBzY2hlbWUgZGVwZW5kZW50CiAqIGZpbGUgbmFtZS4gIFNvbWUgZXhhbXBsZXM6PC9wPgogKiA8cHJlPgogKiBmaWxlOi9jOi9zb21lZmlsZQogKiBmdHA6Ly9zb21ld2hlcmUub3JnL3NvbWVmaWxlCiAqIDwvcHJlPgogKiA8cC8+CiAqIDxsaT48cD5BYnNvbHV0ZSBsb2NhbCBmaWxlIG5hbWUuICBGb3IgZXhhbXBsZSwKICogPGNvZGU+L2hvbWUvc29tZXVzZXIvYS1maWxlPC9jb2RlPiBvciA8Y29kZT5jOlxkaXJcc29tZWZpbGUuaHRtbDwvY29kZT4uCiAqIEVsZW1lbnRzIGluIHRoZSBuYW1lIGNhbiBiZSBzZXBhcmF0ZWQgdXNpbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcKICogY2hhcmFjdGVyczogPGNvZGU+LzwvY29kZT4sIDxjb2RlPlw8L2NvZGU+LCBvciB0aGUgbmF0aXZlIGZpbGUgc2VwYXJhdG9yCiAqIGNoYXJhY3Rlci4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZmlsZSBuYW1lcyBhcmUgdGhlIHNhbWU6PC9wPgogKiA8cHJlPgogKiBjOlxzb21lZGlyXHNvbWVmaWxlLnhtbAogKiBjOi9zb21lZGlyL3NvbWVmaWxlLnhtbAogKiA8L3ByZT4KICogPHAvPgogKiA8bGk+PHA+UmVsYXRpdmUgcGF0aC4gIEZvciBleGFtcGxlOiA8Y29kZT4uLi9zb21lZmlsZTwvY29kZT4gb3IKICogPGNvZGU+c29tZWRpci9maWxlLnR4dDwvY29kZT4uICAgVGhlIGZpbGUgc3lzdGVtIG1hbmFnZXIgcmVzb2x2ZXMgcmVsYXRpdmUKICogcGF0aHMgYWdhaW5zdCBpdHMgPGk+YmFzZSBmaWxlPC9pPi4gIEVsZW1lbnRzIGluIHRoZSByZWxhdGl2ZSBwYXRoIGNhbiBiZQogKiBzZXBhcmF0ZWQgdXNpbmcgPGNvZGU+LzwvY29kZT4sIDxjb2RlPlw8L2NvZGU+LCBvciBmaWxlIHN5c3RlbSBzcGVjaWZpYwogKiBzZXBhcmF0b3IgY2hhcmFjdGVycy4gIFJlbGF0aXZlIHBhdGhzIG1heSBhbHNvIGNvbnRhaW4gPGNvZGU+Li48L2NvZGU+IGFuZAogKiA8Y29kZT4uPC9jb2RlPiBlbGVtZW50cy4gIFNlZSB7QGxpbmsgRmlsZU9iamVjdCNyZXNvbHZlRmlsZX0gZm9yIG1vcmUKICogZGV0YWlscy48L3A+CiAqIDxwLz4KICogPC91bD4KICoKICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YWRhbW11cmRvY2hAYXBhY2hlLm9yZyI+QWRhbSBNdXJkb2NoPC9hPgogKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAogKi8KcHVibGljIGludGVyZmFjZSBGaWxlU3lzdGVtTWFuYWdlcgp7CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGJhc2UgZmlsZSB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUgcGF0aHMuCiAgICAgKiBAcmV0dXJuIFRoZSBiYXNlIEZpbGVPYmplY3QuCiAgICAgKiBAdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgogICAgICovCiAgICBGaWxlT2JqZWN0IGdldEJhc2VGaWxlKCkgdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBMb2NhdGVzIGEgZmlsZSBieSBuYW1lLiAgRXF1aXZhbGVudCB0byBjYWxsaW5nCiAgICAgKiA8Y29kZT5yZXNvbHZlRmlsZSh1cmksIGdldEJhc2VOYW1lKCkpPC9jb2RlPi4KICAgICAqCiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZS4KICAgICAqIEByZXR1cm4gVGhlIGZpbGUuICBOZXZlciByZXR1cm5zIG51bGwuCiAgICAgKiBAdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb24gT24gZXJyb3IgcGFyc2luZyB0aGUgZmlsZSBuYW1lLgogICAgICovCiAgICBGaWxlT2JqZWN0IHJlc29sdmVGaWxlKFN0cmluZyBuYW1lKSB0aHJvd3MgRmlsZVN5c3RlbUV4Y2VwdGlvbjsKCiAgICAvKioKICAgICAqIExvY2F0ZXMgYSBmaWxlIGJ5IG5hbWUuICBFcXVpdmFsZW50IHRvIGNhbGxpbmcKICAgICAqIDxjb2RlPnJlc29sdmVGaWxlKHVyaSwgZ2V0QmFzZU5hbWUoKSk8L2NvZGU+LgogICAgICoKICAgICAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZmlsZS4KICAgICAqIEBwYXJhbSBmaWxlU3lzdGVtT3B0aW9ucyBUaGUgRmlsZVN5c3RlbU9wdGlvbnMgdXNlZCBmb3IgRmlsZVN5c3RlbSBjcmVhdGlvbgogICAgICogQHJldHVybiBUaGUgZmlsZS4gIE5ldmVyIHJldHVybnMgbnVsbC4KICAgICAqIEB0aHJvd3MgRmlsZVN5c3RlbUV4Y2VwdGlvbiBPbiBlcnJvciBwYXJzaW5nIHRoZSBmaWxlIG5hbWUuCiAgICAgKi8KICAgIEZpbGVPYmplY3QgcmVzb2x2ZUZpbGUoU3RyaW5nIG5hbWUsIEZpbGVTeXN0ZW1PcHRpb25zIGZpbGVTeXN0ZW1PcHRpb25zKQogICAgICAgIHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uOwoKICAgIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCnCiAgICAgKiBMb2NhdGVzIGEgZmlsZSBieSBuYW1lLiAgVGhlIG5hbWUgaXMgcmVzb2x2ZWQgYXMgZGVzY3JpYmVkCiAgICAgKiA8YSBocmVmPSIjbmFtaW5nIj5hYm92ZTwvYT4uICBUaGF0IGlzLCB0aGUgbmFtZSBjYW4gYmUgZWl0aGVyCiAgICAgKiBhbiBhYnNvbHV0ZSBVUkksIGFuIGFic29sdXRlIGZpbGUgbmFtZSwgb3IgYSByZWxhdGl2ZSBwYXRoIHRvCiAgICAgKiBiZSByZXNvbHZlZCBhZ2FpbnN0IDxjb2RlPmJhc2VGaWxlPC9jb2RlPi4KICAgICAqIDxwLz4KICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgZmlsZSBkb2VzIG5vdCBoYXZlIHRvIGV4aXN0IHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgogICAgICoKICAgICAqIEBwYXJhbSBuYW1lICAgICBUaGUgbmFtZSBvZiB0aGUgZmlsZS4KICAgICAqIEBwYXJhbSBiYXNlRmlsZSBUaGUgYmFzZSBmaWxlIHRvIHVzZSB0byByZXNvbHZlIHJlbGF0aXZlIHBhdGhzLgogICAgICogICAgICAgICAgICAgICAgIE1heSBiZSBudWxsLgogICAgICogQHJldHVybiBUaGUgZmlsZS4gIE5ldmVyIHJldHVybnMgbnVsbC4KICAgICAqIEB0aHJvd3MgRmlsZVN5c3RlbUV4Y2VwdGlvbiBPbiBlcnJvciBwYXJzaW5nIHRoZSBmaWxlIG5hbWUuCiAgICAgKi8KICAgIEZpbGVPYmplY3QgcmVzb2x2ZUZpbGUoRmlsZU9iamVjdCBiYXNlRmlsZSwgU3RyaW5nIG5hbWUpIHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uOwoKICAgIC8qKgogICAgICogTG9jYXRlcyBhIGZpbGUgYnkgbmFtZS4gIFNlZSB7QGxpbmsgI3Jlc29sdmVGaWxlKEZpbGVPYmplY3QsIFN0cmluZyl9CiAgICAgKiBmb3IgZGV0YWlscy4KICAgICAqCiAgICAgKiBAcGFyYW0gYmFzZUZpbGUgVGhlIGJhc2UgZmlsZSB0byB1c2UgdG8gcmVzb2x2ZSByZWxhdGl2ZSBwYXRocy4KICAgICAqICAgICAgICAgICAgICAgICBNYXkgYmUgbnVsbC4KICAgICAqIEBwYXJhbSBuYW1lICAgICBUaGUgbmFtZSBvZiB0aGUgZmlsZS4KICAgICAqIEByZXR1cm4gVGhlIGZpbGUuICBOZXZlciByZXR1cm5zIG51bGwuCiAgICAgKiBAdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb24gT24gZXJyb3IgcGFyc2luZyB0aGUgZmlsZSBuYW1lLgogICAgICovCiAgICBGaWxlT2JqZWN0IHJlc29sdmVGaWxlKEZpbGUgYmFzZUZpbGUsIFN0cmluZyBuYW1lKSB0aHJvd3MgRmlsZVN5c3RlbUV4Y2VwdGlvbjsKCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgbmFtZSwgcmVsYXRpdmUgdG8gdGhpcyBmaWxlIG5hbWUuICBFcXVpdmFsZW50IHRvIGNhbGxpbmcKICAgICAqIDxjb2RlPnJlc29sdmVOYW1lKCBwYXRoLCBOYW1lU2NvcGUuRklMRV9TWVNURU0gKTwvY29kZT4uCiAgICAgKgogICAgICogQHBhcmFtIHJvb3QgdGhlIGJhc2UgZmlsZW5hbWUKICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHJlc29sdmUuCiAgICAgKiBAcmV0dXJuIEEge0BsaW5rIEZpbGVOYW1lfSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXNvbHZlZCBmaWxlIG5hbWUuCiAgICAgKiBAdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb24gSWYgdGhlIG5hbWUgaXMgaW52YWxpZC4KICAgICAqLwogICAgRmlsZU5hbWUgcmVzb2x2ZU5hbWUoZmluYWwgRmlsZU5hbWUgcm9vdCwgZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uOwoKICAgIC8qKgogICAgICogUmVzb2x2ZXMgYSBuYW1lLCByZWxhdGl2ZSB0byB0aGUgInJvb3QiIGZpbGUgbmFtZS4gIFJlZmVyIHRvIHtAbGluayBOYW1lU2NvcGV9CiAgICAgKiBmb3IgYSBkZXNjcmlwdGlvbiBvZiBob3cgbmFtZXMgYXJlIHJlc29sdmVkLgogICAgICoKICAgICAqIEBwYXJhbSByb290IHRoZSBiYXNlIGZpbGVuYW1lCiAgICAgKiBAcGFyYW0gbmFtZSAgVGhlIG5hbWUgdG8gcmVzb2x2ZS4KICAgICAqIEBwYXJhbSBzY29wZSBUaGUge0BsaW5rIE5hbWVTY29wZX0gdG8gdXNlIHdoZW4gcmVzb2x2aW5nIHRoZSBuYW1lLgogICAgICogQHJldHVybiBBIHtAbGluayBGaWxlTmFtZX0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVzb2x2ZWQgZmlsZSBuYW1lLgogICAgICogQHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uIElmIHRoZSBuYW1lIGlzIGludmFsaWQuCiAgICAgKi8KICAgIEZpbGVOYW1lIHJlc29sdmVOYW1lKGZpbmFsIEZpbGVOYW1lIHJvb3QsIFN0cmluZyBuYW1lLCBOYW1lU2NvcGUgc2NvcGUpCiAgICAgICAgdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBhIGxvY2FsIGZpbGUgaW50byBhIHtAbGluayBGaWxlT2JqZWN0fS4KICAgICAqCiAgICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBjb252ZXJ0LgogICAgICogQHJldHVybiBUaGUge0BsaW5rIEZpbGVPYmplY3R9IHRoYXQgcmVwcmVzZW50cyB0aGUgbG9jYWwgZmlsZS4gIE5ldmVyCiAgICAgKiAgICAgICAgIHJldHVybnMgbnVsbC4KICAgICAqIEB0aHJvd3MgRmlsZVN5c3RlbUV4Y2VwdGlvbiBPbiBlcnJvciBjb252ZXJ0aW5nIHRoZSBmaWxlLgogICAgICovCiAgICBGaWxlT2JqZWN0IHRvRmlsZU9iamVjdChGaWxlIGZpbGUpIHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGxheWVyZWQgZmlsZSBzeXN0ZW0uICBBIGxheWVyZWQgZmlsZSBzeXN0ZW0gaXMgYSBmaWxlIHN5c3RlbQogICAgICogdGhhdCBpcyBjcmVhdGVkIGZyb20gdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSwgc3VjaCBhcyBhIHppcCBvciB0YXIgZmlsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIG5hbWUgb2YgdGhlIGZpbGUgc3lzdGVtIHByb3ZpZGVyIHRvIHVzZS4gIFRoaXMgbmFtZQogICAgICogICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSBzY2hlbWUgdXNlZCBpbiBVUkkgdG8gaWRlbnRpZnkgdGhlIHByb3ZpZGVyLgogICAgICogQHBhcmFtIGZpbGUgICAgIFRoZSBmaWxlIHRvIHVzZSB0byBjcmVhdGUgdGhlIGZpbGUgc3lzdGVtLgogICAgICogQHJldHVybiBUaGUgcm9vdCBmaWxlIG9mIHRoZSBuZXcgZmlsZSBzeXN0ZW0uCiAgICAgKiBAdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb24gT24gZXJyb3IgY3JlYXRpbmcgdGhlIGZpbGUgc3lzdGVtLgogICAgICovCiAgICBGaWxlT2JqZWN0IGNyZWF0ZUZpbGVTeXN0ZW0oU3RyaW5nIHByb3ZpZGVyLCBGaWxlT2JqZWN0IGZpbGUpCiAgICAgICAgdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBDbG9zZXMgdGhlIGdpdmVuIGZpbGVzeXN0ZW0uPGJyIC8+CiAgICAgKiBJZiB5b3UgdXNlIFZGUyBhcyBzaW5nbGV0b24gaXQgaXMgVkVSWSBkYW5nZXJvdXMgdG8gY2FsbCB0aGlzIG1ldGhvZC4KICAgICAqIEBwYXJhbSBmaWxlc3lzdGVtIFRoZSBGaWxlU3lzdGVtIHRvIGNsb3NlLgogICAgICovCiAgICB2b2lkIGNsb3NlRmlsZVN5c3RlbShGaWxlU3lzdGVtIGZpbGVzeXN0ZW0pOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGxheWVyZWQgZmlsZSBzeXN0ZW0uICBBIGxheWVyZWQgZmlsZSBzeXN0ZW0gaXMgYSBmaWxlIHN5c3RlbQogICAgICogdGhhdCBpcyBjcmVhdGVkIGZyb20gdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSwgc3VjaCBhcyBhIHppcCBvciB0YXIgZmlsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byB1c2UgdG8gY3JlYXRlIHRoZSBmaWxlIHN5c3RlbS4KICAgICAqIEByZXR1cm4gVGhlIHJvb3QgZmlsZSBvZiB0aGUgbmV3IGZpbGUgc3lzdGVtLgogICAgICogQHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uIE9uIGVycm9yIGNyZWF0aW5nIHRoZSBmaWxlIHN5c3RlbS4KICAgICAqLwogICAgRmlsZU9iamVjdCBjcmVhdGVGaWxlU3lzdGVtKEZpbGVPYmplY3QgZmlsZSkgdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IHZpcnR1YWwgZmlsZSBzeXN0ZW0uICBDYW4gYmUgcG9wdWxhdGVkIGJ5IGFkZGluZwogICAgICoganVuY3Rpb25zIHRvIGl0LgogICAgICoKICAgICAqIEBwYXJhbSByb290VXJpIFRoZSByb290IFVSSSB0byB1c2UgZm9yIHRoZSBuZXcgZmlsZSBzeXN0ZW0uICBDYW4gYmUgbnVsbC4KICAgICAqIEByZXR1cm4gVGhlIHJvb3QgZmlsZSBvZiB0aGUgbmV3IGZpbGUgc3lzdGVtLgogICAgICogQHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgVmlydHVhbEZpbGVTeXN0ZW0uCiAgICAgKi8KICAgIEZpbGVPYmplY3QgY3JlYXRlVmlydHVhbEZpbGVTeXN0ZW0oU3RyaW5nIHJvb3RVcmkpIHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIHZpcnR1YWwgZmlsZSBzeXN0ZW0uICBUaGUgZmlsZSBzeXN0ZW0gd2lsbCBjb250YWluIGEganVuY3Rpb24KICAgICAqIGF0IHRoZSBmcyByb290IHRvIHRoZSBzdXBwbGllZCByb290IGZpbGUuCiAgICAgKgogICAgICogQHBhcmFtIHJvb3RGaWxlIFRoZSByb290IGZpbGUgdG8gYmFja3MgdGhlIGZpbGUgc3lzdGVtLgogICAgICogQHJldHVybiBUaGUgcm9vdCBvZiB0aGUgbmV3IGZpbGUgc3lzdGVtLgogICAgICogQHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgVmlydHVhbEZpbGVTeXN0ZW0uCiAgICAgKi8KICAgIEZpbGVPYmplY3QgY3JlYXRlVmlydHVhbEZpbGVTeXN0ZW0oRmlsZU9iamVjdCByb290RmlsZSkgdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RyZWFtaGFuZGxlciBmYWN0b3J5IHRvIGVuYWJsZSBVUkwgbG9va3VwIHVzaW5nIHRoaXMKICAgICAqIEZpbGVTeXN0ZW1NYW5hZ2VyLgogICAgICogQHJldHVybiB0aGUgVVJMU3RyZWFtSGFuZGxlckZhY3RvcnkuCiAgICAgKi8KICAgIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5IGdldFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5KCk7CgogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIGlmIGEgbGF5ZXJlZCBmaWxlIHN5c3RlbSBjYW4gYmUgY3JlYXRlZCBmb3IgYSBnaXZlbiBmaWxlLgogICAgICoKICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIGNoZWNrIGZvci4KICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRmlsZVN5c3RlbSBjYW4gYmUgY3JlYXRlZC4KICAgICAqIEB0aHJvd3MgRmlsZVN5c3RlbUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCiAgICAgKi8KICAgIGJvb2xlYW4gY2FuQ3JlYXRlRmlsZVN5c3RlbShGaWxlT2JqZWN0IGZpbGUpIHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uOwoKICAgIC8qKgogICAgICogR2V0IHRoZSBjYWNoZSB1c2VkIHRvIGNhY2hlIGZpbGVvYmplY3RzLgogICAgICogQHJldHVybiBUaGUgRmlsZXNDYWNoZS4KICAgICAqLwogICAgRmlsZXNDYWNoZSBnZXRGaWxlc0NhY2hlKCk7CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGNhY2hlIHN0cmF0ZWd5IHVzZWQuCiAgICAgKiBAcmV0dXJuIHRoZSBDYWNoZVN0cmF0ZWd5LgogICAgICovCiAgICBDYWNoZVN0cmF0ZWd5IGdldENhY2hlU3RyYXRlZ3koKTsKCiAgICAvKioKICAgICAqIEdldCB0aGUgZmlsZSBvYmplY3QgZGVjb3JhdG9yIHVzZWQuCiAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIG9iamVjdCBkZWNvcmF0b3IgQ2xhc3MuCiAgICAgKi8KICAgIENsYXNzIGdldEZpbGVPYmplY3REZWNvcmF0b3IoKTsKCiAgICAvKioKICAgICAqIFRoZSBjb25zdHJ1Y3RvciBhc3NvY2lhdGVkIHRvIHRoZSBmaWxlT2JqZWN0RGVjb3JhdG9yLgogICAgICogV2UgY2FjaGUgaXQgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KICAgICAqIEByZXR1cm4gdGhlIENvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgRmlsZU9iamVjdERlY29yYXRvci4KICAgICAqLwogICAgQ29uc3RydWN0b3IgZ2V0RmlsZU9iamVjdERlY29yYXRvckNvbnN0KCk7CgogICAgLyoqCiAgICAgKiBUaGUgY2xhc3MgdG8gdXNlIHRvIGRldGVybWluZSB0aGUgY29udGVudC10eXBlIChtaW1lLXR5cGUpLgogICAgICogQHJldHVybiB0aGUgRmlsZUNvbnRlbnRJbmZvRmFjdG9yeS4KICAgICAqLwogICAgRmlsZUNvbnRlbnRJbmZvRmFjdG9yeSBnZXRGaWxlQ29udGVudEluZm9GYWN0b3J5KCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBtYW5hZ2VyIGhhcyBhIHByb3ZpZGVyIGZvciBhIHBhcnRpY3VsYXIgc2NoZW1lLgogICAgICogQHBhcmFtIHNjaGVtZSBUaGUgc2NoZW1lIGZvciB3aGljaCBhIHByb3ZpZGVyIHNob3VsZCBiZSBjaGVja2VkLgogICAgICogQHJldHVybiB0cnVlIGlmIGEgcHJvdmlkZXIgZm9yIHRoZSBzY2hlbWUgaXMgYXZhaWxhYmxlLgogICAgICovCiAgICBib29sZWFuIGhhc1Byb3ZpZGVyKGZpbmFsIFN0cmluZyBzY2hlbWUpOwoKICAgIC8qKgogICAgICogR2V0IHRoZSBzY2hlbWVzIGN1cnJlbnRseSBhdmFpbGFibGUuCiAgICAgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGF2YWlsYWJsZSBzY2hlbWUgbmFtZXMgdGhhdCBhcmUgc3VwcG9ydGVkLgogICAgICovCiAgICBTdHJpbmdbXSBnZXRTY2hlbWVzKCk7CgogICAgLyoqCiAgICAgKiBHZXQgdGhlIGNhcGFiaWxpdGllcyBmb3IgYSBnaXZlbiBzY2hlbWUuCiAgICAgKgogICAgICogQHBhcmFtIHNjaGVtZSBUaGUgc2NoZW1lIHRvIHVzZSB0byBsb2NhdGUgdGhlIHByb3ZpZGVyJ3MgY2FwYWJpbGl0aWVzLgogICAgICogQHJldHVybiBBIENvbGxlY3Rpb24gb2YgdGhlIHZhcmlvdXMgY2FwYWJpbGl0aWVzLgogICAgICogQHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uIGlmIHRoZSBnaXZlbiBzY2hlbWUgaXMgbm90IGtvbnduLgogICAgICovCiAgICBDb2xsZWN0aW9uIGdldFByb3ZpZGVyQ2FwYWJpbGl0aWVzKGZpbmFsIFN0cmluZyBzY2hlbWUpIHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uOwoKICAgIC8qKgogICAgICogU2V0cyB0aGUgbG9nZ2VyIHRvIHVzZS4KICAgICAqIEBwYXJhbSBsb2cgVGhlIGxvZ2dlciB0byB1c2UuCiAgICAgKi8KICAgIHZvaWQgc2V0TG9nZ2VyKGZpbmFsIExvZyBsb2cpOwoKICAgIC8qKgogICAgICogR2V0IHRoZSBjb25maWd1cmF0aW9uIGJ1aWxkZXIgZm9yIHRoZSBnaXZlbiBzY2hlbWUuCiAgICAgKgogICAgICogQHBhcmFtIHNjaGVtZSBUaGUgc2NoZW0gdG8gdXNlIHRvIG9idGFpbiB0aGUgRmlsZVN5c3RlbUNvbmZpZ0J1aWRsZXIuCiAgICAgKiBAcmV0dXJuIEEgRmlsZVN5c3RlbUNvbmZpZ0J1aWxkZXIgYXBwcm9wcmlhdGUgZm9yIHRoZSBnaXZlbiBzY2hlbWUuCiAgICAgKiBAdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb24gaWYgdGhlIGdpdmVuIHNjaGVtZSBpcyBub3Qga29ud24uCiAgICAgKi8KICAgIEZpbGVTeXN0ZW1Db25maWdCdWlsZGVyIGdldEZpbGVTeXN0ZW1Db25maWdCdWlsZGVyKGZpbmFsIFN0cmluZyBzY2hlbWUpIHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uOwoKICAgIC8qKgogICAgICogUmVzb2x2ZSB0aGUgdXJpIHRvIGEgZmlsZW5hbWUuCiAgICAgKgogICAgICogQHBhcmFtIHVyaSBUaGUgdXJpIHRvIHJlc29sdmUuCiAgICAgKiBAcmV0dXJuIEEgRmlsZU5hbWUgdGhhdCBtYXRjaGVzIHRoZSB1cmkuCiAgICAgKiBAdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb24gaWYgdGhpcyBpcyBub3QgcG9zc2libGUuCiAgICAgKi8KICAgIEZpbGVOYW1lIHJlc29sdmVVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb247CgogICAgLy8gLS0gT1BFUkFUSU9OUyAtLQogICAgLyoqCiAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQgRmlsZU9wZXJhdGlvblByb3ZpZGVyIGZvciB0aGUgc3BlY2lmaWVkIHNjaGVtZS4KICAgICAqIFNldmVyYWwgRmlsZU9wZXJhdGlvblByb3ZpZGVyJ3MgbWlnaHQgYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHNhbWUgc2NoZW1lLgogICAgICogRm9yIGV4YW1wbGUsIGZvciAiZmlsZSIgc2NoZW1lIHdlIGNhbiByZWdpc3RlciBTdm5Xc09wZXJhdGlvblByb3ZpZGVyIGFuZAogICAgICogQ3ZzT3BlcmF0aW9uUHJvdmlkZXIuCiAgICAgKgogICAgICogQHBhcmFtIHNjaGVtZSBUaGUgc2NoZW1lIGFzc29pY2F0ZWQgd2l0aCB0aGlzIHByb3ZpZGVyLgogICAgICogQHBhcmFtIG9wZXJhdGlvblByb3ZpZGVyIFRoZSBGaWxlT3BlcmF0aW9uUHJvdmlkZXIgdG8gYWRkLgogICAgICogQHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KICAgICAqLwogICAgdm9pZCBhZGRPcGVyYXRpb25Qcm92aWRlcihmaW5hbCBTdHJpbmcgc2NoZW1lLCBmaW5hbCBGaWxlT3BlcmF0aW9uUHJvdmlkZXIgb3BlcmF0aW9uUHJvdmlkZXIpCiAgICAgICAgdGhyb3dzIEZpbGVTeXN0ZW1FeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBAc2VlIEZpbGVTeXN0ZW1NYW5hZ2VyI2FkZE9wZXJhdGlvblByb3ZpZGVyKFN0cmluZywgb3JnLmFwYWNoZS5jb21tb25zLnZmcy5vcGVyYXRpb25zLkZpbGVPcGVyYXRpb25Qcm92aWRlcikKICAgICAqCiAgICAgKiBAcGFyYW0gc2NoZW1lcyBUaGUgc2NoZW1lcyB0aGF0IHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlci4KICAgICAqIEBwYXJhbSBvcGVyYXRpb25Qcm92aWRlciBUaGUgRmlsZU9wZXJhdGlvblByb3ZpZGVyIHRvIGFkZC4KICAgICAqIEB0aHJvd3MgRmlsZVN5c3RlbUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCiAgICAgKi8KICAgIHZvaWQgYWRkT3BlcmF0aW9uUHJvdmlkZXIoZmluYWwgU3RyaW5nW10gc2NoZW1lcywgZmluYWwgRmlsZU9wZXJhdGlvblByb3ZpZGVyIG9wZXJhdGlvblByb3ZpZGVyKQogICAgICAgIHRocm93cyBGaWxlU3lzdGVtRXhjZXB0aW9uOwoKCiAgICAvKioKICAgICAqIEBwYXJhbSBzY2hlbWUgdGhlIHNjaGVtZSBmb3Igd2ljaCB3ZSB3YW50IHRvIGdldCB0aGUgbGlzdCBhZiByZWdpc3RlcmVkIHByb3ZpZGVycy4KICAgICAqCiAgICAgKiBAcmV0dXJuIHRoZSByZWdpc3RlcmVkIEZpbGVPcGVyYXRpb25Qcm92aWRlcnMgZm9yIHRoZSBzcGVjaWZpZWQgc2NoZW1lLgogICAgICogSWYgdGhlcmUgd2VyZSBubyBwcm92aWRlcnMgcmVnaXN0ZXJlZCBmb3IgdGhlIHNjaGVtZSwgaXQgcmV0dXJucyBudWxsLgogICAgICoKICAgICAqIEB0aHJvd3MgRmlsZVN5c3RlbUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCiAgICAgKi8KICAgIEZpbGVPcGVyYXRpb25Qcm92aWRlcltdIGdldE9wZXJhdGlvblByb3ZpZGVycyhmaW5hbCBTdHJpbmcgc2NoZW1lKSB0aHJvd3MgRmlsZVN5c3RlbUV4Y2VwdGlvbjsKfQo=