cGFja2FnZSBvcmcub3BlbmZsb3cucHJvdG9jb2wubWF0Y2g7CgppbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GT2JqZWN0OwppbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk1hc2tlZDsKaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRlZhbHVlVHlwZTsKCi8qKgogKiBHZW5lcmljIGludGVyZmFjZSBmb3IgdmVyc2lvbi1hZ25vc3RpYyBpbW11dGFibGUgTWF0Y2ggc3RydWN0dXJlLgogKiBUaGUgTWF0Y2ggc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gdGhlIE9wZW5GbG93IHByb3RvY29sLCBhbmQgaXQgY29udGFpbnMgaW5mb3JtYXRpb24gb24KICogdGhlIGZpZWxkcyB0byBiZSBtYXRjaGVkIGluIGEgc3BlY2lmaWMgZmxvdyByZWNvcmQuCiAqIFRoaXMgaW50ZXJmYWNlIGRvZXMgbm90IGFzc3VtZSBhbnl0aGluZyBvbiB0aGUgZmllbGRzIGluIHRoZSBNYXRjaCBzdHJ1Y3R1cmUuIElmIGluCiAqIHNvbWUgdmVyc2lvbiwgdGhlIG1hdGNoIHN0cnVjdHVyZSBjYW5ub3QgaGFuZGxlIGEgY2VydGFpbiBmaWVsZCwgaXQgbWF5IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KICogZm9yIDxjb2RlPnN1cHBvcnRzKC4uLik8L2NvZGU+IGNhbGxzLCBhbmQgdGhyb3cgPGNvZGU+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2NvZGU+IGZyb20gYWxsCiAqIG90aGVyIG1ldGhvZHMgaW4gc3VjaCBjYXNlcy4KICogPGJyPjxicj4KICogT24gd2lsZGNhcmRzIGFuZCBtYXNrczo8YnI+CiAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBtYXNraW5nIG5vdGF0aW9ucyBmb3IgZmllbGRzOgogKiA8dWw+CiAqIDxsaT48Yj5FeGFjdDwvYj46IGZpZWxkIGlzIG1hdGNoZWQgZXhhY3RseSBhZ2FpbnN0IGEgc2luZ2xlLCBmaXhlZCB2YWx1ZSAobm8gbWFzaywgb3IgbWFzayBpcyBhbGwgb25lcykuCiAqIDxsaT48Yj5XaWxkY2FyZGVkPC9iPjogZmllbGQgaXMgbm90IGJlaW5nIG1hdGNoZWQuIEl0IGlzIGZ1bGx5IG1hc2tlZCAobWFzaz0wKSBhbmQgYW55IHZhbHVlIG9mIGl0CiAqIHdpbGwgbWF0Y2ggdGhlIGZsb3cgcmVjb3JkIGhhdmluZyB0aGlzIG1hdGNoLgogKiA8bGk+PGI+UGFydGlhbGx5IG1hc2tlZDwvYj46IGZpZWxkIGlzIG1hdGNoZWQgdXNpbmcgYSBzcGVjaWZpZWQgbWFzayB3aGljaCBpcyBuZWl0aGVyIDAgbm9yIGFsbCBvbmVzLiBNYXNrIGNhbgogKiBiZSBlaXRoZXIgYXJiaXRyYXJ5IG9yIHJlcXVpcmUgc29tZSBzcGVjaWZpYyBzdHJ1Y3R1cmUuCiAqIDwvdWw+CiAqIEltcGxlbWVudGluZyBjbGFzc2VzIG1heSBvciBtYXkgbm90IHN1cHBvcnQgYWxsIHR5cGVzIG9mIHRoZXNlIG1hc2tpbmcgdHlwZXMuIFRoZXkgbWF5IGFsc28gc3VwcG9ydAogKiB0aGVtIGluIHBhcnQuIEZvciBleGFtcGxlLCBPRjEuMCBzdXBwb3J0cyBleGFjdCBtYXRjaCBhbmQgKGZ1bGwpIHdpbGRjYXJkaW5nIGZvciBhbGwgZmllbGRzLCBidXQgaXQKICogZG9lcyBvbmx5IHN1cHBvcnRzIHBhcnRpYWwgbWFza2luZyBmb3IgSVAgc291cmNlL2Rlc3RpbmF0aW9uIGZpZWxkcywgYW5kIHRoaXMgcGFydGlhbCBtYXNraW5nIG11c3QgYmUKICogaW4gdGhlIENJRFIgcHJlZml4IGZvcm1hdC4gVGh1cywgT0YxLjAgaW1wbGVtZW50YXRpb24gbWF5IHRocm93IDxjb2RlPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jb2RlPiBpZiBnaXZlbgogKiBpbiA8Y29kZT5zZXRNYWtzZWQ8L2NvZGU+IGFuIElQIG1hc2sgb2YsIGZvciBleGFtcGxlLCAyNTUuMC4yNTUuMCwgb3IgaWYgPGNvZGU+c2V0TWFza2VkPC9jb2RlPiBpcyBjYWxsZWQgZm9yIGFueSBmaWVsZAogKiB3aGljaCBpcyBub3QgSVAgc291cmNlL2Rlc3RpbmF0aW9uIGFkZHJlc3MuCiAqIDxicj48YnI+CiAqIE9uIHByZXJlcXVpc2l0ZXM6PGJyPgogKiBGcm9tIHRoZSBPRjEuMSBzcGVjLCBwYWdlIDI4LCB0aGUgT0YxLjAgc3BlYyBmYWlsZWQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoaXMsIGJ1dCBpdAogKiBpcyB0aGUgYmVoYXZpb3Igb2YgT0YxLjAgc3dpdGNoZXM6CiAqICJQcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgd2l0aGluIG9mcF9tYXRjaCB3aWxsIGJlIGlnbm9yZWQgd2l0aGluIGEgc2luZ2xlIHRhYmxlIHdoZW4gCiAqIHRoZSBjb3JyZXNwb25kaW5nIHByb3RvY29sIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIG1hdGNoLiBUaGUgTVBMUyBtYXRjaCBmaWVsZHMgd2lsbCAKICogYmUgaWdub3JlZCB1bmxlc3MgdGhlIEV0aGVydHlwZSBpcyBzcGVjaWZpZWQgYXMgTVBMUy4gTGlrZXdpc2UsIHRoZSBJUCBoZWFkZXIgYW5kIAogKiB0cmFuc3BvcnQgaGVhZGVyIGZpZWxkcyB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIHRoZSBFdGhlcnR5cGUgaXMgc3BlY2lmaWVkIGFzIGVpdGhlciAKICogSVB2NCBvciBBUlAuIFRoZSB0cF9zcmMgYW5kIHRwX2RzdCBmaWVsZHMgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB0aGUgbmV0d29yayBwcm90b2NvbCAKICogc3BlY2lmaWVkIGlzIGFzIFRDUCwgVURQIG9yIFNDVFAuIEZpZWxkcyB0aGF0IGFyZSBpZ25vcmVkIGRvbtV0IG5lZWQgdG8gYmUgd2lsZGNhcmRlZCAKICogYW5kIHNob3VsZCBiZSBzZXQgdG8gMC4iCiAqIDxicj48YnI+CiAqIFRoaXMgaW50ZXJmYWNlIHVzZXMgZ2VuZXJpY3MgdG8gYXNzdXJlIHR5cGUgc2FmZXR5IGluIHVzZXJzIGNvZGUuIEhvd2V2ZXIsIGltcGxlbWVudGluZyBjbGFzc2VzIG1heSBoYXZlIHRvIHN1cHByZXNzIAogKiAndW5jaGVja2VkIGNhc3QnIHdhcm5pbmdzIHdoaWxlIG1ha2luZyBzdXJlIHRoZXkgY29ycmVjdGx5IGNhc3QgYmFzZSBvbiB0aGVpciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgogKiAKICogQGF1dGhvciBZb3RhbSBIYXJjaG9sICh5b3RhbS5oYXJjaG9sQGJpZ3N3aXRjaC5jb20pCiAqLwpwdWJsaWMgaW50ZXJmYWNlIE1hdGNoIGV4dGVuZHMgT0ZPYmplY3QgeyAgICAKCiAgICAvKioKICAgICAqIFJldHVybnMgYSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGZpZWxkIGlmOgogICAgICogPHVsPgogICAgICogPGxpPkZpZWxkIGlzIHN1cHBvcnRlZAogICAgICogPGxpPkZpZWxkIGlzIG5vdCBmdWxseSB3aWxkY2FyZGVkCiAgICAgKiA8bGk+UHJlcmVxdWlzaXRlcyBhcmUgb2sKICAgICAqIDwvdWw+CiAgICAgKiBJZiBvbmUgb2YgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZG9lcyBub3QgaG9sZCwgcmV0dXJucyBudWxsLiBWYWx1ZSBpcyByZXR1cm5lZCBtYXNrZWQgaWYgcGFydGlhbGx5IHdpbGRjYXJkZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZCB0byByZXRyaWV2ZQogICAgICogQHJldHVybiBWYWx1ZSBvZiBtYXRjaCBmaWVsZCAobWF5IGJlIG1hc2tlZCksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGZpZWxkIGlzIG9uZSBvZiB0aGUgY29uZGl0aW9ucyBhYm92ZSBkb2VzIG5vdCBob2xkLgogICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBJZiBmaWVsZCBpcyBub3Qgc3VwcG9ydGVkLgogICAgICovCiAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gRiBnZXQoTWF0Y2hGaWVsZDxGPiBmaWVsZCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbWFza2VkIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQgZnJvbSB0aGlzIG1hdGNoLCBhbG9uZyB3aXRoIHRoZSBtYXNrIGl0c2VsZi4KICAgICAqIFByZXJlcXVpc2l0ZTogZmllbGQgaXMgcGFydGlhbGx5IG1hc2tlZC4KICAgICAqIElmIHByZXJlcXVpc2l0ZSBpcyBub3QgbWV0LCBhIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgogICAgICogCiAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gcmV0cmlldmUuCiAgICAgKiBAcmV0dXJuIE1hc2tlZCB2YWx1ZSBvZiBtYXRjaCBmaWVsZCBvciBudWxsIGlmIG5vIG1hc2sgaXMgc2V0LgogICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBJZiBmaWVsZCBpcyBub3Qgc3VwcG9ydGVkLgogICAgICovCiAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gTWFza2VkPEY+IGdldE1hc2tlZChNYXRjaEZpZWxkPEY+IGZpZWxkKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBtYXRjaCBvYmplY3Qgc3VwcG9ydHMgdGhlIGdpdmVuIG1hdGNoIGZpZWxkLgogICAgICogCiAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQKICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBmaWVsZCBpcyBzdXBwb3J0ZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAqLwogICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoTWF0Y2hGaWVsZDw/PiBmaWVsZCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBtYXRjaCBvYmplY3Qgc3VwcG9ydHMgcGFydGlhbGx5IGJpdG1hc2tpbmcgb2YgdGhlIGdpdmVuIGZpZWxkLgogICAgICogKG5vdGU6IG5vdCBhbGwgcG9zc2libGUgdmFsdWVzIG9mIHRoaXMgYml0bWFzayBoYXZlIHRvIGJlIGFjY2VwdGFibGUpCiAgICAgKiAKICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZC4KICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBmaWVsZCBjYW4gYmUgcGFydGlhbGx5IG1hc2tlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBJZiBmaWVsZCBpcyBub3Qgc3VwcG9ydGVkLgogICAgICovCiAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c01hc2tlZChNYXRjaEZpZWxkPD8+IGZpZWxkKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgc3BlY2lmaWVkIGluIHRoZSBtYXRjaCB3aXRoIGFuIGV4YWN0IHZhbHVlIGFuZAogICAgICogbm8gbWFzay4gSS5lLiwgdGhlIHNwZWNpZmllZCBtYXRjaCB3aWxsIG9ubHkgc2VsZWN0IHBhY2tldHMgdGhhdCBtYXRjaCB0aGUgZXhhY3QgdmFsdWUgb2YgZ2V0VmFsdWUoZmllbGQpLgogICAgICogCiAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQuCiAgICAgKiBAcmV0dXJuIHRydWUgaWYgZmllbGQgaGFzIGEgc3BlY2lmaWMgZXhhY3QgdmFsdWUsIGZhbHNlIGlmIG5vdC4KICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgZmllbGQgaXMgbm90IHN1cHBvcnRlZC4KICAgICAqLwogICAgcHVibGljIGJvb2xlYW4gaXNFeGFjdChNYXRjaEZpZWxkPD8+IGZpZWxkKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgZmllbGQgaXMgY3VycmVudGx5IGxvZ2ljYWxseSB1bnNwZWNpZmllZCBpbiB0aGUgbWF0Y2gsIGkuZSwgdGhlIAogICAgICogdmFsdWUgcmV0dXJuZWQgYnkgZ2V0VmFsdWUoZikgaGFzIG5vIGltcGFjdCBvbiB3aGV0aGVyIGEgcGFja2V0IHdpbGwgYmUgc2VsZWN0ZWQgCiAgICAgKiBieSB0aGUgbWF0Y2ggb3Igbm90LgogICAgICogCiAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQuCiAgICAgKiBAcmV0dXJuIHRydWUgaWYgZmllbGQgaXMgZnVsbHkgd2lsZGNhcmRlZCwgZmFsc2UgaWYgbm90LgogICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBJZiBmaWVsZCBpcyBub3Qgc3VwcG9ydGVkLgogICAgICovCiAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGx5V2lsZGNhcmRlZChNYXRjaEZpZWxkPD8+IGZpZWxkKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBUcnVlIGlmIGFuZCBvbmx5IGlmIHRoaXMgZmllbGQgaXMgY3VycmVudGx5IHBhcnRpYWxseSBzcGVjaWZpZWQgaW4gdGhlIG1hdGNoLCBpLmUsIHRoZSAKICAgICAqIG1hdGNoIHdpbGwgb25seSBzZWxlY3QgcGFja2V0cyB0aGF0IG1hdGNoIChwLnZhbHVlICYgZ2V0TWFzayhmaWVsZCkpID09IGdldFZhbHVlKGZpZWxkKSwKICAgICAqIGFuZCBnZXRNYXNrKGZpZWxkKSAhPSAwLgogICAgICogCiAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQuCiAgICAgKiBAcmV0dXJuIHRydWUgaWYgZmllbGQgaXMgcGFydGlhbGx5IG1hc2tlZCwgZmFsc2UgaWYgbm90LgogICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBJZiBmaWVsZCBpcyBub3Qgc3VwcG9ydGVkLgogICAgICovCiAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcnRpYWxseU1hc2tlZChNYXRjaEZpZWxkPD8+IGZpZWxkKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247CiAgICAKICAgIC8qKgogICAgICogUmV0dXJucyBhIGJ1aWxkZXIgdG8gYnVpbGQgbmV3IGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgb2YgbWF0Y2ggb2JqZWN0LgogICAgICogQHJldHVybiBNYXRjaCBidWlsZGVyCiAgICAgKi8KICAgIHB1YmxpYyBCdWlsZGVyIGNyZWF0ZUJ1aWxkZXIoKTsKCiAgICAvKioKICAgICAqIEJ1aWxkZXIgaW50ZXJmYWNlIGZvciBNYXRjaCBvYmplY3RzLgogICAgICogQnVpbGRlciBpcyB1c2VkIHRvIGNyZWF0ZSBuZXcgTWF0Y2ggb2JqZWN0cyBhbmQgaXQgY3JlYXRlcyB0aGUgbWF0Y2ggYWNjb3JkaW5nIHRvIHRoZSB2ZXJzaW9uIGl0CiAgICAgKiBjb3JyZXNwb25kcyB0by4gVGhlIGJ1aWxkZXIgdXNlcyB0aGUgc2FtZSBub3RhdGlvbiBvZiB3aWxkY2FyZHMgYW5kIG1hc2tzLCBhbmQgY2FuIGFsc28gdGhyb3cKICAgICAqIDxjb2RlPlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uPC9jb2RlPiBpZiBpdCBpcyBhc2tlZCB0byBjcmVhdGUgc29tZSBtYXRjaGluZyB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgaW4KICAgICAqIHRoZSB2ZXJzaW9uIGl0IHJlcHJlc2VudHMuCiAgICAgKiAKICAgICAqIFdoaWxlIHVzZWQsIE1hdGNoQnVpbGRlciBtYXkgbm90IGJlIGNvbnNpc3RlbnQgaW4gdGVybXMgb2YgZmllbGQgcHJlcmVxdWlzaXRlcy4gSG93ZXZlciwgdXNlciBtdXN0CiAgICAgKiBzb2x2ZSB0aGVzZSBiZWZvcmUgdXNpbmcgdGhlIGdlbmVyYXRlZCBNYXRjaCBvYmplY3QgYXMgdGhlc2UgcHJlcmVxdWlzaXRlcyBzaG91bGQgYmUgZW5mb3JjZWQgaW4gdGhlCiAgICAgKiBnZXR0ZXJzLiAKICAgICAqIAogICAgICogQGF1dGhvciBZb3RhbSBIYXJjaG9sICh5b3RhbS5oYXJjaG9sQGJpZ3N3aXRjaC5jb20pCiAgICAgKi8KICAgIGludGVyZmFjZSBCdWlsZGVyIGV4dGVuZHMgTWF0Y2ggewogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgYSBzcGVjaWZpYyBleGFjdCB2YWx1ZSBmb3IgYSBmaWVsZC4KICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gc2V0LgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiBtYXRjaCBmaWVsZC4KICAgICAgICAgKiBAcmV0dXJuIHRoZSBCdWlsZGVyIGluc3RhbmNlIHVzZWQuCiAgICAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBJZiBmaWVsZCBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAgICAqLwogICAgICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBCdWlsZGVyIHNldEV4YWN0KE1hdGNoRmllbGQ8Rj4gZmllbGQsIEYgdmFsdWUpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyBhIG1hc2tlZCB2YWx1ZSBmb3IgYSBmaWVsZC4KICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gc2V0LgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiBmaWVsZC4KICAgICAgICAgKiBAcGFyYW0gbWFzayBNYXNrIHZhbHVlLgogICAgICAgICAqIEByZXR1cm4gdGhlIEJ1aWxkZXIgaW5zdGFuY2UgdXNlZC4KICAgICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIElmIGZpZWxkIGlzIG5vdCBzdXBwb3J0ZWQsIGlmIGZpZWxkIGlzIHN1cHBvcnRlZCBidXQgZG9lcyBub3Qgc3VwcG9ydCBtYXNraW5nLCBvciBpZiBtYXNrIHN0cnVjdHVyZSBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAgICAqLwogICAgICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBCdWlsZGVyIHNldE1hc2tlZChNYXRjaEZpZWxkPEY+IGZpZWxkLCBGIHZhbHVlLCBGIG1hc2spIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyBhIG1hc2tlZCB2YWx1ZSBmb3IgYSBmaWVsZC4KICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gc2V0LgogICAgICAgICAqIEBwYXJhbSB2YWx1ZVdpdGhNYXNrIENvbXBvdW5kIE1hc2tlZCBvYmplY3QgY29udGFpbnMgdGhlIHZhbHVlIGFuZCB0aGUgbWFzay4KICAgICAgICAgKiBAcmV0dXJuIHRoZSBCdWlsZGVyIGluc3RhbmNlIHVzZWQuCiAgICAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBJZiBmaWVsZCBpcyBub3Qgc3VwcG9ydGVkLCBpZiBmaWVsZCBpcyBzdXBwb3J0ZWQgYnV0IGRvZXMgbm90IHN1cHBvcnQgbWFza2luZywgb3IgaWYgbWFzayBzdHJ1Y3R1cmUgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gQnVpbGRlciBzZXRNYXNrZWQoTWF0Y2hGaWVsZDxGPiBmaWVsZCwgTWFza2VkPEY+IHZhbHVlV2l0aE1hc2spIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKCiAgICAgICAgLyoqCiAgICAgICAgICogVW5zZXRzIGFueSB2YWx1ZSBnaXZlbiBmb3IgdGhlIGZpZWxkIGFuZCB3aWxkY2FyZHMgaXQgc28gdGhhdCBpdCBtYXRjaGVzIGFueSB2YWx1ZS4KICAgICAgICAgKiAKICAgICAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gdW5zZXQuCiAgICAgICAgICogQHJldHVybiB0aGUgQnVpbGRlciBpbnN0YW5jZSB1c2VkLgogICAgICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSWYgZmllbGQgaXMgbm90IHN1cHBvcnRlZC4KICAgICAgICAgKi8KICAgICAgICBwdWJsaWMgPEYgZXh0ZW5kcyBPRlZhbHVlVHlwZTxGPj4gQnVpbGRlciB3aWxkY2FyZChNYXRjaEZpZWxkPEY+IGZpZWxkKSB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb247CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIG1hdGNoIGNyZWF0ZWQgYnkgdGhpcyBidWlsZGVyLgogICAgICAgICAqIAogICAgICAgICAqIEByZXR1cm4gYSBNYXRjaCBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgcHVibGljIE1hdGNoIGdldE1hdGNoKCk7CiAgICB9Cn0=