LyoKICogKEMpIENvcHlyaWdodCAyMDA4LDIwMDkKICogR3JhZW1lIFJ1c3MsIDxncmFlbWUucnVzc0BnbWFpbC5jb20+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMgogKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgPGRhbmllbEBvbWljcm9uLnNlPgogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPG1hbGxvYy5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vaTgyNTQuaD4KI2luY2x1ZGUgPGFzbS9pYm1wYy5oPgoKc3RydWN0IHRpbWVyX2lzcl9mdW5jdGlvbiB7CglzdHJ1Y3QgdGltZXJfaXNyX2Z1bmN0aW9uICpuZXh0OwoJdGltZXJfZm5jX3QgKmlzcl9mdW5jOwp9OwoKc3RhdGljIHN0cnVjdCB0aW1lcl9pc3JfZnVuY3Rpb24gKmZpcnN0X3RpbWVyX2lzciA9IE5VTEw7CnN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHN5c3RlbV90aWNrcyA9IDA7CgovKgogKiByZWdpc3Rlcl90aW1lcl9pc3IoKSBhbGxvd3MgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlIGFuZCBib2FyZCBzcGVjaWZpYwogKiBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIGV2ZXJ5IG1pbGxpc2Vjb25kLiBLZWVwIHRoZSBleGVjdXRpb24gdGltZSBvZgogKiBlYWNoIGZ1bmN0aW9uIGFzIGxvdyBhcyBwb3NzaWJsZQogKi8KaW50IHJlZ2lzdGVyX3RpbWVyX2lzciAodGltZXJfZm5jX3QgKmlzcl9mdW5jKQp7CglzdHJ1Y3QgdGltZXJfaXNyX2Z1bmN0aW9uICpuZXdfZnVuYzsKCXN0cnVjdCB0aW1lcl9pc3JfZnVuY3Rpb24gKnRlbXA7CglpbnQgZmxhZzsKCgluZXdfZnVuYyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHRpbWVyX2lzcl9mdW5jdGlvbikpOwoKCWlmIChuZXdfZnVuYyA9PSBOVUxMKQoJCXJldHVybiAxOwoKCW5ld19mdW5jLT5pc3JfZnVuYyA9IGlzcl9mdW5jOwoJbmV3X2Z1bmMtPm5leHQgPSBOVUxMOwoKCS8qCgkgKiAgRG9uJ3QgYWxsb3cgdGltZXIgaW50ZXJydXB0cyB3aGlsZSB0aGUKCSAqICBsaW5rZWQgbGlzdCBpcyBiZWluZyBtb2RpZmllZAoJICovCglmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzICgpOwoKCWlmIChmaXJzdF90aW1lcl9pc3IgPT0gTlVMTCkgewoJCWZpcnN0X3RpbWVyX2lzciA9IG5ld19mdW5jOwoJfSBlbHNlIHsKCQl0ZW1wID0gZmlyc3RfdGltZXJfaXNyOwoJCXdoaWxlICh0ZW1wLT5uZXh0ICE9IE5VTEwpCgkJCXRlbXAgPSB0ZW1wLT5uZXh0OwoJCXRlbXAtPm5leHQgPSBuZXdfZnVuYzsKCX0KCglpZiAoZmxhZykKCQllbmFibGVfaW50ZXJydXB0cyAoKTsKCglyZXR1cm4gMDsKfQoKLyoKICogdGltZXJfaXNyKCkgTVVTVCBiZSB0aGUgcmVnaXN0ZXJlZCBpbnRlcnJ1cHQgaGFuZGxlciBmb3IKICovCnZvaWQgdGltZXJfaXNyKHZvaWQgKnVudXNlZCkKewoJc3RydWN0IHRpbWVyX2lzcl9mdW5jdGlvbiAqdGVtcCA9IGZpcnN0X3RpbWVyX2lzcjsKCglzeXN0ZW1fdGlja3MrKzsKCgkvKiBFeGVjdXRlIGVhY2ggcmVnaXN0ZXJlZCBmdW5jdGlvbiAqLwoJd2hpbGUgKHRlbXAgIT0gTlVMTCkgewoJCXRlbXAtPmlzcl9mdW5jICgpOwoJCXRlbXAgPSB0ZW1wLT5uZXh0OwoJfQp9Cgp1bG9uZyBnZXRfdGltZXIgKHVsb25nIGJhc2UpCnsKCXJldHVybiAoc3lzdGVtX3RpY2tzIC0gYmFzZSk7Cn0K