LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL290Zy9saW51eC9kcml2ZXJzL2R3Y19vdGdfZHJpdmVyLmMgJAogKiAkUmV2aXNpb246ICM4OSAkCiAqICREYXRlOiAyMDExLzA1LzE3ICQKICogJENoYW5nZTogMTc3NDExMCAkCiAqCiAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAogKiAiU29mdHdhcmUiKSBpcyBhbiBVbnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLCBJbmMuIHVubGVzcwogKiBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KICoKICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QgdW5kZXIKICogYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQgUHJvZHVjdAogKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKICogcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoaXMKICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCiAqIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbQogKiBTeW5vcHN5cy4gSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoaXMgbm90aWNlLCBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIKICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgogKgogKiBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiIEJBU0lTCiAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCiAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICiAqIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qKiBAZmlsZQogKiBUaGUgZHdjX290Z19kcml2ZXIgbW9kdWxlIHByb3ZpZGVzIHRoZSBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCBlbnRyeQogKiBwb2ludHMgZm9yIHRoZSBEV0Nfb3RnIGRyaXZlci4gVGhpcyBtb2R1bGUgd2lsbCBiZSBkeW5hbWljYWxseSBpbnN0YWxsZWQKICogYWZ0ZXIgTGludXggaXMgYm9vdGVkIHVzaW5nIHRoZSBpbnNtb2QgY29tbWFuZC4gV2hlbiB0aGUgbW9kdWxlIGlzCiAqIGluc3RhbGxlZCwgdGhlIGR3Y19vdGdfZHJpdmVyX2luaXQgZnVuY3Rpb24gaXMgY2FsbGVkLiBXaGVuIHRoZSBtb2R1bGUgaXMKICogcmVtb3ZlZCAodXNpbmcgcm1tb2QpLCB0aGUgZHdjX290Z19kcml2ZXJfY2xlYW51cCBmdW5jdGlvbiBpcyBjYWxsZWQuCiAqCiAqIFRoaXMgbW9kdWxlIGFsc28gZGVmaW5lcyBhIGRhdGEgc3RydWN0dXJlIGZvciB0aGUgZHdjX290Z19kcml2ZXIsIHdoaWNoIGlzCiAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgc3RhbmRhcmQgQVJNIGxtX2RldmljZSBzdHJ1Y3R1cmUuIFRoZXNlCiAqIHN0cnVjdHVyZXMgYWxsb3cgdGhlIE9URyBkcml2ZXIgdG8gY29tcGx5IHdpdGggdGhlIHN0YW5kYXJkIExpbnV4IGRyaXZlcgogKiBtb2RlbCBpbiB3aGljaCBkZXZpY2VzIGFuZCBkcml2ZXJzIGFyZSByZWdpc3RlcmVkIHdpdGggYSBidXMgZHJpdmVyLiBUaGlzCiAqIGhhcyB0aGUgYmVuZWZpdCB0aGF0IExpbnV4IGNhbiBleHBvc2UgYXR0cmlidXRlcyBvZiB0aGUgZHJpdmVyIGFuZCBkZXZpY2UKICogaW4gaXRzIHNwZWNpYWwgc3lzZnMgZmlsZSBzeXN0ZW0uIFVzZXJzIGNhbiB0aGVuIHJlYWQgb3Igd3JpdGUgZmlsZXMgaW4KICogdGhpcyBmaWxlIHN5c3RlbSB0byBwZXJmb3JtIGRpYWdub3N0aWNzIG9uIHRoZSBkcml2ZXIgY29tcG9uZW50cyBvciB0aGUKICogZGV2aWNlLgogKi8KCiNpbmNsdWRlICJkd2Nfb3RnX29zX2RlcC5oIgojaW5jbHVkZSAiZHdjX29zLmgiCiNpbmNsdWRlICJkd2Nfb3RnX2RiZy5oIgojaW5jbHVkZSAiZHdjX290Z19kcml2ZXIuaCIKI2luY2x1ZGUgImR3Y19vdGdfYXR0ci5oIgojaW5jbHVkZSAiZHdjX290Z19jb3JlX2lmLmgiCiNpbmNsdWRlICJkd2Nfb3RnX3BjZF9pZi5oIgojaW5jbHVkZSAiZHdjX290Z19oY2RfaWYuaCIKI2luY2x1ZGUgPG1hY2gvcmVzZXQuaD4KCiNpbmNsdWRlIDxsaW51eC9jbGsuaD4KCi8qIFVTQiAzLjAgY2xvY2sgKi8Kc3RhdGljIHN0cnVjdCBjbGsgKnVzYjJfY2xrOwoKZXh0ZXJuIHZvaWQgZHdjX290Z19ob3N0X3BvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiX2hjZCAqaGNkKTsKZXh0ZXJuIHZvaWQgZHdjX290Z19ob3N0X3BvcnRfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpOwoKI2RlZmluZSBEV0NfRFJJVkVSX1ZFUlNJT04JIjIuOTNhIDE1LU1BWS0yMDExIgojZGVmaW5lIERXQ19EUklWRVJfREVTQwkJIkhTIE9URyBVU0IgQ29udHJvbGxlciBkcml2ZXIiCgpzdGF0aWMgY29uc3QgY2hhciBkd2NfZHJpdmVyX25hbWVbXSA9ICJkd2Nfb3RnIjsKCmV4dGVybiBpbnQgcGNkX2luaXQoCiNpZmRlZiBMTV9JTlRFUkZBQ0UKCQkJICAgc3RydWN0IGxtX2RldmljZSAqX2RldgojZWxpZiAgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQoJCQkgICBzdHJ1Y3QgcGNpX2RldiAqX2RldgojZWxzZQoJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX2RldgojZW5kaWYKICAgICk7CmV4dGVybiBpbnQgaGNkX2luaXQoCiNpZmRlZiBMTV9JTlRFUkZBQ0UKCQkJICAgc3RydWN0IGxtX2RldmljZSAqX2RldgojZWxpZiAgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQoJCQkgICBzdHJ1Y3QgcGNpX2RldiAqX2RldgojZWxzZQoJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX2RldgojZW5kaWYKICAgICk7CgpleHRlcm4gaW50IHBjZF9yZW1vdmUoCiNpZmRlZiBMTV9JTlRFUkZBQ0UKCQkJICAgICBzdHJ1Y3QgbG1fZGV2aWNlICpfZGV2CiNlbGlmICBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCgkJCSAgICAgc3RydWN0IHBjaV9kZXYgKl9kZXYKI2Vsc2UKCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9kZXYKI2VuZGlmCiAgICApOwoKZXh0ZXJuIHZvaWQgaGNkX3JlbW92ZSgKI2lmZGVmIExNX0lOVEVSRkFDRQoJCQkgICAgICBzdHJ1Y3QgbG1fZGV2aWNlICpfZGV2CiNlbGlmICBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCgkJCSAgICAgIHN0cnVjdCBwY2lfZGV2ICpfZGV2CiNlbHNlCgkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfZGV2CiNlbmRpZgogICAgKTsKCmV4dGVybiB2b2lkIGR3Y19vdGdfYWRwX3N0YXJ0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBFbmNhcHN1bGF0ZSB0aGUgbW9kdWxlIHBhcmFtZXRlciBzZXR0aW5ncyAqLwoKc3RydWN0IGR3Y19vdGdfZHJpdmVyX21vZHVsZV9wYXJhbXMgewoJaW50MzJfdCBvcHQ7CglpbnQzMl90IG90Z19jYXA7CglpbnQzMl90IGRtYV9lbmFibGU7CglpbnQzMl90IGRtYV9kZXNjX2VuYWJsZTsKCWludDMyX3QgZG1hX2J1cnN0X3NpemU7CglpbnQzMl90IHNwZWVkOwoJaW50MzJfdCBob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyOwoJaW50MzJfdCBob3N0X2xzX2xvd19wb3dlcl9waHlfY2xrOwoJaW50MzJfdCBlbmFibGVfZHluYW1pY19maWZvOwoJaW50MzJfdCBkYXRhX2ZpZm9fc2l6ZTsKCWludDMyX3QgZGV2X3J4X2ZpZm9fc2l6ZTsKCWludDMyX3QgZGV2X25wZXJpb190eF9maWZvX3NpemU7Cgl1aW50MzJfdCBkZXZfcGVyaW9fdHhfZmlmb19zaXplW01BWF9QRVJJT19GSUZPU107CglpbnQzMl90IGhvc3RfcnhfZmlmb19zaXplOwoJaW50MzJfdCBob3N0X25wZXJpb190eF9maWZvX3NpemU7CglpbnQzMl90IGhvc3RfcGVyaW9fdHhfZmlmb19zaXplOwoJaW50MzJfdCBtYXhfdHJhbnNmZXJfc2l6ZTsKCWludDMyX3QgbWF4X3BhY2tldF9jb3VudDsKCWludDMyX3QgaG9zdF9jaGFubmVsczsKCWludDMyX3QgZGV2X2VuZHBvaW50czsKCWludDMyX3QgcGh5X3R5cGU7CglpbnQzMl90IHBoeV91dG1pX3dpZHRoOwoJaW50MzJfdCBwaHlfdWxwaV9kZHI7CglpbnQzMl90IHBoeV91bHBpX2V4dF92YnVzOwoJaW50MzJfdCBpMmNfZW5hYmxlOwoJaW50MzJfdCB1bHBpX2ZzX2xzOwoJaW50MzJfdCB0c19kbGluZTsKCWludDMyX3QgZW5fbXVsdGlwbGVfdHhfZmlmbzsKCXVpbnQzMl90IGRldl90eF9maWZvX3NpemVbTUFYX1RYX0ZJRk9TXTsKCXVpbnQzMl90IHRocl9jdGw7Cgl1aW50MzJfdCB0eF90aHJfbGVuZ3RoOwoJdWludDMyX3QgcnhfdGhyX2xlbmd0aDsKCWludDMyX3QgcHRpX2VuYWJsZTsKCWludDMyX3QgbXBpX2VuYWJsZTsKCWludDMyX3QgbHBtX2VuYWJsZTsKCWludDMyX3QgaWNfdXNiX2NhcDsKCWludDMyX3QgYWhiX3Rocl9yYXRpbzsKCWludDMyX3QgcG93ZXJfZG93bjsKCWludDMyX3QgcmVsb2FkX2N0bDsKCWludDMyX3QgZGV2X291dF9uYWs7CglpbnQzMl90IG90Z192ZXI7CglpbnQzMl90IGFkcF9lbmFibGU7Cn07CgpzdGF0aWMgc3RydWN0IGR3Y19vdGdfZHJpdmVyX21vZHVsZV9wYXJhbXMgZHdjX290Z19tb2R1bGVfcGFyYW1zID0gewoJLm9wdCA9IC0xLAoJLm90Z19jYXAgPSAtMSwKCS5kbWFfZW5hYmxlID0gLTEsCgkuZG1hX2Rlc2NfZW5hYmxlID0gLTEsCgkuZG1hX2J1cnN0X3NpemUgPSAtMSwKCS5zcGVlZCA9IC0xLAoJLmhvc3Rfc3VwcG9ydF9mc19sc19sb3dfcG93ZXIgPSAtMSwKCS5ob3N0X2xzX2xvd19wb3dlcl9waHlfY2xrID0gLTEsCgkuZW5hYmxlX2R5bmFtaWNfZmlmbyA9IC0xLAoJLmRhdGFfZmlmb19zaXplID0gLTEsCgkuZGV2X3J4X2ZpZm9fc2l6ZSA9IC0xLAoJLmRldl9ucGVyaW9fdHhfZmlmb19zaXplID0gLTEsCgkuZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZSA9IHsKCQkJCSAgIC8qIGRldl9wZXJpb190eF9maWZvX3NpemVfMSAqLwoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xLAoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xLAoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xLAoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xLAoJCQkJICAgLTEsCgkJCQkgICAtMSwKCQkJCSAgIC0xCgkJCQkgICAvKiAxNSAqLwoJCQkJICAgfSwKCS5ob3N0X3J4X2ZpZm9fc2l6ZSA9IC0xLAoJLmhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZSA9IC0xLAoJLmhvc3RfcGVyaW9fdHhfZmlmb19zaXplID0gLTEsCgkubWF4X3RyYW5zZmVyX3NpemUgPSAtMSwKCS5tYXhfcGFja2V0X2NvdW50ID0gLTEsCgkuaG9zdF9jaGFubmVscyA9IC0xLAoJLmRldl9lbmRwb2ludHMgPSAtMSwKCS5waHlfdHlwZSA9IC0xLAoJLnBoeV91dG1pX3dpZHRoID0gLTEsCgkucGh5X3VscGlfZGRyID0gLTEsCgkucGh5X3VscGlfZXh0X3ZidXMgPSAtMSwKCS5pMmNfZW5hYmxlID0gLTEsCgkudWxwaV9mc19scyA9IC0xLAoJLnRzX2RsaW5lID0gLTEsCgkuZW5fbXVsdGlwbGVfdHhfZmlmbyA9IC0xLAoJLmRldl90eF9maWZvX3NpemUgPSB7CgkJCSAgICAgLyogZGV2X3R4X2ZpZm9fc2l6ZSAqLwoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xLAoJCQkgICAgIC0xCgkJCSAgICAgLyogMTUgKi8KCQkJICAgICB9LAoJLnRocl9jdGwgPSAtMSwKCS50eF90aHJfbGVuZ3RoID0gLTEsCgkucnhfdGhyX2xlbmd0aCA9IC0xLAoJLnB0aV9lbmFibGUgPSAtMSwKCS5tcGlfZW5hYmxlID0gLTEsCgkubHBtX2VuYWJsZSA9IC0xLAoJLmljX3VzYl9jYXAgPSAtMSwKCS5haGJfdGhyX3JhdGlvID0gLTEsCgkucG93ZXJfZG93biA9IC0xLAoJLnJlbG9hZF9jdGwgPSAtMSwKCS5kZXZfb3V0X25hayA9IC0xLAoJLm90Z192ZXIgPSAtMSwKCS5hZHBfZW5hYmxlID0gLTEsCn07CgovKioKICogVGhpcyBmdW5jdGlvbiBzaG93cyB0aGUgRHJpdmVyIFZlcnNpb24uCiAqLwpzdGF0aWMgc3NpemVfdCB2ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRldiwgY2hhciAqYnVmKQp7CglyZXR1cm4gc25wcmludGYoYnVmLCBzaXplb2YoRFdDX0RSSVZFUl9WRVJTSU9OKSArIDIsICIlc1xuIiwKCQkJRFdDX0RSSVZFUl9WRVJTSU9OKTsKfQoKc3RhdGljIERSSVZFUl9BVFRSKHZlcnNpb24sIFNfSVJVR08sIHZlcnNpb25fc2hvdywgTlVMTCk7CgovKioKICogR2xvYmFsIERlYnVnIExldmVsIE1hc2suCiAqLwp1aW50MzJfdCBnX2RiZ19sdmwgPSAwOwkJLyogT0ZGICovCgovKioKICogVGhpcyBmdW5jdGlvbiBzaG93cyB0aGUgZHJpdmVyIERlYnVnIExldmVsLgogKi8Kc3RhdGljIHNzaXplX3QgZGJnX2xldmVsX3Nob3coc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwgY2hhciAqYnVmKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIweCUweFxuIiwgZ19kYmdfbHZsKTsKfQoKLyoqCiAqIFRoaXMgZnVuY3Rpb24gc3RvcmVzIHRoZSBkcml2ZXIgRGVidWcgTGV2ZWwuCiAqLwpzdGF0aWMgc3NpemVfdCBkYmdfbGV2ZWxfc3RvcmUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwgY29uc3QgY2hhciAqYnVmLAoJCQkgICAgICAgc2l6ZV90IGNvdW50KQp7CglnX2RiZ19sdmwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDE2KTsKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIERSSVZFUl9BVFRSKGRlYnVnbGV2ZWwsIFNfSVJVR08gfCBTX0lXVVNSLCBkYmdfbGV2ZWxfc2hvdywKCQkgICBkYmdfbGV2ZWxfc3RvcmUpOwoKLyoqCiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBtb2R1bGUgaW50aWFsaXphdGlvbgogKiB0byBwYXNzIG1vZHVsZSBwYXJhbWV0ZXJzIHRvIHRoZSBEV0NfT1RHIENPUkUuCiAqLwpzdGF0aWMgaW50IHNldF9wYXJhbWV0ZXJzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKewoJaW50IHJldHZhbCA9IDA7CglpbnQgaTsKCglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLm90Z19jYXAgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fb3RnX2NhcChjb3JlX2lmLAoJCQkJCSAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5vdGdfY2FwKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2VuYWJsZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9kbWFfZW5hYmxlKGNvcmVfaWYsCgkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSBkbWFfZW5hYmxlKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2Rlc2NfZW5hYmxlICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2RtYV9kZXNjX2VuYWJsZShjb3JlX2lmLAoJCQkJCQkgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSAgICAgIGRtYV9kZXNjX2VuYWJsZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLm9wdCAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9vcHQoY29yZV9pZiwgZHdjX290Z19tb2R1bGVfcGFyYW1zLm9wdCk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmRtYV9idXJzdF9zaXplICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2RtYV9idXJzdF9zaXplKGNvcmVfaWYsCgkJCQkJCSAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgICAgIGRtYV9idXJzdF9zaXplKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlciAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9ob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyKGNvcmVfaWYsCgkJCQkJCQkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJCSAgIGhvc3Rfc3VwcG9ydF9mc19sc19sb3dfcG93ZXIpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5lbmFibGVfZHluYW1pY19maWZvICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2VuYWJsZV9keW5hbWljX2ZpZm8oY29yZV9pZiwKCQkJCQkJCSAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJICBlbmFibGVfZHluYW1pY19maWZvKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGF0YV9maWZvX3NpemUgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fZGF0YV9maWZvX3NpemUoY29yZV9pZiwKCQkJCQkJICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSAgICAgZGF0YV9maWZvX3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcnhfZmlmb19zaXplICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2Rldl9yeF9maWZvX3NpemUoY29yZV9pZiwKCQkJCQkJICAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJICAgICAgIGRldl9yeF9maWZvX3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAoJCQkJCQkJICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJICAgICAgZGV2X25wZXJpb190eF9maWZvX3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X3J4X2ZpZm9fc2l6ZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9ob3N0X3J4X2ZpZm9fc2l6ZShjb3JlX2lmLAoJCQkJCQkJZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfcnhfZmlmb19zaXplKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9ucGVyaW9fdHhfZmlmb19zaXplICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAoJCQkJCQkJICAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJCSAgICAgICBob3N0X25wZXJpb190eF9maWZvX3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAoJCQkJCQkJICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJICAgICAgaG9zdF9wZXJpb190eF9maWZvX3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5tYXhfdHJhbnNmZXJfc2l6ZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9tYXhfdHJhbnNmZXJfc2l6ZShjb3JlX2lmLAoJCQkJCQkJZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJbWF4X3RyYW5zZmVyX3NpemUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5tYXhfcGFja2V0X2NvdW50ICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX21heF9wYWNrZXRfY291bnQoY29yZV9pZiwKCQkJCQkJICAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJICAgICAgIG1heF9wYWNrZXRfY291bnQpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X2NoYW5uZWxzICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfY2hhbm5lbHMoY29yZV9pZiwKCQkJCQkJICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJICAgIGhvc3RfY2hhbm5lbHMpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfZW5kcG9pbnRzICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2Rldl9lbmRwb2ludHMoY29yZV9pZiwKCQkJCQkJICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJICAgIGRldl9lbmRwb2ludHMpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5waHlfdHlwZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9waHlfdHlwZShjb3JlX2lmLAoJCQkJCSAgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucGh5X3R5cGUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5zcGVlZCAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9zcGVlZChjb3JlX2lmLAoJCQkJCSAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuc3BlZWQpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X2xzX2xvd19wb3dlcl9waHlfY2xrICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGsoY29yZV9pZiwKCQkJCQkJCQlkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCQkJaG9zdF9sc19sb3dfcG93ZXJfcGh5X2Nsayk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnBoeV91bHBpX2RkciAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9waHlfdWxwaV9kZHIoY29yZV9pZiwKCQkJCQkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgICBwaHlfdWxwaV9kZHIpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5waHlfdWxwaV9leHRfdmJ1cyAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9waHlfdWxwaV9leHRfdmJ1cyhjb3JlX2lmLAoJCQkJCQkJZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJcGh5X3VscGlfZXh0X3ZidXMpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5waHlfdXRtaV93aWR0aCAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9waHlfdXRtaV93aWR0aChjb3JlX2lmLAoJCQkJCQkgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJICAgICBwaHlfdXRtaV93aWR0aCk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnVscGlfZnNfbHMgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fdWxwaV9mc19scyhjb3JlX2lmLAoJCQkJCQkgZHdjX290Z19tb2R1bGVfcGFyYW1zLnVscGlfZnNfbHMpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy50c19kbGluZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV90c19kbGluZShjb3JlX2lmLAoJCQkJCSAgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudHNfZGxpbmUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5pMmNfZW5hYmxlICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2kyY19lbmFibGUoY29yZV9pZiwKCQkJCQkJIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJIGkyY19lbmFibGUpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5lbl9tdWx0aXBsZV90eF9maWZvICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2VuX211bHRpcGxlX3R4X2ZpZm8oY29yZV9pZiwKCQkJCQkJCSAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJICBlbl9tdWx0aXBsZV90eF9maWZvKTsKCX0KCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CgkJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplW2ldICE9IC0xKSB7CgkJCXJldHZhbCArPQoJCQkgICAgZHdjX290Z19zZXRfcGFyYW1fZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAoJCQkJCQkJCSAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkJCSAgICAgZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZQoJCQkJCQkJCSAgICAgW2ldLCBpKTsKCQl9Cgl9CgoJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKCQlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbaV0gIT0gLTEpIHsKCQkJcmV0dmFsICs9IGR3Y19vdGdfc2V0X3BhcmFtX2Rldl90eF9maWZvX3NpemUoY29yZV9pZiwKCQkJCQkJCQkgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJCQkgICAgIGRldl90eF9maWZvX3NpemUKCQkJCQkJCQkgICAgIFtpXSwgaSk7CgkJfQoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy50aHJfY3RsICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3Rocl9jdGwoY29yZV9pZiwKCQkJCQkgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudGhyX2N0bCk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLm1waV9lbmFibGUgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fbXBpX2VuYWJsZShjb3JlX2lmLAoJCQkJCQkgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgbXBpX2VuYWJsZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnB0aV9lbmFibGUgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fcHRpX2VuYWJsZShjb3JlX2lmLAoJCQkJCQkgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgcHRpX2VuYWJsZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmxwbV9lbmFibGUgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fbHBtX2VuYWJsZShjb3JlX2lmLAoJCQkJCQkgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgbHBtX2VuYWJsZSk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmljX3VzYl9jYXAgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1faWNfdXNiX2NhcChjb3JlX2lmLAoJCQkJCQkgZHdjX290Z19tb2R1bGVfcGFyYW1zLgoJCQkJCQkgaWNfdXNiX2NhcCk7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnR4X3Rocl9sZW5ndGggIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fdHhfdGhyX2xlbmd0aChjb3JlX2lmLAoJCQkJCQkgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLnR4X3Rocl9sZW5ndGgpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5yeF90aHJfbGVuZ3RoICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3J4X3Rocl9sZW5ndGgoY29yZV9pZiwKCQkJCQkJICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KCQkJCQkJICAgIHJ4X3Rocl9sZW5ndGgpOwoJfQoJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5haGJfdGhyX3JhdGlvICE9IC0xKSB7CgkJcmV0dmFsICs9CgkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2FoYl90aHJfcmF0aW8oY29yZV9pZiwKCQkJCQkJICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5haGJfdGhyX3JhdGlvKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMucG93ZXJfZG93biAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9wb3dlcl9kb3duKGNvcmVfaWYsCgkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucG93ZXJfZG93bik7Cgl9CglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnJlbG9hZF9jdGwgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fcmVsb2FkX2N0bChjb3JlX2lmLAoJCQkJCQkgZHdjX290Z19tb2R1bGVfcGFyYW1zLnJlbG9hZF9jdGwpOwoJfQoKCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X291dF9uYWsgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkJZHdjX290Z19zZXRfcGFyYW1fZGV2X291dF9uYWsoY29yZV9pZiwKCQkJZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9vdXRfbmFrKTsKCX0KCglpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLm90Z192ZXIgIT0gLTEpIHsKCQlyZXR2YWwgKz0KCQkgICAgZHdjX290Z19zZXRfcGFyYW1fb3RnX3Zlcihjb3JlX2lmLAoJCQkJCSAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5vdGdfdmVyKTsKCX0KCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuYWRwX2VuYWJsZSAhPSAtMSkgewoJCXJldHZhbCArPQoJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9hZHBfZW5hYmxlKGNvcmVfaWYsCgkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCgkJCQkJCSBhZHBfZW5hYmxlKTsKCX0KCXJldHVybiByZXR2YWw7Cn0KCgovKioKICogUGxhdGZvcm0gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gZm9yIFVTQiAyIFBIWQogKi8Kc3RhdGljIHZvaWQgY29tY2VydG9fdXNiMl9waHlfaW5pdCh2b2lkKQp7CgkJdWludDMyX3QgcmRfZGF0YTsKCiNkZWZpbmUgQ09NQ0VSVE9fVVNCMF9QSFlfQ1RSTF9SRUcwIAkoQ09NQ0VSVE9fRFdDMV9DRkdfQkFTRSArIDB4MDAwKQojZGVmaW5lIENPTUNFUlRPX1VTQjBfRFdDX0NGR19SRUdGIAkJKFVTQjJfUEhZX0JBU0UgKyAweDAzQykKCgoJCS8qIHRha2UgZGV2aWNlIG91dCBvZiByZXNldCAsIGVuYWJsZSBjbG9jay4gKi8KCQkvKiBQcm9ncmFtbWluZyB0aGUgVVNCMCBQSFkgQ09OVFJPTCBSRUdJU1RFUiAqLwoJCS8qCUJpdFsyXTp1c2IwX3ZidXN2bGRleHRzZWwgLSBUaGUgaW50ZXJuYWwgU2Vzc2lvbiBWYWxpZCBjb21wYXJhdG9yIGlzIHVzZWQuCgkJICogQml0WzNdOnVzYjBfdmJ1c3ZsZGV4dCAtIFRoZSBWQlVTIHNpZ25hbCBpcyBub3QgdmFsaWQsIGFuZCB0aGUgcHVsbC11cCByZXNpc3RvciBvbiBEKyBpcyBkaXNhYmxlZC4KCQkgKiBCaXRbNF06dXNiMF9vdGdkaXNhYmxlICAtIFRUaGUgT1RHIGJsb2NrIGlzIHBvd2VyZWQgdXAuCgkJICogQml0WzE3OjE2XTp1c2IwX3JlZmNsa2RpdiAtIFJlZmVyZW5jZSBDbG9jayBGcmVxdWVuY3kgU2VsZWN0LCA0OCBNSHoKCQkgKiBCaXRbMjE6MjBdOnVzYjBfcmVmY2xrc2VsIC0gVGhlIFhPIGJsb2NrIHVzZXMgYW4gZXh0ZXJuYWwsIDIuNSBWIGNsb2NrIHN1cHBsaWVkIG9uIHRoZSBYTyBwaW4uCgkJICovCgkJd3JpdGVsKDB4MDAyMjAwMDAsIENPTUNFUlRPX1VTQjBfUEhZX0NUUkxfUkVHMCk7CgoJCS8qIFByb2dyYW1taW5nIHRoZSBJRFNFTCB2YWx1ZXMgdG8gVVNCIDIuMCBDb250cm9sbGVyIEAgRFdDX0NGR19SRUdGIHJlZ2lzdGVyICovCgkJLyogQ29uZmlndXJpbmcgdGhlIHVzYjIgY29udHJvbGxlciB0byBzZWxlY3QgdGhlIElEIHZhbHVlIGZyb20gcmVnaXN0ZXIgKi8KCQlyZF9kYXRhID0gcmVhZGwoQ09NQ0VSVE9fVVNCMF9EV0NfQ0ZHX1JFR0YpOwoKCQkvKglCaXRbOF06dXNiMF9pZF9zZWwgLSBTZWxlY3RzIGZyb20gdGhlIHJlZ2lzdGVyIGJpdAoJCSAqCUJpdFs5XTp1c2IxX2lkX3NlbCAtIFNlbGVjdHMgZnJvbSB0aGUgcmVnaXN0ZXIgYml0CgkJICovCgkJcmRfZGF0YSA9ICgocmRfZGF0YSAmIDB4RkZGRjExRkYpfCAweDAwMDAxMTAwKTsgIC8vRm9yIEhvc3QgbW9kZS4KCQl3cml0ZWwgKHJkX2RhdGEsIENPTUNFUlRPX1VTQjBfRFdDX0NGR19SRUdGKTsKCgoJCS8qIFByb2dyYW1taW5nIFVTQjIuMCBjb250cm9sbGVyIHdpdGggc2NhbGUgZG93biB2YWx1ZS4gKi8KCQkvKiBDb25maWd1cmluZyB0aGUgdXNiMiBjb250cm9sbGVyIGluIHNjYWxlZG93biBkaXNhYmxlIG1vZGUgKi8KCQlyZF9kYXRhID0gcmVhZGwoQ09NQ0VSVE9fVVNCMF9EV0NfQ0ZHX1JFR0YpOwoJCXJkX2RhdGEgPSAoKHJkX2RhdGEgJiAweEZGRkZGRkYwKXwgMHgwKTsKCQl3cml0ZWwgKHJkX2RhdGEsIENPTUNFUlRPX1VTQjBfRFdDX0NGR19SRUdGKTsKfQoKCgovKioKICogUGxhdGZvcm0gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gZm9yIER3YyBPVEcgQ29udHJvbGxlcgogKi8Kc3RhdGljIHZvaWQgY29tY2VydG9fc3RhcnRfZHdjX290Zyh2b2lkKQp7CgkvKiBHZXQgdGhlIEZBU1QtVUFSVCBjbGsgc3RydWN0dXJlIGZyb20gRFVTICxUbyBiZSB1c2VkIGZvciBVQVJUMC9VQVJUMSBpbml0aWxpemF0aW9uICovCgl1c2IyX2NsayA9IGNsa19nZXQoTlVMTCwidXNiMCIpOwoKCS8qIEVuYWJsZSB0aGUgQ2xvY2sgKi8KCWlmIChjbGtfZW5hYmxlKHVzYjJfY2xrKSl7CgkJcHJfZXJyKCJjb21jZXJ0b19zdGFydF9kd2Nfb3RnOlVuYWJsZSB0byBlbmFibGUgdGhlIHVzYjIgY2xvY2sgXG4iKTsKCX0KCgkvKiBVU0IgMi4wIFBIWSBJbml0aWFsaXphdGlvbiAqLwoJY29tY2VydG9fdXNiMl9waHlfaW5pdCgpOwoKCS8qIENvbnRpbnVpbmcgcmVzZXRzIG9uIHVzYjIgY29udHJvbGxlcitwaHkgYmxvY2tzICovCgoJLyogQVBQTFlJTkcgVEhFIFJFU0VUIFRPIFVTQjIgVVRNSSAqLwoJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VUTUlfVVNCMCwgMSk7CgoJLyogQVBQTFlJTkcgVEhFIFJFU0VUIFRPIFVTQjIgUEhZICovCgljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfVVNCMF9QSFksIDEpOwoKCS8qIEFQTExZSU5HIFJFU0VUIFRPIFVTQjIgQVhJIFJFU0VUICovCgljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfQVhJX1VTQjAsIDEpOwoKCS8qIFJlbGVhc2luZyB0aGUgKFBPUikgUG93ZXIgb24gUmVzZXQgdG8gdXNiMiBuYW5vIHBoeSBibG9jayAqLwoJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VTQjBfUEhZLCAwKTsKCgkvKiBSZWxlYXNpbmcgdGhlIFVUTUkgUmVzZXQgdG8gdXNiMiBjb250cm9sbGVyIGJsb2NrICovCgljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfVVRNSV9VU0IwLCAwKTsKCgkvKiBSZWxlYXNpbmcgdGhlIEFIQiBSZXNldCB0byB1c2IyIGNvbnRyb2xsZXIgYmxvY2sgLS0gQml0WzRdLVVTQjMsQml0WzNdLVVTQjIgKi8KCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9BWElfVVNCMCwgMCk7Cn0KCgovKioKICogUGxhdGZvcm0gc3BlY2lmaWMgU2h1dGRvd24gZm9yIER3YyBPVEcgQ29udHJvbGxlcgogKi8Kc3RhdGljIHZvaWQgY29tY2VydG9fc3RvcF9kd2Nfb3RnKHZvaWQpCnsKCS8qIEFQUExZSU5HIFRIRSBSRVNFVCBUTyBVU0IyIFVUTUkgKi8KCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9VVE1JX1VTQjAsIDEpOwoKCS8qIEFQUExZSU5HIFRIRSBSRVNFVCBUTyBVU0IyIFBIWSAqLwoJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VTQjBfUEhZLCAxKTsKCgkvKiBBUExMWUlORyBSRVNFVCBUTyBVU0IyIEFYSSBSRVNFVCAqLwoJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX0FYSV9VU0IwLCAxKTsKCgkvKiBEaXNhYmxlIHRoZSBDbG9jayAqLwoJY2xrX2Rpc2FibGUodXNiMl9jbGspOwoKCS8qIFJlbGVhc2UgdGhlIGNsb2NrICovCgljbGtfcHV0KHVzYjJfY2xrKTsKfQoKCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSB0b3AgbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBDb21tb24KICogKERldmljZSBhbmQgaG9zdCBtb2RlcykgaW50ZXJydXB0cy4KICovCnN0YXRpYyBpcnFyZXR1cm5fdCBkd2Nfb3RnX2NvbW1vbl9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQp7Cglkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2OwoJaW50MzJfdCByZXR2YWwgPSBJUlFfTk9ORTsKCglyZXR2YWwgPSBkd2Nfb3RnX2hhbmRsZV9jb21tb25faW50cihvdGdfZGV2LT5jb3JlX2lmKTsKCWlmIChyZXR2YWwgIT0gMCkgewoJCVMzQzI0MTBYX0NMRUFSX0VJTlRQRU5EKCk7Cgl9CglyZXR1cm4gSVJRX1JFVFZBTChyZXR2YWwpOwp9CgovKioKICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGxtX2RldmljZSBpcyB1bnJlZ2lzdGVyZWQgd2l0aCB0aGUKICogZHdjX290Z19kcml2ZXIuIFRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIHJtbW9kIGNvbW1hbmQgaXMKICogZXhlY3V0ZWQuIFRoZSBkZXZpY2UgbWF5IG9yIG1heSBub3QgYmUgZWxlY3RyaWNhbGx5IHByZXNlbnQuIElmIGl0IGlzCiAqIHByZXNlbnQsIHRoZSBkcml2ZXIgc3RvcHMgZGV2aWNlIHByb2Nlc3NpbmcuIEFueSByZXNvdXJjZXMgdXNlZCBvbiBiZWhhbGYKICogb2YgdGhpcyBkZXZpY2UgYXJlIGZyZWVkLgogKgogKiBAcGFyYW0gX2RldgogKi8Kc3RhdGljIHZvaWQgZHdjX290Z19kcml2ZXJfcmVtb3ZlKAojaWZkZWYgTE1fSU5URVJGQUNFCgkJCQkJIHN0cnVjdCBsbV9kZXZpY2UgKl9kZXYKI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQoJCQkJCSBzdHJ1Y3QgcGNpX2RldiAqX2RldgojZWxzZQoJCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9kZXYKI2VuZGlmCgogICAgKQp7CiNpZmRlZiBMTV9JTlRFUkZBQ0UKCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBsbV9nZXRfZHJ2ZGF0YShfZGV2KTsKI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQoJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShfZGV2KTsKI2Vsc2UKCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShfZGV2KTsKI2VuZGlmCgoJRFdDX0RFQlVHUEwoREJHX0FOWSwgIiVzKCVwKVxuIiwgX19mdW5jX18sIF9kZXYpOwoKCWlmICghb3RnX2RldikgewoJCS8qIE1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGUgZHdjX290Z19kZXZpY2UgZmFpbGVkLiAqLwoJCURXQ19ERUJVR1BMKERCR19BTlksICIlczogb3RnX2RldiBOVUxMIVxuIiwgX19mdW5jX18pOwoJCXJldHVybjsKCX0KI2lmbmRlZiBEV0NfREVWSUNFX09OTFkKCWlmIChvdGdfZGV2LT5oY2QpIHsKCQloY2RfcmVtb3ZlKF9kZXYpOwoJfSBlbHNlIHsKCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiJXM6IG90Z19kZXYtPmhjZCBOVUxMIVxuIiwgX19mdW5jX18pOwoJCXJldHVybjsKCX0KI2VuZGlmCgojaWZuZGVmIERXQ19IT1NUX09OTFkKCWlmIChvdGdfZGV2LT5wY2QpIHsKCQlwY2RfcmVtb3ZlKF9kZXYpOwoJfSBlbHNlIHsKCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiJXM6IG90Z19kZXYtPnBjZCBOVUxMIVxuIiwgX19mdW5jX18pOwoJCXJldHVybjsKCX0KI2VuZGlmCgkvKgoJICogRnJlZSB0aGUgSVJRCgkgKi8KCWlmIChvdGdfZGV2LT5jb21tb25faXJxX2luc3RhbGxlZCkgewoJCWZyZWVfaXJxKG90Z19kZXYtPmlycSwgb3RnX2Rldik7Cgl9IGVsc2UgewoJCURXQ19ERUJVR1BMKERCR19BTlksICIlczogVGhlcmUgaXMgbm8gaW5zdGFsbGVkIGlycSFcbiIsIF9fZnVuY19fKTsKCQlyZXR1cm47Cgl9CgoJaWYgKG90Z19kZXYtPmNvcmVfaWYpIHsKCQlkd2Nfb3RnX2NpbF9yZW1vdmUob3RnX2Rldi0+Y29yZV9pZik7Cgl9IGVsc2UgewoJCURXQ19ERUJVR1BMKERCR19BTlksICIlczogb3RnX2Rldi0+Y29yZV9pZiBOVUxMIVxuIiwgX19mdW5jX18pOwoJCXJldHVybjsKCX0KCgkvKgoJICogUmVtb3ZlIHRoZSBkZXZpY2UgYXR0cmlidXRlcwoJICovCiNpZiAxCglkd2Nfb3RnX2F0dHJfcmVtb3ZlKF9kZXYpOwojZWxzZQoJZHdjX290Z19hdHRyX3JlbW92ZShvdGdfZGV2LT5vc19kZXAucGFyZW50KTsKI2VuZGlmCgkvKgoJICogUmV0dXJuIHRoZSBtZW1vcnkuCgkgKi8KCWlmIChvdGdfZGV2LT5vc19kZXAuYmFzZSkgewoJCWlvdW5tYXAob3RnX2Rldi0+b3NfZGVwLmJhc2UpOwoJfQoKCS8qIERvIHRoZSBQbGF0Zm9ybSBzcGVjaWZpYyBzaHV0ZG93biAqLwoJY29tY2VydG9fc3RvcF9kd2Nfb3RnKCk7CgoJRFdDX0ZSRUUob3RnX2Rldik7CgoJLyoKCSAqIENsZWFyIHRoZSBkcnZkYXRhIHBvaW50ZXIuCgkgKi8KI2lmZGVmIExNX0lOVEVSRkFDRQoJbG1fc2V0X2RydmRhdGEoX2RldiwgMCk7CiNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKICAgIHJlbGVhc2VfbWVtX3JlZ2lvbihvdGdfZGV2LT5vc19kZXAucnNyY19zdGFydCwgb3RnX2Rldi0+b3NfZGVwLnJzcmNfbGVuKTsKCXBjaV9zZXRfZHJ2ZGF0YShfZGV2LCAwKTsKI2Vsc2UKCXBsYXRmb3JtX3NldF9kcnZkYXRhKF9kZXYsIDApOwojZW5kaWYKCn0KCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIGxtX2RldmljZSBpcyBib3VuZCB0byBhCiAqIGR3Y19vdGdfZHJpdmVyLiBJdCBjcmVhdGVzIHRoZSBkcml2ZXIgY29tcG9uZW50cyByZXF1aXJlZCB0bwogKiBjb250cm9sIHRoZSBkZXZpY2UgKENJTCwgSENELCBhbmQgUENEKSBhbmQgaXQgaW5pdGlhbGl6ZXMgdGhlCiAqIGRldmljZS4gVGhlIGRyaXZlciBjb21wb25lbnRzIGFyZSBzdG9yZWQgaW4gYSBkd2Nfb3RnX2RldmljZQogKiBzdHJ1Y3R1cmUuIEEgcmVmZXJlbmNlIHRvIHRoZSBkd2Nfb3RnX2RldmljZSBpcyBzYXZlZCBpbiB0aGUKICogbG1fZGV2aWNlLiBUaGlzIGFsbG93cyB0aGUgZHJpdmVyIHRvIGFjY2VzcyB0aGUgZHdjX290Z19kZXZpY2UKICogc3RydWN0dXJlIG9uIHN1YnNlcXVlbnQgY2FsbHMgdG8gZHJpdmVyIG1ldGhvZHMgZm9yIHRoaXMgZGV2aWNlLgogKgogKiBAcGFyYW0gX2RldiBCdXMgZGV2aWNlCiAqLwpzdGF0aWMgaW50IGR3Y19vdGdfZHJpdmVyX3Byb2JlKAojaWZkZWYgTE1fSU5URVJGQUNFCgkJCQkgICAgICAgc3RydWN0IGxtX2RldmljZSAqX2RldgojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCgkJCQkgICAgICAgc3RydWN0IHBjaV9kZXYgKl9kZXYsCgkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkCiNlbHNlCgkJCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9kZXYKI2VuZGlmCiAgICApCnsKCWludCByZXR2YWwgPSAwOwoJZHdjX290Z19kZXZpY2VfdCAqZHdjX290Z19kZXZpY2U7CgoJZGV2X2RiZygmX2Rldi0+ZGV2LCAiZHdjX290Z19kcml2ZXJfcHJvYmUoJXApXG4iLCBfZGV2KTsKI2lmZGVmIExNX0lOVEVSRkFDRQoJZGV2X2RiZygmX2Rldi0+ZGV2LCAic3RhcnQ9MHglMDh4XG4iLCAodW5zaWduZWQpX2Rldi0+cmVzb3VyY2Uuc3RhcnQpOwojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCglpZiAoIWlkKSB7CgkJRFdDX0VSUk9SKCJJbnZhbGlkIHBjaV9kZXZpY2VfaWQgJXAiLCBpZCk7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJaWYgKCFfZGV2IHx8IChwY2lfZW5hYmxlX2RldmljZShfZGV2KSA8IDApKSB7CgkJRFdDX0VSUk9SKCJJbnZhbGlkIHBjaV9kZXZpY2UgJXAiLCBfZGV2KTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCWRldl9kYmcoJl9kZXYtPmRldiwgInN0YXJ0PTB4JTA4eFxuIiwgKHVuc2lnbmVkKXBjaV9yZXNvdXJjZV9zdGFydChfZGV2LDApKTsKCS8qIG90aGVyIHN0dWZmIG5lZWRlZCBhcyB3ZWxsPyAqLwoKI2Vsc2UKCWRldl9kYmcoJl9kZXYtPmRldiwgInN0YXJ0PTB4JTA4eFxuIiwgKHVuc2lnbmVkKV9kZXYtPnJlc291cmNlLT5zdGFydCk7CiNlbmRpZgoKCWR3Y19vdGdfZGV2aWNlID0gRFdDX0FMTE9DKHNpemVvZihkd2Nfb3RnX2RldmljZV90KSk7CgoJaWYgKCFkd2Nfb3RnX2RldmljZSkgewoJCWRldl9lcnIoJl9kZXYtPmRldiwgImttYWxsb2Mgb2YgZHdjX290Z19kZXZpY2UgZmFpbGVkXG4iKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCgltZW1zZXQoZHdjX290Z19kZXZpY2UsIDAsIHNpemVvZigqZHdjX290Z19kZXZpY2UpKTsKCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAucmVnX29mZnNldCA9IDB4RkZGRkZGRkY7CgoKCS8qIFBsYXRmb3JtIFNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCgljb21jZXJ0b19zdGFydF9kd2Nfb3RnKCk7CgoJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5wYXJlbnQ9ICZfZGV2LT5kZXY7CgoJLyoKCSAqIE1hcCB0aGUgRFdDX290ZyBDb3JlIG1lbW9yeSBpbnRvIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4KCSAqLwojaWZkZWYgTE1fSU5URVJGQUNFCglkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UgPSBpb3JlbWFwKF9kZXYtPnJlc291cmNlLnN0YXJ0LCBTWl8yNTZLKTsKCglpZiAoIWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSkgewoJCWRldl9lcnIoJl9kZXYtPmRldiwgImlvcmVtYXAoKSBmYWlsZWRcbiIpOwoJCURXQ19GUkVFKGR3Y19vdGdfZGV2aWNlKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCWRldl9kYmcoJl9kZXYtPmRldiwgImJhc2U9MHglMDh4XG4iLAoJCSh1bnNpZ25lZClkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpOwojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCglfZGV2LT5jdXJyZW50X3N0YXRlID0gUENJX0QwOwoJX2Rldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKCglpZiAoIV9kZXYtPmlycSkgewoJCURXQ19FUlJPUigiRm91bmQgSEMgd2l0aCBubyBJUlEuIENoZWNrIEJJT1MvUENJICVzIHNldHVwISIsCgkJCSAgcGNpX25hbWUoX2RldikpOwoJCWlvdW5tYXAoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKCQlEV0NfRlJFRShkd2Nfb3RnX2RldmljZSk7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KF9kZXYsIDApOwoJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4oX2RldiwgMCk7CglEV0NfREVCVUdQTChEQkdfQU5ZLCAiUENJIHJlc291cmNlOiBzdGFydD0lMDh4LCBsZW49JTA4eFxuIiwKCQkgICAgKHVuc2lnbmVkKWR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19zdGFydCwKCQkgICAgKHVuc2lnbmVkKWR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19sZW4pOwoJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24KCSAgICAoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX3N0YXJ0LCBkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnJzcmNfbGVuLAoJICAgICAiZHdjX290ZyIpKSB7CgkJZGV2X2RiZygmX2Rldi0+ZGV2LCAiZXJyb3IgcmVxdWVzdGluZyBtZW1vcnlcbiIpOwoJCWlvdW5tYXAoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKCQlEV0NfRlJFRShkd2Nfb3RnX2RldmljZSk7CgkJcmV0dXJuIC1FRkFVTFQ7Cgl9CgoJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlID0KCSAgICBpb3JlbWFwX25vY2FjaGUoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX3N0YXJ0LAoJCQkgICAgZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX2xlbik7CglpZiAoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlID09IE5VTEwpIHsKCQlkZXZfZGJnKCZfZGV2LT5kZXYsICJlcnJvciBtYXBwaW5nIG1lbW9yeVxuIik7CgkJcmVsZWFzZV9tZW1fcmVnaW9uKGR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19zdGFydCwKCQkJCSAgIGR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19sZW4pOwoJCWlvdW5tYXAoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKCQlEV0NfRlJFRShkd2Nfb3RnX2RldmljZSk7CgkJcmV0dXJuIC1FRkFVTFQ7Cgl9CglkZXZfZGJnKCZfZGV2LT5kZXYsICJiYXNlPTB4JXAgKGJlZm9yZSBhZGp1c3QpIFxuIiwKCQlkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpOwoJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlID0gKGNoYXIgKilkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2U7CglkZXZfZGJnKCZfZGV2LT5kZXYsICJiYXNlPTB4JXAgKGFmdGVyIGFkanVzdCkgXG4iLAoJCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSk7CglkZXZfZGJnKCZfZGV2LT5kZXYsICIlczogbWFwcGVkIFBBIDB4JXggdG8gVkEgMHglcFxuIiwgX19mdW5jX18sCgkJKHVuc2lnbmVkKWR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19zdGFydCwKCQlkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpOwoKCXBjaV9zZXRfbWFzdGVyKF9kZXYpOwoJcGNpX3NldF9kcnZkYXRhKF9kZXYsIGR3Y19vdGdfZGV2aWNlKTsKI2Vsc2UKCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSA9IGlvcmVtYXAoX2Rldi0+cmVzb3VyY2UtPnN0YXJ0LCBTWl8yNTZLKTsKCglpZiAoIWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSkgewoJCWRldl9lcnIoJl9kZXYtPmRldiwgImlvcmVtYXAoKSBmYWlsZWRcbiIpOwoJCURXQ19GUkVFKGR3Y19vdGdfZGV2aWNlKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCWRldl9kYmcoJl9kZXYtPmRldiwgImJhc2U9MHglMDh4XG4iLAoJCSh1bnNpZ25lZClkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpOwojZW5kaWYKCgkvKgoJICogUmV0cmlldmUgdGhlIG1lbW9yeSBhbmQgSVJRIHJlc291cmNlcy4KCSAqLwoJZHdjX290Z19kZXZpY2UtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEoX2RldiwgMCk7CglpZiAoZHdjX290Z19kZXZpY2UtPmlycSA8PSAwKSB7CgkJZGV2X2VycigmX2Rldi0+ZGV2LCAibm8gZGV2aWNlIGlycVxuIik7CgkJcmV0dmFsID0gLUVJTlZBTDsKCQlnb3RvIGZhaWw7Cgl9CgoKCS8qCgkgKiBJbml0aWFsaXplIGRyaXZlciBkYXRhIHRvIHBvaW50IHRvIHRoZSBnbG9iYWwgRFdDX290ZwoJICogRGV2aWNlIHN0cnVjdHVyZS4KCSAqLwojaWZkZWYgTE1fSU5URVJGQUNFCglsbV9zZXRfZHJ2ZGF0YShfZGV2LCBkd2Nfb3RnX2RldmljZSk7CiNlbHNlCglwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShfZGV2LCBkd2Nfb3RnX2RldmljZSk7CiNlbmRpZgoJZGV2X2RiZygmX2Rldi0+ZGV2LCAiZHdjX290Z19kZXZpY2U9MHglcFxuIiwgZHdjX290Z19kZXZpY2UpOwoKCWR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmID0gZHdjX290Z19jaWxfaW5pdChkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpOwoJaWYgKCFkd2Nfb3RnX2RldmljZS0+Y29yZV9pZikgewoJCWRldl9lcnIoJl9kZXYtPmRldiwgIkNJTCBpbml0aWFsaXphdGlvbiBmYWlsZWQhXG4iKTsKCQlyZXR2YWwgPSAtRU5PTUVNOwoJCWdvdG8gZmFpbDsKCX0KCgkvKgoJICogQXR0ZW1wdCB0byBlbnN1cmUgdGhpcyBkZXZpY2UgaXMgcmVhbGx5IGEgRFdDX290ZyBDb250cm9sbGVyLgoJICogUmVhZCBhbmQgdmVyaWZ5IHRoZSBTTlBTSUQgcmVnaXN0ZXIgY29udGVudHMuIFRoZSB2YWx1ZSBzaG91bGQgYmUKCSAqIDB4NDVGNDJYWFgsIHdoaWNoIGNvcnJlc3BvbmRzIHRvICJPVDIiLCBhcyBpbiAiT1RHIHZlcnNpb24gMi5YWCIuCgkgKi8KCglpZiAoKGR3Y19vdGdfZ2V0X2dzbnBzaWQoZHdjX290Z19kZXZpY2UtPmNvcmVfaWYpICYgMHhGRkZGRjAwMCkgIT0KCSAgICAweDRGNTQyMDAwKSB7CgkJZGV2X2VycigmX2Rldi0+ZGV2LCAiQmFkIHZhbHVlIGZvciBTTlBTSUQ6IDB4JTA4eFxuIiwKCQkJZHdjX290Z19nZXRfZ3NucHNpZChkd2Nfb3RnX2RldmljZS0+Y29yZV9pZikpOwoJCXJldHZhbCA9IC1FSU5WQUw7CgkJZ290byBmYWlsOwoJfQoKCS8qCgkgKiBWYWxpZGF0ZSBwYXJhbWV0ZXIgdmFsdWVzLgoJICovCglpZiAoc2V0X3BhcmFtZXRlcnMoZHdjX290Z19kZXZpY2UtPmNvcmVfaWYpKSB7CgkJcmV0dmFsID0gLUVJTlZBTDsKCQlnb3RvIGZhaWw7Cgl9CgoJLyoKCSAqIENyZWF0ZSBEZXZpY2UgQXR0cmlidXRlcyBpbiBzeXNmcwoJICovCgkvL2R3Y19vdGdfYXR0cl9jcmVhdGUoJl9kZXYtPmRldik7Cglkd2Nfb3RnX2F0dHJfY3JlYXRlKF9kZXYpOwoKCS8qCgkgKiBEaXNhYmxlIHRoZSBnbG9iYWwgaW50ZXJydXB0IHVudGlsIGFsbCB0aGUgaW50ZXJydXB0CgkgKiBoYW5kbGVycyBhcmUgaW5zdGFsbGVkLgoJICovCglkd2Nfb3RnX2Rpc2FibGVfZ2xvYmFsX2ludGVycnVwdHMoZHdjX290Z19kZXZpY2UtPmNvcmVfaWYpOwoKCS8qCgkgKiBJbnN0YWxsIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIGNvbW1vbiBpbnRlcnJ1cHRzIGJlZm9yZQoJICogZW5hYmxpbmcgY29tbW9uIGludGVycnVwdHMgaW4gY29yZV9pbml0IGJlbG93LgoJICovCglEV0NfREVCVUdQTChEQkdfQ0lMLCAicmVnaXN0ZXJpbmcgKGNvbW1vbikgaGFuZGxlciBmb3IgaXJxJWRcbiIsCgkJICAgIGR3Y19vdGdfZGV2aWNlLT5pcnEpOwoJcmV0dmFsID0gcmVxdWVzdF9pcnEoZHdjX290Z19kZXZpY2UtPmlycSwgZHdjX290Z19jb21tb25faXJxLAoJCQkgICAgIElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCB8IElSUV9MRVZFTCwgImR3Y19vdGciLAoJCQkgICAgIGR3Y19vdGdfZGV2aWNlKTsKCWlmIChyZXR2YWwpIHsKCQlEV0NfRVJST1IoInJlcXVlc3Qgb2YgaXJxJWQgZmFpbGVkXG4iLCBkd2Nfb3RnX2RldmljZS0+aXJxKTsKCQlyZXR2YWwgPSAtRUJVU1k7CgkJZ290byBmYWlsOwoJfSBlbHNlIHsKCQlkd2Nfb3RnX2RldmljZS0+Y29tbW9uX2lycV9pbnN0YWxsZWQgPSAxOwoJfQoKI2lmZGVmIExNX0lOVEVSRkFDRQoJc2V0X2lycV90eXBlKF9kZXYtPmlycSwgSVJRVF9MT1cpOwojZWxzZQoJLyogRklYTUUgOiBNYWthcmFuZCAtIE5lZWQgdG8gY2hlY2sgYWJvdXQgaXQgKi8KCS8vc2V0X2lycV90eXBlKGR3Y19vdGdfZGV2aWNlLT5pcnEsIElSUVRfTE9XKTsKI2VuZGlmCgkvKgoJICogSW5pdGlhbGl6ZSB0aGUgRFdDX290ZyBjb3JlLgoJICovCglkd2Nfb3RnX2NvcmVfaW5pdChkd2Nfb3RnX2RldmljZS0+Y29yZV9pZik7CgojaWZuZGVmIERXQ19IT1NUX09OTFkKCS8qCgkgKiBJbml0aWFsaXplIHRoZSBQQ0QKCSAqLwoJcmV0dmFsID0gcGNkX2luaXQoX2Rldik7CglpZiAocmV0dmFsICE9IDApIHsKCQlEV0NfRVJST1IoInBjZF9pbml0IGZhaWxlZFxuIik7CgkJZHdjX290Z19kZXZpY2UtPnBjZCA9IE5VTEw7CgkJZ290byBmYWlsOwoJfQojZW5kaWYKI2lmbmRlZiBEV0NfREVWSUNFX09OTFkKCS8qCgkgKiBJbml0aWFsaXplIHRoZSBIQ0QKCSAqLwoJcmV0dmFsID0gaGNkX2luaXQoX2Rldik7CglpZiAocmV0dmFsICE9IDApIHsKCQlEV0NfRVJST1IoImhjZF9pbml0IGZhaWxlZFxuIik7CgkJZHdjX290Z19kZXZpY2UtPmhjZCA9IE5VTEw7CgkJZ290byBmYWlsOwoJfQojZW5kaWYKI2lmZGVmIFBDSV9JTlRFUkZBQ0UKCXBjaV9zZXRfZHJ2ZGF0YShfZGV2LCBkd2Nfb3RnX2RldmljZSk7Cglkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnBjaWRldiA9IF9kZXY7CiNlbmRpZgoKCS8qCgkgKiBFbmFibGUgdGhlIGdsb2JhbCBpbnRlcnJ1cHQgYWZ0ZXIgYWxsIHRoZSBpbnRlcnJ1cHQKCSAqIGhhbmRsZXJzIGFyZSBpbnN0YWxsZWQgaWYgdGhlcmUgaXMgbm8gQURQIHN1cHBvcnQgZWxzZQoJICogcGVyZm9ybSBpbml0aWFsIGFjdGlvbnMgcmVxdWlyZWQgZm9yIEludGVybmFsIEFEUCBsb2dpYy4KCSAqLwoJaWYgKCFkd2Nfb3RnX2dldF9wYXJhbV9hZHBfZW5hYmxlKGR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmKSkKCQlkd2Nfb3RnX2VuYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhkd2Nfb3RnX2RldmljZS0+Y29yZV9pZik7CgllbHNlCgkJZHdjX290Z19hZHBfc3RhcnQoZHdjX290Z19kZXZpY2UtPmNvcmVfaWYpOwoKCXJldHVybiAwOwoKZmFpbDoKCWR3Y19vdGdfZHJpdmVyX3JlbW92ZShfZGV2KTsKCXJldHVybiByZXR2YWw7Cn0KCiNpZiAwCi8qKgogKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBtZXRob2RzIHRvIGJlIGNhbGxlZCBieSBhIGJ1cyBkcml2ZXIKICogZHVyaW5nIHRoZSBsaWZlY3ljbGUgb2YgYSBkZXZpY2Ugb24gdGhhdCBidXMuIEJvdGggZHJpdmVycyBhbmQKICogZGV2aWNlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIGEgYnVzIGRyaXZlci4gVGhlIGJ1cyBkcml2ZXIgbWF0Y2hlcwogKiBkZXZpY2VzIHRvIGRyaXZlcnMgYmFzZWQgb24gaW5mb3JtYXRpb24gaW4gdGhlIGRldmljZSBhbmQgZHJpdmVyCiAqIHN0cnVjdHVyZXMuCiAqCiAqIFRoZSBwcm9iZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYnVzIGRyaXZlciBtYXRjaGVzIGEgZGV2aWNlCiAqIHRvIHRoaXMgZHJpdmVyLiBUaGUgcmVtb3ZlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgZGV2aWNlIGlzCiAqIHVucmVnaXN0ZXJlZCB3aXRoIHRoZSBidXMgZHJpdmVyLgogKi8KI2lmZGVmIExNX0lOVEVSRkFDRQpzdGF0aWMgc3RydWN0IGxtX2RyaXZlciBkd2Nfb3RnX2RyaXZlciA9IHsKCS5kcnYgPSB7Lm5hbWUgPSAoY2hhciAqKWR3Y19kcml2ZXJfbmFtZSx9LAoJLnByb2JlID0gZHdjX290Z19kcml2ZXJfcHJvYmUsCgkucmVtb3ZlID0gZHdjX290Z19kcml2ZXJfcmVtb3ZlLAp9OwojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCnN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfaWRzW10gPSB7IHsKCQkJCQkJIFBDSV9ERVZJQ0UoMHgxNmMzLCAweGFiY2QpLAoJCQkJCQkgLmRyaXZlcl9kYXRhID0KCQkJCQkJICh1bnNpZ25lZCBsb25nKTB4ZGVhZGJlZWYsCgkJCQkJCSB9LCB7IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcGNpX2lkcyk7CgovKiBwY2kgZHJpdmVyIGdsdWU7IHRoaXMgaXMgYSAibmV3IHN0eWxlIiBQQ0kgZHJpdmVyIG1vZHVsZSAqLwpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHdjX290Z19kcml2ZXIgPSB7CgkubmFtZSA9ICJkd2Nfb3RnIiwKCS5pZF90YWJsZSA9IHBjaV9pZHMsCgoJLnByb2JlID0gZHdjX290Z19kcml2ZXJfcHJvYmUsCgkucmVtb3ZlID0gZHdjX290Z19kcml2ZXJfcmVtb3ZlLAoKCS5kcml2ZXIgPSB7CgkJICAgLm5hbWUgPSAoY2hhciAqKWR3Y19kcml2ZXJfbmFtZSwKCQkgICB9LAp9OwojZW5kaWYKCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBkd2Nfb3RnX2RyaXZlciBpcyBpbnN0YWxsZWQgd2l0aCB0aGUKICogaW5zbW9kIGNvbW1hbmQuIEl0IHJlZ2lzdGVycyB0aGUgZHdjX290Z19kcml2ZXIgc3RydWN0dXJlIHdpdGggdGhlCiAqIGFwcHJvcHJpYXRlIGJ1cyBkcml2ZXIuIFRoaXMgd2lsbCBjYXVzZSB0aGUgZHdjX290Z19kcml2ZXJfcHJvYmUgZnVuY3Rpb24KICogdG8gYmUgY2FsbGVkLiBJbiBhZGRpdGlvbiwgdGhlIGJ1cyBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGV4cG9zZQogKiBhdHRyaWJ1dGVzIGRlZmluZWQgZm9yIHRoZSBkZXZpY2UgYW5kIGRyaXZlciBpbiB0aGUgc3BlY2lhbCBzeXNmcyBmaWxlCiAqIHN5c3RlbS4KICoKICogQHJldHVybgogKi8Kc3RhdGljIGludCBfX2luaXQgZHdjX290Z19kcml2ZXJfaW5pdCh2b2lkKQp7CglpbnQgcmV0dmFsID0gMDsKCWludCBlcnJvcjsKCXByaW50ayhLRVJOX0lORk8gIiVzOiB2ZXJzaW9uICVzXG4iLCBkd2NfZHJpdmVyX25hbWUsCgkgICAgICAgRFdDX0RSSVZFUl9WRVJTSU9OKTsKI2lmZGVmIExNX0lOVEVSRkFDRQoJcmV0dmFsID0gbG1fZHJpdmVyX3JlZ2lzdGVyKCZkd2Nfb3RnX2RyaXZlcik7CiNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKCXJldHZhbCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmR3Y19vdGdfZHJpdmVyKTsKI2VuZGlmCglpZiAocmV0dmFsIDwgMCkgewoJCXByaW50ayhLRVJOX0VSUiAiJXMgcmV0dmFsPSVkXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKCQlyZXR1cm4gcmV0dmFsOwoJfQojaWZkZWYgTE1fSU5URVJGQUNFCgllcnJvciA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJ2LCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CgllcnJvciA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJ2LCAmZHJpdmVyX2F0dHJfZGVidWdsZXZlbCk7CiNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKCWVycm9yID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKCWVycm9yID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl9kZWJ1Z2xldmVsKTsKI2VuZGlmCglyZXR1cm4gcmV0dmFsOwp9Cgptb2R1bGVfaW5pdChkd2Nfb3RnX2RyaXZlcl9pbml0KTsKCi8qKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBkcml2ZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwKICogd2l0aCB0aGUgcm1tb2QgY29tbWFuZC4gVGhlIGRyaXZlciB1bnJlZ2lzdGVycyBpdHNlbGYgd2l0aCBpdHMgYnVzCiAqIGRyaXZlci4KICoKICovCnN0YXRpYyB2b2lkIF9fZXhpdCBkd2Nfb3RnX2RyaXZlcl9jbGVhbnVwKHZvaWQpCnsKCXByaW50ayhLRVJOX0RFQlVHICJkd2Nfb3RnX2RyaXZlcl9jbGVhbnVwKClcbiIpOwoKI2lmZGVmIExNX0lOVEVSRkFDRQoJZHJpdmVyX3JlbW92ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcnYsICZkcml2ZXJfYXR0cl9kZWJ1Z2xldmVsKTsKCWRyaXZlcl9yZW1vdmVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJ2LCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CglsbV9kcml2ZXJfdW5yZWdpc3RlcigmZHdjX290Z19kcml2ZXIpOwojZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCglkcml2ZXJfcmVtb3ZlX2ZpbGUoJmR3Y19vdGdfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX2RlYnVnbGV2ZWwpOwoJZHJpdmVyX3JlbW92ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZHdjX290Z19kcml2ZXIpOwojZW5kaWYKCglwcmludGsoS0VSTl9JTkZPICIlcyBtb2R1bGUgcmVtb3ZlZFxuIiwgZHdjX2RyaXZlcl9uYW1lKTsKfQoKbW9kdWxlX2V4aXQoZHdjX290Z19kcml2ZXJfY2xlYW51cCk7CiNlbHNlCgovKgogKiBQbGF0Zm9ybSBTcGVjaWZpYyBDb250cm9sbGVyIFN1c3BlbmQgUm91dGllbmUuCiAqIEl0IGRvZXMgYSBQb3J0IHN1c3BlbmQsIGFuZCBnYXRlIHRoZSBjbG9jayAoUG93ZXIgT2ZmIEwxKS4KICogQ29udHJvbGxlciBhbmQgUEhZIHJlc2V0IChQb3dlciBPZmYgTDIpIGZ1bmN0aW9uYWxpdHkKICogaXMgbm90IHN1cHBvcnRlZAogKi8KaW50IGNvbWNlcnRvX3VzYjJfYnVzX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqIHBkLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCnsKCWludCBlcnJvcl9zdGF0dXMgPSAwLCB2YWwgPSAwOwoJc3RydWN0IHVzYl9oY2QgKmhjZCA9IE5VTEw7CgoJaGNkID0gKHN0cnVjdCB1c2JfaGNkICopIHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkKTsKCgkvKiBEbyB0aGUgcG9ydCBzdXNwZW5kIGZvciBVU0IgMi4wIENvbnRyb2xsZXIgKi8KCWR3Y19vdGdfaG9zdF9wb3J0X3N1c3BlbmQoaGNkKTsKCglmb3IgKHZhbCA9IDAgOyB2YWwgPCA1MCA7IHZhbCsrKQoJCXVkZWxheSgxMDAwKTsKCgkvKiBEaXNhYmxlIHRoZSBDbG9jayAqLwoJY2xrX2Rpc2FibGUodXNiMl9jbGspOwoKCXJldHVybiBlcnJvcl9zdGF0dXM7Cn0KCi8qCiAqIFBsYXRmb3JtIFNwZWNpZmljIENvbnRyb2xsZXIgUmVzdW1lIFJvdXRpZW5lLgogKiBJdCBkb2VzIGEgUG9ydCByZXN1bWUsIGFuZCBlbmFibGUgdGhlIGNsb2NrIChQb3dlciBPZmYgTDEpLgogKiBSZXN1bWUgZnJvbSAoUG93ZXIgT2ZmIEwyKSBpcyBub3Qgc3VwcG9ydGVkCiAqLwppbnQgY29tY2VydG9fdXNiMl9idXNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkKQp7CglpbnQgZXJyb3Jfc3RhdHVzID0gMDsKCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBOVUxMOwoKCS8qIEVuYWJsZSB0aGUgQ2xvY2sgKi8KCWlmIChjbGtfZW5hYmxlKHVzYjJfY2xrKSl7CgkJcHJfZXJyKCJjb21jZXJ0b191c2IyX2J1c19yZXN1bWVfZHVtbXk6VW5hYmxlIHRvIGVuYWJsZSB0aGUgdXNiMiBjbG9jayBcbiIpOwoJfQoKCWhjZCA9IChzdHJ1Y3QgdXNiX2hjZCAqKSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZCk7CgoJZHdjX290Z19ob3N0X3BvcnRfcmVzdW1lKGhjZCk7CgoJcmV0dXJuIGVycm9yX3N0YXR1czsKfQoKLyoqCiAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIG1ldGhvZHMgdG8gYmUgY2FsbGVkIGJ5IGEgYnVzIGRyaXZlcgogKiBkdXJpbmcgdGhlIGxpZmVjeWNsZSBvZiBhIGRldmljZSBvbiB0aGF0IGJ1cy4gQm90aCBkcml2ZXJzIGFuZAogKiBkZXZpY2VzIGFyZSByZWdpc3RlcmVkIHdpdGggYSBidXMgZHJpdmVyLiBUaGUgYnVzIGRyaXZlciBtYXRjaGVzCiAqIGRldmljZXMgdG8gZHJpdmVycyBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiB0aGUgZGV2aWNlIGFuZCBkcml2ZXIKICogc3RydWN0dXJlcy4KICoKICogVGhlIHByb2JlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBidXMgZHJpdmVyIG1hdGNoZXMgYSBkZXZpY2UKICogdG8gdGhpcyBkcml2ZXIuIFRoZSByZW1vdmUgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBkZXZpY2UgaXMKICogdW5yZWdpc3RlcmVkIHdpdGggdGhlIGJ1cyBkcml2ZXIuCiAqLwpzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkd2Nfb3RnX2RyaXZlciA9IHsKCS5kcml2ZXIgPSB7CgkJLm5hbWUJPSAoY2hhciAqKWR3Y19kcml2ZXJfbmFtZSwKCX0sCgkucHJvYmUJCT0gZHdjX290Z19kcml2ZXJfcHJvYmUsCgkucmVtb3ZlCQk9IGR3Y19vdGdfZHJpdmVyX3JlbW92ZSwKCgkuc3VzcGVuZCA9IGNvbWNlcnRvX3VzYjJfYnVzX3N1c3BlbmQsCgkucmVzdW1lID0gY29tY2VydG9fdXNiMl9idXNfcmVzdW1lLAp9OwoKLyoqCiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGR3Y19vdGdfZHJpdmVyIGlzIGluc3RhbGxlZCB3aXRoIHRoZQogKiBpbnNtb2QgY29tbWFuZC4gSXQgcmVnaXN0ZXJzIHRoZSBkd2Nfb3RnX2RyaXZlciBzdHJ1Y3R1cmUgd2l0aCB0aGUKICogYXBwcm9wcmlhdGUgYnVzIGRyaXZlci4gVGhpcyB3aWxsIGNhdXNlIHRoZSBkd2Nfb3RnX2RyaXZlcl9wcm9iZSBmdW5jdGlvbgogKiB0byBiZSBjYWxsZWQuIEluIGFkZGl0aW9uLCB0aGUgYnVzIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZXhwb3NlCiAqIGF0dHJpYnV0ZXMgZGVmaW5lZCBmb3IgdGhlIGRldmljZSBhbmQgZHJpdmVyIGluIHRoZSBzcGVjaWFsIHN5c2ZzIGZpbGUKICogc3lzdGVtLgogKgogKiBAcmV0dXJuCiAqLwpzdGF0aWMgaW50IF9faW5pdCBkd2Nfb3RnX2RyaXZlcl9pbml0KHZvaWQpCnsKCWludCByZXR2YWwgPSAwOwoJaW50IGVycm9yOwoKCXByaW50ayhLRVJOX0lORk8gIiVzOiB2ZXJzaW9uICVzXG4iLCBkd2NfZHJpdmVyX25hbWUsIERXQ19EUklWRVJfVkVSU0lPTik7CgoJcmV0dmFsID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkd2Nfb3RnX2RyaXZlcik7CglpZiAocmV0dmFsKSB7CgkJcHJpbnRrKEtFUk5fRVJSICIlcyByZXR2YWw9JWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOwoJCXJldHVybiByZXR2YWw7Cgl9CgoJZXJyb3IgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJmR3Y19vdGdfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX3ZlcnNpb24pOwoJZXJyb3IgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJmR3Y19vdGdfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX2RlYnVnbGV2ZWwpOwoKCXJldHVybiByZXR2YWw7Cn0KbW9kdWxlX2luaXQoZHdjX290Z19kcml2ZXJfaW5pdCk7CgovKioKICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgZHJpdmVyIGlzIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsCiAqIHdpdGggdGhlIHJtbW9kIGNvbW1hbmQuIFRoZSBkcml2ZXIgdW5yZWdpc3RlcnMgaXRzZWxmIHdpdGggaXRzIGJ1cwogKiBkcml2ZXIuCiAqCiAqLwpzdGF0aWMgdm9pZCBfX2V4aXQgZHdjX290Z19kcml2ZXJfY2xlYW51cCh2b2lkKQp7CglwcmludGsoS0VSTl9ERUJVRyAiZHdjX290Z19kcml2ZXJfY2xlYW51cCgpXG4iKTsKCglkcml2ZXJfcmVtb3ZlX2ZpbGUoJmR3Y19vdGdfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX2RlYnVnbGV2ZWwpOwoJZHJpdmVyX3JlbW92ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKCglwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHdjX290Z19kcml2ZXIpOwoKCXByaW50ayhLRVJOX0lORk8gIiVzIG1vZHVsZSByZW1vdmVkXG4iLCBkd2NfZHJpdmVyX25hbWUpOwp9Cm1vZHVsZV9leGl0KGR3Y19vdGdfZHJpdmVyX2NsZWFudXApOwoKI2VuZGlmCgpNT0RVTEVfREVTQ1JJUFRJT04oRFdDX0RSSVZFUl9ERVNDKTsKTU9EVUxFX0FVVEhPUigiU3lub3BzeXMgSW5jLiIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfcGFyYW1fbmFtZWQob3RnX2NhcCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLm90Z19jYXAsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0Mob3RnX2NhcCwgIk9URyBDYXBhYmlsaXRpZXMgMD1ITlAmU1JQIDE9U1JQIE9ubHkgMj1Ob25lIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChvcHQsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5vcHQsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0Mob3B0LCAiT1BUIE1vZGUiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRtYV9lbmFibGUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kbWFfZW5hYmxlLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRtYV9lbmFibGUsICJETUEgTW9kZSAwPVNsYXZlIDE9RE1BIGVuYWJsZWQiKTsKCm1vZHVsZV9wYXJhbV9uYW1lZChkbWFfZGVzY19lbmFibGUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kbWFfZGVzY19lbmFibGUsIGludCwKCQkgICAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkbWFfZGVzY19lbmFibGUsCgkJICJETUEgRGVzYyBNb2RlIDA9QWRkcmVzcyBETUEgMT1ETUEgRGVzY3JpcHRvciBlbmFibGVkIik7Cgptb2R1bGVfcGFyYW1fbmFtZWQoZG1hX2J1cnN0X3NpemUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kbWFfYnVyc3Rfc2l6ZSwgaW50LAoJCSAgIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRtYV9idXJzdF9zaXplLAoJCSAiRE1BIEJ1cnN0IFNpemUgMSwgNCwgOCwgMTYsIDMyLCA2NCwgMTI4LCAyNTYiKTsKbW9kdWxlX3BhcmFtX25hbWVkKHNwZWVkLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuc3BlZWQsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0Moc3BlZWQsICJTcGVlZCAwPUhpZ2ggU3BlZWQgMT1GdWxsIFNwZWVkIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyLCBpbnQsCgkJICAgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlciwKCQkgIlN1cHBvcnQgTG93IFBvd2VyIHcvRlMgb3IgTFMgMD1TdXBwb3J0IDE9RG9uJ3QgU3VwcG9ydCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoaG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsaywKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsaywgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhob3N0X2xzX2xvd19wb3dlcl9waHlfY2xrLAoJCSAiTG93IFNwZWVkIExvdyBQb3dlciBDbG9jayAwPTQ4TWh6IDE9Nk1oeiIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZW5hYmxlX2R5bmFtaWNfZmlmbywKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZW5hYmxlX2R5bmFtaWNfZmlmbywgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfZHluYW1pY19maWZvLCAiMD1jQyBTZXR0aW5nIDE9QWxsb3cgRHluYW1pYyBTaXppbmciKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRhdGFfZmlmb19zaXplLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGF0YV9maWZvX3NpemUsIGludCwKCQkgICAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkYXRhX2ZpZm9fc2l6ZSwKCQkgIlRvdGFsIG51bWJlciBvZiB3b3JkcyBpbiB0aGUgZGF0YSBGSUZPIG1lbW9yeSAzMi0zMjc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3J4X2ZpZm9fc2l6ZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9yeF9maWZvX3NpemUsCgkJICAgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfcnhfZmlmb19zaXplLCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBSeCBGSUZPIDE2LTMyNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZSwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X25wZXJpb190eF9maWZvX3NpemUsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X25wZXJpb190eF9maWZvX3NpemUsCgkJICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIG5vbi1wZXJpb2RpYyBUeCBGSUZPIDE2LTMyNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbMF0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8xLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzIsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbMV0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8yLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzMsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbMl0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8zLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzQsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbM10sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV80LAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzUsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbNF0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV81LAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzYsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbNV0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV82LAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzcsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbNl0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV83LAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzgsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbN10sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV84LAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzksCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbOF0sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV85LAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEwLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzldLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMTAsCgkJICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIHBlcmlvZGljIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl9wZXJpb190eF9maWZvX3NpemVfMTEsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbMTBdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMTEsCgkJICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIHBlcmlvZGljIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl9wZXJpb190eF9maWZvX3NpemVfMTIsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbMTFdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMTIsCgkJICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIHBlcmlvZGljIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl9wZXJpb190eF9maWZvX3NpemVfMTMsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbMTJdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMTMsCgkJICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIHBlcmlvZGljIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl9wZXJpb190eF9maWZvX3NpemVfMTQsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbMTNdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMTQsCgkJICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIHBlcmlvZGljIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl9wZXJpb190eF9maWZvX3NpemVfMTUsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbMTRdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMTUsCgkJICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIHBlcmlvZGljIFR4IEZJRk8gNC03NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGhvc3RfcnhfZmlmb19zaXplLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9yeF9maWZvX3NpemUsCgkJICAgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhob3N0X3J4X2ZpZm9fc2l6ZSwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgUnggRklGTyAxNi0zMjc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoaG9zdF9ucGVyaW9fdHhfZmlmb19zaXplLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X25wZXJpb190eF9maWZvX3NpemUsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoaG9zdF9ucGVyaW9fdHhfZmlmb19zaXplLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBub24tcGVyaW9kaWMgVHggRklGTyAxNi0zMjc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoaG9zdF9wZXJpb190eF9maWZvX3NpemUsCgkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfcGVyaW9fdHhfZmlmb19zaXplLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGhvc3RfcGVyaW9fdHhfZmlmb19zaXplLAoJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBob3N0IHBlcmlvZGljIFR4IEZJRk8gMTYtMzI3NjgiKTsKbW9kdWxlX3BhcmFtX25hbWVkKG1heF90cmFuc2Zlcl9zaXplLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMubWF4X3RyYW5zZmVyX3NpemUsCgkJICAgaW50LCAwNDQ0KTsKLyoqIEB0b2RvIFNldCB0aGUgbWF4IHRvIDUxMkssIG1vZGlmeSBjaGVja3MgKi8KTU9EVUxFX1BBUk1fREVTQyhtYXhfdHJhbnNmZXJfc2l6ZSwKCQkgIlRoZSBtYXhpbXVtIHRyYW5zZmVyIHNpemUgc3VwcG9ydGVkIGluIGJ5dGVzIDIwNDctNjU1MzUiKTsKbW9kdWxlX3BhcmFtX25hbWVkKG1heF9wYWNrZXRfY291bnQsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5tYXhfcGFja2V0X2NvdW50LAoJCSAgIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MobWF4X3BhY2tldF9jb3VudCwKCQkgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIGluIGEgdHJhbnNmZXIgMTUtNTExIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChob3N0X2NoYW5uZWxzLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9jaGFubmVscywgaW50LAoJCSAgIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGhvc3RfY2hhbm5lbHMsCgkJICJUaGUgbnVtYmVyIG9mIGhvc3QgY2hhbm5lbCByZWdpc3RlcnMgdG8gdXNlIDEtMTYiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl9lbmRwb2ludHMsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfZW5kcG9pbnRzLCBpbnQsCgkJICAgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X2VuZHBvaW50cywKCQkgIlRoZSBudW1iZXIgb2YgZW5kcG9pbnRzIGluIGFkZGl0aW9uIHRvIEVQMCBhdmFpbGFibGUgZm9yIGRldmljZSBtb2RlIDEtMTUiKTsKbW9kdWxlX3BhcmFtX25hbWVkKHBoeV90eXBlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucGh5X3R5cGUsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MocGh5X3R5cGUsICIwPVJlc2VydmVkIDE9VVRNSSsgMj1VTFBJIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChwaHlfdXRtaV93aWR0aCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnBoeV91dG1pX3dpZHRoLCBpbnQsCgkJICAgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MocGh5X3V0bWlfd2lkdGgsICJTcGVjaWZpZXMgdGhlIFVUTUkrIERhdGEgV2lkdGggOCBvciAxNiBiaXRzIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChwaHlfdWxwaV9kZHIsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5waHlfdWxwaV9kZHIsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MocGh5X3VscGlfZGRyLAoJCSAiVUxQSSBhdCBkb3VibGUgb3Igc2luZ2xlIGRhdGEgcmF0ZSAwPVNpbmdsZSAxPURvdWJsZSIpOwptb2R1bGVfcGFyYW1fbmFtZWQocGh5X3VscGlfZXh0X3ZidXMsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5waHlfdWxwaV9leHRfdmJ1cywKCQkgICBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHBoeV91bHBpX2V4dF92YnVzLAoJCSAiVUxQSSBQSFkgdXNpbmcgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgdmJ1cyAwPUludGVybmFsIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChpMmNfZW5hYmxlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaTJjX2VuYWJsZSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhpMmNfZW5hYmxlLCAiRlMgUEhZIEludGVyZmFjZSIpOwptb2R1bGVfcGFyYW1fbmFtZWQodWxwaV9mc19scywgZHdjX290Z19tb2R1bGVfcGFyYW1zLnVscGlfZnNfbHMsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0ModWxwaV9mc19scywgIlVMUEkgUEhZIEZTL0xTIG1vZGUgb25seSIpOwptb2R1bGVfcGFyYW1fbmFtZWQodHNfZGxpbmUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy50c19kbGluZSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyh0c19kbGluZSwgIlRlcm0gc2VsZWN0IERsaW5lIHB1bHNpbmcgZm9yIGFsbCBQSFlzIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZ19kYmdfbHZsLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiIik7Cgptb2R1bGVfcGFyYW1fbmFtZWQoZW5fbXVsdGlwbGVfdHhfZmlmbywKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZW5fbXVsdGlwbGVfdHhfZmlmbywgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhlbl9tdWx0aXBsZV90eF9maWZvLAoJCSAiRGVkaWNhdGVkIE5vbiBQZXJpb2RpYyBUeCBGSUZPcyAwPWRpc2FibGVkIDE9ZW5hYmxlZCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzBdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfMSwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8yLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzFdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfMiwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8zLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzJdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfMywgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV80LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzNdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfNCwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV81LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzRdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfNSwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV82LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzVdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfNiwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV83LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzZdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfNywgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV84LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzddLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfOCwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV85LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzhdLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfOSwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xMCwKCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVs5XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzEwLCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfdHhfZmlmb19zaXplXzExLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzEwXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzExLCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfdHhfZmlmb19zaXplXzEyLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzExXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzEyLCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfdHhfZmlmb19zaXplXzEzLAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzEyXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzEzLCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfdHhfZmlmb19zaXplXzE0LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzEzXSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzE0LCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBUeCBGSUZPIDQtNzY4Iik7Cm1vZHVsZV9wYXJhbV9uYW1lZChkZXZfdHhfZmlmb19zaXplXzE1LAoJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzE0XSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzE1LCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBUeCBGSUZPIDQtNzY4Iik7Cgptb2R1bGVfcGFyYW1fbmFtZWQodGhyX2N0bCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnRocl9jdGwsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0ModGhyX2N0bCwKCQkgIlRocmVzaG9sZGluZyBlbmFibGUgZmxhZyBiaXQgMCAtIG5vbiBJU08gVHggdGhyLiwgMSAtIElTTyBUeCB0aHIuLCAyIC0gUnggdGhyLi0gYml0IDA9ZGlzYWJsZWQgMT1lbmFibGVkIik7Cm1vZHVsZV9wYXJhbV9uYW1lZCh0eF90aHJfbGVuZ3RoLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudHhfdGhyX2xlbmd0aCwgaW50LAoJCSAgIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHR4X3Rocl9sZW5ndGgsICJUeCBUaHJlc2hvbGQgbGVuZ3RoIGluIDMyIGJpdCBEV09SRHMiKTsKbW9kdWxlX3BhcmFtX25hbWVkKHJ4X3Rocl9sZW5ndGgsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5yeF90aHJfbGVuZ3RoLCBpbnQsCgkJICAgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MocnhfdGhyX2xlbmd0aCwgIlJ4IFRocmVzaG9sZCBsZW5ndGggaW4gMzIgYml0IERXT1JEcyIpOwoKbW9kdWxlX3BhcmFtX25hbWVkKHB0aV9lbmFibGUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5wdGlfZW5hYmxlLCBpbnQsIDA0NDQpOwptb2R1bGVfcGFyYW1fbmFtZWQobXBpX2VuYWJsZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLm1waV9lbmFibGUsIGludCwgMDQ0NCk7Cm1vZHVsZV9wYXJhbV9uYW1lZChscG1fZW5hYmxlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMubHBtX2VuYWJsZSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhscG1fZW5hYmxlLCAiTFBNIEVuYWJsZSAwPUxQTSBEaXNhYmxlZCAxPUxQTSBFbmFibGVkIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChpY191c2JfY2FwLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaWNfdXNiX2NhcCwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhpY191c2JfY2FwLAoJCSAiSUNfVVNCIENhcGFiaWxpdHkgMD1JQ19VU0IgRGlzYWJsZWQgMT1JQ19VU0IgRW5hYmxlZCIpOwptb2R1bGVfcGFyYW1fbmFtZWQoYWhiX3Rocl9yYXRpbywgZHdjX290Z19tb2R1bGVfcGFyYW1zLmFoYl90aHJfcmF0aW8sIGludCwKCQkgICAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhhaGJfdGhyX3JhdGlvLCAiQUhCIFRocmVzaG9sZCBSYXRpbyIpOwptb2R1bGVfcGFyYW1fbmFtZWQocG93ZXJfZG93biwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnBvd2VyX2Rvd24sIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MocG93ZXJfZG93biwgIlBvd2VyIERvd24gTW9kZSIpOwptb2R1bGVfcGFyYW1fbmFtZWQocmVsb2FkX2N0bCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnJlbG9hZF9jdGwsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MocmVsb2FkX2N0bCwgIkhGSVIgUmVsb2FkIENvbnRyb2wiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGRldl9vdXRfbmFrLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X291dF9uYWssIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoZGV2X291dF9uYWssICJFbmFibGUgRGV2aWNlIE9VVCBOQUsiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGFkcF9lbmFibGUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5hZHBfZW5hYmxlLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKGFkcF9lbmFibGUsICJBRFAgRW5hYmxlIDA9QURQIERpc2FibGVkIDE9QURQIEVuYWJsZWQiKTsKbW9kdWxlX3BhcmFtX25hbWVkKG90Z192ZXIsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5vdGdfdmVyLCBpbnQsIDA0NDQpOwpNT0RVTEVfUEFSTV9ERVNDKG90Z192ZXIsICJPVEcgcmV2aXNpb24gc3VwcG9ydGVkIDA9T1RHIDEuMyAxPU9URyAyLjAiKTsKCi8qKiBAcGFnZSAiTW9kdWxlIFBhcmFtZXRlcnMiCiAqCiAqIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBtYXkgYmUgc3BlY2lmaWVkIHdoZW4gc3RhcnRpbmcgdGhlIG1vZHVsZS4KICogVGhlc2UgcGFyYW1ldGVycyBkZWZpbmUgaG93IHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgc2hvdWxkIGJlCiAqIGNvbmZpZ3VyZWQuIFBhcmFtZXRlciB2YWx1ZXMgYXJlIHBhc3NlZCB0byB0aGUgQ0lMIGluaXRpYWxpemF0aW9uCiAqIGZ1bmN0aW9uIGR3Y19vdGdfY2lsX2luaXQKICoKICogRXhhbXBsZTogPGNvZGU+bW9kcHJvYmUgZHdjX290ZyBzcGVlZD0xIG90Z19jYXA9MTwvY29kZT4KICoKCiA8dGFibGU+CiA8dHI+PHRkPlBhcmFtZXRlciBOYW1lPC90ZD48dGQ+TWVhbmluZzwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+b3RnX2NhcDwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHRoZSBPVEcgY2FwYWJpbGl0aWVzLiBUaGUgZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlCiB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcyBzcGVjaWZpZWQuCiAtIDA6IEhOUCBhbmQgU1JQIGNhcGFibGUgKGRlZmF1bHQsIGlmIGF2YWlsYWJsZSkKIC0gMTogU1JQIE9ubHkgY2FwYWJsZQogLSAyOiBObyBITlAvU1JQIGNhcGFibGUKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+ZG1hX2VuYWJsZTwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIHNsYXZlIG9yIERNQSBtb2RlIGZvciBhY2Nlc3NpbmcgdGhlIGRhdGEgRklGT3MuCiBUaGUgZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpZiBub25lIGlzCiBzcGVjaWZpZWQuCiAtIDA6IFNsYXZlCiAtIDE6IERNQSAoZGVmYXVsdCwgaWYgYXZhaWxhYmxlKQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5kbWFfYnVyc3Rfc2l6ZTwvdGQ+CiA8dGQ+VGhlIERNQSBCdXJzdCBzaXplIChhcHBsaWNhYmxlIG9ubHkgZm9yIEV4dGVybmFsIERNQSBNb2RlKS4KIC0gVmFsdWVzOiAxLCA0LCA4IDE2LCAzMiwgNjQsIDEyOCwgMjU2IChkZWZhdWx0IDMyKQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5zcGVlZDwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNwZWVkIG9mIG9wZXJhdGlvbiBpbiBob3N0IGFuZCBkZXZpY2UgbW9kZS4gVGhlCiBhY3R1YWwgc3BlZWQgZGVwZW5kcyBvbiB0aGUgc3BlZWQgb2YgdGhlIGF0dGFjaGVkIGRldmljZSBhbmQgdGhlIHZhbHVlIG9mCiBwaHlfdHlwZS4KIC0gMDogSGlnaCBTcGVlZCAoZGVmYXVsdCkKIC0gMTogRnVsbCBTcGVlZAogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5ob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBsb3cgcG93ZXIgbW9kZSBpcyBzdXBwb3J0ZWQgd2hlbiBhdHRhY2hlZCB0byBhIEZ1bGwKIFNwZWVkIG9yIExvdyBTcGVlZCBkZXZpY2UgaW4gaG9zdCBtb2RlLgogLSAwOiBEb24ndCBzdXBwb3J0IGxvdyBwb3dlciBtb2RlIChkZWZhdWx0KQogLSAxOiBTdXBwb3J0IGxvdyBwb3dlciBtb2RlCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmhvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGs8L3RkPgogPHRkPlNwZWNpZmllcyB0aGUgUEhZIGNsb2NrIHJhdGUgaW4gbG93IHBvd2VyIG1vZGUgd2hlbiBjb25uZWN0ZWQgdG8gYSBMb3cKIFNwZWVkIGRldmljZSBpbiBob3N0IG1vZGUuIFRoaXMgcGFyYW1ldGVyIGlzIGFwcGxpY2FibGUgb25seSBpZgogSE9TVF9TVVBQT1JUX0ZTX0xTX0xPV19QT1dFUiBpcyBlbmFibGVkLgogLSAwOiA0OCBNSHogKGRlZmF1bHQpCiAtIDE6IDYgTUh6CiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmVuYWJsZV9keW5hbWljX2ZpZm88L3RkPgogPHRkPiBTcGVjaWZpZXMgd2hldGhlciBGSUZPcyBtYXkgYmUgcmVzaXplZCBieSB0aGUgZHJpdmVyIHNvZnR3YXJlLgogLSAwOiBVc2UgY0MgRklGTyBzaXplIHBhcmFtZXRlcnMKIC0gMTogQWxsb3cgZHluYW1pYyBGSUZPIHNpemluZyAoZGVmYXVsdCkKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+ZGF0YV9maWZvX3NpemU8L3RkPgogPHRkPlRvdGFsIG51bWJlciBvZiA0LWJ5dGUgd29yZHMgaW4gdGhlIGRhdGEgRklGTyBtZW1vcnkuIFRoaXMgbWVtb3J5CiBpbmNsdWRlcyB0aGUgUnggRklGTywgbm9uLXBlcmlvZGljIFR4IEZJRk8sIGFuZCBwZXJpb2RpYyBUeCBGSUZPcy4KIC0gVmFsdWVzOiAzMiB0byAzMjc2OCAoZGVmYXVsdCA4MTkyKQoKIE5vdGU6IFRoZSB0b3RhbCBGSUZPIG1lbW9yeSBkZXB0aCBpbiB0aGUgRlBHQSBjb25maWd1cmF0aW9uIGlzIDgxOTIuCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmRldl9yeF9maWZvX3NpemU8L3RkPgogPHRkPk51bWJlciBvZiA0LWJ5dGUgd29yZHMgaW4gdGhlIFJ4IEZJRk8gaW4gZGV2aWNlIG1vZGUgd2hlbiBkeW5hbWljCiBGSUZPIHNpemluZyBpcyBlbmFibGVkLgogLSBWYWx1ZXM6IDE2IHRvIDMyNzY4IChkZWZhdWx0IDEwNjQpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmRldl9ucGVyaW9fdHhfZmlmb19zaXplPC90ZD4KIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBub24tcGVyaW9kaWMgVHggRklGTyBpbiBkZXZpY2UgbW9kZSB3aGVuCiBkeW5hbWljIEZJRk8gc2l6aW5nIGlzIGVuYWJsZWQuCiAtIFZhbHVlczogMTYgdG8gMzI3NjggKGRlZmF1bHQgMTAyNCkKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+ZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV9uIChuID0gMSB0byAxNSk8L3RkPgogPHRkPk51bWJlciBvZiA0LWJ5dGUgd29yZHMgaW4gZWFjaCBvZiB0aGUgcGVyaW9kaWMgVHggRklGT3MgaW4gZGV2aWNlIG1vZGUKIHdoZW4gZHluYW1pYyBGSUZPIHNpemluZyBpcyBlbmFibGVkLgogLSBWYWx1ZXM6IDQgdG8gNzY4IChkZWZhdWx0IDI1NikKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+aG9zdF9yeF9maWZvX3NpemU8L3RkPgogPHRkPk51bWJlciBvZiA0LWJ5dGUgd29yZHMgaW4gdGhlIFJ4IEZJRk8gaW4gaG9zdCBtb2RlIHdoZW4gZHluYW1pYyBGSUZPCiBzaXppbmcgaXMgZW5hYmxlZC4KIC0gVmFsdWVzOiAxNiB0byAzMjc2OCAoZGVmYXVsdCAxMDI0KQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5ob3N0X25wZXJpb190eF9maWZvX3NpemU8L3RkPgogPHRkPk51bWJlciBvZiA0LWJ5dGUgd29yZHMgaW4gdGhlIG5vbi1wZXJpb2RpYyBUeCBGSUZPIGluIGhvc3QgbW9kZSB3aGVuCiBkeW5hbWljIEZJRk8gc2l6aW5nIGlzIGVuYWJsZWQgaW4gdGhlIGNvcmUuCiAtIFZhbHVlczogMTYgdG8gMzI3NjggKGRlZmF1bHQgMTAyNCkKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+aG9zdF9wZXJpb190eF9maWZvX3NpemU8L3RkPgogPHRkPk51bWJlciBvZiA0LWJ5dGUgd29yZHMgaW4gdGhlIGhvc3QgcGVyaW9kaWMgVHggRklGTyB3aGVuIGR5bmFtaWMgRklGTwogc2l6aW5nIGlzIGVuYWJsZWQuCiAtIFZhbHVlczogMTYgdG8gMzI3NjggKGRlZmF1bHQgMTAyNCkKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+bWF4X3RyYW5zZmVyX3NpemU8L3RkPgogPHRkPlRoZSBtYXhpbXVtIHRyYW5zZmVyIHNpemUgc3VwcG9ydGVkIGluIGJ5dGVzLgogLSBWYWx1ZXM6IDIwNDcgdG8gNjUsNTM1IChkZWZhdWx0IDY1LDUzNSkKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+bWF4X3BhY2tldF9jb3VudDwvdGQ+CiA8dGQ+VGhlIG1heGltdW0gbnVtYmVyIG9mIHBhY2tldHMgaW4gYSB0cmFuc2Zlci4KIC0gVmFsdWVzOiAxNSB0byA1MTEgKGRlZmF1bHQgNTExKQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5ob3N0X2NoYW5uZWxzPC90ZD4KIDx0ZD5UaGUgbnVtYmVyIG9mIGhvc3QgY2hhbm5lbCByZWdpc3RlcnMgdG8gdXNlLgogLSBWYWx1ZXM6IDEgdG8gMTYgKGRlZmF1bHQgMTIpCgogTm90ZTogVGhlIEZQR0EgY29uZmlndXJhdGlvbiBzdXBwb3J0cyBhIG1heGltdW0gb2YgMTIgaG9zdCBjaGFubmVscy4KIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+ZGV2X2VuZHBvaW50czwvdGQ+CiA8dGQ+VGhlIG51bWJlciBvZiBlbmRwb2ludHMgaW4gYWRkaXRpb24gdG8gRVAwIGF2YWlsYWJsZSBmb3IgZGV2aWNlIG1vZGUKIG9wZXJhdGlvbnMuCiAtIFZhbHVlczogMSB0byAxNSAoZGVmYXVsdCA2IElOIGFuZCBPVVQpCgogTm90ZTogVGhlIEZQR0EgY29uZmlndXJhdGlvbiBzdXBwb3J0cyBhIG1heGltdW0gb2YgNiBJTiBhbmQgT1VUIGVuZHBvaW50cyBpbgogYWRkaXRpb24gdG8gRVAwLgogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5waHlfdHlwZTwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHRoZSB0eXBlIG9mIFBIWSBpbnRlcmZhY2UgdG8gdXNlLiBCeSBkZWZhdWx0LCB0aGUgZHJpdmVyIHdpbGwKIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSBwaHlfdHlwZS4KIC0gMDogRnVsbCBTcGVlZAogLSAxOiBVVE1JKyAoZGVmYXVsdCwgaWYgYXZhaWxhYmxlKQogLSAyOiBVTFBJCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPnBoeV91dG1pX3dpZHRoPC90ZD4KIDx0ZD5TcGVjaWZpZXMgdGhlIFVUTUkrIERhdGEgV2lkdGguIFRoaXMgcGFyYW1ldGVyIGlzIGFwcGxpY2FibGUgZm9yIGEKIHBoeV90eXBlIG9mIFVUTUkrLiBBbHNvLCB0aGlzIHBhcmFtZXRlciBpcyBhcHBsaWNhYmxlIG9ubHkgaWYgdGhlCiBPVEdfSFNQSFlfV0lEVEggY0MgcGFyYW1ldGVyIHdhcyBzZXQgdG8gIjggYW5kIDE2IGJpdHMiLCBtZWFuaW5nIHRoYXQgdGhlCiBjb3JlIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gd29yayBhdCBlaXRoZXIgZGF0YSBwYXRoIHdpZHRoLgogLSBWYWx1ZXM6IDggb3IgMTYgYml0cyAoZGVmYXVsdCAxNikKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+cGh5X3VscGlfZGRyPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0aGUgVUxQSSBvcGVyYXRlcyBhdCBkb3VibGUgb3Igc2luZ2xlIGRhdGEgcmF0ZS4gVGhpcwogcGFyYW1ldGVyIGlzIG9ubHkgYXBwbGljYWJsZSBpZiBwaHlfdHlwZSBpcyBVTFBJLgogLSAwOiBzaW5nbGUgZGF0YSByYXRlIFVMUEkgaW50ZXJmYWNlIHdpdGggOCBiaXQgd2lkZSBkYXRhIGJ1cyAoZGVmYXVsdCkKIC0gMTogZG91YmxlIGRhdGEgcmF0ZSBVTFBJIGludGVyZmFjZSB3aXRoIDQgYml0IHdpZGUgZGF0YSBidXMKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+aTJjX2VuYWJsZTwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIHRoZSBJMkMgaW50ZXJmYWNlIGZvciBmdWxsIHNwZWVkIFBIWS4gVGhpcwogcGFyYW1ldGVyIGlzIG9ubHkgYXBwbGljYWJsZSBpZiBQSFlfVFlQRSBpcyBGUy4KIC0gMDogRGlzYWJsZWQgKGRlZmF1bHQpCiAtIDE6IEVuYWJsZWQKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+dWxwaV9mc19sczwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIFVMUEkgRlMvTFMgbW9kZSBvbmx5LgogLSAwOiBEaXNhYmxlZCAoZGVmYXVsdCkKIC0gMTogRW5hYmxlZAogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD50c19kbGluZTwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdGVybSBzZWxlY3QgRC1MaW5lIHB1bHNpbmcgZm9yIGFsbCBQSFlzIGlzIGVuYWJsZWQuCiAtIDA6IERpc2FibGVkIChkZWZhdWx0KQogLSAxOiBFbmFibGVkCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmVuX211bHRpcGxlX3R4X2ZpZm88L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIGRlZGljYXRlZHRvIHR4IGZpZm9zIGFyZSBlbmFibGVkIGZvciBub24gcGVyaW9kaWMgSU4gRVBzLgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSAwOiBEaXNhYmxlZAogLSAxOiBFbmFibGVkIChkZWZhdWx0LCBpZiBhdmFpbGFibGUpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPmRldl90eF9maWZvX3NpemVfbiAobiA9IDEgdG8gMTUpPC90ZD4KIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIGVhY2ggb2YgdGhlIFR4IEZJRk9zIGluIGRldmljZSBtb2RlCiB3aGVuIGR5bmFtaWMgRklGTyBzaXppbmcgaXMgZW5hYmxlZC4KIC0gVmFsdWVzOiA0IHRvIDc2OCAoZGVmYXVsdCAyNTYpCiA8L3RkPjwvdHI+CgogPHRyPgogPHRkPnR4X3Rocl9sZW5ndGg8L3RkPgogPHRkPlRyYW5zbWl0IFRocmVzaG9sZCBsZW5ndGggaW4gMzIgYml0IGRvdWJsZSB3b3JkcwogLSBWYWx1ZXM6IDggdG8gMTI4IChkZWZhdWx0IDY0KQogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5yeF90aHJfbGVuZ3RoPC90ZD4KIDx0ZD5SZWNlaXZlIFRocmVzaG9sZCBsZW5ndGggaW4gMzIgYml0IGRvdWJsZSB3b3JkcwogLSBWYWx1ZXM6IDggdG8gMTI4IChkZWZhdWx0IDY0KQogPC90ZD48L3RyPgoKPHRyPgogPHRkPnRocl9jdGw8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBUaHJlc2hvbGRpbmcgZm9yIERldmljZSBtb2RlLiBCaXRzIDAsIDEsIDIgb2YKIHRoaXMgcGFybWF0ZXIgc3BlY2lmaWVzIGlmIHRocmVzaG9sZGluZyBpcyBlbmFibGVkIGZvciBub24tSXNvIFR4LCBJc28gVHggYW5kCiBSeCB0cmFuc2ZlcnMgYWNjb3JkaW5nbHkuCiBUaGUgZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpZiBub25lIGlzCiBzcGVjaWZpZWQuCiAtIFZhbHVlczogMCB0byA3IChkZWZhdWx0IDApCiBCaXQgdmFsdWVzIGluZGljYXRlOgogLSAwOiBUaHJlc2hvbGRpbmcgZGlzYWJsZWQKIC0gMTogVGhyZXNob2xkaW5nIGVuYWJsZWQKIDwvdGQ+PC90cj4KCjx0cj4KIDx0ZD5kbWFfZGVzY19lbmFibGU8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBEZXNjcmlwdG9yIERNQSBtb2RlLgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSAwOiBEZXNjcmlwdG9yIERNQSBkaXNhYmxlZAogLSAxOiBEZXNjcmlwdG9yIERNQSAoZGVmYXVsdCwgaWYgYXZhaWxhYmxlKQogPC90ZD48L3RyPgoKPHRyPgogPHRkPm1waV9lbmFibGU8L3RkPgogPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBNUEkgZW5oYW5jZW1lbnQgbW9kZS4KIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKIHNwZWNpZmllZC4KIC0gMDogTVBJIGRpc2FibGVkIChkZWZhdWx0KQogLSAxOiBNUEkgZW5hYmxlCiA8L3RkPjwvdHI+Cgo8dHI+CiA8dGQ+cHRpX2VuYWJsZTwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIFBUSSBlbmhhbmNlbWVudCBzdXBwb3J0LgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSAwOiBQVEkgZGlzYWJsZWQgKGRlZmF1bHQpCiAtIDE6IFBUSSBlbmFibGUKIDwvdGQ+PC90cj4KCjx0cj4KIDx0ZD5scG1fZW5hYmxlPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgTFBNIHN1cHBvcnQuCiBUaGUgZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpZiBub25lIGlzCiBzcGVjaWZpZWQuCiAtIDA6IExQTSBkaXNhYmxlZAogLSAxOiBMUE0gZW5hYmxlIChkZWZhdWx0LCBpZiBhdmFpbGFibGUpCiA8L3RkPjwvdHI+Cgo8dHI+CiA8dGQ+aWNfdXNiX2NhcDwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIElDX1VTQiBjYXBhYmlsaXR5LgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSAwOiBJQ19VU0IgZGlzYWJsZWQgKGRlZmF1bHQsIGlmIGF2YWlsYWJsZSkKIC0gMTogSUNfVVNCIGVuYWJsZQogPC90ZD48L3RyPgoKPHRyPgogPHRkPmFoYl90aHJfcmF0aW88L3RkPgogPHRkPlNwZWNpZmllcyBBSEIgVGhyZXNob2xkIHJhdGlvLgogLSBWYWx1ZXM6IDAgdG8gMyAoZGVmYXVsdCAwKQogPC90ZD48L3RyPgoKPHRyPgogPHRkPnBvd2VyX2Rvd248L3RkPgogPHRkPlNwZWNpZmllcyBQb3dlciBEb3duKEhpYmVybmF0aW9uKSBNb2RlLgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSAwOiBQb3dlciBEb3duIGRpc2FibGVkIChkZWZhdWx0KQogLSAyOiBQb3dlciBEb3duIGVuYWJsZWQKIDwvdGQ+PC90cj4KCiA8dHI+CiA8dGQ+cmVsb2FkX2N0bDwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgZHluYW1pYyByZWxvYWRpbmcgb2YgdGhlIEhGSVIgcmVnaXN0ZXIgaXMgYWxsb3dlZCBkdXJpbmcKIHJ1biB0aW1lLiBUaGUgZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpZgogbm9uZSBpcyBzcGVjaWZpZWQuIEluIGNhc2UgdGhlIEhGSVIgdmFsdWUgaXMgcmVsb2FkZWQgd2hlbiBIRklSLlJsZEN0cmwgPT0gMSdiMAogdGhlIGNvcmUgbWlnaHQgbWlzYmVoYXZlLgogLSAwOiBSZWxvYWQgQ29udHJvbCBkaXNhYmxlZCAoZGVmYXVsdCkKIC0gMTogUmVsb2FkIENvbnRyb2wgZW5hYmxlZAogPC90ZD48L3RyPgoKIDx0cj4KIDx0ZD5kZXZfb3V0X25hazwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgIERldmljZSBPVVQgTkFLIGVuaGFuY2VtZW50IGVuYWJsZWQgb3Igbm8uCiBUaGUgZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpZgogbm9uZSBpcyBzcGVjaWZpZWQuIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgd2hlbiBPVEdfRU5fREVTQ19ETUEgPT0gMZJiMS4KIC0gMDogVGhlIGNvcmUgZG9lcyBub3Qgc2V0IE5BSyBhZnRlciBCdWxrIE9VVCB0cmFuc2ZlciBjb21wbGV0ZSAoZGVmYXVsdCkKIC0gMTogVGhlIGNvcmUgc2V0cyBOQUsgYWZ0ZXIgQnVsayBPVVQgdHJhbnNmZXIgY29tcGxldGUKIDwvdGQ+PC90cj4KCjx0cj4KIDx0ZD5hZHBfZW5hYmxlPC90ZD4KIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBBRFAgZmVhdHVyZSBpcyBlbmFibGVkLgogVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcwogc3BlY2lmaWVkLgogLSAwOiBBRFAgZmVhdHVyZSBkaXNhYmxlZCAoZGVmYXVsdCkKIC0gMTogQURQIGZlYXR1cmUgZW5hYmxlZAogPC90ZD48L3RyPgoKICA8dHI+CiA8dGQ+b3RnX3ZlcjwvdGQ+CiA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgT1RHIGlzIHBlcmZvcm1pbmcgYXMgVVNCIE9URyBSZXZpc2lvbiAyLjAgb3IgUmV2aXNpb24gMS4zCiBVU0IgT1RHIGRldmljZS4KIC0gMDogT1RHIDIuMCBzdXBwb3J0IGRpc2FibGVkIChkZWZhdWx0KQogLSAxOiBPVEcgMi4wIHN1cHBvcnQgZW5hYmxlZAogPC90ZD48L3RyPgoKKi8K