LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIGhhbmRsZXIgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbmV0X2RldmljZQogKiAgIHN0cnVjdHVyZS4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogU09GVFdBUkUgTElDRU5TRQogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwogKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KICoKICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwogKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBEaXNjbGFpbWVyCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKICogREFNQUdFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaW5jbHVkZSBmaWxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSA8d2xfdmVyc2lvbi5oPgoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgovLyAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgovLyAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgovLyAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgovLyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgovLyAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci8vICNpbmNsdWRlIDxsaW51eC9pbi5oPgovLyAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgovLyAjaW5jbHVkZSA8YXNtL2lvLmg+Ci8vICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci8vICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CgojaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgovLyAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci8vICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLy8gI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgoKI2luY2x1ZGUgPGRlYnVnLmg+CgojaW5jbHVkZSA8aGNmLmg+CiNpbmNsdWRlIDxkaGYuaD4KLy8gI2luY2x1ZGUgPGhjZmRlZi5oPgoKI2luY2x1ZGUgPHdsX2lmLmg+CiNpbmNsdWRlIDx3bF9pbnRlcm5hbC5oPgojaW5jbHVkZSA8d2xfdXRpbC5oPgojaW5jbHVkZSA8d2xfcHJpdi5oPgojaW5jbHVkZSA8d2xfbWFpbi5oPgojaW5jbHVkZSA8d2xfbmV0ZGV2Lmg+CiNpbmNsdWRlIDx3bF93ZXh0Lmg+CgojaWZkZWYgVVNFX1BST0ZJTEUKI2luY2x1ZGUgPHdsX3Byb2ZpbGUuaD4KI2VuZGlmICAvKiBVU0VfUFJPRklMRSAqLwoKI2lmZGVmIEJVU19QQ01DSUEKI2luY2x1ZGUgPHdsX2NzLmg+CiNlbmRpZiAgLyogQlVTX1BDTUNJQSAqLwoKI2lmZGVmIEJVU19QQ0kKI2luY2x1ZGUgPHdsX3BjaS5oPgojZW5kaWYgIC8qIEJVU19QQ0kgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBnbG9iYWwgdmFyaWFibGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpZiBEQkcKZXh0ZXJuIGRiZ19pbmZvX3QgKkRiZ0luZm87CiNlbmRpZiAgLyogREJHICovCgoKI2lmIEhDRl9FTkNBUAojZGVmaW5lIE1UVV9NQVggKEhDRl9NQVhfTVNHIC0gRVRIX0hMRU4gLSA4KQojZWxzZQojZGVmaW5lIE1UVV9NQVggKEhDRl9NQVhfTVNHIC0gRVRIX0hMRU4pCiNlbmRpZgoKLy9zdGF0aWMgaW50IG10dSA9IE1UVV9NQVg7Ci8vTU9EVUxFX1BBUk0obXR1LCAiaSIpOwovL01PRFVMRV9QQVJNX0RFU0MobXR1LCAiTVRVIik7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtYWNyb3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2RlZmluZSBCTE9DS19JTlBVVChidWYsIGxlbikgXAogICAgZGVzYy0+YnVmX2FkZHIgPSBidWY7IFwKICAgIGRlc2MtPkJVRl9TSVpFID0gbGVuOyBcCiAgICBzdGF0dXMgPSBoY2ZfcmN2X21zZygmKGxwLT5oY2ZDdHgpLCBkZXNjLCAwKQoKI2RlZmluZSBCTE9DS19JTlBVVF9ETUEoYnVmLCBsZW4pIG1lbWNweSggYnVmLCBkZXNjX25leHQtPmJ1Zl9hZGRyLCBwa3RsZW4gKQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZnVuY3Rpb24gcHJvdG90eXBlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfaW5pdCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBXZSBuZXZlciBuZWVkIHRvIGRvIGFueXRoaW5nIHdoZW4gYSAiV2lyZWxlc3MiIGRldmljZSBpcyAiaW5pdGlhbGl6ZWQiCiAqICBieSB0aGUgbmV0IHNvZnR3YXJlLCBiZWNhdXNlIHdlIG9ubHkgcmVnaXN0ZXIgYWxyZWFkeS1mb3VuZCBjYXJkcy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2luaXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7Ci8vICAgIHVuc2lnbmVkIGxvbmcgICAgICAgZmxhZ3M7Ci8vICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfaW5pdCIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIERCR19QQVJBTSggRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldiApOwoKICAgIC8qIE5vdGhpbmcgdG8gZG8sIGJ1dCBncmFiIHRoZSBzcGlubG9jayBhbnl3YXkganVzdCBpbiBjYXNlIHdlIGV2ZXIgbmVlZAogICAgICAgdGhpcyByb3V0aW5lICovCi8vICB3bF9sb2NrKCBscCwgJmZsYWdzICk7Ci8vICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiAwOwp9IC8vIHdsX2luaXQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2NvbmZpZygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBJbXBsZW1lbnQgdGhlIFNJT0NTSUZNQVAgaW50ZXJmYWNlLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIG5ldF9kZXZpY2Ugc3RydWN0dXJlCiAqICAgICAgbWFwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBpZm1hcCBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9jb25maWcoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZm1hcCAqbWFwICkKewogICAgREJHX0ZVTkMoICJ3bF9jb25maWciICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKICAgIERCR19QQVJBTSggRGJnSW5mbywgIm1hcCIsICIweCVwIiwgbWFwICk7CgogICAgLyogVGhlIG9ubHkgdGhpbmcgd2UgY2FyZSBhYm91dCBoZXJlIGlzIGEgcG9ydCBjaGFuZ2UuIFNpbmNlIHRoaXMgbm90IG5lZWRlZCwKICAgICAgIGlnbm9yZSB0aGUgcmVxdWVzdC4gKi8KICAgIERCR19UUkFDRSggRGJnSW5mbywgIiVzOiAlcyBjYWxsZWQuXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ19fICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gMDsKfSAvLyB3bF9jb25maWcKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3N0YXRzKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFJldHVybiB0aGUgY3VycmVudCBkZXZpY2Ugc3RhdGlzdGljcy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlX3N0YXRzIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBuZXR3b3JrCiAqICAgICAgc3RhdGlzdGljcy4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKndsX3N0YXRzKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewojaWZkZWYgVVNFX1dEUwogICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OwojZW5kaWYgIC8qIFVTRV9XRFMgKi8KICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBmbGFnczsKICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICAgICAqcFN0YXRzOwogICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAvL0RCR19GVU5DKCAid2xfc3RhdHMiICk7CiAgICAvL0RCR19FTlRFUiggRGJnSW5mbyApOwogICAgLy9EQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKCiAgICBwU3RhdHMgPSBOVUxMOwoKICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKCiNpZmRlZiBVU0VfUlRTCiAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewoJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CgoJLy9EQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybiBOVUxMOwogICAgfQojZW5kaWYgIC8qIFVTRV9SVFMgKi8KCiAgICAvKiBSZXR1cm4gdGhlIHN0YXRpc3RpY3MgZm9yIHRoZSBhcHByb3ByaWF0ZSBkZXZpY2UgKi8KI2lmZGVmIFVTRV9XRFMKCiAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewoJaWYoIGRldiA9PSBscC0+d2RzX3BvcnRbY291bnRdLmRldiApIHsKCSAgICBwU3RhdHMgPSAmKCBscC0+d2RzX3BvcnRbY291bnRdLnN0YXRzICk7Cgl9CiAgICB9CgojZW5kaWYgIC8qIFVTRV9XRFMgKi8KCiAgICAvKiBJZiBwU3RhdHMgaXMgc3RpbGwgTlVMTCwgdGhlbiB0aGUgZGV2aWNlIGlzIG5vdCBhIFdEUyBwb3J0ICovCiAgICBpZiggcFN0YXRzID09IE5VTEwgKSB7CiAgICAgICAgcFN0YXRzID0gJiggbHAtPnN0YXRzICk7CiAgICB9CgogICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CgogICAgLy9EQkdfTEVBVkUoIERiZ0luZm8gKTsKCiAgICByZXR1cm4gcFN0YXRzOwp9IC8vIHdsX3N0YXRzCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9vcGVuKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIE9wZW4gdGhlIGRldmljZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAgaW50ICAgICAgICAgICAgICAgICBzdGF0dXMgPSBIQ0ZfU1VDQ0VTUzsKICAgIHN0cnVjdCB3bF9wcml2YXRlICAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgdW5zaWduZWQgbG9uZyAgICAgICBmbGFnczsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX29wZW4iICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CgojaWZkZWYgVVNFX1JUUwogICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKCURCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIGRldmljZSBvcGVuLCBpbiBSVFMgbW9kZVxuIiApOwoJd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CglEQkdfTEVBVkUoIERiZ0luZm8gKTsKCXJldHVybiAtRUlPOwogICAgfQojZW5kaWYgIC8qIFVTRV9SVFMgKi8KCiNpZmRlZiBVU0VfUFJPRklMRQogICAgcGFyc2VfY29uZmlnKCBkZXYgKTsKI2VuZGlmCgogICAgaWYoIGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCApIHsKCURCR19UUkFDRSggRGJnSW5mbywgIkVuYWJsaW5nIFBvcnQgMFxuIiApOwoJc3RhdHVzID0gd2xfZW5hYmxlKCBscCApOwoKICAgICAgICBpZiggc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgewogICAgICAgICAgICBEQkdfVFJBQ0UoIERiZ0luZm8sICJFbmFibGUgcG9ydCAwIGZhaWxlZDogMHgleFxuIiwgc3RhdHVzICk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIEhvbGRpbmcgdGhlIGxvY2sgdG9vIGxvbmcsIG1ha2UgYSBnYXAgdG8gYWxsb3cgb3RoZXIgcHJvY2Vzc2VzCiAgICB3bF91bmxvY2sobHAsICZmbGFncyk7CiAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CgogICAgaWYgKCBzdHJsZW4oIGxwLT5md19pbWFnZV9maWxlbmFtZSApICkgewoJREJHX1RSQUNFKCBEYmdJbmZvLCAiOz8/Pz8gS2x1ZGd5IHdheSB0byBmb3JjZSBhIGRvd25sb2FkXG4iICk7CglzdGF0dXMgPSB3bF9nbyggbHAgKTsKICAgIH0gZWxzZSB7CglzdGF0dXMgPSB3bF9hcHBseSggbHAgKTsKICAgIH0KCiAgICAvLyBIb2xkaW5nIHRoZSBsb2NrIHRvbyBsb25nLCBtYWtlIGEgZ2FwIHRvIGFsbG93IG90aGVyIHByb2Nlc3NlcwogICAgd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwogICAgd2xfbG9jayggbHAsICZmbGFncyApOwoKICAgIGlmKCBzdGF0dXMgIT0gSENGX1NVQ0NFU1MgKSB7CgkvLyBVbnN1Y2Nlc3NmdWwsIHRyeSByZXNldCBvZiB0aGUgY2FyZCB0byByZWNvdmVyCglzdGF0dXMgPSB3bF9yZXNldCggZGV2ICk7CiAgICB9CgogICAgLy8gSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMKICAgIHdsX3VubG9jayhscCwgJmZsYWdzKTsKICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewoJbmV0aWZfY2Fycmllcl9vbiggZGV2ICk7CglXTF9XRFNfTkVUSUZfQ0FSUklFUl9PTiggbHAgKTsKCglscC0+aXNfaGFuZGxpbmdfaW50ID0gV0xfSEFORExJTkdfSU5UOyAvLyBTdGFydCBoYW5kbGluZyBpbnRlcnJ1cHRzCiAgICAgICAgd2xfYWN0X2ludF9vbiggbHAgKTsKCgluZXRpZl9zdGFydF9xdWV1ZSggZGV2ICk7CglXTF9XRFNfTkVUSUZfU1RBUlRfUVVFVUUoIGxwICk7CiAgICB9IGVsc2UgewogICAgICAgIHdsX2hjZl9lcnJvciggZGV2LCBzdGF0dXMgKTsJCS8qIFJlcG9ydCB0aGUgZXJyb3IgKi8KICAgICAgICBuZXRpZl9kZXZpY2VfZGV0YWNoKCBkZXYgKTsJCS8qIFN0b3AgdGhlIGRldmljZSBhbmQgcXVldWUgKi8KICAgIH0KCiAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiBzdGF0dXM7Cn0gLy8gd2xfb3BlbgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfY2xvc2UoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ2xvc2UgdGhlIGRldmljZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2Nsb3NlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewogICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7CiAgICB1bnNpZ25lZCBsb25nICAgZmxhZ3M7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoIndsX2Nsb3NlIik7CiAgICBEQkdfRU5URVIoRGJnSW5mbyk7CiAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CgogICAgLyogTWFyayB0aGUgYWRhcHRlciBhcyBidXN5ICovCiAgICBuZXRpZl9zdG9wX3F1ZXVlKCBkZXYgKTsKICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOwoKICAgIG5ldGlmX2NhcnJpZXJfb2ZmKCBkZXYgKTsKICAgIFdMX1dEU19ORVRJRl9DQVJSSUVSX09GRiggbHAgKTsKCiAgICAvKiBTaHV0ZG93biB0aGUgYWRhcHRlcjoKICAgICAgICAgICAgRGlzYWJsZSBhZGFwdGVyIGludGVycnVwdHMKICAgICAgICAgICAgU3RvcCBUeC9SeAogICAgICAgICAgICBVcGRhdGUgc3RhdGlzdGljcwogICAgICAgICAgICBTZXQgbG93IHBvd2VyIG1vZGUKICAgICovCgogICAgd2xfbG9jayggbHAsICZmbGFncyApOwoKICAgIHdsX2FjdF9pbnRfb2ZmKCBscCApOwogICAgbHAtPmlzX2hhbmRsaW5nX2ludCA9IFdMX05PVF9IQU5ETElOR19JTlQ7IC8vIFN0b3AgaGFuZGxpbmcgaW50ZXJydXB0cwoKI2lmZGVmIFVTRV9SVFMKICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CglEQkdfVFJBQ0UoIERiZ0luZm8sICJTa2lwcGluZyBkZXZpY2UgY2xvc2UsIGluIFJUUyBtb2RlXG4iICk7Cgl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuIC1FSU87CiAgICB9CiNlbmRpZiAgLyogVVNFX1JUUyAqLwoKICAgIC8qIERpc2FibGUgdGhlIHBvcnRzICovCiAgICB3bF9kaXNhYmxlKCBscCApOwoKICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuIDA7Cn0gLy8gd2xfY2xvc2UKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCnN0YXRpYyB2b2lkIHdsX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCnsKICAgIHN0cm5jcHkoaW5mby0+ZHJpdmVyLCBEUklWRVJfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikgLSAxKTsKICAgIHN0cm5jcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT05fU1RSLCBzaXplb2YoaW5mby0+dmVyc2lvbikgLSAxKTsKLy8Jc3RybmNweShpbmZvLmZ3X3ZlcnNpb24sIHByaXYtPmZ3X25hbWUsCi8vCXNpemVvZihpbmZvLmZ3X3ZlcnNpb24pIC0gMSk7CgogICAgaWYgKGRldi0+ZGV2LnBhcmVudCkgewogICAgCWRldl9zZXRfbmFtZShkZXYtPmRldi5wYXJlbnQsICIlcyIsIGluZm8tPmJ1c19pbmZvKTsKCS8vc3RybmNweShpbmZvLT5idXNfaW5mbywgZGV2LT5kZXYucGFyZW50LT5idXNfaWQsCgkvLwlzaXplb2YoaW5mby0+YnVzX2luZm8pIC0gMSk7CiAgICB9IGVsc2UgewoJc25wcmludGYoaW5mby0+YnVzX2luZm8sIHNpemVvZihpbmZvLT5idXNfaW5mbykgLSAxLAoJCSJQQ01DSUEgRklYTUUiKTsKLy8JCSAgICAiUENNQ0lBIDB4JWx4IiwgcHJpdi0+aHcuaW9iYXNlKTsKICAgIH0KfSAvLyB3bF9nZXRfZHJ2aW5mbwoKc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB3bF9ldGh0b29sX29wcyA9IHsKICAgIC5nZXRfZHJ2aW5mbyA9IHdsX2dldF9kcnZpbmZvLAogICAgLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKfTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9pb2N0bCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgSU9DVEwgaGFuZGxlciBmb3IgdGhlIGRldmljZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdC4KICogICAgICBycSAgLSBhIHBvaW50ZXIgdG8gdGhlIElPQ1RMIHJlcXVlc3QgYnVmZmVyLgogKiAgICAgIGNtZCAtIHRoZSBJT0NUTCBjb21tYW5kIGNvZGUuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfaW9jdGwoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQgKQp7CiAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgZmxhZ3M7CiAgICBpbnQgICAgICAgICAgICAgICAgICAgICByZXQgPSAwOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfaW9jdGwiICk7CiAgICBEQkdfRU5URVIoRGJnSW5mbyk7CiAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CiAgICBEQkdfUEFSQU0oRGJnSW5mbywgInJxIiwgIjB4JXAiLCBycSk7CiAgICBEQkdfUEFSQU0oRGJnSW5mbywgImNtZCIsICIweCUwNHgiLCBjbWQpOwoKICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICB3bF9hY3RfaW50X29mZiggbHAgKTsKCiNpZmRlZiBVU0VfUlRTCiAgICBpZiggbHAtPnVzZVJUUyA9PSAxICkgewoJLyogSGFuZGxlIGFueSBSVFMgSU9DVEwgaGVyZSAqLwoJaWYoIGNtZCA9PSBXTF9JT0NUTF9SVFMgKSB7CgkgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiSU9DVEw6IFdMX0lPQ1RMX1JUU1xuIiApOwoJICAgIHJldCA9IHd2bGFuX3J0cyggKHN0cnVjdCBydHNyZXEgKilycSwgZGV2LT5iYXNlX2FkZHIgKTsKCX0gZWxzZSB7CgkgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiSU9DVEwgbm90IHN1cHBvcnRlZCBpbiBSVFMgbW9kZTogMHglWFxuIiwgY21kICk7CgkgICAgcmV0ID0gLUVPUE5PVFNVUFA7Cgl9CgoJZ290byBvdXRfYWN0X2ludF9vbl91bmxvY2s7CiAgICB9CiNlbmRpZiAgLyogVVNFX1JUUyAqLwoKICAgIC8qIE9ubHkgaGFuZGxlIFVJTCBJT0NUTCByZXF1ZXN0cyB3aGVuIHRoZSBVSUwgaGFzIHRoZSBzeXN0ZW0gYmxvY2tlZC4gKi8KICAgIGlmKCAhKCggbHAtPmZsYWdzICYgV1ZMQU4yX1VJTF9CVVNZICkgJiYgKCBjbWQgIT0gV1ZMQU4yX0lPQ1RMX1VJTCApKSkgewojaWZkZWYgVVNFX1VJTAoJc3RydWN0IHVpbHJlcSAgKnVycSA9IChzdHJ1Y3QgdWlscmVxICopcnE7CiNlbmRpZiAvKiBVU0VfVUlMICovCgoJc3dpdGNoKCBjbWQgKSB7CgkJLy8gPT09PT09PT09PT09PT09PT09IFByaXZhdGUgSU9DVExzICh1cCB0byAxNikgPT09PT09PT09PT09PT09PT09CiNpZmRlZiBVU0VfVUlMCgljYXNlIFdWTEFOMl9JT0NUTF9VSUw6CgkgICAgIERCR19UUkFDRSggRGJnSW5mbywgIklPQ1RMOiBXVkxBTjJfSU9DVExfVUlMXG4iICk7CgkgICAgIHJldCA9IHd2bGFuX3VpbCggdXJxLCBscCApOwoJICAgICBicmVhazsKI2VuZGlmICAvKiBVU0VfVUlMICovCgoJZGVmYXVsdDoKCSAgICAgREJHX1RSQUNFKERiZ0luZm8sICJJT0NUTCBDT0RFIE5PVCBTVVBQT1JURUQ6IDB4JVhcbiIsIGNtZCApOwoJICAgICByZXQgPSAtRU9QTk9UU1VQUDsKCSAgICAgYnJlYWs7Cgl9CiAgICB9IGVsc2UgewoJREJHX1dBUk5JTkcoIERiZ0luZm8sICJERVZJQ0UgSVMgQlVTWSwgQ0FOTk9UIFBST0NFU1MgUkVRVUVTVFxuIiApOwoJcmV0ID0gLUVCVVNZOwogICAgfQoKI2lmZGVmIFVTRV9SVFMKb3V0X2FjdF9pbnRfb25fdW5sb2NrOgojZW5kaWYgIC8qIFVTRV9SVFMgKi8KICAgIHdsX2FjdF9pbnRfb24oIGxwICk7CgogICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gcmV0Owp9IC8vIHdsX2lvY3RsCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKdm9pZCB3bF9wb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICBzdHJ1Y3QgcHRfcmVncyByZWdzOwoKICAgIHdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKICAgIHdsX2lzcihkZXYtPmlycSwgZGV2LCAmcmVncyk7CiAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKfQojZW5kaWYKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3R4X3RpbWVvdXQoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhlIGhhbmRsZXIgY2FsbGVkIHdoZW4sIGZvciBzb21lIHJlYXNvbiwgYSBUeCByZXF1ZXN0IGlzIG5vdCBjb21wbGV0ZWQuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3QuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3R4X3RpbWVvdXQoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CiNpZmRlZiBVU0VfV0RTCiAgICBpbnQgICAgICAgICAgICAgICAgICAgICBjb3VudDsKI2VuZGlmICAvKiBVU0VfV0RTICovCiAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKICAgIHN0cnVjdCB3bF9wcml2YXRlICAgICAgICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpwU3RhdHMgPSBOVUxMOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfdHhfdGltZW91dCIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXM6IFRyYW5zbWl0IHRpbWVvdXQuXG4iLCBkZXYtPm5hbWUgKTsKCiAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CgojaWZkZWYgVVNFX1JUUwogICAgaWYoIGxwLT51c2VSVFMgPT0gMSApIHsKCURCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIHR4X3RpbWVvdXQgaGFuZGxlciwgaW4gUlRTIG1vZGVcbiIgKTsKCXdsX3VubG9jayggbHAsICZmbGFncyApOwoKCURCR19MRUFWRSggRGJnSW5mbyApOwoJcmV0dXJuOwogICAgfQojZW5kaWYgIC8qIFVTRV9SVFMgKi8KCiAgICAvKiBGaWd1cmUgb3V0IHdoaWNoIGRldmljZSAodGhlICJyb290IiBkZXZpY2Ugb3IgV0RTIHBvcnQpIHRoaXMgdGltZW91dAogICAgICAgaXMgZm9yICovCiNpZmRlZiBVU0VfV0RTCgogICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKCWlmKCBkZXYgPT0gbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKSB7CgkgICAgcFN0YXRzID0gJiggbHAtPndkc19wb3J0W2NvdW50XS5zdGF0cyApOwoKCSAgICAvKiBCcmVhayB0aGUgbG9vcCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlIGNvdW50ZXIgdG8gYWNjZXNzIFdEUwoJICAgICAgIGluZm9ybWF0aW9uIGluIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLwoJICAgIGJyZWFrOwoJfQogICAgfQoKI2VuZGlmICAvKiBVU0VfV0RTICovCgogICAgLyogSWYgcFN0YXRzIGlzIHN0aWxsIE5VTEwsIHRoZW4gdGhlIGRldmljZSBpcyBub3QgYSBXRFMgcG9ydCAqLwogICAgaWYoIHBTdGF0cyA9PSBOVUxMICkgewoJcFN0YXRzID0gJiggbHAtPnN0YXRzICk7CiAgICB9CgogICAgLyogQWNjdW11bGF0ZSB0aGUgdGltZW91dCBlcnJvciAqLwogICAgcFN0YXRzLT50eF9lcnJvcnMrKzsKCiAgICB3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF90eF90aW1lb3V0Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9zZW5kKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSByb3V0aW5lIHdoaWNoIHBlcmZvcm1zIGRhdGEgdHJhbnNtaXRzLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHdsX3ByaXZhdGUgc3RydWN0LgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICAxIG9uIGVycm9yCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9zZW5kKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CgogICAgaW50ICAgICAgICAgICAgICAgICBzdGF0dXM7CiAgICBERVNDX1NUUkNUICAgICAgICAgICpkZXNjOwogICAgV1ZMQU5fTEZSQU1FICAgICAgICAqdHhGID0gTlVMTDsKICAgIHN0cnVjdCBsaXN0X2hlYWQgICAgKmVsZW1lbnQ7CiAgICBpbnQgICAgICAgICAgICAgICAgIGxlbjsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3NlbmQiICk7CgogICAgaWYoIGxwID09IE5VTEwgKSB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCBpcyBOVUxMXG4iICk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgaWYoIGxwLT5kZXYgPT0gTlVMTCApIHsKICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJuZXRfZGV2aWNlIHN0cnVjdCBpbiB3bF9wcml2YXRlIGlzIE5VTExcbiIgKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgLyogQ2hlY2sgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2YgRklEczsgaWYgbm9uZSBhcmUgYXZhaWxhYmxlLCBkb24ndCB0YWtlIGFueQogICAgICAgZnJhbWVzIG9mZiB0aGUgdHhRICovCiAgICBpZiggbHAtPmhjZkN0eC5JRkJfUnNjSW5kID09IDAgKSB7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIC8qIFJlY2xhaW0gdGhlIFR4USBFbGVtZW50cyBhbmQgcGxhY2UgdGhlbSBiYWNrIG9uIHRoZSBmcmVlIHF1ZXVlICovCiAgICBpZiggIWxpc3RfZW1wdHkoICYoIGxwLT50eFFbMF0gKSkpIHsKICAgICAgICBlbGVtZW50ID0gbHAtPnR4UVswXS5uZXh0OwoKICAgICAgICB0eEYgPSAoV1ZMQU5fTEZSQU1FICogKWxpc3RfZW50cnkoIGVsZW1lbnQsIFdWTEFOX0xGUkFNRSwgbm9kZSApOwogICAgICAgIGlmKCB0eEYgIT0gTlVMTCApIHsKICAgICAgICAgICAgbHAtPnR4Ri5za2IgID0gdHhGLT5mcmFtZS5za2I7CiAgICAgICAgICAgIGxwLT50eEYucG9ydCA9IHR4Ri0+ZnJhbWUucG9ydDsKCiAgICAgICAgICAgIHR4Ri0+ZnJhbWUuc2tiICA9IE5VTEw7CiAgICAgICAgICAgIHR4Ri0+ZnJhbWUucG9ydCA9IDA7CgogICAgICAgICAgICBsaXN0X2RlbCggJiggdHhGLT5ub2RlICkpOwogICAgICAgICAgICBsaXN0X2FkZCggZWxlbWVudCwgJiggbHAtPnR4RnJlZSApKTsKCiAgICAgICAgICAgIGxwLT50eFFfY291bnQtLTsKCiAgICAgICAgICAgIGlmKCBscC0+dHhRX2NvdW50IDwgVFhfUV9MT1dfV0FURVJfTUFSSyApIHsKICAgICAgICAgICAgICAgIGlmKCBscC0+bmV0aWZfcXVldWVfb24gPT0gRkFMU0UgKSB7CiAgICAgICAgICAgICAgICAgICAgREJHX1RYKCBEYmdJbmZvLCAiS2lja3N0YXJ0aW5nIFE6ICVkXG4iLCBscC0+dHhRX2NvdW50ICk7CiAgICAgICAgICAgICAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZSggbHAtPmRldiApOwogICAgICAgICAgICAgICAgICAgIFdMX1dEU19ORVRJRl9XQUtFX1FVRVVFKCBscCApOwogICAgICAgICAgICAgICAgICAgIGxwLT5uZXRpZl9xdWV1ZV9vbiA9IFRSVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYoIGxwLT50eEYuc2tiID09IE5VTEwgKSB7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIC8qIElmIHRoZSBkZXZpY2UgaGFzIHJlc291cmNlcyAoRklEcykgYXZhaWxhYmxlLCB0aGVuIFR4IHRoZSBwYWNrZXQgKi8KICAgIC8qIEZvcm1hdCB0aGUgVHhSZXF1ZXN0IGFuZCBzZW5kIGl0IHRvIHRoZSBhZGFwdGVyICovCiAgICBsZW4gPSBscC0+dHhGLnNrYi0+bGVuIDwgRVRIX1pMRU4gPyBFVEhfWkxFTiA6IGxwLT50eEYuc2tiLT5sZW47CgogICAgZGVzYyAgICAgICAgICAgICAgICAgICAgPSAmKCBscC0+ZGVzY190eCApOwogICAgZGVzYy0+YnVmX2FkZHIgICAgICAgICAgPSBscC0+dHhGLnNrYi0+ZGF0YTsKICAgIGRlc2MtPkJVRl9DTlQgICAgICAgICAgID0gbGVuOwogICAgZGVzYy0+bmV4dF9kZXNjX2FkZHIgICAgPSBOVUxMOwoKICAgIHN0YXR1cyA9IGhjZl9zZW5kX21zZyggJiggbHAtPmhjZkN0eCApLCBkZXNjLCBscC0+dHhGLnBvcnQgKTsKCiAgICBpZiggc3RhdHVzID09IEhDRl9TVUNDRVNTICkgewogICAgICAgIGxwLT5kZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKCiAgICAgICAgREJHX1RYKCBEYmdJbmZvLCAiVHJhbnNtaXQuLi5cbiIgKTsKCiAgICAgICAgaWYoIGxwLT50eEYucG9ydCA9PSBIQ0ZfUE9SVF8wICkgewogICAgICAgICAgICBscC0+c3RhdHMudHhfcGFja2V0cysrOwogICAgICAgICAgICBscC0+c3RhdHMudHhfYnl0ZXMgKz0gbHAtPnR4Ri5za2ItPmxlbjsKICAgICAgICB9CgojaWZkZWYgVVNFX1dEUwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGxwLT53ZHNfcG9ydFsoKCBscC0+dHhGLnBvcnQgPj4gOCApIC0gMSldLnN0YXRzLnR4X3BhY2tldHMrKzsKICAgICAgICAgICAgbHAtPndkc19wb3J0WygoIGxwLT50eEYucG9ydCA+PiA4ICkgLSAxKV0uc3RhdHMudHhfYnl0ZXMgKz0gbHAtPnR4Ri5za2ItPmxlbjsKICAgICAgICB9CgojZW5kaWYgIC8qIFVTRV9XRFMgKi8KCiAgICAgICAgLyogRnJlZSB0aGUgc2tiIGFuZCBwZXJmb3JtIHF1ZXVlIGNsZWFudXAsIGFzIHRoZSBidWZmZXIgd2FzCiAgICAgICAgICAgIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSAqLwogICAgICAgIGRldl9rZnJlZV9za2IoIGxwLT50eEYuc2tiICk7CgogICAgICAgIGxwLT50eEYuc2tiID0gTlVMTDsKICAgICAgICBscC0+dHhGLnBvcnQgPSAwOwogICAgfQoKICAgIHJldHVybiBUUlVFOwp9IC8vIHdsX3NlbmQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3R4KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFRoZSBUeCBoYW5kbGVyIGZ1bmN0aW9uIGZvciB0aGUgbmV0d29yayBsYXllci4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgc2tiIC0gYSBwb2ludGVyIHRvIHRoZSBza19idWZmIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBkYXRhIHRvIHRyYW5zZmVyLgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIDEgb24gZXJyb3IKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3R4KCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcG9ydCApCnsKICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgIGZsYWdzOwogICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgV1ZMQU5fTEZSQU1FICAgICAgICAgICAgKnR4RiA9IE5VTEw7CiAgICBzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAqZWxlbWVudDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3R4IiApOwoKICAgIC8qIEdyYWIgdGhlIHNwaW5sb2NrICovCiAgICB3bF9sb2NrKCBscCwgJmZsYWdzICk7CgogICAgaWYoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApIHsKICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIlVJTCBoYXMgZGV2aWNlIGJsb2NrZWRcbiIgKTsKICAgICAgICAvKiBTdGFydCBkcm9wcGluZyBwYWNrZXRzIGhlcmU/Pz8gKi8KCXdsX3VubG9jayggbHAsICZmbGFncyApOwogICAgICAgIHJldHVybiAxOwogICAgfQoKI2lmZGVmIFVTRV9SVFMKICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CiAgICAgICAgREJHX1BSSU5UKCAiUlRTOiB3ZSdyZSBnZXR0aW5nIGEgVHguLi5cbiIgKTsKCXdsX3VubG9jayggbHAsICZmbGFncyApOwogICAgICAgIHJldHVybiAxOwogICAgfQojZW5kaWYgIC8qIFVTRV9SVFMgKi8KCiAgICBpZiggIWxwLT51c2VfZG1hICkgewogICAgICAgIC8qIEdldCBhbiBlbGVtZW50IGZyb20gdGhlIHF1ZXVlICovCiAgICAgICAgZWxlbWVudCA9IGxwLT50eEZyZWUubmV4dDsKICAgICAgICB0eEYgPSAoV1ZMQU5fTEZSQU1FICopbGlzdF9lbnRyeSggZWxlbWVudCwgV1ZMQU5fTEZSQU1FLCBub2RlICk7CiAgICAgICAgaWYoIHR4RiA9PSBOVUxMICkgewogICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJQcm9ibGVtIHdpdGggbGlzdF9lbnRyeVxuIiApOwoJICAgIHdsX3VubG9jayggbHAsICZmbGFncyApOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgLyogRmlsbCBvdXQgdGhlIGZyYW1lICovCiAgICAgICAgdHhGLT5mcmFtZS5za2IgPSBza2I7CiAgICAgICAgdHhGLT5mcmFtZS5wb3J0ID0gcG9ydDsKICAgICAgICAvKiBNb3ZlIHRoZSBmcmFtZSB0byB0aGUgdHhRICovCiAgICAgICAgLyogTk9URTogSGVyZSdzIHdoZXJlIHdlIHdvdWxkIGRvIHByaW9yaXR5IHF1ZXVlaW5nICovCiAgICAgICAgbGlzdF9kZWwoICYoIHR4Ri0+bm9kZSApKTsKICAgICAgICBsaXN0X2FkZCggJiggdHhGLT5ub2RlICksICYoIGxwLT50eFFbMF0gKSk7CgogICAgICAgIGxwLT50eFFfY291bnQrKzsKICAgICAgICBpZiggbHAtPnR4UV9jb3VudCA+PSBERUZBVUxUX05VTV9UWF9GUkFNRVMgKSB7CiAgICAgICAgICAgIERCR19UWCggRGJnSW5mbywgIlEgRnVsbDogJWRcbiIsIGxwLT50eFFfY291bnQgKTsKICAgICAgICAgICAgaWYoIGxwLT5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFICkgewogICAgICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZSggbHAtPmRldiApOwogICAgICAgICAgICAgICAgV0xfV0RTX05FVElGX1NUT1BfUVVFVUUoIGxwICk7CiAgICAgICAgICAgICAgICBscC0+bmV0aWZfcXVldWVfb24gPSBGQUxTRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHdsX2FjdF9pbnRfb2ZmKCBscCApOyAvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KCiAgICAvKiBTZW5kIHRoZSBkYXRhIHRvIHRoZSBoYXJkd2FyZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kICovCiNpZmRlZiBFTkFCTEVfRE1BCiAgICBpZiggbHAtPnVzZV9kbWEgKSB7CiAgICAgICAgd2xfc2VuZF9kbWEoIGxwLCBza2IsIHBvcnQgKTsKICAgIH0KICAgIGVsc2UKI2VuZGlmCiAgICB7CiAgICAgICAgd2xfc2VuZCggbHAgKTsKICAgIH0KICAgIC8qIFJlLWVuYWJsZSBJbnRlcnJ1cHRzLCByZWxlYXNlIHRoZSBzcGlubG9jayBhbmQgcmV0dXJuICovCiAgICB3bF9hY3RfaW50X29uKCBscCApOwogICAgd2xfdW5sb2NrKCBscCwgJmZsYWdzICk7CiAgICByZXR1cm4gMDsKfSAvLyB3bF90eAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcngoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhlIHJvdXRpbmUgd2hpY2ggcGVyZm9ybXMgZGF0YSByZWNlcHRpb24uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIDEgb24gZXJyb3IKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKICAgIGludCAgICAgICAgICAgICAgICAgICAgIHBvcnQ7CiAgICBzdHJ1Y3Qgc2tfYnVmZiAgICAgICAgICAqc2tiOwogICAgc3RydWN0IHdsX3ByaXZhdGUgICAgICAgKmxwID0gd2xfcHJpdihkZXYpOwogICAgaW50ICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwogICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgcGt0bGVuOwogICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgaGZzX3N0YXQ7CiAgICBERVNDX1NUUkNUICAgICAgICAgICAgICAqZGVzYzsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQygid2xfcngiKQogICAgREJHX1BBUkFNKERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYpOwoKICAgIGlmKCEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKSB7CgojaWZkZWYgVVNFX1JUUwogICAgICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CiAgICAgICAgICAgIERCR19QUklOVCggIlJUUzogV2UncmUgZ2V0dGluZyBhbiBSeC4uLlxuIiApOwogICAgICAgICAgICByZXR1cm4gLUVJTzsKICAgICAgICB9CiNlbmRpZiAgLyogVVNFX1JUUyAqLwoKICAgICAgICAvKiBSZWFkIHRoZSBIRlNfU1RBVCByZWdpc3RlciBmcm9tIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCiAgICAgICAgaGZzX3N0YXQgPSAoaGNmXzE2KSgoIGxwLT5sb29rQWhlYWRCdWZbSEZTX1NUQVRdICkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBscC0+bG9va0FoZWFkQnVmW0hGU19TVEFUICsgMV0gPDwgOCApKTsKCiAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBmcmFtZSBpc24ndCBiYWQgKi8KICAgICAgICBpZigoIGhmc19zdGF0ICYgSEZTX1NUQVRfRVJSICkgIT0gSENGX1NVQ0NFU1MgKSB7CiAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiSEZTX1NUQVRfRVJST1IgKDB4JXgpIGluIFJ4IFBhY2tldFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5sb29rQWhlYWRCdWZbSEZTX1NUQVRdICk7CiAgICAgICAgICAgIHJldHVybiAtRUlPOwogICAgICAgIH0KCiAgICAgICAgLyogRGV0ZXJtaW5lIHdoYXQgcG9ydCB0aGlzIHBhY2tldCBpcyBmb3IgKi8KICAgICAgICBwb3J0ID0gKCBoZnNfc3RhdCA+PiA4ICkgJiAweDAwMDc7CiAgICAgICAgREJHX1JYKCBEYmdJbmZvLCAiUnggZnJhbWUgZm9yIHBvcnQgJWRcbiIsIHBvcnQgKTsKCiAgICAgICAgcGt0bGVuID0gbHAtPmhjZkN0eC5JRkJfUnhMZW47CiAgICAgICAgaWYgKHBrdGxlbiAhPSAwKSB7CiAgICAgICAgICAgIHNrYiA9IEFMTE9DX1NLQihwa3RsZW4pOwogICAgICAgICAgICBpZiAoc2tiICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgbmV0ZGV2IGJhc2VkIG9uIHRoZSBwb3J0ICovCiAgICAgICAgICAgICAgICBzd2l0Y2goIHBvcnQgKSB7CiNpZmRlZiBVU0VfV0RTCiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBscC0+d2RzX3BvcnRbcG9ydC0xXS5kZXY7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNlbmRpZiAgLyogVVNFX1dEUyAqLwoKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBkZXY7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZGVzYyA9ICYoIGxwLT5kZXNjX3J4ICk7CgogICAgICAgICAgICAgICAgZGVzYy0+bmV4dF9kZXNjX2FkZHIgPSBOVUxMOwoKLyoKI2RlZmluZSBCTE9DS19JTlBVVChidWYsIGxlbikgXAogICAgZGVzYy0+YnVmX2FkZHIgPSBidWY7IFwKICAgIGRlc2MtPkJVRl9TSVpFID0gbGVuOyBcCiAgICBzdGF0dXMgPSBoY2ZfcmN2X21zZygmKGxwLT5oY2ZDdHgpLCBkZXNjLCAwKQoqLwoKICAgICAgICAgICAgICAgIEdFVF9QQUNLRVQoIHNrYi0+ZGV2LCBza2IsIHBrdGxlbiApOwoKICAgICAgICAgICAgICAgIGlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV0aWZfcngoIHNrYiApOwoKICAgICAgICAgICAgICAgICAgICBpZiggcG9ydCA9PSAwICkgewogICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfcGFja2V0cysrOwogICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOwogICAgICAgICAgICAgICAgICAgIH0KI2lmZGVmIFVTRV9XRFMKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9wYWNrZXRzKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtwb3J0LTFdLnN0YXRzLnJ4X2J5dGVzICs9IHBrdGxlbjsKICAgICAgICAgICAgICAgICAgICB9CiNlbmRpZiAgLyogVVNFX1dEUyAqLwoKICAgICAgICAgICAgICAgICAgICBkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwoKI2lmZGVmIFdJUkVMRVNTX0VYVAojaWZkZWYgV0lSRUxFU1NfU1BZCiAgICAgICAgICAgICAgICAgICAgaWYoIGxwLT5zcHlkYXRhLnNweV9udW1iZXIgPiAwICkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzcmNhZGRyID0gc2tiLT5tYWMucmF3ICsgTUFDX0FERFJfU0laRTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHdsX3NweV9nYXRoZXIoIGRldiwgc3JjYWRkciApOwogICAgICAgICAgICAgICAgICAgIH0KI2VuZGlmIC8qIFdJUkVMRVNTX1NQWSAqLwojZW5kaWYgLyogV0lSRUxFU1NfRVhUICovCiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlJ4IHJlcXVlc3QgdG8gY2FyZCBGQUlMRURcbiIgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKICAgICAgICAgICAgICAgICAgICB9CiNpZmRlZiBVU0VfV0RTCiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfZHJvcHBlZCsrOwogICAgICAgICAgICAgICAgICAgIH0KI2VuZGlmICAvKiBVU0VfV0RTICovCgogICAgICAgICAgICAgICAgICAgIGRldl9rZnJlZV9za2IoIHNrYiApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IGFsbG9jIHNrYlxuIiApOwoKICAgICAgICAgICAgICAgIGlmKCBwb3J0ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKICAgICAgICAgICAgICAgIH0KI2lmZGVmIFVTRV9XRFMKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9kcm9wcGVkKys7CiAgICAgICAgICAgICAgICB9CiNlbmRpZiAgLyogVVNFX1dEUyAqLwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9IC8vIHdsX3J4Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9tdWx0aWNhc3QoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgRnVuY3Rpb24gdG8gaGFuZGxlIG11bHRpY2FzdCBwYWNrZXRzCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaWZkZWYgTkVXX01VTFRJQ0FTVAoKdm9pZCB3bF9tdWx0aWNhc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CiNpZiAxIC8vOz8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1NUQSAvLzs/c2hvdWxkIHdlIHJldHVybiBhbiBlcnJvciBzdGF0dXMgaW4gQVAgbW9kZQovLzs/c2VlbXMgcmVhc29uYWJsZSB0aGF0IGV2ZW4gYW4gQVAtb25seSBkcml2ZXIgY291bGQgYWZmb3JkIHRoaXMgc21hbGwgYWRkaXRpb25hbCBmb290cHJpbnQKCiAgICBpbnQgICAgICAgICAgICAgICAgIHg7CiAgICBzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwogICAgc3RydWN0IHdsX3ByaXZhdGUgICAqbHAgPSB3bF9wcml2KGRldik7CiAgICB1bnNpZ25lZCBsb25nICAgICAgIGZsYWdzOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfbXVsdGljYXN0IiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CiAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKCiAgICBpZiggIXdsX2FkYXB0ZXJfaXNfb3BlbiggZGV2ICkpIHsKICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgICAgICByZXR1cm47CiAgICB9CgojaWYgREJHCiAgICBpZiggREJHX0ZMQUdTKCBEYmdJbmZvICkgJiBEQkdfUEFSQU1fT04gKSB7CiAgICAgICAgREJHX1BSSU5UKCIgIGZsYWdzOiAlcyVzJXNcbiIsCiAgICAgICAgICAgICggZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDICkgPyAiUHJvbWlzY291cyAiIDogIiIsCiAgICAgICAgICAgICggZGV2LT5mbGFncyAmIElGRl9NVUxUSUNBU1QgKSA/ICJNdWx0aWNhc3QgIiA6ICIiLAogICAgICAgICAgICAoIGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkgKSA/ICJBbGwtTXVsdGljYXN0IiA6ICIiICk7CgogICAgICAgIERCR19QUklOVCggIiAgbWNfY291bnQ6ICVkXG4iLCBuZXRkZXZfbWNfY291bnQoZGV2KSk7CgoJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikKICAgICAgICAgICAgREJHX1BSSU5UKCIgICAgJXMgKCVkKVxuIiwgRGJnSHdBZGRyKGhhLT5hZGRyKSwKCQkgICAgICBkZXYtPmFkZHJfbGVuKTsKICAgIH0KI2VuZGlmIC8qIERCRyAqLwoKICAgIGlmKCEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKSB7CgojaWZkZWYgVVNFX1JUUwogICAgICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CiAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlNraXBwaW5nIG11bHRpY2FzdCwgaW4gUlRTIG1vZGVcbiIgKTsKCiAgICAgICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQojZW5kaWYgIC8qIFVTRV9SVFMgKi8KCiAgICAgICAgd2xfbG9jayggbHAsICZmbGFncyApOwogICAgICAgIHdsX2FjdF9pbnRfb2ZmKCBscCApOwoKCQlpZiAoIENOVl9JTlRfVE9fTElUVExFKCBscC0+aGNmQ3R4LklGQl9GV0lkZW50aXR5LmNvbXBfaWQgKSA9PSBDT01QX0lEX0ZXX1NUQSAgKSB7CiAgICAgICAgICAgIGlmKCBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgKSB7CiAgICAgICAgICAgICAgICAvKiBFbmFibGUgcHJvbWlzY3VvdXMgbW9kZSAqLwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gICAgICAgPSAyOwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgICAgICAgPSBDRkdfUFJPTUlTQ1VPVVNfTU9ERTsKICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudS51MTZbMF0gID0gQ05WX0lOVF9UT19MSVRUTEUoIDEgKTsKICAgICAgICAgICAgICAgIERCR19QUklOVCggIkVuYWJsaW5nIFByb21pc2N1b3VzIG1vZGUgKElGRl9QUk9NSVNDKVxuIiApOwogICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoKG5ldGRldl9tY19jb3VudChkZXYpID4gSENGX01BWF9NVUxUSUNBU1QpIHx8CiAgICAgICAgICAgICAgICAgICAgKCBkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJICkpIHsKICAgICAgICAgICAgICAgIC8qIFNodXR0aW5nIG9mZiB0aGlzIGZpbHRlciB3aWxsIGVuYWJsZSBhbGwgbXVsdGljYXN0IGZyYW1lcyB0bwogICAgICAgICAgICAgICAgICAgYmUgc2VudCB1cCBmcm9tIHRoZSBkZXZpY2U7IGhvd2V2ZXIsIHRoaXMgaXMgYSBzdGF0aWMgUklELCBzbwogICAgICAgICAgICAgICAgICAgYSBjYWxsIHRvIHdsX2FwcGx5KCkgaXMgbmVlZGVkICovCiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfUlhfQUxMX0dST1VQX0FERFI7CiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7CiAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJFbmFibGluZyBhbGwgbXVsdGljYXN0IG1vZGUgKElGRl9BTExNVUxUSSlcbiIgKTsKICAgICAgICAgICAgICAgIGhjZl9wdXRfaW5mbyggJiggbHAtPmhjZkN0eCApLCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwogICAgICAgICAgICAgICAgd2xfYXBwbHkoIGxwICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIW5ldGRldl9tY19lbXB0eShkZXYpKSB7CiAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuID0gKCBuZXRkZXZfbWNfY291bnQoZGV2KSAqIDMgKSArIDE7CiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCA9IENGR19HUk9VUF9BRERSOwoKCQl4ID0gMDsKCQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KQogICAgICAgICAgICAgICAgICAgIG1lbWNweSgmKGxwLT5sdHZSZWNvcmQudS51OFt4KysgKiBFVEhfQUxFTl0pLAoJCQkgICBoYS0+YWRkciwgRVRIX0FMRU4pOwogICAgICAgICAgICAgICAgREJHX1BSSU5UKCAiU2V0dGluZyBtdWx0aWNhc3QgbGlzdFxuIiApOwogICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIHByb21pc2N1b3VzIG1vZGUgKi8KICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQubGVuICAgICAgID0gMjsKICAgICAgICAgICAgICAgIGxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1BST01JU0NVT1VTX01PREU7CiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAwICk7CiAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJEaXNhYmxpbmcgUHJvbWlzY3VvdXMgbW9kZVxuIiApOwogICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgogICAgICAgICAgICAgICAgLyogRGlzYWJsZSBtdWx0aWNhc3QgbW9kZSAqLwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC5sZW4gPSAyOwogICAgICAgICAgICAgICAgbHAtPmx0dlJlY29yZC50eXAgPSBDRkdfR1JPVVBfQUREUjsKICAgICAgICAgICAgICAgIERCR19QUklOVCggIkRpc2FibGluZyBNdWx0aWNhc3QgbW9kZVxuIiApOwogICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSYoIGxwLT5sdHZSZWNvcmQgKSk7CgogICAgICAgICAgICAgICAgLyogVHVybmluZyBvbiB0aGlzIGZpbHRlciB3aWxsIHByZXZlbnQgYWxsIG11bHRpY2FzdCBmcmFtZXMgZnJvbQogICAgICAgICAgICAgICAgICAgYmVpbmcgc2VudCB1cCBmcm9tIHRoZSBkZXZpY2U7IGhvd2V2ZXIsIHRoaXMgaXMgYSBzdGF0aWMgUklELAogICAgICAgICAgICAgICAgICAgc28gYSBjYWxsIHRvIHdsX2FwcGx5KCkgaXMgbmVlZGVkICovCiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLmxlbiAgICAgICA9IDI7CiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnR5cCAgICAgICA9IENGR19DTkZfUlhfQUxMX0dST1VQX0FERFI7CiAgICAgICAgICAgICAgICBscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCAxICk7CiAgICAgICAgICAgICAgICBEQkdfUFJJTlQoICJEaXNhYmxpbmcgYWxsIG11bHRpY2FzdCBtb2RlIChJRkZfQUxMTVVMVEkpXG4iICk7CiAgICAgICAgICAgICAgICBoY2ZfcHV0X2luZm8oICYoIGxwLT5oY2ZDdHggKSwgKExUVlApJiggbHAtPmx0dlJlY29yZCApKTsKICAgICAgICAgICAgICAgIHdsX2FwcGx5KCBscCApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHdsX2FjdF9pbnRfb24oIGxwICk7Cgl3bF91bmxvY2soIGxwLCAmZmxhZ3MgKTsKICAgIH0KICAgIERCR19MRUFWRSggRGJnSW5mbyApOwojZW5kaWYgLyogSENGX1NUQSAqLwp9IC8vIHdsX211bHRpY2FzdAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2Vsc2UgLyogTkVXX01VTFRJQ0FTVCAqLwoKdm9pZCB3bF9tdWx0aWNhc3QoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBudW1fYWRkcnMsIHZvaWQgKmFkZHJzICkKewogICAgREJHX0ZVTkMoICJ3bF9tdWx0aWNhc3QiKTsKICAgIERCR19FTlRFUihEYmdJbmZvKTsKCiAgICBEQkdfUEFSQU0oIERiZ0luZm8sICJkZXYiLCAiJXMgKDB4JXApIiwgZGV2LT5uYW1lLCBkZXYgKTsKICAgIERCR19QQVJBTSggRGJnSW5mbywgIm51bV9hZGRycyIsICIlZCIsIG51bV9hZGRycyApOwogICAgREJHX1BBUkFNKCBEYmdJbmZvLCAiYWRkcnMiLCAiMHglcCIsIGFkZHJzICk7CgojZXJyb3IgT2Jzb2xldGUgc2V0IG11bHRpY2FzdCBpbnRlcmZhY2UhCgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7Cn0gLy8gd2xfbXVsdGljYXN0Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojZW5kaWYgLyogTkVXX01VTFRJQ0FTVCAqLwoKc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB3bF9uZXRkZXZfb3BzID0KewogICAgLm5kb19zdGFydF94bWl0ICAgICAgICAgPSAmd2xfdHhfcG9ydDAsCgogICAgLm5kb19zZXRfY29uZmlnICAgICAgICAgPSAmd2xfY29uZmlnLAogICAgLm5kb19nZXRfc3RhdHMgICAgICAgICAgPSAmd2xfc3RhdHMsCiAgICAubmRvX3NldF9tdWx0aWNhc3RfbGlzdCA9ICZ3bF9tdWx0aWNhc3QsCgogICAgLm5kb19pbml0ICAgICAgICAgICAgICAgPSAmd2xfaW5zZXJ0LAogICAgLm5kb19vcGVuICAgICAgICAgICAgICAgPSAmd2xfYWRhcHRlcl9vcGVuLAogICAgLm5kb19zdG9wICAgICAgICAgICAgICAgPSAmd2xfYWRhcHRlcl9jbG9zZSwKICAgIC5uZG9fZG9faW9jdGwgICAgICAgICAgID0gJndsX2lvY3RsLAoKICAgIC5uZG9fdHhfdGltZW91dCAgICAgICAgID0gJndsX3R4X3RpbWVvdXQsCgojaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKICAgIC5uZG9fcG9sbF9jb250cm9sbGVyICAgID0gd2xfcG9sbCwKI2VuZGlmCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9kZXZpY2VfYWxsb2MoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ3JlYXRlIGluc3RhbmNlcyBvZiBuZXRfZGV2aWNlIGFuZCB3bF9wcml2YXRlIGZvciB0aGUgbmV3IGFkYXB0ZXIKICogIGFuZCByZWdpc3RlciB0aGUgZGV2aWNlJ3MgZW50cnkgcG9pbnRzIGluIHRoZSBuZXRfZGV2aWNlIHN0cnVjdHVyZS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgTi9BCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIGEgcG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIG5ldF9kZXZpY2Ugc3RydWN0IGZvciB0aGlzCiAqICAgICAgZGV2aWNlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdHJ1Y3QgbmV0X2RldmljZSAqIHdsX2RldmljZV9hbGxvYyggdm9pZCApCnsKICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgKmRldiA9IE5VTEw7CiAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IE5VTEw7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF9kZXZpY2VfYWxsb2MiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICAvKiBBbGxvYyBhIG5ldF9kZXZpY2Ugc3RydWN0ICovCiAgICBkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHdsX3ByaXZhdGUpKTsKICAgIGlmICghZGV2KQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIC8qIEluaXRpYWxpemUgdGhlICduZXh0JyBwb2ludGVyIGluIHRoZSBzdHJ1Y3QuIEN1cnJlbnRseSBvbmx5IHVzZWQgZm9yIFBDSSwKICAgICAgIGJ1dCBkbyBpdCBoZXJlIGp1c3QgaW4gY2FzZSBpdCdzIHVzZWQgZm9yIG90aGVyIGJ1c2VzIGluIHRoZSBmdXR1cmUgKi8KICAgIGxwID0gd2xfcHJpdihkZXYpOwoKCiAgICAvKiBDaGVjayBNVFUgKi8KICAgIGlmKCBkZXYtPm10dSA+IE1UVV9NQVggKQogICAgewoJICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiJXM6IE1UVSBzZXQgdG9vIGhpZ2gsIGxpbWl0aW5nIHRvICVkLlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBNVFVfTUFYICk7CiAgICAJZGV2LT5tdHUgPSBNVFVfTUFYOwogICAgfQoKICAgIC8qIFNldHVwIHRoZSBmdW5jdGlvbiB0YWJsZSBpbiB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KCiAgICBkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gKHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqKSZ3bF9pd19oYW5kbGVyX2RlZjsKICAgIGxwLT53aXJlbGVzc19kYXRhLnNweV9kYXRhID0gJmxwLT5zcHlfZGF0YTsKICAgIGRldi0+d2lyZWxlc3NfZGF0YSA9ICZscC0+d2lyZWxlc3NfZGF0YTsKCiAgICBkZXYtPm5ldGRldl9vcHMgPSAmd2xfbmV0ZGV2X29wczsKCiAgICBkZXYtPndhdGNoZG9nX3RpbWVvICAgICA9IFRYX1RJTUVPVVQ7CgogICAgZGV2LT5ldGh0b29sX29wcwkgICAgPSAmd2xfZXRodG9vbF9vcHM7CgogICAgbmV0aWZfc3RvcF9xdWV1ZSggZGV2ICk7CgogICAgLyogQWxsb2NhdGUgdmlydXRhbCBkZXZpY2VzIGZvciBXRFMgc3VwcG9ydCBpZiBuZWVkZWQgKi8KICAgIFdMX1dEU19ERVZJQ0VfQUxMT0MoIGxwICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gZGV2Owp9IC8vIHdsX2RldmljZV9hbGxvYwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfZGV2aWNlX2RlYWxsb2MoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgRnJlZSBpbnN0YW5jZXMgb2YgbmV0X2RldmljZSBhbmQgd2xfcHJpdmF0ZSBzdHJjdXRyZXMgZm9yIGFuIGFkYXB0ZXIKICogIGFuZCBwZXJmb3JtIGJhc2ljIGNsZWFudXAuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX2RldmljZV9kZWFsbG9jKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKewovLyAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IHdsX3ByaXYoZGV2KTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX2RldmljZV9kZWFsbG9jIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgLyogRGVhbGxvYyB0aGUgV0RTIHBvcnRzICovCiAgICBXTF9XRFNfREVWSUNFX0RFQUxMT0MoIGxwICk7CgogICAgZnJlZV9uZXRkZXYoIGRldiApOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuOwp9IC8vIHdsX2RldmljZV9kZWFsbG9jCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF90eF9wb3J0MCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgaGFuZGxlciByb3V0aW5lIGZvciBUeCBvdmVyIEhDRl9QT1JUXzAuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHNrYiAtIGEgcG9pbnRlciB0byB0aGUgc2tfYnVmZiB0byB0cmFuc21pdC4KICogICAgICBkZXYgLSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgSENGX1BPUlRfMC4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF90eF9wb3J0MCggc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIERCR19UWCggRGJnSW5mbywgIlR4IG9uIFBvcnQgMFxuIiApOwoKICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzAgKTsKI2lmZGVmIEVOQUJMRV9ETUEKICAgIHJldHVybiB3bF90eF9kbWEoIHNrYiwgZGV2LCBIQ0ZfUE9SVF8wICk7CiNlbmRpZgp9IC8vIHdsX3R4X3BvcnQwCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojaWZkZWYgVVNFX1dEUwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfdHhfcG9ydDEoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF8xLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzEuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfdHhfcG9ydDEoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CiAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDFcbiIgKTsKICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzEgKTsKfSAvLyB3bF90eF9wb3J0MQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfdHhfcG9ydDIoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF8yLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzIuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfdHhfcG9ydDIoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CiAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDJcbiIgKTsKICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzIgKTsKfSAvLyB3bF90eF9wb3J0MgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfdHhfcG9ydDMoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF8zLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzMuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfdHhfcG9ydDMoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CiAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDNcbiIgKTsKICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzMgKTsKfSAvLyB3bF90eF9wb3J0MwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfdHhfcG9ydDQoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF80LgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzQuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfdHhfcG9ydDQoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CiAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDRcbiIgKTsKICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzQgKTsKfSAvLyB3bF90eF9wb3J0NAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfdHhfcG9ydDUoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF81LgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzUuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfdHhfcG9ydDUoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CiAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDVcbiIgKTsKICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzUgKTsKfSAvLyB3bF90eF9wb3J0NQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfdHhfcG9ydDYoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVGhlIGhhbmRsZXIgcm91dGluZSBmb3IgVHggb3ZlciBIQ0ZfUE9SVF82LgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBza2IgLSBhIHBvaW50ZXIgdG8gdGhlIHNrX2J1ZmYgdG8gdHJhbnNtaXQuCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIEhDRl9QT1JUXzYuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfdHhfcG9ydDYoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CiAgICBEQkdfVFgoIERiZ0luZm8sICJUeCBvbiBQb3J0IDZcbiIgKTsKICAgIHJldHVybiB3bF90eCggc2tiLCBkZXYsIEhDRl9QT1JUXzYgKTsKfSAvLyB3bF90eF9wb3J0NgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfd2RzX2RldmljZV9hbGxvYygpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDcmVhdGUgaW5zdGFuY2VzIG9mIG5ldF9kZXZpY2UgdG8gcmVwcmVzZW50IHRoZSBXRFMgcG9ydHMsIGFuZCByZWdpc3RlcgogKiAgdGhlIGRldmljZSdzIGVudHJ5IHBvaW50cyBpbiB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EsIGJ1dCB3aWxsIHBsYWNlIHBvaW50ZXJzIHRvIHRoZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIG5ldF9kZXZpY2UKICogICAgICBzdHJ1Y3RzIGluIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3dkc19kZXZpY2VfYWxsb2MoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKICAgIGludCBjb3VudDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3dkc19kZXZpY2VfYWxsb2MiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICAvKiBXRFMgc3VwcG9ydCByZXF1aXJlcyBhZGRpdGlvbmFsIG5ldF9kZXZpY2Ugc3RydWN0cyB0byBiZSBhbGxvY2F0ZWQsCiAgICAgICBzbyB0aGF0IHVzZXIgc3BhY2UgYXBwcyBjYW4gdXNlIHRoZXNlIHZpcnR1YWwgZGV2aWNlcyB0byBzcGVjaWZ5IHRoZQogICAgICAgcG9ydCBvbiB3aGljaCB0byBUeC9SeCAqLwogICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3dkcyA9IE5VTEw7CgogICAgICAgIGRldl93ZHMgPSBrbWFsbG9jKCBzaXplb2YoIHN0cnVjdCBuZXRfZGV2aWNlICksIEdGUF9LRVJORUwgKTsKICAgICAgICBtZW1zZXQoIGRldl93ZHMsIDAsIHNpemVvZiggc3RydWN0IG5ldF9kZXZpY2UgKSk7CgogICAgICAgIGV0aGVyX3NldHVwKCBkZXZfd2RzICk7CgogICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ID0gZGV2X3dkczsKCiAgICAgICAgLyogUmUtdXNlIHdsX2luaXQgZm9yIGFsbCB0aGUgZGV2aWNlcywgYXMgaXQgY3VycmVudGx5IGRvZXMgbm90aGluZywgYnV0CiAgICAgICAgICAgaXMgcmVxdWlyZWQuIFJlLXVzZSB0aGUgc3RhdHMvdHhfdGltZW91dCBoYW5kbGVyIGZvciBhbGwgYXMgd2VsbDsgdGhlCiAgICAgICAgICAgV0RTIHBvcnQgd2hpY2ggaXMgcmVxdWVzdGluZyB0aGVzZSBvcGVyYXRpb25zIGNhbiBiZSBkZXRlcm1pbmVkIGJ5CiAgICAgICAgICAgdGhlIG5ldF9kZXZpY2UgcG9pbnRlci4gU2V0IHRoZSBwcml2YXRlIG1lbWJlciBvZiBhbGwgZGV2aWNlcyB0byBwb2ludAogICAgICAgICAgIHRvIHRoZSBzYW1lIG5ldF9kZXZpY2Ugc3RydWN0OyB0aGF0IHdheSwgYWxsIGluZm9ybWF0aW9uIGdldHMKICAgICAgICAgICBmdW5uZWxsZWQgdGhyb3VnaCB0aGUgb25lICJyZWFsIiBuZXRfZGV2aWNlLiBOYW1lIHRoZSBXRFMgcG9ydHMKICAgICAgICAgICAid2RzPG4+IiAqLwogICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT5pbml0ICAgICAgICAgICA9ICZ3bF9pbml0OwogICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT5nZXRfc3RhdHMgICAgICA9ICZ3bF9zdGF0czsKICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+dHhfdGltZW91dCAgICAgPSAmd2xfdHhfdGltZW91dDsKICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+d2F0Y2hkb2dfdGltZW8gPSBUWF9USU1FT1VUOwogICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2LT5wcml2ICAgICAgICAgICA9IGxwOwoKICAgICAgICBzcHJpbnRmKCBscC0+d2RzX3BvcnRbY291bnRdLmRldi0+bmFtZSwgIndkcyVkIiwgY291bnQgKTsKICAgIH0KCiAgICAvKiBSZWdpc3RlciB0aGUgVHggaGFuZGxlcnMgKi8KICAgIGxwLT53ZHNfcG9ydFswXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MTsKICAgIGxwLT53ZHNfcG9ydFsxXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MjsKICAgIGxwLT53ZHNfcG9ydFsyXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0MzsKICAgIGxwLT53ZHNfcG9ydFszXS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0NDsKICAgIGxwLT53ZHNfcG9ydFs0XS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0NTsKICAgIGxwLT53ZHNfcG9ydFs1XS5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9ICZ3bF90eF9wb3J0NjsKCiAgICBXTF9XRFNfTkVUSUZfU1RPUF9RVUVVRSggbHAgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF93ZHNfZGV2aWNlX2FsbG9jCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF93ZHNfZGV2aWNlX2RlYWxsb2MoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgRnJlZSBpbnN0YW5jZXMgb2YgbmV0X2RldmljZSBzdHJ1Y3R1cmVzIHVzZWQgdG8gc3VwcG9ydCBXRFMuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF93ZHNfZGV2aWNlX2RlYWxsb2MoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKICAgIGludCBjb3VudDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3dkc19kZXZpY2VfZGVhbGxvYyIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CiAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldl93ZHMgPSBOVUxMOwoKICAgICAgICBkZXZfd2RzID0gbHAtPndkc19wb3J0W2NvdW50XS5kZXY7CgogICAgICAgIGlmKCBkZXZfd2RzICE9IE5VTEwgKSB7CiAgICAgICAgICAgIGlmKCBkZXZfd2RzLT5mbGFncyAmIElGRl9VUCApIHsKICAgICAgICAgICAgICAgIGRldl9jbG9zZSggZGV2X3dkcyApOwogICAgICAgICAgICAgICAgZGV2X3dkcy0+ZmxhZ3MgJj0gfiggSUZGX1VQIHwgSUZGX1JVTk5JTkcgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAga2ZyZWUoIGRldl93ZHMgKTsKICAgICAgICAgICAgbHAtPndkc19wb3J0W2NvdW50XS5kZXYgPSBOVUxMOwogICAgICAgIH0KICAgIH0KCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF93ZHNfZGV2aWNlX2RlYWxsb2MKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBVc2VkIHRvIHN0YXJ0IHRoZSBuZXRpZiBxdWV1ZXMgb2YgYWxsIHRoZSAidmlydHVhbCIgbmV0d29yayBkZXZpY2VzCiAqICAgICAgd2hpY2ggcmVwZXNlbnQgdGhlIFdEUyBwb3J0cy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3dkc19uZXRpZl9zdGFydF9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaW50IGNvdW50OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmKCBscCAhPSBOVUxMICkgewogICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CiAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gRkFMU0UgKSB7CiAgICAgICAgICAgICAgICBuZXRpZl9zdGFydF9xdWV1ZSggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfSAvLyB3bF93ZHNfbmV0aWZfc3RhcnRfcXVldWUKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3dkc19uZXRpZl9zdG9wX3F1ZXVlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFVzZWQgdG8gc3RvcCB0aGUgbmV0aWYgcXVldWVzIG9mIGFsbCB0aGUgInZpcnR1YWwiIG5ldHdvcmsgZGV2aWNlcwogKiAgICAgIHdoaWNoIHJlcGVzZW50IHRoZSBXRFMgcG9ydHMuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF93ZHNfbmV0aWZfc3RvcF9xdWV1ZSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaW50IGNvdW50OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmKCBscCAhPSBOVUxMICkgewogICAgICAgIGZvciggY291bnQgPSAwOyBjb3VudCA8IE5VTV9XRFNfUE9SVFM7IGNvdW50KysgKSB7CiAgICAgICAgICAgIGlmKCBscC0+d2RzX3BvcnRbY291bnRdLmlzX3JlZ2lzdGVyZWQgJiYKICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPT0gVFJVRSApIHsKICAgICAgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7CiAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID0gRkFMU0U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9IC8vIHdsX3dkc19uZXRpZl9zdG9wX3F1ZXVlCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBVc2VkIHRvIHdha2UgdGhlIG5ldGlmIHF1ZXVlcyBvZiBhbGwgdGhlICJ2aXJ0dWFsIiBuZXR3b3JrIGRldmljZXMKICogICAgICB3aGljaCByZXBlc2VudCB0aGUgV0RTIHBvcnRzLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfd2RzX25ldGlmX3dha2VfcXVldWUoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKICAgIGludCBjb3VudDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiggbHAgIT0gTlVMTCApIHsKICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewogICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICYmCiAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbY291bnRdLm5ldGlmX3F1ZXVlX29uID09IEZBTFNFICkgewogICAgICAgICAgICAgICAgbmV0aWZfd2FrZV9xdWV1ZSggbHAtPndkc19wb3J0W2NvdW50XS5kZXYgKTsKICAgICAgICAgICAgICAgIGxwLT53ZHNfcG9ydFtjb3VudF0ubmV0aWZfcXVldWVfb24gPSBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfSAvLyB3bF93ZHNfbmV0aWZfd2FrZV9xdWV1ZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfd2RzX25ldGlmX2NhcnJpZXJfb24oKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVXNlZCB0byBzaWduYWwgdGhlIG5ldHdvcmsgbGF5ZXIgdGhhdCBjYXJyaWVyIGlzIHByZXNlbnQgb24gYWxsIG9mIHRoZQogKiAgICAgICJ2aXJ0dWFsIiBuZXR3b3JrIGRldmljZXMgd2hpY2ggcmVwZXNlbnQgdGhlIFdEUyBwb3J0cy4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3dkc19uZXRpZl9jYXJyaWVyX29uKCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBpbnQgY291bnQ7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYoIGxwICE9IE5VTEwgKSB7CiAgICAgICAgZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgTlVNX1dEU19QT1JUUzsgY291bnQrKyApIHsKICAgICAgICAgICAgaWYoIGxwLT53ZHNfcG9ydFtjb3VudF0uaXNfcmVnaXN0ZXJlZCApIHsKICAgICAgICAgICAgICAgIG5ldGlmX2NhcnJpZXJfb24oIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9IC8vIHdsX3dkc19uZXRpZl9jYXJyaWVyX29uCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgVXNlZCB0byBzaWduYWwgdGhlIG5ldHdvcmsgbGF5ZXIgdGhhdCBjYXJyaWVyIGlzIE5PVCBwcmVzZW50IG9uIGFsbCBvZgogKiAgICAgIHRoZSAidmlydHVhbCIgbmV0d29yayBkZXZpY2VzIHdoaWNoIHJlcGVzZW50IHRoZSBXRFMgcG9ydHMuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF93ZHNfbmV0aWZfY2Fycmllcl9vZmYoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKICAgIGludCBjb3VudDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBpZiggbHAgIT0gTlVMTCApIHsKICAgICAgICBmb3IoIGNvdW50ID0gMDsgY291bnQgPCBOVU1fV0RTX1BPUlRTOyBjb3VudCsrICkgewogICAgICAgICAgICBpZiggbHAtPndkc19wb3J0W2NvdW50XS5pc19yZWdpc3RlcmVkICkgewogICAgICAgICAgICAgICAgbmV0aWZfY2Fycmllcl9vZmYoIGxwLT53ZHNfcG9ydFtjb3VudF0uZGV2ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9IC8vIHdsX3dkc19uZXRpZl9jYXJyaWVyX29mZgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2VuZGlmICAvKiBVU0VfV0RTICovCgojaWZkZWYgRU5BQkxFX0RNQQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9zZW5kX2RtYSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgcm91dGluZSB3aGljaCBwZXJmb3JtcyBkYXRhIHRyYW5zbWl0cyB3aGVuIHVzaW5nIGJ1c21hc3RlciBETUEuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwICAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHdsX3ByaXZhdGUgc3RydWN0LgogKiAgICAgIHNrYiAgLSBhIHBvaW50ZXIgdG8gdGhlIG5ldHdvcmsgbGF5ZXIncyBkYXRhIGJ1ZmZlci4KICogICAgICBwb3J0IC0gdGhlIEhlcm1lcyBwb3J0IG9uIHdoaWNoIHRvIHRyYW5zbWl0LgogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICAxIG9uIGVycm9yCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9zZW5kX2RtYSggc3RydWN0IHdsX3ByaXZhdGUgKmxwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgcG9ydCApCnsKICAgIGludCAgICAgICAgIGxlbjsKICAgIERFU0NfU1RSQ1QgKmRlc2MgPSBOVUxMOwogICAgREVTQ19TVFJDVCAqZGVzY19uZXh0ID0gTlVMTDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3NlbmRfZG1hIiApOwoKICAgIGlmKCBscCA9PSBOVUxMICkKICAgIHsKICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJQcml2YXRlIGFkYXB0ZXIgc3RydWN0IGlzIE5VTExcbiIgKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgaWYoIGxwLT5kZXYgPT0gTlVMTCApCiAgICB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAibmV0X2RldmljZSBzdHJ1Y3QgaW4gd2xfcHJpdmF0ZSBpcyBOVUxMXG4iICk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIC8qIEFHQUlOLCBBTEwgVEhFIFFVRVVFSU5HIERPTkUgSEVSRSBJTiBJL08gTU9ERSBJUyBOT1QgUEVSRk9STUVEICovCgogICAgaWYoIHNrYiA9PSBOVUxMICkKICAgIHsKICAgICAgICBEQkdfV0FSTklORyAoRGJnSW5mbywgIk5vdGhpbmcgdG8gc2VuZC5cbiIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBsZW4gPSBza2ItPmxlbjsKCiAgICAvKiBHZXQgYSBmcmVlIGRlc2NyaXB0b3IgKi8KICAgIGRlc2MgPSB3bF9wY2lfZG1hX2dldF90eF9wYWNrZXQoIGxwICk7CgogICAgaWYoIGRlc2MgPT0gTlVMTCApCiAgICB7CiAgICAgICAgaWYoIGxwLT5uZXRpZl9xdWV1ZV9vbiA9PSBUUlVFICkgewogICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKCBscC0+ZGV2ICk7CiAgICAgICAgICAgIFdMX1dEU19ORVRJRl9TVE9QX1FVRVVFKCBscCApOwogICAgICAgICAgICBscC0+bmV0aWZfcXVldWVfb24gPSBGQUxTRTsKCiAgICAgICAgICAgIGRldl9rZnJlZV9za2IoIHNrYiApOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CgogICAgU0VUX0JVRl9DTlQoIGRlc2MsIC8qSENGX0RNQV9GRF9DTlQqL0hGU19BRERSX0RFU1QgKTsKICAgIFNFVF9CVUZfU0laRSggZGVzYywgSENGX0RNQV9UWF9CVUYxX1NJWkUgKTsKCiAgICBkZXNjX25leHQgPSBkZXNjLT5uZXh0X2Rlc2NfYWRkcjsKCiAgICBpZiggZGVzY19uZXh0LT5idWZfYWRkciA9PSBOVUxMICkKICAgIHsKICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJETUEgZGVzY3JpcHRvciBidWZfYWRkciBpcyBOVUxMXG4iICk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIC8qIENvcHkgdGhlIHBheWxvYWQgaW50byB0aGUgRE1BIHBhY2tldCAqLwogICAgbWVtY3B5KCBkZXNjX25leHQtPmJ1Zl9hZGRyLCBza2ItPmRhdGEsIGxlbiApOwoKICAgIFNFVF9CVUZfQ05UKCBkZXNjX25leHQsIGxlbiApOwogICAgU0VUX0JVRl9TSVpFKCBkZXNjX25leHQsIEhDRl9NQVhfUEFDS0VUX1NJWkUgKTsKCiAgICBoY2ZfZG1hX3R4X3B1dCggJiggbHAtPmhjZkN0eCApLCBkZXNjLCAwICk7CgogICAgLyogRnJlZSB0aGUgc2tiIGFuZCBwZXJmb3JtIHF1ZXVlIGNsZWFudXAsIGFzIHRoZSBidWZmZXIgd2FzCiAgICAgICAgICAgIHRyYW5zbWl0dGVkIHN1Y2Nlc3NmdWxseSAqLwogICAgZGV2X2tmcmVlX3NrYiggc2tiICk7CgogICAgcmV0dXJuIFRSVUU7Cn0gLy8gd2xfc2VuZF9kbWEKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3J4X2RtYSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBUaGUgcm91dGluZSB3aGljaCBwZXJmb3JtcyBkYXRhIHJlY2VwdGlvbiB3aGVuIHVzaW5nIGJ1c21hc3RlciBETUEuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIDEgb24gZXJyb3IKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3J4X2RtYSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIGludCAgICAgICAgICAgICAgICAgICAgICBwb3J0OwogICAgaGNmXzE2ICAgICAgICAgICAgICAgICAgIHBrdGxlbjsKICAgIGhjZl8xNiAgICAgICAgICAgICAgICAgICBoZnNfc3RhdDsKICAgIHN0cnVjdCBza19idWZmICAgICAgICAgICpza2I7CiAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICAgICAqbHAgPSBOVUxMOwogICAgREVTQ19TVFJDVCAgICAgICAgICAgICAgKmRlc2MsICpkZXNjX25leHQ7CiAgICAvL0NGR19NQl9JTkZPX1JBTkdFMl9TVFJDVCB4OwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCJ3bF9yeCIpCiAgICBEQkdfUEFSQU0oRGJnSW5mbywgImRldiIsICIlcyAoMHglcCkiLCBkZXYtPm5hbWUsIGRldik7CgogICAgaWYoKCggbHAgPSAoc3RydWN0IHdsX3ByaXZhdGUgKilkZXYtPnByaXYgKSAhPSBOVUxMICkgJiYKICAgICAgICAgICEoIGxwLT5mbGFncyAmIFdWTEFOMl9VSUxfQlVTWSApKSB7CgojaWZkZWYgVVNFX1JUUwogICAgICAgIGlmKCBscC0+dXNlUlRTID09IDEgKSB7CiAgICAgICAgICAgIERCR19QUklOVCggIlJUUzogV2UncmUgZ2V0dGluZyBhbiBSeC4uLlxuIiApOwogICAgICAgICAgICByZXR1cm4gLUVJTzsKICAgICAgICB9CiNlbmRpZiAgLyogVVNFX1JUUyAqLwoKICAgICAgICAvL2lmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICkKICAgICAgICAvL3sKICAgICAgICAgICAgZGVzYyA9IGhjZl9kbWFfcnhfZ2V0KCAmKCBscC0+aGNmQ3R4ICkpOwoKICAgICAgICAgICAgaWYoIGRlc2MgIT0gTlVMTCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIENoZWNrIGFuZCBzZWUgaWYgd2UgcmN2ZC4gYSBXTVAgZnJhbWUgKi8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICBpZigoKCAqKGhjZl84ICopJmRlc2MtPmJ1Zl9hZGRyW0hGU19TVEFUXSApICYKICAgICAgICAgICAgICAgICAgICAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICkpID09IEhGU19TVEFUX1dNUF9NU0cgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIkdvdCBhIFdNUCBmcmFtZVxuIiApOwoKICAgICAgICAgICAgICAgICAgICB4LmxlbiA9IHNpemVvZiggQ0ZHX01CX0lORk9fUkFOR0UyX1NUUkNUICkgLyBzaXplb2YoIGhjZl8xNiApOwoJCQkJICAgIHgudHlwID0gQ0ZHX01CX0lORk87CgkJCQkgICAgeC5iYXNlX3R5cCA9IENGR19XTVA7CgkJCQkgICAgeC5mcmFnX2NudCA9IDI7CgkJCQkgICAgeC5mcmFnX2J1ZlswXS5mcmFnX2xlbiAgPSBHRVRfQlVGX0NOVCggZGVzY3AgKSAvIHNpemVvZiggaGNmXzE2ICk7CgkJCQkgICAgeC5mcmFnX2J1ZlswXS5mcmFnX2FkZHIgPSAoaGNmXzggKikgZGVzY3AtPmJ1Zl9hZGRyIDsKCQkJCSAgICB4LmZyYWdfYnVmWzFdLmZyYWdfbGVuICA9ICggR0VUX0JVRl9DTlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciApICsgMSApIC8gc2l6ZW9mKCBoY2ZfMTYgKTsKCQkJCSAgICB4LmZyYWdfYnVmWzFdLmZyYWdfYWRkciA9IChoY2ZfOCAqKSBkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9hZGRyIDsKCiAgICAgICAgICAgICAgICAgICAgaGNmX3B1dF9pbmZvKCAmKCBscC0+aGNmQ3R4ICksIChMVFZQKSZ4ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIGRlc2NfbmV4dCA9IGRlc2MtPm5leHRfZGVzY19hZGRyOwoKICAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgYnVmZmVyIGlzbid0IGVtcHR5ICovCiAgICAgICAgICAgICAgICBpZiggR0VUX0JVRl9DTlQoIGRlc2MgKSA9PSAwICkgewogICAgICAgICAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiQnVmZmVyIGlzIGVtcHR5IVxuIiApOwoKICAgICAgICAgICAgICAgICAgICAvKiBHaXZlIHRoZSBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIEhDRiAqLwogICAgICAgICAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBIRlNfU1RBVCByZWdpc3RlciBmcm9tIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCiAgICAgICAgICAgICAgICBoZnNfc3RhdCA9IChoY2ZfMTYpKCBkZXNjLT5idWZfYWRkcltIRlNfU1RBVC8yXSApOwoKICAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgZnJhbWUgaXNuJ3QgYmFkICovCiAgICAgICAgICAgICAgICBpZigoIGhmc19zdGF0ICYgSEZTX1NUQVRfRVJSICkgIT0gSENGX1NVQ0NFU1MgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIERCR19XQVJOSU5HKCBEYmdJbmZvLCAiSEZTX1NUQVRfRVJST1IgKDB4JXgpIGluIFJ4IFBhY2tldFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5idWZfYWRkcltIRlNfU1RBVC8yXSApOwoKICAgICAgICAgICAgICAgICAgICAvKiBHaXZlIHRoZSBkZXNjcmlwdG9yIGJhY2sgdG8gdGhlIEhDRiAqLwogICAgICAgICAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmKCBscC0+aGNmQ3R4ICksIGRlc2MgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKiBEZXRlcm1pbmUgd2hhdCBwb3J0IHRoaXMgcGFja2V0IGlzIGZvciAqLwogICAgICAgICAgICAgICAgcG9ydCA9ICggaGZzX3N0YXQgPj4gOCApICYgMHgwMDA3OwogICAgICAgICAgICAgICAgREJHX1JYKCBEYmdJbmZvLCAiUnggZnJhbWUgZm9yIHBvcnQgJWRcbiIsIHBvcnQgKTsKCiAgICAgICAgICAgICAgICBwa3RsZW4gPSBHRVRfQlVGX0NOVChkZXNjX25leHQpOwogICAgICAgICAgICAgICAgaWYgKHBrdGxlbiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgc2tiID0gQUxMT0NfU0tCKHBrdGxlbik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNrYiAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCggcG9ydCApIHsKI2lmZGVmIFVTRV9XRFMKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+ZGV2ID0gbHAtPndkc19wb3J0W3BvcnQtMV0uZGV2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiNlbmRpZiAgLyogVVNFX1dEUyAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXYgPSBkZXY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1BBQ0tFVF9ETUEoIHNrYi0+ZGV2LCBza2IsIHBrdGxlbiApOwoKICAgICAgICAgICAgICAgICAgICAgICAgLyogR2l2ZSB0aGUgZGVzY3JpcHRvciBiYWNrIHRvIHRoZSBIQ0YgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaGNmX2RtYV9yeF9wdXQoICYoIGxwLT5oY2ZDdHggKSwgZGVzYyApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZfcngoIHNrYiApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+c3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiNpZmRlZiBVU0VfV0RTCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfcGFja2V0cysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAtPndkc19wb3J0W3BvcnQtMV0uc3RhdHMucnhfYnl0ZXMgKz0gcGt0bGVuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiNlbmRpZiAgLyogVVNFX1dEUyAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5sYXN0X3J4ID0gamlmZmllczsKCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IGFsbG9jIHNrYlxuIiApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBvcnQgPT0gMCApCgkgICAgICAgICAgICAgICAgICAgIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIGxwLT5zdGF0cy5yeF9kcm9wcGVkKys7CgkgICAgICAgICAgICAgICAgICAgIH0KI2lmZGVmIFVTRV9XRFMKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC0+d2RzX3BvcnRbcG9ydC0xXS5zdGF0cy5yeF9kcm9wcGVkKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KI2VuZGlmICAvKiBVU0VfV0RTICovCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgLy99CiAgICB9CgogICAgcmV0dXJuIDA7Cn0gLy8gd2xfcnhfZG1hCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiNlbmRpZiAgLy8gRU5BQkxFX0RNQQo=