LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgVGhpcyBmaWxlIGNvbnRhaW5zIHByb2Nlc3NpbmcgYW5kIGluaXRpYWxpemF0aW9uIHNwZWNpZmljIHRvIFBDSS9taW5pUENJCiAqICAgZGV2aWNlcy4KICoKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogU09GVFdBUkUgTElDRU5TRQogKgogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwogKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCiAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KICoKICogQ29weXJpZ2h0IKkgMjAwMyBBZ2VyZSBTeXN0ZW1zIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwogKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwogKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKICogICAgZGlzdHJpYnV0aW9uLgogKgogKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBEaXNjbGFpbWVyCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgk0FTIElTlCBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAogKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQogKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwogKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKICogREFNQUdFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogaW5jbHVkZSBmaWxlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSA8d2lyZWxlc3Mvd2xfdmVyc2lvbi5oPgoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CiNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci8vI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2luLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vaXJxLmg+CiNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgoKI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgojaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KCiNpbmNsdWRlIDxoY2YvZGVidWcuaD4KCiNpbmNsdWRlIDxoY2YuaD4KI2luY2x1ZGUgPGRoZi5oPgojaW5jbHVkZSA8aGNmZGVmLmg+CgojaW5jbHVkZSA8d2lyZWxlc3Mvd2xfaWYuaD4KI2luY2x1ZGUgPHdpcmVsZXNzL3dsX2ludGVybmFsLmg+CiNpbmNsdWRlIDx3aXJlbGVzcy93bF91dGlsLmg+CiNpbmNsdWRlIDx3aXJlbGVzcy93bF9tYWluLmg+CiNpbmNsdWRlIDx3aXJlbGVzcy93bF9uZXRkZXYuaD4KI2luY2x1ZGUgPHdpcmVsZXNzL3dsX3BjaS5oPgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGdsb2JhbCB2YXJpYWJsZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmIERCRwpleHRlcm4gZGJnX2luZm9fdCAqRGJnSW5mbzsKI2VuZGlmICAvLyBEQkcKCi8qIGRlZmluZSB0aGUgUENJIGRldmljZSBUYWJsZSBDYXJkbmFtZSBhbmQgaWQgdGFibGVzICovCmVudW0gaGVybWVzX3BjaV92ZXJzaW9ucyB7CglDSF9BZ2VyZV9TeXN0ZW1zX01pbmlfUENJX1YxID0gMCwKfTsKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3bF9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKCXsgUENJX1ZFTkRPUl9JRF9XTF9MS00sIFBDSV9ERVZJQ0VfSURfV0xfTEtNXzAsCgkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0FnZXJlX1N5c3RlbXNfTWluaV9QQ0lfVjEgfSwKCXsgUENJX1ZFTkRPUl9JRF9XTF9MS00sIFBDSV9ERVZJQ0VfSURfV0xfTEtNXzEsCgkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0FnZXJlX1N5c3RlbXNfTWluaV9QQ0lfVjEgfSwKCXsgUENJX1ZFTkRPUl9JRF9XTF9MS00sIFBDSV9ERVZJQ0VfSURfV0xfTEtNXzIsCgkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENIX0FnZXJlX1N5c3RlbXNfTWluaV9QQ0lfVjEgfSwKCgl7IH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwp9OwoKTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHdsX3BjaV90YmwpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZnVuY3Rpb24gcHJvdG90eXBlcwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgX19kZXZpbml0IHdsX3BjaV9wcm9iZSggc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCApOwp2b2lkIF9fZGV2ZXhpdCB3bF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKaW50IHdsX3BjaV9zZXR1cCggc3RydWN0IHBjaV9kZXYgKnBkZXYgKTsKdm9pZCB3bF9wY2lfZW5hYmxlX2NhcmRidXNfaW50ZXJydXB0cyggc3RydWN0IHBjaV9kZXYgKnBkZXYgKTsKCiNpZmRlZiBFTkFCTEVfRE1BCmludCB3bF9wY2lfZG1hX2FsbG9jKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CmludCB3bF9wY2lfZG1hX2ZyZWUoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKTsKaW50IHdsX3BjaV9kbWFfYWxsb2NfdHhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICk7CmludCB3bF9wY2lfZG1hX2ZyZWVfdHhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICk7CmludCB3bF9wY2lfZG1hX2FsbG9jX3J4X3BhY2tldCggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApOwppbnQgd2xfcGNpX2RtYV9mcmVlX3J4X3BhY2tldCggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApOwppbnQgd2xfcGNpX2RtYV9hbGxvY19kZXNjX2FuZF9idWYoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MsIGludCBzaXplICk7CmludCB3bF9wY2lfZG1hX2ZyZWVfZGVzY19hbmRfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICk7CmludCB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICk7CmludCB3bF9wY2lfZG1hX2ZyZWVfZGVzYyggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKTsKaW50IHdsX3BjaV9kbWFfYWxsb2NfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKmRlc2MsIGludCBzaXplICk7CmludCB3bF9wY2lfZG1hX2ZyZWVfYnVmKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKmRlc2MgKTsKCnZvaWQgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV9yeCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICk7CiNlbmRpZiAgLy8gRU5BQkxFX0RNQQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogUENJIG1vZHVsZSBmdW5jdGlvbiByZWdpc3RyYXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHdsX2RyaXZlciA9CnsKCW5hbWU6CQlNT0RVTEVfTkFNRSwKICAgIGlkX3RhYmxlOgl3bF9wY2lfdGJsLAoJcHJvYmU6CQl3bF9wY2lfcHJvYmUsCglyZW1vdmU6CQlfX2RldmV4aXRfcCh3bF9wY2lfcmVtb3ZlKSwKICAgIHN1c3BlbmQ6ICAgIE5VTEwsCiAgICByZXN1bWU6ICAgICBOVUxMLAp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfYWRhcHRlcl9pbml0X21vZHVsZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDYWxsZWQgYnkgaW5pdF9tb2R1bGUoKSB0byBwZXJmb3JtIFBDSS1zcGVjaWZpYyBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIE4vQQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9hZGFwdGVyX2luaXRfbW9kdWxlKCB2b2lkICkKewogICAgaW50IHJlc3VsdDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfaW5pdF9tb2R1bGUoKSIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwogICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9pbml0X21vZHVsZSgpIC0tIFBDSVxuIiApOwoKICAgIHJlc3VsdCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoICZ3bF9kcml2ZXIgKTsgLy87P3JlcGxhY2Ugd2l0aCBwY2lfbW9kdWxlX2luaXQsIFJ1YmluaSBwZyA0OTAKCS8vOz8gd2h5IG5vdCBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcmVzdWx0CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gMDsKfSAvLyB3bF9hZGFwdGVyX2luaXRfbW9kdWxlCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENhbGxlZCBieSBjbGVhbnVwX21vZHVsZSgpIHRvIHBlcmZvcm0gUENJLXNwZWNpZmljIGRyaXZlciBjbGVhbnVwLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBOL0EKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgTi9BCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSggdm9pZCApCnsKCS8vOz9ob3cgY29tZXMgd2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSBpcyBsb2NhdGVkIGluIGEgc2VlbWluZ2x5IHBjaSBzcGVjaWZpYyBtb2R1bGUKICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9jbGVhbnVwX21vZHVsZSIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKCS8vOz9EQkdfVFJBQ0UgYmVsb3cgZmVlbHMgbGlrZSBuZWFybHkgcmVkdW5kYW50IGluIHRoZSBsaWdodCBvZiBEQkdfRU5URVIgYWJvdmUKICAgIERCR19UUkFDRSggRGJnSW5mbywgIndsX2FkYXB0ZXJfY2xlYW51cF9tb2R1bGUoKSAtLSBQQ0lcbiIgKTsKCiAgICBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoICZ3bF9kcml2ZXIgKTsKCiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybjsKfSAvLyB3bF9hZGFwdGVyX2NsZWFudXBfbW9kdWxlCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9hZGFwdGVyX2luc2VydCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDYWxsZWQgYnkgd2xfcGNpX3Byb2JlKCkgdG8gY29udGludWUgdGhlIHByb2Nlc3Mgb2YgZGV2aWNlIGluc2VydGlvbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBuZXRfZGV2aWNlIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBUUlVFIG9yIEZBTFNFCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9hZGFwdGVyX2luc2VydCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIGludCByZXN1bHQgPSBGQUxTRTsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX2FkYXB0ZXJfaW5zZXJ0IiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9pbnNlcnQoKSAtLSBQQ0lcbiIgKTsKCiAgICBpZiggZGV2ID09IE5VTEwgKSB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAibmV0X2RldmljZSBwb2ludGVyIGlzIE5VTEwhISFcbiIgKTsKICAgIH0gZWxzZSBpZiggZGV2LT5wcml2ID09IE5VTEwgKSB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAid2xfcHJpdmF0ZSBwb2ludGVyIGlzIE5VTEwhISFcbiIgKTsKICAgIH0gZWxzZSBpZiggd2xfaW5zZXJ0KCBkZXYgKSApIHsgLyogUGVyZm9ybSByZW1haW5pbmcgZGV2aWNlIGluaXRpYWxpemF0aW9uICovCgkJcmVzdWx0ID0gVFJVRTsKCX0gZWxzZSB7CiAgICAgICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfaW5zZXJ0KCkgRkFJTEVEXG4iICk7CiAgICB9CiAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgIHJldHVybiByZXN1bHQ7Cn0gLy8gd2xfYWRhcHRlcl9pbnNlcnQKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX2FkYXB0ZXJfb3BlbigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBPcGVuIHRoZSBkZXZpY2UuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgYW4gSENGIHN0YXR1cyBjb2RlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9hZGFwdGVyX29wZW4oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQp7CiAgICBpbnQgICAgICAgICByZXN1bHQgPSAwOwogICAgaW50ICAgICAgICAgaGNmX3N0YXR1cyA9IEhDRl9TVUNDRVNTOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9vcGVuIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9vcGVuKCkgLS0gUENJXG4iICk7CgogICAgaGNmX3N0YXR1cyA9IHdsX29wZW4oIGRldiApOwoKICAgIGlmKCBoY2Zfc3RhdHVzICE9IEhDRl9TVUNDRVNTICkgewogICAgICAgIHJlc3VsdCA9IC1FTk9ERVY7CiAgICB9CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gcmVzdWx0Owp9IC8vIHdsX2FkYXB0ZXJfb3BlbgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfYWRhcHRlcl9jbG9zZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBDbG9zZSB0aGUgZGV2aWNlCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfYWRhcHRlcl9jbG9zZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIERCR19GVU5DKCAid2xfYWRhcHRlcl9jbG9zZSIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIERCR19UUkFDRSggRGJnSW5mbywgIndsX2FkYXB0ZXJfY2xvc2UoKSAtLSBQQ0lcbiIgKTsKICAgIERCR19UUkFDRSggRGJnSW5mbywgIiVzOiBTaHV0dGluZyBkb3duIGFkYXB0ZXIuXG4iLCBkZXYtPm5hbWUgKTsKCiAgICB3bF9jbG9zZSggZGV2ICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gMDsKfSAvLyB3bF9hZGFwdGVyX2Nsb3NlCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9hZGFwdGVyX2lzX29wZW4oKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQ2hlY2sgd2hldGhlciB0aGlzIGRldmljZSBpcyBvcGVuLiBSZXR1cm5zCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgbmV0X2RldmljZSBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgbm9uemVybyBpZiBkZXZpY2UgaXMgb3Blbi4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX2FkYXB0ZXJfaXNfb3Blbiggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCnsKICAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBQQ01DSUEgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgJ29wZW4nIGZpZWxkCiAgICAgICBpbiB0aGUgZGV2X2xpbmtfdCBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGEgbmV0d29yayBkZXZpY2UuIFRoZXJlCiAgICAgICBkb2Vzbid0IHNlZW0gdG8gYmUgYW4gYW5hbG9nIHRvIHRoaXMgZm9yIFBDSSwgYW5kIGNoZWNraW5nIHRoZSBzdGF0dXMKICAgICAgIGNvbnRhaW5lZCBpbiB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUgZG9lc24ndCBoYXZlIHRoZSBzYW1lIGVmZmVjdC4KICAgICAgIEZvciBub3csIHJldHVybiBUUlVFLCBidXQgZmluZCBvdXQgaWYgdGhpcyBpcyBuZWNlc3NhcnkgZm9yIFBDSS4gKi8KCiAgICByZXR1cm4gVFJVRTsKfSAvLyB3bF9hZGFwdGVyX2lzX29wZW4KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9wcm9iZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBSZWdpc3RlcmVkIGluIHRoZSBwY2lfZHJpdmVyIHN0cnVjdHVyZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUKICogIFBDSSBzdWJzeXN0ZW0gZmluZHMgYSBuZXcgUENJIGRldmljZSB3aGljaCBtYXRjaGVzIHRoZSBpbmZvbWF0aW9uIGNvbnRhaW5lZAogKiAgaW4gdGhlIHBjaV9kZXZpY2VfaWQgdGFibGUuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHBkZXYgICAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCiAqICAgICAgZW50ICAgICAtIHRoaXMgZGV2aWNlJ3MgZW50cnkgaW4gdGhlIHBjaV9kZXZpY2VfaWQgdGFibGUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCBfX2RldmluaXQgd2xfcGNpX3Byb2JlKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50ICkKewogICAgaW50IHJlc3VsdDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3BjaV9wcm9iZSIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoJREJHX1BSSU5UKCAiJXNcbiIsIFZFUlNJT05fSU5GTyApOwoKICAgIHJlc3VsdCA9IHdsX3BjaV9zZXR1cCggcGRldiApOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwoKICAgIHJldHVybiByZXN1bHQ7Cn0gLy8gd2xfcGNpX3Byb2JlCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfcmVtb3ZlKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFJlZ2lzdGVyZWQgaW4gdGhlIHBjaV9kcml2ZXIgc3RydWN0dXJlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZQogKiAgUENJIHN1YnN5c3RlbSBkZXRlY3RzIHRoYXQgYSBQQ0kgZGV2aWNlIHdoaWNoIG1hdGNoZXMgdGhlIGluZm9tYXRpb24KICogIGNvbnRhaW5lZCBpbiB0aGUgcGNpX2RldmljZV9pZCB0YWJsZSBoYXMgYmVlbiByZW1vdmVkLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICBOL0EKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBfX2RldmV4aXQgd2xfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKewogICAgc3RydWN0IG5ldF9kZXZpY2UgICAgICAgKmRldiA9IE5VTEw7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF9wY2lfcmVtb3ZlIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgLyogTWFrZSBzdXJlIHRoZSBwY2lfZGV2IHBvaW50ZXIgcGFzc2VkIGluIGlzIHZhbGlkICovCiAgICBpZiggcGRldiA9PSBOVUxMICkgewogICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlBDSSBzdWJzeXMgcGFzc2VkIGluIGFuIGludmFsaWQgcGNpX2RldiBwb2ludGVyXG4iICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGRldiA9IHBjaV9nZXRfZHJ2ZGF0YSggcGRldiApOwogICAgaWYoIGRldiA9PSBOVUxMICkgewogICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCByZXRyaWV2ZSBuZXRfZGV2aWNlIHN0cnVjdHVyZVxuIiApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvKiBQZXJmb3JtIGRldmljZSBjbGVhbnVwICovCiAgICB3bF9yZW1vdmUoIGRldiApOwogICAgZnJlZV9pcnEoIGRldi0+aXJxLCBkZXYgKTsKCiNpZmRlZiBFTkFCTEVfRE1BCiAgICB3bF9wY2lfZG1hX2ZyZWUoIHBkZXYsIGRldi0+cHJpdiApOwojZW5kaWYKCiAgICB3bF9kZXZpY2VfZGVhbGxvYyggZGV2ICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47Cn0gLy8gd2xfcGNpX3JlbW92ZQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGNpX3NldHVwKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENhbGxlZCBieSB3bF9wY2lfcHJvYmUoKSB0byBiZWdpbiBhIGRldmljZSdzIGluaXRpYWxpemF0aW9uIHByb2Nlc3MuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfcGNpX3NldHVwKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiApCnsKICAgIGludCAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKICAgIHN0cnVjdCBuZXRfZGV2aWNlICAgKmRldiA9IE5VTEw7CiAgICBzdHJ1Y3Qgd2xfcHJpdmF0ZSAgICpscCA9IE5VTEw7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF9wY2lfc2V0dXAiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICAvKiBNYWtlIHN1cmUgdGhlIHBjaV9kZXYgcG9pbnRlciBwYXNzZWQgaW4gaXMgdmFsaWQgKi8KICAgIGlmKCBwZGV2ID09IE5VTEwgKSB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiUENJIHN1YnN5cyBwYXNzZWQgaW4gYW4gaW52YWxpZCBwY2lfZGV2IHBvaW50ZXJcbiIgKTsKICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgIH0KCiAgICByZXN1bHQgPSBwY2lfZW5hYmxlX2RldmljZSggcGRldiApOwogICAgaWYoIHJlc3VsdCAhPSAwICkgewogICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgInBjaV9lbmFibGVfZGV2aWNlKCkgZmFpbGVkXG4iICk7CiAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKiBXZSBmb3VuZCBvdXIgZGV2aWNlISBMZXQncyByZWdpc3RlciBpdCB3aXRoIHRoZSBzeXN0ZW0gKi8KICAgIERCR19UUkFDRSggRGJnSW5mbywgIkZvdW5kIG91ciBkZXZpY2UsIG5vdyByZWdpc3RlcmluZ1xuIiApOwogICAgZGV2ID0gd2xfZGV2aWNlX2FsbG9jKCApOwogICAgaWYoIGRldiA9PSBOVUxMICkgewogICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIkNvdWxkIG5vdCByZWdpc3RlciBkZXZpY2UhISFcbiIgKTsKICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgIH0KCiAgICAvKiBNYWtlIHN1cmUgdGhhdCBzcGFjZSB3YXMgYWxsb2NhdGVkIGZvciBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCAqLwogICAgaWYoIGRldi0+cHJpdiA9PSBOVUxMICkgewogICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgIlByaXZhdGUgYWRhcHRlciBzdHJ1Y3Qgd2FzIG5vdCBhbGxvY2F0ZWQhISFcbiIgKTsKICAgICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgIH0KCiNpZmRlZiBFTkFCTEVfRE1BCiAgICAvKiBBbGxvY2F0ZSBETUEgRGVzY3JpcHRvcnMgKi8KICAgIGlmKCB3bF9wY2lfZG1hX2FsbG9jKCBwZGV2LCBkZXYtPnByaXYgKSA8IDAgKSB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAiQ291bGQgbm90IGFsbG9jYXRlIERNQSBkZXNjcmlwdG9yIG1lbW9yeSEhIVxuIiApOwogICAgICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgfQojZW5kaWYKCiAgICAvKiBSZWdpc3RlciBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZSB3aXRoIFBDSSAqLwogICAgcGNpX3NldF9kcnZkYXRhKCBwZGV2LCBkZXYgKTsKCiAgICAvKiBGaWxsIG91dCBidXMgc3BlY2lmaWMgaW5mb3JtYXRpb24gaW4gdGhlIG5ldF9kZXZpY2Ugc3RydWN0ICovCiAgICBkZXYtPmlycSA9IHBkZXYtPmlycTsKICAgIFNFVF9NT0RVTEVfT1dORVIoIGRldiApOwoKICAgIERCR19UUkFDRSggRGJnSW5mbywgIkRldmljZSBCYXNlIEFkZHJlc3M6ICUjMDNseFxuIiwgcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQgKTsKCWRldi0+YmFzZV9hZGRyID0gcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQ7CgogICAgLyogSW5pdGlhbGl6ZSBvdXIgZGV2aWNlIGhlcmUgKi8KICAgIGlmKCAhd2xfYWRhcHRlcl9pbnNlcnQoIGRldiApKSB7CiAgICAgICAgREJHX0VSUk9SKCBEYmdJbmZvLCAid2xfYWRhcHRlcl9pbnNlcnQoKSBGQUlMRUQhISFcbiIgKTsKICAgICAgICB3bF9kZXZpY2VfZGVhbGxvYyggZGV2ICk7CiAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICB9CgogICAgLyogUmVnaXN0ZXIgb3VyIElTUiAqLwogICAgREJHX1RSQUNFKCBEYmdJbmZvLCAiUmVnaXN0ZXJpbmcgSVNSLi4uXG4iICk7CgogICAgcmVzdWx0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHdsX2lzciwgU0FfU0hJUlEsIGRldi0+bmFtZSwgZGV2KTsKICAgIGlmKCByZXN1bHQgKSB7CiAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJDb3VsZCBub3QgcmVnaXN0ZXIgSVNSISEhXG4iICk7CiAgICAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKCX0KCiAgICAvKiBNYWtlIHN1cmUgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCBwcm9wZXJseSBmb3IgQ2FyZEJ1cyAqLwogICAgbHAgPSBkZXYtPnByaXY7CgogICAgaWYoIGxwLT5oY2ZDdHguSUZCX0J1c1R5cGUgPT0gQ0ZHX05JQ19CVVNfVFlQRV9DQVJEQlVTIHx8CgkgICAgbHAtPmhjZkN0eC5JRkJfQnVzVHlwZSA9PSBDRkdfTklDX0JVU19UWVBFX1BDSSAJCSkgewogICAgICAgIERCR19UUkFDRSggRGJnSW5mbywgIlRoaXMgaXMgYSBQQ0kvQ2FyZEJ1cyBjYXJkLCBlbmFibGUgaW50ZXJydXB0c1xuIiApOwogICAgICAgIHdsX3BjaV9lbmFibGVfY2FyZGJ1c19pbnRlcnJ1cHRzKCBwZGV2ICk7CiAgICB9CgogICAgLyogRW5hYmxlIGJ1cyBtYXN0ZXJpbmcgKi8KICAgIHBjaV9zZXRfbWFzdGVyKCBwZGV2ICk7CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gMDsKfSAvLyB3bF9wY2lfc2V0dXAKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9lbmFibGVfY2FyZGJ1c19pbnRlcnJ1cHRzKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIENhbGxlZCBieSB3bF9wY2lfc2V0dXAoKSB0byBlbmFibGUgaW50ZXJydXB0cyBvbiBhIENhcmRCdXMgZGV2aWNlLiBUaGlzCiAqICBpcyBkb25lIGJ5IHdyaXRpbmcgYml0IDE1IHRvIHRoZSBmdW5jdGlvbiBldmVudCBtYXNrIHJlZ2lzdGVyLiBUaGlzCiAqICBDYXJkQnVzLXNwZWNpZmljIHJlZ2lzdGVyIGlzIGxvY2F0ZWQgaW4gQkFSMiAoY291bnRpbmcgZnJvbSBCQVIwKSwgaW4gbWVtb3J5CiAqICBzcGFjZSBhdCBieXRlIG9mZnNldCAxZjQgKDdmNCBmb3IgV0FSUCkuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3BjaV9lbmFibGVfY2FyZGJ1c19pbnRlcnJ1cHRzKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiApCnsKICAgIHUzMiAgICAgICAgICAgICAgICAgYmFyMl9yZWc7CiAgICB1MzIgICAgICAgICAgICAgICAgIG1lbV9hZGRyX2J1czsKICAgIHUzMiAgICAgICAgICAgICAgICAgZnVuY19ldnRfbWFza19yZWc7CiAgICB2b2lkICAgICAgICAgICAgICAgICptZW1fYWRkcl9rZXJuID0gTlVMTDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3BjaV9lbmFibGVfY2FyZGJ1c19pbnRlcnJ1cHRzIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgLyogSW5pdGlhbGl6ZSB0byBrbm93biBiYWQgdmFsdWVzICovCiAgICBiYXIyX3JlZyA9IDB4ZGVhZGJlZWY7CiAgICBtZW1fYWRkcl9idXMgPSAweGRlYWRiZWVmOwoKICAgIC8qIFJlYWQgdGhlIEJBUjIgcmVnaXN0ZXI7IHRoaXMgcmVnaXN0ZXIgY29udGFpbnMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUKICAgICAgIG1lbW9yeSByZWdpb24gd2hlcmUgdGhlIGZ1bmN0aW9uIGV2ZW50IG1hc2sgcmVnaXN0ZXIgbGl2ZXMgKi8KICAgIHBjaV9yZWFkX2NvbmZpZ19kd29yZCggcGRldiwgUENJX0JBU0VfQUREUkVTU18yLCAmYmFyMl9yZWcgKTsKICAgIG1lbV9hZGRyX2J1cyA9IGJhcjJfcmVnICYgUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKCiAgICAvKiBPbmNlIHRoZSBiYXNlIGFkZHJlc3MgaXMgb2J0YWluZWQsIHJlbWFwIHRoZSBtZW1vcnkgcmVnaW9uIHRvIGtlcm5lbAogICAgICAgc3BhY2Ugc28gd2UgY2FuIHJldHJpZXZlIHRoZSByZWdpc3RlciAqLwogICAgbWVtX2FkZHJfa2VybiA9IGlvcmVtYXAoIG1lbV9hZGRyX2J1cywgMHgyMDAgKTsKCiNpZmRlZiBIRVJNRVMyNQojZGVmaW5lIFJFR19PRkZTRVQgIDB4MDdGNAojZWxzZQojZGVmaW5lIFJFR19PRkZTRVQgIDB4MDFGNAojZW5kaWYgLy8gSEVSTUVTMjUKCiNkZWZpbmUgQklUMTUgICAgICAgMHg4MDAwCgogICAgLyogUmV0cmlldmUgdGhlIGZ1bmN0aW9uYWwgZXZlbnQgbWFzayByZWdpc3RlciwgZW5hYmxlIGludGVycnVwdHMgYnkKICAgICAgIHNldHRpbmcgQml0IDE1LCBhbmQgd3JpdGUgYmFjayB0aGUgdmFsdWUgKi8KICAgIGZ1bmNfZXZ0X21hc2tfcmVnID0gKih1MzIgKikoIG1lbV9hZGRyX2tlcm4gKyBSRUdfT0ZGU0VUICk7CiAgICBmdW5jX2V2dF9tYXNrX3JlZyB8PSBCSVQxNTsKICAgICoodTMyICopKCBtZW1fYWRkcl9rZXJuICsgUkVHX09GRlNFVCApID0gZnVuY19ldnRfbWFza19yZWc7CgogICAgLyogT25jZSBjb21wbGV0ZSwgdW5tYXAgdGhlIHJlZ2lvbiBhbmQgZXhpdCAqLwogICAgaW91bm1hcCggbWVtX2FkZHJfa2VybiApOwoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuOwp9IC8vIHdsX3BjaV9lbmFibGVfY2FyZGJ1c19pbnRlcnJ1cHRzCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojaWZkZWYgRU5BQkxFX0RNQQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2FsbG9jKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEFsbG9jYXRlcyBhbGwgcmVzb3VyY2VzIG5lZWRlZCBmb3IgUENJL0NhcmRCdXMgRE1BIG9wZXJhdGlvbgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQogKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfcGNpX2RtYV9hbGxvYyggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKICAgIGludCBpOwogICAgaW50IHN0YXR1cyA9IDA7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2FsbG9jIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgovLyAgICAgbHAtPmRtYS50eF9yc2NfaW5kID0gbHAtPmRtYS5yeF9yc2NfaW5kID0gMDsKLy8KLy8gICAgIC8qIEFsbG9jIGZvciB0aGUgVHggY2hhaW4gYW5kIGl0cyByZWNsYWltIGRlc2NyaXB0b3IgKi8KLy8gICAgIGZvciggaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrICkgewovLyAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfdHhfcGFja2V0KCBwZGV2LCBscCwgJmxwLT5kbWEudHhfcGFja2V0W2ldICk7Ci8vICAgICAgICAgaWYoIHN0YXR1cyA9PSAwICkgewovLyAgICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnR4X3BhY2tldFslZF0gOiAgICAgICAgICAgICAgICAgMHglcFxuIiwgaSwgbHAtPmRtYS50eF9wYWNrZXRbaV0gKTsKLy8gICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS50eF9wYWNrZXRbJWRdLT5uZXh0X2Rlc2NfYWRkciA6IDB4JXBcbiIsIGksIGxwLT5kbWEudHhfcGFja2V0W2ldLT5uZXh0X2Rlc2NfYWRkciApOwovLyAgICAgICAgICAgICBscC0+ZG1hLnR4X3JzY19pbmQrKzsKLy8gICAgICAgICB9IGVsc2UgewovLyAgICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgYWxsb2MgRE1BIFR4IFBhY2tldFxuIiApOwovLyAgICAgICAgICAgICBicmVhazsKLy8gICAgICAgICB9Ci8vICAgICB9Ci8vICAgICBpZiggc3RhdHVzID09IDAgKSB7Ci8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19kZXNjKCBwZGV2LCBscCwgJmxwLT5kbWEudHhfcmVjbGFpbV9kZXNjICk7Ci8vICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS50eF9yZWNsYWltX2Rlc2M6IDB4JXBcbiIsIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjICk7Ci8vICAgICB9Ci8vICAgICAvKiBBbGxvYyBmb3IgdGhlIFJ4IGNoYWluIGFuZCBpdHMgcmVjbGFpbSBkZXNjcmlwdG9yICovCi8vICAgICBpZiggc3RhdHVzID09IDAgKSB7Ci8vICAgICAgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7Ci8vICAgICAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfcnhfcGFja2V0KCBwZGV2LCBscCwgJmxwLT5kbWEucnhfcGFja2V0W2ldICk7Ci8vICAgICAgICAgICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKLy8gICAgICAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEucnhfcGFja2V0WyVkXSAgICAgICAgICAgICAgICAgOiAweCVwXG4iLCBpLCBscC0+ZG1hLnJ4X3BhY2tldFtpXSApOwovLyAgICAgICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS5yeF9wYWNrZXRbJWRdLT5uZXh0X2Rlc2NfYWRkciA6IDB4JXBcbiIsIGksIGxwLT5kbWEucnhfcGFja2V0W2ldLT5uZXh0X2Rlc2NfYWRkciApOwovLyAgICAgICAgICAgICAgICAgbHAtPmRtYS5yeF9yc2NfaW5kKys7Ci8vICAgICAgICAgICAgIH0gZWxzZSB7Ci8vICAgICAgICAgICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJDb3VsZCBub3QgYWxsb2MgRE1BIFJ4IFBhY2tldFxuIiApOwovLyAgICAgICAgICAgICAgICAgYnJlYWs7Ci8vICAgICAgICAgICAgIH0KLy8gICAgICAgICB9Ci8vICAgICB9Ci8vICAgICBpZiggc3RhdHVzID09IDAgKSB7Ci8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19kZXNjKCBwZGV2LCBscCwgJmxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICk7Ci8vICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS5yeF9yZWNsYWltX2Rlc2M6IDB4JXBcbiIsIGxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICk7Ci8vICAgICB9Ci8vICAgICAvKiBTdG9yZSBzdGF0dXMsIGFzIGhvc3Qgc2hvdWxkIG5vdCBjYWxsIEhDRiBmdW5jdGlvbnMgaWYgdGhpcyBmYWlscyAqLwovLyAgICAgbHAtPmRtYS5zdGF0dXMgPSBzdGF0dXM7ICAvLzs/YWxsIHVzZWFnZXMgb2YgZG1hLnN0YXR1cyBoYXZlIGJlZW4gY29tbWVudGVkIG91dAovLyAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gc3RhdHVzOwp9IC8vIHdsX3BjaV9kbWFfYWxsb2MKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9kbWFfZnJlZSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBEZWFsbG9jYXRlZCBhbGwgcmVzb3VyY2VzIG5lZWRlZCBmb3IgUENJL0NhcmRCdXMgRE1BIG9wZXJhdGlvbgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQogKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfcGNpX2RtYV9mcmVlKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaW50IGk7CiAgICBpbnQgc3RhdHVzID0gMDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfZnJlZSIgKTsKICAgIERCR19FTlRFUiggRGJnSW5mbyApOwoKICAgIC8qIFJlY2xhaW0gYWxsIFJ4IHBhY2tldHMgdGhhdCB3ZXJlIGhhbmRlZCBvdmVyIHRvIHRoZSBIQ0YgKi8KICAgIC8qIERvIEkgbmVlZCB0byBkbyB0aGlzPyBCZWZvcmUgdGhpcyBmcmVlIGlzIGNhbGxlZCwgSSd2ZSBhbHJlYWR5IGRpc2FibGVkCiAgICAgICB0aGUgcG9ydCB3aGljaCB3aWxsIGNhbGwgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbSAqLwogICAgLy9pZiggbHAtPmRtYS5zdGF0dXMgPT0gMCApCiAgICAvL3sKICAgIC8vICAgIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW0oIGxwICk7CiAgICAvL30KCiAgICAvKiBGcmVlIGV2ZXJ5dGhpbmcgbmVlZGVkIGZvciBETUEgUnggKi8KICAgIGZvciggaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrICkgewogICAgICAgIGlmKCBscC0+ZG1hLnJ4X3BhY2tldFtpXSApIHsKICAgICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX3J4X3BhY2tldCggcGRldiwgbHAsICZscC0+ZG1hLnJ4X3BhY2tldFtpXSApOwogICAgICAgICAgICBpZiggc3RhdHVzICE9IDAgKSB7CiAgICAgICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIlByb2JsZW0gZnJlZWluZyBSeCBwYWNrZXRcbiIgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGxwLT5kbWEucnhfcnNjX2luZCA9IDA7CgogICAgaWYoIGxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICkgewogICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9kZXNjKCBwZGV2LCBscCwgJmxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICk7CiAgICAgICAgaWYoIHN0YXR1cyAhPSAwICkgewogICAgICAgICAgICBEQkdfV0FSTklORyggRGJnSW5mbywgIlByb2JsZW0gZnJlZWluZyBSeCByZWNsYWltIGRlc2NyaXB0b3JcbiIgKTsKICAgICAgICB9CiAgICB9CgogICAgLyogRnJlZSBldmVyeXRoaW5nIG5lZWRlZCBmb3IgRE1BIFR4ICovCiAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKyApIHsKICAgICAgICBpZiggbHAtPmRtYS50eF9wYWNrZXRbaV0gKSB7CiAgICAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV90eF9wYWNrZXQoIHBkZXYsIGxwLCAmbHAtPmRtYS50eF9wYWNrZXRbaV0gKTsKICAgICAgICAgICAgaWYoIHN0YXR1cyAhPSAwICkgewogICAgICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJQcm9ibGVtIGZyZWVpbmcgVHggcGFja2V0XG4iICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBscC0+ZG1hLnR4X3JzY19pbmQgPSAwOwoKICAgIGlmKCBscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyApIHsKICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfZGVzYyggcGRldiwgbHAsICZscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyApOwogICAgICAgIGlmKCBzdGF0dXMgIT0gMCApIHsKICAgICAgICAgICAgREJHX1dBUk5JTkcoIERiZ0luZm8sICJQcm9ibGVtIGZyZWVpbmcgVHggcmVjbGFpbSBkZXNjcmlwdG9yXG4iICk7CiAgICAgICAgfQogICAgfQoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuIHN0YXR1czsKfSAvLyB3bF9wY2lfZG1hX2ZyZWUKCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2FsbG9jX3R4X3BhY2tldCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBBbGxvY2F0ZXMgYSBzaW5nbGUgVHggcGFja2V0LCBjb25zaXN0aW5nIG9mIHNldmVyYWwgZGVzY3JpcHRvcnMgYW5kCiAqICAgICAgYnVmZmVycy4gRGF0YSB0byB0cmFuc21pdCBpcyBmaXJzdCBjb3BpZWQgaW50byB0aGUgJ3BheWxvYWQnIGJ1ZmZlcgogKiAgICAgIGJlZm9yZSBiZWluZyB0cmFuc21pdHRlZC4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcGRldiAgICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKICogICAgICBscCAgICAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICogICAgICBkZXNjICAgIC0gYSBwb2ludGVyIHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFsbG9jJ2QuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfcGNpX2RtYV9hbGxvY190eF9wYWNrZXQoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKQp7Ci8vICAgICBpbnQgc3RhdHVzID0gMDsKLy8gICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLy8KLy8gICAgIGlmKCBkZXNjID09IE5VTEwgKSB7Ci8vICAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKLy8gICAgIH0KLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2Rlc2NfYW5kX2J1ZiggcGRldiwgbHAsIGRlc2MsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhDRl9ETUFfVFhfQlVGMV9TSVpFICk7Ci8vCi8vICAgICAgICAgaWYoIHN0YXR1cyA9PSAwICkgewovLyAgICAgICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2Rlc2NfYW5kX2J1ZiggcGRldiwgbHAsCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKCAoKmRlc2MpLT5uZXh0X2Rlc2NfYWRkciApLAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSENGX01BWF9QQUNLRVRfU0laRSApOwovLyAgICAgICAgIH0KLy8gICAgIH0KLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKLy8gICAgICAgICAoKmRlc2MpLT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gKCpkZXNjKS0+bmV4dF9kZXNjX2FkZHItPmRlc2NfcGh5c19hZGRyOwovLyAgICAgfQovLyAgICAgcmV0dXJuIHN0YXR1czsKfSAvLyB3bF9wY2lfZG1hX2FsbG9jX3R4X3BhY2tldAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGNpX2RtYV9mcmVlX3R4X3BhY2tldCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBGcmVlcyBhIHNpbmdsZSBUeCBwYWNrZXQsIGRlc2NyaWJlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBhbGxvYyBmdW5jdGlvbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcGRldiAgICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKICogICAgICBscCAgICAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICogICAgICBkZXNjICAgIC0gYSBwb2ludGVyIHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFsbG9jJ2QuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfcGNpX2RtYV9mcmVlX3R4X3BhY2tldCggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApCnsKICAgIGludCBzdGF0dXMgPSAwOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmKCAqZGVzYyA9PSBOVUxMICkgewogICAgICAgIERCR19QUklOVCggIk51bGwgZGVzY3JpcHRvclxuIiApOwogICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CiAgICB9CgkvLzs/dGhlICJsaW1pdGVkIiBORElTIHN0cmF0ZWd5LCBhc3N1bWluZyBhIGZyYW1lIGNvbnNpc3RzIEFMV0FZUyBvdXQgb2YgMgoJLy9kZXNjcmlwdG9ycywgbWFrZSB0aGlzIHJvYnVzdAogICAgaWYoIHN0YXR1cyA9PSAwICYmICgqZGVzYyktPm5leHRfZGVzY19hZGRyICkgewogICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9kZXNjX2FuZF9idWYoIHBkZXYsIGxwLCAmKCpkZXNjKS0+bmV4dF9kZXNjX2FkZHIgKTsKICAgIH0KICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfZGVzY19hbmRfYnVmKCBwZGV2LCBscCwgZGVzYyApOwogICAgfQogICAgcmV0dXJuIHN0YXR1czsKfSAvLyB3bF9wY2lfZG1hX2ZyZWVfdHhfcGFja2V0Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2FsbG9jX3J4X3BhY2tldCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBBbGxvY2F0ZXMgYSBzaW5nbGUgUnggcGFja2V0LCBjb25zaXN0aW5nIG9mIHR3byBkZXNjcmlwdG9ycyBhbmQgb25lCiAqICAgICAgY29udGlndW91cyBidWZmZXIuIFRIZSBidWZmZXIgc3RhcnRzIHdpdGggdGhlIGhlcm1lcy1zcGVjaWZpYyBoZWFkZXIuCiAqICAgICAgT25lIGRlc2NyaXB0b3IgcG9pbnRzIGF0IHRoZSBzdGFydCwgdGhlIG90aGVyIGF0IG9mZnNldCAweDNhIG9mIHRoZQogKiAgICAgIGJ1ZmZlci4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcGRldiAgICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKICogICAgICBscCAgICAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICogICAgICBkZXNjICAgIC0gYSBwb2ludGVyIHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFsbG9jJ2QuCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfcGNpX2RtYV9hbGxvY19yeF9wYWNrZXQoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqKmRlc2MgKQp7CiAgICBpbnQgICAgICAgICBzdGF0dXMgPSAwOwogICAgREVTQ19TVFJDVCAgKnA7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovLyAgICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKLy8gICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOwovLyAgICAgfQovLyAJLy87P3RoZSAibGltaXRlZCIgTkRJUyBzdHJhdGVneSwgYXNzdW1pbmcgYSBmcmFtZSBjb25zaXN0cyBBTFdBWVMgb3V0IG9mIDIKLy8gCS8vZGVzY3JpcHRvcnMsIG1ha2UgdGhpcyByb2J1c3QKLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKLy8gICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoIHBkZXYsIGxwLCBkZXNjICk7Ci8vIAl9Ci8vICAgICBpZiggc3RhdHVzID09IDAgKSB7Ci8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19idWYoIHBkZXYsIGxwLCAqZGVzYywgSENGX01BWF9QQUNLRVRfU0laRSApOwovLyAgICAgfQovLyAgICAgaWYoIHN0YXR1cyA9PSAwICkgewovLyAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfYWxsb2NfZGVzYyggcGRldiwgbHAsICZwICk7Ci8vICAgICB9Ci8vICAgICBpZiggc3RhdHVzID09IDAgKSB7Ci8vICAgICAgICAgLyogU2l6ZSBvZiAxc3QgZGVzY3JpcHRvciBiZWNvbWVzIDB4M2EgYnl0ZXMgKi8KLy8gICAgICAgICBTRVRfQlVGX1NJWkUoICpkZXNjLCBIQ0ZfRE1BX1JYX0JVRjFfU0laRSApOwovLwovLyAgICAgICAgIC8qIE1ha2UgMm5kIGRlc2NyaXB0b3IgcG9pbnQgYXQgb2Zmc2V0IDB4M2Egb2YgdGhlIGJ1ZmZlciAqLwovLyAgICAgICAgIFNFVF9CVUZfU0laRSggcCwgKCBIQ0ZfTUFYX1BBQ0tFVF9TSVpFIC0gSENGX0RNQV9SWF9CVUYxX1NJWkUgKSk7Ci8vICAgICAgICAgcC0+YnVmX2FkZHIgICAgICAgPSAoKmRlc2MpLT5idWZfYWRkciArIEhDRl9ETUFfUlhfQlVGMV9TSVpFOwovLyAgICAgICAgIHAtPmJ1Zl9waHlzX2FkZHIgID0gKCpkZXNjKS0+YnVmX3BoeXNfYWRkciArIEhDRl9ETUFfUlhfQlVGMV9TSVpFOwovLyAgICAgICAgIHAtPm5leHRfZGVzY19hZGRyID0gTlVMTDsKLy8KLy8gICAgICAgICAvKiBDaGFpbiAybmQgZGVzY3JpcHRvciB0byAxc3QgZGVzY3JpcHRvciAqLwovLyAgICAgICAgICgqZGVzYyktPm5leHRfZGVzY19hZGRyICAgICAgPSBwOwovLyAgICAgICAgICgqZGVzYyktPm5leHRfZGVzY19waHlzX2FkZHIgPSBwLT5kZXNjX3BoeXNfYWRkcjsKLy8gICAgIH0KCiAgICByZXR1cm4gc3RhdHVzOwp9IC8vIHdsX3BjaV9kbWFfYWxsb2NfcnhfcGFja2V0Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2ZyZWVfcnhfcGFja2V0KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEZyZWVzIGEgc2luZ2xlIFJ4IHBhY2tldCwgZGVzY3JpYmVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGFsbG9jIGZ1bmN0aW9uLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwZGV2ICAgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQogKiAgICAgIGxwICAgICAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKiAgICAgIGRlc2MgICAgLSBhIHBvaW50ZXIgd2hpY2ggd2lsbCByZWZlcmVuY2UgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYWxsb2MnZC4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9wY2lfZG1hX2ZyZWVfcnhfcGFja2V0KCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICkKewogICAgaW50IHN0YXR1cyA9IDA7CiAgICBERVNDX1NUUkNUICpwOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmKCAqZGVzYyA9PSBOVUxMICkgewogICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CiAgICB9CiAgICBpZiggc3RhdHVzID09IDAgKSB7CiAgICAgICAgcCA9ICgqZGVzYyktPm5leHRfZGVzY19hZGRyOwoKICAgICAgICAvKiBGcmVlIHRoZSAybmQgZGVzY3JpcHRvciAqLwogICAgICAgIGlmKCBwICE9IE5VTEwgKSB7CiAgICAgICAgICAgIHAtPmJ1Zl9hZGRyICAgICAgPSBOVUxMOwogICAgICAgICAgICBwLT5idWZfcGh5c19hZGRyID0gMDsKCiAgICAgICAgICAgIHN0YXR1cyA9IHdsX3BjaV9kbWFfZnJlZV9kZXNjKCBwZGV2LCBscCwgJnAgKTsKICAgICAgICB9CiAgICB9CgogICAgLyogRnJlZSB0aGUgYnVmZmVyIGFuZCAxc3QgZGVzY3JpcHRvciAqLwogICAgaWYoIHN0YXR1cyA9PSAwICkgewogICAgICAgIFNFVF9CVUZfU0laRSggKmRlc2MsIEhDRl9NQVhfUEFDS0VUX1NJWkUgKTsKICAgICAgICBzdGF0dXMgPSB3bF9wY2lfZG1hX2ZyZWVfZGVzY19hbmRfYnVmKCBwZGV2LCBscCwgZGVzYyApOwogICAgfQogICAgcmV0dXJuIHN0YXR1czsKfSAvLyB3bF9wY2lfZG1hX2ZyZWVfcnhfcGFja2V0Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2FsbG9jX2Rlc2NfYW5kX2J1ZigpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBBbGxvY2F0ZXMgYSBETUEgZGVzY3JpcHRvciBhbmQgYnVmZmVyLCBhbmQgYXNzb2NpYXRlcyB0aGVtIHdpdGggb25lCiAqICAgICAgYW5vdGhlci4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcGRldiAgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCiAqICAgICAgbHAgICAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKiAgICAgIGRlc2MgIC0gYSBwb2ludGVyIHdoaWNoIHdpbGwgcmVmZXJlbmNlIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFsbG9jJ2QKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9wY2lfZG1hX2FsbG9jX2Rlc2NfYW5kX2J1Ziggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYywgaW50IHNpemUgKQp7CiAgICBpbnQgc3RhdHVzID0gMDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8vICAgICBpZiggZGVzYyA9PSBOVUxMICkgewovLyAgICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7Ci8vICAgICB9Ci8vICAgICBpZiggc3RhdHVzID09IDAgKSB7Ci8vICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19kZXNjKCBwZGV2LCBscCwgZGVzYyApOwovLwovLyAgICAgICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKLy8gICAgICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9hbGxvY19idWYoIHBkZXYsIGxwLCAqZGVzYywgc2l6ZSApOwovLyAgICAgICAgIH0KLy8gICAgIH0KICAgIHJldHVybiBzdGF0dXM7Cn0gLy8gd2xfcGNpX2RtYV9hbGxvY19kZXNjX2FuZF9idWYKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9kbWFfZnJlZV9kZXNjX2FuZF9idWYoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgRnJlZXMgYSBETUEgZGVzY3JpcHRvciBhbmQgYXNzb2NpYXRlZCBidWZmZXIuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHBkZXYgIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQogKiAgICAgIGxwICAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICogICAgICBkZXNjICAtIGEgcG9pbnRlciB3aGljaCB3aWxsIHJlZmVyZW5jZSB0aGUgZGVzY3JpcHRvciB0byBiZSBhbGxvYydkCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfcGNpX2RtYV9mcmVlX2Rlc2NfYW5kX2J1Ziggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApCnsKICAgIGludCBzdGF0dXMgPSAwOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmKCBkZXNjID09IE5VTEwgKSB7CiAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKICAgIH0KICAgIGlmKCBzdGF0dXMgPT0gMCAmJiAqZGVzYyA9PSBOVUxMICkgewogICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CiAgICB9CiAgICBpZiggc3RhdHVzID09IDAgKSB7CiAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX2J1ZiggcGRldiwgbHAsICpkZXNjICk7CgogICAgICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKICAgICAgICAgICAgc3RhdHVzID0gd2xfcGNpX2RtYV9mcmVlX2Rlc2MoIHBkZXYsIGxwLCBkZXNjICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0YXR1czsKfSAvLyB3bF9wY2lfZG1hX2ZyZWVfZGVzY19hbmRfYnVmCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgQWxsb2NhdGVzIG9uZSBETUEgZGVzY3JpcHRvciBpbiBjYWNoZSBjb2hlcmVudCBtZW1vcnkuCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIHBkZXYgLSBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCiAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludCB3bF9wY2lfZG1hX2FsbG9jX2Rlc2MoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKipkZXNjICkKewovLyAgICAgaW50ICAgICAgICAgc3RhdHVzID0gMDsKLy8gICAgIGRtYV9hZGRyX3QgIHBhOwovLyAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovLwovLyAgICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2FsbG9jX2Rlc2MiICk7Ci8vICAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKLy8KLy8gICAgIGlmKCBkZXNjID09IE5VTEwgKSB7Ci8vICAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKLy8gICAgIH0KLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKLy8gICAgICAgICAqZGVzYyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KCBwZGV2LCBzaXplb2YoIERFU0NfU1RSQ1QgKSwgJnBhICk7Ci8vICAgICB9Ci8vICAgICBpZiggKmRlc2MgPT0gTlVMTCApIHsKLy8gICAgICAgICBEQkdfRVJST1IoIERiZ0luZm8sICJwY2lfYWxsb2NfY29uc2lzdGVudCgpIGZhaWxlZFxuIiApOwovLyAgICAgICAgIHN0YXR1cyA9IC1FTk9NRU07Ci8vICAgICB9IGVsc2UgewovLyAgICAgICAgIG1lbXNldCggKmRlc2MsIDAsIHNpemVvZiggREVTQ19TVFJDVCApKTsKLy8gICAgICAgICAoKmRlc2MpLT5kZXNjX3BoeXNfYWRkciA9IGNwdV90b19sZTMyKCBwYSApOwovLyAgICAgfQovLyAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7Ci8vICAgICByZXR1cm4gc3RhdHVzOwp9IC8vIHdsX3BjaV9kbWFfYWxsb2NfZGVzYwovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGNpX2RtYV9mcmVlX2Rlc2MoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgRnJlZXMgb25lIERNQSBkZXNjcmlwdG9yIGluIGNhY2hlIGNvaGVyZW50IG1lbW9yeS4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgcGRldiAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50IHdsX3BjaV9kbWFfZnJlZV9kZXNjKCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IHdsX3ByaXZhdGUgKmxwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBERVNDX1NUUkNUICoqZGVzYyApCnsKICAgIGludCAgICAgICAgIHN0YXR1cyA9IDA7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgaWYoICpkZXNjID09IE5VTEwgKSB7CiAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKICAgIH0KICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKICAgICAgICBwY2lfZnJlZV9jb25zaXN0ZW50KCBwZGV2LCBzaXplb2YoIERFU0NfU1RSQ1QgKSwgKmRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXNjKS0+ZGVzY19waHlzX2FkZHIgKTsKICAgIH0KICAgICpkZXNjID0gTlVMTDsKICAgIHJldHVybiBzdGF0dXM7Cn0gLy8gd2xfcGNpX2RtYV9mcmVlX2Rlc2MKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCXdsX3BjaV9kbWFfYWxsb2NfYnVmKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEFsbG9jYXRlcyBvbmUgRE1BIGJ1ZmZlciBpbiBjYWNoZSBjb2hlcmVudCBtZW1vcnksIGFuZCBhc3NvY2lhdGVzIGEgRE1BCiAqICAgICAgZGVzY3JpcHRvciB3aXRoIHRoaXMgYnVmZmVyLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQogKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfcGNpX2RtYV9hbGxvY19idWYoIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgREVTQ19TVFJDVCAqZGVzYywgaW50IHNpemUgKQp7CiAgICBpbnQgICAgICAgICBzdGF0dXMgPSAwOwogICAgZG1hX2FkZHJfdCAgcGE7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovLyAgICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2FsbG9jX2J1ZiIgKTsKLy8gICAgIERCR19FTlRFUiggRGJnSW5mbyApOwovLwovLyAgICAgaWYoIGRlc2MgPT0gTlVMTCApIHsKLy8gICAgICAgICBzdGF0dXMgPSAtRUZBVUxUOwovLyAgICAgfQovLyAgICAgaWYoIHN0YXR1cyA9PSAwICYmIGRlc2MtPmJ1Zl9hZGRyICE9IE5VTEwgKSB7Ci8vICAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKLy8gICAgIH0KLy8gICAgIGlmKCBzdGF0dXMgPT0gMCApIHsKLy8gICAgICAgICBkZXNjLT5idWZfYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KCBwZGV2LCBzaXplLCAmcGEgKTsKLy8gICAgIH0KLy8gICAgIGlmKCBkZXNjLT5idWZfYWRkciA9PSBOVUxMICkgewovLyAgICAgICAgIERCR19FUlJPUiggRGJnSW5mbywgInBjaV9hbGxvY19jb25zaXN0ZW50KCkgZmFpbGVkXG4iICk7Ci8vICAgICAgICAgc3RhdHVzID0gLUVOT01FTTsKLy8gICAgIH0gZWxzZSB7Ci8vICAgICAgICAgZGVzYy0+YnVmX3BoeXNfYWRkciA9IGNwdV90b19sZTMyKCBwYSApOwovLyAgICAgICAgIFNFVF9CVUZfU0laRSggZGVzYywgc2l6ZSApOwovLyAgICAgfQovLyAgICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm4gc3RhdHVzOwp9IC8vIHdsX3BjaV9kbWFfYWxsb2NfYnVmCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2ZyZWVfYnVmKCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIEFsbG9jYXRlcyBvbmUgRE1BIGJ1ZmZlciBpbiBjYWNoZSBjb2hlcmVudCBtZW1vcnksIGFuZCBhc3NvY2lhdGVzIGEgRE1BCiAqICAgICAgZGVzY3JpcHRvciB3aXRoIHRoaXMgYnVmZmVyLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBwZGV2IC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwY2lfZGV2IHN0cnVjdHVyZQogKiAgICAgIGxwICAtIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIDAgb24gc3VjY2VzcwogKiAgICAgIGVycm5vIHZhbHVlIG90aGVyd2lzZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQgd2xfcGNpX2RtYV9mcmVlX2J1Ziggc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCB3bF9wcml2YXRlICpscCwKICAgICAgICAgICAgICAgICAgICAgICAgIERFU0NfU1RSQ1QgKmRlc2MgKQp7CiAgICBpbnQgICAgICAgICBzdGF0dXMgPSAwOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGlmKCBkZXNjID09IE5VTEwgKSB7CiAgICAgICAgc3RhdHVzID0gLUVGQVVMVDsKICAgIH0KICAgIGlmKCBzdGF0dXMgPT0gMCAmJiBkZXNjLT5idWZfYWRkciA9PSBOVUxMICkgewogICAgICAgIHN0YXR1cyA9IC1FRkFVTFQ7CiAgICB9CiAgICBpZiggc3RhdHVzID09IDAgKSB7CiAgICAgICAgcGNpX2ZyZWVfY29uc2lzdGVudCggcGRldiwgR0VUX0JVRl9TSVpFKCBkZXNjICksIGRlc2MtPmJ1Zl9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmJ1Zl9waHlzX2FkZHIgKTsKCiAgICAgICAgZGVzYy0+YnVmX2FkZHIgPSAwOwogICAgICAgIGRlc2MtPmJ1Zl9waHlzX2FkZHIgPSAwOwogICAgICAgIFNFVF9CVUZfU0laRSggZGVzYywgMCApOwogICAgfQogICAgcmV0dXJuIHN0YXR1czsKfSAvLyB3bF9wY2lfZG1hX2ZyZWVfYnVmCi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2hjZl9zdXBwbHkoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgREVTQ1JJUFRJT046CiAqCiAqICAgICAgU3VwcGx5IEhDRiB3aXRoIERNQS1yZWxhdGVkIHJlc291cmNlcy4gVGhlc2UgY29uc2lzdCBvZjoKICogICAgICAgICAgLSBidWZmZXJzIGFuZCBkZXNjcmlwdG9ycyBmb3IgcmVjZWl2ZSBwdXJwb3NlcwogKiAgICAgICAgICAtIG9uZSAncmVjbGFpbScgZGVzY3JpcHRvciBmb3IgdGhlIHRyYW5zbWl0IHBhdGgsIHVzZWQgdG8gZnVsZmlsbCBhCiAqICAgICAgICAgICAgY2VydGFpbiBIMjUgRE1BIGVuZ2luZSByZXF1aXJlbWVudAogKiAgICAgICAgICAtIG9uZSAncmVjbGFpbScgZGVzY3JpcHRvciBmb3IgdGhlIHJlY2VpdmUgcGF0aCwgdXNlZCB0byBmdWxmaWxsIGEKICogICAgICAgICAgICBjZXJ0YWluIEgyNSBETUEgZW5naW5lIHJlcXVpcmVtZW50CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgc3RhcnQtb2YtZGF5IG9yIGF0IHJlLWluaXRpYWxpemF0aW9uLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9wY2lfZG1hX2hjZl9zdXBwbHkoIHN0cnVjdCB3bF9wcml2YXRlICpscCApCnsKICAgIGludCBpOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIERCR19GVU5DKCAid2xfcGNpX2RtYV9oY2Zfc3VwcGx5IiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgLy9pZiggbHAtPmRtYS5zdGF0dXMgPT0gMCApOwogICAgLy97CiAgICAgICAgLyogSGFuZCBvdmVyIHRoZSBSeC9UeCByZWNsYWltIGRlc2NyaXB0b3JzIHRvIHRoZSBIQ0YgKi8KICAgICAgICBpZiggbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgKSB7CiAgICAgICAgICAgIERCR19QUklOVCggImxwLT5kbWEudHhfcmVjbGFpbV9kZXNjOiAweCVwXG4iLCBscC0+ZG1hLnR4X3JlY2xhaW1fZGVzYyApOwogICAgICAgICAgICBoY2ZfZG1hX3R4X3B1dCggJmxwLT5oY2ZDdHgsIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjLCAwICk7CiAgICAgICAgICAgIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjID0gTlVMTDsKICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS50eF9yZWNsYWltX2Rlc2M6IDB4JXBcbiIsIGxwLT5kbWEudHhfcmVjbGFpbV9kZXNjICk7CiAgICAgICAgfQogICAgICAgIGlmKCBscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYyApIHsKICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS5yeF9yZWNsYWltX2Rlc2M6IDB4JXBcbiIsIGxwLT5kbWEucnhfcmVjbGFpbV9kZXNjICk7CiAgICAgICAgICAgIGhjZl9kbWFfcnhfcHV0KCAmbHAtPmhjZkN0eCwgbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKTsKICAgICAgICAgICAgbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgPSBOVUxMOwogICAgICAgICAgICBEQkdfUFJJTlQoICJscC0+ZG1hLnJ4X3JlY2xhaW1fZGVzYzogMHglcFxuIiwgbHAtPmRtYS5yeF9yZWNsYWltX2Rlc2MgKTsKICAgICAgICB9CiAgICAgICAgLyogSGFuZCBvdmVyIHRoZSBSeCBkZXNjcmlwdG9yIGNoYWluIHRvIHRoZSBIQ0YgKi8KICAgICAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1JYX0RFU0M7IGkrKyApIHsKICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS5yeF9wYWNrZXRbJWRdOiAgICAweCVwXG4iLCBpLCBscC0+ZG1hLnJ4X3BhY2tldFtpXSApOwogICAgICAgICAgICBoY2ZfZG1hX3J4X3B1dCggJmxwLT5oY2ZDdHgsIGxwLT5kbWEucnhfcGFja2V0W2ldICk7CiAgICAgICAgICAgIGxwLT5kbWEucnhfcGFja2V0W2ldID0gTlVMTDsKICAgICAgICAgICAgREJHX1BSSU5UKCAibHAtPmRtYS5yeF9wYWNrZXRbJWRdOiAgICAweCVwXG4iLCBpLCBscC0+ZG1hLnJ4X3BhY2tldFtpXSApOwogICAgICAgIH0KICAgIC8vfQoKICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuOwp9IC8vIHdsX3BjaV9kbWFfaGNmX3N1cHBseQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbSgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBSZXR1cm4gRE1BLXJlbGF0ZWQgcmVzb3VyY2VzIGZyb20gdGhlIEhDRi4gVGhlc2UgY29uc2lzdCBvZjoKICogICAgICAgICAgLSBidWZmZXJzIGFuZCBkZXNjcmlwdG9ycyBmb3IgcmVjZWl2ZSBwdXJwb3NlcwogKiAgICAgICAgICAtIGJ1ZmZlcnMgYW5kIGRlc2NyaXB0b3JzIGZvciB0cmFuc21pdCBwdXJwb3NlcwogKiAgICAgICAgICAtIG9uZSAncmVjbGFpbScgZGVzY3JpcHRvciBmb3IgdGhlIHRyYW5zbWl0IHBhdGgsIHVzZWQgdG8gZnVsZmlsbCBhCiAqICAgICAgICAgICAgY2VydGFpbiBIMjUgRE1BIGVuZ2luZSByZXF1aXJlbWVudAogKiAgICAgICAgICAtIG9uZSAncmVjbGFpbScgZGVzY3JpcHRvciBmb3IgdGhlIHJlY2VpdmUgcGF0aCwgdXNlZCB0byBmdWxmaWxsIGEKICogICAgICAgICAgICBjZXJ0YWluIEgyNSBETUEgZW5naW5lIHJlcXVpcmVtZW50CiAqCiAqICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgZW5kLW9mLWRheSBvciBhdCByZS1pbml0aWFsaXphdGlvbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbSggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaW50IGk7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2hjZl9yZWNsYWltIiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV9yeCggbHAgKTsKICAgIGZvciggaSA9IDA7IGkgPCBOVU1fUlhfREVTQzsgaSsrICkgewogICAgICAgIERCR19QUklOVCggInJ4X3BhY2tldFslZF0gMHglcFxuIiwgaSwgbHAtPmRtYS5yeF9wYWNrZXRbaV0gKTsKLy8gICAgICAgICBpZiggbHAtPmRtYS5yeF9wYWNrZXRbaV0gPT0gTlVMTCApIHsKLy8gICAgICAgICAgICAgREJHX1BSSU5UKCAid2xfcGNpX2RtYV9oY2ZfcmVjbGFpbTogcnhfcGFja2V0WyVkXSBOVUxMXG4iLCBpICk7Ci8vICAgICAgICAgfQogICAgfQoKICAgIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fdHgoIGxwICk7CiAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKyApIHsKICAgICAgICBEQkdfUFJJTlQoICJ0eF9wYWNrZXRbJWRdIDB4JXBcbiIsIGksIGxwLT5kbWEudHhfcGFja2V0W2ldICk7Ci8vICAgICAgICAgaWYoIGxwLT5kbWEudHhfcGFja2V0W2ldID09IE5VTEwgKSB7Ci8vICAgICAgICAgICAgIERCR19QUklOVCggIndsX3BjaV9kbWFfaGNmX3JlY2xhaW06IHR4X3BhY2tldFslZF0gTlVMTFxuIiwgaSApOwovLyAgICAgICAgIH0KICAgICB9CgogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7CiAgICByZXR1cm47Cn0gLy8gd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV9yeCgpCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICBERVNDUklQVElPTjoKICoKICogICAgICBSZWNsYWltIFJ4IHBhY2tldHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYnkgdGhlIEhDRi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgIC0gdGhlIGRldmljZSdzIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgMCBvbiBzdWNjZXNzCiAqICAgICAgZXJybm8gdmFsdWUgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV9yeCggc3RydWN0IHdsX3ByaXZhdGUgKmxwICkKewogICAgaW50ICAgICAgICAgaTsKICAgIERFU0NfU1RSQ1QgKnA7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgREJHX0ZVTkMoICJ3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3J4IiApOwogICAgREJHX0VOVEVSKCBEYmdJbmZvICk7CgogICAgLy9pZiggbHAtPmRtYS5zdGF0dXMgPT0gMCApCiAgICAvL3sKICAgICAgICB3aGlsZSAoICggcCA9IGhjZl9kbWFfcnhfZ2V0KCAmbHAtPmhjZkN0eCApICkgIT0gTlVMTCApIHsKICAgICAgICAgICAgaWYoIHAgJiYgcC0+YnVmX2FkZHIgPT0gTlVMTCApIHsKICAgICAgICAgICAgICAgIC8qIEEgcmVjbGFpbSBkZXNjcmlwdG9yIGlzIGJlaW5nIGdpdmVuIGJhY2sgYnkgdGhlIEhDRi4gUmVjbGFpbQogICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMgaGF2ZSBhIE5VTEwgYnVmX2FkZHIgKi8KICAgICAgICAgICAgICAgIGxwLT5kbWEucnhfcmVjbGFpbV9kZXNjID0gcDsKICAgICAgICAgICAgCURCR19QUklOVCggInJlY2xhaW1fZGVzY3JpcHRvcjogMHglcFxuIiwgcCApOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKysgKSB7CiAgICAgICAgICAgICAgICBpZiggbHAtPmRtYS5yeF9wYWNrZXRbaV0gPT0gTlVMTCApIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBBbiBSeCBidWZmZXIgZGVzY3JpcHRvciBpcyBiZWluZyBnaXZlbiBiYWNrIGJ5IHRoZSBIQ0YgKi8KICAgICAgICAgICAgbHAtPmRtYS5yeF9wYWNrZXRbaV0gPSBwOwogICAgICAgICAgICBscC0+ZG1hLnJ4X3JzY19pbmQrKzsKICAgICAgICAJREJHX1BSSU5UKCAicnhfcGFja2V0WyVkXSAweCVwXG4iLCBpLCBscC0+ZG1hLnJ4X3BhY2tldFtpXSApOwogICAgICAgIH0KICAgIC8vfQogICAgREJHX0xFQVZFKCBEYmdJbmZvICk7Cn0gLy8gd2xfcGNpX2RtYV9oY2ZfcmVjbGFpbV9yeAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGNpX2RtYV9nZXRfdHhfcGFja2V0KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIE9idGFpbnMgYSBUeCBkZXNjcmlwdG9yIGZyb20gdGhlIGNoYWluIHRvIHVzZSBmb3IgVHguCiAqCiAqICBQQVJBTUVURVJTOgogKgogKiAgICAgIGxwIC0gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyB3bF9wcml2YXRlIHN0cnVjdHVyZS4KICoKICogIFJFVFVSTlM6CiAqCiAqICAgICAgQSBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgZGVzY3JpcHRvcgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpERVNDX1NUUkNUICogd2xfcGNpX2RtYV9nZXRfdHhfcGFja2V0KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBpbnQgaTsKICAgIERFU0NfU1RSQ1QgKmRlc2MgPSBOVUxMOwogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgIGZvciggaSA9IDA7IGkgPCBOVU1fVFhfREVTQzsgaSsrICkgewogICAgICAgIGlmKCBscC0+ZG1hLnR4X3BhY2tldFtpXSApIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIGlmKCBpICE9IE5VTV9UWF9ERVNDICkgewogICAgICAgIGRlc2MgPSBscC0+ZG1hLnR4X3BhY2tldFtpXTsKCiAgICAgICAgbHAtPmRtYS50eF9wYWNrZXRbaV0gPSBOVUxMOwogICAgICAgIGxwLT5kbWEudHhfcnNjX2luZC0tOwoKICAgICAgICBtZW1zZXQoIGRlc2MtPmJ1Zl9hZGRyLCAwLCBIQ0ZfRE1BX1RYX0JVRjFfU0laRSApOwogICAgfQoKICAgIHJldHVybiBkZXNjOwp9IC8vIHdsX3BjaV9kbWFfZ2V0X3R4X3BhY2tldAovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJd2xfcGNpX2RtYV9wdXRfdHhfcGFja2V0KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFJldHVybnMgYSBUeCBkZXNjcmlwdG9yIHRvIHRoZSBjaGFpbi4KICoKICogIFBBUkFNRVRFUlM6CiAqCiAqICAgICAgbHAgICAtIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3Mgd2xfcHJpdmF0ZSBzdHJ1Y3R1cmUuCiAqICAgICAgZGVzYyAtIGEgcG9pbnRlciB0byB0aGUgZGVzY3JpcHRvciB0byByZXR1cm4uCiAqCiAqICBSRVRVUk5TOgogKgogKiAgICAgIE4vQQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkIHdsX3BjaV9kbWFfcHV0X3R4X3BhY2tldCggc3RydWN0IHdsX3ByaXZhdGUgKmxwLCBERVNDX1NUUkNUICpkZXNjICkKewogICAgaW50IGk7CiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgZm9yKCBpID0gMDsgaSA8IE5VTV9UWF9ERVNDOyBpKysgKSB7CiAgICAgICAgaWYoIGxwLT5kbWEudHhfcGFja2V0W2ldID09IE5VTEwgKSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiggaSAhPSBOVU1fVFhfREVTQyApIHsKICAgICAgICBscC0+ZG1hLnR4X3BhY2tldFtpXSA9IGRlc2M7CiAgICAgICAgbHAtPmRtYS50eF9yc2NfaW5kKys7CiAgICB9Cn0gLy8gd2xfcGNpX2RtYV9wdXRfdHhfcGFja2V0Ci8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgl3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3R4KCkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIERFU0NSSVBUSU9OOgogKgogKiAgICAgIFJlY2xhaW0gVHggcGFja2V0cyB0aGF0IGhhdmUgZWl0aGVyIGJlZW4gcHJvY2Vzc2VkIGJ5IHRoZSBIQ0YgZHVlIHRvIGEKICogICAgICBwb3J0IGRpc2FibGUgb3IgYSBUeCBjb21wbGV0aW9uLgogKgogKiAgUEFSQU1FVEVSUzoKICoKICogICAgICBscCAgLSB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogKgogKiAgUkVUVVJOUzoKICoKICogICAgICAwIG9uIHN1Y2Nlc3MKICogICAgICBlcnJubyB2YWx1ZSBvdGhlcndpc2UKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCB3bF9wY2lfZG1hX2hjZl9yZWNsYWltX3R4KCBzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgKQp7CiAgICBpbnQgICAgICAgICBpOwogICAgREVTQ19TVFJDVCAqcDsKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICBEQkdfRlVOQyggIndsX3BjaV9kbWFfaGNmX3JlY2xhaW1fdHgiICk7CiAgICBEQkdfRU5URVIoIERiZ0luZm8gKTsKCiAgICAvL2lmKCBscC0+ZG1hLnN0YXR1cyA9PSAwICkKICAgIC8vewogICAgICAgIHdoaWxlICggKCBwID0gaGNmX2RtYV90eF9nZXQoICZscC0+aGNmQ3R4ICkgKSAhPSBOVUxMICkgewoKICAgICAgICAgICAgaWYoIHAgIT0gTlVMTCAmJiBwLT5idWZfYWRkciA9PSBOVUxMICkgewogICAgICAgICAgICAgICAgLyogQSBSZWNsYWltIGRlc2NyaXB0b3IgaXMgYmVpbmcgZ2l2ZW4gYmFjayBieSB0aGUgSENGLiBSZWNsYWltCiAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycyBoYXZlIGEgTlVMTCBidWZfYWRkciAqLwogICAgICAgICAgICAgICAgbHAtPmRtYS50eF9yZWNsYWltX2Rlc2MgPSBwOwogICAgICAgICAgICAJREJHX1BSSU5UKCAicmVjbGFpbV9kZXNjcmlwdG9yOiAweCVwXG4iLCBwICk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgTlVNX1RYX0RFU0M7IGkrKyApIHsKICAgICAgICAgICAgICAgIGlmKCBscC0+ZG1hLnR4X3BhY2tldFtpXSA9PSBOVUxMICkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIEFuIFJ4IGJ1ZmZlciBkZXNjcmlwdG9yIGlzIGJlaW5nIGdpdmVuIGJhY2sgYnkgdGhlIEhDRiAqLwogICAgICAgICAgICBscC0+ZG1hLnR4X3BhY2tldFtpXSA9IHA7CiAgICAgICAgICAgIGxwLT5kbWEudHhfcnNjX2luZCsrOwogICAgICAgIAlEQkdfUFJJTlQoICJ0eF9wYWNrZXRbJWRdIDB4JXBcbiIsIGksIGxwLT5kbWEudHhfcGFja2V0W2ldICk7CiAgICAgICAgfQogICAgLy99CgogICAgaWYoIGxwLT5uZXRpZl9xdWV1ZV9vbiA9PSBGQUxTRSApIHsKICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKCBscC0+ZGV2ICk7CiAgICAgICAgV0xfV0RTX05FVElGX1dBS0VfUVVFVUUoIGxwICk7CiAgICAgICAgbHAtPm5ldGlmX3F1ZXVlX29uID0gVFJVRTsKICAgIH0KICAgIERCR19MRUFWRSggRGJnSW5mbyApOwogICAgcmV0dXJuOwp9IC8vIHdsX3BjaV9kbWFfaGNmX3JlY2xhaW1fdHgKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KI2VuZGlmICAvLyBFTkFCTEVfRE1BCg==