LyoKICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyIElCTSBDb3Jwb3JhdGlvbiwgQ0VBLCBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCiAqCiAqIENvbnRyaWJ1dG9yczoKICogICBJQk0gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICBLZW5uIEh1c3NleSAoQ0VBKSAtIDMyNzAzOSwgMzUxNzc3CiAqCiAqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLnVtbDIudW1sOwoKaW1wb3J0IGphdmEudXRpbC5NYXA7CgppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWNDaGFpbjsKCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CgppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKCi8qKgogKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdGVyZW90eXBlPC9iPjwvZW0+Jy4KICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAqCiAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogKiBBIHN0ZXJlb3R5cGUgZGVmaW5lcyBob3cgYW4gZXhpc3RpbmcgbWV0YWNsYXNzIG1heSBiZSBleHRlbmRlZCwgYW5kIGVuYWJsZXMgdGhlIHVzZSBvZiBwbGF0Zm9ybSBvciBkb21haW4gc3BlY2lmaWMgdGVybWlub2xvZ3kgb3Igbm90YXRpb24gaW4gcGxhY2Ugb2YsIG9yIGluIGFkZGl0aW9uIHRvLCB0aGUgb25lcyB1c2VkIGZvciB0aGUgZXh0ZW5kZWQgbWV0YWNsYXNzLgogKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAqCiAqIDxwPgogKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CiAqIDx1bD4KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0ZXJlb3R5cGUjZ2V0SWNvbnMgPGVtPkljb248L2VtPn08L2xpPgogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RlcmVvdHlwZSNnZXRQcm9maWxlIDxlbT5Qcm9maWxlPC9lbT59PC9saT4KICogPC91bD4KICogPC9wPgogKgogKiBAc2VlIG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2UjZ2V0U3RlcmVvdHlwZSgpCiAqIEBtb2RlbAogKiBAZ2VuZXJhdGVkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIFN0ZXJlb3R5cGUKCQlleHRlbmRzIG9yZy5lY2xpcHNlLnVtbDIudW1sLkNsYXNzIHsKCgkvKioKCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgoJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLnVtbDIudW1sLkltYWdlfS4KCSAqIDxwPgoJICogVGhpcyBmZWF0dXJlIHN1YnNldHMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKCSAqIDx1bD4KCSAqICAgPGxpPid7QGxpbmsgb3JnLmVjbGlwc2UudW1sMi51bWwuRWxlbWVudCNnZXRPd25lZEVsZW1lbnRzKCkgPGVtPk93bmVkIEVsZW1lbnQ8L2VtPn0nPC9saT4KCSAqIDwvdWw+CgkgKiA8L3A+CgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KCSAqIFN0ZXJlb3R5cGUgY2FuIGNoYW5nZSB0aGUgZ3JhcGhpY2FsIGFwcGVhcmFuY2Ugb2YgdGhlIGV4dGVuZGVkIG1vZGVsIGVsZW1lbnQgYnkgdXNpbmcgYXR0YWNoZWQgaWNvbnMuIFdoZW4gdGhpcyBhc3NvY2lhdGlvbiBpcyBub3QgbnVsbCwgaXQgcmVmZXJlbmNlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGljb24gY29udGVudCB0byBiZSBkaXNwbGF5ZWQgd2l0aGluIGRpYWdyYW1zIHByZXNlbnRpbmcgdGhlIGV4dGVuZGVkIG1vZGVsIGVsZW1lbnRzLgoJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgoJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KCSAqIEBzZWUgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZSNnZXRTdGVyZW90eXBlX0ljb24oKQoJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCUVMaXN0PEltYWdlPiBnZXRJY29ucygpOwoKCS8qKgoJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgb3JnLmVjbGlwc2UudW1sMi51bWwuSW1hZ2V9IGFuZCBhcHBlbmRzIGl0IHRvIHRoZSAnPGVtPjxiPkljb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQHJldHVybiBUaGUgbmV3IHtAbGluayBvcmcuZWNsaXBzZS51bWwyLnVtbC5JbWFnZX0uCgkgKiBAc2VlICNnZXRJY29ucygpCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCUltYWdlIGNyZWF0ZUljb24oKTsKCgkvKioKCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgoJICogU3RlcmVvdHlwZSBuYW1lcyBzaG91bGQgbm90IGNsYXNoIHdpdGgga2V5d29yZCBuYW1lcyBmb3IgdGhlIGV4dGVuZGVkIG1vZGVsIGVsZW1lbnQuCgkgKiB0cnVlCgkgKiBAcGFyYW0gZGlhZ25vc3RpY3MgVGhlIGNoYWluIG9mIGRpYWdub3N0aWNzIHRvIHdoaWNoIHByb2JsZW1zIGFyZSB0byBiZSBhcHBlbmRlZC4KCSAqIEBwYXJhbSBjb250ZXh0IFRoZSBjYWNoZSBvZiBjb250ZXh0LXNwZWNpZmljIGluZm9ybWF0aW9uLgoJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgoJICogQG1vZGVsCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCWJvb2xlYW4gdmFsaWRhdGVOYW1lTm90Q2xhc2goRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLAoJCQlNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpOwoKCS8qKgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CgkgKiBXaGVyZSBhIHN0ZXJlb3R5cGXVcyBwcm9wZXJ0eSBpcyBhbiBhc3NvY2lhdGlvbiBlbmQgZm9yIGFuIGFzc29jaWF0aW9uIG90aGVyIHRoYW4gYSBraW5kIG9mIGV4dGVuc2lvbiwgYW5kIHRoZSBvdGhlciBlbmQgaXMgbm90IGEgc3RlcmVvdHlwZSwgdGhlIG90aGVyIGVuZCBtdXN0IGJlIG93bmVkIGJ5IHRoZSBhc3NvY2lhdGlvbiBpdHNlbGYuCgkgKiBvd25lZEF0dHJpYnV0ZQoJICogLT5zZWxlY3QoYXNzb2NpYXRpb24tPm5vdEVtcHR5KCkgYW5kIG5vdCBhc3NvY2lhdGlvbi5vY2xJc0tpbmRPZihFeHRlbnNpb24pIGFuZCBub3QgdHlwZS5vY2xJc0tpbmRPZihTdGVyZW90eXBlKSkKCSAqIC0+Zm9yQWxsKG9wcG9zaXRlLm93bmVyID0gYXNzb2NpYXRpb24pCgkgKiBAcGFyYW0gZGlhZ25vc3RpY3MgVGhlIGNoYWluIG9mIGRpYWdub3N0aWNzIHRvIHdoaWNoIHByb2JsZW1zIGFyZSB0byBiZSBhcHBlbmRlZC4KCSAqIEBwYXJhbSBjb250ZXh0IFRoZSBjYWNoZSBvZiBjb250ZXh0LXNwZWNpZmljIGluZm9ybWF0aW9uLgoJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgoJICogQG1vZGVsCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCWJvb2xlYW4gdmFsaWRhdGVBc3NvY2lhdGlvbkVuZE93bmVyc2hpcChEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsCgkJCU1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCk7CgoJLyoqCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KCSAqIEEgU3RlcmVvdHlwZSBtYXkgb25seSBnZW5lcmFsaXplIG9yIHNwZWNpYWxpemUgYW5vdGhlciBTdGVyZW90eXBlLgoJICogZ2VuZXJhbGl6YXRpb24uZ2VuZXJhbC0+Zm9yQWxsKGUgfGUub2NsSXNLaW5kT2YoU3RlcmVvdHlwZSkpIGFuZCBnZW5lcmFsaXphdGlvbi5zcGVjaWZpYy0+Zm9yQWxsKGUgfCBlLm9jbElzS2luZE9mKFN0ZXJlb3R5cGUpKSAKCSAqIEBwYXJhbSBkaWFnbm9zdGljcyBUaGUgY2hhaW4gb2YgZGlhZ25vc3RpY3MgdG8gd2hpY2ggcHJvYmxlbXMgYXJlIHRvIGJlIGFwcGVuZGVkLgoJICogQHBhcmFtIGNvbnRleHQgVGhlIGNhY2hlIG9mIGNvbnRleHQtc3BlY2lmaWMgaW5mb3JtYXRpb24uCgkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CgkgKiBAbW9kZWwKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJYm9vbGVhbiB2YWxpZGF0ZUdlbmVyYWxpemUoRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLAoJCQlNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpOwoKCS8qKgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CgkgKiBDcmVhdGVzIGEobikgKHJlcXVpcmVkKSBleHRlbnNpb24gb2YgdGhlIHNwZWNpZmllZCBtZXRhY2xhc3Mgd2l0aCB0aGlzIHN0ZXJlb3R5cGUuCgkgKiBAcGFyYW0gbWV0YWNsYXNzIFRoZSBtZXRhY2xhc3MgZm9yIHRoZSBuZXcgZXh0ZW5zaW9uLgoJICogQHBhcmFtIGlzUmVxdWlyZWQgV2hldGhlciB0aGUgbmV3IGV4dGVuc2lvbiBzaG91bGQgYmUgcmVxdWlyZWQuCgkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CgkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIiBtZXRhY2xhc3NSZXF1aXJlZD0idHJ1ZSIgbWV0YWNsYXNzT3JkZXJlZD0iZmFsc2UiIGlzUmVxdWlyZWREYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5Cb29sZWFuIiBpc1JlcXVpcmVkUmVxdWlyZWQ9InRydWUiIGlzUmVxdWlyZWRPcmRlcmVkPSJmYWxzZSIKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJRXh0ZW5zaW9uIGNyZWF0ZUV4dGVuc2lvbihvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcyBtZXRhY2xhc3MsCgkJCWJvb2xlYW4gaXNSZXF1aXJlZCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9maWxlPC9iPjwvZW0+JyByZWZlcmVuY2UuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KCSAqIFRoZSBwcm9maWxlIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBjb250YWlucyB0aGlzIHN0ZXJlb3R5cGUuCgkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CgkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9maWxlPC9lbT4nIHJlZmVyZW5jZS4KCSAqIEBzZWUgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZSNnZXRTdGVyZW90eXBlX1Byb2ZpbGUoKQoJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCVByb2ZpbGUgZ2V0UHJvZmlsZSgpOwoKCS8qKgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CgkgKiBTdGVyZW90eXBlcyBtYXkgb25seSBwYXJ0aWNpcGF0ZSBpbiBiaW5hcnkgYXNzb2NpYXRpb25zLgoJICogb3duZWRBdHRyaWJ1dGUuYXNzb2NpYXRpb24tPmZvckFsbChtZW1iZXJFbmQtPnNpemUoKT0yKQoJICogQHBhcmFtIGRpYWdub3N0aWNzIFRoZSBjaGFpbiBvZiBkaWFnbm9zdGljcyB0byB3aGljaCBwcm9ibGVtcyBhcmUgdG8gYmUgYXBwZW5kZWQuCgkgKiBAcGFyYW0gY29udGV4dCBUaGUgY2FjaGUgb2YgY29udGV4dC1zcGVjaWZpYyBpbmZvcm1hdGlvbi4KCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KCSAqIEBtb2RlbAoJICogQGdlbmVyYXRlZAoJICovCglib29sZWFuIHZhbGlkYXRlQmluYXJ5QXNzb2NpYXRpb25zT25seShEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsCgkJCU1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCk7CgoJLyoqCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KCSAqIFJldHJpZXZlcyB0aGUgbG9jYWxpemVkIGtleXdvcmQgZm9yIHRoaXMgc3RlcmVvdHlwZS4KCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KCSAqIEBtb2RlbCBraW5kPSJvcGVyYXRpb24iIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgoJICogQGdlbmVyYXRlZAoJICovCglTdHJpbmcgZ2V0S2V5d29yZCgpOwoKCS8qKgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CgkgKiBSZXRyaWV2ZXMgdGhlIGtleXdvcmQgZm9yIHRoaXMgc3RlcmVvdHlwZSwgbG9jYWxpemVkIGlmIGluZGljYXRlZC4KCSAqIEBwYXJhbSBsb2NhbGl6ZSBXaGV0aGVyIHRvIGxvY2FsaXplIHRoZSBrZXl3b3JkLgoJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgoJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIiBsb2NhbGl6ZURhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLkJvb2xlYW4iIGxvY2FsaXplUmVxdWlyZWQ9InRydWUiIGxvY2FsaXplT3JkZXJlZD0iZmFsc2UiCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCVN0cmluZyBnZXRLZXl3b3JkKGJvb2xlYW4gbG9jYWxpemUpOwoKCS8qKgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CgkgKiBUaGUgcXVlcnkgY29udGFpbmluZ1Byb2ZpbGUgcmV0dXJucyB0aGUgY2xvc2VzdCBwcm9maWxlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgY29udGFpbmluZyB0aGlzIHN0ZXJlb3R5cGUuCgkgKiByZXN1bHQgPSBzZWxmLm5hbWVzcGFjZS5vY2xBc1R5cGUoUGFja2FnZSkuY29udGFpbmluZ1Byb2ZpbGUoKQoJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgoJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJUHJvZmlsZSBjb250YWluaW5nUHJvZmlsZSgpOwoKCS8qKgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CgkgKiBSZXRyaWV2ZXMgdGhlIG1ldGFjbGFzc2VzIGV4dGVuZGVkIGJ5IHRoaXMgc3RlcmVvdHlwZS4KCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KCSAqIEBtb2RlbCBraW5kPSJvcGVyYXRpb24iIG9yZGVyZWQ9ImZhbHNlIgoJICogQGdlbmVyYXRlZAoJICovCglFTGlzdDxvcmcuZWNsaXBzZS51bWwyLnVtbC5DbGFzcz4gZ2V0RXh0ZW5kZWRNZXRhY2xhc3NlcygpOwoKCS8qKgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CgkgKiBSZXRyaWV2ZXMgYWxsIHRoZSBtZXRhY2xhc3NlcyBleHRlbmRlZCBieSB0aGlzIHN0ZXJlb3R5cGUsIGluY2x1ZGluZyB0aGUgbWV0YWNsYXNzZXMgZXh0ZW5kZWQgYnkgaXRzIHN1cGVyc3RlcmVvdHlwZXMuCgkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CgkgKiBAbW9kZWwga2luZD0ib3BlcmF0aW9uIiBvcmRlcmVkPSJmYWxzZSIKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJRUxpc3Q8b3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3M+IGdldEFsbEV4dGVuZGVkTWV0YWNsYXNzZXMoKTsKCgkvKioKCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgoJICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGRlZmluaXRpb24gKEVjb3JlIHJlcHJlc2VudGF0aW9uKSBvZiB0aGlzIHN0ZXJlb3R5cGUuCgkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CgkgKiBAbW9kZWwga2luZD0ib3BlcmF0aW9uIiBvcmRlcmVkPSJmYWxzZSIKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJRUNsYXNzIGdldERlZmluaXRpb24oKTsKCgkvKioKCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgoJICogQ3JlYXRlcyBhbiBpY29uIHdpdGggdGhlIHNwZWNpZmllZCBsb2NhdGlvbiBmb3IgdGhpcyBzdGVyZW90eXBlLgoJICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBmb3IgdGhlIG5ldyBpY29uLgoJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgoJICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIgbG9jYXRpb25EYXRhVHlwZT0ib3JnLmVjbGlwc2UudW1sMi50eXBlcy5TdHJpbmciIGxvY2F0aW9uUmVxdWlyZWQ9InRydWUiIGxvY2F0aW9uT3JkZXJlZD0iZmFsc2UiCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCUltYWdlIGNyZWF0ZUljb24oU3RyaW5nIGxvY2F0aW9uKTsKCgkvKioKCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgoJICogQ3JlYXRlcyBhbiBpY29uIHdpdGggdGhlIHNwZWNpZmllZCBmb3JtYXQgYW5kIGNvbnRlbnQgZm9yIHRoaXMgc3RlcmVvdHlwZS4KCSAqIEBwYXJhbSBmb3JtYXQgVGhlIGZvcm1hdCBmb3IgdGhlIG5ldyBpY29uLgoJICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgZm9yIHRoZSBuZXcgaWNvbi4KCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiIGZvcm1hdERhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLnR5cGVzLlN0cmluZyIgZm9ybWF0UmVxdWlyZWQ9InRydWUiIGZvcm1hdE9yZGVyZWQ9ImZhbHNlIiBjb250ZW50RGF0YVR5cGU9Im9yZy5lY2xpcHNlLnVtbDIudHlwZXMuU3RyaW5nIiBjb250ZW50UmVxdWlyZWQ9InRydWUiIGNvbnRlbnRPcmRlcmVkPSJmYWxzZSIKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJSW1hZ2UgY3JlYXRlSWNvbihTdHJpbmcgZm9ybWF0LCBTdHJpbmcgY29udGVudCk7Cgp9IC8vIFN0ZXJlb3R5cGUK