LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIKkgMjAxNCBNaWNyb2NoaXAgVGVjaG5vbG9neSBJbmMuIGFuZCBpdHMgc3Vic2lkaWFyaWVzLg0KKiBZb3UgbWF5IHVzZSB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgZGVyaXZhdGl2ZXMgZXhjbHVzaXZlbHkgd2l0aA0KKiBNaWNyb2NoaXAgcHJvZHVjdHMuDQoqIFRISVMgU09GVFdBUkUgSVMgU1VQUExJRUQgQlkgTUlDUk9DSElQICJBUyBJUyIuDQoqIE5PIFdBUlJBTlRJRVMsIFdIRVRIRVIgRVhQUkVTUywgSU1QTElFRCBPUiBTVEFUVVRPUlksIEFQUExZIFRPIFRISVMgU09GVFdBUkUsDQoqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwNCiogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUiBJVFMgSU5URVJBQ1RJT04gV0lUSCBNSUNST0NISVANCiogUFJPRFVDVFMsIENPTUJJTkFUSU9OIFdJVEggQU5ZIE9USEVSIFBST0RVQ1RTLCBPUiBVU0UgSU4gQU5ZIEFQUExJQ0FUSU9OLg0KKiBJTiBOTyBFVkVOVCBXSUxMIE1JQ1JPQ0hJUCBCRSBMSUFCTEUgRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgUFVOSVRJVkUsDQoqIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBMT1NTLCBEQU1BR0UsIENPU1QgT1IgRVhQRU5TRSBPRiBBTlkgS0lORA0KKiBXSEFUU09FVkVSIFJFTEFURUQgVE8gVEhFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCwgRVZFTiBJRiBNSUNST0NISVAgSEFTDQoqIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT1IgVEhFIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLg0KKiBUTyBUSEUgRlVMTEVTVCBFWFRFTlQgQUxMT1dFRCBCWSBMQVcsIE1JQ1JPQ0hJUCdTIFRPVEFMIExJQUJJTElUWSBPTiBBTEwNCiogQ0xBSU1TIElOIEFOWSBXQVkgUkVMQVRFRCBUTyBUSElTIFNPRlRXQVJFIFdJTEwgTk9UIEVYQ0VFRCBUSEUgQU1PVU5UIE9GDQoqIEZFRVMsIElGIEFOWSwgVEhBVCBZT1UgSEFWRSBQQUlEIERJUkVDVExZIFRPIE1JQ1JPQ0hJUCBGT1IgVEhJUyBTT0ZUV0FSRS4NCiogTUlDUk9DSElQIFBST1ZJREVTIFRISVMgU09GVFdBUkUgQ09ORElUSU9OQUxMWSBVUE9OIFlPVVIgQUNDRVBUQU5DRQ0KKiBPRiBUSEVTRSBURVJNUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQoNCi8qKiBAZmlsZSBtZWMxNHh4X3RpbWVycy5jDQogKk1FQzE0eHggVGltZXJzIA0KICovDQovKiogQGRlZmdyb3VwIE1FQzE0eHggUGVyaXBoZXJhbHMgVGltZXJzDQogKiAgQHsNCiAqLw0KDQoNCiNpbmNsdWRlICJhcHBjZmcuaCINCiNpbmNsdWRlICJwbGF0Zm9ybS5oIg0KI2luY2x1ZGUgIk1FQzE0eHgvbWVjMTR4eC5oIg0KI2luY2x1ZGUgIk1FQzE0eHgvbWVjMTR4eF9wY3IuaCINCiNpbmNsdWRlICJNRUMxNHh4L21lYzE0eHhfdGltZXJzLmgiDQoNCg0KLy8gcGFpcnMgb2YgYnl0ZXMgKHNsZWVwIHJlZywgYml0IHBvc2l0aW9uKQ0KLy8gc2xlZXAgcmVnID0gMCBmb3IgRUNfU0xFRVBfRU4gb3IgMSBmb3IgRUNfU0xFRVBfRU4yDQovLw0Kc3RydWN0IGJ0bXJfc2xlZXBfaW5mb19zIHsNCiAgICB1aW50OF90IHNscF9yZWc7DQogICAgdWludDhfdCBiaXRfcG9zOw0KfTsNCg0Kc3RhdGljIGNvbnN0IHN0cnVjdCBidG1yX3NsZWVwX2luZm9fcyBidG1yX3NscF9pbmZvW0JUTVJfTUFYX0lOU1RBTkNFXSA9IHsNCiAgICB7IDAsIFBDUl9FQ19USU1FUjBfU0xQX0JJVFBPUyB9LA0KICAgIHsgMCwgUENSX0VDX1RJTUVSMV9TTFBfQklUUE9TIH0sDQogICAgeyAxLCBQQ1JfRUMyX1RJTUVSMl9TTFBfQklUUE9TIH0sDQogICAgeyAxLCBQQ1JfRUMyX1RJTUVSM19TTFBfQklUUE9TIH0NCiB9Ow0KDQoNCiNpZmRlZiBNRUMxNFhYX0JUSU1FUl9DSEVDS19JRA0KDQovKioNCiAqIHRtcl92YWxpZCAtIExvY2FsIGhlbHBlciB0aGF0IGNoZWNrcyBpZiBsb2dpY2FsIFRpbWVyIElEIGlzIA0KICogdmFsaWQuIA0KICogDQogKiBAYXV0aG9yIHN3b3JsZXkgDQogKiANCiAqIEBwYXJhbSB0bXJfaWQgMC1iYXNlZCBUaW1lciBJRA0KICogDQogKiBAcmV0dXJuIHVpbnQ4X3QgTm9uLXplcm8oVkFMSUQpLCAwKEludmFsaWQpDQogKi8NCnN0YXRpYyB1aW50OF90IGJ0bXJfdmFsaWQodWludDhfdCB0bXJfaWQpDQp7DQogICAgaWYgKCB0bXJfaWQgPCAoQlRNUl9JRF9NQVggKSApIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCn0NCg0KI2Vsc2UNCg0KLyoqDQogKiBAYnJpZWYgLSBUaGlzIHZlcnNpb24gb2YgdG1yX3ZhbGlkIHNraXBzIGNoZWNraW5nIGFsd2F5cyANCiAqICAgICAgICByZXR1cm5pbmcgVFJVRS4gQ29tcGlsZXIgbWF5IG9wdGltaXplIGl0IG91dC4NCiAqIA0KICovDQpzdGF0aWMgdWludDhfdCBidG1yX3ZhbGlkKHVpbnQ4X3QgdG1yX2lkKSANCnsgDQogICAgKHZvaWQpIHRtcl9pZDsNCiAgICByZXR1cm4gdHJ1ZTsgDQp9DQoNCiNlbmRpZg0KDQp1aW50MzJfdCBidG1yX2dldF9od19hZGRyKHVpbnQ4X3QgYnRtcl9pZCkNCnsNCiAgICByZXR1cm4gKHVpbnQzMl90KShCVE1SMF9CQVNFKSArIA0KICAgICAgICAgICAoKHVpbnQzMl90KShidG1yX2lkKSA8PCAoQlRNUl9JTlNUQU5DRV9CSVRQT1MpKTsNCn0NCg0KLyoqDQogKiBidG1yX3NsZWVwX2VuIC0gRW5hYmxlL0Rpc2FibGUgY2xvY2sgZ2F0aW5nIG9uIGlkbGUgb2YgYSANCiAqIHRpbWVyIA0KICogDQogKiBAYXV0aG9yIHN3b3JsZXkgKDgvMTYvMjAxMykNCiAqIA0KICogQHBhcmFtIHRtcl9pZCB6ZXJvIGJhc2VkIHRpbWVyIElELg0KICogQHBhcmFtIHB3cl9vbiBib29sZWFuIHRydWU9T04sIGZhbHNlPU9GRg0KICovDQp2b2lkIGJ0bXJfc2xlZXBfZW4odWludDhfdCB0bXJfaWQsIHVpbnQ4X3Qgc2xlZXBfZW4pDQp7DQogICAgdWludDMyX3Qgc2xlZXBfbWFzazsNCiAgICB1aW50MzJfdCB2b2xhdGlsZSAqIHA7DQogICAgDQogICAgc2xlZXBfbWFzayA9IDB1bDsNCiAgICBpZiAoIGJ0bXJfdmFsaWQodG1yX2lkKSApIHsNCiAgICAgICAgaWYgKGJ0bXJfc2xwX2luZm9bdG1yX2lkXS5zbHBfcmVnKSB7DQogICAgICAgICAgICBwID0gKHVpbnQzMl90IHZvbGF0aWxlICopJihQQ1ItPkVDX1NMRUVQX0VOMik7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBwID0gKHVpbnQzMl90IHZvbGF0aWxlICopJihQQ1ItPkVDX1NMRUVQX0VOKTsNCiAgICAgICAgfQ0KICAgICAgICBzbGVlcF9tYXNrID0gKDF1bCA8PCBidG1yX3NscF9pbmZvW3Rtcl9pZF0uYml0X3Bvcyk7DQogICAgICAgIGlmIChzbGVlcF9lbikgew0KICAgICAgICAgICAgKnAgfD0gKHNsZWVwX21hc2spOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgKnAgJj0gfihzbGVlcF9tYXNrKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KLyoqDQogKiBidG1yX3Jlc2V0IC0gUGVmb3JtIHNvZnQgcmVzZXQgb2Ygc3BlY2lmaWVkIHRpbWVyLg0KICogDQogKiBAYXV0aG9yIHN3b3JsZXkgDQogKiANCiAqIEBwYXJhbSB0bXJfaWQgMC1iYXNlZCBUaW1lciBJRCANCiAqIEBub3RlIFNvZnQgcmVzZXQgc2V0IGFsbCByZWdpc3RlcnMgdG8gUE9SIHZhbHVlcy4NCiAqIFNwaW5zIDI1NiB0aW1lcyB3YWl0aW5nIG9uIGhhcmR3YXJlIHRvIGNsZWFyIHJlc2V0IGJpdC4gDQogKi8NCnZvaWQgYnRtcl9yZXNldCh1aW50OF90IHRtcl9pZCkNCnsNCiAgIEJUTVJfVHlwZURlZiAqIHA7DQogICB1aW50MzJfdCB3YWl0X2NudDsNCg0KICAgaWYgKGJ0bXJfdmFsaWQodG1yX2lkKSkgew0KICAgICAgcCA9IChCVE1SX1R5cGVEZWYgKilidG1yX2dldF9od19hZGRyKHRtcl9pZCk7DQoNCiAgICAgIHAtPkNPTlRST0wgPSAoQlRNUl9DTlRMX1NPRlRfUkVTRVQpOw0KDQogICAgICB3YWl0X2NudCA9IDI1NnVsOw0KICAgICAgZG8gew0KICAgICAgICAgIGlmICggMHVsID09IChwLT5DT05UUk9MICYgQlRNUl9DTlRMX1NPRlRfUkVTRVQpICkgew0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICB9DQogICAgICB9IA0KICAgICAgd2hpbGUgKCB3YWl0X2NudC0tICk7IA0KICAgfSAgICAgIA0KfQ0KDQovKioNCiAqIGJ0bXJfaW5pdCAtIEluaXRpYWxpemUgc3BlY2lmaWVkIHRpbWVyDQogKiBAcGFyYW0gemVybyBiYXNlZCB0aW1lciBJRA0KICogQHBhcmFtIHRtcl9jbnRsIGJbMTU6MF0gPSB0aW1lciBjb25maWd1cmF0aW9uIGZsYWdzLg0KICogQHBhcmFtIGluaXRpYWxfY291bnQgDQogKiBAcGFyYW0gcHJlbG9hZF9jb3VudCANCiAqIEBub3RlIHBlcmZvcm1zIGEgc29mdCByZXNldCBvZiB0aGUgdGltZXIgYmVmb3JlIA0KICogICAgICAgY29uZmlndXJhdGlvbi4NCiAqLw0Kdm9pZCBidG1yX2luaXQodWludDhfdCB0bXJfaWQsIA0KICAgICAgICAgICAgICAgdWludDE2X3QgdG1yX2NudGwsDQogICAgICAgICAgICAgICB1aW50MTZfdCBwcmVzY2FsZXIsDQogICAgICAgICAgICAgICB1aW50MzJfdCBpbml0aWFsX2NvdW50LA0KICAgICAgICAgICAgICAgdWludDMyX3QgcHJlbG9hZF9jb3VudCkNCnsNCiAgICBCVE1SX1R5cGVEZWYgKiBwVE1SOw0KDQogICAgcFRNUiA9IE5VTEw7DQoNCiAgICBpZiAoYnRtcl92YWxpZCh0bXJfaWQpKSB7DQogICAgICAgIGJ0bXJfcmVzZXQodG1yX2lkKTsNCiAgICAgICAgDQogICAgICAgIHBUTVIgPSAoQlRNUl9UeXBlRGVmICopYnRtcl9nZXRfaHdfYWRkcih0bXJfaWQpOw0KICAgICAgICANCiAgICAgICAgLy8gVW5nYXRlIHRpbWVyIGNsb2NrcyBhbmQgcHJvZ3JhbSBwcmVzY2FsZQ0KICAgICAgICBwVE1SLT5DT05UUk9MID0gKCh1aW50MzJfdClwcmVzY2FsZXIgPDwgMTYpICsgKEJUTVJfQ05UTF9FTkFCTEUpOw0KICAgICAgICANCiAgICAgICAgLy8gUHJvZ3JhbSBQcmVsb2FkICYgaW5pdGlhbCBjb3VudGVyIHZhbHVlDQogICAgICAgIHBUTVItPlBSRUxPQUQgPSBwcmVsb2FkX2NvdW50Ow0KICAgICAgICBwVE1SLT5DT1VOVCA9IGluaXRpYWxfY291bnQ7DQogICAgICAgIA0KICAgICAgICAvLyBQcm9ncmFtIGNvbnRyb2wgcmVnaXN0ZXIsIGludGVycnVwdCBlbmFibGUsIGFuZCBjbGVhciBzdGF0dXMNCiAgICAgICAgaWYgKHRtcl9jbnRsICYgQlRNUl9DT1VOVF9VUCkgew0KICAgICAgICAgICAgcFRNUi0+Q09OVFJPTCB8PSBCVE1SX0NOVExfQ09VTlRfVVA7ICANCiAgICAgICAgfQ0KICAgICAgICBpZiAodG1yX2NudGwgJiBCVE1SX0FVVE9fUkVTVEFSVCkgew0KICAgICAgICAgICAgcFRNUi0+Q09OVFJPTCB8PSBCVE1SX0NOVExfQVVUT19SRVNUQVJUOyANCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKHRtcl9jbnRsICYgQlRNUl9JTlRfRU4pIHsNCiAgICAgICAgICAgIHBUTVItPklOVEVOID0gMHgwMXU7ICAgIC8vIGVuYWJsZSBmaXJzdA0KICAgICAgICAgICAgcFRNUi0+U1RBVFVTID0gMHgwMXU7ICAgLy8gY2xlYXIgc3RhdHVzDQogICAgICAgIH0NCiAgICB9DQp9DQoNCi8qKg0KICogYnRtcl9pZW4gLSBFbmFibGUgc3BlY2lmaWVkIHRpbWVyJ3MgaW50ZXJydXB0Lg0KICogDQogKiBAYXV0aG9yIHN3b3JsZXkgDQogKiANCiAqIEBwYXJhbSB0bXJfaWQgemVybyBiYXNlZCB0aW1lciBJRC4NCiAqIEBwYXJhbSBpZW4gTm9uLXplcm8gZW5hYmxlIGludGVycnVwdCBpbiB0aW1lciBibG9jaywgMCANCiAqICAgICAgICAgICAgZGlzYWJsZS4NCiAqIEBub3RlIFdyaXRlIDAgb3IgMSB0byB0aW1lcidzIElOVEVOIHJlZ2lzdGVyLg0KICovDQp2b2lkIGJ0bXJfaWVuKHVpbnQ4X3QgdG1yX2lkLCB1aW50OF90IGllbikNCnsNCiAgICBCVE1SX1R5cGVEZWYgKiBwOw0KDQogICAgaWYgKGJ0bXJfdmFsaWQodG1yX2lkKSkgew0KICAgICAgICBwID0gKEJUTVJfVHlwZURlZiAqKWJ0bXJfZ2V0X2h3X2FkZHIodG1yX2lkKTsNCg0KICAgICAgICBpZiAoaWVuKSB7DQogICAgICAgICAgICAgcC0+SU5URU4gPSAoQlRNUl9JTlRFTik7IA0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgIHAtPklOVEVOID0gKEJUTVJfSU5URElTKTsgDQogICAgICAgIH0NCiAgICB9DQp9DQoNCi8qKg0KICogdG1yX2dldF9jbHJfaXN0cyAtIFJlYWQgVGltZXIgaW50ZXJydXB0IHN0YXR1cyBhbmQgY2xlYXIgaWYNCiAqIHNldC4gDQogKiANCiAqIEBhdXRob3Igc3dvcmxleSANCiAqIA0KICogQHBhcmFtIHRtcl9pZCB6ZXJvIGJhc2VkIHRpbWVyIElELg0KICogDQogKiBAcmV0dXJuIHVpbnQ4X3QgdHJ1ZSAoVGltZXIgaW50ZXJydXB0IHN0YXR1cyBzZXQpIGVsc2UgZmFsc2UuIA0KICogQG5vdGUgSWYgdGltZXIgaW50ZXJydXB0IHN0YXR1cyBpcyBzZXQgdGhlbiBjbGVhciBpdCBiZWZvcmUgDQogKiAgICAgICByZXR1cm5pbmcuDQogKi8NCnVpbnQ4X3QgYnRtcl9nZXRfY2xyX2lzdHModWludDhfdCB0bXJfaWQpDQp7DQogICAgQlRNUl9UeXBlRGVmICogcDsNCiAgICB1aW50OF90IHJjOw0KDQogICAgcmMgPSAoTUVDMTRYWF9GQUxTRSk7DQogICAgaWYgKGJ0bXJfdmFsaWQodG1yX2lkKSkgew0KICAgICAgICBwID0gKEJUTVJfVHlwZURlZiAqKWJ0bXJfZ2V0X2h3X2FkZHIodG1yX2lkKTsNCg0KICAgICAgICBpZiAoIHAtPlNUQVRVUyApIHsNCiAgICAgICAgICAgIHAtPlNUQVRVUyA9IChCVE1SX1NUQVRVU19BQ1RJVkUpOw0KICAgICAgICAgICAgcmMgPSB0cnVlOw0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiByYzsNCn0NCg0KLyoqDQogKiBidG1yX3JlbG9hZCAtIEZvcmNlIHRpbWVyIHRvIHJlbG9hZCBjb3VudGVyIGZyb20gcHJlbG9hZCANCiAqIHJlZ2lzdGVyLiANCiAqIA0KICogQHBhcmFtIHRtcl9pZCB6ZXJvIGJhc2VkIHRpbWVyIElELiANCiAqIEBub3RlIEhhcmR3YXJlIHdpbGwgb25seSByZWxvYWQgY291bnRlciBpZiB0aW1lciBpcyBydW5uaW5nLiANCiAqLw0Kdm9pZCBidG1yX3JlbG9hZCh1aW50OF90IHRtcl9pZCkNCnsNCiAgICBCVE1SX1R5cGVEZWYgKiBwOw0KDQogICAgaWYgKCBidG1yX3ZhbGlkKHRtcl9pZCkgKSB7DQogICAgICAgIHAgPSAoQlRNUl9UeXBlRGVmICopYnRtcl9nZXRfaHdfYWRkcih0bXJfaWQpOw0KDQogICAgICAgIGlmIChwLT5DT05UUk9MICYgQlRNUl9DTlRMX1NUQVJUKSB7DQogICAgICAgICAgICBwLT5DT05UUk9MIHw9IEJUTVJfQ05UTF9SRUxPQUQ7DQogICAgICAgIH0NCiAgICB9DQp9DQoNCi8qKg0KICogYnRtcl9zZXRfY291bnQgLSBQcm9ncmFtIHRpbWVyJ3MgY291bnRlciByZWdpc3Rlci4NCiAqIA0KICogQGF1dGhvciBzd29ybGV5IA0KICogDQogKiBAcGFyYW0gdG1yX2lkIHplcm8gYmFzZWQgdGltZXIgSUQNCiAqIEBwYXJhbSBjb3VudCBuZXcgY291bnRlciB2YWx1ZSANCiAqIEBub3RlIFRpbWVyIGhhcmR3YXJlIG1heSBpbXBsZW1lbnQgYSAxNi1iaXQgb3IgMzItYml0IA0KICogICAgICAgaGFyZHdhcmUgY291bnRlci4gSWYgdGhlIHRpbWVyIGlzIDE2LWJpdCBvbmx5IHRoZSBsb3dlcg0KICogICAgICAgMTYtYml0cyBvZiB0aGUgY291bnQgcGFyYW10ZXIgYXJlIHVzZWQuDQogKi8NCnZvaWQgYnRtcl9zZXRfY291bnQodWludDhfdCB0bXJfaWQsIHVpbnQzMl90IGNvdW50KQ0Kew0KICAgIEJUTVJfVHlwZURlZiAqIHA7DQoNCiAgICBpZiAoYnRtcl92YWxpZCh0bXJfaWQpKSB7DQogICAgICAgIHAgPSAoQlRNUl9UeXBlRGVmICopYnRtcl9nZXRfaHdfYWRkcih0bXJfaWQpOw0KDQogICAgICAgIHAtPkNPVU5UID0gY291bnQ7DQogICAgfQ0KfQ0KDQovKioNCiAqIGJ0bXJfY291bnQgLSBSZXR1cm4gY3VycmVudCB2YWx1ZSBvZiB0aW1lcidzIGNvdW50IHJlZ2lzdGVyLg0KICogDQogKiBAYXV0aG9yIHN3b3JsZXkgDQogKiANCiAqIEBwYXJhbSB0bXJfaWQgemVybyBiYXNlZCB0aW1lciBJRC4NCiAqIA0KICogQHJldHVybiB1aW50MzJfdCB0aW1lciBjb3VudCBtYXkgYmUgMzIgb3IgMTYgYml0cyBkZXBlbmRpbmcgDQogKiAgICAgICAgIHVwb24gdGhlIGhhcmR3YXJlLiAgT24gTUVDMTMyMiBUaW1lcnMgMC0zIGFyZSAxNi1iaXQNCiAqICAgICAgICAgYW5kIFRpbWVycyA0LTUgYXJlIDMyLWJpdC4NCiAqLw0KdWludDMyX3QgYnRtcl9jb3VudCh1aW50OF90IHRtcl9pZCkNCnsNCiAgICBCVE1SX1R5cGVEZWYgKiBwOw0KICAgIHVpbnQzMl90IGNudDsNCiAgICANCiAgICBjbnQgPSAwdWw7DQogICAgaWYgKCBidG1yX3ZhbGlkKHRtcl9pZCkgKSB7DQogICAgICAgIHAgPSAoQlRNUl9UeXBlRGVmICopYnRtcl9nZXRfaHdfYWRkcih0bXJfaWQpOw0KICAgICAgICBjbnQgPSAodWludDMyX3QpKHAtPkNPVU5UKTsNCiAgICB9DQogICAgDQogICAgcmV0dXJuIGNudDsNCn0NCg0KLyoqDQogKiBidG1yX3N0YXJ0IC0gU3RhcnQgdGltZXIgY291bnRpbmcuDQogKiANCiAqIEBhdXRob3Igc3dvcmxleSANCiAqIA0KICogQHBhcmFtIHRtcl9pZCB6ZXJvIGJhc2VkIHRpbWVyIElELg0KICovDQp2b2lkIGJ0bXJfc3RhcnQodWludDhfdCBidG1yX2lkKQ0Kew0KICAgIEJUTVJfVHlwZURlZiAqIHA7DQoNCiAgICBpZiAoIGJ0bXJfdmFsaWQoYnRtcl9pZCkgKSB7DQogICAgICAgIHAgPSAoQlRNUl9UeXBlRGVmICopYnRtcl9nZXRfaHdfYWRkcihidG1yX2lkKTsNCiAgICAgICAgcC0+Q09OVFJPTCB8PSBCVE1SX0NOVExfU1RBUlQ7DQogICAgfQ0KfQ0KDQovKioNCiAqIGJ0bXJfc3RvcCAtIFN0b3AgdGltZXIuDQogKiANCiAqIEBhdXRob3Igc3dvcmxleSANCiAqIA0KICogQHBhcmFtIHRtcl9pZCB6ZXJvIGJhc2VkIHRpbWVyIElELiANCiAqIEBub3RlIFdoZW4gYSBzdG9wcGVkIHRpbWVyIGlzIHN0YXJ0ZWQgYWdhaW4gaXQgd2lsbCByZWxvYWQgDQogKiAgICAgICB0aGUgY291bnQgcmVnaXN0ZXIgZnJvbSBwcmVsb2FkIHZhbHVlLg0KICovDQp2b2lkIGJ0bXJfc3RvcCh1aW50OF90IHRtcl9pZCkNCnsNCiAgICBCVE1SX1R5cGVEZWYgKiBwOw0KDQogICAgaWYgKGJ0bXJfdmFsaWQodG1yX2lkKSkgew0KICAgICAgICBwID0gKEJUTVJfVHlwZURlZiAqKWJ0bXJfZ2V0X2h3X2FkZHIodG1yX2lkKTsNCiAgICAgICAgcC0+Q09OVFJPTCAmPSB+KEJUTVJfQ05UTF9TVEFSVCk7DQogICAgfQ0KfQ0KDQovKioNCiAqIGJ0bXJfaXNfc3RvcHBlZCAtIFJldHVybiBzdGF0ZSBvZiB0aW1lcidzIFNUQVJUIGJpdC4NCiAqIA0KICogQGF1dGhvciBzd29ybGV5IA0KICogDQogKiBAcGFyYW0gdG1yX2lkIHplcm8gYmFzZWQgdGltZXIgSUQuDQogKiANCiAqIEByZXR1cm4gdWludDhfdCBmYWxzZSh0aW1lciBub3Qgc3RhcnRlZCksIHRydWUodGltZXIgc3RhcnRlZCkNCiAqLw0KdWludDhfdCBidG1yX2lzX3N0b3BwZWQodWludDhfdCB0bXJfaWQpDQp7DQogICAgQlRNUl9UeXBlRGVmICogcDsNCiAgICB1aW50OF90IHJjOw0KICAgIA0KICAgIHJjID0gKE1FQzE0WFhfVFJVRSk7DQogICAgaWYgKGJ0bXJfdmFsaWQodG1yX2lkKSkgew0KICAgICAgICByYyA9IChNRUMxNFhYX0ZBTFNFKTsNCiAgICAgICAgcCA9IChCVE1SX1R5cGVEZWYgKilidG1yX2dldF9od19hZGRyKHRtcl9pZCk7DQogICAgICAgIGlmICgocC0+Q09OVFJPTCAmIEJUTVJfQ05UTF9TVEFSVCkgPT0gMCkgew0KICAgICAgICAgICAgcmMgPSAoTUVDMTRYWF9UUlVFKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gcmM7DQp9DQoNCg0KLyoqDQogKiBidG1yX2hhbHQgLSBIYWx0IHRpbWVyIGNvdW50aW5nIHdpdGggbm8gcmVsb2FkIG9uIHVuaGFsdC4gDQogKiANCiAqIEBhdXRob3Igc3dvcmxleSANCiAqIA0KICogQHBhcmFtIHRtcl9pZCB6ZXJvIGJhc2VkIHRpbWVyIElELiANCiAqIEBub3RlIEEgaGFsdGVkIHRpbWVyIHdpbGwgbm90IHJlbG9hZCB0aGUgY291bnQgcmVnaXN0ZXIgd2hlbiANCiAqICAgICAgIHVuaGFsdGVkLCBpdCB3aWxsIGNvbnRpbnVlIGNvdW50aW5nIGZyb20gdGhlIGN1cnJlbnQNCiAqICAgICAgIGNvdW50IHZhbHVlLg0KICovDQp2b2lkIGJ0bXJfaGFsdCh1aW50OF90IHRtcl9pZCkNCnsNCiAgICBCVE1SX1R5cGVEZWYgKiBwOw0KDQogICAgaWYgKCBidG1yX3ZhbGlkKHRtcl9pZCkgKSB7DQogICAgICAgIHAgPSAoQlRNUl9UeXBlRGVmICopYnRtcl9nZXRfaHdfYWRkcih0bXJfaWQpOw0KICAgICAgICBwLT5DT05UUk9MIHw9IChCVE1SX0NOVExfSEFMVCk7DQogICAgfQ0KfQ0KDQoNCi8qKg0KICogYnRtcl91bmhhbHQgLSBVbmhhbHQgdGltZXIgY291bnRpbmcuDQogKiANCiAqIEBhdXRob3Igc3dvcmxleSANCiAqIA0KICogQHBhcmFtIHRtcl9pZCB6ZXJvIGJhc2VkIHRpbWVyIElELg0KICovDQp2b2lkIGJ0bXJfdW5oYWx0KHVpbnQ4X3QgdG1yX2lkKQ0Kew0KICAgIEJUTVJfVHlwZURlZiAqIHA7DQoNCiAgICBpZiAoIGJ0bXJfdmFsaWQodG1yX2lkKSApIHsNCiAgICAgICAgcCA9IChCVE1SX1R5cGVEZWYgKilidG1yX2dldF9od19hZGRyKHRtcl9pZCk7DQogICAgICAgIHAtPkNPTlRST0wgJj0gfihCVE1SX0NOVExfSEFMVCk7DQogICAgfQ0KfQ0KDQoNCi8qIGVuZCBtZWMxNHh4X3RpbWVycy5jICovDQovKiogICBAfQ0KICovDQo=