LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9pODI1NC5oPgojaW5jbHVkZSA8YXNtL2libXBjLmg+CgoKc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgc3lzdGVtX3RpY2tzOwpzdGF0aWMgaW50IHRpbWVyX2luaXRfZG9uZSA9MDsKCnN0YXRpYyB2b2lkIHRpbWVyX2lzcih2b2lkICp1bnVzZWQpCnsKCXN5c3RlbV90aWNrcysrOwp9Cgp1bnNpZ25lZCBsb25nIGdldF9zeXN0ZW1fdGlja3Modm9pZCkKewoJcmV0dXJuIHN5c3RlbV90aWNrczsKfQoKI2RlZmluZSBUSU1FUjBfVkFMVUUgMHgwNGFhIC8qIDFrSHogMS45MzE4TUh6IC8gMTAwMCAqLwojZGVmaW5lIFRJTUVSMl9WQUxVRSAweDBhOGUgLyogNDQwSHogKi8KCmludCB0aW1lcl9pbml0KHZvaWQpCnsKCXN5c3RlbV90aWNrcyA9IDA7CgkKCWlycV9pbnN0YWxsX2hhbmRsZXIoMCwgdGltZXJfaXNyLCBOVUxMKTsKCQoJLyogaW5pdGlhbGl6ZSB0aW1lciAwIGFuZCAyIAoJICogCgkgKiBUaW1lciAwIGlzIHVzZWQgdG8gaW5jcmVtZW50IHN5c3RlbV90aWNrIDEwMDAgdGltZXMvc2VjCgkgKiBUaW1lciAxIHdhcyB1c2VkIGZvciBEUkFNIHJlZnJlc2ggaW4gZWFybHkgUEMncwoJICogVGltZXIgMiBpcyB1c2VkIHRvIGRyaXZlIHRoZSBzcGVha2VyCgkgKiAodG8gc3Rhc3J0IGEgYmVlcDogd3JpdGUgMyB0byBwb3J0IDB4NjEsCgkgKiB0byBzdG9wIGl0IGFnYWluOiB3cml0ZSAwKQoJICovCgkJCiAgICAgICAgb3V0YihQSVRfQ01EX0NUUjB8UElUX0NNRF9CT1RIfFBJVF9DTURfTU9ERTIsIFBJVF9CQVNFICsgUElUX0NPTU1BTkQpOwoJb3V0YihUSU1FUjBfVkFMVUUmMHhmZiwgUElUX0JBU0UgKyBQSVRfVDApOwoJb3V0YihUSU1FUjBfVkFMVUU+PjgsIFBJVF9CQVNFICsgUElUX1QwKTsKCiAgICAgICAgb3V0YihQSVRfQ01EX0NUUjJ8UElUX0NNRF9CT1RIfFBJVF9DTURfTU9ERTMsIFBJVF9CQVNFICsgUElUX0NPTU1BTkQpOwoJb3V0YihUSU1FUjJfVkFMVUUmMHhmZiwgUElUX0JBU0UgKyBQSVRfVDIpOwoJb3V0YihUSU1FUjJfVkFMVUU+PjgsIFBJVF9CQVNFICsgUElUX1QyKTsKCgl0aW1lcl9pbml0X2RvbmUgPSAxOwoJCglyZXR1cm4gMDsKfQoKCiNpZmRlZiBDRkdfVElNRVJfR0VORVJJQwoKLyogdGhlIHVuaXQgZm9yIHRoZXNlIGlzIENGR19IWiAqLwoKLyogRml4TWU6IGltcGxlbWVudCB0aGVzZSAqLwp2b2lkIHJlc2V0X3RpbWVyICh2b2lkKQp7CglzeXN0ZW1fdGlja3MgPSAwOwp9Cgp1bG9uZyBnZXRfdGltZXIgKHVsb25nIGJhc2UpCnsKCXJldHVybiAoc3lzdGVtX3RpY2tzIC0gYmFzZSk7Cn0KCnZvaWQgc2V0X3RpbWVyICh1bG9uZyB0KQkKewoJc3lzdGVtX3RpY2tzID0gdDsKfQoKc3RhdGljIHUxNiByZWFkX3BpdCh2b2lkKQp7Cgl1OCBsb3c7CglvdXRiKFBJVF9DTURfTEFUQ0gsIFBJVF9CQVNFICsgUElUX0NPTU1BTkQpOwoJbG93ID0gaW5iKFBJVF9CQVNFICsgUElUX1QwKTsKCXJldHVybiAoKGluYihQSVRfQkFTRSArIFBJVF9UMCkgPDwgOCkgfCBsb3cpOwp9CgovKiB0aGlzIGlzIG5vdCB2ZXJ5IGV4YWN0ICovCnZvaWQgdWRlbGF5ICh1bnNpZ25lZCBsb25nIHVzZWMpCnsJCglpbnQgY291bnRlcjsKCWludCB3cmFwczsKCQoJaWYgKCF0aW1lcl9pbml0X2RvbmUpIHsKCQlyZXR1cm47Cgl9Cgljb3VudGVyID0gcmVhZF9waXQoKTsKCXdyYXBzID0gdXNlYy8xMDAwOwoJdXNlYyA9IHVzZWMlMTAwMDsKCQoJdXNlYyo9MTE5NDsKCXVzZWMvPTEwMDA7Cgl1c2VjKz1jb3VudGVyOyAKCWlmICh1c2VjID4gMTE5NCkgewoJCXVzZWMtPTExOTQ7CgkJd3JhcHMrKzsKCX0KCgl3aGlsZSAoMSkgewoJCWludCBuZXdfY291bnQgPSByZWFkX3BpdCgpOwoJCQoJCWlmICgoKG5ld19jb3VudCA8IHVzZWMpICYmICF3cmFwcykgfHwgd3JhcHMgPCAwKSB7CgkJCWJyZWFrOwoJCX0KCQkKCQlpZiAobmV3X2NvdW50ID4gY291bnRlcikgewoJCQl3cmFwcy0tOwoJCX0KCQljb3VudGVyID0gbmV3X2NvdW50OwoJfQoJCn0KCiNpZiAwCi8qIHRoaXMgaXMgYSB2ZXJzaW9uIHdpdGggZGVidWcgb3V0cHV0ICovCnZvaWQgX3VkZWxheSAodW5zaWduZWQgbG9uZyB1c2VjKQp7CQoJaW50IGNvdW50ZXI7CglpbnQgd3JhcHM7CgkKCWludCB1c2VjMSwgdXNlYzIsIHVzZWMzOwoJaW50IHdyYXBzMSwgd3JhcHMyLCB3cmFwczMsIHdyYXBzNDsKCWludCBjdHIxLCBjdHIyLCBjdHIzLCBuY3QxLCBuY3QyOwoJaW50IGk7Cgl1c2VjMT11c2VjOwoJaWYgKCF0aW1lcl9pbml0X2RvbmUpIHsKCQlyZXR1cm47Cgl9Cgljb3VudGVyID0gcmVhZF9waXQoKTsKCWN0cjEgPSBjb3VudGVyOwoJd3JhcHMgPSB1c2VjLzEwMDA7Cgl1c2VjID0gdXNlYyUxMDAwOwoJCgl1c2VjMiA9IHVzZWM7Cgl3cmFwczEgPSB3cmFwczsKCQoJdXNlYyo9MTE5NDsKCXVzZWMvPTEwMDA7Cgl1c2VjKz1jb3VudGVyOyAKCWlmICh1c2VjID4gMTE5NCkgewoJCXVzZWMtPTExOTQ7CgkJd3JhcHMrKzsKCX0KCgl1c2VjMyA9IHVzZWM7Cgl3cmFwczIgPSB3cmFwczsKCQoJY3RyMiA9IHdyYXBzMyA9IG5jdDEgPSA0NzExOwoJY3RyMyA9IHdyYXBzNCA9IG5jdDIgPSA0NzExOwoJaT0wOwoJd2hpbGUgKDEpIHsKCQlpbnQgbmV3X2NvdW50ID0gcmVhZF9waXQoKTsKCQlpKys7CgkJaWYgKChuZXdfY291bnQgPCB1c2VjICYmICF3cmFwcykgfHwgd3JhcHMgPCAwKSB7CgkJCWJyZWFrOwoJCX0KCQkKCQlpZiAobmV3X2NvdW50ID4gY291bnRlcikgewoJCQl3cmFwcy0tOwoJCX0KCQlpZiAoY3RyMj09NDcxMSkgewoJCQljdHIyID0gY291bnRlcjsKCQkJd3JhcHMzID0gd3JhcHM7CgkJCW5jdDEgPSBuZXdfY291bnQ7CgkJfSBlbHNlIHsKCQkJY3RyMyA9IGNvdW50ZXI7CgkJCXdyYXBzNCA9IHdyYXBzOwoJCQluY3QyID0gbmV3X2NvdW50OwoJCX0KCQkKCQljb3VudGVyID0gbmV3X2NvdW50OwoJfQoJCglwcmludGYoInVkZWxheSglZClcbiIsIHVzZWMxKTsKCXByaW50ZigiY291bnRlciAlZFxuIiwgY3RyMSk7CglwcmludGYoIjE6IHdyYXBzICVkLCB1c2VjICVkXG4iLCB3cmFwczEsIHVzZWMyKTsKCXByaW50ZigiMjogd3JhcHMgJWQsIHVzZWMgJWRcbiIsIHdyYXBzMiwgdXNlYzMpOwoJcHJpbnRmKCJuZXdfY291bnRbMF0gJWQgY291bnRlciAlZCB3cmFwcyAlZFxuIiwgbmN0MSwgY3RyMiwgd3JhcHMzKTsKCXByaW50ZigibmV3X2NvdW50WyVkXSAlZCBjb3VudGVyICVkIHdyYXBzICVkXG4iLCBpLCBuY3QyLCBjdHIzLCB3cmFwczQpOwoKCXByaW50ZigiJWQgJWQgJWQgJWQgJWRcbiIsCgkgICAgICAgcmVhZF9waXQoKSwgcmVhZF9waXQoKSwgcmVhZF9waXQoKSwKCSAgICAgICByZWFkX3BpdCgpLCByZWFkX3BpdCgpKTsKfQojZW5kaWYKI2VuZGlmCg==