LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwKICogYnV0IGlkZXBlbmRlbnQgb2YgaW1wbGVtZW50YXRpb24gKi8KCiNpbmNsdWRlIDxjb25maWcuaD4KCiNpZmRlZiBDT05GSUdfU0M1MjAKCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgojaW5jbHVkZSA8cGNpLmg+CiNpZmRlZiBDT05GSUdfU0M1MjBfU1NJCiNpbmNsdWRlIDxzc2kuaD4KI2VuZGlmCiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9wY2kuaD4KI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgoKREVDTEFSRV9HTE9CQUxfREFUQV9QVFI7CgovKgogKiB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYm9hcmRzIGJhc2VkIG9uIHRoZSBBTUQgc2M1MjAKICoKICogdm9pZCB3cml0ZV9tbWNyX2J5dGUodTE2IG1tY3IsIHU4IGRhdGEpCiAqIHZvaWQgd3JpdGVfbW1jcl93b3JkKHUxNiBtbWNyLCB1MTYgZGF0YSkKICogdm9pZCB3cml0ZV9tbWNyX2xvbmcodTE2IG1tY3IsIHUzMiBkYXRhKQogKgogKiB1OCAgIHJlYWRfbW1jcl9ieXRlKHUxNiBtbWNyKQogKiB1MTYgIHJlYWRfbW1jcl93b3JkKHUxNiBtbWNyKQogKiB1MzIgIHJlYWRfbW1jcl9sb25nKHUxNiBtbWNyKQogKgogKiB2b2lkIGluaXRfc2M1MjAodm9pZCkKICogdW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKICogdm9pZCBwY2lfc2M1MjBfaW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCiAqCiAqIHZvaWQgcmVzZXRfdGltZXIodm9pZCkKICogdWxvbmcgZ2V0X3RpbWVyKHVsb25nIGJhc2UpCiAqIHZvaWQgc2V0X3RpbWVyKHVsb25nIHQpCiAqIHZvaWQgdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlYykKICoKICovCgpzdGF0aWMgdTMyIG1tY3JfYmFzZT0gMHhmZmZlZjAwMDsKCnZvaWQgd3JpdGVfbW1jcl9ieXRlKHUxNiBtbWNyLCB1OCBkYXRhKQp7Cgl3cml0ZWIoZGF0YSwgbW1jcittbWNyX2Jhc2UpOwp9Cgp2b2lkIHdyaXRlX21tY3Jfd29yZCh1MTYgbW1jciwgdTE2IGRhdGEpCnsKCXdyaXRldyhkYXRhLCBtbWNyK21tY3JfYmFzZSk7Cn0KCnZvaWQgd3JpdGVfbW1jcl9sb25nKHUxNiBtbWNyLCB1MzIgZGF0YSkKewoJd3JpdGVsKGRhdGEsIG1tY3IrbW1jcl9iYXNlKTsKfQoKdTggcmVhZF9tbWNyX2J5dGUodTE2IG1tY3IpCnsKCXJldHVybiByZWFkYihtbWNyK21tY3JfYmFzZSk7Cn0KCnUxNiByZWFkX21tY3Jfd29yZCh1MTYgbW1jcikKewoJcmV0dXJuIHJlYWR3KG1tY3IrbW1jcl9iYXNlKTsKfQoKdTMyIHJlYWRfbW1jcl9sb25nKHUxNiBtbWNyKQp7CglyZXR1cm4gcmVhZGwobW1jcittbWNyX2Jhc2UpOwp9CgoKdm9pZCBpbml0X3NjNTIwKHZvaWQpCnsKCS8qIFNldCB0aGUgVUFSVHhDVEwgcmVnaXN0ZXIgYXQgaXQncyBzbG93ZXIsCgkgKiBiYXVkIGNsb2NrIGdpdmluZyB1cyBhIDEuODQzMiBNSHogcmVmZXJlbmNlCgkgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMUNUTCwgNyk7Cgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfVUFSVDJDVEwsIDcpOwoKCS8qIGZpcnN0IHNldCB0aGUgdGltZXIgcGluIG1hcHBpbmcgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9DTEtTRUwsIDB4NzIpOwkvKiBubyBjbG9jayBmcmVxdWVuY3kgc2VsZWN0ZWQsIHVzZSAxLjE4OTJNSHogKi8KCgkvKiBlbmFibGUgUENJIGJ1cyBhcmJpdHJlciAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NZU0FSQkNUTCwweDAyKTsgIC8qIGVuYWJsZSBjb25jdXJyZW50IG1vZGUgKi8KCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfU1lTQVJCTUVOQiwweDFmKTsgLyogZW5hYmxlIGV4dGVybmFsIGdyYW50cyAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0hCQ1RMLDB4MDQpOyAgICAgIC8qIGVuYWJsZSBwb3N0ZWQtd3JpdGVzICovCgoKCWlmIChDRkdfU0M1MjBfSElHSF9TUEVFRCkgewoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9DUFVDVEwsIDB4Mik7CS8qIHNldCBpdCB0byAxMzMgTUh6IGFuZCB3cml0ZSBiYWNrICovCgkJZ2QtPmNwdV9jbGsgPSAxMzMwMDAwMDA7CgkJcHJpbnRmKCIjIyBDUFUgU3BlZWQgc2V0IHRvIDEzM01IelxuIik7Cgl9IGVsc2UgewoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9DUFVDVEwsIDEpOwkvKiBzZXQgQ1BVIHRvIDEwMCBNSHogYW5kIHdyaXRlIGJhY2sgY2FjaGUgKi8KCQlwcmludGYoIiMjIENQVSBTcGVlZCBzZXQgdG8gMTAwTUh6XG4iKTsKCQlnZC0+Y3B1X2NsayA9IDEwMDAwMDAwMDsKCX0KCgoJLyogd2FpdCBhdCBsZWFzdCBvbmUgbWlsbGlzZWNvbmQgKi8KCWFzbSgibW92bAkkMHgyMDAwLCUlZWN4XG4iCgkgICAgIndhaXRfbG9vcDoJcHVzaGwgJSVlY3hcbiIKCSAgICAicG9wbAklJWVjeFxuIgoJICAgICJsb29wIHdhaXRfbG9vcFxuIjogOiA6ICJlY3giKTsKCgkvKiB0dXJuIG9uIHRoZSBTRFJBTSB3cml0ZSBidWZmZXIgKi8KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9EQkNUTCwgMHgxMSk7CgoJLyogdHVybiBvbiB0aGUgY2FjaGUgYW5kIGRpc2FibGUgd3JpdGUgdGhyb3VnaCAqLwoJYXNtKCJtb3ZsCSUlY3IwLCAlJWVheFxuIgoJICAgICJhbmRsCSQweDlmZmZmZmZmLCAlJWVheFxuIgoJICAgICJtb3ZsCSUlZWF4LCAlJWNyMFxuIiAgOiA6IDogImVheCIpOwp9Cgp1bnNpZ25lZCBsb25nIGluaXRfc2M1MjBfZHJhbSh2b2lkKQp7CgliZF90ICpiZCA9IGdkLT5iZDsKCgl1MzIgZHJhbV9wcmVzZW50PTA7Cgl1MzIgZHJhbV9jdHJsOwojaWZkZWYgQ0ZHX1NEUkFNX0RSQ1RNQ1RMCgkvKiB0aGVzZSBtZW1vcnkgY29udHJvbCByZWdpc3RlcnMgYXJlIHNldCB1cCBpbiB0aGUgYXNzZW1iZXIgcGFydCwKCSAqIGluIHNjNTIwX2FzbS5TLCBkdXJpbmcgJ21lbV9pbml0Jy4gIElmIHdlIG11Y2sgd2l0aCB0aGVtIGhlcmUsCgkgKiBhZnRlciB3ZSBhcmUgcnVubmluZyBhIHN0YWNrIGluIFJBTSwgd2UgaGF2ZSB0cm91Ymxlcy4gIEJlc2lkZXMsCgkgKiB0aGVzZSByZWZyZXNoIGFuZCBkZWxheSB2YWx1ZXMgYXJlIGJldHRlciA/IHNpbXBseSBzcGVjaWZpZWQgCgkgKiBvdXRyaWdodCBpbiB0aGUgaW5jbHVkZS9jb25maWdzL3tjZmd9IGZpbGUgc2luY2UgdGhlIEhXIGRlc2lnbmVyCgkgKiBzaW1wbHkgZGljdGF0ZXMgaXQuCgkgKi8KI2Vsc2UKCWludCB2YWw7CgoJaW50IGNhc19wcmVjaGFyZ2VfZGVsYXkgPSBDRkdfU0RSQU1fUFJFQ0hBUkdFX0RFTEFZOwoJaW50IHJlZnJlc2hfcmF0ZSAgICAgICAgPSBDRkdfU0RSQU1fUkVGUkVTSF9SQVRFOwoJaW50IHJhc19jYXNfZGVsYXkgICAgICAgPSBDRkdfU0RSQU1fUkFTX0NBU19ERUxBWTsKCgkvKiBzZXQgU0RSQU0gc3BlZWQgaGVyZSAqLwoKCXJlZnJlc2hfcmF0ZS89Nzg7CglpZiAocmVmcmVzaF9yYXRlPD0xKSB7CgkJdmFsID0gMDsgIC8qIDcuOHVzICovCgl9IGVsc2UgaWYgKHJlZnJlc2hfcmF0ZT09MikgewoJCXZhbCA9IDE7ICAvKiAxNS42dXMgKi8KCX0gZWxzZSBpZiAocmVmcmVzaF9yYXRlPT0zIHx8IHJlZnJlc2hfcmF0ZT09NCkgewoJCXZhbCA9IDI7ICAvKiAzMS4ydXMgKi8KCX0gZWxzZSB7CgkJdmFsID0gMzsgIC8qIDYyLjR1cyAqLwoJfQoKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9EUkNDVEwsIChyZWFkX21tY3JfYnl0ZShTQzUyMF9EUkNDVEwpICYgMHhjZikgfCAodmFsPDw0KSk7CgoJdmFsID0gcmVhZF9tbWNyX2J5dGUoU0M1MjBfRFJDVE1DVEwpOwoJdmFsICY9IDB4ZjA7CgoJaWYgKGNhc19wcmVjaGFyZ2VfZGVsYXk9PTMpIHsKCQl2YWwgfD0gMHgwNDsgICAvKiAzVCAqLwoJfSBlbHNlIGlmIChjYXNfcHJlY2hhcmdlX2RlbGF5PT00KSB7CgkJdmFsIHw9IDB4MDg7ICAgLyogNFQgKi8KCX0gZWxzZSBpZiAoY2FzX3ByZWNoYXJnZV9kZWxheT40KSB7CgkJdmFsIHw9IDB4MGM7Cgl9CgoJaWYgKHJhc19jYXNfZGVsYXkgPiAzKSB7CgkJdmFsIHw9IDI7Cgl9IGVsc2UgewoJCXZhbCB8PSAxOwoJfQoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0RSQ1RNQ1RMLCB2YWwpOwojZW5kaWYKCgkvKiBXZSByZWFkLWJhY2sgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGRyYW0KCSAqIGNvbnRyb2xsZXIgdGhhdCB0aGUgYXNzZW1ibHkgY29kZSB3cm90ZSAqLwoJZHJhbV9jdHJsID0gcmVhZF9tbWNyX2xvbmcoU0M1MjBfRFJDQkVOREFEUik7CgoJYmQtPmJpX2RyYW1bMF0uc3RhcnQgPSAwOwoJaWYgKGRyYW1fY3RybCAmIDB4ODApIHsKCQkvKiBiYW5rIDAgZW5hYmxlZCAqLwoJCWRyYW1fcHJlc2VudCA9IGJkLT5iaV9kcmFtWzFdLnN0YXJ0ID0gKGRyYW1fY3RybCAmIDB4N2YpIDw8IDIyOwoJCWJkLT5iaV9kcmFtWzBdLnNpemUgPSBiZC0+YmlfZHJhbVsxXS5zdGFydDsKCgl9IGVsc2UgewoJCWJkLT5iaV9kcmFtWzBdLnNpemUgPSAwOwoJCWJkLT5iaV9kcmFtWzFdLnN0YXJ0ID0gYmQtPmJpX2RyYW1bMF0uc3RhcnQ7Cgl9CgoJaWYgKGRyYW1fY3RybCAmIDB4ODAwMCkgewoJCS8qIGJhbmsgMSBlbmFibGVkICovCgkJZHJhbV9wcmVzZW50ID0gYmQtPmJpX2RyYW1bMl0uc3RhcnQgPSAoZHJhbV9jdHJsICYgMHg3ZjAwKSA8PCAxNDsKCQliZC0+YmlfZHJhbVsxXS5zaXplID0gYmQtPmJpX2RyYW1bMl0uc3RhcnQgLSAgYmQtPmJpX2RyYW1bMV0uc3RhcnQ7Cgl9IGVsc2UgewoJCWJkLT5iaV9kcmFtWzFdLnNpemUgPSAwOwoJCWJkLT5iaV9kcmFtWzJdLnN0YXJ0ID0gYmQtPmJpX2RyYW1bMV0uc3RhcnQ7Cgl9CgoJaWYgKGRyYW1fY3RybCAmIDB4ODAwMDAwKSB7CgkJLyogYmFuayAyIGVuYWJsZWQgKi8KCQlkcmFtX3ByZXNlbnQgPSBiZC0+YmlfZHJhbVszXS5zdGFydCA9IChkcmFtX2N0cmwgJiAweDdmMDAwMCkgPDwgNjsKCQliZC0+YmlfZHJhbVsyXS5zaXplID0gYmQtPmJpX2RyYW1bM10uc3RhcnQgLSAgYmQtPmJpX2RyYW1bMl0uc3RhcnQ7Cgl9IGVsc2UgewoJCWJkLT5iaV9kcmFtWzJdLnNpemUgPSAwOwoJCWJkLT5iaV9kcmFtWzNdLnN0YXJ0ID0gYmQtPmJpX2RyYW1bMl0uc3RhcnQ7Cgl9CgoJaWYgKGRyYW1fY3RybCAmIDB4ODAwMDAwMDApIHsKCQkvKiBiYW5rIDMgZW5hYmxlZCAqLwoJCWRyYW1fcHJlc2VudCAgPSAoZHJhbV9jdHJsICYgMHg3ZjAwMDAwMCkgPj4gMjsKCQliZC0+YmlfZHJhbVszXS5zaXplID0gZHJhbV9wcmVzZW50IC0gIGJkLT5iaV9kcmFtWzNdLnN0YXJ0OwoJfSBlbHNlIHsKCQliZC0+YmlfZHJhbVszXS5zaXplID0gMDsKCX0KCgojaWYgMAoJcHJpbnRmKCJDb25maWd1cmVkICVkIGJ5dGVzIG9mIGRyYW1cbiIsIGRyYW1fcHJlc2VudCk7CiNlbmRpZgoJZ2QtPnJhbV9zaXplID0gZHJhbV9wcmVzZW50OwoKCXJldHVybiBkcmFtX3ByZXNlbnQ7Cn0KCgojaWZkZWYgQ09ORklHX1BDSQoKCnN0YXRpYyBzdHJ1Y3QgewoJdTggcHJpb3JpdHk7Cgl1MTYgbGV2ZWxfcmVnOwoJdTggbGV2ZWxfYml0Owp9IHNjNTIwX2lycVtdID0gewoJeyBTQzUyMF9JUlEwLCAgU0M1MjBfTVBJQ01PREUsICAweDAxIH0sCgl7IFNDNTIwX0lSUTEsICBTQzUyMF9NUElDTU9ERSwgIDB4MDIgfSwKCXsgU0M1MjBfSVJRMiwgIFNDNTIwX1NMMVBJQ01PREUsIDB4MDIgfSwKCXsgU0M1MjBfSVJRMywgIFNDNTIwX01QSUNNT0RFLCAgMHgwOCB9LAoJeyBTQzUyMF9JUlE0LCAgU0M1MjBfTVBJQ01PREUsICAweDEwIH0sCgl7IFNDNTIwX0lSUTUsICBTQzUyMF9NUElDTU9ERSwgIDB4MjAgfSwKCXsgU0M1MjBfSVJRNiwgIFNDNTIwX01QSUNNT0RFLCAgMHg0MCB9LAoJeyBTQzUyMF9JUlE3LCAgU0M1MjBfTVBJQ01PREUsICAweDgwIH0sCgoJeyBTQzUyMF9JUlE4LCAgU0M1MjBfU0wxUElDTU9ERSwgMHgwMSB9LAoJeyBTQzUyMF9JUlE5LCAgU0M1MjBfU0wxUElDTU9ERSwgMHgwMiB9LAoJeyBTQzUyMF9JUlExMCwgU0M1MjBfU0wxUElDTU9ERSwgMHgwNCB9LAoJeyBTQzUyMF9JUlExMSwgU0M1MjBfU0wxUElDTU9ERSwgMHgwOCB9LAoJeyBTQzUyMF9JUlExMiwgU0M1MjBfU0wxUElDTU9ERSwgMHgxMCB9LAoJeyBTQzUyMF9JUlExMywgU0M1MjBfU0wxUElDTU9ERSwgMHgyMCB9LAoJeyBTQzUyMF9JUlExNCwgU0M1MjBfU0wxUElDTU9ERSwgMHg0MCB9LAoJeyBTQzUyMF9JUlExNSwgU0M1MjBfU0wxUElDTU9ERSwgMHg4MCB9Cn07CgoKLyogVGhlIGludGVycnVwdCB1c2VkIGZvciBQQ0kgSU5UQS1JTlREICAqLwppbnQgc2M1MjBfcGNpX2ludHNbMTVdID0gewoJLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAoJCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xCn07CgovKiB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSBhIHBjaSBpbnRlcnJ1cHQgKi8KaW50IHBjaV9zYzUyMF9zZXRfaXJxKGludCBwY2lfcGluLCBpbnQgaXJxKQp7CglpbnQgaTsKCiMgaWYgMQoJcHJpbnRmKCJzZXRfaXJxKCk6IG1hcCBJTlQlYyB0byBJUlElZFxuIiwgcGNpX3BpbiArICdBJywgaXJxKTsKI2VuZGlmCglpZiAoaXJxIDwgMCB8fCBpcnEgPiAxNSkgewoJCXJldHVybiAtMTsgLyogaWxsZWdhbCBpcnEgKi8KCX0KCglpZiAocGNpX3BpbiA8IDAgfHwgcGNpX3BpbiA+IDE1KSB7CgkJcmV0dXJuIC0xOyAvKiBpbGxlZ2FsIHBjaSBpbnQgcGluICovCgl9CgoJLyogZmlyc3QgZGlzYWJsZSBhbnkgbm9uLXBjaSBpbnRlcnJ1cHQgc291cmNlIHRoYXQgdXNlCgkgKiB0aGlzIGxldmVsICovCglmb3IgKGk9U0M1MjBfR1BUTVIwTUFQO2k8PVNDNTIwX0dQMTBJTUFQO2krKykgewoJCWlmIChpPj1TQzUyMF9QQ0lJTlRBTUFQJiZpPD1TQzUyMF9QQ0lJTlRETUFQKSB7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAocmVhZF9tbWNyX2J5dGUoaSkgPT0gc2M1MjBfaXJxW2lycV0ucHJpb3JpdHkpIHsKCQkJd3JpdGVfbW1jcl9ieXRlKGksIFNDNTIwX0lSUV9ESVNBQkxFRCk7CgkJfQoJfQoKCS8qIFNldCB0aGUgdHJpZ2dlciB0byBsZXZlbCAqLwoJd3JpdGVfbW1jcl9ieXRlKHNjNTIwX2lycVtpcnFdLmxldmVsX3JlZywKCQkJcmVhZF9tbWNyX2J5dGUoc2M1MjBfaXJxW2lycV0ubGV2ZWxfcmVnKSB8IHNjNTIwX2lycVtpcnFdLmxldmVsX2JpdCk7CgoKCWlmIChwY2lfcGluIDwgNCkgewoJCS8qIFBDSSBJTlRBLUlOVEQgKi8KCQkvKiByb3V0ZSB0aGUgaW50ZXJydXB0ICovCgkJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1BDSUlOVEFNQVAgKyBwY2lfcGluLCBzYzUyMF9pcnFbaXJxXS5wcmlvcml0eSk7CgoKCX0gZWxzZSB7CgkJLyogR1BJUlEwLUdQSVJRMTAgdXNlZCBmb3IgYWRkaXRpb25hbCBQQ0kgSU5UUyAqLwoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9HUDBJTUFQICsgcGNpX3BpbiAtIDQsIHNjNTIwX2lycVtpcnFdLnByaW9yaXR5KTsKCgkJLyogYWxzbyBzZXQgdGhlIHBvbGFyaXR5IGluIHRoaXMgY2FzZSAqLwoJCXdyaXRlX21tY3Jfd29yZChTQzUyMF9JTlRQSU5QT0wsCgkJCQlyZWFkX21tY3Jfd29yZChTQzUyMF9JTlRQSU5QT0wpIHwgKDEgPDwgKHBjaV9waW4tNCkpKTsKCgl9CgoJLyogcmVnaXN0ZXIgdGhlIHBpbiAqLwoJc2M1MjBfcGNpX2ludHNbcGNpX3Bpbl0gPSBpcnE7CgoKCXJldHVybiAwOyAvKiBPSyAqLwp9Cgp2b2lkIHBjaV9zYzUyMF9pbml0KHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSkKewoJaG9zZS0+Zmlyc3RfYnVzbm8gPSAwOwoJaG9zZS0+bGFzdF9idXNubyA9IDB4ZmY7CgoJLyogU3lzdGVtIG1lbW9yeSBzcGFjZSAqLwoJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDAsCgkJICAgICAgIFNDNTIwX1BDSV9NRU1PUllfQlVTLAoJCSAgICAgICBTQzUyMF9QQ0lfTUVNT1JZX1BIWVMsCgkJICAgICAgIFNDNTIwX1BDSV9NRU1PUllfU0laRSwKCQkgICAgICAgUENJX1JFR0lPTl9NRU0gfCBQQ0lfUkVHSU9OX01FTU9SWSk7CgoJLyogUENJIG1lbW9yeSBzcGFjZSAqLwoJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDEsCgkJICAgICAgIFNDNTIwX1BDSV9NRU1fQlVTLAoJCSAgICAgICBTQzUyMF9QQ0lfTUVNX1BIWVMsCgkJICAgICAgIFNDNTIwX1BDSV9NRU1fU0laRSwKCQkgICAgICAgUENJX1JFR0lPTl9NRU0pOwoKCS8qIElTQS9QQ0kgbWVtb3J5IHNwYWNlICovCglwY2lfc2V0X3JlZ2lvbihob3NlLT5yZWdpb25zICsgMiwKCQkgICAgICAgU0M1MjBfSVNBX01FTV9CVVMsCgkJICAgICAgIFNDNTIwX0lTQV9NRU1fUEhZUywKCQkgICAgICAgU0M1MjBfSVNBX01FTV9TSVpFLAoJCSAgICAgICBQQ0lfUkVHSU9OX01FTSk7CgoJLyogUENJIEkvTyBzcGFjZSAqLwoJcGNpX3NldF9yZWdpb24oaG9zZS0+cmVnaW9ucyArIDMsCgkJICAgICAgIFNDNTIwX1BDSV9JT19CVVMsCgkJICAgICAgIFNDNTIwX1BDSV9JT19QSFlTLAoJCSAgICAgICBTQzUyMF9QQ0lfSU9fU0laRSwKCQkgICAgICAgUENJX1JFR0lPTl9JTyk7CgoJLyogSVNBL1BDSSBJL08gc3BhY2UgKi8KCXBjaV9zZXRfcmVnaW9uKGhvc2UtPnJlZ2lvbnMgKyA0LAoJCSAgICAgICBTQzUyMF9JU0FfSU9fQlVTLAoJCSAgICAgICBTQzUyMF9JU0FfSU9fUEhZUywKCQkgICAgICAgU0M1MjBfSVNBX0lPX1NJWkUsCgkJICAgICAgIFBDSV9SRUdJT05fSU8pOwoKCWhvc2UtPnJlZ2lvbl9jb3VudCA9IDU7CgoJcGNpX3NldHVwX3R5cGUxKGhvc2UsCgkJCVNDNTIwX1JFR19BRERSLAoJCQlTQzUyMF9SRUdfREFUQSk7CgoJcGNpX3JlZ2lzdGVyX2hvc2UoaG9zZSk7CgoJaG9zZS0+bGFzdF9idXNubyA9IHBjaV9ob3NlX3NjYW4oaG9zZSk7CgoJLyogZW5hYmxlIHRhcmdldCBtZW1vcnkgYWNjZXNlcyBvbiBob3N0IGJyaWdlICovCglwY2lfd3JpdGVfY29uZmlnX3dvcmQoMCwgUENJX0NPTU1BTkQsCgkJCSAgICAgIFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX01BU1RFUik7Cgp9CgoKI2VuZGlmCgojaWZkZWYgQ0ZHX1RJTUVSX1NDNTIwCgoKdm9pZCByZXNldF90aW1lcih2b2lkKQp7Cgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfR1BUTVIwQ05ULCAwKTsKCXdyaXRlX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDVEwsIDB4NjAwMSk7Cgp9Cgp1bG9uZyBnZXRfdGltZXIodWxvbmcgYmFzZSkKewoJLyogZml4bWU6IDMwIG9yIDMzICovCglyZXR1cm4gCXJlYWRfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENOVCkgLyAzMzsKfQoKdm9pZCBzZXRfdGltZXIodWxvbmcgdCkKewoJLyogRml4TWU6IHVzZSB0d28gY2FzY2FkZSBjb3VwbGVkIHRpbWVycyAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENUTCwgMHg0MDAxKTsKCXdyaXRlX21tY3Jfd29yZChTQzUyMF9HUFRNUjBDTlQsIHQqMzMpOwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX0dQVE1SMENUTCwgMHg2MDAxKTsKfQoKCnZvaWQgdWRlbGF5KHVuc2lnbmVkIGxvbmcgdXNlYykKewoJaW50IG09MDsKCWxvbmcgdTsKCglyZWFkX21tY3Jfd29yZChTQzUyMF9TV1RNUk1JTExJKTsKCXJlYWRfbW1jcl93b3JkKFNDNTIwX1NXVE1STUlDUk8pOwoKI2lmIDAKCS8qIGRvIG5vdCBlbmFibGUgdGhpcyBsaW5lLCB1ZGVsYXkgaXMgdXNlZCBpbiB0aGUgc2VyaWFsIGRyaXZlciAtPiByZWN1cnNpb24gKi8KCXByaW50ZigidWRlbGF5OiAlbGQgbS51ICVkLiVkICB0bS50dSAlZC4lZFxuIiwgdXNlYywgbSwgdSwgdG0sIHR1KTsKI2VuZGlmCgl3aGlsZSAoMSkgewoKCQltICs9IHJlYWRfbW1jcl93b3JkKFNDNTIwX1NXVE1STUlMTEkpOwoJCXUgPSByZWFkX21tY3Jfd29yZChTQzUyMF9TV1RNUk1JQ1JPKSArIChtICogMTAwMCk7CgoJCWlmICh1c2VjIDw9IHUpIHsKCQkJYnJlYWs7CgkJfQoJfQp9CgojZW5kaWYKCmludCBzc2lfc2V0X2ludGVyZmFjZShpbnQgZnJlcSwgaW50IGxzYl9maXJzdCwgaW50IGludl9jbG9jaywgaW50IGludl9waGFzZSkKewoJdTggdGVtcD0wOwoKCWlmIChmcmVxID49IDgxOTIpIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzQ7Cgl9IGVsc2UgaWYgKGZyZXEgPj0gNDA5NikgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfODsKCX0gZWxzZSBpZiAoZnJlcSA+PSAyMDQ4KSB7CgkJdGVtcCB8PSBDVExfQ0xLX1NFTF8xNjsKCX0gZWxzZSBpZiAoZnJlcSA+PSAxMDI0KSB7CgkJdGVtcCB8PSBDVExfQ0xLX1NFTF8zMjsKCX0gZWxzZSBpZiAoZnJlcSA+PSA1MTIpIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzY0OwoJfSBlbHNlIGlmIChmcmVxID49IDI1NikgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfMTI4OwoJfSBlbHNlIGlmIChmcmVxID49IDEyOCkgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfMjU2OwoJfSBlbHNlIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzUxMjsKCX0KCglpZiAoIWxzYl9maXJzdCkgewoJCXRlbXAgfD0gTVNCRl9FTkI7Cgl9CgoJaWYgKGludl9jbG9jaykgewoJCXRlbXAgfD0gQ0xLX0lOVl9FTkI7Cgl9CgoJaWYgKGludl9waGFzZSkgewoJCXRlbXAgfD0gUEhTX0lOVl9FTkI7Cgl9CgoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSUNUTCwgdGVtcCk7CgoJcmV0dXJuIDA7Cn0KCnU4IHNzaV90eHJ4X2J5dGUodTggZGF0YSkKewoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSVhNSVQsIGRhdGEpOwoJd2hpbGUgKChyZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lTVEEpKSAmIFNTSVNUQV9CU1kpOwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSUNNRCwgU1NJQ01EX0NNRF9TRUxfWE1JVFJDVik7Cgl3aGlsZSAoKHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVNUQSkpICYgU1NJU1RBX0JTWSk7CglyZXR1cm4gcmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJUkNWKTsKfQoKCnZvaWQgc3NpX3R4X2J5dGUodTggZGF0YSkKewoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSVhNSVQsIGRhdGEpOwoJd2hpbGUgKChyZWFkX21tY3JfYnl0ZShTQzUyMF9TU0lTVEEpKSAmIFNTSVNUQV9CU1kpOwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1NTSUNNRCwgU1NJQ01EX0NNRF9TRUxfWE1JVCk7Cn0KCnU4IHNzaV9yeF9ieXRlKHZvaWQpCnsKCXdoaWxlICgocmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJU1RBKSkgJiBTU0lTVEFfQlNZKTsKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9TU0lDTUQsIFNTSUNNRF9DTURfU0VMX1JDVik7Cgl3aGlsZSAoKHJlYWRfbW1jcl9ieXRlKFNDNTIwX1NTSVNUQSkpICYgU1NJU1RBX0JTWSk7CglyZXR1cm4gcmVhZF9tbWNyX2J5dGUoU0M1MjBfU1NJUkNWKTsKfQoKI2VuZGlmIC8qIENPTkZJR19TQzUyMCAqLwo=