LyogcG9ydGVkIGZyb20gY3RmYi5jIChsaW51eCBrZXJuZWwpOgogKiBDcmVhdGVkIGluIEphbiAtIEp1bHkgMjAwMCBieSBUaG9tYXMgSPZoZW5sZWl0bmVyIDx0aEB2aXN1ZWxsZS1tYXNjaGluZW4uZGU+CiAqCiAqIFBvcnRlZCB0byBVLUJvb3Q6CiAqIChDKSBDb3B5cmlnaHQgMjAwMiBEZW5pcyBQZXRlciwgTVBMIEFHIFN3aXR6ZXJsYW5kCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgoKI2lmZGVmIENPTkZJR19WSURFTwoKI2luY2x1ZGUgPHBjaS5oPgojaW5jbHVkZSA8dmlkZW9fZmIuaD4KI2luY2x1ZGUgInZpZGVvbW9kZXMuaCIKCiNpZmRlZiBDT05GSUdfVklERU9fQ1Q2OTAwMAoKLyogZGVidWcgKi8KI3VuZGVmIFZHQV9ERUJVRwojdW5kZWYgVkdBX0RVTVBfUkVHCiNpZmRlZiBWR0FfREVCVUcKI2RlZmluZQlQUklOVEYoZm10LGFyZ3MuLi4pCXByaW50ZiAoZm10ICwjI2FyZ3MpCiNlbHNlCiNkZWZpbmUgUFJJTlRGKGZtdCxhcmdzLi4uKQojZW5kaWYKCi8qIE1hY3JvcyAqLwojaWZuZGVmIG1pbgojZGVmaW5lIG1pbiggYSwgYiApICggKCBhICkgPCAoIGIgKSApID8gKCBhICkgOiAoIGIgKQojZW5kaWYKI2lmbmRlZiBtYXgKI2RlZmluZSBtYXgoIGEsIGIgKSAoICggYSApID4gKCBiICkgKSA/ICggYSApIDogKCBiICkKI2VuZGlmCiNpZmRlZiBtaW5tYXgKI2Vycm9yICJ0ZXJtIG1pbm1heCBhbHJlYWR5IHVzZWQuIgojZW5kaWYKI2RlZmluZSBtaW5tYXgoIGEsIHgsIGIgKSBtYXgoICggYSApLCBtaW4oICggeCApLCAoIGIgKSApICkKI2RlZmluZSBOX0VMVFMoIHggKSAoIHNpemVvZiggeCApIC8gc2l6ZW9mKCB4WyAwIF0gKSApCgovKiBDVCBSZWdpc3RlciBPZmZzZXRzICovCiNkZWZpbmUgQ1RfQVJfTwkJCTB4M2MwCS8qIEluZGV4IGFuZCBEYXRhIHdyaXRlIHBvcnQgb2YgdGhlIGF0dHJpYnV0ZSBSZWdpc3RlcnMgKi8KI2RlZmluZSBDVF9HUl9PCQkJMHgzY2UJLyogSW5kZXggcG9ydCBvZiB0aGUgR3JhcGhpYyBDb250cm9sbGVyIFJlZ2lzdGVycyAqLwojZGVmaW5lIENUX1NSX08JCQkweDNjNAkvKiBJbmRleCBwb3J0IG9mIHRoZSBTZXF1ZW5jZXIgQ29udHJvbGxlciAqLwojZGVmaW5lIENUX0NSX08JCQkweDNkNAkvKiBJbmRleCBwb3J0IG9mIHRoZSBDUlQgQ29udHJvbGxlciAqLwojZGVmaW5lIENUX1hSX08JCQkweDNkNgkvKiBFeHRlbmRlZCBSZWdpc3RlciBpbmRleCAqLwojZGVmaW5lIENUX01TUl9XX08JCTB4M2MyCS8qIE1pc2MuIE91dHB1dCBSZWdpc3RlciAod3JpdGUgb25seSkgKi8KI2RlZmluZSBDVF9MVVRfTUFTS19PCQkweDNjNgkvKiBDb2xvciBQYWxldHRlIE1hc2sgKi8KI2RlZmluZSBDVF9MVVRfU1RBUlRfTwkJMHgzYzgJLyogQ29sb3IgUGFsZXR0ZSBXcml0ZSBNb2RlIEluZGV4ICovCiNkZWZpbmUgQ1RfTFVUX1JHQl9PCQkweDNjOQkvKiBDb2xvciBQYWxldHRlIERhdGEgUG9ydCAqLwojZGVmaW5lIENUX1NUQVRVU19SRUcwX08JMHgzYzIJLyogU3RhdHVzIFJlZ2lzdGVyIDAgKHJlYWQgb25seSkgKi8KI2RlZmluZSBDVF9TVEFUVVNfUkVHMV9PCTB4M2RhCS8qIElucHV0IFN0YXR1cyBSZWdpc3RlciAxIChyZWFkIG9ubHkpICovCgojZGVmaW5lIENUX0ZQX08JCQkweDNkMAkvKiBJbmRleCBwb3J0IG9mIHRoZSBGbGF0IHBhbmVsIFJlZ2lzdGVycyAqLwojZGVmaW5lIENUX01SX08JCQkweDNkMgkvKiBJbmRleCBQb3J0IG9mIHRoZSBNdWx0aW1lZGlhIEV4dGVuc2lvbiAqLwoKLyogZGVmaW5lcyBmb3IgdGhlIG1lbW9yeSBtYXBwZWQgcmVnaXN0ZXJzICovCiNkZWZpbmUgQlIwMF9vCQkweDQwMDAwMAkvKiBTb3VyY2UgYW5kIERlc3RpbmF0aW9uIFNwYW4gUmVnaXN0ZXIgKi8KI2RlZmluZSBCUjAxX28JCTB4NDAwMDA0CS8qIFBhdHRlcm4vU291cmNlIEV4cGFuc2lvbiBCYWNrZ3JvdW5kIENvbG9yICYgVHJhbnNwYXJlbmN5IEtleSBSZWdpc3RlciAqLwojZGVmaW5lIEJSMDJfbwkJMHg0MDAwMDgJLyogUGF0dGVybi9Tb3VyY2UgRXhwYW5zaW9uIEZvcmVncm91bmQgQ29sb3IgUmVnaXN0ZXIgKi8KI2RlZmluZSBCUjAzX28JCTB4NDAwMDBDCS8qIE1vbm9jaHJvbWUgU291cmNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KI2RlZmluZSBCUjA0X28JCTB4NDAwMDEwCS8qIEJpdEJMVCBDb250cm9sIFJlZ2lzdGVyICovCiNkZWZpbmUgQlIwNV9vCQkweDQwMDAxNAkvKiBQYXR0ZXJuIEFkZHJlc3MgUmVnaXN0ZSAqLwojZGVmaW5lIEJSMDZfbwkJMHg0MDAwMTgJLyogU291cmNlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KI2RlZmluZSBCUjA3X28JCTB4NDAwMDFDCS8qIERlc3RpbmF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgKi8KI2RlZmluZSBCUjA4X28JCTB4NDAwMDIwCS8qIERlc3RpbmF0aW9uIFdpZHRoICYgSGVpZ2h0IFJlZ2lzdGVyICovCiNkZWZpbmUgQlIwOV9vCQkweDQwMDAyNAkvKiBTb3VyY2UgRXhwYW5zaW9uIEJhY2tncm91bmQgQ29sb3IgJiBUcmFuc3BhcmVuY3kgS2V5IFJlZ2lzdGVyICovCiNkZWZpbmUgQlIwQV9vCQkweDQwMDAyOAkvKiBTb3VyY2UgRXhwYW5zaW9uIEZvcmVncm91bmQgQ29sb3IgUmVnaXN0ZXIgKi8KCiNkZWZpbmUgQ1VSU09SX1NJWkUJMHgxMDAwCS8qIGluIEtCeXRlIGZvciBIVyBDdXJzb3IgKi8KI2RlZmluZSBQQVRURVJOX0FEUgkocEdELT5kcHJCYXNlICsgQ1VSU09SX1NJWkUpCS8qIHBhdHRlcm4gTWVtb3J5IGFmdGVyIEN1cnNvciBNZW1vcnkgKi8KI2RlZmluZSBQQVRURVJOX1NJWkUJOCo4KjQJLyogNCBCeXRlcyBwZXIgUGl4ZWwgOCB4IDggUGl4ZWwgKi8KI2RlZmluZSBBQ0NFTE1FTU9SWQkoQ1VSU09SX1NJWkUgKyBQQVRURVJOX1NJWkUpCS8qIHJlc2VydmVkIE1lbW9yeSBmb3IgQklUQmx0IGFuZCBodyBjdXJzb3IgKi8KCi8qIFNvbWUgTW9kZSBkZWZpbml0aW9ucyAqLwojZGVmaW5lIEZCX1NZTkNfSE9SX0hJR0hfQUNUCTEJLyogaG9yaXpvbnRhbCBzeW5jIGhpZ2ggYWN0aXZlICAqLwojZGVmaW5lIEZCX1NZTkNfVkVSVF9ISUdIX0FDVAkyCS8qIHZlcnRpY2FsIHN5bmMgaGlnaCBhY3RpdmUgICAgKi8KI2RlZmluZSBGQl9TWU5DX0VYVAkJNAkvKiBleHRlcm5hbCBzeW5jICAgICAgICAgICAgICAgICovCiNkZWZpbmUgRkJfU1lOQ19DT01QX0hJR0hfQUNUCTgJLyogY29tcG9zaXRlIHN5bmMgaGlnaCBhY3RpdmUgICAqLwojZGVmaW5lIEZCX1NZTkNfQlJPQURDQVNUCTE2CS8qIGJyb2FkY2FzdCB2aWRlbyB0aW1pbmdzICAgICAgKi8KCQkJCQkvKiB2dG90YWwgPSAxNDRkLzI4OG4vNTc2aSA9PiBQQUwgICovCgkJCQkJLyogdnRvdGFsID0gMTIxZC8yNDJuLzQ4NGkgPT4gTlRTQyAqLwojZGVmaW5lIEZCX1NZTkNfT05fR1JFRU4JMzIJLyogc3luYyBvbiBncmVlbiAqLwoKI2RlZmluZSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEICAwCS8qIG5vbiBpbnRlcmxhY2VkICovCiNkZWZpbmUgRkJfVk1PREVfSU5URVJMQUNFRAkxCS8qIGludGVybGFjZWQgICAqLwojZGVmaW5lIEZCX1ZNT0RFX0RPVUJMRQkJMgkvKiBkb3VibGUgc2NhbiAqLwojZGVmaW5lIEZCX1ZNT0RFX01BU0sJCTI1NQoKI2RlZmluZSBGQl9WTU9ERV9ZV1JBUAkJMjU2CS8qIHl3cmFwIGluc3RlYWQgb2YgcGFubmluZyAgICAgKi8KI2RlZmluZSBGQl9WTU9ERV9TTU9PVEhfWFBBTgk1MTIJLyogc21vb3RoIHhwYW4gcG9zc2libGUgKGludGVybmFsbHkgdXNlZCkgKi8KI2RlZmluZSBGQl9WTU9ERV9DT05VUERBVEUJNTEyCS8qIGRvbid0IHVwZGF0ZSB4L3lvZmZzZXQgICAgICAgKi8KCiNkZWZpbmUgdGV4dAkJCTAKI2RlZmluZSBmbnR3aWR0aAkJOAoKLyogdGFibGUgZm9yIFZHQSBJbml0aWFsaXphdGlvbiAgKi8KdHlwZWRlZiBzdHJ1Y3QgewoJY29uc3QgdW5zaWduZWQgY2hhciByZWc7Cgljb25zdCB1bnNpZ25lZCBjaGFyIHZhbDsKfSBDVF9DRkdfVEFCTEU7CgovKiB0aGlzIHRhYmxlIHByb3ZpZGVzIHNvbWUgYmFzaWMgaW5pdGlhbGlzYXRpb25zIHN1Y2ggYXMgTWVtb3J5IENsb2NrIGV0YyAqLwpzdGF0aWMgQ1RfQ0ZHX1RBQkxFIHhyZWdbXSA9IHsKCXsweDA5LCAweDAxfSwJCS8qIENSVCBDb250cm9sbGVyIEV4dGVuc2lvbnMgRW5hYmxlICovCgl7MHgwQSwgMHgwMn0sCQkvKiBGcmFtZSBCdWZmZXIgTWFwcGluZyAqLwoJezB4MEIsIDB4MDF9LAkJLyogUENJIFdyaXRlIEJ1cnN0IHN1cHBvcnQgKi8KCXsweDIwLCAweDAwfSwJCS8qIEJpdEJMVCBDb25maWd1cmF0aW9uICovCgl7MHg0MCwgMHgwM30sCQkvKiBNZW1vcnkgQWNjZXNzIENvbnRyb2wgKi8KCXsweDYwLCAweDAwfSwJCS8qIFZpZGVvIFBpbiBDb250cm9sICovCgl7MHg2MSwgMHgwMH0sCQkvKiBEUE1TIFN5bmNoIGNvbnRyb2wgKi8KCXsweDYyLCAweDAwfSwJCS8qIEdQSU8gUGluIENvbnRyb2wgKi8KCXsweDYzLCAweEJEfSwJCS8qIEdQSU8gUGluIERhdGEgKi8KCXsweDY3LCAweDAwfSwJCS8qIFBpbiBUcmktU3RhdGUgKi8KCXsweDgwLCAweDgwfSwJCS8qIFBpeGVsIFBpcGVsaW5lIENvbmZpZyAwIHJlZ2lzdGVyICovCgl7MHhBMCwgMHgwMH0sCQkvKiBDdXJzb3IgMSBDb250cm9sIFJlZyAqLwoJezB4QTEsIDB4MDB9LAkJLyogQ3Vyc29yIDEgVmVydGljYWwgRXh0ZW5zaW9uIFJlZyAqLwoJezB4QTIsIDB4MDB9LAkJLyogQ3Vyc29yIDEgQmFzZSBBZGRyZXNzIExvdyAqLwoJezB4QTMsIDB4MDB9LAkJLyogQ3Vyc29yIDEgQmFzZSBBZGRyZXNzIEhpZ2ggKi8KCXsweEE0LCAweDAwfSwJCS8qIEN1cnNvciAxIFgtUG9zaXRpb24gTG93ICovCgl7MHhBNSwgMHgwMH0sCQkvKiBDdXJzb3IgMSBYLVBvc2l0aW9uIEhpZ2ggKi8KCXsweEE2LCAweDAwfSwJCS8qIEN1cnNvciAxIFktUG9zaXRpb24gTG93ICovCgl7MHhBNywgMHgwMH0sCQkvKiBDdXJzb3IgMSBZLVBvc2l0aW9uIEhpZ2ggKi8KCXsweEE4LCAweDAwfSwJCS8qIEN1cnNvciAyIENvbnRyb2wgUmVnICovCgl7MHhBOSwgMHgwMH0sCQkvKiBDdXJzb3IgMiBWZXJ0aWNhbCBFeHRlbnNpb24gUmVnICovCgl7MHhBQSwgMHgwMH0sCQkvKiBDdXJzb3IgMiBCYXNlIEFkZHJlc3MgTG93ICovCgl7MHhBQiwgMHgwMH0sCQkvKiBDdXJzb3IgMiBCYXNlIEFkZHJlc3MgSGlnaCAqLwoJezB4QUMsIDB4MDB9LAkJLyogQ3Vyc29yIDIgWC1Qb3NpdGlvbiBMb3cgKi8KCXsweEFELCAweDAwfSwJCS8qIEN1cnNvciAyIFgtUG9zaXRpb24gSGlnaCAqLwoJezB4QUUsIDB4MDB9LAkJLyogQ3Vyc29yIDIgWS1Qb3NpdGlvbiBMb3cgKi8KCXsweEFGLCAweDAwfSwJCS8qIEN1cnNvciAyIFktUG9zaXRpb24gSGlnaCAqLwoJezB4QzAsIDB4N0R9LAkJLyogRG90IENsb2NrIDAgVkNPIE0tRGl2aXNvciAqLwoJezB4QzEsIDB4MDd9LAkJLyogRG90IENsb2NrIDAgVkNPIE4tRGl2aXNvciAqLwoJezB4QzMsIDB4MzR9LAkJLyogRG90IENsb2NrIDAgRGl2aXNvciBzZWxlY3QgKi8KCXsweEM0LCAweDU1fSwJCS8qIERvdCBDbG9jayAxIFZDTyBNLURpdmlzb3IgKi8KCXsweEM1LCAweDA5fSwJCS8qIERvdCBDbG9jayAxIFZDTyBOLURpdmlzb3IgKi8KCXsweEM3LCAweDI0fSwJCS8qIERvdCBDbG9jayAxIERpdmlzb3Igc2VsZWN0ICovCgl7MHhDOCwgMHg3RH0sCQkvKiBEb3QgQ2xvY2sgMiBWQ08gTS1EaXZpc29yICovCgl7MHhDOSwgMHgwN30sCQkvKiBEb3QgQ2xvY2sgMiBWQ08gTi1EaXZpc29yICovCgl7MHhDQiwgMHgzNH0sCQkvKiBEb3QgQ2xvY2sgMiBEaXZpc29yIHNlbGVjdCAqLwoJezB4Q0MsIDB4Mzh9LAkJLyogTWVtb3J5IENsb2NrIDAgVkNPIE0tRGl2aXNvciAqLwoJezB4Q0QsIDB4MDN9LAkJLyogTWVtb3J5IENsb2NrIDAgVkNPIE4tRGl2aXNvciAqLwoJezB4Q0UsIDB4OTB9LAkJLyogTWVtb3J5IENsb2NrIDAgRGl2aXNvciBzZWxlY3QgKi8KCXsweENGLCAweDA2fSwJCS8qIENsb2NrIENvbmZpZyAqLwoJezB4RDAsIDB4MEZ9LAkJLyogUG93ZXIgRG93biAqLwoJezB4RDEsIDB4MDF9LAkJLyogUG93ZXIgRG93biBCaXRCTFQgKi8KCXsweEZGLCAweEZGfQkJLyogZW5kIG9mIHRhYmxlICovCn07Ci8qIENsb2NrIENvbmZpZzoKICogPT09PT09PT09PT09PQogKgogKiBQRCBSZWdpc3RlcnM6CiAqIC0tLS0tLS0tLS0tLS0KICogQml0MiBhbmQgQml0NC4uNiBhcmUgdXNlZCBmb3IgdGhlIExvb3AgRGl2aXNvciBhbmQgUG9zdCBEaXZpc29yLgogKiBUaGV5IGFyZSBlbmNvZGVkIGFzIGZvbGxvd3M6CiAqCiAqICstLS0rLS0tLS0tLS0tLS0tLS0rCiAqIHwgMiB8IExvb3AgRGl2aXNvciB8CiAqICstLS0rLS0tLS0tLS0tLS0tLS0rCiAqIHwgMSB8IDEgICAgICAgICAgICB8CiAqICstLS0rLS0tLS0tLS0tLS0tLS0rCiAqIHwgMCB8IDQgICAgICAgICAgICB8CiAqICstLS0rLS0tLS0tLS0tLS0tLS0rCiAqIE5vdGU6IFRoZSBNZW1vcnkgQ2xvY2sgZG9lcyBub3QgaGF2ZSBhIExvb3AgRGl2aXNvci4KICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKwogKiB8IDYgfCA1IHwgNCB8IFBvc3QgRGl2aXNvciB8CiAqICstLS0rLS0tKy0tLSstLS0tLS0tLS0tLS0tLSsKICogfCAwIHwgMCB8IDAgfCAxICAgICAgICAgICAgfAogKiArLS0tKy0tLSstLS0rLS0tLS0tLS0tLS0tLS0rCiAqIHwgMCB8IDAgfCAxIHwgMiAgICAgICAgICAgIHwKICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKwogKiB8IDAgfCAxIHwgMCB8IDQgICAgICAgICAgICB8CiAqICstLS0rLS0tKy0tLSstLS0tLS0tLS0tLS0tLSsKICogfCAwIHwgMSB8IDEgfCA4ICAgICAgICAgICAgfAogKiArLS0tKy0tLSstLS0rLS0tLS0tLS0tLS0tLS0rCiAqIHwgMSB8IDAgfCAwIHwgMTYgICAgICAgICAgIHwKICogKy0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tKwogKiB8IDEgfCAwIHwgMSB8IDMyICAgICAgICAgICB8CiAqICstLS0rLS0tKy0tLSstLS0tLS0tLS0tLS0tLSsKICogfCAxIHwgMSB8IFggfCByZXNlcnZlZCAgICAgfAogKiArLS0tKy0tLSstLS0rLS0tLS0tLS0tLS0tLS0rCiAqCiAqIEFsbCBvdGhlciBiaXRzIGFyZSByZXNlcnZlZCBpbiB0aGVzZSByZWdpc3RlcnMuCiAqCiAqIENsb2NrIFZDTyBNIFJlZ2lzdGVyczoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBUaGVzZSBSZWdpc3RlcnMgY29udGFpbiB0aGUgTSBWYWx1ZSAtMi4KICoKICogQ2xvY2sgVkNPIE4gUmVnaXN0ZXJzOgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFRoZXNlIFJlZ2lzdGVycyBjb250YWluIHRoZSBOIFZhbHVlIC0yLgogKgogKiBGb3JtdWxhczoKICogLS0tLS0tLS0tCiAqIEZ2Y28gPSAoRnJlZiAqIExvb3AgRGl2aXNvciAqIE0vTiksIHdoZXJlYXMgMTAwTUh6IDwgRnZjbyA8IDIyME1IegogKiBGb3V0ID0gRnZjbyAvIFBvc3QgRGl2aXNvcgogKgogKiBEb3QgQ2xrMCAoZGVmYXVsdCAyNU1Ieik6CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRnZjbyA9IDE0LjMxOCAqIDEyNyAvIDkgPSAyMDIuMDQ1TUh6CiAqIEZvdXQgPSAyMDIuMDQ1TUh6IC8gOCA9IDI1LjI1TUh6CiAqIFBvc3QgRGl2aXNvciA9IDgKICogTG9vcCBEaXZpc29yID0gMQogKiBYUkMwID0gKE0gLSAyKSA9IDEyNSA9IDB4N0QKICogWFJDMSA9IChOIC0gMikgPSA3ICAgPSAweDA3CiAqIFhSQzMgPSAgICAgICAgICAgICAgICAgMHgzNAogKgogKiBEb3QgQ2xrMSAoZGVmYXVsdCAyOE1Ieik6CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRnZjbyA9IDE0LjMxOCAqIDg3IC8gMTEgPSAxMTMuMjRNSHoKICogRm91dCA9IDExMy4yNE1IeiAvIDQgPSAyOC4zMU1IegogKiBQb3N0IERpdmlzb3IgPSA0CiAqIExvb3AgRGl2aXNvciA9IDEKICogWFJDNCA9IChNIC0gMikgPSA4NSA9IDB4NTUKICogWFJDNSA9IChOIC0gMikgPSA5ICA9IDB4MDkKICogWFJDNyA9ICAgICAgICAgICAgICAgIDB4MjQKICoKICogRG90IENsazIgKHZhcmlhYmxlIGZvciBleHRlbmRlZCBtb2RlcyBzZXQgdG8gMjVNSHopOgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEZ2Y28gPSAxNC4zMTggKiAxMjcgLyA5ID0gMjAyLjA0NU1IegogKiBGb3V0ID0gMjAyLjA0NU1IeiAvIDggPSAyNS4yNU1IegogKiBQb3N0IERpdmlzb3IgPSA4CiAqIExvb3AgRGl2aXNvciA9IDEKICogWFJDOCA9IChNIC0gMikgPSAxMjUgPSAweDdECiAqIFhSQzkgPSAoTiAtIDIpID0gNyAgID0gMHgwNwogKiBYUkNCID0gICAgICAgICAgICAgICAgIDB4MzQKICoKICogTWVtb3J5IENsayBmb3IgbW9zdCBtb2RlcyA+NTBNSHo6CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogRnZjbyA9IDE0LjMxOCAqIDU4IC8gNSA9IDE2Nk1IegogKiBGb3V0ID0gMTY2TUh6IC8gMiAgICAgID0gODNNSHoKICogUG9zdCBEaXZpc29yID0gMgogKiBYUkNDID0gKE0gLSAyKSA9IDU3ICA9IDB4MzgKICogWFJDRCA9IChOIC0gMikgPSAzICAgPSAweDAzCiAqIFhSQ0UgPSAgICAgICAgICAgICAgICAgMHg5MAogKgogKiBOb3RlIEJpdDcgZW5hYmxlcyB0aGUgY2xvY2sgc291cmNlIGZyb20gdGhlIFZDTwogKgogKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENoaXBzIHN0cnVjdAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IGN0ZmJfY2hpcHNfcHJvcGVydGllcyB7CglpbnQgZGV2aWNlX2lkOwkJLyogUENJIERldmljZSBJRCAqLwoJdW5zaWduZWQgbG9uZyBtYXhfbWVtOwkvKiBtZW1vcnkgZm9yIGZyYW1lIGJ1ZmZlciAqLwoJaW50IHZsZF9zZXQ7CQkvKiB2YWx1ZSBvZiBWTEQgaWYgYml0MiBpbiBjbG9jayBjb250cm9sIGlzIHNldCAqLwoJaW50IHZsZF9ub3Rfc2V0OwkvKiB2YWx1ZSBvZiBWTEQgaWYgYml0MiBpbiBjbG9jayBjb250cm9sIGlzIHNldCAqLwoJaW50IG1uX2RpZmY7CQkvKiBkaWZmZXJlbmNlIGJldHdlZW4gTS9OIFZhbHVlICsgbW5fZGlmZiA9IE0vTiBSZWdpc3RlciAqLwoJaW50IG1uX21pbjsJCS8qIG1pbiB2YWx1ZSBvZiBNL04gVmFsdWUgKi8KCWludCBtbl9tYXg7CQkvKiBtYXggdmFsdWUgb2YgTS9OIFZhbHVlICovCglpbnQgdmNvX21pbjsJCS8qIFZDTyBNaW4gaW4gTUh6ICovCglpbnQgdmNvX21heDsJCS8qIFZDTyBNYXggaW4gTUh6ICovCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IGN0ZmJfY2hpcHNfcHJvcGVydGllcyBjaGlwc1tdID0gewoJe1BDSV9ERVZJQ0VfSURfQ1RfNjkwMDAsIDB4MjAwMDAwLCAxLCA0LCAtMiwgMywgMjU3LCAxMDAsIDIyMH0sCiNpZmRlZiBDT05GSUdfVVNFX0NQQ0lEVkkKCXtQQ0lfREVWSUNFX0lEX0NUXzY5MDMwLCAweDQwMDAwMCwgMSwgNCwgLTIsIDMsIDI1NywgMTAwLCAyMjB9LAojZW5kaWYKCXtQQ0lfREVWSUNFX0lEX0NUXzY1NTU1LCAweDEwMDAwMCwgMTYsIDQsIDAsIDEsIDI1NSwgNDgsIDIyMH0sCS8qIE5PVCBURVNURUQgKi8KCXswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQkvKiBUZXJtaW5hdG9yICovCn07CgovKgogKiBUaGUgR3JhcGhpYyBEZXZpY2UKICovCkdyYXBoaWNEZXZpY2UgY3RmYjsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBMb3cgTGV2ZWwgUm91dGluZXMKKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBSZWFkIENUIElTQSByZWdpc3RlcgoqLwojaWZkZWYgVkdBX0RFQlVHCnN0YXRpYyB1bnNpZ25lZCBjaGFyCmN0UmVhZCAodW5zaWduZWQgc2hvcnQgaW5kZXgpCnsKCUdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopICYgY3RmYjsKCWlmIChpbmRleCA9PSBDVF9BUl9PKQoJCS8qIHN5bmNoIHRoZSBGbGlwIEZsb3AgKi8KCQlpbjggKHBHRC0+aXNhQmFzZSArIENUX1NUQVRVU19SRUcxX08pOwoKCXJldHVybiAoaW44IChwR0QtPmlzYUJhc2UgKyBpbmRleCkpOwp9CiNlbmRpZgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogV3JpdGUgQ1QgSVNBIHJlZ2lzdGVyCiovCnN0YXRpYyB2b2lkCmN0V3JpdGUgKHVuc2lnbmVkIHNob3J0IGluZGV4LCB1bnNpZ25lZCBjaGFyIHZhbCkKewoJR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikgJiBjdGZiOwoKCW91dDggKChwR0QtPmlzYUJhc2UgKyBpbmRleCksIHZhbCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBSZWFkIENUIElTQSByZWdpc3RlciBpbmRleGVkCiovCnN0YXRpYyB1bnNpZ25lZCBjaGFyCmN0UmVhZF9pICh1bnNpZ25lZCBzaG9ydCBpbmRleCwgY2hhciByZWcpCnsKCUdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopICYgY3RmYjsKCWlmIChpbmRleCA9PSBDVF9BUl9PKQoJCS8qIHN5bmNoIHRoZSBGbGlwIEZsb3AgKi8KCQlpbjggKHBHRC0+aXNhQmFzZSArIENUX1NUQVRVU19SRUcxX08pOwoJb3V0OCAoKHBHRC0+aXNhQmFzZSArIGluZGV4KSwgcmVnKTsKCXJldHVybiAoaW44IChwR0QtPmlzYUJhc2UgKyBpbmRleCArIDEpKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIFdyaXRlIENUIElTQSByZWdpc3RlciBpbmRleGVkCiovCnN0YXRpYyB2b2lkCmN0V3JpdGVfaSAodW5zaWduZWQgc2hvcnQgaW5kZXgsIGNoYXIgcmVnLCBjaGFyIHZhbCkKewoJR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikgJiBjdGZiOwoJaWYgKGluZGV4ID09IENUX0FSX08pIHsKCQkvKiBzeW5jaCB0aGUgRmxpcCBGbG9wICovCgkJaW44IChwR0QtPmlzYUJhc2UgKyBDVF9TVEFUVVNfUkVHMV9PKTsKCQlvdXQ4ICgocEdELT5pc2FCYXNlICsgaW5kZXgpLCByZWcpOwoJCW91dDggKChwR0QtPmlzYUJhc2UgKyBpbmRleCksIHZhbCk7Cgl9IGVsc2UgewoJCW91dDggKChwR0QtPmlzYUJhc2UgKyBpbmRleCksIHJlZyk7CgkJb3V0OCAoKHBHRC0+aXNhQmFzZSArIGluZGV4ICsgMSksIHZhbCk7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBXcml0ZSBhIHRhYmxlIG9mIENUIElTQSByZWdpc3RlcgoqLwpzdGF0aWMgdm9pZApjdExvYWRSZWdzICh1bnNpZ25lZCBzaG9ydCBpbmRleCwgQ1RfQ0ZHX1RBQkxFICogcmVnVGFiKQp7Cgl3aGlsZSAocmVnVGFiLT5yZWcgIT0gMHhGRikgewoJCWN0V3JpdGVfaSAoaW5kZXgsIHJlZ1RhYi0+cmVnLCByZWdUYWItPnZhbCk7CgkJcmVnVGFiKys7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKU2V0QXJSZWdzICh2b2lkKQp7CglpbnQgaSwgdG1wOwoKCWZvciAoaSA9IDA7IGkgPCAweDEwOyBpKyspCgkJY3RXcml0ZV9pIChDVF9BUl9PLCBpLCBpKTsKCWlmICh0ZXh0KQoJCXRtcCA9IDB4MDQ7CgllbHNlCgkJdG1wID0gMHg0MTsKCgljdFdyaXRlX2kgKENUX0FSX08sIDB4MTAsIHRtcCk7CS8qIE1vZGUgQ29udHJvbCBSZWdpc3RlciAqLwoJY3RXcml0ZV9pIChDVF9BUl9PLCAweDExLCAweDAwKTsJLyogT3ZlcnNjYW4gQ29sb3IgUmVnaXN0ZXIgKi8KCWN0V3JpdGVfaSAoQ1RfQVJfTywgMHgxMiwgMHgwZik7CS8qIE1lbW9yeSBQbGFuZSBFbmFibGUgUmVnaXN0ZXIgKi8KCWlmIChmbnR3aWR0aCA9PSA5KQoJCXRtcCA9IDB4MDg7CgllbHNlCgkJdG1wID0gMHgwMDsKCWN0V3JpdGVfaSAoQ1RfQVJfTywgMHgxMywgdG1wKTsJLyogSG9yaXpvbnRhbCBQaXhlbCBQYW5uaW5nICovCgljdFdyaXRlX2kgKENUX0FSX08sIDB4MTQsIDB4MDApOwkvKiBDb2xvciBTZWxlY3QgUmVnaXN0ZXIgICAgKi8KCWN0V3JpdGUgKENUX0FSX08sIDB4MjApOwkvKiBlbmFibGUgdmlkZW8gICAgICAgICAgICAgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApTZXRHclJlZ3MgKHZvaWQpCnsJCQkJLyogU2V0IEdyYXBoaWNzIE1vZGUgKi8KCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCAweDA1OyBpKyspCgkJY3RXcml0ZV9pIChDVF9HUl9PLCBpLCAwKTsKCWlmICh0ZXh0KSB7CgkJY3RXcml0ZV9pIChDVF9HUl9PLCAweDA1LCAweDEwKTsKCQljdFdyaXRlX2kgKENUX0dSX08sIDB4MDYsIDB4MDIpOwoJfSBlbHNlIHsKCQljdFdyaXRlX2kgKENUX0dSX08sIDB4MDUsIDB4NDApOwoJCWN0V3JpdGVfaSAoQ1RfR1JfTywgMHgwNiwgMHgwNSk7Cgl9CgljdFdyaXRlX2kgKENUX0dSX08sIDB4MDcsIDB4MGYpOwoJY3RXcml0ZV9pIChDVF9HUl9PLCAweDA4LCAweGZmKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApTZXRTclJlZ3MgKHZvaWQpCnsKCWludCB0bXAgPSAwOwoKCWN0V3JpdGVfaSAoQ1RfU1JfTywgMHgwMCwgMHgwMCk7CS8qIHJlc2V0ICovCgkvKnJyKCBzciwgMHgwMSwgdG1wICk7CgkgICBpZiggZm50d2lkdGggPT0gOCApIHRtcCB8PSAweDAxOyBlbHNlIHRtcCAmPSB+MHgwMTsKCSAgIHdyKCBzciwgMHgwMSwgdG1wICk7ICAqLwoJaWYgKGZudHdpZHRoID09IDgpCgkJY3RXcml0ZV9pIChDVF9TUl9PLCAweDAxLCAweDAxKTsJLyogQ2xvY2tpbmcgTW9kZSBSZWdpc3RlciAqLwoJZWxzZQoJCWN0V3JpdGVfaSAoQ1RfU1JfTywgMHgwMSwgMHgwMCk7CS8qIENsb2NraW5nIE1vZGUgUmVnaXN0ZXIgKi8KCWN0V3JpdGVfaSAoQ1RfU1JfTywgMHgwMiwgMHgwZik7CS8qIEVuYWJsZSBDUFUgd3IgYWNjZXNzIHRvIGdpdmVuIG1lbW9yeSBwbGFuZSAqLwoJY3RXcml0ZV9pIChDVF9TUl9PLCAweDAzLCAweDAwKTsJLyogQ2hhcmFjdGVyIE1hcCBTZWxlY3QgUmVnaXN0ZXIgKi8KCWlmICh0ZXh0KQoJCXRtcCA9IDB4MDI7CgllbHNlCgkJdG1wID0gMHgwZTsKCWN0V3JpdGVfaSAoQ1RfU1JfTywgMHgwNCwgdG1wKTsJLyogRW5hYmxlIENQVSBhY2Nlc3NlcyB0byB0aGUgcmVzdCBvZiB0aGUgMjU2S0IKCQkJCQkgICB0b3RhbCBWR0EgbWVtb3J5IGJleW9uZCB0aGUgZmlyc3QgNjRLQiBhbmQgc2V0CgkJCQkJICAgZmIgbWFwcGluZyBtb2RlLiAqLwoJY3RXcml0ZV9pIChDVF9TUl9PLCAweDAwLCAweDAzKTsJLyogZW5hYmxlICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKU2V0Qml0c1BlclBpeGVsSW50b1hyUmVncyAoaW50IGJwcCkKewoJdW5zaWduZWQgaW50IG4gPSAoYnBwID4+IDMpLCB0bXA7CS8qIG9ubHkgZm9yIDE1LCA4LCAxNiwgMjQgYnBwICovCglzdGF0aWMgY2hhciBtZFs0XSA9IHsgMHgwNCwgMHgwMiwgMHgwNSwgMHgwNiB9OwkvKiBEaXNwbGF5Q29sb3JNb2RlICovCglzdGF0aWMgY2hhciBvZmZbNF0gPSB7IH4weDIwLCB+MHgzMCwgfjB4MjAsIH4weDEwIH07CS8qIG1hc2sgKi8KCXN0YXRpYyBjaGFyIG9uWzRdID0geyAweDEwLCAweDAwLCAweDEwLCAweDIwIH07CS8qIG1hc2sgKi8KCWlmIChicHAgPT0gMTUpCgkJbiA9IDA7Cgl0bXAgPSBjdFJlYWRfaSAoQ1RfWFJfTywgMHgyMCk7Cgl0bXAgJj0gb2ZmW25dOwoJdG1wIHw9IG9uW25dOwoJY3RXcml0ZV9pIChDVF9YUl9PLCAweDIwLCB0bXApOwkvKiBCaXRCTFQgQ29uZmlndXJhdGlvbiAqLwoJY3RXcml0ZV9pIChDVF9YUl9PLCAweDgxLCBtZFtuXSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKU2V0Q3JSZWdzIChzdHJ1Y3QgY3RmYl9yZXNfbW9kZXMgKnZhciwgaW50IGJpdHNfcGVyX3BpeGVsKQp7CQkJCS8qIGhlIC1sZS0gICBodHwwICAgIGhkIC1yaS0gaHMgICAgIC1oLSAgICAgIGhlICovCgl1bnNpZ25lZCBjaGFyIGNyWzB4N2FdOwoJaW50IGksIHRtcDsKCXVuc2lnbmVkIGludCBoZCwgaHMsIGhlLCBodCwgaGJlOwkvKiBIb3Jpem9udGFsLiAgKi8KCXVuc2lnbmVkIGludCB2ZCwgdnMsIHZlLCB2dDsJLyogdmVydGljYWwgKi8KCXVuc2lnbmVkIGludCBicHAsIHdkLCBkYmxzY2FuLCBpbnRlcmxhY2VkLCBiY2FzdCwgQ3J0SGFsZkxpbmU7Cgl1bnNpZ25lZCBpbnQgQ29tcFN5bmNDaGFyQ2xrRGVsYXksIENvbXBTeW5jUGl4ZWxDbGtEZWxheTsKCXVuc2lnbmVkIGludCBOVFNDX1BBTF9Ib3Jpem9udGFsUHVsc2VXaWR0aCwgQmxEZWxheUN0cmw7Cgl1bnNpZ25lZCBpbnQgSG9yaXpvbnRhbEVxdWFsaXphdGlvblB1bHNlczsKCXVuc2lnbmVkIGludCBIb3Jpem9udGFsU2VycmF0aW9uMVN0YXJ0LCBIb3Jpem9udGFsU2VycmF0aW9uMlN0YXJ0OwoKCWNvbnN0IGludCBMaW5lQ29tcGFyZSA9IDB4M2ZmOwoJdW5zaWduZWQgaW50IFRleHRTY2FuTGluZXMgPSAxOwkvKiB0aGlzIGlzIGluIGZhY3QgYSB2ZXJ0aWNhbCB6b29tIGZhY3RvciAgICovCgl1bnNpZ25lZCBpbnQgUkFNREFDX0JsYW5rUGVkZXN0YWxFbmFibGUgPSAwOwkvKiAxPWVuLSwgMD1kaXNhYmxlLCBzZWUgWFI4MiAqLwoKCWhkID0gKHZhci0+eHJlcykgLyA4OwkvKiBIRGlzcC4gICovCglocyA9ICh2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbikgLyA4OwkvKiBIc1N0cnQgICovCgloZSA9ICh2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuKSAvIDg7CS8qIEhzRW5kICAgKi8KCWh0ID0gKHZhci0+bGVmdF9tYXJnaW4gKyB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuKSAvIDg7CS8qIEhUb3RhbCAgKi8KCWhiZSA9IGh0IC0gMTsJCS8qIEhCbGFua0VuYWJsZSB0b2RvIGRvY3Ugd2FudHMgaHQgaGVyZSwgYnV0IGl0IGRvZXMgbm90IHdvcmsgKi8KCS8qIHZlIC11cC0gIHZ0fDAgICAgdmQgLWxvLSB2cyAgICAgLXYtICAgICAgdmUgKi8KCXZkID0gdmFyLT55cmVzOwkJLyogVkRpc3BsYXkgICAqLwoJdnMgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbjsJLyogVlN5bmNTdGFydCAqLwoJdmUgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbiArIHZhci0+dnN5bmNfbGVuOwkvKiBWU3luY0VuZCAqLwoJdnQgPSB2YXItPnVwcGVyX21hcmdpbiArIHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luICsgdmFyLT52c3luY19sZW47CS8qIFZUb3RhbCAgKi8KCWJwcCA9IGJpdHNfcGVyX3BpeGVsOwoJZGJsc2NhbiA9ICh2YXItPnZtb2RlICYgRkJfVk1PREVfRE9VQkxFKSA/IDEgOiAwOwoJaW50ZXJsYWNlZCA9IHZhci0+dm1vZGUgJiBGQl9WTU9ERV9JTlRFUkxBQ0VEOwoJYmNhc3QgPSB2YXItPnN5bmMgJiBGQl9TWU5DX0JST0FEQ0FTVDsKCUNydEhhbGZMaW5lID0gYmNhc3QgPyAoaGQgPj4gMSkgOiAwOwoJQmxEZWxheUN0cmwgPSBiY2FzdCA/IDEgOiAwOwoJQ29tcFN5bmNDaGFyQ2xrRGVsYXkgPSAwOwkvKiAyIGJpdCAqLwoJQ29tcFN5bmNQaXhlbENsa0RlbGF5ID0gMDsJLyogMyBiaXQgKi8KCWlmIChiY2FzdCkgewoJCU5UU0NfUEFMX0hvcml6b250YWxQdWxzZVdpZHRoID0gNzsJLyooIHZhci0+aHN5bmNfbGVuID4+IDEgKSArIDEgKi8KCQlIb3Jpem9udGFsRXF1YWxpemF0aW9uUHVsc2VzID0gMDsJLyogaW52ZXJzZSB2YWx1ZSAqLwoJCUhvcml6b250YWxTZXJyYXRpb24xU3RhcnQgPSAzMTsJLyogKCBodCA+PiAxICkgKi8KCQlIb3Jpem9udGFsU2VycmF0aW9uMlN0YXJ0ID0gODk7CS8qICggaHQgPj4gMSApICovCgl9IGVsc2UgewoJCU5UU0NfUEFMX0hvcml6b250YWxQdWxzZVdpZHRoID0gMDsKCQkvKiA0IGJpdDogaHN5bmMgcHVsc2Ugd2lkdGggPSAoICggQ1I3NFs0OjBdIC0gQ1I3NFs1XSApCgkJICogLyAyICkgKyAxIC0tPiBDUjc0WzQ6MF0gPSAyKihocy0xKSArIENSNzRbNV0gKi8KCQlIb3Jpem9udGFsRXF1YWxpemF0aW9uUHVsc2VzID0gMTsJLyogaW52ZXJzZSB2YWx1ZSAqLwoJCUhvcml6b250YWxTZXJyYXRpb24xU3RhcnQgPSAwOwkvKiAoIGh0ID4+IDEgKSAqLwoJCUhvcml6b250YWxTZXJyYXRpb24yU3RhcnQgPSAwOwkvKiAoIGh0ID4+IDEgKSAqLwoJfQoKCWlmIChicHAgPT0gMTUpCgkJYnBwID0gMTY7Cgl3ZCA9IHZhci0+eHJlcyAqIGJwcCAvIDY0OwkvKiBkb3VibGUgd29yZHMgcGVyIGxpbmUgKi8KCWlmIChpbnRlcmxhY2VkKSB7CS8qIHdlIGRpdmlkZSBhbGwgdmVydGljYWwgdGltaW5ncywgZXhlcHQgdmQgKi8KCQl2cyA+Pj0gMTsKCQl2ZSA+Pj0gMTsKCQl2dCA+Pj0gMTsKCX0KCW1lbXNldCAoY3IsIDAsIHNpemVvZiAoY3IpKTsKCWNyWzB4MDBdID0gMHhmZiAmIChodCAtIDUpOwoJY3JbMHgwMV0gPSBoZCAtIDE7CS8qIHNvbGw6NGYgaXN0IDU5ICovCgljclsweDAyXSA9IGhkOwoJY3JbMHgwM10gPSAoaGJlICYgMHgxRikgfCAweDgwOwkvKiBoZCArIGh0IC0gaGQgICovCgljclsweDA0XSA9IGhzOwoJY3JbMHgwNV0gPSAoKGhiZSAmIDB4MjApIDw8IDIpIHwgKGhlICYgMHgxZik7CgljclsweDA2XSA9ICh2dCAtIDIpICYgMHhGRjsKCWNyWzB4MzBdID0gKHZ0IC0gMikgPj4gODsKCWNyWzB4MDddID0gKCh2dCAmIDB4MTAwKSA+PiA4KQoJICAgIHwgKCh2ZCAmIDB4MTAwKSA+PiA3KQoJICAgIHwgKCh2cyAmIDB4MTAwKSA+PiA2KQoJICAgIHwgKCh2cyAmIDB4MTAwKSA+PiA1KQoJICAgIHwgKChMaW5lQ29tcGFyZSAmIDB4MTAwKSA+PiA0KQoJICAgIHwgKCh2dCAmIDB4MjAwKSA+PiA0KQoJICAgIHwgKCh2ZCAmIDB4MjAwKSA+PiAzKQoJICAgIHwgKCh2cyAmIDB4MjAwKSA+PiAyKTsKCWNyWzB4MDhdID0gMHgwMDsKCWNyWzB4MDldID0gKGRibHNjYW4gPDwgNykKCSAgICB8ICgoTGluZUNvbXBhcmUgJiAweDIwMCkgPj4gMykKCSAgICB8ICgodnMgJiAweDIwMCkgPj4gNCkKCSAgICB8IChUZXh0U2NhbkxpbmVzIC0gMSk7CgljclsweDEwXSA9IHZzICYgMHhmZjsJLyogVlN5bmNQdWxzZVN0YXJ0ICovCgljclsweDMyXSA9ICh2cyAmIDB4ZjAwKSA+PiA4OwkvKiBWU3luY1B1bHNlU3RhcnQgKi8KCWNyWzB4MTFdID0gKHZlICYgMHgwZik7CS8qIHwgMHgyMDsgICAgICAqLwoJY3JbMHgxMl0gPSAodmQgLSAxKSAmIDB4ZmY7CS8qIExpbmVDb3VudCAgKi8KCWNyWzB4MzFdID0gKCh2ZCAtIDEpICYgMHhmMDApID4+IDg7CS8qIExpbmVDb3VudCAqLwoJY3JbMHgxM10gPSB3ZCAmIDB4ZmY7CgljclsweDQxXSA9ICh3ZCAmIDB4ZjAwKSA+PiA4OwoJY3JbMHgxNV0gPSB2cyAmIDB4ZmY7CgljclsweDMzXSA9ICh2cyAmIDB4ZjAwKSA+PiA4OwoJY3JbMHgzOF0gPSAoMHgxMDAgJiAoaHQgLSA1KSkgPj4gODsKCWNyWzB4M0NdID0gMHhjMCAmIGhiZTsKCWNyWzB4MTZdID0gKHZ0IC0gMSkgJiAweGZmOwkvKiB2YmUgLSBkb2N1IHdhbnRzIHZ0IGhlcmUsICovCgljclsweDE3XSA9IDB4ZTM7CS8qIGJ1dCBpdCBkb2VzIG5vdCB3b3JrICovCgljclsweDE4XSA9IDB4ZmYgJiBMaW5lQ29tcGFyZTsKCWNyWzB4MjJdID0gMHhmZjsJLyogdG9kbz8gKi8KCWNyWzB4NzBdID0gaW50ZXJsYWNlZCA/ICgweDgwIHwgQ3J0SGFsZkxpbmUpIDogMHgwMDsJLyogY2hlY2s6MHhhNiAgKi8KCWNyWzB4NzFdID0gMHg4MCB8IChSQU1EQUNfQmxhbmtQZWRlc3RhbEVuYWJsZSA8PCA2KQoJICAgIHwgKEJsRGVsYXlDdHJsIDw8IDUpCgkgICAgfCAoKDB4MDMgJiBDb21wU3luY0NoYXJDbGtEZWxheSkgPDwgMykKCSAgICB8ICgweDA3ICYgQ29tcFN5bmNQaXhlbENsa0RlbGF5KTsJLyogdG9kbzogc2VlIFhSODIgKi8KCWNyWzB4NzJdID0gSG9yaXpvbnRhbFNlcnJhdGlvbjFTdGFydDsKCWNyWzB4NzNdID0gSG9yaXpvbnRhbFNlcnJhdGlvbjJTdGFydDsKCWNyWzB4NzRdID0gKEhvcml6b250YWxFcXVhbGl6YXRpb25QdWxzZXMgPDwgNSkKCSAgICB8IE5UU0NfUEFMX0hvcml6b250YWxQdWxzZVdpZHRoOwoJLyogdG9kbzogY3Q2OTAwMCBoYXMgYWxzbyAweDc1LTc5ICovCgkvKiBub3cgc2V0IHRoZSByZWdpc3RlcnMgKi8KCWZvciAoaSA9IDA7IGkgPD0gMHgwZDsgaSsrKSB7CS8qQ1IwMCAuLiBDUjBEICovCgkJY3RXcml0ZV9pIChDVF9DUl9PLCBpLCBjcltpXSk7Cgl9Cglmb3IgKGkgPSAweDEwOyBpIDw9IDB4MTg7IGkrKykgewkvKkNSMTAgLi4gQ1IxOCAqLwoJCWN0V3JpdGVfaSAoQ1RfQ1JfTywgaSwgY3JbaV0pOwoJfQoJaSA9IDB4MjI7CQkvKkNSMjIgKi8KCWN0V3JpdGVfaSAoQ1RfQ1JfTywgaSwgY3JbaV0pOwoJZm9yIChpID0gMHgzMDsgaSA8PSAweDMzOyBpKyspIHsJLypDUjMwIC4uIENSMzMgKi8KCQljdFdyaXRlX2kgKENUX0NSX08sIGksIGNyW2ldKTsKCX0KCWkgPSAweDM4OwkJLypDUjM4ICovCgljdFdyaXRlX2kgKENUX0NSX08sIGksIGNyW2ldKTsKCWkgPSAweDNDOwkJLypDUjNDICovCgljdFdyaXRlX2kgKENUX0NSX08sIGksIGNyW2ldKTsKCWZvciAoaSA9IDB4NDA7IGkgPD0gMHg0MTsgaSsrKSB7CS8qQ1I0MCAuLiBDUjQxICovCgkJY3RXcml0ZV9pIChDVF9DUl9PLCBpLCBjcltpXSk7Cgl9Cglmb3IgKGkgPSAweDcwOyBpIDw9IDB4NzQ7IGkrKykgewkvKkNSNzAgLi4gQ1I3NCAqLwoJCWN0V3JpdGVfaSAoQ1RfQ1JfTywgaSwgY3JbaV0pOwoJfQoJdG1wID0gY3RSZWFkX2kgKENUX0NSX08sIDB4NDApOwoJdG1wICY9IDB4MGY7Cgl0bXAgfD0gMHg4MDsKCWN0V3JpdGVfaSAoQ1RfQ1JfTywgMHg0MCwgdG1wKTsJLyogU3RhcnRBZGRyZXNzRW5hYmxlICovCn0KCi8qIHBpeGVsY2xvY2sgY29udHJvbCAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBXZSBoYXZlIGEgcmF0aW9uYWwgbnVtYmVyIHAvcSBhbmQgbmVlZCBhbiBtL24gd2hpY2ggaXMgdmVyeSBjbG9zZSB0byBwL3EKIGJ1dCBoYXMgbSBhbmQgbiB3aXRoaW4gbW5taW4gYW5kIG1ubWF4LiBXZSBoYXZlIG5vIGZsb2F0aW5nIHBvaW50IGluIHRoZQoga2VybmVsLiBXZSBjYW4gdXNlIGxvbmcgbG9uZyB3aXRob3V0IGRpdmlkZS4gQW5kIHdlIGhhdmUgdGltZSB0byBjb21wdXRlLi4uCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHVuc2lnbmVkIGludApGaW5kQmVzdFBRRml0dGluZ01OICh1bnNpZ25lZCBpbnQgcCwgdW5zaWduZWQgaW50IHEsIHVuc2lnbmVkIGludCBtbm1pbiwKCQkgICAgIHVuc2lnbmVkIGludCBtbm1heCwgdW5zaWduZWQgaW50ICpwbSwgdW5zaWduZWQgaW50ICpwbikKewoJLyogdGhpcyBjb2RlIGlzIG5vdCBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWJsZSBidXQgZ29vZCBmb3Igb3VyIG51bWJlciByYW5nZXMgKi8KCXVuc2lnbmVkIGludCBuID0gbW5taW4sIG0gPSAwOwoJbG9uZyBsb25nIGludCBMID0gMCwgUCA9IHAsIFEgPSBxLCBIID0gUCA+PiAxOwoJbG9uZyBsb25nIGludCBEID0gMHg3ZmZmZmZmZmZmZmZmZmZMTDsKCWZvciAobiA9IG1ubWluOyBuIDw9IG1ubWF4OyBuKyspIHsKCQltID0gbW5taW47CS8qIHAvcSB+IG0vbiAtPiBwKm4gfiBtKnEgLT4gcCpuLXgqcSB+IDAgKi8KCQlMID0gUCAqIG4gLSBtICogUTsJLyogbiAqIHZjbyAtIG0gKiBmcmVmIHNob3VsZCBiZSBuZWFyIDAgKi8KCQl3aGlsZSAoTCA+IDAgJiYgbSA8IG1ubWF4KSB7CgkJCUwgLT0gcTsJLyogZGlmZmVyZW5jZSBpcyBncmVhdGVyIGFzIDAgc3VidHJhY3QgZnJlZiAqLwoJCQltKys7CS8qIGFuZCBpbmNyZW1lbnQgbSAqLwoJCX0KCQkvKiBkaWZmZXJlbmNlIGlzIGxlc3Mgb3IgZXF1YWwgdGhhbiAwIG9yIG0gPiBtYXhpbXVtICovCgkJaWYgKG0gPiBtbm1heCkKCQkJYnJlYWs7CS8qIG5vIHNvbHV0aW9uOiBpZiB3ZSBpbmNyZWFzZSBuIHdlIGdldCB0aGUgc2FtZSBzaXR1YXRpb24gKi8KCQkvKiBMIGlzIDw9IDAgbm93ICovCgkJaWYgKC1MID4gSCAmJiBtID4gbW5taW4pIHsJLyogaWYgZGlmZmVyZW5jZSA+IHRoZSBoYWxmIGZyZWYgKi8KCQkJTCArPSBxOwkvKiB3ZSB0YWtlIHRoZSBzaXR1YXRpb24gYmVmb3JlICovCgkJCW0tLTsJLyogYmVjYXVzZSBpdHMgY2xvc2VyIHRvIDAgKi8KCQl9CgkJTCA9IChMIDwgMCkgPyAtTCA6ICtMOwkvKiBhYnNvbHV0ZSB2YWx1ZSAqLwoJCWlmIChEIDwgTCkJLyogaWYgbGFzdCBkaWZmZXJlbmNlIHdhcyBiZXR0ZXIgdGFrZSBuZXh0IG4gKi8KCQkJY29udGludWU7CgkJRCA9IEw7CgkJKnBtID0gbTsKCQkqcG4gPSBuOwkvKiAga2VlcCBpbXByb3ZlZCBkYXRhICovCgkJaWYgKEQgPT0gMCkKCQkJYnJlYWs7CS8qIGJlc3QgcmVzdWx0IHdlIGNhbiBnZXQgKi8KCX0KCXJldHVybiAodW5zaWduZWQgaW50KSAoMHhmZmZmZmZmZiAmIEQpOwp9CgovKiB0aGF0IGlzIHRoZSBoYXJkd2FyZSA8IDY5MDAwIHdlIGhhdmUgdG8gbWFuYWdlCiArLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICstLSsKIHwgUkVGQ0xLICB8X198TlRTQyBEaXZpc29yIFNlbGVjdHxfX3xGVkNPIFJlZmVyZW5jZSBEaXZpc29yfF9ffPdOfF9fCiB8IDE0LjNNSHogfCAgfChOVFNDRFMpICj3MSwg9zUpICB8ICB8U2VsZWN0IChSRFMpICj3MSwg9zQpIHwgIHwgIHwgIHwKICstLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tLS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgKy0tKyAgfAogIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiB8CiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnZjbyAgICAgICAgICAgICAgICAgICAgICBmb3V0CiB8ICstLS0tLS0tLSsgICstLS0tLS0tLS0tLS0rICArLS0tLS0rICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSsgICArLS0tLSsKICstfCBQaGFzZSAgfF9ffENoYXJnZSBQdW1wIHxfX3wgVkNPIHxfX19fX3xQb3N0IERpdmlzb3IgKFBEKSAgfF9fX3xDTEsgfC0tLT4KICstfCBEZXRlY3QgfCAgfCYgRmlsdGVyIFZDT3wgIHwgICAgIHwgIHwgIHz3MSwgMiwgNCwgOCwgMTYsIDMyfCAgIHwgICAgfAogfCArLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tKyAgKy0tLS0tKyAgfCAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rICAgKy0tLS0rCiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiB8ICAgICstLSsgICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICB8CiB8X19fX3z3TXxfX198VkNPIExvb3AgRGl2aWRlfF9fX19fX19fX198CiAgICAgIHwgIHwgICB8KFZMRCko9zQsIPcxNikgfAogICAgICArLS0rICAgKy0tLS0tLS0tLS0tLS0tLSsKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIHRoYXQgaXMgdGhlIGhhcmR3YXJlID49IDY5MDAwIHdlIGhhdmUgdG8gbWFuYWdlCiArLS0tLS0tLS0tKyAgKy0tKwogfCBSRUZDTEsgIHxfX3z3TnxfXwogfCAxNC4zTUh6IHwgIHwgIHwgIHwKICstLS0tLS0tLS0rICArLS0rICB8CiAgX19fX19fX19fX19fX19fX19ffAogfAogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ2Y28gICAgICAgICAgICAgICAgICAgICAgZm91dAogfCArLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tKyAgKy0tLS0tKyAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rICAgKy0tLS0rCiArLXwgUGhhc2UgIHxfX3xDaGFyZ2UgUHVtcCB8X198IFZDTyB8X19fX198UG9zdCBEaXZpc29yIChQRCkgIHxfX198Q0xLIHwtLS0+CiArLXwgRGV0ZWN0IHwgIHwmIEZpbHRlciBWQ098ICB8ICAgICB8ICB8ICB89zEsIDIsIDQsIDgsIDE2LCAzMnwgICB8ICAgIHwKIHwgKy0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLSsgICstLS0tLSsgIHwgICstLS0tLS0tLS0tLS0tLS0tLS0tKyAgICstLS0tKwogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogfCAgICArLS0rICAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgfAogfF9fX1989018X19ffFZDTyBMb29wIERpdmlkZXxfX19fX19fX19ffAogICAgICB8ICB8ICAgfChWTEQpKPcxLCD3NCkgIHwKICAgICAgKy0tKyAgICstLS0tLS0tLS0tLS0tLS0rCgoKKi8KCiNkZWZpbmUgVklERU9fRlJFRiAxNDMxODE4MDsJLyogSHogICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIGludApSZWFkUGl4Q2xja0Zyb21YclJlZ3NCYWNrIChzdHJ1Y3QgY3RmYl9jaGlwc19wcm9wZXJ0aWVzICpwYXJhbSkKewoJdW5zaWduZWQgaW50IG0sIG4sIHZsZCwgcGQsIFBELCBmcmVmLCB4cl9jYiwgaSwgcGl4Y2xvY2s7CglpID0gMDsKCXBpeGNsb2NrID0gLTE7CglmcmVmID0gVklERU9fRlJFRjsKCW0gPSBjdFJlYWRfaSAoQ1RfWFJfTywgMHhjOCk7CgluID0gY3RSZWFkX2kgKENUX1hSX08sIDB4YzkpOwoJbSAtPSBwYXJhbS0+bW5fZGlmZjsKCW4gLT0gcGFyYW0tPm1uX2RpZmY7Cgl4cl9jYiA9IGN0UmVhZF9pIChDVF9YUl9PLCAweGNiKTsKCVBEID0gKDB4NzAgJiB4cl9jYikgPj4gNDsKCXBkID0gMTsKCWZvciAoaSA9IDA7IGkgPCBQRDsgaSsrKSB7CgkJcGQgKj0gMjsKCX0KCXZsZCA9ICgweDA0ICYgeHJfY2IpID8gcGFyYW0tPnZsZF9zZXQgOiBwYXJhbS0+dmxkX25vdF9zZXQ7CglpZiAobiAqIHZsZCAqIG0pIHsKCQl1bnNpZ25lZCBsb25nIGxvbmcgcCA9IDEwMDAwMDAwMDAwMDBMTCAqIHBkICogbjsKCQl1bnNpZ25lZCBsb25nIGxvbmcgcSA9IChsb25nIGxvbmcpIGZyZWYgKiB2bGQgKiBtOwoJCXdoaWxlICgocCA+IDB4ZmZmZmZmZmZMTCkgfHwgKHEgPiAweGZmZmZmZmZmTEwpKSB7CgkJCXAgPj49IDE7CS8qIGNhbid0IGRpdmlkZSB3aXRoIGxvbmcgbG9uZyBzbyB3ZSBzY2FsZSBkb3duICovCgkJCXEgPj49IDE7CgkJfQoJCXBpeGNsb2NrID0gKHVuc2lnbmVkKSBwIC8gKHVuc2lnbmVkKSBxOwoJfSBlbHNlCgkJcHJpbnRmICgiSW52YWxpZCBkYXRhIGluIHhyIHJlZ3MuXG4iKTsKCXJldHVybiBwaXhjbG9jazsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApGaW5kQW5kU2V0UGxsUGFyYW1JbnRvWHJSZWdzICh1bnNpZ25lZCBpbnQgcGl4ZWxjbG9jaywKCQkJICAgICAgc3RydWN0IGN0ZmJfY2hpcHNfcHJvcGVydGllcyAqcGFyYW0pCnsKCXVuc2lnbmVkIGludCBtLCBuLCB2bGQsIHBkLCBQRCwgZnJlZiwgeHJfY2I7Cgl1bnNpZ25lZCBpbnQgZnZjb21pbiwgZnZjb21heCwgcGNsY2ttaW4sIHBjbGNrbWF4LCBwY2xrOwoJdW5zaWduZWQgaW50IHBmcmVxLCBmdmNvLCBuZXdfcGl4Y2xvY2s7Cgl1bnNpZ25lZCBpbnQgRCxuYmFjayxtYmFjazsKCglmcmVmID0gVklERU9fRlJFRjsKCXBkID0gMTsKCVBEID0gMDsKCWZ2Y29taW4gPSBwYXJhbS0+dmNvX21pbjsKCWZ2Y29tYXggPSBwYXJhbS0+dmNvX21heDsJLyogTUh6ICovCglwY2xja21pbiA9IDEwMDAwMDAgLyBmdmNvbWF4ICsgMTsJLyogICA0NTQ2ICovCglwY2xja21heCA9IDMyMDAwMDAwIC8gZnZjb21pbiAtIDE7CS8qIDY2NjY2NSAqLwoJcGNsayA9IG1pbm1heCAocGNsY2ttaW4sIHBpeGVsY2xvY2ssIHBjbGNrbWF4KTsJLyogcHMgcHAgKi8KCXBmcmVxID0gMjUwICogKDQwMDAwMDAwMDBVIC8gcGNsayk7CglmdmNvID0gcGZyZXE7CQkvKiBIeiAqLwoJbmV3X3BpeGNsb2NrID0gMDsKCXdoaWxlIChmdmNvIDwgZnZjb21pbiAqIDEwMDAwMDApIHsKCQkvKiBkb3VibGUgVkNPIHN0YXJ0aW5nIHdpdGggdGhlIHBpeGVsY2xvY2sgZnJlcXVlbmN5CgkJICogYXMgbG9uZyBhcyBpdCBpcyBsb3dlciB0aGFuIHRoZSBtaW5pbWFsIFZDTyBmcmVxdWVuY3kgKi8KCQlmdmNvICo9IDI7CgkJcGQgKj0gMjsKCQlQRCsrOwoJfQoJLyogZnZjbyBpcyBleGFjdGx5IHBkICogcGl4ZWxjbG9jayBhbmQgaGlnaGVyIHRoYW4gdGhlIG5pbm1hbCBWQ08gZnJlcXVlbmN5ICovCgkvKiBmaXJzdCB0cnkgKi8KCXZsZCA9IHBhcmFtLT52bGRfc2V0OwoJRD1GaW5kQmVzdFBRRml0dGluZ01OIChmdmNvIC8gdmxkLCBmcmVmLCBwYXJhbS0+bW5fbWluLCBwYXJhbS0+bW5fbWF4LCAmbSwgJm4pOyAvKiByZHMgPSAxICovCgltYmFjaz1tOwoJbmJhY2s9bjsKCS8qIHNlY29uZCB0cnkgKi8KCXZsZCA9IHBhcmFtLT52bGRfbm90X3NldDsKCWlmKEQ8RmluZEJlc3RQUUZpdHRpbmdNTiAoZnZjbyAvIHZsZCwgZnJlZiwgcGFyYW0tPm1uX21pbiwgcGFyYW0tPm1uX21heCwgJm0sICZuKSkgeyAgICAvKiByZHMgPSAxICovCgkJLyogZmlyc3QgdHJ5IHdhcyBiZXR0ZXIgKi8KCQltPW1iYWNrOwoJCW49bmJhY2s7CgkJdmxkID0gcGFyYW0tPnZsZF9zZXQ7Cgl9CgltICs9IHBhcmFtLT5tbl9kaWZmOwoJbiArPSBwYXJhbS0+bW5fZGlmZjsKCVBSSU5URiAoIlZDTyAlZCwgcGQgJWQsIG0gJWQgbiAlZCB2bGQgJWQgXG4iLCBmdmNvLCBwZCwgbSwgbiwgdmxkKTsKCXhyX2NiID0gKCgweDcgJiBQRCkgPDwgNCkgfCAodmxkID09IHBhcmFtLT52bGRfc2V0ID8gMHgwNCA6IDApOwoJLyogQWxsIGZvdXIgb2YgdGhlIHJlZ2lzdGVycyB1c2VkIGZvciBkb3QgY2xvY2sgMiAoWFJDOCAtIFhSQ0IpIG11c3QgYmUKCSAqIHdyaXR0ZW4sIGFuZCBpbiBvcmRlciBmcm9tIFhSQzggdG8gWFJDQiwgYmVmb3JlIHRoZSBoYXJkd2FyZSB3aWxsCgkgKiB1cGRhdGUgdGhlIHN5bnRoZXNpemVyIHMgc2V0dGluZ3MuCgkgKi8KCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHhjOCwgbSk7CgljdFdyaXRlX2kgKENUX1hSX08sIDB4YzksIG4pOwkvKiB4cmNhIGRvZXMgbm90IGV4aXN0IGluIENUNjkwMDAgYW5kIENUNjkwMzAgKi8KCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHhjYSwgMCk7CS8qIGJlY2F1c2Ugb2YgYSBodyBidWcgSSBndWVzcywgYnV0IHdlIHdyaXRlICovCgljdFdyaXRlX2kgKENUX1hSX08sIDB4Y2IsIHhyX2NiKTsJLyogMCB0byBpdCBmb3Igc2F2ZXR5ICovCgluZXdfcGl4Y2xvY2sgPSBSZWFkUGl4Q2xja0Zyb21YclJlZ3NCYWNrIChwYXJhbSk7CglQUklOVEYgKCJwaXhlbGNsb2NrLnNldCA9ICVkLCBwaXhlbGNsb2NrLnJlYWwgPSAlZCBcbiIsCgkJcGl4ZWxjbG9jaywgbmV3X3BpeGNsb2NrKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApTZXRNc3JSZWdzIChzdHJ1Y3QgY3RmYl9yZXNfbW9kZXMgKm1vZGUpCnsKCXVuc2lnbmVkIGNoYXIgaF9zeW5jaF9oaWdoLCB2X3N5bmNoX2hpZ2g7CgoJaF9zeW5jaF9oaWdoID0gKG1vZGUtPnN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkgPyAwIDogMHg0MDsJLyogaG9yaXpvbnRhbCBTeW5jaCBIaWdoIGFjdGl2ZSAqLwoJdl9zeW5jaF9oaWdoID0gKG1vZGUtPnN5bmMgJiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpID8gMCA6IDB4ODA7CS8qIHZlcnRpY2FsIFN5bmNoIEhpZ2ggYWN0aXZlICovCgljdFdyaXRlIChDVF9NU1JfV19PLCAoaF9zeW5jaF9oaWdoIHwgdl9zeW5jaF9oaWdoIHwgMHgyOSkpOwoJLyogdXBwZXI2NEs9PTB4MjAsIENMQzJzZWxlY3Q9PTB4MDgsIFJBTWVuYWJsZT09MHgwMiEodG9kbyksIENHQT09MHgwMQoJICogU2VsZWN0cyB0aGUgdXBwZXIgNjRLQiBwYWdlLkJpdDU9MQoJICogQ0xLMiAobGVmdCByZXNlcnZlZCBpbiBzdGFuZGFyZCBWR0EpIEJpdDN8Mj0xfDAKCSAqIERpc2FibGVzIENQVSBhY2Nlc3MgdG8gZnJhbWUgYnVmZmVyLiBCaXQxPTAKCSAqIFNldHMgdGhlIEkvTyBhZGRyZXNzIGRlY29kZSBmb3IgU1QwMSwgRkNSLCBhbmQgYWxsIENSIHJlZ2lzdGVycwoJICogdG8gdGhlIDNEeCBJL08gYWRkcmVzcyByYW5nZSAoQ0dBIGVtdWxhdGlvbikuIEJpdDA9MQoJICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZmRlZiBWR0FfRFVNUF9SRUcKCnN0YXRpYyB2b2lkCmN0RGlzcFJlZ3MgKHVuc2lnbmVkIHNob3J0IGluZGV4LCBpbnQgZnJvbSwgaW50IHRvKQp7Cgl1bnNpZ25lZCBjaGFyIHN0YXR1czsKCWludCBpOwoKCWZvciAoaSA9IGZyb207IGkgPCB0bzsgaSsrKSB7CgkJc3RhdHVzID0gY3RSZWFkX2kgKGluZGV4LCBpKTsKCQlwcmludGYgKCIlMDJYOiBpcyAlMDJYXG4iLCBpLCBzdGF0dXMpOwoJfQp9Cgp2b2lkCnZpZGVvX2R1bXBfcmVnICh2b2lkKQp7CglpbnQgaTsKCglwcmludGYgKCJFeHRlbmRlZCBSZWdzOlxuIik7CgljdERpc3BSZWdzIChDVF9YUl9PLCAwLCAweEMpOwoJY3REaXNwUmVncyAoQ1RfWFJfTywgMHhlLCAweGYpOwoJY3REaXNwUmVncyAoQ1RfWFJfTywgMHgyMCwgMHgyMSk7CgljdERpc3BSZWdzIChDVF9YUl9PLCAweDQwLCAweDUwKTsKCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4NjAsIDB4NjQpOwoJY3REaXNwUmVncyAoQ1RfWFJfTywgMHg2NywgMHg2OCk7CgljdERpc3BSZWdzIChDVF9YUl9PLCAweDcwLCAweDcyKTsKCWN0RGlzcFJlZ3MgKENUX1hSX08sIDB4ODAsIDB4ODMpOwoJY3REaXNwUmVncyAoQ1RfWFJfTywgMHhBMCwgMHhCMCk7CgljdERpc3BSZWdzIChDVF9YUl9PLCAweEMwLCAweEQzKTsKCXByaW50ZiAoIlNlcXVlbmNlciBSZWdzOlxuIik7CgljdERpc3BSZWdzIChDVF9TUl9PLCAwLCAweDgpOwoJcHJpbnRmICgiR3JhcGhpYyBSZWdzOlxuIik7CgljdERpc3BSZWdzIChDVF9HUl9PLCAwLCAweDkpOwoJcHJpbnRmICgiQ1JUIFJlZ3M6XG4iKTsKCWN0RGlzcFJlZ3MgKENUX0NSX08sIDAsIDB4MTkpOwoJY3REaXNwUmVncyAoQ1RfQ1JfTywgMHgyMiwgMHgyMyk7CgljdERpc3BSZWdzIChDVF9DUl9PLCAweDMwLCAweDM0KTsKCWN0RGlzcFJlZ3MgKENUX0NSX08sIDB4MzgsIDB4MzkpOwoJY3REaXNwUmVncyAoQ1RfQ1JfTywgMHgzQywgMHgzRCk7CgljdERpc3BSZWdzIChDVF9DUl9PLCAweDQwLCAweDQyKTsKCWN0RGlzcFJlZ3MgKENUX0NSX08sIDB4NzAsIDB4ODApOwoJLyogZG9uJ3QgZGlzcGxheSB0aGUgYXR0cmlidXRlcyAqLwp9CgojZW5kaWYKCiNpZmRlZiBDT05GSUdfVklERU9fSFdfQ1VSU09SCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2V0IEhhcmR3YXJlIEN1cnNvciBpbiBQaXhlbAogKi8Kdm9pZAp2aWRlb19zZXRfaHdfY3Vyc29yIChpbnQgeCwgaW50IHkpCnsKCWludCBzaWdfeCA9IDAsIHNpZ195ID0gMDsKCWlmICh4IDwgMCkgewoJCXggKj0gLTE7CgkJc2lnX3ggPSAxOwoJfQoJaWYgKHkgPCAwKSB7CgkJeSAqPSAtMTsKCQlzaWdfeSA9IDE7Cgl9CgljdFdyaXRlX2kgKENUX1hSX08sIDB4YTQsIHggJiAweGZmKTsKCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHhhNSwgKHggPj4gOCkgJiAweDcpOwoJY3RXcml0ZV9pIChDVF9YUl9PLCAweGE2LCB5ICYgMHhmZik7CgljdFdyaXRlX2kgKENUX1hSX08sIDB4YTcsICh5ID4+IDgpICYgMHg3KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJbml0IEhhcmR3YXJlIEN1cnNvci4gVG8ga25vdyB0aGUgc2l6ZSBvZiB0aGUgQ3Vyc29yLAogKiB3ZSBoYXZlIHRvIGtub3cgdGhlIEZvbnQgc2l6ZS4KICovCnZvaWQKdmlkZW9faW5pdF9od19jdXJzb3IgKGludCBmb250X3dpZHRoLCBpbnQgZm9udF9oZWlnaHQpCnsKCXVuc2lnbmVkIGNoYXIgeHJfODA7Cgl1bnNpZ25lZCBsb25nICpjdXJzLCBwYXR0ZXJuOwoJaW50IGk7CglpbnQgY3Vyc29yX3N0YXJ0OwoJR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikgJiBjdGZiOwoKCWN1cnNvcl9zdGFydCA9IHBHRC0+ZHByQmFzZTsKCXhyXzgwID0gY3RSZWFkX2kgKENUX1hSX08sIDB4ODApOwoJLyogc2V0IHN0YXJ0IGFkZHJlc3MgKi8KCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHhhMiwgKGN1cnNvcl9zdGFydCA+PiA4KSAmIDB4ZjApOwoJY3RXcml0ZV9pIChDVF9YUl9PLCAweGEzLCAoY3Vyc29yX3N0YXJ0ID4+IDE2KSAmIDB4M2YpOwoJLyogc2V0IGN1cnNvciBzaGFwZSAqLwoJY3VycyA9ICh1bnNpZ25lZCBsb25nICopIGN1cnNvcl9zdGFydDsKCWkgPSAwOwoJd2hpbGUgKGkgPCAweDQwMCkgewoJCWN1cnNbaSsrXSA9IDB4ZmZmZmZmZmY7CS8qIEFORCBtYXNrICovCgkJY3Vyc1tpKytdID0gMHhmZmZmZmZmZjsJLyogQU5EIG1hc2sgKi8KCQljdXJzW2krK10gPSAwOwkvKiBYT1IgbWFzayAqLwoJCWN1cnNbaSsrXSA9IDA7CS8qIFhPUiBtYXNrICovCgkJLyogVHJhbnNwYXJlbnQgKi8KCX0KCXBhdHRlcm4gPSAweGZmZmZmZmZmID4+IGZvbnRfd2lkdGg7CglpID0gMDsKCXdoaWxlIChpIDwgKGZvbnRfaGVpZ2h0ICogMikpIHsKCQljdXJzW2krK10gPSBwYXR0ZXJuOwkvKiBBTkQgbWFzayAqLwoJCWN1cnNbaSsrXSA9IHBhdHRlcm47CS8qIEFORCBtYXNrICovCgkJY3Vyc1tpKytdID0gMDsJLyogWE9SIG1hc2sgKi8KCQljdXJzW2krK10gPSAwOwkvKiBYT1IgbWFzayAqLwoJCS8qIEN1cnNvciBDb2xvciAwICovCgl9CgkvKiBzZXQgYmxpbmsgcmF0ZSAqLwoJY3RXcml0ZV9pIChDVF9GUF9PLCAweDE5LCAweGYpOwoKCS8qIHNldCBjdXJzb3JzIGNvbG9ycyAqLwoJeHJfODAgPSBjdFJlYWRfaSAoQ1RfWFJfTywgMHg4MCk7Cgl4cl84MCB8PSAweDE7CQkvKiBhbHRlcm5hdGUgcGFsZXR0ZSBzZWxlY3QgKi8KCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHg4MCwgeHJfODApOwoJdmlkZW9fc2V0X2x1dCAoNCwgQ09OU09MRV9GR19DT0wsIENPTlNPTEVfRkdfQ09MLCBDT05TT0xFX0ZHX0NPTCk7CgkvKiBwb3NpdGlvbiA0IGlzIGNvbG9yIDAgY3Vyc29yIDAgKi8KCXhyXzgwICY9IDB4ZmU7CQkvKiBub3JtYWwgcGFsZXR0ZSBzZWxlY3QgKi8KCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHg4MCwgeHJfODApOwoJLyogY3Vyc29yIGVuYWJsZSAqLwoJY3RXcml0ZV9pIChDVF9YUl9PLCAweGEwLCAweDkxKTsKCXhyXzgwIHw9IDB4MTA7CQkvKiBlbmFibGUgaHdjdXJzb3IgKi8KCWN0V3JpdGVfaSAoQ1RfWFJfTywgMHg4MCwgeHJfODApOwoJdmlkZW9fc2V0X2h3X2N1cnNvciAoMCwgMCk7Cn0KI2VuZGlmCQkJCS8qIENPTkZJR19WSURFT19IV19DVVJTT1IgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogV2FpdCBmb3IgQml0Qmx0IHJlYWR5CiAqLwpzdGF0aWMgaW50CnZpZGVvX3dhaXRfYml0Ymx0ICh1bnNpZ25lZCBsb25nIGFkZHIpCnsKCXVuc2lnbmVkIGxvbmcgYnIwNDsKCWludCBpID0gMDsKCWJyMDQgPSBpbjMyciAoYWRkcik7Cgl3aGlsZSAoYnIwNCAmIDB4ODAwMDAwMDApIHsKCQl1ZGVsYXkgKDEpOwoJCWJyMDQgPSBpbjMyciAoYWRkcik7CgkJaWYgKGkrKyA+IDEwMDAwMDApIHsKCQkJcHJpbnRmICgiRVJST1IgVGltZW91dCAlbHhcbiIsIGJyMDQpOwoJCQlyZXR1cm4gMTsKCQl9Cgl9CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBTZXQgdXAgQml0Qmx0IFJlZ2lzdHJzCiAqLwpzdGF0aWMgdm9pZApTZXREcmF3aW5nRW5naW5lIChpbnQgYml0c19wZXJfcGl4ZWwpCnsKCXVuc2lnbmVkIGxvbmcgYnIwNCwgYnIwMDsKCXVuc2lnbmVkIGNoYXIgdG1wOwoKCUdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopICYgY3RmYjsKCgl0bXAgPSBjdFJlYWRfaSAoQ1RfWFJfTywgMHgyMCk7CS8qIEJpdEJMVCBDb25maWd1cmF0aW9uICovCgl0bXAgfD0gMHgwMjsJCS8qIHJlc2V0IEJpdEJMVCAqLwoJY3RXcml0ZV9pIChDVF9YUl9PLCAweDIwLCB0bXApOwkvKiBCaXRCTFQgQ29uZmlndXJhdGlvbiAqLwoJdWRlbGF5ICgxMCk7Cgl0bXAgJj0gMHhmZDsJCS8qIHJlbGVhc2UgcmVzZXQgQml0QkxUICovCgljdFdyaXRlX2kgKENUX1hSX08sIDB4MjAsIHRtcCk7CS8qIEJpdEJMVCBDb25maWd1cmF0aW9uICovCgl2aWRlb193YWl0X2JpdGJsdCAocEdELT5wY2lCYXNlICsgQlIwNF9vKTsKCgkvKiBzZXQgcGF0dGVybiBBZGRyZXNzICovCglvdXQzMnIgKHBHRC0+cGNpQmFzZSArIEJSMDVfbywgUEFUVEVSTl9BRFIgJiAweDAwM2ZmZmY4KTsKCWJyMDQgPSAwOwoJaWYgKGJpdHNfcGVyX3BpeGVsID09IDEpIHsKCQlicjA0IHw9IDB4MDAwNDAwMDA7CS8qIG1vbm9jaG9tZSBQYXR0ZXJuICovCgkJYnIwNCB8PSAweDAwMDAxMDAwOwkvKiBtb25vY2hvbWUgc291cmNlICovCgl9CglicjAwID0gKChwR0QtPndpblNpemVYICogcEdELT5nZGZCeXRlc1BQKSA8PCAxNikgKyAocEdELT53aW5TaXplWCAqIHBHRC0+Z2RmQnl0ZXNQUCk7CS8qIGJ5dGVzIHBlciBzY2FubGluZSAqLwoJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjAwX28sIGJyMDApOwkvKiAqLwoJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA4X28sICgxMCA8PCAxNikgKyAxMCk7CS8qIGR1bW15ICovCglvdXQzMnIgKHBHRC0+cGNpQmFzZSArIEJSMDRfbywgYnIwNCk7CS8qIHdyaXRlIGFsbCAwICovCglvdXQzMnIgKHBHRC0+cGNpQmFzZSArIEJSMDdfbywgMCk7CS8qIGRlc3RpbmF0aW9uICovCgl2aWRlb193YWl0X2JpdGJsdCAocEdELT5wY2lCYXNlICsgQlIwNF9vKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBzdXBwb3J0ZWQgVmlkZW8gQ2hpcHMKKi8Kc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHN1cHBvcnRlZFtdID0gewoJe1BDSV9WRU5ET1JfSURfQ1QsIFBDSV9ERVZJQ0VfSURfQ1RfNjkwMDB9LAojaWZkZWYgQ09ORklHX1VTRV9DUENJRFZJCgl7UENJX1ZFTkRPUl9JRF9DVCwgUENJX0RFVklDRV9JRF9DVF82OTAzMH0sCiNlbmRpZgoJe30KfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBJbml0IHZpZGVvIGNoaXAKKi8Kdm9pZCAqCnZpZGVvX2h3X2luaXQgKHZvaWQpCnsKCUdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopICYgY3RmYjsKCXVuc2lnbmVkIHNob3J0IGRldmljZV9pZDsKCXBjaV9kZXZfdCBkZXZidXNmbjsKCWludCB2aWRlb21vZGU7Cgl1bnNpZ25lZCBsb25nIHQxLCBoc3luY2gsIHZzeW5jaDsKCXVuc2lnbmVkIGludCBwY2lfbWVtX2Jhc2UsICp2bTsKCWludCB0bXAsIGksIGJpdHNfcGVyX3BpeGVsOwoJY2hhciAqcGVudjsKCXN0cnVjdCBjdGZiX3Jlc19tb2RlcyAqcmVzX21vZGU7CglzdHJ1Y3QgY3RmYl9yZXNfbW9kZXMgdmFyX21vZGU7CglzdHJ1Y3QgY3RmYl9jaGlwc19wcm9wZXJ0aWVzICpjaGlwc19wYXJhbTsKCS8qIFNlYXJjaCBmb3IgdmlkZW8gY2hpcCAqLwoKCWlmICgoZGV2YnVzZm4gPSBwY2lfZmluZF9kZXZpY2VzIChzdXBwb3J0ZWQsIDApKSA8IDApIHsKI2lmZGVmIENPTkZJR19WSURFT19PTkJPQVJECgkJcHJpbnRmICgiVmlkZW86IENvbnRyb2xsZXIgbm90IGZvdW5kICFcbiIpOwojZW5kaWYKCQlyZXR1cm4gKE5VTEwpOwoJfQoKCS8qIFBDSSBzZXR1cCAqLwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAoZGV2YnVzZm4sIFBDSV9DT01NQU5ELAoJCQkJKFBDSV9DT01NQU5EX01FTU9SWSB8IFBDSV9DT01NQU5EX0lPKSk7CglwY2lfcmVhZF9jb25maWdfd29yZCAoZGV2YnVzZm4sIFBDSV9ERVZJQ0VfSUQsICZkZXZpY2VfaWQpOwoJcGNpX3JlYWRfY29uZmlnX2R3b3JkIChkZXZidXNmbiwgUENJX0JBU0VfQUREUkVTU18wLCAmcGNpX21lbV9iYXNlKTsKCXBjaV9tZW1fYmFzZSA9IHBjaV9tZW1fdG9fcGh5cyAoZGV2YnVzZm4sIHBjaV9tZW1fYmFzZSk7CgoJLyogZ2V0IGNoaXBzIHBhcmFtcyAqLwoJZm9yIChjaGlwc19wYXJhbSA9IChzdHJ1Y3QgY3RmYl9jaGlwc19wcm9wZXJ0aWVzICopICZjaGlwc1swXTsKCSAgICAgY2hpcHNfcGFyYW0tPmRldmljZV9pZCAhPSAwOyBjaGlwc19wYXJhbSsrKSB7CgkJaWYgKGNoaXBzX3BhcmFtLT5kZXZpY2VfaWQgPT0gZGV2aWNlX2lkKQoJCQlicmVhazsKCX0KCWlmIChjaGlwc19wYXJhbS0+ZGV2aWNlX2lkID09IDApIHsKI2lmZGVmIENPTkZJR19WSURFT19PTkJPQVJECgkJcHJpbnRmICgiVmlkZW86IGNvbnRyb2xsZXIgMHglWCBub3Qgc3VwcG9ydGVkXG4iLCBkZXZpY2VfaWQpOwojZW5kaWYKCQlyZXR1cm4gTlVMTDsKCX0KCS8qIHN1cHBvcnRlZCBWaWRlbyBjb250cm9sbGVyIGZvdW5kICovCglwcmludGYgKCJWaWRlbzogIik7CgoJdG1wID0gMDsKCXZpZGVvbW9kZSA9IDB4MzAxOwoJLyogZ2V0IHZpZGVvIG1vZGUgdmlhIGVudmlyb25tZW50ICovCglpZiAoKHBlbnYgPSBnZXRlbnYgKCJ2aWRlb21vZGUiKSkgIT0gTlVMTCkgewoJCS8qIGRlY2VpZGUgaWYgaXQgaXMgYSBzdHJpbmcgKi8KCQlpZiAocGVudlswXSA8PSAnOScpIHsKCQkJdmlkZW9tb2RlID0gKGludCkgc2ltcGxlX3N0cnRvdWwgKHBlbnYsIE5VTEwsIDE2KTsKCQkJdG1wID0gMTsKCQl9Cgl9IGVsc2UgewoJCXRtcCA9IDE7Cgl9CglpZiAodG1wKSB7CgkJLyogcGFyYW1ldGVyIGFyZSB2ZXNhIG1vZGVzICovCgkJLyogc2VhcmNoIHBhcmFtcyAqLwoJCWZvciAoaSA9IDA7IGkgPCBWRVNBX01PREVTX0NPVU5UOyBpKyspIHsKCQkJaWYgKHZlc2FfbW9kZXNbaV0udmVzYW5yID09IHZpZGVvbW9kZSkKCQkJCWJyZWFrOwoJCX0KCQlpZiAoaSA9PSBWRVNBX01PREVTX0NPVU5UKSB7CgkJCXByaW50ZiAoIm5vIFZFU0EgTW9kZSBmb3VuZCwgc3dpdGNoaW5nIHRvIG1vZGUgMHgzMDEgIik7CgkJCWkgPSAwOwoJCX0KCQlyZXNfbW9kZSA9CgkJICAgIChzdHJ1Y3QgY3RmYl9yZXNfbW9kZXMgKikgJnJlc19tb2RlX2luaXRbdmVzYV9tb2Rlc1tpXS4KCQkJCQkJCSAgICAgcmVzaW5kZXhdOwoJCWJpdHNfcGVyX3BpeGVsID0gdmVzYV9tb2Rlc1tpXS5iaXRzX3Blcl9waXhlbDsKCX0gZWxzZSB7CgoJCXJlc19tb2RlID0gKHN0cnVjdCBjdGZiX3Jlc19tb2RlcyAqKSAmdmFyX21vZGU7CgkJYml0c19wZXJfcGl4ZWwgPSB2aWRlb19nZXRfcGFyYW1zIChyZXNfbW9kZSwgcGVudik7Cgl9CgoJLyogY2FsY3VsYXRlIGF2YWlsYWJsZSBjb2xvciBkZXB0aCBmb3IgY29udHJvbGxlciBtZW1vcnkgKi8KCWlmIChiaXRzX3Blcl9waXhlbCA9PSAxNSkKCQl0bXAgPSAyOwoJZWxzZQoJCXRtcCA9IGJpdHNfcGVyX3BpeGVsID4+IDM7CS8qIC84ICovCglpZiAoKChjaGlwc19wYXJhbS0+bWF4X21lbSAtCgkgICAgICBBQ0NFTE1FTU9SWSkgLyAocmVzX21vZGUtPnhyZXMgKiByZXNfbW9kZS0+eXJlcykpIDwgdG1wKSB7CgkJdG1wID0KCQkgICAgKChjaGlwc19wYXJhbS0+bWF4X21lbSAtCgkJICAgICAgQUNDRUxNRU1PUlkpIC8gKHJlc19tb2RlLT54cmVzICogcmVzX21vZGUtPnlyZXMpKTsKCQlpZiAodG1wID09IDApIHsKCQkJcHJpbnRmCgkJCSAgICAoIk5vIG1hdGNoaW5nIHZpZGVvbW9kZSBmb3VuZCAuLT4gcmVkdWNlIHJlc29sdXRpb25cbiIpOwoJCQlyZXR1cm4gTlVMTDsKCQl9IGVsc2UgewoJCQlwcmludGYgKCJTd2l0Y2hpbmcgYmFjayB0byAlZCBCaXRzIHBlciBQaXhlbCAiLAoJCQkJdG1wIDw8IDMpOwoJCQliaXRzX3Blcl9waXhlbCA9IHRtcCA8PCAzOwoJCX0KCX0KCgkvKiBjYWxjdWxhdGUgaHN5bmNoIGFuZCB2c3luY2ggZnJlcSAoaW5mbyBvbmx5KSAqLwoJdDEgPSAocmVzX21vZGUtPmxlZnRfbWFyZ2luICsgcmVzX21vZGUtPnhyZXMgKwoJICAgICAgcmVzX21vZGUtPnJpZ2h0X21hcmdpbiArIHJlc19tb2RlLT5oc3luY19sZW4pIC8gODsKCXQxICo9IDg7Cgl0MSAqPSByZXNfbW9kZS0+cGl4Y2xvY2s7Cgl0MSAvPSAxMDAwOwoJaHN5bmNoID0gMTAwMDAwMDAwMEwgLyB0MTsKCXQxICo9CgkgICAgKHJlc19tb2RlLT51cHBlcl9tYXJnaW4gKyByZXNfbW9kZS0+eXJlcyArCgkgICAgIHJlc19tb2RlLT5sb3dlcl9tYXJnaW4gKyByZXNfbW9kZS0+dnN5bmNfbGVuKTsKCXQxIC89IDEwMDA7Cgl2c3luY2ggPSAxMDAwMDAwMDAwTCAvIHQxOwoKCS8qIGZpbGwgaW4gR3JhcGhpYyBkZXZpY2Ugc3RydWN0ICovCglzcHJpbnRmIChwR0QtPm1vZGVJZGVudCwgIiVkeCVkeCVkICVsZGtIeiAlbGRIeiIsIHJlc19tb2RlLT54cmVzLAoJCSByZXNfbW9kZS0+eXJlcywgYml0c19wZXJfcGl4ZWwsIChoc3luY2ggLyAxMDAwKSwKCQkgKHZzeW5jaCAvIDEwMDApKTsKCXByaW50ZiAoIiVzXG4iLCBwR0QtPm1vZGVJZGVudCk7CglwR0QtPndpblNpemVYID0gcmVzX21vZGUtPnhyZXM7CglwR0QtPndpblNpemVZID0gcmVzX21vZGUtPnlyZXM7CglwR0QtPnBsblNpemVYID0gcmVzX21vZGUtPnhyZXM7CglwR0QtPnBsblNpemVZID0gcmVzX21vZGUtPnlyZXM7Cglzd2l0Y2ggKGJpdHNfcGVyX3BpeGVsKSB7CgljYXNlIDg6CgkJcEdELT5nZGZCeXRlc1BQID0gMTsKCQlwR0QtPmdkZkluZGV4ID0gR0RGX184QklUX0lOREVYOwoJCWJyZWFrOwoJY2FzZSAxNToKCQlwR0QtPmdkZkJ5dGVzUFAgPSAyOwoJCXBHRC0+Z2RmSW5kZXggPSBHREZfMTVCSVRfNTU1UkdCOwoJCWJyZWFrOwoJY2FzZSAxNjoKCQlwR0QtPmdkZkJ5dGVzUFAgPSAyOwoJCXBHRC0+Z2RmSW5kZXggPSBHREZfMTZCSVRfNTY1UkdCOwoJCWJyZWFrOwoJY2FzZSAyNDoKCQlwR0QtPmdkZkJ5dGVzUFAgPSAzOwoJCXBHRC0+Z2RmSW5kZXggPSBHREZfMjRCSVRfODg4UkdCOwoJCWJyZWFrOwoJfQoJcEdELT5pc2FCYXNlID0gQ0ZHX0lTQV9JT19CQVNFX0FERFJFU1M7CglwR0QtPnBjaUJhc2UgPSBwY2lfbWVtX2Jhc2U7CglwR0QtPmZyYW1lQWRycyA9IHBjaV9tZW1fYmFzZTsKCXBHRC0+bWVtU2l6ZSA9IGNoaXBzX3BhcmFtLT5tYXhfbWVtOwoJLyogQ3Vyc29yIFN0YXJ0IEFkZHJlc3MgKi8KCXBHRC0+ZHByQmFzZSA9CgkgICAgKHBHRC0+d2luU2l6ZVggKiBwR0QtPndpblNpemVZICogcEdELT5nZGZCeXRlc1BQKSArIHBjaV9tZW1fYmFzZTsKCWlmICgocEdELT5kcHJCYXNlICYgMHgwZmZmKSAhPSAwKSB7CgkJLyogYWxsaWduIGl0ICovCgkJcEdELT5kcHJCYXNlICY9IDB4ZmZmZmYwMDA7CgkJcEdELT5kcHJCYXNlICs9IDB4MDAwMDEwMDA7Cgl9CglQUklOVEYgKCJDdXJzb3IgU3RhcnQgJXggUGF0dGVybiBTdGFydCAleFxuIiwgcEdELT5kcHJCYXNlLAoJCVBBVFRFUk5fQURSKTsKCXBHRC0+dnByQmFzZSA9IHBjaV9tZW1fYmFzZTsJLyogRHVtbXkgKi8KCXBHRC0+Y3ByQmFzZSA9IHBjaV9tZW1fYmFzZTsJLyogRHVtbXkgKi8KCS8qIHNldCB1cCBIYXJkd2FyZSAqLwoKI2lmZGVmIENPTkZJR19VU0VfQ1BDSURWSQoJaWYgKGRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX0NUXzY5MDMwKSB7CgkJY3RXcml0ZSAoQ1RfTVNSX1dfTywgMHgwYik7CgkJY3RXcml0ZSAoMHgzY2QsIDB4MTMpOwoJCWN0V3JpdGVfaSAoQ1RfRlBfTywgMHgwMiwgMHgwMCk7CgkJY3RXcml0ZV9pIChDVF9GUF9PLCAweDA1LCAweDAwKTsKCQljdFdyaXRlX2kgKENUX0ZQX08sIDB4MDYsIDB4MDApOwoJCWN0V3JpdGUgKDB4M2MyLCAweDBiKTsKCQljdFdyaXRlX2kgKENUX0ZQX08sIDB4MDIsIDB4MTApOwoJCWN0V3JpdGVfaSAoQ1RfRlBfTywgMHgwMSwgMHgwOSk7Cgl9IGVsc2UgewoJCWN0V3JpdGUgKENUX01TUl9XX08sIDB4MDEpOwoJfQojZWxzZQoJY3RXcml0ZSAoQ1RfTVNSX1dfTywgMHgwMSk7CiNlbmRpZgoKCS8qIHNldCB0aGUgZXh0ZW5kZWQgUmVnaXN0ZXJzICovCgljdExvYWRSZWdzIChDVF9YUl9PLCB4cmVnKTsKCS8qIHNldCBhdHJpYnV0ZSByZWdpc3RlcnMgKi8KCVNldEFyUmVncyAoKTsKCS8qIHNldCBHcmFwaGljcyByZWdpc3RlciAqLwoJU2V0R3JSZWdzICgpOwoJLyogc2V0IHNlcXVlbmNlciAqLwoJU2V0U3JSZWdzICgpOwoKCS8qIHNldCBtc3IgKi8KCVNldE1zclJlZ3MgKHJlc19tb2RlKTsKCgkvKiBzZXQgQ1JUIFJlZ2lzdGVycyAqLwoJU2V0Q3JSZWdzIChyZXNfbW9kZSwgYml0c19wZXJfcGl4ZWwpOwoJLyogc2V0IGNvbG9yIG1vZGUgKi8KCVNldEJpdHNQZXJQaXhlbEludG9YclJlZ3MgKGJpdHNfcGVyX3BpeGVsKTsKCgkvKiBzZXQgUExMICovCglGaW5kQW5kU2V0UGxsUGFyYW1JbnRvWHJSZWdzIChyZXNfbW9kZS0+cGl4Y2xvY2ssIGNoaXBzX3BhcmFtKTsKCgljdFdyaXRlX2kgKENUX1NSX08sIDAsIDB4MDMpOwkvKiBjbGVhciBzeW5jaHJvbm91cyByZXNldCAqLwoJLyogQ2xlYXIgdmlkZW8gbWVtb3J5ICovCglpID0gcEdELT5tZW1TaXplIC8gNDsKCXZtID0gKHVuc2lnbmVkIGludCAqKSBwR0QtPnBjaUJhc2U7Cgl3aGlsZSAoaS0tKQoJCSp2bSsrID0gMDsKCVNldERyYXdpbmdFbmdpbmUgKGJpdHNfcGVyX3BpeGVsKTsKI2lmZGVmIFZHQV9EVU1QX1JFRwoJdmlkZW9fZHVtcF9yZWcgKCk7CiNlbmRpZgoKCXJldHVybiAoKHZvaWQgKikgJmN0ZmIpOwp9CgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIFNldCBhIFJHQiBjb2xvciBpbiB0aGUgTFVUICg4IGJpdCBpbmRleCkKKi8Kdm9pZAp2aWRlb19zZXRfbHV0ICh1bnNpZ25lZCBpbnQgaW5kZXgsCS8qIGNvbG9yIG51bWJlciAqLwoJICAgICAgIHVuc2lnbmVkIGNoYXIgciwJLyogcmVkICovCgkgICAgICAgdW5zaWduZWQgY2hhciBnLAkvKiBncmVlbiAqLwoJICAgICAgIHVuc2lnbmVkIGNoYXIgYgkvKiBibHVlICovCiAgICApCnsKCgljdFdyaXRlIChDVF9MVVRfTUFTS19PLCAweGZmKTsKCgljdFdyaXRlIChDVF9MVVRfU1RBUlRfTywgKGNoYXIpIGluZGV4KTsKCgljdFdyaXRlIChDVF9MVVRfUkdCX08sIHIpOwkvKiByZWQgKi8KCWN0V3JpdGUgKENUX0xVVF9SR0JfTywgZyk7CS8qIGdyZWVuICovCgljdFdyaXRlIChDVF9MVVRfUkdCX08sIGIpOwkvKiBibHVlICovCgl1ZGVsYXkgKDEpOwoJY3RXcml0ZSAoQ1RfTFVUX01BU0tfTywgMHhmZik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBEcmF3aW5nIGVuZ2luZSBmaWxsIG9uIHNjcmVlbiByZWdpb24KKi8Kdm9pZAp2aWRlb19od19yZWN0ZmlsbCAodW5zaWduZWQgaW50IGJwcCwJLyogYnl0ZXMgcGVyIHBpeGVsICovCgkJICAgdW5zaWduZWQgaW50IGRzdF94LAkvKiBkZXN0IHBvcyB4ICovCgkJICAgdW5zaWduZWQgaW50IGRzdF95LAkvKiBkZXN0IHBvcyB5ICovCgkJICAgdW5zaWduZWQgaW50IGRpbV94LAkvKiBmcmFtZSB3aWR0aCAqLwoJCSAgIHVuc2lnbmVkIGludCBkaW1feSwJLyogZnJhbWUgaGVpZ2h0ICovCgkJICAgdW5zaWduZWQgaW50IGNvbG9yCS8qIGZpbGwgY29sb3IgKi8KICAgICkKewoJR3JhcGhpY0RldmljZSAqcEdEID0gKEdyYXBoaWNEZXZpY2UgKikgJiBjdGZiOwoJdW5zaWduZWQgbG9uZyAqcCwgYnIwNDsKCgl2aWRlb193YWl0X2JpdGJsdCAocEdELT5wY2lCYXNlICsgQlIwNF9vKTsKCglwID0gKHVuc2lnbmVkIGxvbmcgKikgUEFUVEVSTl9BRFI7CglkaW1feCAqPSBicHA7CglpZiAoYnBwID09IDMpCgkJYnBwKys7CQkvKiAyNEJpdCBuZWVkcyBhIDMyYml0IHBhdHRlcm4gKi8KCW1lbXNldCAocCwgY29sb3IsIChicHAgKiBzaXplb2YgKHVuc2lnbmVkIGNoYXIpICogOCAqIDgpKTsJLyogOCB4IDggcGF0dGVybiBkYXRhICovCglvdXQzMnIgKHBHRC0+cGNpQmFzZSArIEJSMDdfbywgKChwR0QtPndpblNpemVYICogZHN0X3kpICsgZHN0X3gpICogcEdELT5nZGZCeXRlc1BQKTsJLyogZGVzdGluYXRpb24gKi8KCWJyMDQgPSBpbjMyciAocEdELT5wY2lCYXNlICsgQlIwNF9vKSAmIDB4ZmZmZmZmMDA7CglicjA0IHw9IDB4RjA7CQkvKiB3cml0ZSBQYXR0ZXJuIFAgLT4gRCAqLwoJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA0X28sIGJyMDQpOwkvKiAqLwoJb3V0MzJyIChwR0QtPnBjaUJhc2UgKyBCUjA4X28sIChkaW1feSA8PCAxNikgKyBkaW1feCk7CS8qIHN0YXJ0cyB0aGUgQklUQmx0ICovCgl2aWRlb193YWl0X2JpdGJsdCAocEdELT5wY2lCYXNlICsgQlIwNF9vKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKgoqIERyYXdpbmcgZW5naW5lIGJpdGJsdCB3aXRoIHNjcmVlbiByZWdpb24KKi8Kdm9pZAp2aWRlb19od19iaXRibHQgKHVuc2lnbmVkIGludCBicHAsCS8qIGJ5dGVzIHBlciBwaXhlbCAqLwoJCSB1bnNpZ25lZCBpbnQgc3JjX3gsCS8qIHNvdXJjZSBwb3MgeCAqLwoJCSB1bnNpZ25lZCBpbnQgc3JjX3ksCS8qIHNvdXJjZSBwb3MgeSAqLwoJCSB1bnNpZ25lZCBpbnQgZHN0X3gsCS8qIGRlc3QgcG9zIHggKi8KCQkgdW5zaWduZWQgaW50IGRzdF95LAkvKiBkZXN0IHBvcyB5ICovCgkJIHVuc2lnbmVkIGludCBkaW1feCwJLyogZnJhbWUgd2lkdGggKi8KCQkgdW5zaWduZWQgaW50IGRpbV95CS8qIGZyYW1lIGhlaWdodCAqLwogICAgKQp7CglHcmFwaGljRGV2aWNlICpwR0QgPSAoR3JhcGhpY0RldmljZSAqKSAmIGN0ZmI7Cgl1bnNpZ25lZCBsb25nIGJyMDQ7CgoJYnIwNCA9IGluMzJyIChwR0QtPnBjaUJhc2UgKyBCUjA0X28pOwoKCS8qIHRvIHByZXZlbnQgZGF0YSBjb3JydXB0aW9uIGR1ZSB0byBvdmVybGFwLCB3ZSBoYXZlIHRvCgkgKiBmaW5kIG91dCBpZiwgYW5kIGhvdyB0aGUgZnJhbWVzIG92ZXJsYXBzICovCglpZiAoc3JjX3ggPCBkc3RfeCkgewoJCS8qIHNyYyBpcyBtb3JlIGxlZnQgdGhhbiBkZXN0CgkJICogdGhlIGZyYW1lIG1heSBvdmVybGFwIC0+IHN0YXJ0IGZyb20gcmlnaHQgdG8gbGVmdCAqLwoJCWJyMDQgfD0gMHgwMDAwMDEwMDsJLyogc2V0IGJpdCA4ICovCgkJc3JjX3ggKz0gZGltX3g7CgkJZHN0X3ggKz0gZGltX3g7Cgl9IGVsc2UgewoJCWJyMDQgJj0gMHhmZmZmZmVmZjsJLyogY2xlYXIgYml0IDggbGVmdCB0byByaWdodCAqLwoJfQoJaWYgKHNyY195IDwgZHN0X3kpIHsKCQkvKiBzcmMgaXMgaGlnaGVyIHRoYW4gZHN0CgkJICogdGhlIGZyYW1lIG1heSBvdmVybGFwID0+IHN0YXJ0IGZyb20gYm90dG9tICovCgkJYnIwNCB8PSAweDAwMDAwMjAwOwkvKiBzZXQgYml0IDkgKi8KCQlzcmNfeSArPSBkaW1feTsKCQlkc3RfeSArPSBkaW1feTsKCX0gZWxzZSB7CgkJYnIwNCAmPSAweGZmZmZmZGZmOwkvKiBjbGVhciBiaXQgOSB0b3AgdG8gYm90dG9tICovCgl9CglkaW1feCAqPSBicHA7CglvdXQzMnIgKHBHRC0+cGNpQmFzZSArIEJSMDZfbywgKChwR0QtPndpblNpemVYICogc3JjX3kpICsgc3JjX3gpICogcEdELT5nZGZCeXRlc1BQKTsJLyogc291cmNlICovCglvdXQzMnIgKHBHRC0+cGNpQmFzZSArIEJSMDdfbywgKChwR0QtPndpblNpemVYICogZHN0X3kpICsgZHN0X3gpICogcEdELT5nZGZCeXRlc1BQKTsJLyogZGVzdGluYXRpb24gKi8KCWJyMDQgJj0gMHhmZmZmZmYwMDsKCWJyMDQgfD0gMHgwMDAwMDBDQzsJLyogUyAtPiBEICovCglvdXQzMnIgKHBHRC0+cGNpQmFzZSArIEJSMDRfbywgYnIwNCk7CS8qICovCglvdXQzMnIgKHBHRC0+cGNpQmFzZSArIEJSMDhfbywgKGRpbV95IDw8IDE2KSArIGRpbV94KTsJLyogc3RhcnQgdGhlIEJJVEJsdCAqLwoJdmlkZW9fd2FpdF9iaXRibHQgKHBHRC0+cGNpQmFzZSArIEJSMDRfbyk7Cn0KCiNlbmRpZgkJCQkvKiBDT05GSUdfQ1Q2OTAwMCAqLwoKI2VuZGlmCQkJCS8qIENPTkZJR19WSURFTyAqLwo=