ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJzb2Z0YXAvcnRjX3RpbWVyLmMgYi9hcC9saWIvbGlic29mdGFwL3J0Y190aW1lci5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxN2Q2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9saWIvbGlic29mdGFwL3J0Y190aW1lci5jCkBAIC0wLDAgKzEsMTU1IEBACisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAjaW5jbHVkZcf4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICA8c3RkaW8uaD4KKyNpbmNsdWRlICA8c3RkbGliLmg+CisjaW5jbHVkZSAgPHNpZ25hbC5oPgorI2luY2x1ZGUgIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgIDxzeXNsb2cuaD4KKyNpbmNsdWRlICA8ZmNudGwuaD4KKyNpbmNsdWRlICA8cHRocmVhZC5oPgorI2luY2x1ZGUgIDxzdGRsaWIuaD4KKyNpbmNsdWRlICA8c3RyaW5nLmg+CisjaW5jbHVkZSAgPGVycm5vLmg+CisjaW5jbHVkZSAgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlICA8dW5pc3RkLmg+CisjaW5jbHVkZSAgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgIDx0aW1lLmg+CisjaW5jbHVkZSAgPHN5cy9pcGMuaD4KKyNpbmNsdWRlICA8c3lzL21zZy5oPgorI2luY2x1ZGUgICJzb2Z0YXBfYXBpLmgiCisjaW5jbHVkZSAgIm1lc3NhZ2UuaCIKKyNpbmNsdWRlICAicnRjX3RpbWVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiDK/b7dveG5ubao0uXH+AorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogzeKyv7Hkwb/J+cP3x/gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqILrqtqjS5cf4CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHJ0Y190aW1lcl9hZGQoVUxPTkcgdWxTZWMsIFJUQ19JRCAgcnRjX2lkLCBpbnQgc3JjX2lkKS8vYWRkX3J0Y190aW1lcgoreworCWludCByZXQgPSAtMTsKKwlpbnQgZGF0YV9sZW4gPSAwOworCVJUQ19EQVRBX0JVRiAgYnVmID0gezB9OworCWNoYXIgcnRjX2NwdVsxNl0gPSB7MH07CisJY2hhciBydGNfY3BfcmVhZHlbOF0gPSB7MH07CisKKwkvL7zgv9jT0MTE0KnTptPDyejWw8HLtszKsbzktcRydGMKKwlpZiAodWxTZWMgPCA1OSkKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwgICAicnRjIHRpbWUgaXMgJWQsIGxlc3MgdGhhbiA2MC4gc3JjOjB4JXgsIGlkOjB4JXggXG4iLCB1bFNlYywgc3JjX2lkLCBydGNfaWQpOworCisJYnVmLnNyY01vZHVsZSA9IHNyY19pZDsKKwlidWYubW9kdWxlID0gcnRjX2lkOworCWJ1Zi51bFNlYyA9IHVsU2VjOworCWJ1Zi53YWtldXAgPSAwOworCWJ1Zi5pc191dGMgPSAwOworCWRhdGFfbGVuID0gc2l6ZW9mKFJUQ19EQVRBX0JVRik7CisJYnVmLnRpbWVfdmFsID0gdGltZSgwKTsKKwlidWYuY3B1ID0gUlRDX0NQVV9BUDsKKworCXJldCA9IGlwY19zZW5kX21lc3NhZ2Uoc3JjX2lkLCBNT0RVTEVfSURfUlRDX1NFUlZJQ0UsIFJUQ19NU0dfQUREX0FMQVJNLCBkYXRhX2xlbiwgKHVuc2lnbmVkIGNoYXIgKikmYnVmLCAwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwgICAicnRjOiBzZXQgcnRjIHRpbWVyIHNlbmQgbXNnIGZhaWxlZCBcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IHJ0Y190aW1lcl9hZGRfdXRjKHN0cnVjdCB0bSAqc2VjLCBSVENfSUQgcnRjX2lkLCBpbnQgc3JjX2lkLCBpbnQgd2FrZXVwKS8vYWRkX3J0Y190aW1lcgoreworCWludCByZXQgPSAtMTsKKwl0aW1lX3QgY3VyX3NlYyA9IHRpbWUoMCk7CisJdGltZV90IHNldF9zZWMgPSBta3RpbWUoc2VjKTsKKwljaGFyIHNudHBfcmVzdWx0WzIwXSA9IHswfTsKKwljaGFyIHJ0Y19jcHVbMTZdID0gezB9OworCWNoYXIgcnRjX2NwX3JlYWR5WzhdID0gezB9OworCisJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwgICAicnRjX3RpbWVyX2FkZF91dGMgZW50ZXIgXG4iKTsKKworI2lmIDAKKwkvLyDJ6NbDysC958qx1tO2qMqxxvejrLHY0Ou1yHNudHCzybmmuvMKKwlzY19jZmdfZ2V0KCJzbnRwX3Byb2Nlc3NfcmVzdWx0Iiwgc250cF9yZXN1bHQsIHNpemVvZihzbnRwX3Jlc3VsdCkpOworCWlmIChzdHJjbXAoInN1Y2Nlc3MiLCBzbnRwX3Jlc3VsdCkgIT0gMCkgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCAgICJydGM6IHNldCB1dGMgdGltZXIgc2hvdWxkIGJlIGFmdGVyIHNudHAgc3VjY2Vzc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisJLy8gyejWw7aoyrHG98qxvOSx2NDrze3T2rWxx7DKsbzkCisJaWYgKGN1cl9zZWMgPj0gc2V0X3NlYykgeworCQlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCAgICJydGM6IHNldCB0aW1lLSVsZCBzaG91bGQgYmUgYWZ0ZXIgdGhlbiBjdXJybmV0IHRpbWUtJWxkXG4iLCBzZXRfc2VjLCBjdXJfc2VjKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbnQgZGF0YV9sZW4gPSAwOworCVJUQ19EQVRBX0JVRiBidWYgPSB7MH07CisKKwlidWYuc3JjTW9kdWxlID0gc3JjX2lkOworCWJ1Zi5tb2R1bGUgPSBydGNfaWQ7CisJYnVmLnVsU2VjID0gc2V0X3NlYyAtIGN1cl9zZWM7CisJYnVmLnRpbWVfdmFsID0gY3VyX3NlYzsKKwlidWYud2FrZXVwID0gd2FrZXVwOworCWJ1Zi5pc191dGMgPSAxOworCWJ1Zi5jcHUgPSBSVENfQ1BVX0FQOworCWRhdGFfbGVuID0gc2l6ZW9mKFJUQ19EQVRBX0JVRik7CisKKwlzbG9nKE1JU0NfUFJJTlQsIFNMT0dfRVJSLCAgICJydGMgYWRkIHV0YyB0aW1lciwgY3VyOiVsZCwgc2V0OiVsZCwgdWxTZWM6JWQ7IHllYXI6JWQsIG1vbjolZCwgZGF5OiVkLCBob3VyOiVkLCBtaW46JWQsIHNlYzolZCwgd2RheTolZCwgeWRheTolZCBcbiIsIGJ1Zi50aW1lX3ZhbCwgc2V0X3NlYywgYnVmLnVsU2VjLCBzZWMtPnRtX3llYXIsIHNlYy0+dG1fbW9uLCBzZWMtPnRtX21kYXksIHNlYy0+dG1faG91ciwgc2VjLT50bV9taW4sIHNlYy0+dG1fc2VjLCBzZWMtPnRtX3dkYXksIHNlYy0+dG1feWRheSk7CisJcmV0ID0gIGlwY19zZW5kX21lc3NhZ2Uoc3JjX2lkLCBNT0RVTEVfSURfUlRDX1NFUlZJQ0UsIFJUQ19NU0dfQUREX0FMQVJNLCBkYXRhX2xlbiwgKHVuc2lnbmVkIGNoYXIgKikmYnVmLCAwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJc2xvZyhNSVNDX1BSSU5ULCBTTE9HX0VSUiwgICAicnRjOiBzZXQgcnRjIHV0YyB0aW1lciBzZW5kIG1zZyBmYWlsZWQgXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBydGNfdGltZXJfZGVsKFJUQ19JRCBydGNfaWQsIGludCBzcmNfaWQpCit7CisJaW50IHJldCA9IC0xOworCWludCBkYXRhX2xlbiA9IDA7CisJUlRDX0RBVEFfQlVGICBidWYgPSB7MH07CisKKwlidWYuc3JjTW9kdWxlID0gc3JjX2lkOworCWJ1Zi5tb2R1bGUgPSBydGNfaWQ7CisJYnVmLmNwdSA9IFJUQ19DUFVfQVA7CisJZGF0YV9sZW4gPSBzaXplb2YoUlRDX0RBVEFfQlVGKTsKKworCXJldCA9IGlwY19zZW5kX21lc3NhZ2Uoc3JjX2lkLCBNT0RVTEVfSURfUlRDX1NFUlZJQ0UsIFJUQ19NU0dfREVMX0FMQVJNLCBkYXRhX2xlbiwgKHVuc2lnbmVkIGNoYXIgKikgJmJ1ZiwgMCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtMTsKK30KKworaW50IHJ0Y190aW1lcl9kZWxfYWxsKGludCBzcmNfaWQsIHVuc2lnbmVkIHNob3J0IHJlcV9jbWQpCit7CisJaW50IHJldCA9IC0xOworCisJcmV0ID0gaXBjX3NlbmRfbWVzc2FnZShzcmNfaWQsIE1PRFVMRV9JRF9SVENfU0VSVklDRSwgUlRDX01TR19ERUxfQUxMLCBzaXplb2YodW5zaWduZWQgc2hvcnQpLCAmcmVxX2NtZCwgMCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtMTsKK30KKworaW50ICBydGNfc2V0X3RpbWUoaW50IHNyY19pZCkKK3sKKwlpbnQgcmV0ID0gLTE7CisJdGltZV90IGN1cl90aW1lID0gdGltZSgwKTsKKworCXJldCA9IGlwY19zZW5kX21lc3NhZ2Uoc3JjX2lkLCBNT0RVTEVfSURfUlRDX1NFUlZJQ0UsIFJUQ19NU0dfU0VUX1RJTUUsIHNpemVvZih0aW1lX3QpLCAmY3VyX3RpbWUsIDApOworCWlmIChyZXQgPT0gMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CisKKwo=