Ly89PT0tLS0tLS0tLS0tLS0tLS0tLS0gbWFpbi5jYyAtIE12bSBhbGxvY2F0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdm0KLy8KLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCi8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KLy8KLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KCiNpbmNsdWRlICJnY2FsbG9jLmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgoKdW5zaWduZWQgaW50IHJhbmQodW5zaWduZWQgaW50IG1pbiwgdW5zaWduZWQgaW50IG1heCkgewoJcmV0dXJuICh1bnNpZ25lZCBpbnQpbmVhcmJ5aW50KCgoKGRvdWJsZSkobWF4IC0gbWluKSkqOjpyYW5kKCkpLyhSQU5EX01BWCArIDEuMCkpICsgbWluOwp9Cgp2b2lkIHRpcmUoc2l6ZV90IG4sIHNpemVfdCAqdmFscywgc2l6ZV90ICpyZWFsbG9jcywgc2l6ZV90ICpmcmVlcykgewoJZm9yKHNpemVfdCBpPTA7IGk8bjsgaSsrKSB7CgkJaWYocmFuZCgwLCAyMCkpCgkJCXZhbHNbaV0gPSByYW5kKDEsIDI1Nik7CgkJZWxzZQoJCQl2YWxzW2ldID0gcmFuZCgyNTYsIDY1NTM2KTsKCQlpZighcmFuZCgwLCAxMCkpIC8qIHVuIGNoYW5jZSBzdXIgMTAgZGUgculhbGxvdWVyICovCgkJCWlmKHJhbmQoMCwgMjApKQoJCQkJcmVhbGxvY3NbaV0gPSByYW5kKDEsIDI1Nik7CgkJCWVsc2UKCQkJCXJlYWxsb2NzW2ldID0gcmFuZCgyNTYsIDY1NTM2KTsKCQllbHNlCgkJCXJlYWxsb2NzW2ldID0gMDsKCQlpZihyYW5kKDAsIDEwKSkgLyogdW4gY2hhbmNlIHN1ciAxMCBkZSBuZSBwYXMgbGli6XJlciAqLwoJCQlmcmVlc1tpXSA9IDE7CgkJZWxzZQoJCQlmcmVlc1tpXSA9IDA7Cgl9Cn0KCnZvaWQgcHJpbnRNZXN1cmUoc2l6ZV90IG4sIHNpemVfdCAqdmFscywgc2l6ZV90ICpyZWFsbG9jcywgc2l6ZV90ICpmcmVlcywgc3RydWN0IHRpbWV2YWwgKnN0YXJ0LCBzdHJ1Y3QgdGltZXZhbCAqZW5kKSB7CglzaXplX3QgICB0b3RBbGxvY2F0ZWQgPSAwOwoJc2l6ZV90ICAgY3VyQWxsb2NhdGVkID0gMDsKCXNpemVfdCAgIG5hID0gMDsKCXNpemVfdCAgIG5yID0gMDsKCXNpemVfdCAgIG5mID0gMDsKCXNpemVfdCAgIG5vID0gMDsKCglmb3Ioc2l6ZV90IGk9MDsgaTxuOyBpKyspIHsKCQlzaXplX3QgaGVyZSA9IHZhbHNbaV0gKyByZWFsbG9jc1tpXTsKCQlpZihyZWFsbG9jc1tpXSkgewoJCQluYSsrOwoJCQlucisrOwoJCX0KCQluYSsrOwoJCXRvdEFsbG9jYXRlZCArPSBoZXJlOwoJCWlmKCFmcmVlc1tpXSkgewoJCQljdXJBbGxvY2F0ZWQgKz0gaGVyZTsKCQkJbm8rKzsKCQl9IGVsc2UKCQkJbmYrKzsKCX0KCglwcmludGYoIjsgJWQgYWxsb2NhdGlvbnMgKCVkIHJlYWxsb2NhdGlvbnMsICVkIGZyZWUsICVkIGNodW5rcylcbiIsIG5hLCBuciwgbmYsIG5vKTsKCXByaW50ZigiOyAgIEFsbG9jYXRlZDogJWQgYnl0ZXMsIGN1cnJlbnQgJWQgYnl0ZXNcbiIsIHRvdEFsbG9jYXRlZCwgY3VyQWxsb2NhdGVkKTsKCQoJc3RydWN0IHRpbWV2YWwgZGlmZjsKCXRpbWVyc3ViKGVuZCwgc3RhcnQsICZkaWZmKTsKCWRvdWJsZSBmID0gKGRvdWJsZSlkaWZmLnR2X3NlYyArICgoZG91YmxlKWRpZmYudHZfdXNlYyAvIDEwMDAwMDAuMCk7CglwcmludGYoIjsgICB0aW1lIGNvbnN1bWVkOiAlZnNcbiIsIGYpOwp9Cgp2b2lkIG1lc3VyZUFsbG9jYXRldXIoKSB7CglzaXplX3QgbiA9IDUxMioxMDI0OwoJc2l6ZV90KiB2YWxzID0gKHNpemVfdCopYWxsb2NhKHNpemVvZihzaXplX3QpICogbik7CglzaXplX3QqIHJlYWxsb2NzID0gKHNpemVfdCopYWxsb2NhKHNpemVvZihzaXplX3QpICogbik7CglzaXplX3QqIGZyZWVzID0gKHNpemVfdCopYWxsb2NhKHNpemVvZihzaXplX3QpICogbik7CgoJcHJpbnRmKCJUaXJlIHVuZSBzZXF1ZW5jZSBkJ2FsbG9jYXRpb25zIGFsbOlhdG9pcmVcbiIpOwoJdGlyZShuLCB2YWxzLCByZWFsbG9jcywgZnJlZXMpOwoKCXByaW50ZigidGVzdFxuIik7CglzdHJ1Y3QgdGltZXZhbCBzdGFydDsKCXN0cnVjdCB0aW1ldmFsIGVuZDsKCUdDQWxsb2NhdG9yICphID0gbmV3IEdDQWxsb2NhdG9yKCk7CgoJZ2V0dGltZW9mZGF5KCZzdGFydCwgMCk7Cglmb3Ioc2l6ZV90IGk9MDsgaTxuOyBpKyspIHsKCQl2b2lkICpwID0gYS0+YWxsb2ModmFsc1tpXSk7CgkJaWYocmVhbGxvY3NbaV0pCgkJCXAgPSBhLT5yZWFsbG9jKHAsIHJlYWxsb2NzW2ldKTsKCQlpZihmcmVlc1tpXSkKCQkJYS0+ZnJlZShwKTsKCX0KCWdldHRpbWVvZmRheSgmZW5kLCAwKTsKCWRlbGV0ZSBhOwoKCXByaW50TWVzdXJlKG4sIHZhbHMsIHJlYWxsb2NzLCBmcmVlcywgJnN0YXJ0LCAmZW5kKTsKCXByaW50ZigiUHJlc3MgYSBrZXkuLi5cbiIpOwoJZ2V0Y2hhcigpOwoKCWdldHRpbWVvZmRheSgmc3RhcnQsIDApOwoJZm9yKHNpemVfdCBpPTA7IGk8bjsgaSsrKSB7CgkJdm9pZCAqcCA9IG1hbGxvYyh2YWxzW2ldKTsKCQkoKGNoYXIgKilwKVswXSA9IDE7CgkJaWYocmVhbGxvY3NbaV0pCgkJCXAgPSByZWFsbG9jKHAsIHJlYWxsb2NzW2ldKTsKCQlpZihmcmVlc1tpXSkKCQkJZnJlZShwKTsKCX0KCWdldHRpbWVvZmRheSgmZW5kLCAwKTsKCXByaW50TWVzdXJlKG4sIHZhbHMsIHJlYWxsb2NzLCBmcmVlcywgJnN0YXJ0LCAmZW5kKTsKCXByaW50ZigiUHJlc3MgYSBrZXkuLi5cbiIpOwoJZ2V0Y2hhcigpOwoKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CgltZXN1cmVBbGxvY2F0ZXVyKCk7CgoJR0NIYXNoOjpkZXN0cm95KCk7CglyZXR1cm4gMDsKfQo=