LyoKICAgIHZpYTY4NmEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKCQlmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwoKICAgIENvcHlyaWdodCAoYykgMTk5OCAtIDIwMDIgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCgkJCUt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKCQkJTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiwKCQkJYW5kIEJvYiBEb3VnaGVydHkgPGJvYmRAc3RhbmZvcmQuZWR1PgogICAgKFNvbWUgY29udmVyc2lvbi1mYWN0b3IgZGF0YSB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFRlaCBTb29uIFlldwogICAgPGoudGVoQGluYW1lLmNvbT4gYW5kIEFsZXggdmFuIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4uKQoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoqLwoKLyoKICAgIFN1cHBvcnRzIHRoZSBWaWEgVlQ4MkM2ODZBLCBWVDgyQzY4NkIgc291dGggYnJpZGdlcy4KICAgIFJlcG9ydHMgYWxsIGFzIGEgNjg2QS4KICAgIFdhcm5pbmcgLSBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGRldmljZS4KKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgojaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9od21vbi5oPgojaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCgovKiBJZiBmb3JjZV9hZGRyIGlzIHNldCB0byBhbnl0aGluZyBkaWZmZXJlbnQgZnJvbSAwLCB3ZSBmb3JjaWJseSBlbmFibGUKICAgdGhlIGRldmljZSBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gKi8Kc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2FkZHI7Cm1vZHVsZV9wYXJhbShmb3JjZV9hZGRyLCB1c2hvcnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2FkZHIsCgkJICJJbml0aWFsaXplIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHNlbnNvcnMiKTsKCnN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwoKLyoKICAgVGhlIFZpYSA2ODZhIHNvdXRoYnJpZGdlIGhhcyBhIExNNzgtbGlrZSBjaGlwIGludGVncmF0ZWQgb24gdGhlIHNhbWUgSUMuCiAgIFRoaXMgZHJpdmVyIGlzIGEgY3VzdG9taXplZCBjb3B5IG9mIGxtNzguYwoqLwoKLyogTWFueSBWSUE2ODZBIGNvbnN0YW50cyBzcGVjaWZpZWQgYmVsb3cgKi8KCi8qIExlbmd0aCBvZiBJU0EgYWRkcmVzcyBzZWdtZW50ICovCiNkZWZpbmUgVklBNjg2QV9FWFRFTlQJCTB4ODAKI2RlZmluZSBWSUE2ODZBX0JBU0VfUkVHCTB4NzAKI2RlZmluZSBWSUE2ODZBX0VOQUJMRV9SRUcJMHg3NAoKLyogVGhlIFZJQTY4NkEgcmVnaXN0ZXJzICovCi8qIGlucyBudW1iZXJlZCAwLTQgKi8KI2RlZmluZSBWSUE2ODZBX1JFR19JTl9NQVgobnIpCSgweDJiICsgKChucikgKiAyKSkKI2RlZmluZSBWSUE2ODZBX1JFR19JTl9NSU4obnIpCSgweDJjICsgKChucikgKiAyKSkKI2RlZmluZSBWSUE2ODZBX1JFR19JTihucikJKDB4MjIgKyAobnIpKQoKLyogZmFucyBudW1iZXJlZCAxLTIgKi8KI2RlZmluZSBWSUE2ODZBX1JFR19GQU5fTUlOKG5yKQkoMHgzYSArIChucikpCiNkZWZpbmUgVklBNjg2QV9SRUdfRkFOKG5yKQkoMHgyOCArIChucikpCgovKiB0ZW1wcyBudW1iZXJlZCAxLTMgKi8Kc3RhdGljIGNvbnN0IHU4IFZJQTY4NkFfUkVHX1RFTVBbXQk9IHsgMHgyMCwgMHgyMSwgMHgxZiB9OwpzdGF0aWMgY29uc3QgdTggVklBNjg2QV9SRUdfVEVNUF9PVkVSW10JPSB7IDB4MzksIDB4M2QsIDB4MWQgfTsKc3RhdGljIGNvbnN0IHU4IFZJQTY4NkFfUkVHX1RFTVBfSFlTVFtdCT0geyAweDNhLCAweDNlLCAweDFlIH07Ci8qIGJpdHMgNy02ICovCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9MT1cxCTB4NGIKLyogMiA9IGJpdHMgNS00LCAzID0gYml0cyA3LTYgKi8KI2RlZmluZSBWSUE2ODZBX1JFR19URU1QX0xPVzIzCTB4NDkKCiNkZWZpbmUgVklBNjg2QV9SRUdfQUxBUk0xCTB4NDEKI2RlZmluZSBWSUE2ODZBX1JFR19BTEFSTTIJMHg0MgojZGVmaW5lIFZJQTY4NkFfUkVHX0ZBTkRJVgkweDQ3CiNkZWZpbmUgVklBNjg2QV9SRUdfQ09ORklHCTB4NDAKLyogVGhlIGZvbGxvd2luZyByZWdpc3RlciBzZXRzIHRlbXAgaW50ZXJydXB0IG1vZGUgKGJpdHMgMS0wIGZvciB0ZW1wMSwKIDMtMiBmb3IgdGVtcDIsIDUtNCBmb3IgdGVtcDMpLiAgTW9kZXMgYXJlOgogICAgMDAgaW50ZXJydXB0IHN0YXlzIGFzIGxvbmcgYXMgdmFsdWUgaXMgb3V0LW9mLXJhbmdlCiAgICAwMSBpbnRlcnJ1cHQgaXMgY2xlYXJlZCBvbmNlIHJlZ2lzdGVyIGlzIHJlYWQgKGRlZmF1bHQpCiAgICAxMCBjb21wYXJhdG9yIG1vZGUtIGxpa2UgMDAsIGJ1dCBpZ25vcmVzIGh5c3RlcmVzaXMKICAgIDExIHNhbWUgYXMgMDAgKi8KI2RlZmluZSBWSUE2ODZBX1JFR19URU1QX01PREUJCTB4NGIKLyogV2UnbGwganVzdCBhc3N1bWUgdGhhdCB5b3Ugd2FudCB0byBzZXQgYWxsIDMgc2ltdWx0YW5lb3VzbHk6ICovCiNkZWZpbmUgVklBNjg2QV9URU1QX01PREVfTUFTSwkJMHgzRgojZGVmaW5lIFZJQTY4NkFfVEVNUF9NT0RFX0NPTlRJTlVPVVMJMHgwMAoKLyogQ29udmVyc2lvbnMuIExpbWl0IGNoZWNraW5nIGlzIG9ubHkgZG9uZSBvbiB0aGUgVE9fUkVHCiAgIHZhcmlhbnRzLgoKKioqKioqKioqIFZPTFRBR0UgQ09OVkVSU0lPTlMgKEJvYiBEb3VnaGVydHkpICoqKioqKioqCiBGcm9tIEhXTW9uLmNwcCAoQ29weXJpZ2h0IDE5OTgtMjAwMCBKb25hdGhhbiBUZWggU29vbiBZZXcpOgogdm9sdGFnZWZhY3RvclswXT0xLjI1LzI2Mjg7ICgyNjI4LzEuMjU9MjEwMi40KSAgIC8vIFZjY3AKIHZvbHRhZ2VmYWN0b3JbMV09MS4yNS8yNjI4OyAoMjYyOC8xLjI1PTIxMDIuNCkgICAvLyArMi41Vgogdm9sdGFnZWZhY3RvclsyXT0xLjY3LzI2Mjg7ICgyNjI4LzEuNjc9MTU3My43KSAgIC8vICszLjNWCiB2b2x0YWdlZmFjdG9yWzNdPTIuNi8yNjI4OyAgKDI2MjgvMi42MD0xMDEwLjgpICAgLy8gKzVWCiB2b2x0YWdlZmFjdG9yWzRdPTYuMy8yNjI4OyAgKDI2MjgvNi4zMD00MTcuMTQpICAgLy8gKzEyVgogaW5baV09KGRhdGFbaSsyXSoyNS4wKzEzMykqdm9sdGFnZWZhY3RvcltpXTsKIFRoYXQgaXM6CiB2b2x0cyA9ICgyNSpyZWdWYWwrMTMzKSpmYWN0b3IKIHJlZ1ZhbCA9ICh2b2x0cy9mYWN0b3ItMTMzKS8yNQogKFRoZXNlIGNvbnZlcnNpb25zIHdlcmUgY29udHJpYnV0ZWQgYnkgSm9uYXRoYW4gVGVoIFNvb24gWWV3CiA8ai50ZWhAaW5hbWUuY29tPikgKi8Kc3RhdGljIGlubGluZSB1OCBJTl9UT19SRUcobG9uZyB2YWwsIGludCBpbk51bSkKewoJLyogVG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQsIHdlIG11bHRpcGx5IGNvbnN0YW50cyBieSAxMCAoMTAwIGZvciArMTJWKS4KCSAgIFJvdW5kaW5nIGlzIGRvbmUgKDEyMDUwMCBpcyBhY3R1YWxseSAxMzMwMDAgLSAxMjUwMCkuCgkgICBSZW1lbWJlciB0aGF0IHZhbCBpcyBleHByZXNzZWQgaW4gMC4wMDFWL2JpdCwgd2hpY2ggaXMgd2h5IHdlIGRpdmlkZQoJICAgYnkgYW4gYWRkaXRpb25hbCAxMDAwMCAoMTAwMDAwIGZvciArMTJWKTogMTAwMCBmb3IgdmFsIGFuZCAxMCAoMTAwKQoJICAgZm9yIHRoZSBjb25zdGFudHMuICovCglpZiAoaW5OdW0gPD0gMSkKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAyMTAyNCAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMikKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAxNTczNyAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMykKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAxMDEwOCAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZQoJCXJldHVybiAodTgpCgkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDQxNzE0IC0gMTIwNTAwMDApIC8gMjUwMDAwMCwgMCwgMjU1KTsKfQoKc3RhdGljIGlubGluZSBsb25nIElOX0ZST01fUkVHKHU4IHZhbCwgaW50IGluTnVtKQp7CgkvKiBUbyBhdm9pZCBmbG9hdGluZyBwb2ludCwgd2UgbXVsdGlwbHkgY29uc3RhbnRzIGJ5IDEwICgxMDAgZm9yICsxMlYpLgoJICAgV2UgYWxzbyBtdWx0aXBseSB0aGVtIGJ5IDEwMDAgYmVjYXVzZSB3ZSB3YW50IDAuMDAxVi9iaXQgZm9yIHRoZQoJICAgb3V0cHV0IHZhbHVlLiBSb3VuZGluZyBpcyBkb25lLiAqLwoJaWYgKGluTnVtIDw9IDEpCgkJcmV0dXJuIChsb25nKSAoKDI1MDAwMCAqIHZhbCArIDEzMzAwMDAgKyAyMTAyNCAvIDIpIC8gMjEwMjQpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMikKCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwICogdmFsICsgMTMzMDAwMCArIDE1NzM3IC8gMikgLyAxNTczNyk7CgllbHNlIGlmIChpbk51bSA9PSAzKQoJCXJldHVybiAobG9uZykgKCgyNTAwMDAgKiB2YWwgKyAxMzMwMDAwICsgMTAxMDggLyAyKSAvIDEwMTA4KTsKCWVsc2UKCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwMCAqIHZhbCArIDEzMzAwMDAwICsgNDE3MTQgLyAyKSAvIDQxNzE0KTsKfQoKLyoqKioqKioqKiBGQU4gUlBNIENPTlZFUlNJT05TICoqKioqKioqLwovKiBIaWdoZXIgcmVnaXN0ZXIgdmFsdWVzID0gc2xvd2VyIGZhbnMgKHRoZSBmYW4ncyBzdHJvYmUgZ2F0ZXMgYSBjb3VudGVyKS4KIEJ1dCB0aGlzIGNoaXAgc2F0dXJhdGVzIGJhY2sgYXQgMCwgbm90IGF0IDI1NSBsaWtlIGFsbCB0aGUgb3RoZXIgY2hpcHMuCiBTbywgMCBtZWFucyAwIFJQTSAqLwpzdGF0aWMgaW5saW5lIHU4IEZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCnsKCWlmIChycG0gPT0gMCkKCQlyZXR1cm4gMDsKCXJwbSA9IFNFTlNPUlNfTElNSVQocnBtLCAxLCAxMDAwMDAwKTsKCXJldHVybiBTRU5TT1JTX0xJTUlUKCgxMzUwMDAwICsgcnBtICogZGl2IC8gMikgLyAocnBtICogZGl2KSwgMSwgMjU1KTsKfQoKI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikgKCh2YWwpPT0wPzA6KHZhbCk9PTI1NT8wOjEzNTAwMDAvKCh2YWwpKihkaXYpKSkKCi8qKioqKioqKiBURU1QIENPTlZFUlNJT05TIChCb2IgRG91Z2hlcnR5KSAqKioqKioqKiovCi8qIGxpbmVhciBmaXRzIGZyb20gSFdNb24uY3BwIChDb3B5cmlnaHQgMTk5OC0yMDAwIEpvbmF0aGFuIFRlaCBTb29uIFlldykKICAgICAgaWYodGVtcDwxNjkpCgkgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuNDI3LTMyLjA4OwogICAgICBlbHNlIGlmKHRlbXA+PTE2OSAmJiB0ZW1wPD0yMDIpCgkgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuNTgyLTU4LjE2OwogICAgICBlbHNlCgkgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuOTI0LTEyNy4zMzsKCiBBIGZpZnRoLW9yZGVyIHBvbHlub21pYWwgZml0cyB0aGUgdW5vZmZpY2lhbCBkYXRhIChwcm92aWRlZCBieSBBbGV4IHZhbgogS2FhbSA8ZGFya3NpZGVAY2hlbGxvLm5sPikgYSBiaXQgYmV0dGVyLiAgSXQgYWxzbyBnaXZlIG1vcmUgcmVhc29uYWJsZQogbnVtYmVycyBvbiBteSBtYWNoaW5lIChpZS4gdGhleSBhZ3JlZSB3aXRoIHdoYXQgbXkgQklPUyB0ZWxscyBtZSkuCiBIZXJlJ3MgdGhlIGZpZnRoLW9yZGVyIGZpdCB0byB0aGUgOC1iaXQgZGF0YToKIHRlbXAgPSAxLjYyNTA5M2UtMTAqdmFsXjUgLSAxLjAwMTYzMmUtMDcqdmFsXjQgKyAyLjQ1NzY1M2UtMDUqdmFsXjMgLQoJMi45Njc2MTllLTAzKnZhbF4yICsgMi4xNzUxNDRlLTAxKnZhbCAtIDcuMDkwMDY3ZSswLgoKICgyMDAwLTEwLTI1LSBSRkQ6IHRoYW5rcyB0byBVd2UgQW5kZXJzZW4gPHVhbmRlcnNlbkBtYXlhaC5jb20+IGZvcgogZmluZGluZyBteSB0eXBvcyBpbiB0aGlzIGZvcm11bGEhKQoKIEFsYXMsIG5vbmUgb2YgdGhlIGVsZWdhbnQgZnVuY3Rpb24tZml0IHNvbHV0aW9ucyB3aWxsIHdvcmsgYmVjYXVzZSB3ZQogYXJlbid0IGFsbG93ZWQgdG8gdXNlIGZsb2F0aW5nIHBvaW50IGluIHRoZSBrZXJuZWwgYW5kIGRvaW5nIGl0IHdpdGgKIGludGVnZXJzIGRvZXNuJ3QgcHJvdmlkZSBlbm91Z2ggcHJlY2lzaW9uLiAgU28gd2UnbGwgZG8gYm9yaW5nIG9sZAogbG9vay11cCB0YWJsZSBzdHVmZi4gIFRoZSB1bm9mZmljaWFsIGRhdGEgKHNlZSBiZWxvdykgaGF2ZSBlZmZlY3RpdmVseQogNy1iaXQgcmVzb2x1dGlvbiAodGhleSBhcmUgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBkZWdyZWUpLiAgSSdtIGFzc3VtaW5nCiB0aGF0IHRoZSB0cmFuc2ZlciBmdW5jdGlvbiBvZiB0aGUgZGV2aWNlIGlzIG1vbm90b25pYyBhbmQgc21vb3RoLCBzbyBhCiBzbW9vdGggZnVuY3Rpb24gZml0IHRvIHRoZSBkYXRhIHdpbGwgYWxsb3cgdXMgdG8gZ2V0IGJldHRlciBwcmVjaXNpb24uCiBJIHVzZWQgdGhlIDV0aC1vcmRlciBwb2x5IGZpdCBkZXNjcmliZWQgYWJvdmUgYW5kIHNvbHZlZCBmb3IKIFZJQSByZWdpc3RlciB2YWx1ZXMgMC0yNTUuICBJICoxMCBiZWZvcmUgcm91bmRpbmcsIHNvIHdlIGdldCB0ZW50aC1kZWdyZWUKIHByZWNpc2lvbi4gIChJIGNvdWxkIGhhdmUgZG9uZSBhbGwgMTAyNCB2YWx1ZXMgZm9yIG91ciAxMC1iaXQgcmVhZGluZ3MsCiBidXQgdGhlIGZ1bmN0aW9uIGlzIHZlcnkgbGluZWFyIGluIHRoZSB1c2VmdWwgcmFuZ2UgKDAtODAgZGVnIEMpLCBzbwogd2UnbGwganVzdCB1c2UgbGluZWFyIGludGVycG9sYXRpb24gZm9yIDEwLWJpdCByZWFkaW5ncy4pICBTbywgdGVtcExVVAogaXMgdGhlIHRlbXAgYXQgdmlhIHJlZ2lzdGVyIHZhbHVlcyAwLTI1NTogKi8Kc3RhdGljIGNvbnN0IHMxNiB0ZW1wTFVUW10gPQp7IC03MDksIC02ODgsIC02NjcsIC02NDYsIC02MjcsIC02MDcsIC01ODksIC01NzAsIC01NTMsIC01MzYsIC01MTksCgktNTAzLCAtNDg3LCAtNDcxLCAtNDU2LCAtNDQyLCAtNDI4LCAtNDE0LCAtNDAwLCAtMzg3LCAtMzc1LAoJLTM2MiwgLTM1MCwgLTMzOSwgLTMyNywgLTMxNiwgLTMwNSwgLTI5NSwgLTI4NSwgLTI3NSwgLTI2NSwKCS0yNTUsIC0yNDYsIC0yMzcsIC0yMjksIC0yMjAsIC0yMTIsIC0yMDQsIC0xOTYsIC0xODgsIC0xODAsCgktMTczLCAtMTY2LCAtMTU5LCAtMTUyLCAtMTQ1LCAtMTM5LCAtMTMyLCAtMTI2LCAtMTIwLCAtMTE0LAoJLTEwOCwgLTEwMiwgLTk2LCAtOTEsIC04NSwgLTgwLCAtNzQsIC02OSwgLTY0LCAtNTksIC01NCwgLTQ5LAoJLTQ0LCAtMzksIC0zNCwgLTI5LCAtMjUsIC0yMCwgLTE1LCAtMTEsIC02LCAtMiwgMywgNywgMTIsIDE2LAoJMjAsIDI1LCAyOSwgMzMsIDM3LCA0MiwgNDYsIDUwLCA1NCwgNTksIDYzLCA2NywgNzEsIDc1LCA3OSwgODQsCgk4OCwgOTIsIDk2LCAxMDAsIDEwNCwgMTA5LCAxMTMsIDExNywgMTIxLCAxMjUsIDEzMCwgMTM0LCAxMzgsCgkxNDIsIDE0NiwgMTUxLCAxNTUsIDE1OSwgMTYzLCAxNjgsIDE3MiwgMTc2LCAxODEsIDE4NSwgMTg5LAoJMTkzLCAxOTgsIDIwMiwgMjA2LCAyMTEsIDIxNSwgMjE5LCAyMjQsIDIyOCwgMjMyLCAyMzcsIDI0MSwKCTI0NSwgMjUwLCAyNTQsIDI1OSwgMjYzLCAyNjcsIDI3MiwgMjc2LCAyODEsIDI4NSwgMjkwLCAyOTQsCgkyOTksIDMwMywgMzA3LCAzMTIsIDMxNiwgMzIxLCAzMjUsIDMzMCwgMzM0LCAzMzksIDM0NCwgMzQ4LAoJMzUzLCAzNTcsIDM2MiwgMzY2LCAzNzEsIDM3NiwgMzgwLCAzODUsIDM5MCwgMzk1LCAzOTksIDQwNCwKCTQwOSwgNDE0LCA0MTksIDQyMywgNDI4LCA0MzMsIDQzOCwgNDQzLCA0NDksIDQ1NCwgNDU5LCA0NjQsCgk0NjksIDQ3NSwgNDgwLCA0ODYsIDQ5MSwgNDk3LCA1MDIsIDUwOCwgNTE0LCA1MjAsIDUyNiwgNTMyLAoJNTM4LCA1NDQsIDU1MSwgNTU3LCA1NjQsIDU3MSwgNTc4LCA1ODQsIDU5MiwgNTk5LCA2MDYsIDYxNCwKCTYyMSwgNjI5LCA2MzcsIDY0NSwgNjU0LCA2NjIsIDY3MSwgNjgwLCA2ODksIDY5OCwgNzA4LCA3MTgsCgk3MjgsIDczOCwgNzQ5LCA3NTksIDc3MCwgNzgyLCA3OTMsIDgwNSwgODE4LCA4MzAsIDg0MywgODU2LAoJODcwLCA4ODMsIDg5OCwgOTEyLCA5MjcsIDk0MywgOTU4LCA5NzUsIDk5MSwgMTAwOCwgMTAyNiwgMTA0NCwKCTEwNjIsIDEwODEsIDExMDEsIDExMjEsIDExNDEsIDExNjIsIDExODQsIDEyMDYsIDEyMjksIDEyNTIsCgkxMjc2LCAxMzAxLCAxMzI2LCAxMzUyLCAxMzc4LCAxNDA2LCAxNDM0LCAxNDYyCn07CgovKiB0aGUgb3JpZ2luYWwgTFVUIHZhbHVlcyBmcm9tIEFsZXggdmFuIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4KICAgKGZvciB2aWEgcmVnaXN0ZXIgdmFsdWVzIDEyLTI0MCk6CnstNTAsLTQ5LC00NywtNDUsLTQzLC00MSwtMzksLTM4LC0zNywtMzUsLTM0LC0zMywtMzIsLTMxLAotMzAsLTI5LC0yOCwtMjcsLTI2LC0yNSwtMjQsLTI0LC0yMywtMjIsLTIxLC0yMCwtMjAsLTE5LC0xOCwtMTcsLTE3LC0xNiwtMTUsCi0xNSwtMTQsLTE0LC0xMywtMTIsLTEyLC0xMSwtMTEsLTEwLC05LC05LC04LC04LC03LC03LC02LC02LC01LC01LC00LC00LC0zLAotMywtMiwtMiwtMSwtMSwwLDAsMSwxLDEsMywzLDMsNCw0LDQsNSw1LDUsNiw2LDcsNyw4LDgsOSw5LDksMTAsMTAsMTEsMTEsMTIsCjEyLDEyLDEzLDEzLDEzLDE0LDE0LDE1LDE1LDE2LDE2LDE2LDE3LDE3LDE4LDE4LDE5LDE5LDIwLDIwLDIxLDIxLDIxLDIyLDIyLAoyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNiwyNywyNywyNywyOCwyOCwyOSwyOSwzMCwzMCwzMCwzMSwzMSwzMiwzMiwzMywKMzMsMzQsMzQsMzUsMzUsMzUsMzYsMzYsMzcsMzcsMzgsMzgsMzksMzksNDAsNDAsNDEsNDEsNDIsNDIsNDMsNDMsNDQsNDQsNDUsCjQ1LDQ2LDQ2LDQ3LDQ4LDQ4LDQ5LDQ5LDUwLDUxLDUxLDUyLDUyLDUzLDUzLDU0LDU1LDU1LDU2LDU3LDU3LDU4LDU5LDU5LDYwLAo2MSw2Miw2Miw2Myw2NCw2NSw2Niw2Niw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw3NSw3Niw3Nyw3OCw3OSw4MCw4MSw4Myw4NCwKODUsODYsODgsODksOTEsOTIsOTQsOTYsOTcsOTksMTAxLDEwMywxMDUsMTA3LDEwOSwxMTB9OwoKCiBIZXJlJ3MgdGhlIHJldmVyc2UgTFVULiAgSSBnb3QgaXQgYnkgZG9pbmcgYSA2LXRoIG9yZGVyIHBvbHkgZml0IChuZWVkZWQKIGFuIGV4dHJhIHRlcm0gZm9yIGEgZ29vZCBmaXQgdG8gdGhlc2UgaW52ZXJzZSBkYXRhISkgYW5kIHRoZW4KIHNvbHZpbmcgZm9yIGVhY2ggdGVtcCB2YWx1ZSBmcm9tIC01MCB0byAxMTAgKHRoZSB1c2VhYmxlIHJhbmdlIGZvcgogdGhpcyBjaGlwKS4gIEhlcmUncyB0aGUgZml0OgogdmlhUmVnVmFsID0gLTEuMTYwMzcwZS0xMCp2YWxeNiArMy4xOTM2OTNlLTA4KnZhbF41IC0gMS40NjQ0NDdlLTA2KnZhbF40CiAtIDIuNTI1NDUzZS0wNCp2YWxeMyArIDEuNDI0NTkzZS0wMip2YWxeMiArIDIuMTQ4OTQxZSswMCp2YWwgKzcuMjc1ODA4ZSswMSkKIE5vdGUgdGhhdCBuPTE2MTogKi8Kc3RhdGljIGNvbnN0IHU4IHZpYUxVVFtdID0KeyAxMiwgMTIsIDEzLCAxNCwgMTQsIDE1LCAxNiwgMTYsIDE3LCAxOCwgMTgsIDE5LCAyMCwgMjAsIDIxLCAyMiwgMjMsCgkyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM1LCAzNiwgMzcsIDM5LCA0MCwKCTQxLCA0MywgNDUsIDQ2LCA0OCwgNDksIDUxLCA1MywgNTUsIDU3LCA1OSwgNjAsIDYyLCA2NCwgNjYsCgk2OSwgNzEsIDczLCA3NSwgNzcsIDc5LCA4MiwgODQsIDg2LCA4OCwgOTEsIDkzLCA5NSwgOTgsIDEwMCwKCTEwMywgMTA1LCAxMDcsIDExMCwgMTEyLCAxMTUsIDExNywgMTE5LCAxMjIsIDEyNCwgMTI2LCAxMjksCgkxMzEsIDEzNCwgMTM2LCAxMzgsIDE0MCwgMTQzLCAxNDUsIDE0NywgMTUwLCAxNTIsIDE1NCwgMTU2LAoJMTU4LCAxNjAsIDE2MiwgMTY0LCAxNjYsIDE2OCwgMTcwLCAxNzIsIDE3NCwgMTc2LCAxNzgsIDE4MCwKCTE4MiwgMTgzLCAxODUsIDE4NywgMTg4LCAxOTAsIDE5MiwgMTkzLCAxOTUsIDE5NiwgMTk4LCAxOTksCgkyMDAsIDIwMiwgMjAzLCAyMDUsIDIwNiwgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLAoJMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIyLCAyMjMsIDIyNCwKCTIyNSwgMjI2LCAyMjYsIDIyNywgMjI4LCAyMjgsIDIyOSwgMjMwLCAyMzAsIDIzMSwgMjMyLCAyMzIsCgkyMzMsIDIzMywgMjM0LCAyMzUsIDIzNSwgMjM2LCAyMzYsIDIzNywgMjM3LCAyMzgsIDIzOCwgMjM5LAoJMjM5LCAyNDAKfTsKCi8qIENvbnZlcnRpbmcgdGVtcHMgdG8gKDgtYml0KSBoeXN0IGFuZCBvdmVyIHJlZ2lzdGVycwogICBObyBpbnRlcnBvbGF0aW9uIGhlcmUuCiAgIFRoZSArNTAgaXMgYmVjYXVzZSB0aGUgdGVtcHMgc3RhcnQgYXQgLTUwICovCnN0YXRpYyBpbmxpbmUgdTggVEVNUF9UT19SRUcobG9uZyB2YWwpCnsKCXJldHVybiB2aWFMVVRbdmFsIDw9IC01MDAwMCA/IDAgOiB2YWwgPj0gMTEwMDAwID8gMTYwIDoKCQkgICAgICAodmFsIDwgMCA/IHZhbCAtIDUwMCA6IHZhbCArIDUwMCkgLyAxMDAwICsgNTBdOwp9CgovKiBmb3IgOC1iaXQgdGVtcGVyYXR1cmUgaHlzdCBhbmQgb3ZlciByZWdpc3RlcnMgKi8KI2RlZmluZSBURU1QX0ZST01fUkVHKHZhbCkJKChsb25nKXRlbXBMVVRbdmFsXSAqIDEwMCkKCi8qIGZvciAxMC1iaXQgdGVtcGVyYXR1cmUgcmVhZGluZ3MgKi8Kc3RhdGljIGlubGluZSBsb25nIFRFTVBfRlJPTV9SRUcxMCh1MTYgdmFsKQp7Cgl1MTYgZWlnaHRCaXRzID0gdmFsID4+IDI7Cgl1MTYgdHdvQml0cyA9IHZhbCAmIDM7CgoJLyogbm8gaW50ZXJwb2xhdGlvbiBmb3IgdGhlc2UgKi8KCWlmICh0d29CaXRzID09IDAgfHwgZWlnaHRCaXRzID09IDI1NSkKCQlyZXR1cm4gVEVNUF9GUk9NX1JFRyhlaWdodEJpdHMpOwoKCS8qIGRvIHNvbWUgbGluZWFyIGludGVycG9sYXRpb24gKi8KCXJldHVybiAodGVtcExVVFtlaWdodEJpdHNdICogKDQgLSB0d29CaXRzKSArCgkJdGVtcExVVFtlaWdodEJpdHMgKyAxXSAqIHR3b0JpdHMpICogMjU7Cn0KCiNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkgKDEgPDwgKHZhbCkpCiNkZWZpbmUgRElWX1RPX1JFRyh2YWwpICgodmFsKT09OD8zOih2YWwpPT00PzI6KHZhbCk9PTE/MDoxKQoKLyogRm9yIGVhY2ggcmVnaXN0ZXJlZCBjaGlwLCB3ZSBuZWVkIHRvIGtlZXAgc29tZSBkYXRhIGluIG1lbW9yeS4KICAgVGhlIHN0cnVjdHVyZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQuICovCnN0cnVjdCB2aWE2ODZhX2RhdGEgewoJdW5zaWduZWQgc2hvcnQgYWRkcjsKCWNvbnN0IGNoYXIgKm5hbWU7CglzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CglzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CgljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCgl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwoKCXU4IGluWzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGluX21heFs1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCgl1OCBpbl9taW5bNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTggZmFuWzJdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9taW5bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTE2IHRlbXBbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAxMCBiaXQgKi8KCXU4IHRlbXBfb3ZlclszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IHRlbXBfaHlzdFszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9kaXZbMl07CQkvKiBSZWdpc3RlciBlbmNvZGluZywgc2hpZnRlZCByaWdodCAqLwoJdTE2IGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLwp9OwoKc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpzX2JyaWRnZTsJLyogcG9pbnRlciB0byB0aGUgKG9ubHkpIHZpYTY4NmEgKi8KCnN0YXRpYyBpbnQgdmlhNjg2YV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKc3RhdGljIGludCBfX2RldmV4aXQgdmlhNjg2YV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CgpzdGF0aWMgaW5saW5lIGludCB2aWE2ODZhX3JlYWRfdmFsdWUoc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSwgdTggcmVnKQp7CglyZXR1cm4gaW5iX3AoZGF0YS0+YWRkciArIHJlZyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCB2aWE2ODZhX3dyaXRlX3ZhbHVlKHN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEsIHU4IHJlZywKCQkJCSAgICAgICB1OCB2YWx1ZSkKewoJb3V0Yl9wKHZhbHVlLCBkYXRhLT5hZGRyICsgcmVnKTsKfQoKc3RhdGljIHN0cnVjdCB2aWE2ODZhX2RhdGEgKnZpYTY4NmFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwpzdGF0aWMgdm9pZCB2aWE2ODZhX2luaXRfZGV2aWNlKHN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEpOwoKLyogZm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zICovCgovKiA3IHZvbHRhZ2Ugc2Vuc29ycyAqLwpzdGF0aWMgc3NpemVfdCBzaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAoJCWNoYXIgKmJ1ZikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKCWludCBuciA9IGF0dHItPmluZGV4OwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbltucl0sIG5yKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAoJCWNoYXIgKmJ1ZikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKCWludCBuciA9IGF0dHItPmluZGV4OwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbl9taW5bbnJdLCBucikpOwp9CgpzdGF0aWMgc3NpemVfdCBzaG93X2luX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKCQljaGFyICpidWYpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CglpbnQgbnIgPSBhdHRyLT5pbmRleDsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W25yXSwgbnIpKTsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwoJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKCWludCBuciA9IGF0dHItPmluZGV4OwoJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKCgltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglkYXRhLT5pbl9taW5bbnJdID0gSU5fVE9fUkVHKHZhbCwgbnIpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShkYXRhLCBWSUE2ODZBX1JFR19JTl9NSU4obnIpLAoJCQlkYXRhLT5pbl9taW5bbnJdKTsKCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CnN0YXRpYyBzc2l6ZV90IHNldF9pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCgkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CglpbnQgbnIgPSBhdHRyLT5pbmRleDsKCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CgoJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+aW5fbWF4W25yXSA9IElOX1RPX1JFRyh2YWwsIG5yKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoZGF0YSwgVklBNjg2QV9SRUdfSU5fTUFYKG5yKSwKCQkJZGF0YS0+aW5fbWF4W25yXSk7CgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQojZGVmaW5lIHNob3dfaW5fb2Zmc2V0KG9mZnNldCkJCQkJCVwKc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sCQlcCgkJc2hvd19pbiwgTlVMTCwgb2Zmc2V0KTsJCQkJXApzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLAlcCgkJc2hvd19pbl9taW4sIHNldF9pbl9taW4sIG9mZnNldCk7CQlcCnN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCVwKCQlzaG93X2luX21heCwgc2V0X2luX21heCwgb2Zmc2V0KTsKCnNob3dfaW5fb2Zmc2V0KDApOwpzaG93X2luX29mZnNldCgxKTsKc2hvd19pbl9vZmZzZXQoMik7CnNob3dfaW5fb2Zmc2V0KDMpOwpzaG93X2luX29mZnNldCg0KTsKCi8qIDMgdGVtcGVyYXR1cmVzICovCnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKCQljaGFyICpidWYpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CglpbnQgbnIgPSBhdHRyLT5pbmRleDsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRzEwKGRhdGEtPnRlbXBbbnJdKSk7Cn0Kc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX292ZXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCgkJY2hhciAqYnVmKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOwoJaW50IG5yID0gYXR0ci0+aW5kZXg7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9vdmVyW25yXSkpOwp9CnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAoJCWNoYXIgKmJ1ZikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKCWludCBuciA9IGF0dHItPmluZGV4OwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaHlzdFtucl0pKTsKfQpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAoJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CglzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOwoJaW50IG5yID0gYXR0ci0+aW5kZXg7CglpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKCgltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglkYXRhLT50ZW1wX292ZXJbbnJdID0gVEVNUF9UT19SRUcodmFsKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoZGF0YSwgVklBNjg2QV9SRUdfVEVNUF9PVkVSW25yXSwKCQkJICAgIGRhdGEtPnRlbXBfb3Zlcltucl0pOwoJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0Kc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwoJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKCWludCBuciA9IGF0dHItPmluZGV4OwoJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CgoJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+dGVtcF9oeXN0W25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGRhdGEsIFZJQTY4NkFfUkVHX1RFTVBfSFlTVFtucl0sCgkJCSAgICBkYXRhLT50ZW1wX2h5c3RbbnJdKTsKCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CiNkZWZpbmUgc2hvd190ZW1wX29mZnNldChvZmZzZXQpCQkJCQlcCnN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sCQlcCgkJc2hvd190ZW1wLCBOVUxMLCBvZmZzZXQgLSAxKTsJCQkJXApzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAjI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCVwKCQlzaG93X3RlbXBfb3Zlciwgc2V0X3RlbXBfb3Zlciwgb2Zmc2V0IC0gMSk7CQlcCnN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4X2h5c3QsIFNfSVJVR08gfCBTX0lXVVNSLAlcCgkJc2hvd190ZW1wX2h5c3QsIHNldF90ZW1wX2h5c3QsIG9mZnNldCAtIDEpOwoKc2hvd190ZW1wX29mZnNldCgxKTsKc2hvd190ZW1wX29mZnNldCgyKTsKc2hvd190ZW1wX29mZnNldCgzKTsKCi8qIDIgRmFucyAqLwpzdGF0aWMgc3NpemVfdCBzaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKCQljaGFyICpidWYpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CglpbnQgbnIgPSBhdHRyLT5pbmRleDsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuW25yXSwKCQkJCURJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpICk7Cn0Kc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAoJCWNoYXIgKmJ1ZikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKCWludCBuciA9IGF0dHItPmluZGV4OwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCgkJRkFOX0ZST01fUkVHKGRhdGEtPmZhbl9taW5bbnJdLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKSApOwp9CnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKCQljaGFyICpidWYpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CglpbnQgbnIgPSBhdHRyLT5pbmRleDsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pICk7Cn0Kc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCgkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkYSk7CglpbnQgbnIgPSBhdHRyLT5pbmRleDsKCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoKCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShkYXRhLCBWSUE2ODZBX1JFR19GQU5fTUlOKG5yKzEpLCBkYXRhLT5mYW5fbWluW25yXSk7CgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQpzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkYSwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwoJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKCWludCBuciA9IGF0dHItPmluZGV4OwoJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CglpbnQgb2xkOwoKCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCW9sZCA9IHZpYTY4NmFfcmVhZF92YWx1ZShkYXRhLCBWSUE2ODZBX1JFR19GQU5ESVYpOwoJZGF0YS0+ZmFuX2Rpdltucl0gPSBESVZfVE9fUkVHKHZhbCk7CglvbGQgPSAob2xkICYgMHgwZikgfCAoZGF0YS0+ZmFuX2RpdlsxXSA8PCA2KSB8IChkYXRhLT5mYW5fZGl2WzBdIDw8IDQpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShkYXRhLCBWSUE2ODZBX1JFR19GQU5ESVYsIG9sZCk7CgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQoKI2RlZmluZSBzaG93X2Zhbl9vZmZzZXQob2Zmc2V0KQkJCQkJCVwKc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLAkJCVwKCQlzaG93X2ZhbiwgTlVMTCwgb2Zmc2V0IC0gMSk7CQkJCVwKc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX21pbiwgU19JUlVHTyB8IFNfSVdVU1IsCQlcCgkJc2hvd19mYW5fbWluLCBzZXRfZmFuX21pbiwgb2Zmc2V0IC0gMSk7CQkJXApzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfZGl2LCBTX0lSVUdPIHwgU19JV1VTUiwJCVwKCQlzaG93X2Zhbl9kaXYsIHNldF9mYW5fZGl2LCBvZmZzZXQgLSAxKTsKCnNob3dfZmFuX29mZnNldCgxKTsKc2hvd19mYW5fb2Zmc2V0KDIpOwoKLyogQWxhcm1zICovCnN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPmFsYXJtcyk7Cn0Kc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOwoKc3RhdGljIHNzaXplX3Qgc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKCQkJICpkZXZhdHRyLCBjaGFyICpidWYpCnsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBkYXRhLT5uYW1lKTsKfQpzdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgc2hvd19uYW1lLCBOVUxMKTsKCnN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2aWE2ODZhX2F0dHJpYnV0ZXNbXSA9IHsKCSZzZW5zb3JfZGV2X2F0dHJfaW4wX2lucHV0LmRldl9hdHRyLmF0dHIsCgkmc2Vuc29yX2Rldl9hdHRyX2luMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAoJJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKCSZzZW5zb3JfZGV2X2F0dHJfaW4zX2lucHV0LmRldl9hdHRyLmF0dHIsCgkmc2Vuc29yX2Rldl9hdHRyX2luNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAoJJnNlbnNvcl9kZXZfYXR0cl9pbjBfbWluLmRldl9hdHRyLmF0dHIsCgkmc2Vuc29yX2Rldl9hdHRyX2luMV9taW4uZGV2X2F0dHIuYXR0ciwKCSZzZW5zb3JfZGV2X2F0dHJfaW4yX21pbi5kZXZfYXR0ci5hdHRyLAoJJnNlbnNvcl9kZXZfYXR0cl9pbjNfbWluLmRldl9hdHRyLmF0dHIsCgkmc2Vuc29yX2Rldl9hdHRyX2luNF9taW4uZGV2X2F0dHIuYXR0ciwKCSZzZW5zb3JfZGV2X2F0dHJfaW4wX21heC5kZXZfYXR0ci5hdHRyLAoJJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWF4LmRldl9hdHRyLmF0dHIsCgkmc2Vuc29yX2Rldl9hdHRyX2luMl9tYXguZGV2X2F0dHIuYXR0ciwKCSZzZW5zb3JfZGV2X2F0dHJfaW4zX21heC5kZXZfYXR0ci5hdHRyLAoJJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWF4LmRldl9hdHRyLmF0dHIsCgoJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAoJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAoJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19pbnB1dC5kZXZfYXR0ci5hdHRyLAoJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyLmF0dHIsCgkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21heC5kZXZfYXR0ci5hdHRyLAoJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXhfaHlzdC5kZXZfYXR0ci5hdHRyLAoJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXhfaHlzdC5kZXZfYXR0ci5hdHRyLAoJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXhfaHlzdC5kZXZfYXR0ci5hdHRyLAoKCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAoJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCgkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfbWluLmRldl9hdHRyLmF0dHIsCgkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfbWluLmRldl9hdHRyLmF0dHIsCgkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfZGl2LmRldl9hdHRyLmF0dHIsCgkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfZGl2LmRldl9hdHRyLmF0dHIsCgoJJmRldl9hdHRyX2FsYXJtcy5hdHRyLAoJJmRldl9hdHRyX25hbWUuYXR0ciwKCU5VTEwKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZpYTY4NmFfZ3JvdXAgPSB7CgkuYXR0cnMgPSB2aWE2ODZhX2F0dHJpYnV0ZXMsCn07CgpzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB2aWE2ODZhX2RyaXZlciA9IHsKCS5kcml2ZXIgPSB7CgkJLm93bmVyCT0gVEhJU19NT0RVTEUsCgkJLm5hbWUJPSAidmlhNjg2YSIsCgl9LAoJLnByb2JlCQk9IHZpYTY4NmFfcHJvYmUsCgkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHZpYTY4NmFfcmVtb3ZlKSwKfTsKCgovKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkICovCnN0YXRpYyBpbnQgX19kZXZpbml0IHZpYTY4NmFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YTsKCXN0cnVjdCByZXNvdXJjZSAqcmVzOwoJaW50IGVycjsKCgkvKiBSZXNlcnZlIHRoZSBJU0EgcmVnaW9uICovCglyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JTywgMCk7CglpZiAoIXJlcXVlc3RfcmVnaW9uKHJlcy0+c3RhcnQsIFZJQTY4NkFfRVhURU5ULAoJCQkgICAgdmlhNjg2YV9kcml2ZXIuZHJpdmVyLm5hbWUpKSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAiUmVnaW9uIDB4JWx4LTB4JWx4IGFscmVhZHkgaW4gdXNlIVxuIiwKCQkJKHVuc2lnbmVkIGxvbmcpcmVzLT5zdGFydCwgKHVuc2lnbmVkIGxvbmcpcmVzLT5lbmQpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCWlmICghKGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdmlhNjg2YV9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CgkJZXJyID0gLUVOT01FTTsKCQlnb3RvIGV4aXRfcmVsZWFzZTsKCX0KCglwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKCWRhdGEtPmFkZHIgPSByZXMtPnN0YXJ0OwoJZGF0YS0+bmFtZSA9ICJ2aWE2ODZhIjsKCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCgkvKiBJbml0aWFsaXplIHRoZSBWSUE2ODZBIGNoaXAgKi8KCXZpYTY4NmFfaW5pdF9kZXZpY2UoZGF0YSk7CgoJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KCWlmICgoZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJnZpYTY4NmFfZ3JvdXApKSkKCQlnb3RvIGV4aXRfZnJlZTsKCglkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldik7CglpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CgkJZ290byBleGl0X3JlbW92ZV9maWxlczsKCX0KCglyZXR1cm4gMDsKCmV4aXRfcmVtb3ZlX2ZpbGVzOgoJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJnZpYTY4NmFfZ3JvdXApOwpleGl0X2ZyZWU6CglrZnJlZShkYXRhKTsKZXhpdF9yZWxlYXNlOgoJcmVsZWFzZV9yZWdpb24ocmVzLT5zdGFydCwgVklBNjg2QV9FWFRFTlQpOwoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludCBfX2RldmV4aXQgdmlhNjg2YV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwoKCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CglzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmdmlhNjg2YV9ncm91cCk7CgoJcmVsZWFzZV9yZWdpb24oZGF0YS0+YWRkciwgVklBNjg2QV9FWFRFTlQpOwoJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CglrZnJlZShkYXRhKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgX19kZXZpbml0IHZpYTY4NmFfaW5pdF9kZXZpY2Uoc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSkKewoJdTggcmVnOwoKCS8qIFN0YXJ0IG1vbml0b3JpbmcgKi8KCXJlZyA9IHZpYTY4NmFfcmVhZF92YWx1ZShkYXRhLCBWSUE2ODZBX1JFR19DT05GSUcpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShkYXRhLCBWSUE2ODZBX1JFR19DT05GSUcsIChyZWcgfCAweDAxKSAmIDB4N0YpOwoKCS8qIENvbmZpZ3VyZSB0ZW1wIGludGVycnVwdCBtb2RlIGZvciBjb250aW51b3VzLWludGVycnVwdCBvcGVyYXRpb24gKi8KCXJlZyA9IHZpYTY4NmFfcmVhZF92YWx1ZShkYXRhLCBWSUE2ODZBX1JFR19URU1QX01PREUpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShkYXRhLCBWSUE2ODZBX1JFR19URU1QX01PREUsCgkJCSAgICAocmVnICYgflZJQTY4NkFfVEVNUF9NT0RFX01BU0spCgkJCSAgICB8IFZJQTY4NkFfVEVNUF9NT0RFX0NPTlRJTlVPVVMpOwp9CgpzdGF0aWMgc3RydWN0IHZpYTY4NmFfZGF0YSAqdmlhNjg2YV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwoJaW50IGk7CgoJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoKCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICsgSFogLyAyKQoJICAgIHx8ICFkYXRhLT52YWxpZCkgewoJCWZvciAoaSA9IDA7IGkgPD0gNDsgaSsrKSB7CgkJCWRhdGEtPmluW2ldID0KCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShkYXRhLCBWSUE2ODZBX1JFR19JTihpKSk7CgkJCWRhdGEtPmluX21pbltpXSA9IHZpYTY4NmFfcmVhZF92YWx1ZShkYXRhLAoJCQkJCQkJICAgICBWSUE2ODZBX1JFR19JTl9NSU4KCQkJCQkJCSAgICAgKGkpKTsKCQkJZGF0YS0+aW5fbWF4W2ldID0KCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShkYXRhLCBWSUE2ODZBX1JFR19JTl9NQVgoaSkpOwoJCX0KCQlmb3IgKGkgPSAxOyBpIDw9IDI7IGkrKykgewoJCQlkYXRhLT5mYW5baSAtIDFdID0KCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShkYXRhLCBWSUE2ODZBX1JFR19GQU4oaSkpOwoJCQlkYXRhLT5mYW5fbWluW2kgLSAxXSA9IHZpYTY4NmFfcmVhZF92YWx1ZShkYXRhLAoJCQkJCQkgICAgIFZJQTY4NkFfUkVHX0ZBTl9NSU4oaSkpOwoJCX0KCQlmb3IgKGkgPSAwOyBpIDw9IDI7IGkrKykgewoJCQlkYXRhLT50ZW1wW2ldID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGRhdGEsCgkJCQkJCSBWSUE2ODZBX1JFR19URU1QW2ldKSA8PCAyOwoJCQlkYXRhLT50ZW1wX292ZXJbaV0gPQoJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGRhdGEsCgkJCQkJICAgICAgIFZJQTY4NkFfUkVHX1RFTVBfT1ZFUltpXSk7CgkJCWRhdGEtPnRlbXBfaHlzdFtpXSA9CgkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoZGF0YSwKCQkJCQkgICAgICAgVklBNjg2QV9SRUdfVEVNUF9IWVNUW2ldKTsKCQl9CgkJLyogYWRkIGluIGxvd2VyIDIgYml0cwoJCSAgIHRlbXAxIHVzZXMgYml0cyA3LTYgb2YgVklBNjg2QV9SRUdfVEVNUF9MT1cxCgkJICAgdGVtcDIgdXNlcyBiaXRzIDUtNCBvZiBWSUE2ODZBX1JFR19URU1QX0xPVzIzCgkJICAgdGVtcDMgdXNlcyBiaXRzIDctNiBvZiBWSUE2ODZBX1JFR19URU1QX0xPVzIzCgkJICovCgkJZGF0YS0+dGVtcFswXSB8PSAodmlhNjg2YV9yZWFkX3ZhbHVlKGRhdGEsCgkJCQkJCSAgICAgVklBNjg2QV9SRUdfVEVNUF9MT1cxKQoJCQkJICAmIDB4YzApID4+IDY7CgkJZGF0YS0+dGVtcFsxXSB8PQoJCSAgICAodmlhNjg2YV9yZWFkX3ZhbHVlKGRhdGEsIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMpICYKCQkgICAgIDB4MzApID4+IDQ7CgkJZGF0YS0+dGVtcFsyXSB8PQoJCSAgICAodmlhNjg2YV9yZWFkX3ZhbHVlKGRhdGEsIFZJQTY4NkFfUkVHX1RFTVBfTE9XMjMpICYKCQkgICAgIDB4YzApID4+IDY7CgoJCWkgPSB2aWE2ODZhX3JlYWRfdmFsdWUoZGF0YSwgVklBNjg2QV9SRUdfRkFORElWKTsKCQlkYXRhLT5mYW5fZGl2WzBdID0gKGkgPj4gNCkgJiAweDAzOwoJCWRhdGEtPmZhbl9kaXZbMV0gPSBpID4+IDY7CgkJZGF0YS0+YWxhcm1zID0KCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGRhdGEsCgkJCQkgICAgICAgVklBNjg2QV9SRUdfQUxBUk0xKSB8CgkJICAgICh2aWE2ODZhX3JlYWRfdmFsdWUoZGF0YSwgVklBNjg2QV9SRUdfQUxBUk0yKSA8PCA4KTsKCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOwoJCWRhdGEtPnZhbGlkID0gMTsKCX0KCgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCglyZXR1cm4gZGF0YTsKfQoKc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZpYTY4NmFfcGNpX2lkc1tdID0gewoJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODZfNCkgfSwKCXsgMCwgfQp9OwoKTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHZpYTY4NmFfcGNpX2lkcyk7CgpzdGF0aWMgaW50IF9fZGV2aW5pdCB2aWE2ODZhX2RldmljZV9hZGQodW5zaWduZWQgc2hvcnQgYWRkcmVzcykKewoJc3RydWN0IHJlc291cmNlIHJlcyA9IHsKCQkuc3RhcnQJPSBhZGRyZXNzLAoJCS5lbmQJPSBhZGRyZXNzICsgVklBNjg2QV9FWFRFTlQgLSAxLAoJCS5uYW1lCT0gInZpYTY4NmEiLAoJCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCgl9OwoJaW50IGVycjsKCglwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ2aWE2ODZhIiwgYWRkcmVzcyk7CglpZiAoIXBkZXYpIHsKCQllcnIgPSAtRU5PTUVNOwoJCXByaW50ayhLRVJOX0VSUiAidmlhNjg2YTogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKCQlnb3RvIGV4aXQ7Cgl9CgoJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CglpZiAoZXJyKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ2aWE2ODZhOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKCQkgICAgICAgIiglZClcbiIsIGVycik7CgkJZ290byBleGl0X2RldmljZV9wdXQ7Cgl9CgoJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKCWlmIChlcnIpIHsKCQlwcmludGsoS0VSTl9FUlIgInZpYTY4NmE6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwKCQkgICAgICAgZXJyKTsKCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKCX0KCglyZXR1cm4gMDsKCmV4aXRfZGV2aWNlX3B1dDoKCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7CmV4aXQ6CglyZXR1cm4gZXJyOwp9CgpzdGF0aWMgaW50IF9fZGV2aW5pdCB2aWE2ODZhX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAoJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKewoJdTE2IGFkZHJlc3MsIHZhbDsKCglpZiAoZm9yY2VfYWRkcikgewoJCWFkZHJlc3MgPSBmb3JjZV9hZGRyICYgfihWSUE2ODZBX0VYVEVOVCAtIDEpOwoJCWRldl93YXJuKCZkZXYtPmRldiwgIkZvcmNpbmcgSVNBIGFkZHJlc3MgMHgleFxuIiwgYWRkcmVzcyk7CgkJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQoJCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBWSUE2ODZBX0JBU0VfUkVHLCBhZGRyZXNzIHwgMSkpCgkJCXJldHVybiAtRU5PREVWOwoJfQoJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQoJICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgVklBNjg2QV9CQVNFX1JFRywgJnZhbCkpCgkJcmV0dXJuIC1FTk9ERVY7CgoJYWRkcmVzcyA9IHZhbCAmIH4oVklBNjg2QV9FWFRFTlQgLSAxKTsKCWlmIChhZGRyZXNzID09IDApIHsKCQlkZXZfZXJyKCZkZXYtPmRldiwgImJhc2UgYWRkcmVzcyBub3Qgc2V0IC0gdXBncmFkZSBCSU9TICIKCQkJIm9yIHVzZSBmb3JjZV9hZGRyPTB4YWRkclxuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQoJICAgIHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgVklBNjg2QV9FTkFCTEVfUkVHLCAmdmFsKSkKCQlyZXR1cm4gLUVOT0RFVjsKCWlmICghKHZhbCAmIDB4MDAwMSkpIHsKCQlpZiAoIWZvcmNlX2FkZHIpIHsKCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiU2Vuc29ycyBkaXNhYmxlZCwgZW5hYmxlICIKCQkJCSAid2l0aCBmb3JjZV9hZGRyPTB4JXhcbiIsIGFkZHJlc3MpOwoJCQlyZXR1cm4gLUVOT0RFVjsKCQl9CgoJCWRldl93YXJuKCZkZXYtPmRldiwgIkVuYWJsaW5nIHNlbnNvcnNcbiIpOwoJCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCQkgICAgcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgVklBNjg2QV9FTkFCTEVfUkVHLAoJCQkJCSAgdmFsIHwgMHgwMDAxKSkKCQkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdmlhNjg2YV9kcml2ZXIpKQoJCWdvdG8gZXhpdDsKCgkvKiBTZXRzIGdsb2JhbCBwZGV2IGFzIGEgc2lkZSBlZmZlY3QgKi8KCWlmICh2aWE2ODZhX2RldmljZV9hZGQoYWRkcmVzcykpCgkJZ290byBleGl0X3VucmVnaXN0ZXI7CgoJLyogQWx3YXlzIHJldHVybiBmYWlsdXJlIGhlcmUuICBUaGlzIGlzIHRvIGFsbG93IG90aGVyIGRyaXZlcnMgdG8gYmluZAoJICogdG8gdGhpcyBwY2kgZGV2aWNlLiAgV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gaGF2ZSBjb250cm9sIG92ZXIgdGhlCgkgKiBwY2kgZGV2aWNlLCB3ZSBvbmx5IHdhbnRlZCB0byByZWFkIGFzIGZldyByZWdpc3RlciB2YWx1ZXMgZnJvbSBpdC4KCSAqLwoJc19icmlkZ2UgPSBwY2lfZGV2X2dldChkZXYpOwoJcmV0dXJuIC1FTk9ERVY7CgpleGl0X3VucmVnaXN0ZXI6CglwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdmlhNjg2YV9kcml2ZXIpOwpleGl0OgoJcmV0dXJuIC1FTk9ERVY7Cn0KCnN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2aWE2ODZhX3BjaV9kcml2ZXIgPSB7CgkubmFtZQkJPSAidmlhNjg2YSIsCgkuaWRfdGFibGUJPSB2aWE2ODZhX3BjaV9pZHMsCgkucHJvYmUJCT0gdmlhNjg2YV9wY2lfcHJvYmUsCn07CgpzdGF0aWMgaW50IF9faW5pdCBzbV92aWE2ODZhX2luaXQodm9pZCkKewoJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZpYTY4NmFfcGNpX2RyaXZlcik7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBzbV92aWE2ODZhX2V4aXQodm9pZCkKewoJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2aWE2ODZhX3BjaV9kcml2ZXIpOwoJaWYgKHNfYnJpZGdlICE9IE5VTEwpIHsKCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdmlhNjg2YV9kcml2ZXIpOwoJCXBjaV9kZXZfcHV0KHNfYnJpZGdlKTsKCQlzX2JyaWRnZSA9IE5VTEw7Cgl9Cn0KCk1PRFVMRV9BVVRIT1IoIkt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwgIgoJICAgICAgIk1hcmsgU3R1ZGViYWtlciA8bWRzeHl6MTIzQHlhaG9vLmNvbT4gIgoJICAgICAgImFuZCBCb2IgRG91Z2hlcnR5IDxib2JkQHN0YW5mb3JkLmVkdT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJWSUEgNjg2QSBTZW5zb3IgZGV2aWNlIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9pbml0KHNtX3ZpYTY4NmFfaW5pdCk7Cm1vZHVsZV9leGl0KHNtX3ZpYTY4NmFfZXhpdCk7Cg==