LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwgYnV0IGluZGVwZW5kZW50IG9mIGltcGxlbWVudGF0aW9uICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxhc20vaWMvc2M1MjAuaD4KCnZvaWQgc2M1MjBfdGltZXJfaXNyKHZvaWQpCnsKCS8qIEFjayB0aGUgR1AgVGltZXIgSW50ZXJydXB0ICovCglzYzUyMF9tbWNyLT5ncHRtcnN0YSA9IDB4MDI7Cn0KCmludCB0aW1lcl9pbml0KHZvaWQpCnsKCS8qIE1hcCBHUCBUaW1lciAxIHRvIE1hc3RlciBQSUMgSVIwICAqLwoJc2M1MjBfbW1jci0+Z3BfdG1yX2ludF9tYXBbMV0gPSAweDAxOwoKCS8qIERpc2FibGUgR1AgVGltZXJzIDEgJiAyIC0gQWxsb3cgY29uZmlndXJhdGlvbiB3cml0ZXMgKi8KCXNjNTIwX21tY3ItPmdwdG1yMWN0bCA9IDB4NDAwMDsKCXNjNTIwX21tY3ItPmdwdG1yMmN0bCA9IDB4NDAwMDsKCgkvKiBSZXNldCBHUCBUaW1lcnMgMSAmIDIgKi8KCXNjNTIwX21tY3ItPmdwdG1yMWNudCA9IDB4MDAwMDsKCXNjNTIwX21tY3ItPmdwdG1yMmNudCA9IDB4MDAwMDsKCgkvKiBTZXR1cCBHUCBUaW1lciAyIGFzIGEgMTAwa0h6ICgxMHVzKSBwcmVzY2FsZXIgKi8KCXNjNTIwX21tY3ItPmdwdG1yMm1heGNtcGEgPSA4MzsKCXNjNTIwX21tY3ItPmdwdG1yMmN0bCA9IDB4YzAwMTsKCgkvKiBTZXR1cCBHUCBUaW1lciAxIGFzIGEgMTAwMCBIeiAoMW1zKSBpbnRlcnJ1cHQgZ2VuZXJhdG9yICovCglzYzUyMF9tbWNyLT5ncHRtcjFtYXhjbXBhID0gMTAwOwoJc2M1MjBfbW1jci0+Z3B0bXIxY3RsID0gMHhlMDA5OwoKCS8qIFJlZ2lzdGVyIHRoZSBTQzUyMCBzcGVjaWZpYyB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlciAqLwoJcmVnaXN0ZXJfdGltZXJfaXNyIChzYzUyMF90aW1lcl9pc3IpOwoKCS8qIEluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXIgZm9yIEdQIFRpbWVyIDEgKi8KCWlycV9pbnN0YWxsX2hhbmRsZXIgKDAsIHRpbWVyX2lzciwgTlVMTCk7Cgl1bm1hc2tfaXJxICgwKTsKCgkvKiBDbGVhciB0aGUgR1AgVGltZXIgMSBzdGF0dXMgcmVnaXN0ZXIgdG8gZ2V0IHRoZSBzaG93IHJvbGxpbmcqLwoJc2M1MjBfbW1jci0+Z3B0bXJzdGEgPSAweDAyOwoKCXJldHVybiAwOwp9Cgp2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpCnsKCWludCBtID0gMDsKCWxvbmcgdTsKCWxvbmcgdGVtcDsKCgl0ZW1wID0gc2M1MjBfbW1jci0+c3d0bXJtaWxsaTsKCXRlbXAgPSBzYzUyMF9tbWNyLT5zd3Rtcm1pY3JvOwoKCWRvIHsKCQltICs9IHNjNTIwX21tY3ItPnN3dG1ybWlsbGk7CgkJdSA9IHNjNTIwX21tY3ItPnN3dG1ybWljcm8gKyAobSAqIDEwMDApOwoJfSB3aGlsZSAodSA8IHVzZWMpOwp9Cg==