LyoKICogIGFybWJvb3QgLSBTdGFydHVwIENvZGUgZm9yIEFSTTcyMCBDUFUtY29yZQogKgogKiAgQ29weXJpZ2h0IChjKSAyMDAxCU1hcml1cyBHcvZnZXIgPG1hZ0BzeXNnby5kZT4KICogIENvcHlyaWdodCAoYykgMjAwMglBbGV4IFr8cGtlIDxhenVAc3lzZ28uZGU+CiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCSBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGFzbS1vZmZzZXRzLmg+CiNpbmNsdWRlIDxjb25maWcuaD4KI2luY2x1ZGUgPHZlcnNpb24uaD4KI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgoKLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogSnVtcCB2ZWN0b3IgdGFibGUgYXMgaW4gdGFibGUgMy4xIGluIFsxXQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKi8KCgouZ2xvYmwgX3N0YXJ0Cl9zdGFydDogYglyZXNldAoJbGRyCXBjLCBfdW5kZWZpbmVkX2luc3RydWN0aW9uCglsZHIJcGMsIF9zb2Z0d2FyZV9pbnRlcnJ1cHQKCWxkcglwYywgX3ByZWZldGNoX2Fib3J0CglsZHIJcGMsIF9kYXRhX2Fib3J0CiNpZmRlZiBDT05GSUdfTFBDMjI5MgoJLndvcmQJMHhCNDQwNUY3NiAvKiAyJ3MgY29tcGxlbWVudCBvZiB0aGUgY2hlY2tzdW0gb2YgdGhlIHZlY3RvcnMgKi8KI2Vsc2UKCWxkcglwYywgX25vdF91c2VkCiNlbmRpZgoJbGRyCXBjLCBfaXJxCglsZHIJcGMsIF9maXEKCl91bmRlZmluZWRfaW5zdHJ1Y3Rpb246IC53b3JkIHVuZGVmaW5lZF9pbnN0cnVjdGlvbgpfc29mdHdhcmVfaW50ZXJydXB0Ogkud29yZCBzb2Z0d2FyZV9pbnRlcnJ1cHQKX3ByZWZldGNoX2Fib3J0Ogkud29yZCBwcmVmZXRjaF9hYm9ydApfZGF0YV9hYm9ydDoJCS53b3JkIGRhdGFfYWJvcnQKX25vdF91c2VkOgkJLndvcmQgbm90X3VzZWQKX2lycToJCQkud29yZCBpcnEKX2ZpcToJCQkud29yZCBmaXEKCgkuYmFsaWdubCAxNiwweGRlYWRiZWVmCgoKLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogU3RhcnR1cCBDb2RlIChyZXNldCB2ZWN0b3IpCiAqCiAqIGRvIGltcG9ydGFudCBpbml0IG9ubHkgaWYgd2UgZG9uJ3Qgc3RhcnQgZnJvbSBSQU0hCiAqIHJlbG9jYXRlIGFybWJvb3QgdG8gcmFtCiAqIHNldHVwIHN0YWNrCiAqIGp1bXAgdG8gc2Vjb25kIHN0YWdlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKLmdsb2JsIF9URVhUX0JBU0UKX1RFWFRfQkFTRToKCS53b3JkCUNPTkZJR19TWVNfVEVYVF9CQVNFCgovKgogKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiB0aGUgYm9hcmQtc3BlY2lmaWMgbGlua2VyIHNjcmlwdC4KICogU3VidHJhY3RpbmcgX3N0YXJ0IGZyb20gdGhlbSBsZXRzIHRoZSBsaW5rZXIgcHV0IHRoZWlyCiAqIHJlbGF0aXZlIHBvc2l0aW9uIGluIHRoZSBleGVjdXRhYmxlIGluc3RlYWQgb2YgbGVhdmluZwogKiB0aGVtIG51bGwuCiAqLwouZ2xvYmwgX2Jzc19zdGFydF9vZnMKX2Jzc19zdGFydF9vZnM6Cgkud29yZCBfX2Jzc19zdGFydCAtIF9zdGFydAoKLmdsb2JsIF9ic3NfZW5kX29mcwpfYnNzX2VuZF9vZnM6Cgkud29yZCBfX2Jzc19lbmRfXyAtIF9zdGFydAoKLmdsb2JsIF9lbmRfb2ZzCl9lbmRfb2ZzOgoJLndvcmQgX2VuZCAtIF9zdGFydAoKI2lmZGVmIENPTkZJR19VU0VfSVJRCi8qIElSUSBzdGFjayBtZW1vcnkgKGNhbGN1bGF0ZWQgYXQgcnVuLXRpbWUpICovCi5nbG9ibCBJUlFfU1RBQ0tfU1RBUlQKSVJRX1NUQUNLX1NUQVJUOgoJLndvcmQJMHgwYmFkYzBkZQoKLyogSVJRIHN0YWNrIG1lbW9yeSAoY2FsY3VsYXRlZCBhdCBydW4tdGltZSkgKi8KLmdsb2JsIEZJUV9TVEFDS19TVEFSVApGSVFfU1RBQ0tfU1RBUlQ6Cgkud29yZCAweDBiYWRjMGRlCiNlbmRpZgoKLyogSVJRIHN0YWNrIG1lbW9yeSAoY2FsY3VsYXRlZCBhdCBydW4tdGltZSkgKyA4IGJ5dGVzICovCi5nbG9ibCBJUlFfU1RBQ0tfU1RBUlRfSU4KSVJRX1NUQUNLX1NUQVJUX0lOOgoJLndvcmQJMHgwYmFkYzBkZQoKLyoKICogdGhlIGFjdHVhbCByZXNldCBjb2RlCiAqLwoKcmVzZXQ6CgkvKgoJICogc2V0IHRoZSBjcHUgdG8gU1ZDMzIgbW9kZQoJICovCgltcnMJcjAsY3BzcgoJYmljCXIwLHIwLCMweDFmCglvcnIJcjAscjAsIzB4ZDMKCW1zcgljcHNyLHIwCgoJLyoKCSAqIHdlIGRvIHN5cy1jcml0aWNhbCBpbml0cyBvbmx5IGF0IHJlYm9vdCwKCSAqIG5vdCB3aGVuIGJvb3RpbmcgZnJvbSByYW0hCgkgKi8KI2lmbmRlZiBDT05GSUdfU0tJUF9MT1dMRVZFTF9JTklUCglibAljcHVfaW5pdF9jcml0CiNlbmRpZgoKI2lmZGVmIENPTkZJR19MUEMyMjkyCglibAlsb3dsZXZlbF9pbml0CiNlbmRpZgoKLyogU2V0IHN0YWNrcG9pbnRlciBpbiBpbnRlcm5hbCBSQU0gdG8gY2FsbCBib2FyZF9pbml0X2YgKi8KY2FsbF9ib2FyZF9pbml0X2Y6CglsZHIJc3AsID0oQ09ORklHX1NZU19JTklUX1NQX0FERFIpCgliaWMJc3AsIHNwLCAjNyAvKiA4LWJ5dGUgYWxpZ25tZW50IGZvciBBQkkgY29tcGxpYW5jZSAqLwoJbGRyCXIwLD0weDAwMDAwMDAwCglibAlib2FyZF9pbml0X2YKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qCiAqIHZvaWQgcmVsb2NhdGVfY29kZSAoYWRkcl9zcCwgZ2QsIGFkZHJfbW9uaSkKICoKICogVGhpcyAiZnVuY3Rpb24iIGRvZXMgbm90IHJldHVybiwgaW5zdGVhZCBpdCBjb250aW51ZXMgaW4gUkFNCiAqIGFmdGVyIHJlbG9jYXRpbmcgdGhlIG1vbml0b3IgY29kZS4KICoKICovCgkuZ2xvYmwJcmVsb2NhdGVfY29kZQpyZWxvY2F0ZV9jb2RlOgoJbW92CXI0LCByMAkvKiBzYXZlIGFkZHJfc3AgKi8KCW1vdglyNSwgcjEJLyogc2F2ZSBhZGRyIG9mIGdkICovCgltb3YJcjYsIHIyCS8qIHNhdmUgYWRkciBvZiBkZXN0aW5hdGlvbiAqLwoKCS8qIFNldCB1cCB0aGUgc3RhY2sJCQkJCQkgICAgKi8Kc3RhY2tfc2V0dXA6Cgltb3YJc3AsIHI0CgoJYWRyCXIwLCBfc3RhcnQKCWNtcAlyMCwgcjYKCWJlcQljbGVhcl9ic3MJCS8qIHNraXAgcmVsb2NhdGlvbiAqLwoJbW92CXIxLCByNgkJCS8qIHIxIDwtIHNjcmF0Y2ggZm9yIGNvcHlfbG9vcCAqLwoJbGRyCXIzLCBfYnNzX3N0YXJ0X29mcwoJYWRkCXIyLCByMCwgcjMJCS8qIHIyIDwtIHNvdXJjZSBlbmQgYWRkcmVzcwkgICAgKi8KCmNvcHlfbG9vcDoKCWxkbWlhCXIwISwge3I5LXIxMH0JCS8qIGNvcHkgZnJvbSBzb3VyY2UgYWRkcmVzcyBbcjBdICAgICovCglzdG1pYQlyMSEsIHtyOS1yMTB9CQkvKiBjb3B5IHRvICAgdGFyZ2V0IGFkZHJlc3MgW3IxXSAgICAqLwoJY21wCXIwLCByMgkJCS8qIHVudGlsIHNvdXJjZSBlbmQgYWRkcmVzcyBbcjJdICAgICovCglibG8JY29weV9sb29wCgojaWZuZGVmIENPTkZJR19TUExfQlVJTEQKCS8qCgkgKiBmaXggLnJlbC5keW4gcmVsb2NhdGlvbnMKCSAqLwoJbGRyCXIwLCBfVEVYVF9CQVNFCQkvKiByMCA8LSBUZXh0IGJhc2UgKi8KCXN1YglyOSwgcjYsIHIwCQkvKiByOSA8LSByZWxvY2F0aW9uIG9mZnNldCAqLwoJbGRyCXIxMCwgX2R5bnN5bV9zdGFydF9vZnMJLyogcjEwIDwtIHN5bSB0YWJsZSBvZnMgKi8KCWFkZAlyMTAsIHIxMCwgcjAJCS8qIHIxMCA8LSBzeW0gdGFibGUgaW4gRkxBU0ggKi8KCWxkcglyMiwgX3JlbF9keW5fc3RhcnRfb2ZzCS8qIHIyIDwtIHJlbCBkeW4gc3RhcnQgb2ZzICovCglhZGQJcjIsIHIyLCByMAkJLyogcjIgPC0gcmVsIGR5biBzdGFydCBpbiBGTEFTSCAqLwoJbGRyCXIzLCBfcmVsX2R5bl9lbmRfb2ZzCS8qIHIzIDwtIHJlbCBkeW4gZW5kIG9mcyAqLwoJYWRkCXIzLCByMywgcjAJCS8qIHIzIDwtIHJlbCBkeW4gZW5kIGluIEZMQVNIICovCmZpeGxvb3A6CglsZHIJcjAsIFtyMl0JCS8qIHIwIDwtIGxvY2F0aW9uIHRvIGZpeCB1cCwgSU4gRkxBU0ghICovCglhZGQJcjAsIHIwLCByOQkJLyogcjAgPC0gbG9jYXRpb24gdG8gZml4IHVwIGluIFJBTSAqLwoJbGRyCXIxLCBbcjIsICM0XQoJYW5kCXI3LCByMSwgIzB4ZmYKCWNtcAlyNywgIzIzCQkJLyogcmVsYXRpdmUgZml4dXA/ICovCgliZXEJZml4cmVsCgljbXAJcjcsICMyCQkJLyogYWJzb2x1dGUgZml4dXA/ICovCgliZXEJZml4YWJzCgkvKiBpZ25vcmUgdW5rbm93biB0eXBlIG9mIGZpeHVwICovCgliCWZpeG5leHQKZml4YWJzOgoJLyogYWJzb2x1dGUgZml4OiBzZXQgbG9jYXRpb24gdG8gKG9mZnNldCkgc3ltYm9sIHZhbHVlICovCgltb3YJcjEsIHIxLCBMU1IgIzQJCS8qIHIxIDwtIHN5bWJvbCBpbmRleCBpbiAuZHluc3ltICovCglhZGQJcjEsIHIxMCwgcjEJCS8qIHIxIDwtIGFkZHJlc3Mgb2Ygc3ltYm9sIGluIHRhYmxlICovCglsZHIJcjEsIFtyMSwgIzRdCQkvKiByMSA8LSBzeW1ib2wgdmFsdWUgKi8KCWFkZAlyMSwgcjEsIHI5CQkvKiByMSA8LSByZWxvY2F0ZWQgc3ltIGFkZHIgKi8KCWIJZml4bmV4dApmaXhyZWw6CgkvKiByZWxhdGl2ZSBmaXg6IGluY3JlYXNlIGxvY2F0aW9uIGJ5IG9mZnNldCAqLwoJbGRyCXIxLCBbcjBdCglhZGQJcjEsIHIxLCByOQpmaXhuZXh0OgoJc3RyCXIxLCBbcjBdCglhZGQJcjIsIHIyLCAjOAkJLyogZWFjaCByZWwuZHluIGVudHJ5IGlzIDggYnl0ZXMgKi8KCWNtcAlyMiwgcjMKCWJsbwlmaXhsb29wCiNlbmRpZgoKY2xlYXJfYnNzOgojaWZuZGVmIENPTkZJR19TUExfQlVJTEQKCWxkcglyMCwgX2Jzc19zdGFydF9vZnMKCWxkcglyMSwgX2Jzc19lbmRfb2ZzCgltb3YJcjQsIHI2CQkJLyogcmVsb2MgYWRkciAqLwoJYWRkCXIwLCByMCwgcjQKCWFkZAlyMSwgcjEsIHI0Cgltb3YJcjIsICMweDAwMDAwMDAwCQkvKiBjbGVhcgkJCSAgICAqLwoKY2xic3NfbDpzdHIJcjIsIFtyMF0JCS8qIGNsZWFyIGxvb3AuLi4JCSAgICAqLwoJYWRkCXIwLCByMCwgIzQKCWNtcAlyMCwgcjEKCWJuZQljbGJzc19sCgoJYmwgY29sb3VyZWRfTEVEX2luaXQKCWJsIHJlZF9MRURfb24KI2VuZGlmCgovKgogKiBXZSBhcmUgZG9uZS4gRG8gbm90IHJldHVybiwgaW5zdGVhZCBicmFuY2ggdG8gc2Vjb25kIHBhcnQgb2YgYm9hcmQKICogaW5pdGlhbGl6YXRpb24sIG5vdyBydW5uaW5nIGZyb20gUkFNLgogKi8KCWxkcglyMCwgX2JvYXJkX2luaXRfcl9vZnMKCWFkcglyMSwgX3N0YXJ0CglhZGQJbHIsIHIwLCByMQoJYWRkCWxyLCBsciwgcjkKCS8qIHNldHVwIHBhcmFtZXRlcnMgZm9yIGJvYXJkX2luaXRfciAqLwoJbW92CXIwLCByNQkJLyogZ2RfdCAqLwoJbW92CXIxLCByNgkJLyogZGVzdF9hZGRyICovCgkvKiBqdW1wIHRvIGl0IC4uLiAqLwoJbW92CXBjLCBscgoKX2JvYXJkX2luaXRfcl9vZnM6Cgkud29yZCBib2FyZF9pbml0X3IgLSBfc3RhcnQKCl9yZWxfZHluX3N0YXJ0X29mczoKCS53b3JkIF9fcmVsX2R5bl9zdGFydCAtIF9zdGFydApfcmVsX2R5bl9lbmRfb2ZzOgoJLndvcmQgX19yZWxfZHluX2VuZCAtIF9zdGFydApfZHluc3ltX3N0YXJ0X29mczoKCS53b3JkIF9fZHluc3ltX3N0YXJ0IC0gX3N0YXJ0CgovKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDUFVfaW5pdF9jcml0aWNhbCByZWdpc3RlcnMKICoKICogc2V0dXAgaW1wb3J0YW50IHJlZ2lzdGVycwogKiBzZXR1cCBtZW1vcnkgdGltaW5nCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKI2lmIGRlZmluZWQoQ09ORklHX0lNUEE3KSB8fCBkZWZpbmVkKENPTkZJR19FUDczMTIpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFESUxMTykKCi8qIEludGVycnVwdC1Db250cm9sbGVyIGJhc2UgYWRkcmVzc2VzICovCklOVE1SMToJCS53b3JkCTB4ODAwMDAyODAgQCAzMiBiaXQgc2l6ZQpJTlRNUjI6CQkud29yZAkweDgwMDAxMjgwIEAgMTYgYml0IHNpemUKSU5UTVIzOgkJLndvcmQJMHg4MDAwMjI4MCBAICA4IGJpdCBzaXplCgovKiBTWVNDT05zICovClNZU0NPTjE6CS53b3JkCTB4ODAwMDAxMDAKU1lTQ09OMjoJLndvcmQJMHg4MDAwMTEwMApTWVNDT04zOgkud29yZAkweDgwMDAyMjAwCgojZGVmaW5lIENMS0NUTAkgICAgICAgMHg2ICAvKiBtYXNrICovCiNkZWZpbmUgQ0xLQ1RMXzE4ICAgICAgMHgwICAvKiAxOC40MzIgTUh6ICovCiNkZWZpbmUgQ0xLQ1RMXzM2ICAgICAgMHgyICAvKiAzNi44NjQgTUh6ICovCiNkZWZpbmUgQ0xLQ1RMXzQ5ICAgICAgMHg0ICAvKiA0OS4xNTIgTUh6ICovCiNkZWZpbmUgQ0xLQ1RMXzczICAgICAgMHg2ICAvKiA3My43MjggTUh6ICovCgojZWxpZiBkZWZpbmVkKENPTkZJR19MUEMyMjkyKQpQTExDRkdfQURSOgkud29yZAlQTExDRkcKUExMRkVFRF9BRFI6CS53b3JkCVBMTEZFRUQKUExMQ09OX0FEUjoJLndvcmQJUExMQ09OClBMTFNUQVRfQURSOgkud29yZAlQTExTVEFUClZQQkRJVl9BRFI6CS53b3JkCVZQQkRJVgpNRU1NQVBfQURSOgkud29yZAlNRU1NQVAKCiNlbmRpZgoKY3B1X2luaXRfY3JpdDoKI2lmIGRlZmluZWQoQ09ORklHX0lNUEE3KSB8fCBkZWZpbmVkKENPTkZJR19FUDczMTIpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFESUxMTykKCgkvKgoJICogbWFzayBhbGwgSVJRcyBieSBjbGVhcmluZyBhbGwgYml0cyBpbiB0aGUgSU5UTVJzCgkgKi8KCW1vdglyMSwgIzB4MDAKCWxkcglyMCwgSU5UTVIxCglzdHIJcjEsIFtyMF0KCWxkcglyMCwgSU5UTVIyCglzdHIJcjEsIFtyMF0KCWxkcglyMCwgSU5UTVIzCglzdHIJcjEsIFtyMF0KCgkvKgoJICogZmx1c2ggdjQgSS9EIGNhY2hlcwoJICovCgltb3YJcjAsICMwCgltY3IJcDE1LCAwLCByMCwgYzcsIGM3LCAwCS8qIGZsdXNoIHYzL3Y0IGNhY2hlICovCgltY3IJcDE1LCAwLCByMCwgYzgsIGM3LCAwCS8qIGZsdXNoIHY0IFRMQiAqLwoKCS8qCgkgKiBkaXNhYmxlIE1NVSBzdHVmZiBhbmQgY2FjaGVzCgkgKi8KCW1yYwlwMTUsMCxyMCxjMSxjMAoJYmljCXIwLCByMCwgIzB4MDAwMDIzMDAJQCBjbGVhciBiaXRzIDEzLCA5OjggKC0tVi0gLS1SUykKCWJpYwlyMCwgcjAsICMweDAwMDAwMDhmCUAgY2xlYXIgYml0cyA3LCAzOjAgKEItLS0gV0NBTSkKCW9ycglyMCwgcjAsICMweDAwMDAwMDAyCUAgc2V0IGJpdCAyIChBKSBBbGlnbgoJbWNyCXAxNSwwLHIwLGMxLGMwCiNlbGlmIGRlZmluZWQoQ09ORklHX05FVEFSTSkKCS8qCgkgKiBwcmlvciB0byBzb2Z0d2FyZSByZXNldCA6IG5lZWQgdG8gc2V0IHBpbiBQT1JUQzQgdG8gYmUgKkhSRVNFVAoJICovCglsZHIJcjAsID1ORVRBUk1fR0VOX01PRFVMRV9CQVNFCglsZHIJcjEsID0oTkVUQVJNX0dFTl9QT1JUX01PREUoMHgxMCkgfCBcCgkJCU5FVEFSTV9HRU5fUE9SVF9ESVIoMHgxMCkpCglzdHIJcjEsIFtyMCwgIytORVRBUk1fR0VOX1BPUlRDXQoJLyoKCSAqIHNvZnR3YXJlIHJlc2V0IDogc2VlIEhXIFJlZi4gR3VpZGUgOC4yLjQgOiBTb2Z0d2FyZSBTZXJ2aWNlIHJlZ2lzdGVyCgkgKgkJICAgIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGlzIHByb2Nlc3MKCSAqLwoJbGRyCXIwLCA9TkVUQVJNX0dFTl9NT0RVTEVfQkFTRQoJbGRyCXIxLCA9TkVUQVJNX0dFTl9TV19TVkNfUkVTRVRBCglzdHIJcjEsIFtyMCwgIytORVRBUk1fR0VOX1NPRlRXQVJFX1NFUlZJQ0VdCglsZHIJcjEsID1ORVRBUk1fR0VOX1NXX1NWQ19SRVNFVEIKCXN0cglyMSwgW3IwLCAjK05FVEFSTV9HRU5fU09GVFdBUkVfU0VSVklDRV0KCWxkcglyMSwgPU5FVEFSTV9HRU5fU1dfU1ZDX1JFU0VUQQoJc3RyCXIxLCBbcjAsICMrTkVUQVJNX0dFTl9TT0ZUV0FSRV9TRVJWSUNFXQoJbGRyCXIxLCA9TkVUQVJNX0dFTl9TV19TVkNfUkVTRVRCCglzdHIJcjEsIFtyMCwgIytORVRBUk1fR0VOX1NPRlRXQVJFX1NFUlZJQ0VdCgkvKgoJICogc2V0dXAgUExMIGFuZCBTeXN0ZW0gQ29uZmlnCgkgKi8KCWxkcglyMCwgPU5FVEFSTV9HRU5fTU9EVUxFX0JBU0UKCglsZHIJcjEsID0oCU5FVEFSTV9HRU5fU1lTX0NGR19MRU5ESUFOIHwgXAoJCQlORVRBUk1fR0VOX1NZU19DRkdfQlVTRlVMTCB8IFwKCQkJTkVUQVJNX0dFTl9TWVNfQ0ZHX1VTRVJfRU4gfCBcCgkJCU5FVEFSTV9HRU5fU1lTX0NGR19BTElHTl9BQk9SVCB8IFwKCQkJTkVUQVJNX0dFTl9TWVNfQ0ZHX0JVU0FSQl9JTlQgfCBcCgkJCU5FVEFSTV9HRU5fU1lTX0NGR19CVVNNT05fRU4gKQoKCXN0cglyMSwgW3IwLCAjK05FVEFSTV9HRU5fU1lTVEVNX0NPTlRST0xdCgojaWZuZGVmIENPTkZJR19ORVRBUk1fUExMX0JZUEFTUwoJbGRyCXIxLCA9KAlORVRBUk1fR0VOX1BMTF9DVExfUExMQ05UKE5FVEFSTV9QTExfQ09VTlRfVkFMKSB8IFwKCQkJTkVUQVJNX0dFTl9QTExfQ1RMX1BPTFRTVF9ERUYgfCBcCgkJCU5FVEFSTV9HRU5fUExMX0NUTF9JTkRJVigxKSB8IFwKCQkJTkVUQVJNX0dFTl9QTExfQ1RMX0lDUF9ERUYgfCBcCgkJCU5FVEFSTV9HRU5fUExMX0NUTF9PVVRESVYoMikgKQoJc3RyCXIxLCBbcjAsICMrTkVUQVJNX0dFTl9QTExfQ09OVFJPTF0KI2VuZGlmCgoJLyoKCSAqIG1hc2sgYWxsIElSUXMgYnkgY2xlYXJpbmcgYWxsIGJpdHMgaW4gdGhlIElOVE1ScwoJICovCgltb3YJcjEsICMwCglsZHIJcjAsID1ORVRBUk1fR0VOX01PRFVMRV9CQVNFCglzdHIJcjEsIFtyMCwgIytORVRBUk1fR0VOX0lOVFJfRU5BQkxFXQoKI2VsaWYgZGVmaW5lZChDT05GSUdfUzNDNDUxMEIpCgoJLyoKCSAqIE1hc2sgb2ZmIGFsbCBJUlEgc291cmNlcwoJICovCglsZHIJcjEsID1SRUdfSU5UTUFTSwoJbGRyCXIwLCA9MHgzRkZGRkYKCXN0cglyMCwgW3IxXQoKCS8qCgkgKiBEaXNhYmxlIENhY2hlCgkgKi8KCWxkciByMCwgPVJFR19TWVNDRkcKCWxkciByMSwgPTB4ODNmZmZmYTAJLyogY2FjaGUtZGlzYWJsZWQgICovCglzdHIgcjEsIFtyMF0KCiNlbGlmIGRlZmluZWQoQ09ORklHX0lOVEVHUkFUT1IpICYmIGRlZmluZWQoQ09ORklHX0FSQ0hfSU5URUdSQVRPUikKCS8qIE5vIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uIGZvciBJbnRlZ3JhdG9yQVAvQ003MjBUIGFzIHlldCAqLwojZWxpZiBkZWZpbmVkKENPTkZJR19MUEMyMjkyKQoJLyogU2V0LXVwIFBMTCAqLwoJbW92CXIzLCAjMHhBQQoJbW92CXI0LCAjMHg1NQoJLyogRmlyc3QgZGlzY29ubmVjdCBhbmQgZGlzYWJsZSB0aGUgUExMICovCglsZHIJcjAsIFBMTENPTl9BRFIKCW1vdglyMSwgIzB4MDAKCXN0cglyMSwgW3IwXQoJbGRyCXIwLCBQTExGRUVEX0FEUiAvKiBzdGFydCBmZWVkIHNlcXVlbmNlICovCglzdHIJcjMsIFtyMF0KCXN0cglyNCwgW3IwXQkvKiBmZWVkIHNlcXVlbmNlIGRvbmUgKi8KCS8qIFNldCBuZXcgTSBhbmQgUCB2YWx1ZXMgKi8KCWxkcglyMCwgUExMQ0ZHX0FEUgoJbW92CXIxLCAjMHgyMwkvKiBNPTQgYW5kIFA9MiAqLwoJc3RyCXIxLCBbcjBdCglsZHIJcjAsIFBMTEZFRURfQURSIC8qIHN0YXJ0IGZlZWQgc2VxdWVuY2UgKi8KCXN0cglyMywgW3IwXQoJc3RyCXI0LCBbcjBdCS8qIGZlZWQgc2VxdWVuY2UgZG9uZSAqLwoJLyogVGhlbiBlbmFibGUgdGhlIFBMTCAqLwoJbGRyCXIwLCBQTExDT05fQURSCgltb3YJcjEsICMweDAxCS8qIFBMTCBlbmFibGUgYml0ICovCglzdHIJcjEsIFtyMF0KCWxkcglyMCwgUExMRkVFRF9BRFIgLyogc3RhcnQgZmVlZCBzZXF1ZW5jZSAqLwoJc3RyCXIzLCBbcjBdCglzdHIJcjQsIFtyMF0JLyogZmVlZCBzZXF1ZW5jZSBkb25lICovCgkvKiBXYWl0IGZvciB0aGUgbG9jayAqLwoJbGRyCXIwLCBQTExTVEFUX0FEUgoJbW92CXIxLCAjMHg0MDAJLyogbG9jayBiaXQgKi8KbG9ja19sb29wOgoJbGRyCXIyLCBbcjBdCglhbmQJcjIsIHIxLCByMgoJY21wCXIyLCAjMAoJYmVxCWxvY2tfbG9vcAoJLyogQW5kIGZpbmFsbHkgY29ubmVjdCB0aGUgUExMICovCglsZHIJcjAsIFBMTENPTl9BRFIKCW1vdglyMSwgIzB4MDMJLyogUExMIGVuYWJsZSBiaXQgYW5kIGNvbm5lY3QgYml0ICovCglzdHIJcjEsIFtyMF0KCWxkcglyMCwgUExMRkVFRF9BRFIgLyogc3RhcnQgZmVlZCBzZXF1ZW5jZSAqLwoJc3RyCXIzLCBbcjBdCglzdHIJcjQsIFtyMF0JLyogZmVlZCBzZXF1ZW5jZSBkb25lICovCgkvKiBTZXQtdXAgVlBCRElWIHJlZ2lzdGVyICovCglsZHIJcjAsIFZQQkRJVl9BRFIKCW1vdglyMSwgIzB4MDEJLyogVlBCIGNsb2NrIGlzIHNhbWUgYXMgcHJvY2VzcyBjbG9jayAqLwoJc3RyCXIxLCBbcjBdCiNlbHNlCiNlcnJvciBObyBjcHVfaW5pdF9jcml0KCkgZGVmaW5lZCBmb3IgY3VycmVudCBDUFUgdHlwZQojZW5kaWYKCiNpZmRlZiBDT05GSUdfQVJNN19SRVZECgkvKiBzZXQgY2xvY2sgc3BlZWQgKi8KCS8qICEhISB3ZSBydW4gQCAzNiBNSHogZHVlIHRvIGEgaGFyZHdhcmUgZmxhdyBpbiBSZXYuIEQgcHJvY2Vzc29ycyAqLwoJLyogISEhIG5vdCBkb2luZyBEUkFNIHJlZnJlc2ggcHJvcGVybHkhICovCglsZHIJcjAsIFNZU0NPTjMKCWxkcglyMSwgW3IwXQoJYmljCXIxLCByMSwgI0NMS0NUTAoJb3JyCXIxLCByMSwgI0NMS0NUTF8zNgoJc3RyCXIxLCBbcjBdCiNlbmRpZgoKI2lmbmRlZiBDT05GSUdfTFBDMjI5MgoJbW92CWlwLCBscgoJLyoKCSAqIGJlZm9yZSByZWxvY2F0aW5nLCB3ZSBoYXZlIHRvIHNldHVwIFJBTSB0aW1pbmcKCSAqIGJlY2F1c2UgbWVtb3J5IHRpbWluZyBpcyBib2FyZC1kZXBlbmRlbnQsIHlvdSB3aWxsCgkgKiBmaW5kIGEgbG93bGV2ZWxfaW5pdC5TIGluIHlvdXIgYm9hcmQgZGlyZWN0b3J5LgoJICovCglibAlsb3dsZXZlbF9pbml0Cgltb3YJbHIsIGlwCiNlbmRpZgoKCW1vdglwYywgbHIKCgovKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBJbnRlcnJ1cHQgaGFuZGxpbmcKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCgpACkAgSVJRIHN0YWNrIGZyYW1lLgpACiNkZWZpbmUgU19GUkFNRV9TSVpFCTcyCgojZGVmaW5lIFNfT0xEX1IwCTY4CiNkZWZpbmUgU19QU1IJCTY0CiNkZWZpbmUgU19QQwkJNjAKI2RlZmluZSBTX0xSCQk1NgojZGVmaW5lIFNfU1AJCTUyCgojZGVmaW5lIFNfSVAJCTQ4CiNkZWZpbmUgU19GUAkJNDQKI2RlZmluZSBTX1IxMAkJNDAKI2RlZmluZSBTX1I5CQkzNgojZGVmaW5lIFNfUjgJCTMyCiNkZWZpbmUgU19SNwkJMjgKI2RlZmluZSBTX1I2CQkyNAojZGVmaW5lIFNfUjUJCTIwCiNkZWZpbmUgU19SNAkJMTYKI2RlZmluZSBTX1IzCQkxMgojZGVmaW5lIFNfUjIJCTgKI2RlZmluZSBTX1IxCQk0CiNkZWZpbmUgU19SMAkJMAoKI2RlZmluZSBNT0RFX1NWQyAweDEzCiNkZWZpbmUgSV9CSVQJIDB4ODAKCi8qCiAqIHVzZSBiYWRfc2F2ZV91c2VyX3JlZ3MgZm9yIGFib3J0L3ByZWZldGNoL3VuZGVmL3N3aSAuLi4KICogdXNlIGlycV9zYXZlX3VzZXJfcmVncyAvIGlycV9yZXN0b3JlX3VzZXJfcmVncyBmb3IgSVJRL0ZJUSBoYW5kbGluZwogKi8KCgkubWFjcm8JYmFkX3NhdmVfdXNlcl9yZWdzCglzdWIJc3AsIHNwLCAjU19GUkFNRV9TSVpFCglzdG1pYQlzcCwge3IwIC0gcjEyfQkJCUAgQ2FsbGluZyByMC1yMTIKCWFkZAlyOCwgc3AsICNTX1BDCgoJbGRyCXIyLCBJUlFfU1RBQ0tfU1RBUlRfSU4KCWxkbWlhCXIyLCB7cjIgLSByNH0JCQlAIGdldCBwYywgY3Bzciwgb2xkX3IwCglhZGQJcjAsIHNwLCAjU19GUkFNRV9TSVpFCQlAIHJlc3RvcmUgc3BfU1ZDCgoJYWRkCXI1LCBzcCwgI1NfU1AKCW1vdglyMSwgbHIKCXN0bWlhCXI1LCB7cjAgLSByNH0JCQlAIHNhdmUgc3BfU1ZDLCBscl9TVkMsIHBjLCBjcHNyLCBvbGRfcgoJbW92CXIwLCBzcAoJLmVuZG0KCgkubWFjcm8JaXJxX3NhdmVfdXNlcl9yZWdzCglzdWIJc3AsIHNwLCAjU19GUkFNRV9TSVpFCglzdG1pYQlzcCwge3IwIC0gcjEyfQkJCUAgQ2FsbGluZyByMC1yMTIKCWFkZAlyOCwgc3AsICNTX1BDCglzdG1kYglyOCwge3NwLCBscn1eCQkJQCBDYWxsaW5nIFNQLCBMUgoJc3RyCWxyLCBbcjgsICMwXQkJCUAgU2F2ZSBjYWxsaW5nIFBDCgltcnMJcjYsIHNwc3IKCXN0cglyNiwgW3I4LCAjNF0JCQlAIFNhdmUgQ1BTUgoJc3RyCXIwLCBbcjgsICM4XQkJCUAgU2F2ZSBPTERfUjAKCW1vdglyMCwgc3AKCS5lbmRtCgoJLm1hY3JvCWlycV9yZXN0b3JlX3VzZXJfcmVncwoJbGRtaWEJc3AsIHtyMCAtIGxyfV4JCQlAIENhbGxpbmcgcjAgLSBscgoJbW92CXIwLCByMAoJbGRyCWxyLCBbc3AsICNTX1BDXQkJCUAgR2V0IFBDCglhZGQJc3AsIHNwLCAjU19GUkFNRV9TSVpFCglzdWJzCXBjLCBsciwgIzQJCQlAIHJldHVybiAmIG1vdmUgc3Bzcl9zdmMgaW50byBjcHNyCgkuZW5kbQoKCS5tYWNybyBnZXRfYmFkX3N0YWNrCglsZHIJcjEzLCBJUlFfU1RBQ0tfU1RBUlRfSU4JCUAgc2V0dXAgb3VyIG1vZGUgc3RhY2sKCglzdHIJbHIsIFtyMTNdCQkJQCBzYXZlIGNhbGxlciBsciAvIHNwc3IKCW1ycwlsciwgc3BzcgoJc3RyCWxyLCBbcjEzLCAjNF0KCgltb3YJcjEzLCAjTU9ERV9TVkMJCQlAIHByZXBhcmUgU1ZDLU1vZGUKCW1zcglzcHNyX2MsIHIxMwoJbW92CWxyLCBwYwoJbW92cwlwYywgbHIKCS5lbmRtCgoJLm1hY3JvIGdldF9pcnFfc3RhY2sJCQlAIHNldHVwIElSUSBzdGFjawoJbGRyCXNwLCBJUlFfU1RBQ0tfU1RBUlQKCS5lbmRtCgoJLm1hY3JvIGdldF9maXFfc3RhY2sJCQlAIHNldHVwIEZJUSBzdGFjawoJbGRyCXNwLCBGSVFfU1RBQ0tfU1RBUlQKCS5lbmRtCgovKgogKiBleGNlcHRpb24gaGFuZGxlcnMKICovCgkuYWxpZ24JNQp1bmRlZmluZWRfaW5zdHJ1Y3Rpb246CglnZXRfYmFkX3N0YWNrCgliYWRfc2F2ZV91c2VyX3JlZ3MKCWJsCWRvX3VuZGVmaW5lZF9pbnN0cnVjdGlvbgoKCS5hbGlnbgk1CnNvZnR3YXJlX2ludGVycnVwdDoKCWdldF9iYWRfc3RhY2sKCWJhZF9zYXZlX3VzZXJfcmVncwoJYmwJZG9fc29mdHdhcmVfaW50ZXJydXB0CgoJLmFsaWduCTUKcHJlZmV0Y2hfYWJvcnQ6CglnZXRfYmFkX3N0YWNrCgliYWRfc2F2ZV91c2VyX3JlZ3MKCWJsCWRvX3ByZWZldGNoX2Fib3J0CgoJLmFsaWduCTUKZGF0YV9hYm9ydDoKCWdldF9iYWRfc3RhY2sKCWJhZF9zYXZlX3VzZXJfcmVncwoJYmwJZG9fZGF0YV9hYm9ydAoKCS5hbGlnbgk1Cm5vdF91c2VkOgoJZ2V0X2JhZF9zdGFjawoJYmFkX3NhdmVfdXNlcl9yZWdzCglibAlkb19ub3RfdXNlZAoKI2lmZGVmIENPTkZJR19VU0VfSVJRCgoJLmFsaWduCTUKaXJxOgoJZ2V0X2lycV9zdGFjawoJaXJxX3NhdmVfdXNlcl9yZWdzCglibAlkb19pcnEKCWlycV9yZXN0b3JlX3VzZXJfcmVncwoKCS5hbGlnbgk1CmZpcToKCWdldF9maXFfc3RhY2sKCS8qIHNvbWVvbmUgb3VnaHQgdG8gd3JpdGUgYSBtb3JlIGVmZmljdGlvbiBmaXFfc2F2ZV91c2VyX3JlZ3MgKi8KCWlycV9zYXZlX3VzZXJfcmVncwoJYmwJZG9fZmlxCglpcnFfcmVzdG9yZV91c2VyX3JlZ3MKCiNlbHNlCgoJLmFsaWduCTUKaXJxOgoJZ2V0X2JhZF9zdGFjawoJYmFkX3NhdmVfdXNlcl9yZWdzCglibAlkb19pcnEKCgkuYWxpZ24JNQpmaXE6CglnZXRfYmFkX3N0YWNrCgliYWRfc2F2ZV91c2VyX3JlZ3MKCWJsCWRvX2ZpcQoKI2VuZGlmCgojaWYgZGVmaW5lZChDT05GSUdfSU1QQTcpIHx8IGRlZmluZWQoQ09ORklHX0VQNzMxMikgfHwgZGVmaW5lZChDT05GSUdfQVJNQURJTExPKQoJLmFsaWduCTUKLmdsb2JsIHJlc2V0X2NwdQpyZXNldF9jcHU6Cgltb3YJaXAsICMwCgltY3IJcDE1LCAwLCBpcCwgYzcsIGM3LCAwCQlAIGludmFsaWRhdGUgY2FjaGUKCW1jcglwMTUsIDAsIGlwLCBjOCwgYzcsIDAJCUAgZmx1c2ggVExCICh2NCkKCW1yYwlwMTUsIDAsIGlwLCBjMSwgYzAsIDAJCUAgZ2V0IGN0cmwgcmVnaXN0ZXIKCWJpYwlpcCwgaXAsICMweDAwMGYJCQlAIC4uLi4uLi4uLi4uLndjYW0KCWJpYwlpcCwgaXAsICMweDIxMDAJCQlAIC4udi4uLi5zLi4uLi4uLi4KCW1jcglwMTUsIDAsIGlwLCBjMSwgYzAsIDAJCUAgY3RybCByZWdpc3RlcgoJbW92CXBjLCByMAojZWxpZiBkZWZpbmVkKENPTkZJR19ORVRBUk0pCgkuYWxpZ24JNQouZ2xvYmwgcmVzZXRfY3B1CnJlc2V0X2NwdToKCWxkcglyMSwgPU5FVEFSTV9NRU1fTU9EVUxFX0JBU0UKCWxkcglyMCwgW3IxLCAjK05FVEFSTV9NRU1fQ1MwX0JBU0VfQUREUl0KCWxkcglyMSwgPTB4RkZGRkYwMDAKCWFuZAlyMCwgcjEsIHIwCglsZHIJcjEsID0ocmVsb2NhdGUtQ09ORklHX1NZU19URVhUX0JBU0UpCglhZGQJcjAsIHIxLCByMAoJbGRyCXI0LCA9TkVUQVJNX0dFTl9NT0RVTEVfQkFTRQoJbGRyCXIxLCA9TkVUQVJNX0dFTl9TV19TVkNfUkVTRVRBCglzdHIJcjEsIFtyNCwgIytORVRBUk1fR0VOX1NPRlRXQVJFX1NFUlZJQ0VdCglsZHIJcjEsID1ORVRBUk1fR0VOX1NXX1NWQ19SRVNFVEIKCXN0cglyMSwgW3I0LCAjK05FVEFSTV9HRU5fU09GVFdBUkVfU0VSVklDRV0KCWxkcglyMSwgPU5FVEFSTV9HRU5fU1dfU1ZDX1JFU0VUQQoJc3RyCXIxLCBbcjQsICMrTkVUQVJNX0dFTl9TT0ZUV0FSRV9TRVJWSUNFXQoJbGRyCXIxLCA9TkVUQVJNX0dFTl9TV19TVkNfUkVTRVRCCglzdHIJcjEsIFtyNCwgIytORVRBUk1fR0VOX1NPRlRXQVJFX1NFUlZJQ0VdCgltb3YJcGMsIHIwCiNlbGlmIGRlZmluZWQoQ09ORklHX1MzQzQ1MTBCKQovKiBOb3RoaW5nIGRvbmUgaGVyZSBhcyByZXNldGluZyB0aGUgQ1BVIGlzIGJvYXJkIHNwZWNpZmljLCBkZXBlbmRpbmcKICogb24gZXh0ZXJuYWwgcGVyaXBoZXJhbHMgc3VjaCBhcyB3YXRjaGRvZyB0aW1lcnMsIGV0Yy4gKi8KI2VsaWYgZGVmaW5lZChDT05GSUdfSU5URUdSQVRPUikgJiYgZGVmaW5lZChDT05GSUdfQVJDSF9JTlRFR1JBVE9SKQoJLyogTm8gc3BlY2lmaWMgcmVzZXQgYWN0aW9ucyBmb3IgSW50ZWdyYXRvckFQL0NNNzIwVCBhcyB5ZXQgKi8KI2VsaWYgZGVmaW5lZChDT05GSUdfTFBDMjI5MikKCS5hbGlnbgk1Ci5nbG9ibCByZXNldF9jcHUKcmVzZXRfY3B1OgoJbW92CXBjLCByMAojZWxzZQojZXJyb3IgTm8gcmVzZXRfY3B1KCkgZGVmaW5lZCBmb3IgY3VycmVudCBDUFUgdHlwZQojZW5kaWYK