LyoKICogU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2wgRGV2aWNlIGRyaXZlciBmb3IgVkFJTwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNSBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDUgTmFyYXlhbmFuIFIgUyA8bmFyc0BrYWRhbWJhLm9yZz4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgQWxj9HZlIDx3d3cuYWxjb3ZlLmNvbT4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxIE1pY2hhZWwgQXNobGV5IDxtLmFzaGxleUB1bnN3LmVkdS5hdT4KICoKICogQ29weXJpZ2h0IChDKSAyMDAxIEp1bmljaGkgTW9yaXRhIDxqdW4xbUBtYXJzLmR0aS5uZS5qcD4KICoKICogQ29weXJpZ2h0IChDKSAyMDAwIFRha2F5YSBLaW5qbyA8dC1raW5qb0B0YzQuc28tbmV0Lm5lLmpwPgogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDAgQW5kcmV3IFRyaWRnZWxsIDx0cmlkZ2VAdmFsaW51eC5jb20+CiAqCiAqIEVhcmxpZXIgd29yayBieSBXZXJuZXIgQWxtZXNiZXJnZXIsIFBhdWwgYFJ1c3R5JyBSdXNzZWxsIGFuZCBQYXVsIE1hY2tlcnJhcy4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvd2FpdC5oPgojaW5jbHVkZSA8bGludXgvYWNwaS5oPgojaW5jbHVkZSA8bGludXgvZG1pLmg+CiNpbmNsdWRlIDxsaW51eC9lcnIuaD4KI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgoKI2luY2x1ZGUgPGxpbnV4L3NvbnlwaS5oPgoKI2RlZmluZSBTT05ZUElfRFJJVkVSX1ZFUlNJT04JICIxLjI2IgoKTU9EVUxFX0FVVEhPUigiU3RlbGlhbiBQb3AgPHN0ZWxpYW5AcG9waWVzLm5ldD4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJTb255IFByb2dyYW1tYWJsZSBJL08gQ29udHJvbCBEZXZpY2UgZHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX1ZFUlNJT04oU09OWVBJX0RSSVZFUl9WRVJTSU9OKTsKCnN0YXRpYyBpbnQgbWlub3IgPSAtMTsKbW9kdWxlX3BhcmFtKG1pbm9yLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG1pbm9yLAoJCSAibWlub3IgbnVtYmVyIG9mIHRoZSBtaXNjIGRldmljZSwgZGVmYXVsdCBpcyAtMSAoYXV0b21hdGljKSIpOwoKc3RhdGljIGludCB2ZXJib3NlOwkJLyogPSAwICovCm1vZHVsZV9wYXJhbSh2ZXJib3NlLCBpbnQsIDA2NDQpOwpNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsICJiZSB2ZXJib3NlLCBkZWZhdWx0IGlzIDAgKG5vKSIpOwoKc3RhdGljIGludCBmbmtleWluaXQ7CQkvKiA9IDAgKi8KbW9kdWxlX3BhcmFtKGZua2V5aW5pdCwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhmbmtleWluaXQsCgkJICJzZXQgdGhpcyBpZiB5b3VyIEZuIGtleXMgZG8gbm90IGdlbmVyYXRlIGFueSBldmVudCIpOwoKc3RhdGljIGludCBjYW1lcmE7CQkvKiA9IDAgKi8KbW9kdWxlX3BhcmFtKGNhbWVyYSwgaW50LCAwNDQ0KTsKTU9EVUxFX1BBUk1fREVTQyhjYW1lcmEsCgkJICJzZXQgdGhpcyBpZiB5b3UgaGF2ZSBhIE1vdGlvbkV5ZSBjYW1lcmEgKFBpY3R1cmVCb29rIHNlcmllcykiKTsKCnN0YXRpYyBpbnQgY29tcGF0OwkJLyogPSAwICovCm1vZHVsZV9wYXJhbShjb21wYXQsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0MoY29tcGF0LAoJCSAic2V0IHRoaXMgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbW9kZSIpOwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFzayA9IDB4ZmZmZmZmZmY7Cm1vZHVsZV9wYXJhbShtYXNrLCB1bG9uZywgMDY0NCk7Ck1PRFVMRV9QQVJNX0RFU0MobWFzaywKCQkgInNldCB0aGlzIHRvIHRoZSBtYXNrIG9mIGV2ZW50IHlvdSB3YW50IHRvIGVuYWJsZSAoc2VlIGRvYykiKTsKCnN0YXRpYyBpbnQgdXNlaW5wdXQgPSAxOwptb2R1bGVfcGFyYW0odXNlaW5wdXQsIGludCwgMDQ0NCk7Ck1PRFVMRV9QQVJNX0RFU0ModXNlaW5wdXQsCgkJICJzZXQgdGhpcyBpZiB5b3Ugd291bGQgbGlrZSBzb255cGkgdG8gZmVlZCBldmVudHMgdG8gdGhlIGlucHV0IHN1YnN5c3RlbSIpOwoKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxCTEKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyCTIKI2RlZmluZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzCTMKCi8qIHR5cGUxIG1vZGVscyB1c2UgdGhvc2UgKi8KI2RlZmluZSBTT05ZUElfSVJRX1BPUlQJCQkweDgwMzQKI2RlZmluZSBTT05ZUElfSVJRX1NISUZUCQkyMgojZGVmaW5lIFNPTllQSV9UWVBFMV9CQVNFCQkweDUwCiNkZWZpbmUgU09OWVBJX0cxMEEJCQkoU09OWVBJX1RZUEUxX0JBU0UrMHgxNCkKI2RlZmluZSBTT05ZUElfVFlQRTFfUkVHSU9OX1NJWkUJMHgwOAojZGVmaW5lIFNPTllQSV9UWVBFMV9FVlRZUEVfT0ZGU0VUCTB4MDQKCi8qIHR5cGUyIHNlcmllcyBzcGVjaWZpY3MgKi8KI2RlZmluZSBTT05ZUElfU0lSUQkJCTB4OWIKI2RlZmluZSBTT05ZUElfU0xPQgkJCTB4OWMKI2RlZmluZSBTT05ZUElfU0hJQgkJCTB4OWQKI2RlZmluZSBTT05ZUElfVFlQRTJfUkVHSU9OX1NJWkUJMHgyMAojZGVmaW5lIFNPTllQSV9UWVBFMl9FVlRZUEVfT0ZGU0VUCTB4MTIKCi8qIHR5cGUzIHNlcmllcyBzcGVjaWZpY3MgKi8KI2RlZmluZSBTT05ZUElfVFlQRTNfQkFTRQkJMHg0MAojZGVmaW5lIFNPTllQSV9UWVBFM19HSUQyCQkoU09OWVBJX1RZUEUzX0JBU0UrMHg0OCkgLyogMTYgYml0cyAqLwojZGVmaW5lIFNPTllQSV9UWVBFM19NSVNDCQkoU09OWVBJX1RZUEUzX0JBU0UrMHg2ZCkgLyogOCBiaXRzICAqLwojZGVmaW5lIFNPTllQSV9UWVBFM19SRUdJT05fU0laRQkweDIwCiNkZWZpbmUgU09OWVBJX1RZUEUzX0VWVFlQRV9PRkZTRVQJMHgxMgoKLyogYmF0dGVyeSAvIGJyaWdodG5lc3MgYWRkcmVzc2VzICovCiNkZWZpbmUgU09OWVBJX0JBVF9GTEFHUwkweDgxCiNkZWZpbmUgU09OWVBJX0xDRF9MSUdIVAkweDk2CiNkZWZpbmUgU09OWVBJX0JBVDFfUENUUk0JMHhhMAojZGVmaW5lIFNPTllQSV9CQVQxX0xFRlQJMHhhMgojZGVmaW5lIFNPTllQSV9CQVQxX01BWFJUCTB4YTQKI2RlZmluZSBTT05ZUElfQkFUMl9QQ1RSTQkweGE4CiNkZWZpbmUgU09OWVBJX0JBVDJfTEVGVAkweGFhCiNkZWZpbmUgU09OWVBJX0JBVDJfTUFYUlQJMHhhYwojZGVmaW5lIFNPTllQSV9CQVQxX01BWFRLCTB4YjAKI2RlZmluZSBTT05ZUElfQkFUMV9GVUxMCTB4YjIKI2RlZmluZSBTT05ZUElfQkFUMl9NQVhUSwkweGI4CiNkZWZpbmUgU09OWVBJX0JBVDJfRlVMTAkweGJhCgovKiBGQU4wIGluZm9ybWF0aW9uIChyZXZlcnNlIGVuZ2luZWVyZWQgZnJvbSBBQ1BJIHRhYmxlcykgKi8KI2RlZmluZSBTT05ZUElfRkFOMF9TVEFUVVMJMHg5MwojZGVmaW5lIFNPTllQSV9URU1QX1NUQVRVUwkweEMxCgovKiBpb3BvcnRzIHVzZWQgZm9yIGJyaWdodG5lc3MgYW5kIHR5cGUyIGV2ZW50cyAqLwojZGVmaW5lIFNPTllQSV9EQVRBX0lPUE9SVAkweDYyCiNkZWZpbmUgU09OWVBJX0NTVF9JT1BPUlQJMHg2NgoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBpb3BvcnRzICovCnN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3QgewoJdTE2CXBvcnQxOwoJdTE2CXBvcnQyOwp9OwoKc3RhdGljIHN0cnVjdCBzb255cGlfaW9wb3J0X2xpc3Qgc29ueXBpX3R5cGUxX2lvcG9ydF9saXN0W10gPSB7Cgl7IDB4MTBjMCwgMHgxMGM0IH0sCS8qIGxvb2tzIGxpa2UgdGhlIGRlZmF1bHQgb24gQzFWeCAqLwoJeyAweDEwODAsIDB4MTA4NCB9LAoJeyAweDEwOTAsIDB4MTA5NCB9LAoJeyAweDEwYTAsIDB4MTBhNCB9LAoJeyAweDEwYjAsIDB4MTBiNCB9LAoJeyAweDAsIDB4MCB9Cn07CgpzdGF0aWMgc3RydWN0IHNvbnlwaV9pb3BvcnRfbGlzdCBzb255cGlfdHlwZTJfaW9wb3J0X2xpc3RbXSA9IHsKCXsgMHgxMDgwLCAweDEwODQgfSwKCXsgMHgxMGEwLCAweDEwYTQgfSwKCXsgMHgxMGMwLCAweDEwYzQgfSwKCXsgMHgxMGUwLCAweDEwZTQgfSwKCXsgMHgwLCAweDAgfQp9OwoKLyogc2FtZSBhcyBpbiB0eXBlIDIgbW9kZWxzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2lvcG9ydF9saXN0ICpzb255cGlfdHlwZTNfaW9wb3J0X2xpc3QgPQoJc29ueXBpX3R5cGUyX2lvcG9ydF9saXN0OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBpbnRlcnJ1cHRzICovCnN0cnVjdCBzb255cGlfaXJxX2xpc3QgewoJdTE2CWlycTsKCXUxNgliaXRzOwp9OwoKc3RhdGljIHN0cnVjdCBzb255cGlfaXJxX2xpc3Qgc29ueXBpX3R5cGUxX2lycV9saXN0W10gPSB7Cgl7IDExLCAweDIgfSwJLyogSVJRIDExLCBHTzIyPTAsR08yMz0xIGluIEFNTCAqLwoJeyAxMCwgMHgxIH0sCS8qIElSUSAxMCwgR08yMj0xLEdPMjM9MCBpbiBBTUwgKi8KCXsgIDUsIDB4MCB9LAkvKiBJUlEgIDUsIEdPMjI9MCxHTzIzPTAgaW4gQU1MICovCgl7ICAwLCAweDMgfQkvKiBubyBJUlEsIEdPMjI9MSxHTzIzPTEgaW4gQU1MICovCn07CgpzdGF0aWMgc3RydWN0IHNvbnlwaV9pcnFfbGlzdCBzb255cGlfdHlwZTJfaXJxX2xpc3RbXSA9IHsKCXsgMTEsIDB4ODAgfSwJLyogSVJRIDExLCAweDgwIGluIFNJUlEgaW4gQU1MICovCgl7IDEwLCAweDQwIH0sCS8qIElSUSAxMCwgMHg0MCBpbiBTSVJRIGluIEFNTCAqLwoJeyAgOSwgMHgyMCB9LAkvKiBJUlEgIDksIDB4MjAgaW4gU0lSUSBpbiBBTUwgKi8KCXsgIDYsIDB4MTAgfSwJLyogSVJRICA2LCAweDEwIGluIFNJUlEgaW4gQU1MICovCgl7ICAwLCAweDAwIH0JLyogbm8gSVJRLCAweDAwIGluIFNJUlEgaW4gQU1MICovCn07CgovKiBzYW1lIGFzIGluIHR5cGUyIG1vZGVscyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9pcnFfbGlzdCAqc29ueXBpX3R5cGUzX2lycV9saXN0ID0gc29ueXBpX3R5cGUyX2lycV9saXN0OwoKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0JSSUdIVE5FU1MJCTAKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRSQVNUCQkJMQojZGVmaW5lIFNPTllQSV9DQU1FUkFfSFVFCQkJMgojZGVmaW5lIFNPTllQSV9DQU1FUkFfQ09MT1IJCQkzCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9TSEFSUE5FU1MJCQk0CgojZGVmaW5lIFNPTllQSV9DQU1FUkFfUElDVFVSRQkJCTUKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0VYUE9TVVJFX01BU0sJCTB4QwojZGVmaW5lIFNPTllQSV9DQU1FUkFfV0hJVEVfQkFMQU5DRV9NQVNLCTB4MwojZGVmaW5lIFNPTllQSV9DQU1FUkFfUElDVFVSRV9NT0RFX01BU0sJCTB4MzAKI2RlZmluZSBTT05ZUElfQ0FNRVJBX01VVEVfTUFTSwkJCTB4NDAKCi8qIHRoZSByZXN0IGRvbid0IG5lZWQgYSBsb29wIHVudGlsIG5vdCAweGZmICovCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9BR0MJCQk2CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9BR0NfTUFTSwkJCTB4MzAKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NIVVRURVJfTUFTSyAJCTB4NwoKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NIVVRET1dOX1JFUVVFU1QJCTcKI2RlZmluZSBTT05ZUElfQ0FNRVJBX0NPTlRST0wJCQkweDEwCgojZGVmaW5lIFNPTllQSV9DQU1FUkFfU1RBVFVTIAkJCTcKI2RlZmluZSBTT05ZUElfQ0FNRVJBX1NUQVRVU19SRUFEWSAJCTB4MgojZGVmaW5lIFNPTllQSV9DQU1FUkFfU1RBVFVTX1BPU0lUSU9OCQkweDQKCiNkZWZpbmUgU09OWVBJX0RJUkVDVElPTl9CQUNLV0FSRFMgCQkweDQKCiNkZWZpbmUgU09OWVBJX0NBTUVSQV9SRVZJU0lPTiAJCQk4CiNkZWZpbmUgU09OWVBJX0NBTUVSQV9ST01WRVJTSU9OIAkJOQoKLyogRXZlbnQgbWFza3MgKi8KI2RlZmluZSBTT05ZUElfSk9HR0VSX01BU0sJCQkweDAwMDAwMDAxCiNkZWZpbmUgU09OWVBJX0NBUFRVUkVfTUFTSwkJCTB4MDAwMDAwMDIKI2RlZmluZSBTT05ZUElfRk5LRVlfTUFTSwkJCTB4MDAwMDAwMDQKI2RlZmluZSBTT05ZUElfQkxVRVRPT1RIX01BU0sJCQkweDAwMDAwMDA4CiNkZWZpbmUgU09OWVBJX1BLRVlfTUFTSwkJCTB4MDAwMDAwMTAKI2RlZmluZSBTT05ZUElfQkFDS19NQVNLCQkJMHgwMDAwMDAyMAojZGVmaW5lIFNPTllQSV9IRUxQX01BU0sJCQkweDAwMDAwMDQwCiNkZWZpbmUgU09OWVBJX0xJRF9NQVNLCQkJCTB4MDAwMDAwODAKI2RlZmluZSBTT05ZUElfWk9PTV9NQVNLCQkJMHgwMDAwMDEwMAojZGVmaW5lIFNPTllQSV9USFVNQlBIUkFTRV9NQVNLCQkJMHgwMDAwMDIwMAojZGVmaW5lIFNPTllQSV9NRVlFX01BU0sJCQkweDAwMDAwNDAwCiNkZWZpbmUgU09OWVBJX01FTU9SWVNUSUNLX01BU0sJCQkweDAwMDAwODAwCiNkZWZpbmUgU09OWVBJX0JBVFRFUllfTUFTSwkJCTB4MDAwMDEwMDAKI2RlZmluZSBTT05ZUElfV0lSRUxFU1NfTUFTSwkJCTB4MDAwMDIwMDAKCnN0cnVjdCBzb255cGlfZXZlbnQgewoJdTgJZGF0YTsKCXU4CWV2ZW50Owp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBidXR0b24gcmVsZWFzZSBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX3JlbGVhc2VldltdID0gewoJeyAweDAwLCBTT05ZUElfRVZFTlRfQU5ZQlVUVE9OX1JFTEVBU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBqb2dnZXIgZXZlbnRzICAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfam9nZ2VyZXZbXSA9IHsKCXsgMHgxZiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVAgfSwKCXsgMHgwMSwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRE9XTiB9LAoJeyAweDVmLCBTT05ZUElfRVZFTlRfSk9HRElBTF9VUF9QUkVTU0VEIH0sCgl7IDB4NDEsIFNPTllQSV9FVkVOVF9KT0dESUFMX0RPV05fUFJFU1NFRCB9LAoJeyAweDFlLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQIH0sCgl7IDB4MDIsIFNPTllQSV9FVkVOVF9KT0dESUFMX0ZBU1RfRE9XTiB9LAoJeyAweDVlLCBTT05ZUElfRVZFTlRfSk9HRElBTF9GQVNUX1VQX1BSRVNTRUQgfSwKCXsgMHg0MiwgU09OWVBJX0VWRU5UX0pPR0RJQUxfRkFTVF9ET1dOX1BSRVNTRUQgfSwKCXsgMHgxZCwgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfVVAgfSwKCXsgMHgwMywgU09OWVBJX0VWRU5UX0pPR0RJQUxfVkZBU1RfRE9XTiB9LAoJeyAweDVkLCBTT05ZUElfRVZFTlRfSk9HRElBTF9WRkFTVF9VUF9QUkVTU0VEIH0sCgl7IDB4NDMsIFNPTllQSV9FVkVOVF9KT0dESUFMX1ZGQVNUX0RPV05fUFJFU1NFRCB9LAoJeyAweDQwLCBTT05ZUElfRVZFTlRfSk9HRElBTF9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBjYXB0dXJlIGJ1dHRvbiBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2NhcHR1cmVldltdID0gewoJeyAweDA1LCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QQVJUSUFMUFJFU1NFRCB9LAoJeyAweDA3LCBTT05ZUElfRVZFTlRfQ0FQVFVSRV9QUkVTU0VEIH0sCgl7IDB4MDEsIFNPTllQSV9FVkVOVF9DQVBUVVJFX1BBUlRJQUxSRUxFQVNFRCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgZm5rZXlzIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfZm5rZXlldltdID0gewoJeyAweDEwLCBTT05ZUElfRVZFTlRfRk5LRVlfRVNDIH0sCgl7IDB4MTEsIFNPTllQSV9FVkVOVF9GTktFWV9GMSB9LAoJeyAweDEyLCBTT05ZUElfRVZFTlRfRk5LRVlfRjIgfSwKCXsgMHgxMywgU09OWVBJX0VWRU5UX0ZOS0VZX0YzIH0sCgl7IDB4MTQsIFNPTllQSV9FVkVOVF9GTktFWV9GNCB9LAoJeyAweDE1LCBTT05ZUElfRVZFTlRfRk5LRVlfRjUgfSwKCXsgMHgxNiwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y2IH0sCgl7IDB4MTcsIFNPTllQSV9FVkVOVF9GTktFWV9GNyB9LAoJeyAweDE4LCBTT05ZUElfRVZFTlRfRk5LRVlfRjggfSwKCXsgMHgxOSwgU09OWVBJX0VWRU5UX0ZOS0VZX0Y5IH0sCgl7IDB4MWEsIFNPTllQSV9FVkVOVF9GTktFWV9GMTAgfSwKCXsgMHgxYiwgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMSB9LAoJeyAweDFjLCBTT05ZUElfRVZFTlRfRk5LRVlfRjEyIH0sCgl7IDB4MWYsIFNPTllQSV9FVkVOVF9GTktFWV9SRUxFQVNFRCB9LAoJeyAweDIxLCBTT05ZUElfRVZFTlRfRk5LRVlfMSB9LAoJeyAweDIyLCBTT05ZUElfRVZFTlRfRk5LRVlfMiB9LAoJeyAweDMxLCBTT05ZUElfRVZFTlRfRk5LRVlfRCB9LAoJeyAweDMyLCBTT05ZUElfRVZFTlRfRk5LRVlfRSB9LAoJeyAweDMzLCBTT05ZUElfRVZFTlRfRk5LRVlfRiB9LAoJeyAweDM0LCBTT05ZUElfRVZFTlRfRk5LRVlfUyB9LAoJeyAweDM1LCBTT05ZUElfRVZFTlRfRk5LRVlfQiB9LAoJeyAweDM2LCBTT05ZUElfRVZFTlRfRk5LRVlfT05MWSB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgcHJvZ3JhbSBrZXkgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV9wa2V5ZXZbXSA9IHsKCXsgMHgwMSwgU09OWVBJX0VWRU5UX1BLRVlfUDEgfSwKCXsgMHgwMiwgU09OWVBJX0VWRU5UX1BLRVlfUDIgfSwKCXsgMHgwNCwgU09OWVBJX0VWRU5UX1BLRVlfUDMgfSwKCXsgMHg1YywgU09OWVBJX0VWRU5UX1BLRVlfUDEgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIGJsdWV0b290aCBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JsdWVldltdID0gewoJeyAweDU1LCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX1BSRVNTRUQgfSwKCXsgMHg1OSwgU09OWVBJX0VWRU5UX0JMVUVUT09USF9PTiB9LAoJeyAweDVhLCBTT05ZUElfRVZFTlRfQkxVRVRPT1RIX09GRiB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgd2lyZWxlc3MgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV93bGVzc2V2W10gPSB7Cgl7IDB4NTksIFNPTllQSV9FVkVOVF9XSVJFTEVTU19PTiB9LAoJeyAweDVhLCBTT05ZUElfRVZFTlRfV0lSRUxFU1NfT0ZGIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBiYWNrIGJ1dHRvbiBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JhY2tldltdID0gewoJeyAweDIwLCBTT05ZUElfRVZFTlRfQkFDS19QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBoZWxwIGJ1dHRvbiBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2hlbHBldltdID0gewoJeyAweDNiLCBTT05ZUElfRVZFTlRfSEVMUF9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgbGlkIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbGlkZXZbXSA9IHsKCXsgMHg1MSwgU09OWVBJX0VWRU5UX0xJRF9DTE9TRUQgfSwKCXsgMHg1MCwgU09OWVBJX0VWRU5UX0xJRF9PUEVORUQgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIHpvb20gZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV96b29tZXZbXSA9IHsKCXsgMHgzOSwgU09OWVBJX0VWRU5UX1pPT01fUFJFU1NFRCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgdGh1bWJwaHJhc2UgZXZlbnRzICovCnN0YXRpYyBzdHJ1Y3Qgc29ueXBpX2V2ZW50IHNvbnlwaV90aHVtYnBocmFzZWV2W10gPSB7Cgl7IDB4M2EsIFNPTllQSV9FVkVOVF9USFVNQlBIUkFTRV9QUkVTU0VEIH0sCgl7IDAsIDAgfQp9OwoKLyogVGhlIHNldCBvZiBwb3NzaWJsZSBtb3Rpb25leWUgY2FtZXJhIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbWV5ZWV2W10gPSB7Cgl7IDB4MDAsIFNPTllQSV9FVkVOVF9NRVlFX0ZBQ0UgfSwKCXsgMHgwMSwgU09OWVBJX0VWRU5UX01FWUVfT1BQT1NJVEUgfSwKCXsgMCwgMCB9Cn07CgovKiBUaGUgc2V0IG9mIHBvc3NpYmxlIG1lbW9yeXN0aWNrIGV2ZW50cyAqLwpzdGF0aWMgc3RydWN0IHNvbnlwaV9ldmVudCBzb255cGlfbWVtb3J5c3RpY2tldltdID0gewoJeyAweDUzLCBTT05ZUElfRVZFTlRfTUVNT1JZU1RJQ0tfSU5TRVJUIH0sCgl7IDB4NTQsIFNPTllQSV9FVkVOVF9NRU1PUllTVElDS19FSkVDVCB9LAoJeyAwLCAwIH0KfTsKCi8qIFRoZSBzZXQgb2YgcG9zc2libGUgYmF0dGVyeSBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnQgc29ueXBpX2JhdHRlcnlldltdID0gewoJeyAweDIwLCBTT05ZUElfRVZFTlRfQkFUVEVSWV9JTlNFUlQgfSwKCXsgMHgzMCwgU09OWVBJX0VWRU5UX0JBVFRFUllfUkVNT1ZFIH0sCgl7IDAsIDAgfQp9OwoKc3RhdGljIHN0cnVjdCBzb255cGlfZXZlbnR0eXBlcyB7CglpbnQJCQltb2RlbDsKCXU4CQkJZGF0YTsKCXVuc2lnbmVkIGxvbmcJCW1hc2s7CglzdHJ1Y3Qgc29ueXBpX2V2ZW50ICoJZXZlbnRzOwp9IHNvbnlwaV9ldmVudHR5cGVzW10gPSB7Cgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDAsIDB4ZmZmZmZmZmYsIHNvbnlwaV9yZWxlYXNlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg3MCwgU09OWVBJX01FWUVfTUFTSywgc29ueXBpX21leWVldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDYwLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MTAsIFNPTllQSV9KT0dHRVJfTUFTSywgc29ueXBpX2pvZ2dlcmV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTEsIDB4MjAsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfQkxVRVRPT1RIX01BU0ssIHNvbnlwaV9ibHVlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg0MCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxLCAweDMwLCBTT05ZUElfTUVNT1JZU1RJQ0tfTUFTSywgc29ueXBpX21lbW9yeXN0aWNrZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSwgMHg0MCwgU09OWVBJX0JBVFRFUllfTUFTSywgc29ueXBpX2JhdHRlcnlldiB9LAoKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDM4LCBTT05ZUElfTElEX01BU0ssIHNvbnlwaV9saWRldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDExLCBTT05ZUElfSk9HR0VSX01BU0ssIHNvbnlwaV9qb2dnZXJldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDYxLCBTT05ZUElfQ0FQVFVSRV9NQVNLLCBzb255cGlfY2FwdHVyZWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MjEsIFNPTllQSV9GTktFWV9NQVNLLCBzb255cGlfZm5rZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDMxLCBTT05ZUElfQkxVRVRPT1RIX01BU0ssIHNvbnlwaV9ibHVlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgwOCwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDExLCBTT05ZUElfQkFDS19NQVNLLCBzb255cGlfYmFja2V2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4MjEsIFNPTllQSV9IRUxQX01BU0ssIHNvbnlwaV9oZWxwZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgyMSwgU09OWVBJX1pPT01fTUFTSywgc29ueXBpX3pvb21ldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyLCAweDIwLCBTT05ZUElfVEhVTUJQSFJBU0VfTUFTSywgc29ueXBpX3RodW1icGhyYXNlZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgzMSwgU09OWVBJX01FTU9SWVNUSUNLX01BU0ssIHNvbnlwaV9tZW1vcnlzdGlja2V2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTIsIDB4NDEsIFNPTllQSV9CQVRURVJZX01BU0ssIHNvbnlwaV9iYXR0ZXJ5ZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMiwgMHgzMSwgU09OWVBJX1BLRVlfTUFTSywgc29ueXBpX3BrZXlldiB9LAoKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMywgMCwgMHhmZmZmZmZmZiwgc29ueXBpX3JlbGVhc2VldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzLCAweDIxLCBTT05ZUElfRk5LRVlfTUFTSywgc29ueXBpX2Zua2V5ZXYgfSwKCXsgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMywgMHgzMSwgU09OWVBJX1dJUkVMRVNTX01BU0ssIHNvbnlwaV93bGVzc2V2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4MzEsIFNPTllQSV9NRU1PUllTVElDS19NQVNLLCBzb255cGlfbWVtb3J5c3RpY2tldiB9LAoJeyBTT05ZUElfREVWSUNFX01PREVMX1RZUEUzLCAweDQxLCBTT05ZUElfQkFUVEVSWV9NQVNLLCBzb255cGlfYmF0dGVyeWV2IH0sCgl7IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTMsIDB4MzEsIFNPTllQSV9QS0VZX01BU0ssIHNvbnlwaV9wa2V5ZXYgfSwKCXsgMCB9Cn07CgojZGVmaW5lIFNPTllQSV9CVUZfU0laRQkxMjgKCi8qIFRoZSBuYW1lIG9mIHRoZSBkZXZpY2VzIGZvciB0aGUgaW5wdXQgZGV2aWNlIGRyaXZlcnMgKi8KI2RlZmluZSBTT05ZUElfSk9HX0lOUFVUTkFNRQkiU29ueSBWYWlvIEpvZ2RpYWwiCiNkZWZpbmUgU09OWVBJX0tFWV9JTlBVVE5BTUUJIlNvbnkgVmFpbyBLZXlzIgoKLyogQ29ycmVzcG9uZGFuY2UgdGFibGUgYmV0d2VlbiBzb255cGkgZXZlbnRzIGFuZCBpbnB1dCBsYXllciBldmVudHMgKi8Kc3RhdGljIHN0cnVjdCB7CglpbnQgc29ueXBpZXY7CglpbnQgaW5wdXRldjsKfSBzb255cGlfaW5wdXRrZXlzW10gPSB7Cgl7IFNPTllQSV9FVkVOVF9DQVBUVVJFX1BSRVNTRUQsCSAJS0VZX0NBTUVSQSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfT05MWSwgCQlLRVlfRk4gfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0VTQywgCQlLRVlfRk5fRVNDIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMSwgCQlLRVlfRk5fRjEgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YyLCAJCUtFWV9GTl9GMiB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjMsIAkJS0VZX0ZOX0YzIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GNCwgCQlLRVlfRk5fRjQgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y1LCAJCUtFWV9GTl9GNSB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjYsIAkJS0VZX0ZOX0Y2IH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GNywgCQlLRVlfRk5fRjcgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0Y4LCAJCUtFWV9GTl9GOCB9LAoJeyBTT05ZUElfRVZFTlRfRk5LRVlfRjksCQlLRVlfRk5fRjkgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMCwJCUtFWV9GTl9GMTAgfSwKCXsgU09OWVBJX0VWRU5UX0ZOS0VZX0YxMSwgCQlLRVlfRk5fRjExIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GMTIsCQlLRVlfRk5fRjEyIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV8xLCAJCUtFWV9GTl8xIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV8yLCAJCUtFWV9GTl8yIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9ELAkJCUtFWV9GTl9EIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9FLAkJCUtFWV9GTl9FIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9GLAkJCUtFWV9GTl9GIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9TLAkJCUtFWV9GTl9TIH0sCgl7IFNPTllQSV9FVkVOVF9GTktFWV9CLAkJCUtFWV9GTl9CIH0sCgl7IFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfUFJFU1NFRCwgCUtFWV9CTFVFIH0sCgl7IFNPTllQSV9FVkVOVF9CTFVFVE9PVEhfT04sIAkJS0VZX0JMVUUgfSwKCXsgU09OWVBJX0VWRU5UX1BLRVlfUDEsIAkJS0VZX1BST0cxIH0sCgl7IFNPTllQSV9FVkVOVF9QS0VZX1AyLCAJCUtFWV9QUk9HMiB9LAoJeyBTT05ZUElfRVZFTlRfUEtFWV9QMywgCQlLRVlfUFJPRzMgfSwKCXsgU09OWVBJX0VWRU5UX0JBQ0tfUFJFU1NFRCwgCQlLRVlfQkFDSyB9LAoJeyBTT05ZUElfRVZFTlRfSEVMUF9QUkVTU0VELCAJCUtFWV9IRUxQIH0sCgl7IFNPTllQSV9FVkVOVF9aT09NX1BSRVNTRUQsIAkJS0VZX1pPT00gfSwKCXsgU09OWVBJX0VWRU5UX1RIVU1CUEhSQVNFX1BSRVNTRUQsIAlCVE5fVEhVTUIgfSwKCXsgMCwgMCB9LAp9OwoKc3RydWN0IHNvbnlwaV9rZXlwcmVzcyB7CglzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7CglpbnQga2V5Owp9OwoKc3RhdGljIHN0cnVjdCBzb255cGlfZGV2aWNlIHsKCXN0cnVjdCBwY2lfZGV2ICpkZXY7CglzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwoJdTE2IGlycTsKCXUxNiBiaXRzOwoJdTE2IGlvcG9ydDE7Cgl1MTYgaW9wb3J0MjsKCXUxNiByZWdpb25fc2l6ZTsKCXUxNiBldnR5cGVfb2Zmc2V0OwoJaW50IGNhbWVyYV9wb3dlcjsKCWludCBibHVldG9vdGhfcG93ZXI7CglzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CglzdHJ1Y3Qga2ZpZm8gKmZpZm87CglzcGlubG9ja190IGZpZm9fbG9jazsKCXdhaXRfcXVldWVfaGVhZF90IGZpZm9fcHJvY19saXN0OwoJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmZpZm9fYXN5bmM7CglpbnQgb3Blbl9jb3VudDsKCWludCBtb2RlbDsKCXN0cnVjdCBpbnB1dF9kZXYgaW5wdXRfam9nX2RldjsKCXN0cnVjdCBpbnB1dF9kZXYgaW5wdXRfa2V5X2RldjsKCXN0cnVjdCB3b3JrX3N0cnVjdCBpbnB1dF93b3JrOwoJc3RydWN0IGtmaWZvICppbnB1dF9maWZvOwoJc3BpbmxvY2tfdCBpbnB1dF9maWZvX2xvY2s7Cn0gc29ueXBpX2RldmljZTsKCiNkZWZpbmUgSVRFUkFUSU9OU19MT05HCQkxMDAwMAojZGVmaW5lIElURVJBVElPTlNfU0hPUlQJMTAKCiNkZWZpbmUgd2FpdF9vbl9jb21tYW5kKHF1aWV0LCBjb21tYW5kLCBpdGVyYXRpb25zKSB7IFwKCXVuc2lnbmVkIGludCBuID0gaXRlcmF0aW9uczsgXAoJd2hpbGUgKC0tbiAmJiAoY29tbWFuZCkpIFwKCQl1ZGVsYXkoMSk7IFwKCWlmICghbiAmJiAodmVyYm9zZSB8fCAhcXVpZXQpKSBcCgkJcHJpbnRrKEtFUk5fV0FSTklORyAic29ueXBpIGNvbW1hbmQgZmFpbGVkIGF0ICVzIDogJXMgKGxpbmUgJWQpXG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKfQoKI2lmZGVmIENPTkZJR19BQ1BJCiNkZWZpbmUgU09OWVBJX0FDUElfQUNUSVZFICghYWNwaV9kaXNhYmxlZCkKI2Vsc2UKI2RlZmluZSBTT05ZUElfQUNQSV9BQ1RJVkUgMAojZW5kaWYJCQkJLyogQ09ORklHX0FDUEkgKi8KCnN0YXRpYyBpbnQgc29ueXBpX2VjX3dyaXRlKHU4IGFkZHIsIHU4IHZhbHVlKQp7CiNpZmRlZiBDT05GSUdfQUNQSV9FQwoJaWYgKFNPTllQSV9BQ1BJX0FDVElWRSkKCQlyZXR1cm4gZWNfd3JpdGUoYWRkciwgdmFsdWUpOwojZW5kaWYKCXdhaXRfb25fY29tbWFuZCgxLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAzLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yl9wKDB4ODEsIFNPTllQSV9DU1RfSU9QT1JUKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yl9wKGFkZHIsIFNPTllQSV9EQVRBX0lPUE9SVCk7Cgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3AoU09OWVBJX0NTVF9JT1BPUlQpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGJfcCh2YWx1ZSwgU09OWVBJX0RBVEFfSU9QT1JUKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc29ueXBpX2VjX3JlYWQodTggYWRkciwgdTggKnZhbHVlKQp7CiNpZmRlZiBDT05GSUdfQUNQSV9FQwoJaWYgKFNPTllQSV9BQ1BJX0FDVElWRSkKCQlyZXR1cm4gZWNfcmVhZChhZGRyLCB2YWx1ZSk7CiNlbmRpZgoJd2FpdF9vbl9jb21tYW5kKDEsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDMsIElURVJBVElPTlNfTE9ORyk7CglvdXRiX3AoMHg4MCwgU09OWVBJX0NTVF9JT1BPUlQpOwoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKFNPTllQSV9DU1RfSU9QT1JUKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiX3AoYWRkciwgU09OWVBJX0RBVEFfSU9QT1JUKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChTT05ZUElfQ1NUX0lPUE9SVCkgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJKnZhbHVlID0gaW5iX3AoU09OWVBJX0RBVEFfSU9QT1JUKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGVjX3JlYWQxNih1OCBhZGRyLCB1MTYgKnZhbHVlKQp7Cgl1OCB2YWxfbGIsIHZhbF9oYjsKCWlmIChzb255cGlfZWNfcmVhZChhZGRyLCAmdmFsX2xiKSkKCQlyZXR1cm4gLTE7CglpZiAoc29ueXBpX2VjX3JlYWQoYWRkciArIDEsICZ2YWxfaGIpKQoJCXJldHVybiAtMTsKCSp2YWx1ZSA9IHZhbF9sYiB8ICh2YWxfaGIgPDwgOCk7CglyZXR1cm4gMDsKfQoKLyogSW5pdGlhbGl6ZXMgdGhlIGRldmljZSAtIHRoaXMgY29tZXMgZnJvbSB0aGUgQU1MIGNvZGUgaW4gdGhlIEFDUEkgYmlvcyAqLwpzdGF0aWMgdm9pZCBzb255cGlfdHlwZTFfc3JzKHZvaWQpCnsKCXUzMiB2OwoKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsICZ2KTsKCXYgPSAodiAmIDB4RkZGRjAwMDApIHwgKCh1MzIpIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgdik7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgJnYpOwoJdiA9ICh2ICYgMHhGRkYwRkZGRikgfAoJICAgICgoKHUzMikgc29ueXBpX2RldmljZS5pb3BvcnQxIF4gc29ueXBpX2RldmljZS5pb3BvcnQyKSA8PCAxNik7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgdik7CgoJdiA9IGlubChTT05ZUElfSVJRX1BPUlQpOwoJdiAmPSB+KCgodTMyKSAweDMpIDw8IFNPTllQSV9JUlFfU0hJRlQpOwoJdiB8PSAoKCh1MzIpIHNvbnlwaV9kZXZpY2UuYml0cykgPDwgU09OWVBJX0lSUV9TSElGVCk7CglvdXRsKHYsIFNPTllQSV9JUlFfUE9SVCk7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgJnYpOwoJdiA9ICh2ICYgMHhGRjFGRkZGRikgfCAweDAwQzAwMDAwOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsIHYpOwp9CgpzdGF0aWMgdm9pZCBzb255cGlfdHlwZTJfc3JzKHZvaWQpCnsKCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX1NISUIsIChzb255cGlfZGV2aWNlLmlvcG9ydDEgJiAweEZGMDApID4+IDgpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7CglpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TTE9CLCBzb255cGlfZGV2aWNlLmlvcG9ydDEgJiAweDAwRkYpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7CglpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TSVJRLCBzb255cGlfZGV2aWNlLmJpdHMpKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7Cgl1ZGVsYXkoMTApOwp9CgpzdGF0aWMgdm9pZCBzb255cGlfdHlwZTNfc3JzKHZvaWQpCnsKCXUxNiB2MTY7Cgl1OCAgdjg7CgoJLyogVGhpcyBtb2RlbCB0eXBlIHVzZXMgdGhlIHNhbWUgaW5pdGlhbGlhemF0aW9uIG9mCgkgKiB0aGUgZW1iZWRkZWQgY29udHJvbGxlciBhcyB0aGUgdHlwZTIgbW9kZWxzLiAqLwoJc29ueXBpX3R5cGUyX3NycygpOwoKCS8qIEluaXRpYWxpemF0aW9uIG9mIFBDSSBjb25maWcgc3BhY2Ugb2YgdGhlIExQQyBpbnRlcmZhY2UgYnJpZGdlLiAqLwoJdjE2ID0gKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSAmIDB4RkZGMCkgfCAweDAxOwoJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfVFlQRTNfR0lEMiwgdjE2KTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfVFlQRTNfTUlTQywgJnY4KTsKCXY4ID0gKHY4ICYgMHhDRikgfCAweDEwOwoJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfVFlQRTNfTUlTQywgdjgpOwp9CgovKiBEaXNhYmxlcyB0aGUgZGV2aWNlIC0gdGhpcyBjb21lcyBmcm9tIHRoZSBBTUwgY29kZSBpbiB0aGUgQUNQSSBiaW9zICovCnN0YXRpYyB2b2lkIHNvbnlwaV90eXBlMV9kaXModm9pZCkKewoJdTMyIHY7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNvbnlwaV9kZXZpY2UuZGV2LCBTT05ZUElfRzEwQSwgJnYpOwoJdiA9IHYgJiAweEZGM0ZGRkZGOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX0cxMEEsIHYpOwoKCXYgPSBpbmwoU09OWVBJX0lSUV9QT1JUKTsKCXYgfD0gKDB4MyA8PCBTT05ZUElfSVJRX1NISUZUKTsKCW91dGwodiwgU09OWVBJX0lSUV9QT1JUKTsKfQoKc3RhdGljIHZvaWQgc29ueXBpX3R5cGUyX2Rpcyh2b2lkKQp7CglpZiAoc29ueXBpX2VjX3dyaXRlKFNPTllQSV9TSElCLCAwKSkKCQlwcmludGsoS0VSTl9XQVJOSU5HICJlY193cml0ZSBmYWlsZWRcbiIpOwoJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfU0xPQiwgMCkpCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWNfd3JpdGUgZmFpbGVkXG4iKTsKCWlmIChzb255cGlfZWNfd3JpdGUoU09OWVBJX1NJUlEsIDApKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgImVjX3dyaXRlIGZhaWxlZFxuIik7Cn0KCnN0YXRpYyB2b2lkIHNvbnlwaV90eXBlM19kaXModm9pZCkKewoJc29ueXBpX3R5cGUyX2RpcygpOwoJdWRlbGF5KDEwKTsKCXBjaV93cml0ZV9jb25maWdfd29yZChzb255cGlfZGV2aWNlLmRldiwgU09OWVBJX1RZUEUzX0dJRDIsIDApOwp9CgpzdGF0aWMgdTggc29ueXBpX2NhbGwxKHU4IGRldikKewoJdTggdjEsIHYyOwoKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZGV2LCBzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoJdjEgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoJdjIgPSBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDEpOwoJcmV0dXJuIHYyOwp9CgpzdGF0aWMgdTggc29ueXBpX2NhbGwyKHU4IGRldiwgdTggZm4pCnsKCXU4IHYxOwoKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZGV2LCBzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoJd2FpdF9vbl9jb21tYW5kKDAsIGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MikgJiAyLCBJVEVSQVRJT05TX0xPTkcpOwoJb3V0Yihmbiwgc29ueXBpX2RldmljZS5pb3BvcnQxKTsKCXYxID0gaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQxKTsKCXJldHVybiB2MTsKfQoKc3RhdGljIHU4IHNvbnlwaV9jYWxsMyh1OCBkZXYsIHU4IGZuLCB1OCB2KQp7Cgl1OCB2MTsKCgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQyKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiKGRldiwgc29ueXBpX2RldmljZS5pb3BvcnQyKTsKCXdhaXRfb25fY29tbWFuZCgwLCBpbmJfcChzb255cGlfZGV2aWNlLmlvcG9ydDIpICYgMiwgSVRFUkFUSU9OU19MT05HKTsKCW91dGIoZm4sIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7Cgl3YWl0X29uX2NvbW1hbmQoMCwgaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQyKSAmIDIsIElURVJBVElPTlNfTE9ORyk7CglvdXRiKHYsIHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7Cgl2MSA9IGluYl9wKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSk7CglyZXR1cm4gdjE7Cn0KCiNpZiAwCi8qIEdldCBicmlnaHRuZXNzLCBodWUgZXRjLiBVbnJlbGlhYmxlLi4uICovCnN0YXRpYyB1OCBzb255cGlfcmVhZCh1OCBmbikKewoJdTggdjEsIHYyOwoJaW50IG4gPSAxMDA7CgoJd2hpbGUgKG4tLSkgewoJCXYxID0gc29ueXBpX2NhbGwyKDB4OGYsIGZuKTsKCQl2MiA9IHNvbnlwaV9jYWxsMigweDhmLCBmbik7CgkJaWYgKHYxID09IHYyICYmIHYxICE9IDB4ZmYpCgkJCXJldHVybiB2MTsKCX0KCXJldHVybiAweGZmOwp9CiNlbmRpZgoKLyogU2V0IGJyaWdodG5lc3MsIGh1ZSBldGMgKi8Kc3RhdGljIHZvaWQgc29ueXBpX3NldCh1OCBmbiwgdTggdikKewoJd2FpdF9vbl9jb21tYW5kKDAsIHNvbnlwaV9jYWxsMygweDkwLCBmbiwgdiksIElURVJBVElPTlNfU0hPUlQpOwp9CgovKiBUZXN0cyBpZiB0aGUgY2FtZXJhIGlzIHJlYWR5ICovCnN0YXRpYyBpbnQgc29ueXBpX2NhbWVyYV9yZWFkeSh2b2lkKQp7Cgl1OCB2OwoKCXYgPSBzb255cGlfY2FsbDIoMHg4ZiwgU09OWVBJX0NBTUVSQV9TVEFUVVMpOwoJcmV0dXJuICh2ICE9IDB4ZmYgJiYgKHYgJiBTT05ZUElfQ0FNRVJBX1NUQVRVU19SRUFEWSkpOwp9CgovKiBUdXJucyB0aGUgY2FtZXJhIG9mZiAqLwpzdGF0aWMgdm9pZCBzb255cGlfY2FtZXJhX29mZih2b2lkKQp7Cglzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfUElDVFVSRSwgU09OWVBJX0NBTUVSQV9NVVRFX01BU0spOwoKCWlmICghc29ueXBpX2RldmljZS5jYW1lcmFfcG93ZXIpCgkJcmV0dXJuOwoKCXNvbnlwaV9jYWxsMigweDkxLCAwKTsKCXNvbnlwaV9kZXZpY2UuY2FtZXJhX3Bvd2VyID0gMDsKfQoKLyogVHVybnMgdGhlIGNhbWVyYSBvbiAqLwpzdGF0aWMgdm9pZCBzb255cGlfY2FtZXJhX29uKHZvaWQpCnsKCWludCBpLCBqOwoKCWlmIChzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlcikKCQlyZXR1cm47CgoJZm9yIChqID0gNTsgaiA+IDA7IGotLSkgewoKCQl3aGlsZSAoc29ueXBpX2NhbGwyKDB4OTEsIDB4MSkpCgkJCW1zbGVlcCgxMCk7CgkJc29ueXBpX2NhbGwxKDB4OTMpOwoKCQlmb3IgKGkgPSA0MDA7IGkgPiAwOyBpLS0pIHsKCQkJaWYgKHNvbnlwaV9jYW1lcmFfcmVhZHkoKSkKCQkJCWJyZWFrOwoJCQltc2xlZXAoMTApOwoJCX0KCQlpZiAoaSkKCQkJYnJlYWs7Cgl9CgoJaWYgKGogPT0gMCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgInNvbnlwaTogZmFpbGVkIHRvIHBvd2VyIG9uIGNhbWVyYVxuIik7CgkJcmV0dXJuOwoJfQoKCXNvbnlwaV9zZXQoMHgxMCwgMHg1YSk7Cglzb255cGlfZGV2aWNlLmNhbWVyYV9wb3dlciA9IDE7Cn0KCi8qIHNldHMgdGhlIGJsdWV0b290aCBzdWJzeXN0ZW0gcG93ZXIgc3RhdGUgKi8Kc3RhdGljIHZvaWQgc29ueXBpX3NldGJsdWV0b290aHBvd2VyKHU4IHN0YXRlKQp7CglzdGF0ZSA9ICEhc3RhdGU7CgoJaWYgKHNvbnlwaV9kZXZpY2UuYmx1ZXRvb3RoX3Bvd2VyID09IHN0YXRlKQoJCXJldHVybjsKCglzb255cGlfY2FsbDIoMHg5Niwgc3RhdGUpOwoJc29ueXBpX2NhbGwxKDB4ODIpOwoJc29ueXBpX2RldmljZS5ibHVldG9vdGhfcG93ZXIgPSBzdGF0ZTsKfQoKc3RhdGljIHZvaWQgaW5wdXRfa2V5cmVsZWFzZSh2b2lkICpkYXRhKQp7CglzdHJ1Y3Qgc29ueXBpX2tleXByZXNzIGtwOwoKCXdoaWxlIChrZmlmb19nZXQoc29ueXBpX2RldmljZS5pbnB1dF9maWZvLCAodW5zaWduZWQgY2hhciAqKSZrcCwKCQkJIHNpemVvZihrcCkpID09IHNpemVvZihrcCkpIHsKCQltc2xlZXAoMTApOwoJCWlucHV0X3JlcG9ydF9rZXkoa3AuZGV2LCBrcC5rZXksIDApOwoJCWlucHV0X3N5bmMoa3AuZGV2KTsKCX0KfQoKc3RhdGljIHZvaWQgc29ueXBpX3JlcG9ydF9pbnB1dF9ldmVudCh1OCBldmVudCkKewoJc3RydWN0IGlucHV0X2RldiAqam9nX2RldiA9ICZzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXY7CglzdHJ1Y3QgaW5wdXRfZGV2ICprZXlfZGV2ID0gJnNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2RldjsKCXN0cnVjdCBzb255cGlfa2V5cHJlc3Mga3AgPSB7IE5VTEwgfTsKCWludCBpOwoKCXN3aXRjaCAoZXZlbnQpIHsKCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfVVA6CgljYXNlIFNPTllQSV9FVkVOVF9KT0dESUFMX1VQX1BSRVNTRUQ6CgkJaW5wdXRfcmVwb3J0X3JlbChqb2dfZGV2LCBSRUxfV0hFRUwsIDEpOwoJCWlucHV0X3N5bmMoam9nX2Rldik7CgkJYnJlYWs7CgoJY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOOgoJY2FzZSBTT05ZUElfRVZFTlRfSk9HRElBTF9ET1dOX1BSRVNTRUQ6CgkJaW5wdXRfcmVwb3J0X3JlbChqb2dfZGV2LCBSRUxfV0hFRUwsIC0xKTsKCQlpbnB1dF9zeW5jKGpvZ19kZXYpOwoJCWJyZWFrOwoKCWNhc2UgU09OWVBJX0VWRU5UX0pPR0RJQUxfUFJFU1NFRDoKCQlrcC5rZXkgPSBCVE5fTUlERExFOwoJCWtwLmRldiA9IGpvZ19kZXY7CgkJYnJlYWs7CgoJY2FzZSBTT05ZUElfRVZFTlRfRk5LRVlfUkVMRUFTRUQ6CgkJLyogTm90aGluZywgbm90IGFsbCBWQUlPcyBnZW5lcmF0ZSB0aGlzIGV2ZW50ICovCgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlmb3IgKGkgPSAwOyBzb255cGlfaW5wdXRrZXlzW2ldLnNvbnlwaWV2OyBpKyspCgkJCWlmIChldmVudCA9PSBzb255cGlfaW5wdXRrZXlzW2ldLnNvbnlwaWV2KSB7CgkJCQlrcC5kZXYgPSBrZXlfZGV2OwoJCQkJa3Aua2V5ID0gc29ueXBpX2lucHV0a2V5c1tpXS5pbnB1dGV2OwoJCQkJYnJlYWs7CgkJCX0KCQlicmVhazsKCX0KCglpZiAoa3AuZGV2KSB7CgkJaW5wdXRfcmVwb3J0X2tleShrcC5kZXYsIGtwLmtleSwgMSk7CgkJaW5wdXRfc3luYyhrcC5kZXYpOwoJCWtmaWZvX3B1dChzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8sCgkJCSAgKHVuc2lnbmVkIGNoYXIgKikma3AsIHNpemVvZihrcCkpOwoJCXNjaGVkdWxlX3dvcmsoJnNvbnlwaV9kZXZpY2UuaW5wdXRfd29yayk7Cgl9Cn0KCi8qIEludGVycnVwdCBoYW5kbGVyOiBzb21lIGV2ZW50IGlzIGF2YWlsYWJsZSAqLwpzdGF0aWMgaXJxcmV0dXJuX3Qgc29ueXBpX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQp7Cgl1OCB2MSwgdjIsIGV2ZW50ID0gMDsKCWludCBpLCBqOwoKCXYxID0gaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQxKTsKCXYyID0gaW5iX3Aoc29ueXBpX2RldmljZS5pb3BvcnQxICsgc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0KTsKCglmb3IgKGkgPSAwOyBzb255cGlfZXZlbnR0eXBlc1tpXS5tb2RlbDsgaSsrKSB7CgkJaWYgKHNvbnlwaV9kZXZpY2UubW9kZWwgIT0gc29ueXBpX2V2ZW50dHlwZXNbaV0ubW9kZWwpCgkJCWNvbnRpbnVlOwoJCWlmICgodjIgJiBzb255cGlfZXZlbnR0eXBlc1tpXS5kYXRhKSAhPQoJCSAgICBzb255cGlfZXZlbnR0eXBlc1tpXS5kYXRhKQoJCQljb250aW51ZTsKCQlpZiAoIShtYXNrICYgc29ueXBpX2V2ZW50dHlwZXNbaV0ubWFzaykpCgkJCWNvbnRpbnVlOwoJCWZvciAoaiA9IDA7IHNvbnlwaV9ldmVudHR5cGVzW2ldLmV2ZW50c1tqXS5ldmVudDsgaisrKSB7CgkJCWlmICh2MSA9PSBzb255cGlfZXZlbnR0eXBlc1tpXS5ldmVudHNbal0uZGF0YSkgewoJCQkJZXZlbnQgPSBzb255cGlfZXZlbnR0eXBlc1tpXS5ldmVudHNbal0uZXZlbnQ7CgkJCQlnb3RvIGZvdW5kOwoJCQl9CgkJfQoJfQoKCWlmICh2ZXJib3NlKQoJCXByaW50ayhLRVJOX1dBUk5JTkcKCQkgICAgICAgInNvbnlwaTogdW5rbm93biBldmVudCBwb3J0MT0weCUwMngscG9ydDI9MHglMDJ4XG4iLAoJCSAgICAgICB2MSwgdjIpOwoJLyogV2UgbmVlZCB0byByZXR1cm4gSVJRX0hBTkRMRUQgaGVyZSBiZWNhdXNlIHRoZXJlICphcmUqCgkgKiBldmVudHMgYmVsb25naW5nIHRvIHRoZSBzb255cGkgZGV2aWNlIHdlIGRvbid0IGtub3cgYWJvdXQsCgkgKiBidXQgd2Ugc3RpbGwgZG9uJ3Qgd2FudCB0aG9zZSB0byBwb2xsdXRlIHRoZSBsb2dzLi4uICovCglyZXR1cm4gSVJRX0hBTkRMRUQ7Cgpmb3VuZDoKCWlmICh2ZXJib3NlID4gMSkKCQlwcmludGsoS0VSTl9JTkZPCgkJICAgICAgICJzb255cGk6IGV2ZW50IHBvcnQxPTB4JTAyeCxwb3J0Mj0weCUwMnhcbiIsIHYxLCB2Mik7CgoJaWYgKHVzZWlucHV0KQoJCXNvbnlwaV9yZXBvcnRfaW5wdXRfZXZlbnQoZXZlbnQpOwoKCWtmaWZvX3B1dChzb255cGlfZGV2aWNlLmZpZm8sICh1bnNpZ25lZCBjaGFyICopJmV2ZW50LCBzaXplb2YoZXZlbnQpKTsKCWtpbGxfZmFzeW5jKCZzb255cGlfZGV2aWNlLmZpZm9fYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc29ueXBpX2RldmljZS5maWZvX3Byb2NfbGlzdCk7CgoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgovKiBFeHRlcm5hbCBjYW1lcmEgY29tbWFuZCAoZXhwb3J0ZWQgdG8gdGhlIG1vdGlvbiBleWUgdjRsIGRyaXZlcikgKi8KaW50IHNvbnlwaV9jYW1lcmFfY29tbWFuZChpbnQgY29tbWFuZCwgdTggdmFsdWUpCnsKCWlmICghY2FtZXJhKQoJCXJldHVybiAtRUlPOwoKCWRvd24oJnNvbnlwaV9kZXZpY2UubG9jayk7CgoJc3dpdGNoIChjb21tYW5kKSB7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQToKCQlpZiAodmFsdWUpCgkJCXNvbnlwaV9jYW1lcmFfb24oKTsKCQllbHNlCgkJCXNvbnlwaV9jYW1lcmFfb2ZmKCk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUJSSUdIVE5FU1M6CgkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0JSSUdIVE5FU1MsIHZhbHVlKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0NPTU1BTkRfU0VUQ0FNRVJBQ09OVFJBU1Q6CgkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX0NPTlRSQVNULCB2YWx1ZSk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUhVRToKCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfSFVFLCB2YWx1ZSk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUNPTE9SOgoJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9DT0xPUiwgdmFsdWUpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFTSEFSUE5FU1M6CgkJc29ueXBpX3NldChTT05ZUElfQ0FNRVJBX1NIQVJQTkVTUywgdmFsdWUpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfQ09NTUFORF9TRVRDQU1FUkFQSUNUVVJFOgoJCXNvbnlwaV9zZXQoU09OWVBJX0NBTUVSQV9QSUNUVVJFLCB2YWx1ZSk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9DT01NQU5EX1NFVENBTUVSQUFHQzoKCQlzb255cGlfc2V0KFNPTllQSV9DQU1FUkFfQUdDLCB2YWx1ZSk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBzb255cGlfY2FtZXJhX2NvbW1hbmQgaW52YWxpZDogJWRcbiIsCgkJICAgICAgIGNvbW1hbmQpOwoJCWJyZWFrOwoJfQoJdXAoJnNvbnlwaV9kZXZpY2UubG9jayk7CglyZXR1cm4gMDsKfQoKRVhQT1JUX1NZTUJPTChzb255cGlfY2FtZXJhX2NvbW1hbmQpOwoKc3RhdGljIGludCBzb255cGlfbWlzY19mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQp7CglpbnQgcmV0dmFsOwoKCXJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCAmc29ueXBpX2RldmljZS5maWZvX2FzeW5jKTsKCWlmIChyZXR2YWwgPCAwKQoJCXJldHVybiByZXR2YWw7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzb255cGlfbWlzY19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7Cglzb255cGlfbWlzY19mYXN5bmMoLTEsIGZpbGUsIDApOwoJZG93bigmc29ueXBpX2RldmljZS5sb2NrKTsKCXNvbnlwaV9kZXZpY2Uub3Blbl9jb3VudC0tOwoJdXAoJnNvbnlwaV9kZXZpY2UubG9jayk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzb255cGlfbWlzY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7Cglkb3duKCZzb255cGlfZGV2aWNlLmxvY2spOwoJLyogRmx1c2ggaW5wdXQgcXVldWUgb24gZmlyc3Qgb3BlbiAqLwoJaWYgKCFzb255cGlfZGV2aWNlLm9wZW5fY291bnQpCgkJa2ZpZm9fcmVzZXQoc29ueXBpX2RldmljZS5maWZvKTsKCXNvbnlwaV9kZXZpY2Uub3Blbl9jb3VudCsrOwoJdXAoJnNvbnlwaV9kZXZpY2UubG9jayk7CglyZXR1cm4gMDsKfQoKc3RhdGljIHNzaXplX3Qgc29ueXBpX21pc2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCnsKCXNzaXplX3QgcmV0OwoJdW5zaWduZWQgY2hhciBjOwoKCWlmICgoa2ZpZm9fbGVuKHNvbnlwaV9kZXZpY2UuZmlmbykgPT0gMCkgJiYKCSAgICAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQoJCXJldHVybiAtRUFHQUlOOwoKCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzb255cGlfZGV2aWNlLmZpZm9fcHJvY19saXN0LAoJCQkJICAgICAgIGtmaWZvX2xlbihzb255cGlfZGV2aWNlLmZpZm8pICE9IDApOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoKCXdoaWxlIChyZXQgPCBjb3VudCAmJgoJICAgICAgIChrZmlmb19nZXQoc29ueXBpX2RldmljZS5maWZvLCAmYywgc2l6ZW9mKGMpKSA9PSBzaXplb2YoYykpKSB7CgkJaWYgKHB1dF91c2VyKGMsIGJ1ZisrKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJcmV0Kys7Cgl9CgoJaWYgKHJldCA+IDApIHsKCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CgkJaW5vZGUtPmlfYXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwoJfQoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyB1bnNpZ25lZCBpbnQgc29ueXBpX21pc2NfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKewoJcG9sbF93YWl0KGZpbGUsICZzb255cGlfZGV2aWNlLmZpZm9fcHJvY19saXN0LCB3YWl0KTsKCWlmIChrZmlmb19sZW4oc29ueXBpX2RldmljZS5maWZvKSkKCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNvbnlwaV9taXNjX2lvY3RsKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBmaWxlICpmcCwKCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJaW50IHJldCA9IDA7Cgl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKCXU4IHZhbDg7Cgl1MTYgdmFsMTY7CgoJZG93bigmc29ueXBpX2RldmljZS5sb2NrKTsKCXN3aXRjaCAoY21kKSB7CgljYXNlIFNPTllQSV9JT0NHQlJUOgoJCWlmIChzb255cGlfZWNfcmVhZChTT05ZUElfTENEX0xJR0hULCAmdmFsOCkpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NTQlJUOgoJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsOCwgYXJncCwgc2l6ZW9mKHZhbDgpKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfTENEX0xJR0hULCB2YWw4KSkKCQkJcmV0ID0gLUVJTzsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ0dCQVQxQ0FQOgoJCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDFfRlVMTCwgJnZhbDE2KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DR0JBVDFSRU06CgkJaWYgKGVjX3JlYWQxNihTT05ZUElfQkFUMV9MRUZULCAmdmFsMTYpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWwxNiwgc2l6ZW9mKHZhbDE2KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NHQkFUMkNBUDoKCQlpZiAoZWNfcmVhZDE2KFNPTllQSV9CQVQyX0ZVTEwsICZ2YWwxNikpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDE2LCBzaXplb2YodmFsMTYpKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgU09OWVBJX0lPQ0dCQVQyUkVNOgoJCWlmIChlY19yZWFkMTYoU09OWVBJX0JBVDJfTEVGVCwgJnZhbDE2KSkgewoJCQlyZXQgPSAtRUlPOwoJCQlicmVhazsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsMTYsIHNpemVvZih2YWwxNikpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DR0JBVEZMQUdTOgoJCWlmIChzb255cGlfZWNfcmVhZChTT05ZUElfQkFUX0ZMQUdTLCAmdmFsOCkpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCXZhbDggJj0gMHgwNzsKCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfSU9DR0JMVUU6CgkJdmFsOCA9IHNvbnlwaV9kZXZpY2UuYmx1ZXRvb3RoX3Bvd2VyOwoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NTQkxVRToKCQlpZiAoY29weV9mcm9tX3VzZXIoJnZhbDgsIGFyZ3AsIHNpemVvZih2YWw4KSkpIHsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCXNvbnlwaV9zZXRibHVldG9vdGhwb3dlcih2YWw4KTsKCQlicmVhazsKCS8qIEZBTiBDb250cm9scyAqLwoJY2FzZSBTT05ZUElfSU9DR0ZBTjoKCQlpZiAoc29ueXBpX2VjX3JlYWQoU09OWVBJX0ZBTjBfU1RBVFVTLCAmdmFsOCkpIHsKCQkJcmV0ID0gLUVJTzsKCQkJYnJlYWs7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbDgsIHNpemVvZih2YWw4KSkpCgkJCXJldCA9IC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9JT0NTRkFOOgoJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsOCwgYXJncCwgc2l6ZW9mKHZhbDgpKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKHNvbnlwaV9lY193cml0ZShTT05ZUElfRkFOMF9TVEFUVVMsIHZhbDgpKQoJCQlyZXQgPSAtRUlPOwoJCWJyZWFrOwoJLyogR0VUIFRlbXBlcmF0dXJlICh1c2VmdWwgdW5kZXIgQVBNKSAqLwoJY2FzZSBTT05ZUElfSU9DR1RFTVA6CgkJaWYgKHNvbnlwaV9lY19yZWFkKFNPTllQSV9URU1QX1NUQVRVUywgJnZhbDgpKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ2YWw4LCBzaXplb2YodmFsOCkpKQoJCQlyZXQgPSAtRUZBVUxUOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXQgPSAtRUlOVkFMOwoJfQoJdXAoJnNvbnlwaV9kZXZpY2UubG9jayk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzb255cGlfbWlzY19mb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLnJlYWQJCT0gc29ueXBpX21pc2NfcmVhZCwKCS5wb2xsCQk9IHNvbnlwaV9taXNjX3BvbGwsCgkub3BlbgkJPSBzb255cGlfbWlzY19vcGVuLAoJLnJlbGVhc2UJPSBzb255cGlfbWlzY19yZWxlYXNlLAoJLmZhc3luYwkJPSBzb255cGlfbWlzY19mYXN5bmMsCgkuaW9jdGwJCT0gc29ueXBpX21pc2NfaW9jdGwsCn07CgpzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugc29ueXBpX21pc2NfZGV2aWNlID0gewoJLm1pbm9yCQk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKCS5uYW1lCQk9ICJzb255cGkiLAoJLmZvcHMJCT0gJnNvbnlwaV9taXNjX2ZvcHMsCn07CgpzdGF0aWMgdm9pZCBzb255cGlfZW5hYmxlKHVuc2lnbmVkIGludCBjYW1lcmFfb24pCnsKCXN3aXRjaCAoc29ueXBpX2RldmljZS5tb2RlbCkgewoJY2FzZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUxOgoJCXNvbnlwaV90eXBlMV9zcnMoKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMjoKCQlzb255cGlfdHlwZTJfc3JzKCk7CgkJYnJlYWs7CgljYXNlIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTM6CgkJc29ueXBpX3R5cGUzX3NycygpOwoJCWJyZWFrOwoJfQoKCXNvbnlwaV9jYWxsMSgweDgyKTsKCXNvbnlwaV9jYWxsMigweDgxLCAweGZmKTsKCXNvbnlwaV9jYWxsMShjb21wYXQgPyAweDkyIDogMHg4Mik7CgoJLyogRW5hYmxlIEFDUEkgbW9kZSB0byBnZXQgRm4ga2V5IGV2ZW50cyAqLwoJaWYgKCFTT05ZUElfQUNQSV9BQ1RJVkUgJiYgZm5rZXlpbml0KQoJCW91dGIoMHhmMCwgMHhiMik7CgoJaWYgKGNhbWVyYSAmJiBjYW1lcmFfb24pCgkJc29ueXBpX2NhbWVyYV9vbigpOwp9CgpzdGF0aWMgaW50IHNvbnlwaV9kaXNhYmxlKHZvaWQpCnsKCXNvbnlwaV9jYWxsMigweDgxLCAwKTsJLyogbWFrZSBzdXJlIHdlIGRvbid0IGdldCBhbnkgbW9yZSBldmVudHMgKi8KCWlmIChjYW1lcmEpCgkJc29ueXBpX2NhbWVyYV9vZmYoKTsKCgkvKiBkaXNhYmxlIEFDUEkgbW9kZSAqLwoJaWYgKCFTT05ZUElfQUNQSV9BQ1RJVkUgJiYgZm5rZXlpbml0KQoJCW91dGIoMHhmMSwgMHhiMik7CgoJc3dpdGNoIChzb255cGlfZGV2aWNlLm1vZGVsKSB7CgljYXNlIFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTE6CgkJc29ueXBpX3R5cGUxX2RpcygpOwoJCWJyZWFrOwoJY2FzZSBTT05ZUElfREVWSUNFX01PREVMX1RZUEUyOgoJCXNvbnlwaV90eXBlMl9kaXMoKTsKCQlicmVhazsKCWNhc2UgU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMzoKCQlzb255cGlfdHlwZTNfZGlzKCk7CgkJYnJlYWs7Cgl9CgoJcmV0dXJuIDA7Cn0KCiNpZmRlZiBDT05GSUdfUE0Kc3RhdGljIGludCBvbGRfY2FtZXJhX3Bvd2VyOwoKc3RhdGljIGludCBzb255cGlfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgdTMyIGxldmVsKQp7CglpZiAobGV2ZWwgPT0gU1VTUEVORF9ESVNBQkxFKSB7CgkJb2xkX2NhbWVyYV9wb3dlciA9IHNvbnlwaV9kZXZpY2UuY2FtZXJhX3Bvd2VyOwoJCXNvbnlwaV9kaXNhYmxlKCk7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzb255cGlfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGxldmVsKQp7CglpZiAobGV2ZWwgPT0gUkVTVU1FX0VOQUJMRSkKCQlzb255cGlfZW5hYmxlKG9sZF9jYW1lcmFfcG93ZXIpOwoJcmV0dXJuIDA7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBzb255cGlfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQp7Cglzb255cGlfZGlzYWJsZSgpOwp9CgpzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgc29ueXBpX2RyaXZlciA9IHsKCS5uYW1lCQk9ICJzb255cGkiLAoJLmJ1cwkJPSAmcGxhdGZvcm1fYnVzX3R5cGUsCiNpZmRlZiBDT05GSUdfUE0KCS5zdXNwZW5kCT0gc29ueXBpX3N1c3BlbmQsCgkucmVzdW1lCQk9IHNvbnlwaV9yZXN1bWUsCiNlbmRpZgoJLnNodXRkb3duCT0gc29ueXBpX3NodXRkb3duLAp9OwoKc3RhdGljIGludCBfX2RldmluaXQgc29ueXBpX3Byb2JlKHZvaWQpCnsKCWludCBpLCByZXQ7CglzdHJ1Y3Qgc29ueXBpX2lvcG9ydF9saXN0ICppb3BvcnRfbGlzdDsKCXN0cnVjdCBzb255cGlfaXJxX2xpc3QgKmlycV9saXN0OwoJc3RydWN0IHBjaV9kZXYgKnBjaWRldjsKCglpZiAoKHBjaWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfSU5URUwsCgkJCQkgICAgIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zLCBOVUxMKSkpCgkJc29ueXBpX2RldmljZS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTE7CgllbHNlIGlmICgocGNpZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwKCQkJCQkgIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xLCBOVUxMKSkpCgkJc29ueXBpX2RldmljZS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTM7CgllbHNlCgkJc29ueXBpX2RldmljZS5tb2RlbCA9IFNPTllQSV9ERVZJQ0VfTU9ERUxfVFlQRTI7CgoJc29ueXBpX2RldmljZS5kZXYgPSBwY2lkZXY7CgoJc3Bpbl9sb2NrX2luaXQoJnNvbnlwaV9kZXZpY2UuZmlmb19sb2NrKTsKCXNvbnlwaV9kZXZpY2UuZmlmbyA9IGtmaWZvX2FsbG9jKFNPTllQSV9CVUZfU0laRSwgR0ZQX0tFUk5FTCwKCQkJCQkgJnNvbnlwaV9kZXZpY2UuZmlmb19sb2NrKTsKCWlmIChJU19FUlIoc29ueXBpX2RldmljZS5maWZvKSkgewoJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBrZmlmb19hbGxvYyBmYWlsZWRcbiIpOwoJCXJldCA9IFBUUl9FUlIoc29ueXBpX2RldmljZS5maWZvKTsKCQlnb3RvIG91dF9maWZvOwoJfQoKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNvbnlwaV9kZXZpY2UuZmlmb19wcm9jX2xpc3QpOwoJaW5pdF9NVVRFWCgmc29ueXBpX2RldmljZS5sb2NrKTsKCXNvbnlwaV9kZXZpY2UuYmx1ZXRvb3RoX3Bvd2VyID0gLTE7CgoJaWYgKHBjaWRldiAmJiBwY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZFxuIik7CgkJcmV0ID0gLUVJTzsKCQlnb3RvIG91dF9wY2llbmFibGU7Cgl9CgoJaWYgKG1pbm9yICE9IC0xKQoJCXNvbnlwaV9taXNjX2RldmljZS5taW5vciA9IG1pbm9yOwoJaWYgKChyZXQgPSBtaXNjX3JlZ2lzdGVyKCZzb255cGlfbWlzY19kZXZpY2UpKSkgewoJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiBtaXNjX3JlZ2lzdGVyIGZhaWxlZFxuIik7CgkJZ290byBvdXRfbWlzY3JlZzsKCX0KCgoJaWYgKHNvbnlwaV9kZXZpY2UubW9kZWwgPT0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMSkgewoJCWlvcG9ydF9saXN0ID0gc29ueXBpX3R5cGUxX2lvcG9ydF9saXN0OwoJCXNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUgPSBTT05ZUElfVFlQRTFfUkVHSU9OX1NJWkU7CgkJc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0ID0gU09OWVBJX1RZUEUxX0VWVFlQRV9PRkZTRVQ7CgkJaXJxX2xpc3QgPSBzb255cGlfdHlwZTFfaXJxX2xpc3Q7Cgl9IGVsc2UgaWYgKHNvbnlwaV9kZXZpY2UubW9kZWwgPT0gU09OWVBJX0RFVklDRV9NT0RFTF9UWVBFMikgewoJCWlvcG9ydF9saXN0ID0gc29ueXBpX3R5cGUyX2lvcG9ydF9saXN0OwoJCXNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUgPSBTT05ZUElfVFlQRTJfUkVHSU9OX1NJWkU7CgkJc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0ID0gU09OWVBJX1RZUEUyX0VWVFlQRV9PRkZTRVQ7CgkJaXJxX2xpc3QgPSBzb255cGlfdHlwZTJfaXJxX2xpc3Q7Cgl9IGVsc2UgewoJCWlvcG9ydF9saXN0ID0gc29ueXBpX3R5cGUzX2lvcG9ydF9saXN0OwoJCXNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUgPSBTT05ZUElfVFlQRTNfUkVHSU9OX1NJWkU7CgkJc29ueXBpX2RldmljZS5ldnR5cGVfb2Zmc2V0ID0gU09OWVBJX1RZUEUzX0VWVFlQRV9PRkZTRVQ7CgkJaXJxX2xpc3QgPSBzb255cGlfdHlwZTNfaXJxX2xpc3Q7Cgl9CgoJZm9yIChpID0gMDsgaW9wb3J0X2xpc3RbaV0ucG9ydDE7IGkrKykgewoJCWlmIChyZXF1ZXN0X3JlZ2lvbihpb3BvcnRfbGlzdFtpXS5wb3J0MSwKCQkJCSAgIHNvbnlwaV9kZXZpY2UucmVnaW9uX3NpemUsCgkJCQkgICAiU29ueSBQcm9ncmFtYWJsZSBJL08gRGV2aWNlIikpIHsKCQkJLyogZ2V0IHRoZSBpb3BvcnQgKi8KCQkJc29ueXBpX2RldmljZS5pb3BvcnQxID0gaW9wb3J0X2xpc3RbaV0ucG9ydDE7CgkJCXNvbnlwaV9kZXZpY2UuaW9wb3J0MiA9IGlvcG9ydF9saXN0W2ldLnBvcnQyOwoJCQlicmVhazsKCQl9Cgl9CglpZiAoIXNvbnlwaV9kZXZpY2UuaW9wb3J0MSkgewoJCXByaW50ayhLRVJOX0VSUiAic29ueXBpOiByZXF1ZXN0X3JlZ2lvbiBmYWlsZWRcbiIpOwoJCXJldCA9IC1FTk9ERVY7CgkJZ290byBvdXRfcmVxcmVnOwoJfQoKCWZvciAoaSA9IDA7IGlycV9saXN0W2ldLmlycTsgaSsrKSB7CgoJCXNvbnlwaV9kZXZpY2UuaXJxID0gaXJxX2xpc3RbaV0uaXJxOwoJCXNvbnlwaV9kZXZpY2UuYml0cyA9IGlycV9saXN0W2ldLmJpdHM7CgoJCWlmICghcmVxdWVzdF9pcnEoc29ueXBpX2RldmljZS5pcnEsIHNvbnlwaV9pcnEsCgkJCQkgU0FfU0hJUlEsICJzb255cGkiLCBzb255cGlfaXJxKSkKCQkJYnJlYWs7Cgl9CgoJaWYgKCFpcnFfbGlzdFtpXS5pcnEpIHsKCQlwcmludGsoS0VSTl9FUlIgInNvbnlwaTogcmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKCQlyZXQgPSAtRU5PREVWOwoJCWdvdG8gb3V0X3JlcWlycTsKCX0KCglpZiAodXNlaW5wdXQpIHsKCQkvKiBJbml0aWFsaXplIHRoZSBJbnB1dCBEcml2ZXJzOiBqb2dkaWFsICovCgkJaW50IGk7CgkJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2LmV2Yml0WzBdID0KCQkJQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVMKTsKCQlzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYua2V5Yml0W0xPTkcoQlROX01PVVNFKV0gPQoJCQlCSVQoQlROX01JRERMRSk7CgkJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2LnJlbGJpdFswXSA9IEJJVChSRUxfV0hFRUwpOwoJCXNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5uYW1lID0gU09OWVBJX0pPR19JTlBVVE5BTUU7CgkJc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2LmlkLmJ1c3R5cGUgPSBCVVNfSVNBOwoJCXNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldi5pZC52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX1NPTlk7CgoJCWlucHV0X3JlZ2lzdGVyX2RldmljZSgmc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2KTsKCQlwcmludGsoS0VSTl9JTkZPICIlcyBpbnB1dCBtZXRob2QgaW5zdGFsbGVkLlxuIiwKCQkgICAgICAgc29ueXBpX2RldmljZS5pbnB1dF9qb2dfZGV2Lm5hbWUpOwoKCQkvKiBJbml0aWFsaXplIHRoZSBJbnB1dCBEcml2ZXJzOiBzcGVjaWFsIGtleXMgKi8KCQlzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYuZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKCQlmb3IgKGkgPSAwOyBzb255cGlfaW5wdXRrZXlzW2ldLnNvbnlwaWV2OyBpKyspCgkJCWlmIChzb255cGlfaW5wdXRrZXlzW2ldLmlucHV0ZXYpCgkJCQlzZXRfYml0KHNvbnlwaV9pbnB1dGtleXNbaV0uaW5wdXRldiwKCQkJCQlzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYua2V5Yml0KTsKCQlzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYubmFtZSA9IFNPTllQSV9LRVlfSU5QVVROQU1FOwoJCXNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5pZC5idXN0eXBlID0gQlVTX0lTQTsKCQlzb255cGlfZGV2aWNlLmlucHV0X2tleV9kZXYuaWQudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9TT05ZOwoKCQlpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoJnNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldik7CgkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgaW5wdXQgbWV0aG9kIGluc3RhbGxlZC5cbiIsCgkJICAgICAgIHNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldi5uYW1lKTsKCgkJc3Bpbl9sb2NrX2luaXQoJnNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmb19sb2NrKTsKCQlzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8gPQoJCQlrZmlmb19hbGxvYyhTT05ZUElfQlVGX1NJWkUsIEdGUF9LRVJORUwsCgkJCQkgICAgJnNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmb19sb2NrKTsKCQlpZiAoSVNfRVJSKHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbykpIHsKCQkJcHJpbnRrKEtFUk5fRVJSICJzb255cGk6IGtmaWZvX2FsbG9jIGZhaWxlZFxuIik7CgkJCXJldCA9IFBUUl9FUlIoc29ueXBpX2RldmljZS5pbnB1dF9maWZvKTsKCQkJZ290byBvdXRfaW5maWZvOwoJCX0KCgkJSU5JVF9XT1JLKCZzb255cGlfZGV2aWNlLmlucHV0X3dvcmssIGlucHV0X2tleXJlbGVhc2UsIE5VTEwpOwoJfQoKCXNvbnlwaV9kZXZpY2UucGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInNvbnlwaSIsIC0xLAoJCQkJCQkJICAgICBOVUxMLCAwKTsKCWlmIChJU19FUlIoc29ueXBpX2RldmljZS5wZGV2KSkgewoJCXJldCA9IFBUUl9FUlIoc29ueXBpX2RldmljZS5wZGV2KTsKCQlnb3RvIG91dF9wbGF0Zm9ybWRldjsKCX0KCglzb255cGlfZW5hYmxlKDApOwoKCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogU29ueSBQcm9ncmFtbWFibGUgSS9PIENvbnRyb2xsZXIgRHJpdmVyIgoJICAgICAgICJ2JXMuXG4iLCBTT05ZUElfRFJJVkVSX1ZFUlNJT04pOwoJcHJpbnRrKEtFUk5fSU5GTyAic29ueXBpOiBkZXRlY3RlZCB0eXBlJWQgbW9kZWwsICIKCSAgICAgICAidmVyYm9zZSA9ICVkLCBmbmtleWluaXQgPSAlcywgY2FtZXJhID0gJXMsICIKCSAgICAgICAiY29tcGF0ID0gJXMsIG1hc2sgPSAweCUwOGx4LCB1c2VpbnB1dCA9ICVzLCBhY3BpID0gJXNcbiIsCgkgICAgICAgc29ueXBpX2RldmljZS5tb2RlbCwKCSAgICAgICB2ZXJib3NlLAoJICAgICAgIGZua2V5aW5pdCA/ICJvbiIgOiAib2ZmIiwKCSAgICAgICBjYW1lcmEgPyAib24iIDogIm9mZiIsCgkgICAgICAgY29tcGF0ID8gIm9uIiA6ICJvZmYiLAoJICAgICAgIG1hc2ssCgkgICAgICAgdXNlaW5wdXQgPyAib24iIDogIm9mZiIsCgkgICAgICAgU09OWVBJX0FDUElfQUNUSVZFID8gIm9uIiA6ICJvZmYiKTsKCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogZW5hYmxlZCBhdCBpcnE9JWQsIHBvcnQxPTB4JXgsIHBvcnQyPTB4JXhcbiIsCgkgICAgICAgc29ueXBpX2RldmljZS5pcnEsCgkgICAgICAgc29ueXBpX2RldmljZS5pb3BvcnQxLCBzb255cGlfZGV2aWNlLmlvcG9ydDIpOwoKCWlmIChtaW5vciA9PSAtMSkKCQlwcmludGsoS0VSTl9JTkZPICJzb255cGk6IGRldmljZSBhbGxvY2F0ZWQgbWlub3IgaXMgJWRcbiIsCgkJICAgICAgIHNvbnlwaV9taXNjX2RldmljZS5taW5vcik7CgoJcmV0dXJuIDA7CgpvdXRfcGxhdGZvcm1kZXY6CglrZmlmb19mcmVlKHNvbnlwaV9kZXZpY2UuaW5wdXRfZmlmbyk7Cm91dF9pbmZpZm86CglpbnB1dF91bnJlZ2lzdGVyX2RldmljZSgmc29ueXBpX2RldmljZS5pbnB1dF9rZXlfZGV2KTsKCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZzb255cGlfZGV2aWNlLmlucHV0X2pvZ19kZXYpOwoJZnJlZV9pcnEoc29ueXBpX2RldmljZS5pcnEsIHNvbnlwaV9pcnEpOwpvdXRfcmVxaXJxOgoJcmVsZWFzZV9yZWdpb24oc29ueXBpX2RldmljZS5pb3BvcnQxLCBzb255cGlfZGV2aWNlLnJlZ2lvbl9zaXplKTsKb3V0X3JlcXJlZzoKCW1pc2NfZGVyZWdpc3Rlcigmc29ueXBpX21pc2NfZGV2aWNlKTsKb3V0X21pc2NyZWc6CglpZiAocGNpZGV2KQoJCXBjaV9kaXNhYmxlX2RldmljZShwY2lkZXYpOwpvdXRfcGNpZW5hYmxlOgoJa2ZpZm9fZnJlZShzb255cGlfZGV2aWNlLmZpZm8pOwpvdXRfZmlmbzoKCXBjaV9kZXZfcHV0KHNvbnlwaV9kZXZpY2UuZGV2KTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzb255cGlfcmVtb3ZlKHZvaWQpCnsKCXNvbnlwaV9kaXNhYmxlKCk7CgoJc3luY2hyb25pemVfc2NoZWQoKTsgIC8qIEFsbG93IHNvbnlwaSBpbnRlcnJ1cHQgdG8gY29tcGxldGUuICovCglmbHVzaF9zY2hlZHVsZWRfd29yaygpOwoKCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNvbnlwaV9kZXZpY2UucGRldik7CgoJaWYgKHVzZWlucHV0KSB7CgkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnNvbnlwaV9kZXZpY2UuaW5wdXRfa2V5X2Rldik7CgkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoJnNvbnlwaV9kZXZpY2UuaW5wdXRfam9nX2Rldik7CgkJa2ZpZm9fZnJlZShzb255cGlfZGV2aWNlLmlucHV0X2ZpZm8pOwoJfQoKCWZyZWVfaXJxKHNvbnlwaV9kZXZpY2UuaXJxLCBzb255cGlfaXJxKTsKCXJlbGVhc2VfcmVnaW9uKHNvbnlwaV9kZXZpY2UuaW9wb3J0MSwgc29ueXBpX2RldmljZS5yZWdpb25fc2l6ZSk7CgltaXNjX2RlcmVnaXN0ZXIoJnNvbnlwaV9taXNjX2RldmljZSk7CglpZiAoc29ueXBpX2RldmljZS5kZXYpCgkJcGNpX2Rpc2FibGVfZGV2aWNlKHNvbnlwaV9kZXZpY2UuZGV2KTsKCWtmaWZvX2ZyZWUoc29ueXBpX2RldmljZS5maWZvKTsKCXBjaV9kZXZfcHV0KHNvbnlwaV9kZXZpY2UuZGV2KTsKCXByaW50ayhLRVJOX0lORk8gInNvbnlwaTogcmVtb3ZlZC5cbiIpOwp9CgpzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBzb255cGlfZG1pX3RhYmxlW10gPSB7Cgl7CgkJLmlkZW50ID0gIlNvbnkgVmFpbyIsCgkJLm1hdGNoZXMgPSB7CgkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJQQ0ctIiksCgkJfSwKCX0sCgl7CgkJLmlkZW50ID0gIlNvbnkgVmFpbyIsCgkJLm1hdGNoZXMgPSB7CgkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWR04tIiksCgkJfSwKCX0sCgl7IH0KfTsKCnN0YXRpYyBpbnQgX19pbml0IHNvbnlwaV9pbml0KHZvaWQpCnsKCWludCByZXQ7CgoJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKHNvbnlwaV9kbWlfdGFibGUpKQoJCXJldHVybiAtRU5PREVWOwoKCXJldCA9IGRyaXZlcl9yZWdpc3Rlcigmc29ueXBpX2RyaXZlcik7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgoJcmV0ID0gc29ueXBpX3Byb2JlKCk7CglpZiAocmV0KQoJCWRyaXZlcl91bnJlZ2lzdGVyKCZzb255cGlfZHJpdmVyKTsKCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgc29ueXBpX2V4aXQodm9pZCkKewoJZHJpdmVyX3VucmVnaXN0ZXIoJnNvbnlwaV9kcml2ZXIpOwoJc29ueXBpX3JlbW92ZSgpOwp9Cgptb2R1bGVfaW5pdChzb255cGlfaW5pdCk7Cm1vZHVsZV9leGl0KHNvbnlwaV9leGl0KTsK