LyoKICogKEMpIENvcHlyaWdodCAyMDA1LTIwMDcKICogU3RlZmFuIFJvZXNlLCBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nLCBzckBkZW54LmRlLgogKgogKiAoQykgQ29weXJpZ2h0IDIwMDYKICogREFWRSBTcmwgPHd3dy5kYXZlLXRlY2guaXQ+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMi0yMDA0CiAqIFN0ZWZhbiBSb2VzZSwgZXNkIGdtYmggZ2VybWFueSwgc3RlZmFuLnJvZXNlQGVzZC1lbGVjdHJvbmljcy5jb20KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4JIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxwcGM0eHguaD4KI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KI2luY2x1ZGUgInNkcmFtLmgiCgojaWZkZWYgQ09ORklHX1NEUkFNX0JBTkswCgojaWZuZGVmIENPTkZJR180NDAKCiNpZm5kZWYgQ0ZHX1NEUkFNX1RBQkxFCnNkcmFtX2NvbmZfdCBtYjBjZltdID0gewoJeygxMjggPDwgMjApLCAxMywgMHgwMDBBNDAwMX0sCSAgICAvKiAoMC0xMjhNQikgQWRkcmVzcyBNb2RlIDMsIDEzeDEwKDQpICovCgl7KDY0IDw8IDIwKSwgIDEzLCAweDAwMDg0MDAxfSwJICAgIC8qICgwLTY0TUIpIEFkZHJlc3MgTW9kZSAzLCAxM3g5KDQpCSAgKi8KCXsoMzIgPDwgMjApLCAgMTIsIDB4MDAwNjIwMDF9LAkgICAgLyogKDAtMzJNQikgQWRkcmVzcyBNb2RlIDIsIDEyeDkoNCkJICAqLwoJeygxNiA8PCAyMCksICAxMiwgMHgwMDA0NjAwMX0sCSAgICAvKiAoMC0xNk1CKSBBZGRyZXNzIE1vZGUgNCwgMTJ4OCg0KQkgICovCgl7KDQgPDwgMjApLCAgIDExLCAweDAwMDA4MDAxfSwJICAgIC8qICgwLTRNQikgQWRkcmVzcyBNb2RlIDUsIDExeDgoMikJICAqLwp9OwojZWxzZQpzZHJhbV9jb25mX3QgbWIwY2ZbXSA9IENGR19TRFJBTV9UQUJMRTsKI2VuZGlmCgojZGVmaW5lIE5fTUIwQ0YgKHNpemVvZihtYjBjZikgLyBzaXplb2YobWIwY2ZbMF0pKQoKI2lmZGVmIENGR19TRFJBTV9DQVNMCnN0YXRpYyB1bG9uZyBuczJjbGtzKHVsb25nIG5zKQp7Cgl1bG9uZyBidXNfcGVyaW9kX3hfMTAgPSBPTkVfQklMTElPTiAvIChnZXRfYnVzX2ZyZXEoMCkgLyAxMCk7CgoJcmV0dXJuICgobnMgKiAxMCkgKyBidXNfcGVyaW9kX3hfMTApIC8gYnVzX3BlcmlvZF94XzEwOwp9CiNlbmRpZiAvKiBDRkdfU0RSQU1fQ0FTTCAqLwoKc3RhdGljIHVsb25nIGNvbXB1dGVfc2R0cjEodWxvbmcgc3BlZWQpCnsKI2lmZGVmIENGR19TRFJBTV9DQVNMCgl1bG9uZyB0bXA7Cgl1bG9uZyBzZHRyMSA9IDA7CgoJLyogQ0FTTCAqLwoJaWYgKENGR19TRFJBTV9DQVNMIDwgMikKCQlzZHRyMSB8PSAoMSA8PCBTRFJBTTBfVFJfQ0FTTCk7CgllbHNlCgkJaWYgKENGR19TRFJBTV9DQVNMID4gNCkKCQkJc2R0cjEgfD0gKDMgPDwgU0RSQU0wX1RSX0NBU0wpOwoJCWVsc2UKCQkJc2R0cjEgfD0gKChDRkdfU0RSQU1fQ0FTTC0xKSA8PCBTRFJBTTBfVFJfQ0FTTCk7CgoJLyogUFRBICovCgl0bXAgPSBuczJjbGtzKENGR19TRFJBTV9QVEEpOwoJaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKCQlzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfUFRBKTsKCWVsc2UKCQlzZHRyMSB8PSAoKDQtMSkgPDwgU0RSQU0wX1RSX1BUQSk7CgoJLyogQ1RQICovCgl0bXAgPSBuczJjbGtzKENGR19TRFJBTV9DVFApOwoJaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKCQlzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfQ1RQKTsKCWVsc2UKCQlzZHRyMSB8PSAoKDQtMSkgPDwgU0RSQU0wX1RSX0NUUCk7CgoJLyogTERGICovCgl0bXAgPSBuczJjbGtzKENGR19TRFJBTV9MREYpOwoJaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKCQlzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfTERGKTsKCWVsc2UKCQlzZHRyMSB8PSAoKDItMSkgPDwgU0RSQU0wX1RSX0xERik7CgoJLyogUkZUQSAqLwoJdG1wID0gbnMyY2xrcyhDRkdfU0RSQU1fUkZUQSk7CglpZiAoKHRtcCA+PSA0KSAmJiAodG1wIDw9IDEwKSkKCQlzZHRyMSB8PSAoKHRtcC00KSA8PCBTRFJBTTBfVFJfUkZUQSk7CgllbHNlCgkJc2R0cjEgfD0gKCgxMC00KSA8PCBTRFJBTTBfVFJfUkZUQSk7CgoJLyogUkNEICovCgl0bXAgPSBuczJjbGtzKENGR19TRFJBTV9SQ0QpOwoJaWYgKCh0bXAgPj0gMikgJiYgKHRtcCA8PSA0KSkKCQlzZHRyMSB8PSAoKHRtcC0xKSA8PCBTRFJBTTBfVFJfUkNEKTsKCWVsc2UKCQlzZHRyMSB8PSAoKDQtMSkgPDwgU0RSQU0wX1RSX1JDRCk7CgoJcmV0dXJuIHNkdHIxOwojZWxzZSAvKiBDRkdfU0RSQU1fQ0FTTCAqLwoJLyoKCSAqIElmIG5vIHZhbHVlcyBhcmUgY29uZmlndXJlZCBpbiB0aGUgYm9hcmQgY29uZmlnIGZpbGUKCSAqIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMsIHdoaWNoIHNlZW0gdG8gYmUgb2sgZm9yIG1vc3QKCSAqIGJvYXJkcy4KCSAqCgkgKiBSRU1BUks6CgkgKiBGb3IgbmV3IGJvYXJkIHBvcnRzIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byBkZWZpbmUgdGhlCgkgKiBjb3JyZWN0IHZhbHVlcyBmb3IgdGhlIHVzZWQgU0RSQU0gY2hpcHMgaW4geW91ciBib2FyZAoJICogY29uZmlnIGZpbGUgKHNlZSBQUENoYW1lbGVvbkVWQi5oKQoJICovCglpZiAoc3BlZWQgPiAxMDAwMDAwMDApIHsKCQkvKgoJCSAqIDEzMyBNSHogU0RSQU0KCQkgKi8KCQlyZXR1cm4gMHgwMTA3NDAxNTsKCX0gZWxzZSB7CgkJLyoKCQkgKiBkZWZhdWx0OiAxMDAgTUh6IFNEUkFNCgkJICovCgkJcmV0dXJuIDB4MDA4NjQwMGQ7Cgl9CiNlbmRpZiAvKiBDRkdfU0RSQU1fQ0FTTCAqLwp9CgovKiByZWZyZXNoIGlzIGV4cHJlc3NlZCBpbiBtcyAqLwpzdGF0aWMgdWxvbmcgY29tcHV0ZV9ydHIodWxvbmcgc3BlZWQsIHVsb25nIHJvd3MsIHVsb25nIHJlZnJlc2gpCnsKI2lmZGVmIENGR19TRFJBTV9DQVNMCgl1bG9uZyB0bXA7CgoJdG1wID0gKChyZWZyZXNoKjEwMDAqMTAwMCkgLyAoMSA8PCByb3dzKSkgKiAoc3BlZWQgLyAxMDAwKTsKCXRtcCAvPSAxMDAwMDAwOwoKCXJldHVybiAoKHRtcCAmIDB4MDAwMDNGRjgpIDw8IDE2KTsKI2Vsc2UgLyogQ0ZHX1NEUkFNX0NBU0wgKi8KCWlmIChzcGVlZCA+IDEwMDAwMDAwMCkgewoJCS8qCgkJICogMTMzIE1IeiBTRFJBTQoJCSAqLwoJCXJldHVybiAweDA3ZjAwMDAwOwoJfSBlbHNlIHsKCQkvKgoJCSAqIGRlZmF1bHQ6IDEwMCBNSHogU0RSQU0KCQkgKi8KCQlyZXR1cm4gMHgwNWYwMDAwMDsKCX0KI2VuZGlmIC8qIENGR19TRFJBTV9DQVNMICovCn0KCi8qCiAqIEF1dG9kZXRlY3Qgb25ib2FyZCBTRFJBTSBvbiA0MDUgcGxhdGZvcm1zCiAqLwp2b2lkIHNkcmFtX2luaXQodm9pZCkKewoJdWxvbmcgc3BlZWQ7Cgl1bG9uZyBzZHRyMTsKCWludCBpOwoKCS8qCgkgKiBEZXRlcm1pbmUgU0RSQU0gc3BlZWQKCSAqLwoJc3BlZWQgPSBnZXRfYnVzX2ZyZXEoMCk7IC8qIHBhcmFtZXRlciBub3QgdXNlZCBvbiBwcGM0eHggKi8KCgkvKgoJICogc2R0cjEgKHJlZ2lzdGVyIFNEUkFNMF9UUikgbXVzdCB0YWtlIGludG8gYWNjb3VudCB0aW1pbmdzIGxpc3RlZAoJICogaW4gU0RSQU0gY2hpcCBkYXRhc2hlZXQuIHJ0ciAocmVnaXN0ZXIgU0RSQU0wX1JUUikgbXVzdCB0YWtlIGludG8KCSAqIGFjY291bnQgYWN0dWFsIFNEUkFNIHNpemUuIFNvIHdlIGNhbiBzZXQgdXAgc2R0cjEgYWNjb3JkaW5nIHRvIHdoYXQKCSAqIGlzIHNwZWNpZmllZCBpbiBib2FyZCBjb25maWd1cmF0aW9uIGZpbGUgd2hpbGUgcnRyIGRlcGVuZGRzIG9uIFNEUkFNCgkgKiBzaXplIHdlIGFyZSBhc3N1bWluZyBiZWZvcmUgZGV0ZWN0aW9uLgoJICovCglzZHRyMSA9IGNvbXB1dGVfc2R0cjEoc3BlZWQpOwoKCWZvciAoaT0wOyBpPE5fTUIwQ0Y7IGkrKykgewoJCS8qCgkJICogRGlzYWJsZSBtZW1vcnkgY29udHJvbGxlci4KCQkgKi8KCQltdHNkcmFtMChtZW1fbWNvcHQxLCAweDAwMDAwMDAwKTsKCgkJLyoKCQkgKiBTZXQgTUIwQ0YgZm9yIGJhbmsgMC4KCQkgKi8KCQltdHNkcmFtMChtZW1fbWIwY2YsIG1iMGNmW2ldLnJlZyk7CgkJbXRzZHJhbTAobWVtX3NkdHIxLCBzZHRyMSk7CgkJbXRzZHJhbTAobWVtX3J0ciwgY29tcHV0ZV9ydHIoc3BlZWQsIG1iMGNmW2ldLnJvd3MsIDY0KSk7CgoJCXVkZWxheSgyMDApOwoKCQkvKgoJCSAqIFNldCBtZW1vcnkgY29udHJvbGxlciBvcHRpb25zIHJlZywgTUNPUFQxLgoJCSAqIFNldCBEQ19FTiB0byAnMScgYW5kIEJSRF9QUkYgdG8gJzAxJyBmb3IgMTYgYnl0ZSBQTEIgQnVyc3QKCQkgKiByZWFkL3ByZWZldGNoLgoJCSAqLwoJCW10c2RyYW0wKG1lbV9tY29wdDEsIDB4ODA4MDAwMDApOwoKCQl1ZGVsYXkoMTAwMDApOwoKCQlpZiAoZ2V0X3JhbV9zaXplKDAsIG1iMGNmW2ldLnNpemUpID09IG1iMGNmW2ldLnNpemUpIHsKCQkJLyoKCQkJICogT0ssIHNpemUgZGV0ZWN0ZWQgLT4gYWxsIGRvbmUKCQkJICovCgkJCXJldHVybjsKCQl9Cgl9Cn0KCiNlbHNlIC8qIENPTkZJR180NDAgKi8KCi8qCiAqIERlZmluZSBzb21lIGRlZmF1bHQgdmFsdWVzLiBUaG9zZSBjYW4gYmUgb3ZlcndyaXR0ZW4gaW4gdGhlCiAqIGJvYXJkIGNvbmZpZyBmaWxlLgogKi8KCiNpZm5kZWYgQ0ZHX1NEUkFNX1RBQkxFCnNkcmFtX2NvbmZfdCBtYjBjZltdID0gewoJeygyNTYgPDwgMjApLCAxMywgMHgwMDBDNDAwMX0sCS8qIDI1Nk1CIG1vZGUgMywgMTN4MTAoNCkJKi8KCXsoNjQgPDwgMjApLCAgMTIsIDB4MDAwODIwMDF9CS8qIDY0TUIgbW9kZSAyLCAxMng5KDQpCQkqLwp9OwojZWxzZQpzZHJhbV9jb25mX3QgbWIwY2ZbXSA9IENGR19TRFJBTV9UQUJMRTsKI2VuZGlmCgojaWZuZGVmIENGR19TRFJBTTBfVFIwCiNkZWZpbmUJQ0ZHX1NEUkFNMF9UUjAJCTB4NDEwOTQwMTIKI2VuZGlmCgojZGVmaW5lIE5fTUIwQ0YgKHNpemVvZihtYjBjZikgLyBzaXplb2YobWIwY2ZbMF0pKQoKI2RlZmluZSBOVU1fVFJJRVMgNjQKI2RlZmluZSBOVU1fUkVBRFMgMTAKCnN0YXRpYyB2b2lkIHNkcmFtX3RyMV9zZXQoaW50IHJhbV9hZGRyZXNzLCBpbnQqIHRyMV92YWx1ZSkKewoJaW50IGk7CglpbnQgaiwgazsKCXZvbGF0aWxlIHVuc2lnbmVkIGludCogcmFtX3BvaW50ZXIgPSAodW5zaWduZWQgaW50ICopcmFtX2FkZHJlc3M7CglpbnQgZmlyc3RfZ29vZCA9IC0xLCBsYXN0X2JhZCA9IDB4MWZmOwoKCXVuc2lnbmVkIGxvbmcgdGVzdFtOVU1fVFJJRVNdID0gewoJCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsCgkJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwKCQkweEZGRkZGRkZGLCAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAoJCTB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCgkJMHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwgMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwKCQkweEFBQUFBQUFBLCAweEFBQUFBQUFBLCAweDU1NTU1NTU1LCAweDU1NTU1NTU1LAoJCTB4NTU1NTU1NTUsIDB4NTU1NTU1NTUsIDB4QUFBQUFBQUEsIDB4QUFBQUFBQUEsCgkJMHg1NTU1NTU1NSwgMHg1NTU1NTU1NSwgMHhBQUFBQUFBQSwgMHhBQUFBQUFBQSwKCQkweEE1QTVBNUE1LCAweEE1QTVBNUE1LCAweDVBNUE1QTVBLCAweDVBNUE1QTVBLAoJCTB4QTVBNUE1QTUsIDB4QTVBNUE1QTUsIDB4NUE1QTVBNUEsIDB4NUE1QTVBNUEsCgkJMHg1QTVBNUE1QSwgMHg1QTVBNUE1QSwgMHhBNUE1QTVBNSwgMHhBNUE1QTVBNSwKCQkweDVBNUE1QTVBLCAweDVBNUE1QTVBLCAweEE1QTVBNUE1LCAweEE1QTVBNUE1LAoJCTB4QUE1NUFBNTUsIDB4QUE1NUFBNTUsIDB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsCgkJMHhBQTU1QUE1NSwgMHhBQTU1QUE1NSwgMHg1NUFBNTVBQSwgMHg1NUFBNTVBQSwKCQkweDU1QUE1NUFBLCAweDU1QUE1NUFBLCAweEFBNTVBQTU1LCAweEFBNTVBQTU1LAoJCTB4NTVBQTU1QUEsIDB4NTVBQTU1QUEsIDB4QUE1NUFBNTUsIDB4QUE1NUFBNTUgfTsKCgkvKiBnbyB0aHJvdWdoIGFsbCBwb3NzaWJsZSBTRFJBTTBfVFIxW1JEQ1RdIHZhbHVlcyAqLwoJZm9yIChpPTA7IGk8PTB4MWZmOyBpKyspIHsKCQkvKiBzZXQgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIFRSMSAqLwoJCW10c2RyYW0obWVtX3RyMSwgKDB4ODA4MDA4MDAgfCBpKSk7CgoJCS8qIHdyaXRlIHZhbHVlcyAqLwoJCWZvciAoaj0wOyBqPE5VTV9UUklFUzsgaisrKSB7CgkJCXJhbV9wb2ludGVyW2pdID0gdGVzdFtqXTsKCgkJCS8qIGNsZWFyIGFueSBjYWNoZSBhdCByYW0gbG9jYXRpb24gKi8KCQkJX19hc21fXygiZGNiZiAwLCUwIjogOiJyIiAoJnJhbV9wb2ludGVyW2pdKSk7CgkJfQoKCQkvKiByZWFkIHZhbHVlcyBiYWNrICovCgkJZm9yIChqPTA7IGo8TlVNX1RSSUVTOyBqKyspIHsKCQkJZm9yIChrPTA7IGs8TlVNX1JFQURTOyBrKyspIHsKCQkJCS8qIGNsZWFyIGFueSBjYWNoZSBhdCByYW0gbG9jYXRpb24gKi8KCQkJCV9fYXNtX18oImRjYmYgMCwlMCI6IDoiciIgKCZyYW1fcG9pbnRlcltqXSkpOwoKCQkJCWlmIChyYW1fcG9pbnRlcltqXSAhPSB0ZXN0W2pdKQoJCQkJCWJyZWFrOwoJCQl9CgoJCQkvKiByZWFkIGVycm9yICovCgkJCWlmIChrICE9IE5VTV9SRUFEUykKCQkJCWJyZWFrOwoJCX0KCgkJLyogd2UgaGF2ZSBhIFNEUkFNMF9UUjFbUkRDVF0gdGhhdCBpcyBwYXJ0IG9mIHRoZSB3aW5kb3cgKi8KCQlpZiAoaiA9PSBOVU1fVFJJRVMpIHsKCQkJaWYgKGZpcnN0X2dvb2QgPT0gLTEpCgkJCQlmaXJzdF9nb29kID0gaTsJCS8qIGZvdW5kIGJlZ2lubmluZyBvZiB3aW5kb3cgKi8KCQl9IGVsc2UgeyAvKiBiYWQgcmVhZCAqLwoJCQkvKiBpZiB3ZSBoYXZlIG5vdCBoYWQgYSBnb29kIHJlYWQgdGhlbiBkb24ndCBjYXJlICovCgkJCWlmIChmaXJzdF9nb29kICE9IC0xKSB7CgkJCQkvKiBmaXJzdCBmYWlsdXJlIGFmdGVyIGEgZ29vZCByZWFkICovCgkJCQlsYXN0X2JhZCA9IGktMTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8qIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmb3IgVFIxICovCgkqdHIxX3ZhbHVlID0gKGZpcnN0X2dvb2QgKyBsYXN0X2JhZCkgLyAyOwp9CgojaWZkZWYgQ09ORklHX1NEUkFNX0VDQwpzdGF0aWMgdm9pZCBlY2NfaW5pdCh1bG9uZyBzdGFydCwgdWxvbmcgc2l6ZSkKewoJdWxvbmcJY3VycmVudF9hZGRyOwkJLyogY3VycmVudCBieXRlIGFkZHJlc3MgKi8KCXVsb25nCWVuZF9hZGRyOwkJLyogZW5kIG9mIG1lbW9yeSByZWdpb24gKi8KCXVsb25nCWFkZHJfaW5jOwkJLyogYWRkcmVzcyBza2lwIGJldHdlZW4gd3JpdGVzICovCgl1bG9uZwljZmcwX3JlZzsJCS8qIGZvciByZXN0b3JpbmcgRUNDIHN0YXRlICovCgoJLyoKCSAqIFRPRE86IEVuYWJsZSBkY2FjaGUgYmVmb3JlIHJ1bm5pbmcgdGhpcyB0ZXN0IChzcGVlZHVwKQoJICovCgoJbWZzZHJhbShtZW1fY2ZnMCwgY2ZnMF9yZWcpOwoJbXRzZHJhbShtZW1fY2ZnMCwgKGNmZzBfcmVnICYgflNEUkFNX0NGRzBfTUVNQ0hLKSB8IFNEUkFNX0NGRzBfTUVNQ0hLX0dFTik7CgoJLyoKCSAqIGxvb2sgYXQgZ2VvbWV0cnkgb2YgU0RSQU0gKGRhdGEgd2lkdGgpIHRvIGRldGVybWluZSB3aGV0aGVyIHdlCgkgKiBjYW4gc2tpcCB3b3JkcyB3aGVuIHdyaXRpbmcKCSAqLwoJaWYgKChjZmcwX3JlZyAmIFNEUkFNX0NGRzBfRFJBTVdEVEgpID09IFNEUkFNX0NGRzBfRFJBTVdEVEhfMzIpCgkJYWRkcl9pbmMgPSA0OwoJZWxzZQoJCWFkZHJfaW5jID0gODsKCgljdXJyZW50X2FkZHIgPSBzdGFydDsKCWVuZF9hZGRyID0gc3RhcnQgKyBzaXplOwoKCXdoaWxlIChjdXJyZW50X2FkZHIgPCBlbmRfYWRkcikgewoJCSooKHVsb25nICopY3VycmVudF9hZGRyKSA9IDB4MDAwMDAwMDA7CgkJY3VycmVudF9hZGRyICs9IGFkZHJfaW5jOwoJfQoKCS8qCgkgKiBUT0RPOiBGbHVzaCBkY2FjaGUgYW5kIGRpc2FibGUgaXQgYWdhaW4KCSAqLwoKCS8qCgkgKiBFbmFibGUgZWNjIGNoZWNraW5nIGFuZCBwYXJpdHkgZXJyb3JzCgkgKi8KCW10c2RyYW0obWVtX2NmZzAsIChjZmcwX3JlZyAmIH5TRFJBTV9DRkcwX01FTUNISykgfCBTRFJBTV9DRkcwX01FTUNIS19DSEspOwp9CiNlbmRpZgoKLyoKICogQXV0b2RldGVjdCBvbmJvYXJkIEREUiBTRFJBTSBvbiA0NDAgcGxhdGZvcm1zCiAqCiAqIE5PVEU6IFNvbWUgb2YgdGhlIGhhcmRjb2RlZCB2YWx1ZXMgYXJlIGhhcmR3YXJlIGRlcGVuZGFudCwKICoJIHNvIHRoaXMgc2hvdWxkIGJlIGV4dGVuZGVkIGZvciBvdGhlciBmdXR1cmUgYm9hcmRzCiAqCSB1c2luZyB0aGlzIHJvdXRpbmUhCiAqLwpsb25nIGludCBpbml0ZHJhbShpbnQgYm9hcmRfdHlwZSkKewoJaW50IGk7CglpbnQgdHIxX2JhbmsxOwoKI2lmIGRlZmluZWQoQ09ORklHXzQ0MEdYKSB8fCBkZWZpbmVkKENPTkZJR180NDBFUCkgfHwgXAogICAgZGVmaW5lZChDT05GSUdfNDQwR1IpIHx8IGRlZmluZWQoQ09ORklHXzQ0MFNQKQoJLyoKCSAqIFNvZnQtcmVzZXQgU0RSQU0gY29udHJvbGxlci4KCSAqLwoJbXRzZHIoc2RyX3Nyc3QsIFNEUjBfU1JTVF9ETUMpOwoJbXRzZHIoc2RyX3Nyc3QsIDB4MDAwMDAwMDApOwojZW5kaWYKCglmb3IgKGk9MDsgaTxOX01CMENGOyBpKyspIHsKCQkvKgoJCSAqIERpc2FibGUgbWVtb3J5IGNvbnRyb2xsZXIuCgkJICovCgkJbXRzZHJhbShtZW1fY2ZnMCwgMHgwMDAwMDAwMCk7CgoJCS8qCgkJICogU2V0dXAgc29tZSBkZWZhdWx0CgkJICovCgkJbXRzZHJhbShtZW1fdWFiYmEsIDB4MDAwMDAwMDApOyAvKiB1YmJhPTAgKGRlZmF1bHQpCQkqLwoJCW10c2RyYW0obWVtX3NsaW8sIDB4MDAwMDAwMDApOwkvKiByZHJlPTAgd3JyZT0wIHJhcnc9MAkJKi8KCQltdHNkcmFtKG1lbV9kZXZvcHQsIDB4MDAwMDAwMDApOyAvKiBkbGw9MCBkcz0wIChub3JtYWwpCQkqLwoJCW10c2RyYW0obWVtX3dkZGN0ciwgMHgwMDAwMDAwMCk7IC8qIHdyY3A9MCBkY2Q9MAkJKi8KCQltdHNkcmFtKG1lbV9jbGt0ciwgMHg0MDAwMDAwMCk7IC8qIGNsa3A9MSAoOTAgZGVnIHdyKSBkY2R0PTAJKi8KCgkJLyoKCQkgKiBGb2xsb3dpbmcgZm9yIENBUyBMYXRlbmN5ID0gMi41IEAgMTMzIE1IeiBQTEIKCQkgKi8KCQltdHNkcmFtKG1lbV9iMGNyLCBtYjBjZltpXS5yZWcpOwoJCW10c2RyYW0obWVtX3RyMCwgQ0ZHX1NEUkFNMF9UUjApOwoJCW10c2RyYW0obWVtX3RyMSwgMHg4MDgwMDgwMCk7CS8qIFNTPVQyIFNMPVNUQUdFIDMgQ0Q9MSBDVD0weDAwKi8KCQltdHNkcmFtKG1lbV9ydHIsIDB4MDQxMDAwMDApOwkvKiBJbnRlcnZhbCA3Lji1cyBAIDEzM01IeiBQTEIJKi8KCQltdHNkcmFtKG1lbV9jZmcxLCAweDAwMDAwMDAwKTsJLyogU2VsZi1yZWZyZXNoIGV4aXQsIGRpc2FibGUgUE0qLwoJCXVkZWxheSg0MDApOwkJCS8qIERlbGF5IDIwMCB1c2VjcyAobWluKQkqLwoKCQkvKgoJCSAqIEVuYWJsZSB0aGUgY29udHJvbGxlciwgdGhlbiB3YWl0IGZvciBEQ0VOIHRvIGNvbXBsZXRlCgkJICovCgkJbXRzZHJhbShtZW1fY2ZnMCwgMHg4MjAwMDAwMCk7CS8qIERDRU49MSwgUE1VRD0wLCA2NC1iaXQJKi8KCQl1ZGVsYXkoMTAwMDApOwoKCQlpZiAoZ2V0X3JhbV9zaXplKDAsIG1iMGNmW2ldLnNpemUpID09IG1iMGNmW2ldLnNpemUpIHsKCQkJLyoKCQkJICogT3B0aW1pemUgVFIxIHRvIGN1cnJlbnQgaGFyZHdhcmUgZW52aXJvbm1lbnQKCQkJICovCgkJCXNkcmFtX3RyMV9zZXQoMHgwMDAwMDAwMCwgJnRyMV9iYW5rMSk7CgkJCW10c2RyYW0obWVtX3RyMSwgKHRyMV9iYW5rMSB8IDB4ODA4MDA4MDApKTsKCiNpZmRlZiBDT05GSUdfU0RSQU1fRUNDCgkJCWVjY19pbml0KDAsIG1iMGNmW2ldLnNpemUpOwojZW5kaWYKCgkJCS8qCgkJCSAqIE9LLCBzaXplIGRldGVjdGVkIC0+IGFsbCBkb25lCgkJCSAqLwoJCQlyZXR1cm4gbWIwY2ZbaV0uc2l6ZTsKCQl9Cgl9CgoJcmV0dXJuIDA7CQkJCS8qIG5vdGhpbmcgZm91bmQgIQkJKi8KfQoKI2VuZGlmIC8qIENPTkZJR180NDAgKi8KCiNlbmRpZiAvKiBDT05GSUdfU0RSQU1fQkFOSzAgKi8K