LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogqSAyMDEzIE1pY3JvY2hpcCBUZWNobm9sb2d5IEluYy4gYW5kIGl0cyBzdWJzaWRpYXJpZXMuDQoqIFlvdSBtYXkgdXNlIHRoaXMgc29mdHdhcmUgYW5kIGFueSBkZXJpdmF0aXZlcyBleGNsdXNpdmVseSB3aXRoDQoqIE1pY3JvY2hpcCBwcm9kdWN0cy4NCiogVEhJUyBTT0ZUV0FSRSBJUyBTVVBQTElFRCBCWSBNSUNST0NISVAgIkFTIElTIi4NCiogTk8gV0FSUkFOVElFUywgV0hFVEhFUiBFWFBSRVNTLCBJTVBMSUVEIE9SIFNUQVRVVE9SWSwgQVBQTFkgVE8gVEhJUyBTT0ZUV0FSRSwNCiogSU5DTFVESU5HIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLA0KKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIElUUyBJTlRFUkFDVElPTiBXSVRIIE1JQ1JPQ0hJUA0KKiBQUk9EVUNUUywgQ09NQklOQVRJT04gV0lUSCBBTlkgT1RIRVIgUFJPRFVDVFMsIE9SIFVTRSBJTiBBTlkgQVBQTElDQVRJT04uDQoqIElOIE5PIEVWRU5UIFdJTEwgTUlDUk9DSElQIEJFIExJQUJMRSBGT1IgQU5ZIElORElSRUNULCBTUEVDSUFMLCBQVU5JVElWRSwNCiogSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIExPU1MsIERBTUFHRSwgQ09TVCBPUiBFWFBFTlNFIE9GIEFOWSBLSU5EDQoqIFdIQVRTT0VWRVIgUkVMQVRFRCBUTyBUSEUgU09GVFdBUkUsIEhPV0VWRVIgQ0FVU0VELCBFVkVOIElGIE1JQ1JPQ0hJUCBIQVMNCiogQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPUiBUSEUgREFNQUdFUyBBUkUgRk9SRVNFRUFCTEUuDQoqIFRPIFRIRSBGVUxMRVNUIEVYVEVOVCBBTExPV0VEIEJZIExBVywgTUlDUk9DSElQJ1MgVE9UQUwgTElBQklMSVRZIE9OIEFMTA0KKiBDTEFJTVMgSU4gQU5ZIFdBWSBSRUxBVEVEIFRPIFRISVMgU09GVFdBUkUgV0lMTCBOT1QgRVhDRUVEIFRIRSBBTU9VTlQgT0YNCiogRkVFUywgSUYgQU5ZLCBUSEFUIFlPVSBIQVZFIFBBSUQgRElSRUNUTFkgVE8gTUlDUk9DSElQIEZPUiBUSElTIFNPRlRXQVJFLg0KKiBNSUNST0NISVAgUFJPVklERVMgVEhJUyBTT0ZUV0FSRSBDT05ESVRJT05BTExZIFVQT04gWU9VUiBBQ0NFUFRBTkNFDQoqIE9GIFRIRVNFIFRFUk1TLg0KKi8NCg0KLyoqIEBkZWZncm91cCBwd20gcHdtX2Nfd3JhcHBlcg0KICogIEB7DQogKi8NCi8qKiBAZmlsZSBwd21fY193cmFwcGVyLmNwcA0KIFxicmllZiB0aGUgcHdtIGNvbXBvbmVudCBDIHdyYXBwZXINCiBUaGlzIHByb2dyYW0gaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIG90aGVyIEMgcHJvZ3JhbXMgdG8gYmUgYWJsZSB0byB1c2UgdGhpcyBjb21wb25lbnQNCg0KIFRoZXJlIGFyZSBlbnRyeSBwb2ludHMgZm9yIGFsbCBDIHdyYXBwZXIgQVBJIGltcGxlbWVudGF0aW9uDQoNCjxiPlBsYXRmb3JtOjwvYj4gVGhpcyBpcyBBUkMtYmFzZWQgY29tcG9uZW50DQoNCjxiPlRvb2xzZXQ6PC9iPiBNZXRhd2FyZSBJREUoOC41LjEpDQo8Yj5SZWZlcmVuY2U6PC9iPiBzbXNjX3JldXNhYmxlX2Z3X3JlcXVpcmVtZW50LmRvYyAqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogIFNNU0MgdmVyc2lvbiBjb250cm9sIGluZm9ybWF0aW9uIChQZXJmb3JjZSk6DQogKg0KICogIEZJTEU6ICAgICAkRmlsZTogLy9kZXBvdF9wY3MvRldFbmcvUmVsZWFzZS9wcm9qZWN0cy9DRUMxMzAyX0NMSUIvcmVsZWFzZTIvU291cmNlL2h3X2Jsa3MvY29tbW9uL3N5c3RlbS9zeXN0ZW0uYyAkDQogKiAgUkVWSVNJT046ICRSZXZpc2lvbjogIzEgJA0KICogIERBVEVUSU1FOiAkRGF0ZVRpbWU6IDIwMTUvMTIvMjMgMTU6Mzc6NTggJA0KICogIEFVVEhPUjogICAkQXV0aG9yOiBha3Jpc2huYW4gJA0KICoNCiAqICBSZXZpc2lvbiBoaXN0b3J5IChsYXRlc3QgZmlyc3QpOg0KICogICAgICAjMyAgMjAxMS8wNS8wOSAgbWFydGluX3kgICAgdXBkYXRlIHRvIE1ldGF3YXJlIElERSg4LjUuMSkNCiAqICAgICAgIzIgIDIwMTEvMDMvMjUgIG1hcnRpbl95ICAgIHN1cHBvcnQgRlBHQSBidWlsZCAwNTggYXBwcw0KICogICAgICAjMSAgMjAxMS8wMy8yMyAgbWFydGluX3kgICAgYnJhbmNoIGZyb20gTUVDMTYxOCBzYW1wbGUgY29kZTogTUVDMTYxOF9ldmJfc2FtcGxlX2NvZGVfYnVpbGRfMDIwMA0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKi8NCi8qIEltcG9ydGVkIEhlYWRlciBGaWxlICovDQovLyNpbmNsdWRlICAgICJjb21tb24uaCINCi8vI2luY2x1ZGUgICAgImJ1aWxkLmgiDQojaW5jbHVkZSAgICA8c3RkaW50Lmg+DQoNCiNkZWZpbmUgQUREUl9QQ1JfUFJPQ0VTU09SX0NMT0NLX0NPTlRST0wgICAgMHg0MDA4MDEyMA0KI2RlZmluZSBNTUNSX1BDUl9QUk9DRVNTT1JfQ0xPQ0tfQ09OVFJPTCAgICAoKih1aW50MzJfdCAqKShBRERSX1BDUl9QUk9DRVNTT1JfQ0xPQ0tfQ09OVFJPTCkpDQojZGVmaW5lIENQVV9DTE9DS19ESVZJREVSCQkJCQkxDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiogc3lzdGVtX3NldF9lY19jbG9jaw0KKiBTZXQgQ1BVIHNwZWVkDQoqIEBwYXJhbSB2b2lkDQoqIEByZXR1cm4gdm9pZA0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0Kdm9pZCBzeXN0ZW1fc2V0X2VjX2Nsb2NrKHZvaWQpDQp7DQoNCiAgICAvKiBTZXQgQVJDIENQVSBDbG9jayBEaXZpZGVyIHRvIGRldGVybWluZSB0aGUgQ1BVIHNwZWVkICovDQogICAgLyogU2V0IGRpdmlkZXIgdG8gOCBmb3IgOE1IeiBvcGVyYXRpb24sIE1DTEsgaW4gc2lsaWNvbiBjaGlwIGlzIDY0TUh6LCBDUFU9TUNMSy9EaXZpZGVyICovDQogICAgTU1DUl9QQ1JfUFJPQ0VTU09SX0NMT0NLX0NPTlRST0wgPSBDUFVfQ0xPQ0tfRElWSURFUjsNCg0KfSAvKiBFbmQgc3lzdGVtX3NldF9lY19jbG9jaygpICovDQoNCg==