LyoKICAgIHZpYTY4NmEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMKICAgICAgICAgICAgICAgIGZvciBoYXJkd2FyZSBtb25pdG9yaW5nCiAgICAgICAgICAgICAgICAKICAgIENvcHlyaWdodCAoYykgMTk5OCAtIDIwMDIgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCiAgICAgICAgICAgICAgICAgICAgICAgIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwKCQkJTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiwKCQkJYW5kIEJvYiBEb3VnaGVydHkgPGJvYmRAc3RhbmZvcmQuZWR1PgogICAgKFNvbWUgY29udmVyc2lvbi1mYWN0b3IgZGF0YSB3ZXJlIGNvbnRyaWJ1dGVkIGJ5IEpvbmF0aGFuIFRlaCBTb29uIFlldyAKICAgIDxqLnRlaEBpbmFtZS5jb20+IGFuZCBBbGV4IHZhbiBLYWFtIDxkYXJrc2lkZUBjaGVsbG8ubmw+LikKCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKi8KCi8qCiAgICBTdXBwb3J0cyB0aGUgVmlhIFZUODJDNjg2QSwgVlQ4MkM2ODZCIHNvdXRoIGJyaWRnZXMuCiAgICBSZXBvcnRzIGFsbCBhcyBhIDY4NkEuCiAgICBXYXJuaW5nIC0gb25seSBzdXBwb3J0cyBhIHNpbmdsZSBkZXZpY2UuCiovCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgojaW5jbHVkZSA8bGludXgvaTJjLXNlbnNvci5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CgoKLyogSWYgZm9yY2VfYWRkciBpcyBzZXQgdG8gYW55dGhpbmcgZGlmZmVyZW50IGZyb20gMCwgd2UgZm9yY2libHkgZW5hYmxlCiAgIHRoZSBkZXZpY2UgYXQgdGhlIGdpdmVuIGFkZHJlc3MuICovCnN0YXRpYyB1bnNpZ25lZCBzaG9ydCBmb3JjZV9hZGRyID0gMDsKbW9kdWxlX3BhcmFtKGZvcmNlX2FkZHIsIHVzaG9ydCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoZm9yY2VfYWRkciwKCQkgIkluaXRpYWxpemUgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgc2Vuc29ycyIpOwoKLyogQWRkcmVzc2VzIHRvIHNjYW4uCiAgIE5vdGUgdGhhdCB3ZSBjYW4ndCBkZXRlcm1pbmUgdGhlIElTQSBhZGRyZXNzIHVudGlsIHdlIGhhdmUgaW5pdGlhbGl6ZWQKICAgb3VyIG1vZHVsZSAqLwpzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9OwpzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgMHgwMDAwLCBJMkNfQ0xJRU5UX0lTQV9FTkQgfTsKCi8qIEluc21vZCBwYXJhbWV0ZXJzICovClNFTlNPUlNfSU5TTU9EXzEodmlhNjg2YSk7CgovKgogICBUaGUgVmlhIDY4NmEgc291dGhicmlkZ2UgaGFzIGEgTE03OC1saWtlIGNoaXAgaW50ZWdyYXRlZCBvbiB0aGUgc2FtZSBJQy4KICAgVGhpcyBkcml2ZXIgaXMgYSBjdXN0b21pemVkIGNvcHkgb2YgbG03OC5jCiovCgovKiBNYW55IFZJQTY4NkEgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAqLwoKLyogTGVuZ3RoIG9mIElTQSBhZGRyZXNzIHNlZ21lbnQgKi8KI2RlZmluZSBWSUE2ODZBX0VYVEVOVCAweDgwCiNkZWZpbmUgVklBNjg2QV9CQVNFX1JFRyAweDcwCiNkZWZpbmUgVklBNjg2QV9FTkFCTEVfUkVHIDB4NzQKCi8qIFRoZSBWSUE2ODZBIHJlZ2lzdGVycyAqLwovKiBpbnMgbnVtYmVyZWQgMC00ICovCiNkZWZpbmUgVklBNjg2QV9SRUdfSU5fTUFYKG5yKSAoMHgyYiArICgobnIpICogMikpCiNkZWZpbmUgVklBNjg2QV9SRUdfSU5fTUlOKG5yKSAoMHgyYyArICgobnIpICogMikpCiNkZWZpbmUgVklBNjg2QV9SRUdfSU4obnIpICAgICAoMHgyMiArIChucikpCgovKiBmYW5zIG51bWJlcmVkIDEtMiAqLwojZGVmaW5lIFZJQTY4NkFfUkVHX0ZBTl9NSU4obnIpICgweDNhICsgKG5yKSkKI2RlZmluZSBWSUE2ODZBX1JFR19GQU4obnIpICAgICAoMHgyOCArIChucikpCgovKiB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgYXMgc3BlY2VkIGJ5IFZJQTogKi8Kc3RhdGljIGNvbnN0IHU4IHJlZ3RlbXBbXSA9IHsgMHgyMCwgMHgyMSwgMHgxZiB9OwpzdGF0aWMgY29uc3QgdTggcmVnb3ZlcltdID0geyAweDM5LCAweDNkLCAweDFkIH07CnN0YXRpYyBjb25zdCB1OCByZWdoeXN0W10gPSB7IDB4M2EsIDB4M2UsIDB4MWUgfTsKCi8qIHRlbXBzIG51bWJlcmVkIDEtMyAqLwojZGVmaW5lIFZJQTY4NkFfUkVHX1RFTVAobnIpCQkocmVndGVtcFtucl0pCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9PVkVSKG5yKQkocmVnb3Zlcltucl0pCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9IWVNUKG5yKQkocmVnaHlzdFtucl0pCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9MT1cxCTB4NGIJLy8gYml0cyA3LTYKI2RlZmluZSBWSUE2ODZBX1JFR19URU1QX0xPVzIzCTB4NDkJLy8gMiA9IGJpdHMgNS00LCAzID0gYml0cyA3LTYKCiNkZWZpbmUgVklBNjg2QV9SRUdfQUxBUk0xIDB4NDEKI2RlZmluZSBWSUE2ODZBX1JFR19BTEFSTTIgMHg0MgojZGVmaW5lIFZJQTY4NkFfUkVHX0ZBTkRJViAweDQ3CiNkZWZpbmUgVklBNjg2QV9SRUdfQ09ORklHIDB4NDAKLyogVGhlIGZvbGxvd2luZyByZWdpc3RlciBzZXRzIHRlbXAgaW50ZXJydXB0IG1vZGUgKGJpdHMgMS0wIGZvciB0ZW1wMSwgCiAzLTIgZm9yIHRlbXAyLCA1LTQgZm9yIHRlbXAzKS4gIE1vZGVzIGFyZToKICAgIDAwIGludGVycnVwdCBzdGF5cyBhcyBsb25nIGFzIHZhbHVlIGlzIG91dC1vZi1yYW5nZQogICAgMDEgaW50ZXJydXB0IGlzIGNsZWFyZWQgb25jZSByZWdpc3RlciBpcyByZWFkIChkZWZhdWx0KQogICAgMTAgY29tcGFyYXRvciBtb2RlLSBsaWtlIDAwLCBidXQgaWdub3JlcyBoeXN0ZXJlc2lzCiAgICAxMSBzYW1lIGFzIDAwICovCiNkZWZpbmUgVklBNjg2QV9SRUdfVEVNUF9NT0RFIDB4NGIKLyogV2UnbGwganVzdCBhc3N1bWUgdGhhdCB5b3Ugd2FudCB0byBzZXQgYWxsIDMgc2ltdWx0YW5lb3VzbHk6ICovCiNkZWZpbmUgVklBNjg2QV9URU1QX01PREVfTUFTSyAweDNGCiNkZWZpbmUgVklBNjg2QV9URU1QX01PREVfQ09OVElOVU9VUyAoMHgwMCkKCi8qIENvbnZlcnNpb25zLiBMaW1pdCBjaGVja2luZyBpcyBvbmx5IGRvbmUgb24gdGhlIFRPX1JFRwogICB2YXJpYW50cy4gCgoqKioqKioqKiogVk9MVEFHRSBDT05WRVJTSU9OUyAoQm9iIERvdWdoZXJ0eSkgKioqKioqKioKIEZyb20gSFdNb24uY3BwIChDb3B5cmlnaHQgMTk5OC0yMDAwIEpvbmF0aGFuIFRlaCBTb29uIFlldyk6CiB2b2x0YWdlZmFjdG9yWzBdPTEuMjUvMjYyODsgKDI2MjgvMS4yNT0yMTAyLjQpICAgLy8gVmNjcAogdm9sdGFnZWZhY3RvclsxXT0xLjI1LzI2Mjg7ICgyNjI4LzEuMjU9MjEwMi40KSAgIC8vICsyLjVWCiB2b2x0YWdlZmFjdG9yWzJdPTEuNjcvMjYyODsgKDI2MjgvMS42Nz0xNTczLjcpICAgLy8gKzMuM1YKIHZvbHRhZ2VmYWN0b3JbM109Mi42LzI2Mjg7ICAoMjYyOC8yLjYwPTEwMTAuOCkgICAvLyArNVYKIHZvbHRhZ2VmYWN0b3JbNF09Ni4zLzI2Mjg7ICAoMjYyOC82LjMwPTQxNy4xNCkgICAvLyArMTJWCiBpbltpXT0oZGF0YVtpKzJdKjI1LjArMTMzKSp2b2x0YWdlZmFjdG9yW2ldOwogVGhhdCBpczoKIHZvbHRzID0gKDI1KnJlZ1ZhbCsxMzMpKmZhY3RvcgogcmVnVmFsID0gKHZvbHRzL2ZhY3Rvci0xMzMpLzI1CiAoVGhlc2UgY29udmVyc2lvbnMgd2VyZSBjb250cmlidXRlZCBieSBKb25hdGhhbiBUZWggU29vbiBZZXcgCiA8ai50ZWhAaW5hbWUuY29tPikgKi8Kc3RhdGljIGlubGluZSB1OCBJTl9UT19SRUcobG9uZyB2YWwsIGludCBpbk51bSkKewoJLyogVG8gYXZvaWQgZmxvYXRpbmcgcG9pbnQsIHdlIG11bHRpcGx5IGNvbnN0YW50cyBieSAxMCAoMTAwIGZvciArMTJWKS4KCSAgIFJvdW5kaW5nIGlzIGRvbmUgKDEyMDUwMCBpcyBhY3R1YWxseSAxMzMwMDAgLSAxMjUwMCkuCgkgICBSZW1lbWJlciB0aGF0IHZhbCBpcyBleHByZXNzZWQgaW4gMC4wMDFWL2JpdCwgd2hpY2ggaXMgd2h5IHdlIGRpdmlkZQoJICAgYnkgYW4gYWRkaXRpb25hbCAxMDAwMCAoMTAwMDAwIGZvciArMTJWKTogMTAwMCBmb3IgdmFsIGFuZCAxMCAoMTAwKQoJICAgZm9yIHRoZSBjb25zdGFudHMuICovCglpZiAoaW5OdW0gPD0gMSkKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAyMTAyNCAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMikKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAxNTczNyAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMykKCQlyZXR1cm4gKHU4KQoJCSAgICBTRU5TT1JTX0xJTUlUKCh2YWwgKiAxMDEwOCAtIDEyMDUwMDApIC8gMjUwMDAwLCAwLCAyNTUpOwoJZWxzZQoJCXJldHVybiAodTgpCgkJICAgIFNFTlNPUlNfTElNSVQoKHZhbCAqIDQxNzE0IC0gMTIwNTAwMDApIC8gMjUwMDAwMCwgMCwgMjU1KTsKfQoKc3RhdGljIGlubGluZSBsb25nIElOX0ZST01fUkVHKHU4IHZhbCwgaW50IGluTnVtKQp7CgkvKiBUbyBhdm9pZCBmbG9hdGluZyBwb2ludCwgd2UgbXVsdGlwbHkgY29uc3RhbnRzIGJ5IDEwICgxMDAgZm9yICsxMlYpLgoJICAgV2UgYWxzbyBtdWx0aXBseSB0aGVtIGJ5IDEwMDAgYmVjYXVzZSB3ZSB3YW50IDAuMDAxVi9iaXQgZm9yIHRoZQoJICAgb3V0cHV0IHZhbHVlLiBSb3VuZGluZyBpcyBkb25lLiAqLwoJaWYgKGluTnVtIDw9IDEpCgkJcmV0dXJuIChsb25nKSAoKDI1MDAwMCAqIHZhbCArIDEzMzAwMDAgKyAyMTAyNCAvIDIpIC8gMjEwMjQpOwoJZWxzZSBpZiAoaW5OdW0gPT0gMikKCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwICogdmFsICsgMTMzMDAwMCArIDE1NzM3IC8gMikgLyAxNTczNyk7CgllbHNlIGlmIChpbk51bSA9PSAzKQoJCXJldHVybiAobG9uZykgKCgyNTAwMDAgKiB2YWwgKyAxMzMwMDAwICsgMTAxMDggLyAyKSAvIDEwMTA4KTsKCWVsc2UKCQlyZXR1cm4gKGxvbmcpICgoMjUwMDAwMCAqIHZhbCArIDEzMzAwMDAwICsgNDE3MTQgLyAyKSAvIDQxNzE0KTsKfQoKLyoqKioqKioqKiBGQU4gUlBNIENPTlZFUlNJT05TICoqKioqKioqLwovKiBIaWdoZXIgcmVnaXN0ZXIgdmFsdWVzID0gc2xvd2VyIGZhbnMgKHRoZSBmYW4ncyBzdHJvYmUgZ2F0ZXMgYSBjb3VudGVyKS4KIEJ1dCB0aGlzIGNoaXAgc2F0dXJhdGVzIGJhY2sgYXQgMCwgbm90IGF0IDI1NSBsaWtlIGFsbCB0aGUgb3RoZXIgY2hpcHMuCiBTbywgMCBtZWFucyAwIFJQTSAqLwpzdGF0aWMgaW5saW5lIHU4IEZBTl9UT19SRUcobG9uZyBycG0sIGludCBkaXYpCnsKCWlmIChycG0gPT0gMCkKCQlyZXR1cm4gMDsKCXJwbSA9IFNFTlNPUlNfTElNSVQocnBtLCAxLCAxMDAwMDAwKTsKCXJldHVybiBTRU5TT1JTX0xJTUlUKCgxMzUwMDAwICsgcnBtICogZGl2IC8gMikgLyAocnBtICogZGl2KSwgMSwgMjU1KTsKfQoKI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikgKCh2YWwpPT0wPzA6KHZhbCk9PTI1NT8wOjEzNTAwMDAvKCh2YWwpKihkaXYpKSkKCi8qKioqKioqKiBURU1QIENPTlZFUlNJT05TIChCb2IgRG91Z2hlcnR5KSAqKioqKioqKiovCi8qIGxpbmVhciBmaXRzIGZyb20gSFdNb24uY3BwIChDb3B5cmlnaHQgMTk5OC0yMDAwIEpvbmF0aGFuIFRlaCBTb29uIFlldykKICAgICAgaWYodGVtcDwxNjkpCiAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZSh0ZW1wKSowLjQyNy0zMi4wODsKICAgICAgZWxzZSBpZih0ZW1wPj0xNjkgJiYgdGVtcDw9MjAyKQogICAgICAgICAgICAgIHJldHVybiBkb3VibGUodGVtcCkqMC41ODItNTguMTY7CiAgICAgIGVsc2UKICAgICAgICAgICAgICByZXR1cm4gZG91YmxlKHRlbXApKjAuOTI0LTEyNy4zMzsKCiBBIGZpZnRoLW9yZGVyIHBvbHlub21pYWwgZml0cyB0aGUgdW5vZmZpY2lhbCBkYXRhIChwcm92aWRlZCBieSBBbGV4IHZhbiAKIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4pIGEgYml0IGJldHRlci4gIEl0IGFsc28gZ2l2ZSBtb3JlIHJlYXNvbmFibGUgCiBudW1iZXJzIG9uIG15IG1hY2hpbmUgKGllLiB0aGV5IGFncmVlIHdpdGggd2hhdCBteSBCSU9TIHRlbGxzIG1lKS4gIAogSGVyZSdzIHRoZSBmaWZ0aC1vcmRlciBmaXQgdG8gdGhlIDgtYml0IGRhdGE6CiB0ZW1wID0gMS42MjUwOTNlLTEwKnZhbF41IC0gMS4wMDE2MzJlLTA3KnZhbF40ICsgMi40NTc2NTNlLTA1KnZhbF4zIC0gCiAgICAgICAgMi45Njc2MTllLTAzKnZhbF4yICsgMi4xNzUxNDRlLTAxKnZhbCAtIDcuMDkwMDY3ZSswLgoKICgyMDAwLTEwLTI1LSBSRkQ6IHRoYW5rcyB0byBVd2UgQW5kZXJzZW4gPHVhbmRlcnNlbkBtYXlhaC5jb20+IGZvciAKIGZpbmRpbmcgbXkgdHlwb3MgaW4gdGhpcyBmb3JtdWxhISkKCiBBbGFzLCBub25lIG9mIHRoZSBlbGVnYW50IGZ1bmN0aW9uLWZpdCBzb2x1dGlvbnMgd2lsbCB3b3JrIGJlY2F1c2Ugd2UgCiBhcmVuJ3QgYWxsb3dlZCB0byB1c2UgZmxvYXRpbmcgcG9pbnQgaW4gdGhlIGtlcm5lbCBhbmQgZG9pbmcgaXQgd2l0aCAKIGludGVnZXJzIGRvZXNuJ3QgcnBvdmlkZSBlbm91Z2ggcHJlY2lzaW9uLiAgU28gd2UnbGwgZG8gYm9yaW5nIG9sZCAKIGxvb2stdXAgdGFibGUgc3R1ZmYuICBUaGUgdW5vZmZpY2lhbCBkYXRhIChzZWUgYmVsb3cpIGhhdmUgZWZmZWN0aXZlbHkgCiA3LWJpdCByZXNvbHV0aW9uICh0aGV5IGFyZSByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGRlZ3JlZSkuICBJJ20gYXNzdW1pbmcgCiB0aGF0IHRoZSB0cmFuc2ZlciBmdW5jdGlvbiBvZiB0aGUgZGV2aWNlIGlzIG1vbm90b25pYyBhbmQgc21vb3RoLCBzbyBhIAogc21vb3RoIGZ1bmN0aW9uIGZpdCB0byB0aGUgZGF0YSB3aWxsIGFsbG93IHVzIHRvIGdldCBiZXR0ZXIgcHJlY2lzaW9uLiAgCiBJIHVzZWQgdGhlIDV0aC1vcmRlciBwb2x5IGZpdCBkZXNjcmliZWQgYWJvdmUgYW5kIHNvbHZlZCBmb3IKIFZJQSByZWdpc3RlciB2YWx1ZXMgMC0yNTUuICBJICoxMCBiZWZvcmUgcm91bmRpbmcsIHNvIHdlIGdldCB0ZW50aC1kZWdyZWUgCiBwcmVjaXNpb24uICAoSSBjb3VsZCBoYXZlIGRvbmUgYWxsIDEwMjQgdmFsdWVzIGZvciBvdXIgMTAtYml0IHJlYWRpbmdzLCAKIGJ1dCB0aGUgZnVuY3Rpb24gaXMgdmVyeSBsaW5lYXIgaW4gdGhlIHVzZWZ1bCByYW5nZSAoMC04MCBkZWcgQyksIHNvIAogd2UnbGwganVzdCB1c2UgbGluZWFyIGludGVycG9sYXRpb24gZm9yIDEwLWJpdCByZWFkaW5ncy4pICBTbywgdGVtcExVVCAKIGlzIHRoZSB0ZW1wIGF0IHZpYSByZWdpc3RlciB2YWx1ZXMgMC0yNTU6ICovCnN0YXRpYyBjb25zdCBsb25nIHRlbXBMVVRbXSA9CiAgICB7IC03MDksIC02ODgsIC02NjcsIC02NDYsIC02MjcsIC02MDcsIC01ODksIC01NzAsIC01NTMsIC01MzYsIC01MTksCgkgICAgLTUwMywgLTQ4NywgLTQ3MSwgLTQ1NiwgLTQ0MiwgLTQyOCwgLTQxNCwgLTQwMCwgLTM4NywgLTM3NSwKCSAgICAtMzYyLCAtMzUwLCAtMzM5LCAtMzI3LCAtMzE2LCAtMzA1LCAtMjk1LCAtMjg1LCAtMjc1LCAtMjY1LAoJICAgIC0yNTUsIC0yNDYsIC0yMzcsIC0yMjksIC0yMjAsIC0yMTIsIC0yMDQsIC0xOTYsIC0xODgsIC0xODAsCgkgICAgLTE3MywgLTE2NiwgLTE1OSwgLTE1MiwgLTE0NSwgLTEzOSwgLTEzMiwgLTEyNiwgLTEyMCwgLTExNCwKCSAgICAtMTA4LCAtMTAyLCAtOTYsIC05MSwgLTg1LCAtODAsIC03NCwgLTY5LCAtNjQsIC01OSwgLTU0LCAtNDksCgkgICAgLTQ0LCAtMzksIC0zNCwgLTI5LCAtMjUsIC0yMCwgLTE1LCAtMTEsIC02LCAtMiwgMywgNywgMTIsIDE2LAoJICAgIDIwLCAyNSwgMjksIDMzLCAzNywgNDIsIDQ2LCA1MCwgNTQsIDU5LCA2MywgNjcsIDcxLCA3NSwgNzksIDg0LAoJICAgIDg4LCA5MiwgOTYsIDEwMCwgMTA0LCAxMDksIDExMywgMTE3LCAxMjEsIDEyNSwgMTMwLCAxMzQsIDEzOCwKCSAgICAxNDIsIDE0NiwgMTUxLCAxNTUsIDE1OSwgMTYzLCAxNjgsIDE3MiwgMTc2LCAxODEsIDE4NSwgMTg5LAoJICAgIDE5MywgMTk4LCAyMDIsIDIwNiwgMjExLCAyMTUsIDIxOSwgMjI0LCAyMjgsIDIzMiwgMjM3LCAyNDEsCgkgICAgMjQ1LCAyNTAsIDI1NCwgMjU5LCAyNjMsIDI2NywgMjcyLCAyNzYsIDI4MSwgMjg1LCAyOTAsIDI5NCwKCSAgICAyOTksIDMwMywgMzA3LCAzMTIsIDMxNiwgMzIxLCAzMjUsIDMzMCwgMzM0LCAzMzksIDM0NCwgMzQ4LAoJICAgIDM1MywgMzU3LCAzNjIsIDM2NiwgMzcxLCAzNzYsIDM4MCwgMzg1LCAzOTAsIDM5NSwgMzk5LCA0MDQsCgkgICAgNDA5LCA0MTQsIDQxOSwgNDIzLCA0MjgsIDQzMywgNDM4LCA0NDMsIDQ0OSwgNDU0LCA0NTksIDQ2NCwKCSAgICA0NjksIDQ3NSwgNDgwLCA0ODYsIDQ5MSwgNDk3LCA1MDIsIDUwOCwgNTE0LCA1MjAsIDUyNiwgNTMyLAoJICAgIDUzOCwgNTQ0LCA1NTEsIDU1NywgNTY0LCA1NzEsIDU3OCwgNTg0LCA1OTIsIDU5OSwgNjA2LCA2MTQsCgkgICAgNjIxLCA2MjksIDYzNywgNjQ1LCA2NTQsIDY2MiwgNjcxLCA2ODAsIDY4OSwgNjk4LCA3MDgsIDcxOCwKCSAgICA3MjgsIDczOCwgNzQ5LCA3NTksIDc3MCwgNzgyLCA3OTMsIDgwNSwgODE4LCA4MzAsIDg0MywgODU2LAoJICAgIDg3MCwgODgzLCA4OTgsIDkxMiwgOTI3LCA5NDMsIDk1OCwgOTc1LCA5OTEsIDEwMDgsIDEwMjYsIDEwNDQsCgkgICAgMTA2MiwgMTA4MSwgMTEwMSwgMTEyMSwgMTE0MSwgMTE2MiwgMTE4NCwgMTIwNiwgMTIyOSwgMTI1MiwKCSAgICAxMjc2LCAxMzAxLCAxMzI2LCAxMzUyLCAxMzc4LCAxNDA2LCAxNDM0LCAxNDYyCn07CgovKiB0aGUgb3JpZ2luYWwgTFVUIHZhbHVlcyBmcm9tIEFsZXggdmFuIEthYW0gPGRhcmtzaWRlQGNoZWxsby5ubD4gCiAgIChmb3IgdmlhIHJlZ2lzdGVyIHZhbHVlcyAxMi0yNDApOgp7LTUwLC00OSwtNDcsLTQ1LC00MywtNDEsLTM5LC0zOCwtMzcsLTM1LC0zNCwtMzMsLTMyLC0zMSwKLTMwLC0yOSwtMjgsLTI3LC0yNiwtMjUsLTI0LC0yNCwtMjMsLTIyLC0yMSwtMjAsLTIwLC0xOSwtMTgsLTE3LC0xNywtMTYsLTE1LAotMTUsLTE0LC0xNCwtMTMsLTEyLC0xMiwtMTEsLTExLC0xMCwtOSwtOSwtOCwtOCwtNywtNywtNiwtNiwtNSwtNSwtNCwtNCwtMywKLTMsLTIsLTIsLTEsLTEsMCwwLDEsMSwxLDMsMywzLDQsNCw0LDUsNSw1LDYsNiw3LDcsOCw4LDksOSw5LDEwLDEwLDExLDExLDEyLAoxMiwxMiwxMywxMywxMywxNCwxNCwxNSwxNSwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMSwyMiwyMiwKMjIsMjMsMjMsMjQsMjQsMjUsMjUsMjYsMjYsMjYsMjcsMjcsMjcsMjgsMjgsMjksMjksMzAsMzAsMzAsMzEsMzEsMzIsMzIsMzMsCjMzLDM0LDM0LDM1LDM1LDM1LDM2LDM2LDM3LDM3LDM4LDM4LDM5LDM5LDQwLDQwLDQxLDQxLDQyLDQyLDQzLDQzLDQ0LDQ0LDQ1LAo0NSw0Niw0Niw0Nyw0OCw0OCw0OSw0OSw1MCw1MSw1MSw1Miw1Miw1Myw1Myw1NCw1NSw1NSw1Niw1Nyw1Nyw1OCw1OSw1OSw2MCwKNjEsNjIsNjIsNjMsNjQsNjUsNjYsNjYsNjcsNjgsNjksNzAsNzEsNzIsNzMsNzQsNzUsNzYsNzcsNzgsNzksODAsODEsODMsODQsCjg1LDg2LDg4LDg5LDkxLDkyLDk0LDk2LDk3LDk5LDEwMSwxMDMsMTA1LDEwNywxMDksMTEwfTsKCgogSGVyZSdzIHRoZSByZXZlcnNlIExVVC4gIEkgZ290IGl0IGJ5IGRvaW5nIGEgNi10aCBvcmRlciBwb2x5IGZpdCAobmVlZGVkCiBhbiBleHRyYSB0ZXJtIGZvciBhIGdvb2QgZml0IHRvIHRoZXNlIGludmVyc2UgZGF0YSEpIGFuZCB0aGVuIAogc29sdmluZyBmb3IgZWFjaCB0ZW1wIHZhbHVlIGZyb20gLTUwIHRvIDExMCAodGhlIHVzZWFibGUgcmFuZ2UgZm9yIAogdGhpcyBjaGlwKS4gIEhlcmUncyB0aGUgZml0OiAKIHZpYVJlZ1ZhbCA9IC0xLjE2MDM3MGUtMTAqdmFsXjYgKzMuMTkzNjkzZS0wOCp2YWxeNSAtIDEuNDY0NDQ3ZS0wNip2YWxeNCAKIC0gMi41MjU0NTNlLTA0KnZhbF4zICsgMS40MjQ1OTNlLTAyKnZhbF4yICsgMi4xNDg5NDFlKzAwKnZhbCArNy4yNzU4MDhlKzAxKQogTm90ZSB0aGF0IG49MTYxOiAqLwpzdGF0aWMgY29uc3QgdTggdmlhTFVUW10gPQogICAgeyAxMiwgMTIsIDEzLCAxNCwgMTQsIDE1LCAxNiwgMTYsIDE3LCAxOCwgMTgsIDE5LCAyMCwgMjAsIDIxLCAyMiwgMjMsCgkgICAgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNSwgMzYsIDM3LCAzOSwgNDAsCgkgICAgNDEsIDQzLCA0NSwgNDYsIDQ4LCA0OSwgNTEsIDUzLCA1NSwgNTcsIDU5LCA2MCwgNjIsIDY0LCA2NiwKCSAgICA2OSwgNzEsIDczLCA3NSwgNzcsIDc5LCA4MiwgODQsIDg2LCA4OCwgOTEsIDkzLCA5NSwgOTgsIDEwMCwKCSAgICAxMDMsIDEwNSwgMTA3LCAxMTAsIDExMiwgMTE1LCAxMTcsIDExOSwgMTIyLCAxMjQsIDEyNiwgMTI5LAoJICAgIDEzMSwgMTM0LCAxMzYsIDEzOCwgMTQwLCAxNDMsIDE0NSwgMTQ3LCAxNTAsIDE1MiwgMTU0LCAxNTYsCgkgICAgMTU4LCAxNjAsIDE2MiwgMTY0LCAxNjYsIDE2OCwgMTcwLCAxNzIsIDE3NCwgMTc2LCAxNzgsIDE4MCwKCSAgICAxODIsIDE4MywgMTg1LCAxODcsIDE4OCwgMTkwLCAxOTIsIDE5MywgMTk1LCAxOTYsIDE5OCwgMTk5LAoJICAgIDIwMCwgMjAyLCAyMDMsIDIwNSwgMjA2LCAyMDcsIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsCgkgICAgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIyLCAyMjMsIDIyNCwKCSAgICAyMjUsIDIyNiwgMjI2LCAyMjcsIDIyOCwgMjI4LCAyMjksIDIzMCwgMjMwLCAyMzEsIDIzMiwgMjMyLAoJICAgIDIzMywgMjMzLCAyMzQsIDIzNSwgMjM1LCAyMzYsIDIzNiwgMjM3LCAyMzcsIDIzOCwgMjM4LCAyMzksCgkgICAgMjM5LCAyNDAKfTsKCi8qIENvbnZlcnRpbmcgdGVtcHMgdG8gKDgtYml0KSBoeXN0IGFuZCBvdmVyIHJlZ2lzdGVycwogICBObyBpbnRlcnBvbGF0aW9uIGhlcmUuCiAgIFRoZSArNTAgaXMgYmVjYXVzZSB0aGUgdGVtcHMgc3RhcnQgYXQgLTUwICovCnN0YXRpYyBpbmxpbmUgdTggVEVNUF9UT19SRUcobG9uZyB2YWwpCnsKCXJldHVybiB2aWFMVVRbdmFsIDw9IC01MDAwMCA/IDAgOiB2YWwgPj0gMTEwMDAwID8gMTYwIDogCgkJICAgICAgKHZhbCA8IDAgPyB2YWwgLSA1MDAgOiB2YWwgKyA1MDApIC8gMTAwMCArIDUwXTsKfQoKLyogZm9yIDgtYml0IHRlbXBlcmF0dXJlIGh5c3QgYW5kIG92ZXIgcmVnaXN0ZXJzICovCiNkZWZpbmUgVEVNUF9GUk9NX1JFRyh2YWwpICh0ZW1wTFVUWyh2YWwpXSAqIDEwMCkKCi8qIGZvciAxMC1iaXQgdGVtcGVyYXR1cmUgcmVhZGluZ3MgKi8Kc3RhdGljIGlubGluZSBsb25nIFRFTVBfRlJPTV9SRUcxMCh1MTYgdmFsKQp7Cgl1MTYgZWlnaHRCaXRzID0gdmFsID4+IDI7Cgl1MTYgdHdvQml0cyA9IHZhbCAmIDM7CgoJLyogbm8gaW50ZXJwb2xhdGlvbiBmb3IgdGhlc2UgKi8KCWlmICh0d29CaXRzID09IDAgfHwgZWlnaHRCaXRzID09IDI1NSkKCQlyZXR1cm4gVEVNUF9GUk9NX1JFRyhlaWdodEJpdHMpOwoKCS8qIGRvIHNvbWUgbGluZWFyIGludGVycG9sYXRpb24gKi8KCXJldHVybiAodGVtcExVVFtlaWdodEJpdHNdICogKDQgLSB0d29CaXRzKSArCgkgICAgICAgIHRlbXBMVVRbZWlnaHRCaXRzICsgMV0gKiB0d29CaXRzKSAqIDI1Owp9CgojZGVmaW5lIEFMQVJNU19GUk9NX1JFRyh2YWwpICh2YWwpCgojZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpICgxIDw8ICh2YWwpKQojZGVmaW5lIERJVl9UT19SRUcodmFsKSAoKHZhbCk9PTg/MzoodmFsKT09ND8yOih2YWwpPT0xPzA6MSkKCi8qIEZvciB0aGUgVklBNjg2QSwgd2UgbmVlZCB0byBrZWVwIHNvbWUgZGF0YSBpbiBtZW1vcnkuCiAgIFRoZSBzdHJ1Y3R1cmUgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLCBhdCB0aGUgc2FtZSB0aW1lIHdoZW4gYSBuZXcKICAgdmlhNjg2YSBjbGllbnQgaXMgYWxsb2NhdGVkLiAqLwpzdHJ1Y3QgdmlhNjg2YV9kYXRhIHsKCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CgljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCgl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwoKCXU4IGluWzVdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGluX21heFs1XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCgl1OCBpbl9taW5bNV07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTggZmFuWzJdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9taW5bMl07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLwoJdTE2IHRlbXBbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAxMCBiaXQgKi8KCXU4IHRlbXBfb3ZlclszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IHRlbXBfaHlzdFszXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KCXU4IGZhbl9kaXZbMl07CQkvKiBSZWdpc3RlciBlbmNvZGluZywgc2hpZnRlZCByaWdodCAqLwoJdTE2IGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLwp9OwoKc3RhdGljIHN0cnVjdCBwY2lfZGV2ICpzX2JyaWRnZTsJLyogcG9pbnRlciB0byB0aGUgKG9ubHkpIHZpYTY4NmEgKi8KCnN0YXRpYyBpbnQgdmlhNjg2YV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwpzdGF0aWMgaW50IHZpYTY4NmFfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CgpzdGF0aWMgaW5saW5lIGludCB2aWE2ODZhX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKQp7CglyZXR1cm4gKGluYl9wKGNsaWVudC0+YWRkciArIHJlZykpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgdmlhNjg2YV93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsCgkJCQkgICAgICAgdTggdmFsdWUpCnsKCW91dGJfcCh2YWx1ZSwgY2xpZW50LT5hZGRyICsgcmVnKTsKfQoKc3RhdGljIHN0cnVjdCB2aWE2ODZhX2RhdGEgKnZpYTY4NmFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwpzdGF0aWMgdm9pZCB2aWE2ODZhX2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwoKLyogZm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zICovCgovKiA3IHZvbHRhZ2Ugc2Vuc29ycyAqLwpzdGF0aWMgc3NpemVfdCBzaG93X2luKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5bbnJdLCBucikpOwp9CgpzdGF0aWMgc3NpemVfdCBzaG93X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltucl0sIG5yKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+aW5fbWF4W25yXSwgbnIpKTsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCgkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPmluX21pbltucl0gPSBJTl9UT19SRUcodmFsLG5yKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19JTl9NSU4obnIpLCAKCQkJZGF0YS0+aW5fbWluW25yXSk7Cgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CnN0YXRpYyBzc2l6ZV90IHNldF9pbl9tYXgoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIAoJCXNpemVfdCBjb3VudCwgaW50IG5yKSB7CglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKCglkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CglkYXRhLT5pbl9tYXhbbnJdID0gSU5fVE9fUkVHKHZhbCxucik7Cgl2aWE2ODZhX3dyaXRlX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfSU5fTUFYKG5yKSwgCgkJCWRhdGEtPmluX21heFtucl0pOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQojZGVmaW5lIHNob3dfaW5fb2Zmc2V0KG9mZnNldCkJCQkJCVwKc3RhdGljIHNzaXplX3QgCQkJCQkJCVwKCXNob3dfaW4jI29mZnNldCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCQlcCnsJCQkJCQkJCVwKCXJldHVybiBzaG93X2luKGRldiwgYnVmLCBvZmZzZXQpOwkJCVwKfQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCAJCQkJCQkJXAoJc2hvd19pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQlcCglyZXR1cm4gc2hvd19pbl9taW4oZGV2LCBidWYsIG9mZnNldCk7CQlcCn0JCQkJCQkJCVwKc3RhdGljIHNzaXplX3QgCQkJCQkJCVwKCXNob3dfaW4jI29mZnNldCMjX21heCAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKewkJCQkJCQkJXAoJcmV0dXJuIHNob3dfaW5fbWF4KGRldiwgYnVmLCBvZmZzZXQpOwkJXAp9CQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWluIChzdHJ1Y3QgZGV2aWNlICpkZXYsIAlcCgkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCVwKewkJCQkJCQkJXAoJcmV0dXJuIHNldF9pbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQpOwkJXAp9CQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNldF9pbiMjb2Zmc2V0IyNfbWF4IChzdHJ1Y3QgZGV2aWNlICpkZXYsCVwKCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCnsJCQkJCQkJCVwKCXJldHVybiBzZXRfaW5fbWF4KGRldiwgYnVmLCBjb3VudCwgb2Zmc2V0KTsJCVwKfQkJCQkJCQkJXApzdGF0aWMgREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX2lucHV0LCBTX0lSVUdPLCBzaG93X2luIyNvZmZzZXQsIE5VTEwpO1wKc3RhdGljIERFVklDRV9BVFRSKGluIyNvZmZzZXQjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLCAJXAoJCXNob3dfaW4jI29mZnNldCMjX21pbiwgc2V0X2luIyNvZmZzZXQjI19taW4pOwlcCnN0YXRpYyBERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgCVwKCQlzaG93X2luIyNvZmZzZXQjI19tYXgsIHNldF9pbiMjb2Zmc2V0IyNfbWF4KTsKCnNob3dfaW5fb2Zmc2V0KDApOwpzaG93X2luX29mZnNldCgxKTsKc2hvd19pbl9vZmZzZXQoMik7CnNob3dfaW5fb2Zmc2V0KDMpOwpzaG93X2luX29mZnNldCg0KTsKCi8qIDMgdGVtcGVyYXR1cmVzICovCnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IG5yKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIFRFTVBfRlJPTV9SRUcxMChkYXRhLT50ZW1wW25yXSkpOwp9CnN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX292ZXJbbnJdKSk7Cn0Kc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaHlzdFtucl0pKTsKfQpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vdmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPnRlbXBfb3Zlcltucl0gPSBURU1QX1RPX1JFRyh2YWwpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfT1ZFUihuciksIGRhdGEtPnRlbXBfb3Zlcltucl0pOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPnRlbXBfaHlzdFtucl0gPSBURU1QX1RPX1JFRyh2YWwpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfSFlTVChuciksIGRhdGEtPnRlbXBfaHlzdFtucl0pOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQojZGVmaW5lIHNob3dfdGVtcF9vZmZzZXQob2Zmc2V0KQkJCQkJXApzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfIyNvZmZzZXQgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2hvd190ZW1wKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdAkJCQkJCQkJXApzaG93X3RlbXBfIyNvZmZzZXQjI19vdmVyIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X3RlbXBfb3ZlcihkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdAkJCQkJCQkJXApzaG93X3RlbXBfIyNvZmZzZXQjI19oeXN0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X3RlbXBfaHlzdChkZXYsIGJ1Ziwgb2Zmc2V0IC0gMSk7CQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX292ZXIgKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCgkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2V0X3RlbXBfb3ZlcihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF8jI29mZnNldCMjX2h5c3QgKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCgkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIAkJCQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2V0X3RlbXBfaHlzdChkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAp9CQkJCQkJCQkJXApzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF8jI29mZnNldCwgTlVMTCk7XApzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4LCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCgkJc2hvd190ZW1wXyMjb2Zmc2V0IyNfb3Zlciwgc2V0X3RlbXBfIyNvZmZzZXQjI19vdmVyKTsJXApzdGF0aWMgREVWSUNFX0FUVFIodGVtcCMjb2Zmc2V0IyNfbWF4X2h5c3QsIFNfSVJVR08gfCBTX0lXVVNSLCAJCVwKCQlzaG93X3RlbXBfIyNvZmZzZXQjI19oeXN0LCBzZXRfdGVtcF8jI29mZnNldCMjX2h5c3QpOwkKCnNob3dfdGVtcF9vZmZzZXQoMSk7CnNob3dfdGVtcF9vZmZzZXQoMik7CnNob3dfdGVtcF9vZmZzZXQoMyk7CgovKiAyIEZhbnMgKi8Kc3RhdGljIHNzaXplX3Qgc2hvd19mYW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgRkFOX0ZST01fUkVHKGRhdGEtPmZhbltucl0sIAoJCQkJRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSkgKTsKfQpzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYsIGludCBucikgewoJc3RydWN0IHZpYTY4NmFfZGF0YSAqZGF0YSA9IHZpYTY4NmFfdXBkYXRlX2RldmljZShkZXYpOwoJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwKCQlGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpICk7Cn0Kc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmLCBpbnQgbnIpIHsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSB2aWE2ODZhX3VwZGF0ZV9kZXZpY2UoZGV2KTsKCXJldHVybiBzcHJpbnRmKGJ1ZiwiJWRcbiIsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkgKTsKfQpzdGF0aWMgc3NpemVfdCBzZXRfZmFuX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmJ1ZiwgCgkJc2l6ZV90IGNvdW50LCBpbnQgbnIpIHsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CglpbnQgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKCglkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CglkYXRhLT5mYW5fbWluW25yXSA9IEZBTl9UT19SRUcodmFsLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5fTUlOKG5yKzEpLCBkYXRhLT5mYW5fbWluW25yXSk7Cgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CnN0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCAKCQlzaXplX3QgY291bnQsIGludCBucikgewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCB2aWE2ODZhX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKCWludCB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoJaW50IG9sZDsKCglkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CglvbGQgPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19GQU5ESVYpOwoJZGF0YS0+ZmFuX2Rpdltucl0gPSBESVZfVE9fUkVHKHZhbCk7CglvbGQgPSAob2xkICYgMHgwZikgfCAoZGF0YS0+ZmFuX2RpdlsxXSA8PCA2KSB8IChkYXRhLT5mYW5fZGl2WzBdIDw8IDQpOwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0ZBTkRJViwgb2xkKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KCiNkZWZpbmUgc2hvd19mYW5fb2Zmc2V0KG9mZnNldCkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNob3dfZmFuXyMjb2Zmc2V0IChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikJXAp7CQkJCQkJCQkJXAoJcmV0dXJuIHNob3dfZmFuKGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQkJXAp9CQkJCQkJCQkJXApzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl8jI29mZnNldCMjX21pbiAoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCVwKewkJCQkJCQkJCVwKCXJldHVybiBzaG93X2Zhbl9taW4oZGV2LCBidWYsIG9mZnNldCAtIDEpOwkJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2hvd19mYW5fIyNvZmZzZXQjI19kaXYgKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2hvd19mYW5fZGl2KGRldiwgYnVmLCBvZmZzZXQgLSAxKTsJCQlcCn0JCQkJCQkJCQlcCnN0YXRpYyBzc2l6ZV90IHNldF9mYW5fIyNvZmZzZXQjI19taW4gKHN0cnVjdCBkZXZpY2UgKmRldiwgCQlcCgljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCQlcCnsJCQkJCQkJCQlcCglyZXR1cm4gc2V0X2Zhbl9taW4oZGV2LCBidWYsIGNvdW50LCBvZmZzZXQgLSAxKTsJCVwKfQkJCQkJCQkJCVwKc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl8jI29mZnNldCMjX2RpdiAoc3RydWN0IGRldmljZSAqZGV2LCAJCVwKCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgCQkJCVwKewkJCQkJCQkJCVwKCXJldHVybiBzZXRfZmFuX2RpdihkZXYsIGJ1ZiwgY291bnQsIG9mZnNldCAtIDEpOwkJXAp9CQkJCQkJCQkJXApzdGF0aWMgREVWSUNFX0FUVFIoZmFuIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywgc2hvd19mYW5fIyNvZmZzZXQsIE5VTEwpO1wKc3RhdGljIERFVklDRV9BVFRSKGZhbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgCQlcCgkJc2hvd19mYW5fIyNvZmZzZXQjI19taW4sIHNldF9mYW5fIyNvZmZzZXQjI19taW4pOwlcCnN0YXRpYyBERVZJQ0VfQVRUUihmYW4jI29mZnNldCMjX2RpdiwgU19JUlVHTyB8IFNfSVdVU1IsIAkJXAoJCXNob3dfZmFuXyMjb2Zmc2V0IyNfZGl2LCBzZXRfZmFuXyMjb2Zmc2V0IyNfZGl2KTsKCnNob3dfZmFuX29mZnNldCgxKTsKc2hvd19mYW5fb2Zmc2V0KDIpOwoKLyogQWxhcm1zICovCnN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVmKSB7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gdmlhNjg2YV91cGRhdGVfZGV2aWNlKGRldik7CglyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBBTEFSTVNfRlJPTV9SRUcoZGF0YS0+YWxhcm1zKSk7Cn0Kc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOwoKLyogVGhlIGRyaXZlci4gSSBjaG9vc2UgdG8gdXNlIHR5cGUgaTJjX2RyaXZlciwgYXMgYXQgaXMgaWRlbnRpY2FsIHRvIGJvdGgKICAgc21idXNfZHJpdmVyIGFuZCBpc2FfZHJpdmVyLCBhbmQgY2xpZW50cyBjb3VsZCBiZSBvZiBlaXRoZXIga2luZCAqLwpzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdmlhNjg2YV9kcml2ZXIgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkubmFtZQkJPSAidmlhNjg2YSIsCgkuaWQJCT0gSTJDX0RSSVZFUklEX1ZJQTY4NkEsCgkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKCS5hdHRhY2hfYWRhcHRlcgk9IHZpYTY4NmFfYXR0YWNoX2FkYXB0ZXIsCgkuZGV0YWNoX2NsaWVudAk9IHZpYTY4NmFfZGV0YWNoX2NsaWVudCwKfTsKCgovKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkICovCnN0YXRpYyBpbnQgdmlhNjg2YV9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCnsKCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKCQlyZXR1cm4gMDsKCXJldHVybiBpMmNfZGV0ZWN0KGFkYXB0ZXIsICZhZGRyX2RhdGEsIHZpYTY4NmFfZGV0ZWN0KTsKfQoKc3RhdGljIGludCB2aWE2ODZhX2RldGVjdChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKewoJc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQ7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhOwoJaW50IGVyciA9IDA7Cgljb25zdCBjaGFyIGNsaWVudF9uYW1lW10gPSAidmlhNjg2YSI7Cgl1MTYgdmFsOwoKCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgcHJvYmluZyB0aGUgSVNBIGJ1cyEhICAqLwoJaWYgKCFpMmNfaXNfaXNhX2FkYXB0ZXIoYWRhcHRlcikpIHsKCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsCgkJInZpYTY4NmFfZGV0ZWN0IGNhbGxlZCBmb3IgYW4gSTJDIGJ1cyBhZGFwdGVyPyE/XG4iKTsKCQlyZXR1cm4gMDsKCX0KCgkvKiA4MjMxIHJlcXVpcmVzIG11bHRpcGxlIG9mIDI1Niwgd2UgZW5mb3JjZSB0aGF0IG9uIDY4NiBhcyB3ZWxsICovCglpZihmb3JjZV9hZGRyKQoJCWFkZHJlc3MgPSBmb3JjZV9hZGRyICYgMHhGRjAwOwoKCWlmKGZvcmNlX2FkZHIpIHsKCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LCJmb3JjaW5nIElTQSBhZGRyZXNzIDB4JTA0WFxuIiwgYWRkcmVzcyk7CgkJaWYgKFBDSUJJT1NfU1VDQ0VTU0ZVTCAhPQoJCSAgICBwY2lfd3JpdGVfY29uZmlnX3dvcmQoc19icmlkZ2UsIFZJQTY4NkFfQkFTRV9SRUcsIGFkZHJlc3MpKQoJCQlyZXR1cm4gLUVOT0RFVjsKCX0KCWlmIChQQ0lCSU9TX1NVQ0NFU1NGVUwgIT0KCSAgICBwY2lfcmVhZF9jb25maWdfd29yZChzX2JyaWRnZSwgVklBNjg2QV9FTkFCTEVfUkVHLCAmdmFsKSkKCQlyZXR1cm4gLUVOT0RFVjsKCWlmICghKHZhbCAmIDB4MDAwMSkpIHsKCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LCJlbmFibGluZyBzZW5zb3JzXG4iKTsKCQlpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CgkJICAgIHBjaV93cml0ZV9jb25maWdfd29yZChzX2JyaWRnZSwgVklBNjg2QV9FTkFCTEVfUkVHLAoJCSAgICAgICAgICAgICAgICAgICAgICB2YWwgfCAweDAwMDEpKQoJCQlyZXR1cm4gLUVOT0RFVjsKCX0KCgkvKiBSZXNlcnZlIHRoZSBJU0EgcmVnaW9uICovCglpZiAoIXJlcXVlc3RfcmVnaW9uKGFkZHJlc3MsIFZJQTY4NkFfRVhURU5ULCB2aWE2ODZhX2RyaXZlci5uYW1lKSkgewoJCWRldl9lcnIoJmFkYXB0ZXItPmRldiwicmVnaW9uIDB4JXggYWxyZWFkeSBpbiB1c2UhXG4iLAoJCSAgICAgICBhZGRyZXNzKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZpYTY4NmFfZGF0YSksIEdGUF9LRVJORUwpKSkgewoJCWVyciA9IC1FTk9NRU07CgkJZ290byBFUlJPUjA7Cgl9CgltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCB2aWE2ODZhX2RhdGEpKTsKCgluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOwoJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CgluZXdfY2xpZW50LT5kcml2ZXIgPSAmdmlhNjg2YV9kcml2ZXI7CgluZXdfY2xpZW50LT5mbGFncyA9IDA7CgoJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLwoJc3RybGNweShuZXdfY2xpZW50LT5uYW1lLCBjbGllbnRfbmFtZSwgSTJDX05BTUVfU0laRSk7CgoJZGF0YS0+dmFsaWQgPSAwOwoJaW5pdF9NVVRFWCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLwoJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkpCgkJZ290byBFUlJPUjM7CgkKCS8qIEluaXRpYWxpemUgdGhlIFZJQTY4NkEgY2hpcCAqLwoJdmlhNjg2YV9pbml0X2NsaWVudChuZXdfY2xpZW50KTsKCgkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjJfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjBfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4xX21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMl9taW4pOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjNfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW40X21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMF9tYXgpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjFfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX21heCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luM19tYXgpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbjRfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX2lucHV0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDJfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDNfbWF4KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wMl9tYXhfaHlzdCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAzX21heF9oeXN0KTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9pbnB1dCk7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfaW5wdXQpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4xX21pbik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbjJfbWluKTsKCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuMV9kaXYpOwoJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4yX2Rpdik7CglkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2FsYXJtcyk7CgoJcmV0dXJuIDA7CgogICAgICBFUlJPUjM6CglrZnJlZShkYXRhKTsKICAgICAgRVJST1IwOgoJcmVsZWFzZV9yZWdpb24oYWRkcmVzcywgVklBNjg2QV9FWFRFTlQpOwoJcmV0dXJuIGVycjsKfQoKc3RhdGljIGludCB2aWE2ODZhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKewoJaW50IGVycjsKCglpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKSB7CgkJZGV2X2VycigmY2xpZW50LT5kZXYsCgkJIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsIGNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKCQlyZXR1cm4gZXJyOwoJfQoKCXJlbGVhc2VfcmVnaW9uKGNsaWVudC0+YWRkciwgVklBNjg2QV9FWFRFTlQpOwoJa2ZyZWUoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwoKCXJldHVybiAwOwp9CgovKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIGZvdW5kIGEgbmV3IFZJQTY4NkEuIFNldCBsaW1pdHMsIGV0Yy4gKi8Kc3RhdGljIHZvaWQgdmlhNjg2YV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7Cgl1OCByZWc7CgoJLyogU3RhcnQgbW9uaXRvcmluZyAqLwoJcmVnID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfQ09ORklHKTsKCXZpYTY4NmFfd3JpdGVfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19DT05GSUcsIChyZWd8MHgwMSkmMHg3Rik7CgoJLyogQ29uZmlndXJlIHRlbXAgaW50ZXJydXB0IG1vZGUgZm9yIGNvbnRpbnVvdXMtaW50ZXJydXB0IG9wZXJhdGlvbiAqLwoJdmlhNjg2YV93cml0ZV92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX1RFTVBfTU9ERSwgCgkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX01PREUpICYKCQkJICAgICEoVklBNjg2QV9URU1QX01PREVfTUFTSyB8IFZJQTY4NkFfVEVNUF9NT0RFX0NPTlRJTlVPVVMpKTsKfQoKc3RhdGljIHN0cnVjdCB2aWE2ODZhX2RhdGEgKnZpYTY4NmFfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CglzdHJ1Y3QgdmlhNjg2YV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CglpbnQgaTsKCglkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CgoJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCgkgICAgfHwgIWRhdGEtPnZhbGlkKSB7CgkJZm9yIChpID0gMDsgaSA8PSA0OyBpKyspIHsKCQkJZGF0YS0+aW5baV0gPQoJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfSU4oaSkpOwoJCQlkYXRhLT5pbl9taW5baV0gPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCQkJICAgICBWSUE2ODZBX1JFR19JTl9NSU4KCQkJCQkJCSAgICAgKGkpKTsKCQkJZGF0YS0+aW5fbWF4W2ldID0KCQkJICAgIHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0lOX01BWChpKSk7CgkJfQoJCWZvciAoaSA9IDE7IGkgPD0gMjsgaSsrKSB7CgkJCWRhdGEtPmZhbltpIC0gMV0gPQoJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFOKGkpKTsKCQkJZGF0YS0+ZmFuX21pbltpIC0gMV0gPSB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCQkgICAgIFZJQTY4NkFfUkVHX0ZBTl9NSU4oaSkpOwoJCX0KCQlmb3IgKGkgPSAwOyBpIDw9IDI7IGkrKykgewoJCQlkYXRhLT50ZW1wW2ldID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCQkJIFZJQTY4NkFfUkVHX1RFTVAoaSkpIDw8IDI7CgkJCWRhdGEtPnRlbXBfb3ZlcltpXSA9CgkJCSAgICB2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LAoJCQkJCSAgICAgICBWSUE2ODZBX1JFR19URU1QX09WRVIoaSkpOwoJCQlkYXRhLT50ZW1wX2h5c3RbaV0gPQoJCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCQkgICAgICAgVklBNjg2QV9SRUdfVEVNUF9IWVNUKGkpKTsKCQl9CgkJLyogYWRkIGluIGxvd2VyIDIgYml0cyAKCQkgICB0ZW1wMSB1c2VzIGJpdHMgNy02IG9mIFZJQTY4NkFfUkVHX1RFTVBfTE9XMQoJCSAgIHRlbXAyIHVzZXMgYml0cyA1LTQgb2YgVklBNjg2QV9SRUdfVEVNUF9MT1cyMwoJCSAgIHRlbXAzIHVzZXMgYml0cyA3LTYgb2YgVklBNjg2QV9SRUdfVEVNUF9MT1cyMwoJCSAqLwoJCWRhdGEtPnRlbXBbMF0gfD0gKHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsCgkJCQkJCSAgICAgVklBNjg2QV9SRUdfVEVNUF9MT1cxKQoJCQkJICAmIDB4YzApID4+IDY7CgkJZGF0YS0+dGVtcFsxXSB8PQoJCSAgICAodmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfVEVNUF9MT1cyMykgJgoJCSAgICAgMHgzMCkgPj4gNDsKCQlkYXRhLT50ZW1wWzJdIHw9CgkJICAgICh2aWE2ODZhX3JlYWRfdmFsdWUoY2xpZW50LCBWSUE2ODZBX1JFR19URU1QX0xPVzIzKSAmCgkJICAgICAweGMwKSA+PiA2OwoKCQlpID0gdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwgVklBNjg2QV9SRUdfRkFORElWKTsKCQlkYXRhLT5mYW5fZGl2WzBdID0gKGkgPj4gNCkgJiAweDAzOwoJCWRhdGEtPmZhbl9kaXZbMV0gPSBpID4+IDY7CgkJZGF0YS0+YWxhcm1zID0KCQkgICAgdmlhNjg2YV9yZWFkX3ZhbHVlKGNsaWVudCwKCQkJCSAgICAgICBWSUE2ODZBX1JFR19BTEFSTTEpIHwKCQkgICAgKHZpYTY4NmFfcmVhZF92YWx1ZShjbGllbnQsIFZJQTY4NkFfUkVHX0FMQVJNMikgPDwgOCk7CgkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKCQlkYXRhLT52YWxpZCA9IDE7Cgl9CgoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCglyZXR1cm4gZGF0YTsKfQoKc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHZpYTY4NmFfcGNpX2lkc1tdID0gewogICAgICAgeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MkM2ODZfNCkgfSwKICAgICAgIHsgMCwgfQp9OwoKTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHZpYTY4NmFfcGNpX2lkcyk7CgpzdGF0aWMgaW50IF9fZGV2aW5pdCB2aWE2ODZhX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKewogICAgICAgdTE2IHZhbDsKICAgICAgIGludCBhZGRyID0gMDsKCiAgICAgICBpZiAoUENJQklPU19TVUNDRVNTRlVMICE9CiAgICAgICAgICAgcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBWSUE2ODZBX0JBU0VfUkVHLCAmdmFsKSkKICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CgogICAgICAgYWRkciA9IHZhbCAmIH4oVklBNjg2QV9FWFRFTlQgLSAxKTsKICAgICAgIGlmIChhZGRyID09IDAgJiYgZm9yY2VfYWRkciA9PSAwKSB7CiAgICAgICAgICAgICAgIGRldl9lcnIoJmRldi0+ZGV2LCJiYXNlIGFkZHJlc3Mgbm90IHNldCAtIHVwZ3JhZGUgQklPUyBvciB1c2UgZm9yY2VfYWRkcj0weGFkZHJcbiIpOwogICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgICAgIH0KICAgICAgIGlmIChmb3JjZV9hZGRyKQogICAgICAgICAgICAgICBhZGRyID0gZm9yY2VfYWRkcjsgICAgICAvKiBzbyBkZXRlY3Qgd2lsbCBnZXQgY2FsbGVkICovCgogICAgICAgaWYgKCFhZGRyKSB7CiAgICAgICAgICAgICAgIGRldl9lcnIoJmRldi0+ZGV2LCJObyBWaWEgNjg2QSBzZW5zb3JzIGZvdW5kLlxuIik7CiAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgICAgfQogICAgICAgbm9ybWFsX2lzYVswXSA9IGFkZHI7CgoJc19icmlkZ2UgPSBwY2lfZGV2X2dldChkZXYpOwoJaWYgKGkyY19hZGRfZHJpdmVyKCZ2aWE2ODZhX2RyaXZlcikpIHsKCQlwY2lfZGV2X3B1dChzX2JyaWRnZSk7CgkJc19icmlkZ2UgPSBOVUxMOwoJfQoKCS8qIEFsd2F5cyByZXR1cm4gZmFpbHVyZSBoZXJlLiAgVGhpcyBpcyB0byBhbGxvdyBvdGhlciBkcml2ZXJzIHRvIGJpbmQKCSAqIHRvIHRoaXMgcGNpIGRldmljZS4gIFdlIGRvbid0IHJlYWxseSB3YW50IHRvIGhhdmUgY29udHJvbCBvdmVyIHRoZQoJICogcGNpIGRldmljZSwgd2Ugb25seSB3YW50ZWQgdG8gcmVhZCBhcyBmZXcgcmVnaXN0ZXIgdmFsdWVzIGZyb20gaXQuCgkgKi8KCXJldHVybiAtRU5PREVWOwp9CgpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdmlhNjg2YV9wY2lfZHJpdmVyID0gewogICAgICAgLm5hbWUJCT0gInZpYTY4NmEiLAogICAgICAgLmlkX3RhYmxlCT0gdmlhNjg2YV9wY2lfaWRzLAogICAgICAgLnByb2JlCQk9IHZpYTY4NmFfcGNpX3Byb2JlLAp9OwoKc3RhdGljIGludCBfX2luaXQgc21fdmlhNjg2YV9pbml0KHZvaWQpCnsKICAgICAgIHJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ2aWE2ODZhX3BjaV9kcml2ZXIpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgc21fdmlhNjg2YV9leGl0KHZvaWQpCnsKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdmlhNjg2YV9wY2lfZHJpdmVyKTsKCWlmIChzX2JyaWRnZSAhPSBOVUxMKSB7CgkJaTJjX2RlbF9kcml2ZXIoJnZpYTY4NmFfZHJpdmVyKTsKCQlwY2lfZGV2X3B1dChzX2JyaWRnZSk7CgkJc19icmlkZ2UgPSBOVUxMOwoJfQp9CgpNT0RVTEVfQVVUSE9SKCJLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4sICIKICAgICAgICAgICAgICAiTWFyayBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiAiCiAgICAgICAgICAgICAiYW5kIEJvYiBEb3VnaGVydHkgPGJvYmRAc3RhbmZvcmQuZWR1PiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSA2ODZBIFNlbnNvciBkZXZpY2UiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwoKbW9kdWxlX2luaXQoc21fdmlhNjg2YV9pbml0KTsKbW9kdWxlX2V4aXQoc21fdmlhNjg2YV9leGl0KTsK