LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwKICogYnV0IGlkZXBlbmRlbnQgb2YgaW1wbGVtZW50YXRpb24gKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2ljL3NjNTIwLmg+CgpERUNMQVJFX0dMT0JBTF9EQVRBX1BUUjsKCi8qCiAqIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBib2FyZHMgYmFzZWQgb24gdGhlIEFNRCBzYzUyMAogKgogKiB2b2lkIGluaXRfc2M1MjAodm9pZCkKICogdW5zaWduZWQgbG9uZyBpbml0X3NjNTIwX2RyYW0odm9pZCkKICovCgp2b2xhdGlsZSBzYzUyMF9tbWNyX3QgKnNjNTIwX21tY3IgPSAoc2M1MjBfbW1jcl90ICopMHhmZmZlZjAwMDsKCnZvaWQgaW5pdF9zYzUyMCh2b2lkKQp7CgkvKiBTZXQgdGhlIFVBUlR4Q1RMIHJlZ2lzdGVyIGF0IGl0J3Mgc2xvd2VyLAoJICogYmF1ZCBjbG9jayBnaXZpbmcgdXMgYSAxLjg0MzIgTUh6IHJlZmVyZW5jZQoJICovCglzYzUyMF9tbWNyLT51YXJ0MWN0bCA9IDB4MDc7CglzYzUyMF9tbWNyLT51YXJ0MmN0bCA9IDB4MDc7CgoJLyogZmlyc3Qgc2V0IHRoZSB0aW1lciBwaW4gbWFwcGluZyAqLwoJc2M1MjBfbW1jci0+Y2xrc2VsID0gMHg3MjsJLyogbm8gY2xvY2sgZnJlcXVlbmN5IHNlbGVjdGVkLCB1c2UgMS4xODkyTUh6ICovCgoJLyogZW5hYmxlIFBDSSBidXMgYXJiaXRyZXIgKi8KCXNjNTIwX21tY3ItPnN5c2FyYmN0bCA9IDB4MDI7CS8qIGVuYWJsZSBjb25jdXJyZW50IG1vZGUgKi8KCglzYzUyMF9tbWNyLT5zeXNhcmJtZW5iID0gMHgxZjsJLyogZW5hYmxlIGV4dGVybmFsIGdyYW50cyAqLwoJc2M1MjBfbW1jci0+aGJjdGwgPSAweDA0OwkvKiBlbmFibGUgcG9zdGVkLXdyaXRlcyAqLwoKCWlmIChDT05GSUdfU1lTX1NDNTIwX0hJR0hfU1BFRUQpIHsKCQlzYzUyMF9tbWNyLT5jcHVjdGwgPSAweDAyOwkvKiBzZXQgaXQgdG8gMTMzIE1IeiBhbmQgd3JpdGUgYmFjayAqLwoJCWdkLT5jcHVfY2xrID0gMTMzMDAwMDAwOwoJCXByaW50ZigiIyMgQ1BVIFNwZWVkIHNldCB0byAxMzNNSHpcbiIpOwoJfSBlbHNlIHsKCQlzYzUyMF9tbWNyLT5jcHVjdGwgPSAweDAxOwkvKiBzZXQgaXQgdG8gMTAwIE1IeiBhbmQgd3JpdGUgYmFjayAqLwoJCXByaW50ZigiIyMgQ1BVIFNwZWVkIHNldCB0byAxMDBNSHpcbiIpOwoJCWdkLT5jcHVfY2xrID0gMTAwMDAwMDAwOwoJfQoKCgkvKiB3YWl0IGF0IGxlYXN0IG9uZSBtaWxsaXNlY29uZCAqLwoJYXNtKCJtb3ZsCSQweDIwMDAsJSVlY3hcbiIKCSAgICAiMDoJCXB1c2hsICUlZWN4XG4iCgkgICAgInBvcGwJJSVlY3hcbiIKCSAgICAibG9vcCAwYlxuIjogOiA6ICJlY3giKTsKCgkvKiB0dXJuIG9uIHRoZSBTRFJBTSB3cml0ZSBidWZmZXIgKi8KCXNjNTIwX21tY3ItPmRiY3RsID0gMHgxMTsKCgkvKiB0dXJuIG9uIHRoZSBjYWNoZSBhbmQgZGlzYWJsZSB3cml0ZSB0aHJvdWdoICovCglhc20oIm1vdmwJJSVjcjAsICUlZWF4XG4iCgkgICAgImFuZGwJJDB4OWZmZmZmZmYsICUlZWF4XG4iCgkgICAgIm1vdmwJJSVlYXgsICUlY3IwXG4iICA6IDogOiAiZWF4Iik7Cn0KCnVuc2lnbmVkIGxvbmcgaW5pdF9zYzUyMF9kcmFtKHZvaWQpCnsKCWJkX3QgKmJkID0gZ2QtPmJkOwoKCXUzMiBkcmFtX3ByZXNlbnQ9MDsKCXUzMiBkcmFtX2N0cmw7CiNpZmRlZiBDT05GSUdfU1lTX1NEUkFNX0RSQ1RNQ1RMCgkvKiB0aGVzZSBtZW1vcnkgY29udHJvbCByZWdpc3RlcnMgYXJlIHNldCB1cCBpbiB0aGUgYXNzZW1iZXIgcGFydCwKCSAqIGluIHNjNTIwX2FzbS5TLCBkdXJpbmcgJ21lbV9pbml0Jy4gIElmIHdlIG11Y2sgd2l0aCB0aGVtIGhlcmUsCgkgKiBhZnRlciB3ZSBhcmUgcnVubmluZyBhIHN0YWNrIGluIFJBTSwgd2UgaGF2ZSB0cm91Ymxlcy4gIEJlc2lkZXMsCgkgKiB0aGVzZSByZWZyZXNoIGFuZCBkZWxheSB2YWx1ZXMgYXJlIGJldHRlciA/IHNpbXBseSBzcGVjaWZpZWQKCSAqIG91dHJpZ2h0IGluIHRoZSBpbmNsdWRlL2NvbmZpZ3Mve2NmZ30gZmlsZSBzaW5jZSB0aGUgSFcgZGVzaWduZXIKCSAqIHNpbXBseSBkaWN0YXRlcyBpdC4KCSAqLwojZWxzZQoJaW50IHZhbDsKCglpbnQgY2FzX3ByZWNoYXJnZV9kZWxheSA9IENPTkZJR19TWVNfU0RSQU1fUFJFQ0hBUkdFX0RFTEFZOwoJaW50IHJlZnJlc2hfcmF0ZSAgICAgICAgPSBDT05GSUdfU1lTX1NEUkFNX1JFRlJFU0hfUkFURTsKCWludCByYXNfY2FzX2RlbGF5ICAgICAgID0gQ09ORklHX1NZU19TRFJBTV9SQVNfQ0FTX0RFTEFZOwoKCS8qIHNldCBTRFJBTSBzcGVlZCBoZXJlICovCgoJcmVmcmVzaF9yYXRlLz03ODsKCWlmIChyZWZyZXNoX3JhdGU8PTEpIHsKCQl2YWwgPSAwOyAgLyogNy44dXMgKi8KCX0gZWxzZSBpZiAocmVmcmVzaF9yYXRlPT0yKSB7CgkJdmFsID0gMTsgIC8qIDE1LjZ1cyAqLwoJfSBlbHNlIGlmIChyZWZyZXNoX3JhdGU9PTMgfHwgcmVmcmVzaF9yYXRlPT00KSB7CgkJdmFsID0gMjsgIC8qIDMxLjJ1cyAqLwoJfSBlbHNlIHsKCQl2YWwgPSAzOyAgLyogNjIuNHVzICovCgl9CgoJc2M1MjBfbW1jci0+ZHJjY3RsID0gKHNjNTIwX21tY3ItPmRyY2N0bCAmIDB4Y2YpIHwgKHZhbDw8NCk7CgoJdmFsID0gc2M1MjBfbW1jci0+ZHJjdG1jdGwgJiAweGYwOwoKCWlmIChjYXNfcHJlY2hhcmdlX2RlbGF5PT0zKSB7CgkJdmFsIHw9IDB4MDQ7ICAgLyogM1QgKi8KCX0gZWxzZSBpZiAoY2FzX3ByZWNoYXJnZV9kZWxheT09NCkgewoJCXZhbCB8PSAweDA4OyAgIC8qIDRUICovCgl9IGVsc2UgaWYgKGNhc19wcmVjaGFyZ2VfZGVsYXk+NCkgewoJCXZhbCB8PSAweDBjOwoJfQoKCWlmIChyYXNfY2FzX2RlbGF5ID4gMykgewoJCXZhbCB8PSAyOwoJfSBlbHNlIHsKCQl2YWwgfD0gMTsKCX0KCXNjNTIwX21tY3ItPmRyY3RtY3RsID0gdmFsOwojZW5kaWYKCgkvKiBXZSByZWFkLWJhY2sgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGRyYW0KCSAqIGNvbnRyb2xsZXIgdGhhdCB0aGUgYXNzZW1ibHkgY29kZSB3cm90ZSAqLwoJZHJhbV9jdHJsID0gc2M1MjBfbW1jci0+ZHJjYmVuZGFkcjsKCgliZC0+YmlfZHJhbVswXS5zdGFydCA9IDA7CglpZiAoZHJhbV9jdHJsICYgMHg4MCkgewoJCS8qIGJhbmsgMCBlbmFibGVkICovCgkJZHJhbV9wcmVzZW50ID0gYmQtPmJpX2RyYW1bMV0uc3RhcnQgPSAoZHJhbV9jdHJsICYgMHg3ZikgPDwgMjI7CgkJYmQtPmJpX2RyYW1bMF0uc2l6ZSA9IGJkLT5iaV9kcmFtWzFdLnN0YXJ0OwoKCX0gZWxzZSB7CgkJYmQtPmJpX2RyYW1bMF0uc2l6ZSA9IDA7CgkJYmQtPmJpX2RyYW1bMV0uc3RhcnQgPSBiZC0+YmlfZHJhbVswXS5zdGFydDsKCX0KCglpZiAoZHJhbV9jdHJsICYgMHg4MDAwKSB7CgkJLyogYmFuayAxIGVuYWJsZWQgKi8KCQlkcmFtX3ByZXNlbnQgPSBiZC0+YmlfZHJhbVsyXS5zdGFydCA9IChkcmFtX2N0cmwgJiAweDdmMDApIDw8IDE0OwoJCWJkLT5iaV9kcmFtWzFdLnNpemUgPSBiZC0+YmlfZHJhbVsyXS5zdGFydCAtICBiZC0+YmlfZHJhbVsxXS5zdGFydDsKCX0gZWxzZSB7CgkJYmQtPmJpX2RyYW1bMV0uc2l6ZSA9IDA7CgkJYmQtPmJpX2RyYW1bMl0uc3RhcnQgPSBiZC0+YmlfZHJhbVsxXS5zdGFydDsKCX0KCglpZiAoZHJhbV9jdHJsICYgMHg4MDAwMDApIHsKCQkvKiBiYW5rIDIgZW5hYmxlZCAqLwoJCWRyYW1fcHJlc2VudCA9IGJkLT5iaV9kcmFtWzNdLnN0YXJ0ID0gKGRyYW1fY3RybCAmIDB4N2YwMDAwKSA8PCA2OwoJCWJkLT5iaV9kcmFtWzJdLnNpemUgPSBiZC0+YmlfZHJhbVszXS5zdGFydCAtICBiZC0+YmlfZHJhbVsyXS5zdGFydDsKCX0gZWxzZSB7CgkJYmQtPmJpX2RyYW1bMl0uc2l6ZSA9IDA7CgkJYmQtPmJpX2RyYW1bM10uc3RhcnQgPSBiZC0+YmlfZHJhbVsyXS5zdGFydDsKCX0KCglpZiAoZHJhbV9jdHJsICYgMHg4MDAwMDAwMCkgewoJCS8qIGJhbmsgMyBlbmFibGVkICovCgkJZHJhbV9wcmVzZW50ICA9IChkcmFtX2N0cmwgJiAweDdmMDAwMDAwKSA+PiAyOwoJCWJkLT5iaV9kcmFtWzNdLnNpemUgPSBkcmFtX3ByZXNlbnQgLSAgYmQtPmJpX2RyYW1bM10uc3RhcnQ7Cgl9IGVsc2UgewoJCWJkLT5iaV9kcmFtWzNdLnNpemUgPSAwOwoJfQoKCiNpZiAwCglwcmludGYoIkNvbmZpZ3VyZWQgJWQgYnl0ZXMgb2YgZHJhbVxuIiwgZHJhbV9wcmVzZW50KTsKI2VuZGlmCglnZC0+cmFtX3NpemUgPSBkcmFtX3ByZXNlbnQ7CgoJcmV0dXJuIGRyYW1fcHJlc2VudDsKfQoKI2lmZGVmIENPTkZJR19TWVNfU0M1MjBfUkVTRVQKdm9pZCByZXNldF9jcHUodWxvbmcgYWRkcikKewoJcHJpbnRmKCJSZXNldHRpbmcgdXNpbmcgU0M1MjAgTU1DUlxuIik7CgkvKiBXcml0ZSBhICcxJyB0byB0aGUgU1lTX1JTVCBvZiB0aGUgUkVTQ0ZHIE1NQ1IgKi8KCXNjNTIwX21tY3ItPnJlc2NmZyA9IDB4MDE7CgoJLyogTk9UUkVBQ0hFRCAqLwp9CiNlbmRpZgo=