ZGlmZiAtLWdpdCBhL2NwdS9pMzg2L3RpbWVyLmMgYi9jcHUvaTM4Ni90aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyM2NkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9jcHUvaTM4Ni90aW1lci5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDAyCisgKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgZGFuaWVsQG9taWNyb24uc2UuCisgKgorICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKKyAqIHByb2plY3QuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAqIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pODI1NC5oPgorI2luY2x1ZGUgPGFzbS9pYm1wYy5oPgorCisKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHN5c3RlbV90aWNrczsKK3N0YXRpYyBpbnQgdGltZXJfaW5pdF9kb25lID0wOworCitzdGF0aWMgdm9pZCB0aW1lcl9pc3Iodm9pZCAqdW51c2VkKQoreworCXN5c3RlbV90aWNrcysrOworfQorCit1bnNpZ25lZCBsb25nIGdldF9zeXN0ZW1fdGlja3Modm9pZCkKK3sKKwlyZXR1cm4gc3lzdGVtX3RpY2tzOworfQorCisjZGVmaW5lIFRJTUVSMF9WQUxVRSAweDA0YWEgLyogMWtIeiAxLjkzMThNSHogLyAxMDAwICovCisjZGVmaW5lIFRJTUVSMl9WQUxVRSAweDBhOGUgLyogNDQwSHogKi8KKworaW50IHRpbWVyX2luaXQodm9pZCkKK3sKKwlzeXN0ZW1fdGlja3MgPSAwOworCQorCWlycV9pbnN0YWxsX2hhbmRsZXIoMCwgdGltZXJfaXNyLCBOVUxMKTsKKwkKKwkvKiBpbml0aWFsaXplIHRpbWVyIDAgYW5kIDIgCisJICogCisJICogVGltZXIgMCBpcyB1c2VkIHRvIGluY3JlbWVudCBzeXN0ZW1fdGljayAxMDAwIHRpbWVzL3NlYworCSAqIFRpbWVyIDEgd2FzIHVzZWQgZm9yIERSQU0gcmVmcmVzaCBpbiBlYXJseSBQQydzCisJICogVGltZXIgMiBpcyB1c2VkIHRvIGRyaXZlIHRoZSBzcGVha2VyCisJICogKHRvIHN0YXNydCBhIGJlZXA6IHdyaXRlIDMgdG8gcG9ydCAweDYxLAorCSAqIHRvIHN0b3AgaXQgYWdhaW46IHdyaXRlIDApCisJICovCisJCQorICAgICAgICBvdXRiKFBJVF9DTURfQ1RSMHxQSVRfQ01EX0JPVEh8UElUX0NNRF9NT0RFMiwgUElUX0JBU0UgKyBQSVRfQ09NTUFORCk7CisJb3V0YihUSU1FUjBfVkFMVUUmMHhmZiwgUElUX0JBU0UgKyBQSVRfVDApOworCW91dGIoVElNRVIwX1ZBTFVFPj44LCBQSVRfQkFTRSArIFBJVF9UMCk7CisKKyAgICAgICAgb3V0YihQSVRfQ01EX0NUUjJ8UElUX0NNRF9CT1RIfFBJVF9DTURfTU9ERTMsIFBJVF9CQVNFICsgUElUX0NPTU1BTkQpOworCW91dGIoVElNRVIyX1ZBTFVFJjB4ZmYsIFBJVF9CQVNFICsgUElUX1QyKTsKKwlvdXRiKFRJTUVSMl9WQUxVRT4+OCwgUElUX0JBU0UgKyBQSVRfVDIpOworCisJdGltZXJfaW5pdF9kb25lID0gMTsKKwkKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgQ0ZHX1RJTUVSX0dFTkVSSUMKKworLyogdGhlIHVuaXQgZm9yIHRoZXNlIGlzIENGR19IWiAqLworCisvKiBGaXhNZTogaW1wbGVtZW50IHRoZXNlICovCit2b2lkIHJlc2V0X3RpbWVyICh2b2lkKQoreworCXN5c3RlbV90aWNrcyA9IDA7Cit9CisKK3Vsb25nIGdldF90aW1lciAodWxvbmcgYmFzZSkKK3sKKwlyZXR1cm4gKHN5c3RlbV90aWNrcyAtIGJhc2UpOworfQorCit2b2lkIHNldF90aW1lciAodWxvbmcgdCkJCit7CisJc3lzdGVtX3RpY2tzID0gdDsKK30KKworc3RhdGljIHUxNiByZWFkX3BpdCh2b2lkKQoreworCXU4IGxvdzsKKwlvdXRiKFBJVF9DTURfTEFUQ0gsIFBJVF9CQVNFICsgUElUX0NPTU1BTkQpOworCWxvdyA9IGluYihQSVRfQkFTRSArIFBJVF9UMCk7CisJcmV0dXJuICgoaW5iKFBJVF9CQVNFICsgUElUX1QwKSA8PCA4KSB8IGxvdyk7Cit9CisKKy8qIHRoaXMgaXMgbm90IHZlcnkgZXhhY3QgKi8KK3ZvaWQgdWRlbGF5ICh1bnNpZ25lZCBsb25nIHVzZWMpCit7CQorCWludCBjb3VudGVyOworCWludCB3cmFwczsKKwkKKwlpZiAoIXRpbWVyX2luaXRfZG9uZSkgeworCQlyZXR1cm47CisJfQorCWNvdW50ZXIgPSByZWFkX3BpdCgpOworCXdyYXBzID0gdXNlYy8xMDAwOworCXVzZWMgPSB1c2VjJTEwMDA7CisJCisJdXNlYyo9MTE5NDsKKwl1c2VjLz0xMDAwOworCXVzZWMrPWNvdW50ZXI7IAorCWlmICh1c2VjID4gMTE5NCkgeworCQl1c2VjLT0xMTk0OworCQl3cmFwcysrOworCX0KKworCXdoaWxlICgxKSB7CisJCWludCBuZXdfY291bnQgPSByZWFkX3BpdCgpOworCQkKKwkJaWYgKCgobmV3X2NvdW50IDwgdXNlYykgJiYgIXdyYXBzKSB8fCB3cmFwcyA8IDApIHsKKwkJCWJyZWFrOworCQl9CisJCQorCQlpZiAobmV3X2NvdW50ID4gY291bnRlcikgeworCQkJd3JhcHMtLTsKKwkJfQorCQljb3VudGVyID0gbmV3X2NvdW50OworCX0KKwkKK30KKworI2lmIDAKKy8qIHRoaXMgaXMgYSB2ZXJzaW9uIHdpdGggZGVidWcgb3V0cHV0ICovCit2b2lkIF91ZGVsYXkgKHVuc2lnbmVkIGxvbmcgdXNlYykKK3sJCisJaW50IGNvdW50ZXI7CisJaW50IHdyYXBzOworCQorCWludCB1c2VjMSwgdXNlYzIsIHVzZWMzOworCWludCB3cmFwczEsIHdyYXBzMiwgd3JhcHMzLCB3cmFwczQ7CisJaW50IGN0cjEsIGN0cjIsIGN0cjMsIG5jdDEsIG5jdDI7CisJaW50IGk7CisJdXNlYzE9dXNlYzsKKwlpZiAoIXRpbWVyX2luaXRfZG9uZSkgeworCQlyZXR1cm47CisJfQorCWNvdW50ZXIgPSByZWFkX3BpdCgpOworCWN0cjEgPSBjb3VudGVyOworCXdyYXBzID0gdXNlYy8xMDAwOworCXVzZWMgPSB1c2VjJTEwMDA7CisJCisJdXNlYzIgPSB1c2VjOworCXdyYXBzMSA9IHdyYXBzOworCQorCXVzZWMqPTExOTQ7CisJdXNlYy89MTAwMDsKKwl1c2VjKz1jb3VudGVyOyAKKwlpZiAodXNlYyA+IDExOTQpIHsKKwkJdXNlYy09MTE5NDsKKwkJd3JhcHMrKzsKKwl9CisKKwl1c2VjMyA9IHVzZWM7CisJd3JhcHMyID0gd3JhcHM7CisJCisJY3RyMiA9IHdyYXBzMyA9IG5jdDEgPSA0NzExOworCWN0cjMgPSB3cmFwczQgPSBuY3QyID0gNDcxMTsKKwlpPTA7CisJd2hpbGUgKDEpIHsKKwkJaW50IG5ld19jb3VudCA9IHJlYWRfcGl0KCk7CisJCWkrKzsKKwkJaWYgKChuZXdfY291bnQgPCB1c2VjICYmICF3cmFwcykgfHwgd3JhcHMgPCAwKSB7CisJCQlicmVhazsKKwkJfQorCQkKKwkJaWYgKG5ld19jb3VudCA+IGNvdW50ZXIpIHsKKwkJCXdyYXBzLS07CisJCX0KKwkJaWYgKGN0cjI9PTQ3MTEpIHsKKwkJCWN0cjIgPSBjb3VudGVyOworCQkJd3JhcHMzID0gd3JhcHM7CisJCQluY3QxID0gbmV3X2NvdW50OworCQl9IGVsc2UgeworCQkJY3RyMyA9IGNvdW50ZXI7CisJCQl3cmFwczQgPSB3cmFwczsKKwkJCW5jdDIgPSBuZXdfY291bnQ7CisJCX0KKwkJCisJCWNvdW50ZXIgPSBuZXdfY291bnQ7CisJfQorCQorCXByaW50ZigidWRlbGF5KCVkKVxuIiwgdXNlYzEpOworCXByaW50ZigiY291bnRlciAlZFxuIiwgY3RyMSk7CisJcHJpbnRmKCIxOiB3cmFwcyAlZCwgdXNlYyAlZFxuIiwgd3JhcHMxLCB1c2VjMik7CisJcHJpbnRmKCIyOiB3cmFwcyAlZCwgdXNlYyAlZFxuIiwgd3JhcHMyLCB1c2VjMyk7CisJcHJpbnRmKCJuZXdfY291bnRbMF0gJWQgY291bnRlciAlZCB3cmFwcyAlZFxuIiwgbmN0MSwgY3RyMiwgd3JhcHMzKTsKKwlwcmludGYoIm5ld19jb3VudFslZF0gJWQgY291bnRlciAlZCB3cmFwcyAlZFxuIiwgaSwgbmN0MiwgY3RyMywgd3JhcHM0KTsKKworCXByaW50ZigiJWQgJWQgJWQgJWQgJWRcbiIsCisJICAgICAgIHJlYWRfcGl0KCksIHJlYWRfcGl0KCksIHJlYWRfcGl0KCksCisJICAgICAgIHJlYWRfcGl0KCksIHJlYWRfcGl0KCkpOworfQorI2VuZGlmCisjZW5kaWYK