LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwKICogYnV0IGlkZXBlbmRlbnQgb2YgaW1wbGVtZW50YXRpb24gKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2ljL3NjNTIwLmg+CgpERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCi8qCiAqIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBib2FyZHMgYmFzZWQgb24gdGhlIEFNRCBzYzUyMAogKgogKiB2b2lkIHdyaXRlX21tY3JfYnl0ZSh1MTYgbW1jciwgdTggZGF0YSkKICogdm9pZCB3cml0ZV9tbWNyX3dvcmQodTE2IG1tY3IsIHUxNiBkYXRhKQogKiB2b2lkIHdyaXRlX21tY3JfbG9uZyh1MTYgbW1jciwgdTMyIGRhdGEpCiAqCiAqIHU4ICAgcmVhZF9tbWNyX2J5dGUodTE2IG1tY3IpCiAqIHUxNiAgcmVhZF9tbWNyX3dvcmQodTE2IG1tY3IpCiAqIHUzMiAgcmVhZF9tbWNyX2xvbmcodTE2IG1tY3IpCiAqCiAqIHZvaWQgaW5pdF9zYzUyMCh2b2lkKQogKiB1bnNpZ25lZCBsb25nIGluaXRfc2M1MjBfZHJhbSh2b2lkKQogKi8KCnN0YXRpYyB1MzIgbW1jcl9iYXNlPSAweGZmZmVmMDAwOwoKdm9pZCB3cml0ZV9tbWNyX2J5dGUodTE2IG1tY3IsIHU4IGRhdGEpCnsKCXdyaXRlYihkYXRhLCBtbWNyK21tY3JfYmFzZSk7Cn0KCnZvaWQgd3JpdGVfbW1jcl93b3JkKHUxNiBtbWNyLCB1MTYgZGF0YSkKewoJd3JpdGV3KGRhdGEsIG1tY3IrbW1jcl9iYXNlKTsKfQoKdm9pZCB3cml0ZV9tbWNyX2xvbmcodTE2IG1tY3IsIHUzMiBkYXRhKQp7Cgl3cml0ZWwoZGF0YSwgbW1jcittbWNyX2Jhc2UpOwp9Cgp1OCByZWFkX21tY3JfYnl0ZSh1MTYgbW1jcikKewoJcmV0dXJuIHJlYWRiKG1tY3IrbW1jcl9iYXNlKTsKfQoKdTE2IHJlYWRfbW1jcl93b3JkKHUxNiBtbWNyKQp7CglyZXR1cm4gcmVhZHcobW1jcittbWNyX2Jhc2UpOwp9Cgp1MzIgcmVhZF9tbWNyX2xvbmcodTE2IG1tY3IpCnsKCXJldHVybiByZWFkbChtbWNyK21tY3JfYmFzZSk7Cn0KCgp2b2lkIGluaXRfc2M1MjAodm9pZCkKewoJLyogU2V0IHRoZSBVQVJUeENUTCByZWdpc3RlciBhdCBpdCdzIHNsb3dlciwKCSAqIGJhdWQgY2xvY2sgZ2l2aW5nIHVzIGEgMS44NDMyIE1IeiByZWZlcmVuY2UKCSAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX1VBUlQxQ1RMLCA3KTsKCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9VQVJUMkNUTCwgNyk7CgoJLyogZmlyc3Qgc2V0IHRoZSB0aW1lciBwaW4gbWFwcGluZyAqLwoJd3JpdGVfbW1jcl9ieXRlKFNDNTIwX0NMS1NFTCwgMHg3Mik7CS8qIG5vIGNsb2NrIGZyZXF1ZW5jeSBzZWxlY3RlZCwgdXNlIDEuMTg5Mk1IeiAqLwoKCS8qIGVuYWJsZSBQQ0kgYnVzIGFyYml0cmVyICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfU1lTQVJCQ1RMLDB4MDIpOyAgLyogZW5hYmxlIGNvbmN1cnJlbnQgbW9kZSAqLwoKCXdyaXRlX21tY3Jfd29yZChTQzUyMF9TWVNBUkJNRU5CLDB4MWYpOyAvKiBlbmFibGUgZXh0ZXJuYWwgZ3JhbnRzICovCgl3cml0ZV9tbWNyX3dvcmQoU0M1MjBfSEJDVEwsMHgwNCk7ICAgICAgLyogZW5hYmxlIHBvc3RlZC13cml0ZXMgKi8KCgoJaWYgKENPTkZJR19TWVNfU0M1MjBfSElHSF9TUEVFRCkgewoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9DUFVDVEwsIDB4Mik7CS8qIHNldCBpdCB0byAxMzMgTUh6IGFuZCB3cml0ZSBiYWNrICovCgkJZ2QtPmNwdV9jbGsgPSAxMzMwMDAwMDA7CgkJcHJpbnRmKCIjIyBDUFUgU3BlZWQgc2V0IHRvIDEzM01IelxuIik7Cgl9IGVsc2UgewoJCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9DUFVDVEwsIDEpOwkvKiBzZXQgQ1BVIHRvIDEwMCBNSHogYW5kIHdyaXRlIGJhY2sgY2FjaGUgKi8KCQlwcmludGYoIiMjIENQVSBTcGVlZCBzZXQgdG8gMTAwTUh6XG4iKTsKCQlnZC0+Y3B1X2NsayA9IDEwMDAwMDAwMDsKCX0KCgoJLyogd2FpdCBhdCBsZWFzdCBvbmUgbWlsbGlzZWNvbmQgKi8KCWFzbSgibW92bAkkMHgyMDAwLCUlZWN4XG4iCgkgICAgIjA6CQlwdXNobCAlJWVjeFxuIgoJICAgICJwb3BsCSUlZWN4XG4iCgkgICAgImxvb3AgMGJcbiI6IDogOiAiZWN4Iik7CgoJLyogdHVybiBvbiB0aGUgU0RSQU0gd3JpdGUgYnVmZmVyICovCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfREJDVEwsIDB4MTEpOwoKCS8qIHR1cm4gb24gdGhlIGNhY2hlIGFuZCBkaXNhYmxlIHdyaXRlIHRocm91Z2ggKi8KCWFzbSgibW92bAklJWNyMCwgJSVlYXhcbiIKCSAgICAiYW5kbAkkMHg5ZmZmZmZmZiwgJSVlYXhcbiIKCSAgICAibW92bAklJWVheCwgJSVjcjBcbiIgIDogOiA6ICJlYXgiKTsKfQoKdW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKewoJYmRfdCAqYmQgPSBnZC0+YmQ7CgoJdTMyIGRyYW1fcHJlc2VudD0wOwoJdTMyIGRyYW1fY3RybDsKI2lmZGVmIENPTkZJR19TWVNfU0RSQU1fRFJDVE1DVEwKCS8qIHRoZXNlIG1lbW9yeSBjb250cm9sIHJlZ2lzdGVycyBhcmUgc2V0IHVwIGluIHRoZSBhc3NlbWJlciBwYXJ0LAoJICogaW4gc2M1MjBfYXNtLlMsIGR1cmluZyAnbWVtX2luaXQnLiAgSWYgd2UgbXVjayB3aXRoIHRoZW0gaGVyZSwKCSAqIGFmdGVyIHdlIGFyZSBydW5uaW5nIGEgc3RhY2sgaW4gUkFNLCB3ZSBoYXZlIHRyb3VibGVzLiAgQmVzaWRlcywKCSAqIHRoZXNlIHJlZnJlc2ggYW5kIGRlbGF5IHZhbHVlcyBhcmUgYmV0dGVyID8gc2ltcGx5IHNwZWNpZmllZAoJICogb3V0cmlnaHQgaW4gdGhlIGluY2x1ZGUvY29uZmlncy97Y2ZnfSBmaWxlIHNpbmNlIHRoZSBIVyBkZXNpZ25lcgoJICogc2ltcGx5IGRpY3RhdGVzIGl0LgoJICovCiNlbHNlCglpbnQgdmFsOwoKCWludCBjYXNfcHJlY2hhcmdlX2RlbGF5ID0gQ09ORklHX1NZU19TRFJBTV9QUkVDSEFSR0VfREVMQVk7CglpbnQgcmVmcmVzaF9yYXRlICAgICAgICA9IENPTkZJR19TWVNfU0RSQU1fUkVGUkVTSF9SQVRFOwoJaW50IHJhc19jYXNfZGVsYXkgICAgICAgPSBDT05GSUdfU1lTX1NEUkFNX1JBU19DQVNfREVMQVk7CgoJLyogc2V0IFNEUkFNIHNwZWVkIGhlcmUgKi8KCglyZWZyZXNoX3JhdGUvPTc4OwoJaWYgKHJlZnJlc2hfcmF0ZTw9MSkgewoJCXZhbCA9IDA7ICAvKiA3Ljh1cyAqLwoJfSBlbHNlIGlmIChyZWZyZXNoX3JhdGU9PTIpIHsKCQl2YWwgPSAxOyAgLyogMTUuNnVzICovCgl9IGVsc2UgaWYgKHJlZnJlc2hfcmF0ZT09MyB8fCByZWZyZXNoX3JhdGU9PTQpIHsKCQl2YWwgPSAyOyAgLyogMzEuMnVzICovCgl9IGVsc2UgewoJCXZhbCA9IDM7ICAvKiA2Mi40dXMgKi8KCX0KCgl3cml0ZV9tbWNyX2J5dGUoU0M1MjBfRFJDQ1RMLCAocmVhZF9tbWNyX2J5dGUoU0M1MjBfRFJDQ1RMKSAmIDB4Y2YpIHwgKHZhbDw8NCkpOwoKCXZhbCA9IHJlYWRfbW1jcl9ieXRlKFNDNTIwX0RSQ1RNQ1RMKTsKCXZhbCAmPSAweGYwOwoKCWlmIChjYXNfcHJlY2hhcmdlX2RlbGF5PT0zKSB7CgkJdmFsIHw9IDB4MDQ7ICAgLyogM1QgKi8KCX0gZWxzZSBpZiAoY2FzX3ByZWNoYXJnZV9kZWxheT09NCkgewoJCXZhbCB8PSAweDA4OyAgIC8qIDRUICovCgl9IGVsc2UgaWYgKGNhc19wcmVjaGFyZ2VfZGVsYXk+NCkgewoJCXZhbCB8PSAweDBjOwoJfQoKCWlmIChyYXNfY2FzX2RlbGF5ID4gMykgewoJCXZhbCB8PSAyOwoJfSBlbHNlIHsKCQl2YWwgfD0gMTsKCX0KCXdyaXRlX21tY3JfYnl0ZShTQzUyMF9EUkNUTUNUTCwgdmFsKTsKI2VuZGlmCgoJLyogV2UgcmVhZC1iYWNrIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBkcmFtCgkgKiBjb250cm9sbGVyIHRoYXQgdGhlIGFzc2VtYmx5IGNvZGUgd3JvdGUgKi8KCWRyYW1fY3RybCA9IHJlYWRfbW1jcl9sb25nKFNDNTIwX0RSQ0JFTkRBRFIpOwoKCWJkLT5iaV9kcmFtWzBdLnN0YXJ0ID0gMDsKCWlmIChkcmFtX2N0cmwgJiAweDgwKSB7CgkJLyogYmFuayAwIGVuYWJsZWQgKi8KCQlkcmFtX3ByZXNlbnQgPSBiZC0+YmlfZHJhbVsxXS5zdGFydCA9IChkcmFtX2N0cmwgJiAweDdmKSA8PCAyMjsKCQliZC0+YmlfZHJhbVswXS5zaXplID0gYmQtPmJpX2RyYW1bMV0uc3RhcnQ7CgoJfSBlbHNlIHsKCQliZC0+YmlfZHJhbVswXS5zaXplID0gMDsKCQliZC0+YmlfZHJhbVsxXS5zdGFydCA9IGJkLT5iaV9kcmFtWzBdLnN0YXJ0OwoJfQoKCWlmIChkcmFtX2N0cmwgJiAweDgwMDApIHsKCQkvKiBiYW5rIDEgZW5hYmxlZCAqLwoJCWRyYW1fcHJlc2VudCA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0ID0gKGRyYW1fY3RybCAmIDB4N2YwMCkgPDwgMTQ7CgkJYmQtPmJpX2RyYW1bMV0uc2l6ZSA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0IC0gIGJkLT5iaV9kcmFtWzFdLnN0YXJ0OwoJfSBlbHNlIHsKCQliZC0+YmlfZHJhbVsxXS5zaXplID0gMDsKCQliZC0+YmlfZHJhbVsyXS5zdGFydCA9IGJkLT5iaV9kcmFtWzFdLnN0YXJ0OwoJfQoKCWlmIChkcmFtX2N0cmwgJiAweDgwMDAwMCkgewoJCS8qIGJhbmsgMiBlbmFibGVkICovCgkJZHJhbV9wcmVzZW50ID0gYmQtPmJpX2RyYW1bM10uc3RhcnQgPSAoZHJhbV9jdHJsICYgMHg3ZjAwMDApIDw8IDY7CgkJYmQtPmJpX2RyYW1bMl0uc2l6ZSA9IGJkLT5iaV9kcmFtWzNdLnN0YXJ0IC0gIGJkLT5iaV9kcmFtWzJdLnN0YXJ0OwoJfSBlbHNlIHsKCQliZC0+YmlfZHJhbVsyXS5zaXplID0gMDsKCQliZC0+YmlfZHJhbVszXS5zdGFydCA9IGJkLT5iaV9kcmFtWzJdLnN0YXJ0OwoJfQoKCWlmIChkcmFtX2N0cmwgJiAweDgwMDAwMDAwKSB7CgkJLyogYmFuayAzIGVuYWJsZWQgKi8KCQlkcmFtX3ByZXNlbnQgID0gKGRyYW1fY3RybCAmIDB4N2YwMDAwMDApID4+IDI7CgkJYmQtPmJpX2RyYW1bM10uc2l6ZSA9IGRyYW1fcHJlc2VudCAtICBiZC0+YmlfZHJhbVszXS5zdGFydDsKCX0gZWxzZSB7CgkJYmQtPmJpX2RyYW1bM10uc2l6ZSA9IDA7Cgl9CgoKI2lmIDAKCXByaW50ZigiQ29uZmlndXJlZCAlZCBieXRlcyBvZiBkcmFtXG4iLCBkcmFtX3ByZXNlbnQpOwojZW5kaWYKCWdkLT5yYW1fc2l6ZSA9IGRyYW1fcHJlc2VudDsKCglyZXR1cm4gZHJhbV9wcmVzZW50Owp9CgojaWZkZWYgQ09ORklHX1NZU19TQzUyMF9SRVNFVAp2b2lkIHJlc2V0X2NwdSh1bG9uZyBhZGRyKQp7CglwcmludGYoIlJlc2V0dGluZyB1c2luZyBTQzUyMCBNTUNSXG4iKTsKCS8qIFdyaXRlIGEgJzEnIHRvIHRoZSBTWVNfUlNUIG9mIHRoZSBSRVNDRkcgTU1DUiAqLwoJd3JpdGVfbW1jcl93b3JkKFNDNTIwX1JFU0NGRywgMHgwMDAxKTsKCgkvKiBOT1RSRUFDSEVEICovCn0KI2VuZGlmCg==