From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1aK5z1-00034T-6c for barebox@lists.infradead.org; Fri, 15 Jan 2016 15:08:26 +0000 From: Sascha Hauer Date: Fri, 15 Jan 2016 16:07:18 +0100 Message-Id: <1452870438-29656-14-git-send-email-s.hauer@pengutronix.de> In-Reply-To: <1452870438-29656-1-git-send-email-s.hauer@pengutronix.de> References: <1452870438-29656-1-git-send-email-s.hauer@pengutronix.de> MIME-Version: 1.0 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "barebox" Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: [PATCH 13/13] bootm: add initial FIT support To: Barebox List RnJvbTogSmFuIEx1ZWJiZSA8amx1QHBlbmd1dHJvbml4LmRlPgoKVGhpcyBpbXBsZW1lbnRhdGlv biBpcyBpbnNwaXJlZCBieSBVLUJvb3QncyBGSVQgc3VwcG9ydC4gSW5zdGVhZCBvZgp1c2luZyBs aWJmZHQgKHdoaWNoIGRvZXMgbm90IGV4aXN0IGluIGJhcmVib3gpLCBjb25maWd1cmF0aW9uIHNp Z25hdHVyZXMKYXJlIHZlcmlmaWVkIGJ5IHVzaW5nIGEgc2ltcGxpZmllZCBEVCBwYXJzZXIgYmFz ZWQgb24gYmFyZWJveCdzIG93bgpjb2RlLgoKQ3VycmVudGx5LCBvbmx5IHNpZ25lZCBjb25maWd1 cmF0aW9ucyB3aXRoIGhhc2hlZCBpbWFnZXMgYXJlIHN1cHBvcnRlZCwKYXMgdGhlIG90aGVyIHZh cmlhbnRzIGFyZSBsZXNzIHVzZWZ1bCBmb3IgdmVyaWZpZWQgYm9vdC4gQ29tcGF0aWJsZSBGSVQK aW1hZ2VzIGNhbiBiZSBjcmVhdGVkIHVzaW5nIFUtQm9vdCdzIG1raW1hZ2UgdG9vbC4KClNpZ25l ZC1vZmYtYnk6IEphbiBMdWViYmUgPGpsdUBwZW5ndXRyb25peC5kZT4KU2lnbmVkLW9mZi1ieTog TWFyYyBLbGVpbmUtQnVkZGUgPG1rbEBwZW5ndXRyb25peC5kZT4KU2lnbmVkLW9mZi1ieTogU2Fz Y2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPgotLS0KIGFyY2gvYXJtL2xpYi9ib290 bS5jIHwgICA4ICsKIGNvbW1hbmRzL0tjb25maWcgICAgIHwgIDIyICsrCiBjb21tb24vS2NvbmZp ZyAgICAgICB8ICAgOSArCiBjb21tb24vTWFrZWZpbGUgICAgICB8ICAgMSArCiBjb21tb24vYm9v dG0uYyAgICAgICB8ICA1MyArKysrLQogY29tbW9uL2ltYWdlLWZpdC5jICAgfCA1ODEgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBpbmNsdWRlL2Jv b3QuaCAgICAgICB8ICAgNCArCiBpbmNsdWRlL2ltYWdlLWZpdC5oICB8ICA0NSArKysrCiA4IGZp bGVzIGNoYW5nZWQsIDcyMCBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9ucygtKQogY3JlYXRlIG1v ZGUgMTAwNjQ0IGNvbW1vbi9pbWFnZS1maXQuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUv aW1hZ2UtZml0LmgKCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvYm9vdG0uYyBiL2FyY2gvYXJt L2xpYi9ib290bS5jCmluZGV4IDRkZmUxNDguLjE5MTNkNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJt L2xpYi9ib290bS5jCisrKyBiL2FyY2gvYXJtL2xpYi9ib290bS5jCkBAIC01MzEsNiArNTMxLDEy IEBAIEJBUkVCT1hfTUFHSUNWQVIoYWltYWdlX25vdmVyd3JpdGVfYm9vdGFyZ3MsICJEaXNhYmxl IG92ZXJ3cml0ZSBvZiB0aGUgYm9vdGFyZ3MKIEJBUkVCT1hfTUFHSUNWQVIoYWltYWdlX25vdmVy d3JpdGVfdGFncywgIkRpc2FibGUgb3ZlcndyaXRlIG9mIHRoZSB0YWdzIGFkZHIgd2l0aCB0aGUg b25lIHByZXNlbnQgaW4gYWltYWdlIik7CiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCBpbWFnZV9o YW5kbGVyIGFybV9maXRfaGFuZGxlciA9IHsKKyAgICAgICAgLm5hbWUgPSAiRklUIGltYWdlIiwK KyAgICAgICAgLmJvb3RtID0gZG9fYm9vdG1fbGludXgsCisgICAgICAgIC5maWxldHlwZSA9IGZp bGV0eXBlX29mdHJlZSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgYmluZm10X2hvb2sgYmluZm10X2Fp bWFnZV9ob29rID0gewogCS50eXBlID0gZmlsZXR5cGVfYWltYWdlLAogCS5leGVjID0gImJvb3Rt IiwKQEAgLTU1Niw2ICs1NjIsOCBAQCBzdGF0aWMgaW50IGFybWxpbnV4X3JlZ2lzdGVyX2ltYWdl X2hhbmRsZXIodm9pZCkKIAkJcmVnaXN0ZXJfaW1hZ2VfaGFuZGxlcigmYWltYWdlX2hhbmRsZXIp OwogCQliaW5mbXRfcmVnaXN0ZXIoJmJpbmZtdF9haW1hZ2VfaG9vayk7CiAJfQorCWlmIChJU19C VUlMVElOKENPTkZJR19DTURfQk9PVE1fRklUSU1BR0UpKQorCSAgICAgICAgcmVnaXN0ZXJfaW1h Z2VfaGFuZGxlcigmYXJtX2ZpdF9oYW5kbGVyKTsKIAliaW5mbXRfcmVnaXN0ZXIoJmJpbmZtdF9h cm1femltYWdlX2hvb2spOwogCWJpbmZtdF9yZWdpc3RlcigmYmluZm10X2JhcmVib3hfaG9vayk7 CiAKZGlmZiAtLWdpdCBhL2NvbW1hbmRzL0tjb25maWcgYi9jb21tYW5kcy9LY29uZmlnCmluZGV4 IDE3NDM2NzAuLmI4ZjM3YzEgMTAwNjQ0Ci0tLSBhL2NvbW1hbmRzL0tjb25maWcKKysrIGIvY29t bWFuZHMvS2NvbmZpZwpAQCAtNDE4LDYgKzQxOCwyOCBAQCBjb25maWcgQ01EX0JPT1RNX0FJTUFH RQogCWhlbHAKIAkgIFN1cHBvcnQgdXNpbmcgQW5kcm9pZCBJbWFnZXMuCiAKK2NvbmZpZyBDTURf Qk9PVE1fRklUSU1BR0UKKwlib29sCisJcHJvbXB0ICJGSVQgaW1hZ2Ugc3VwcG9ydCIKKwlzZWxl Y3QgRklUSU1BR0UKKwlkZXBlbmRzIG9uIENNRF9CT09UTSAmJiBBUk0KKwloZWxwCisJICBTdXBw b3J0IHVzaW5nIEZJVCBJbWFnZXMuIEhhdmUgYSBsb29rIGF0IHRoZSB1LWJvb3Qgc291cmNlCisJ ICB0cmVlIGluIHRoZSAiZG9jL3VJbWFnZS5GSVQiIGZvbGRlciBmb3IgbW9yZSBpbmZvcm1hdGlv bjoKKwkgIGh0dHA6Ly9naXQuZGVueC5kZS8/cD11LWJvb3QuZ2l0O2E9dHJlZTtmPWRvYy91SW1h Z2UuRklUCisKK2NvbmZpZyBDTURfQk9PVE1fRklUSU1BR0VfU0lHTkFUVVJFCisJYm9vbAorCXBy b21wdCAic3VwcG9ydCB2ZXJpZnlpbmcgc2lnbmVkIEZJVCBpbWFnZXMiCisJZGVwZW5kcyBvbiBD TURfQk9PVE1fRklUSU1BR0UKKwlzZWxlY3QgRklUSU1BR0VfU0lHTkFUVVJFCisJaGVscAorCSAg U3VwcG9ydCB2ZXJpZnlpbmcgc2lnbmVkIEZJVCBpbWFnZXMuIFRoaXMgcmVxdWlyZXMgRklUIGlt YWdlcworCSAgYXMgZGVzY3JpYmVkIGluOgorCSAgaHR0cDovL2dpdC5kZW54LmRlLz9wPXUtYm9v dC5naXQ7YT1ibG9iO2Y9ZG9jL3VJbWFnZS5GSVQvc2lnbmF0dXJlLnR4dAorCSAgQWRkaXRpb25h bGx5IHRoZSBiYXJlYm94IGRldmljZSB0cmVlIG5lZWRzIGEgL3NpZ25hdHVyZSBub2RlIHdpdGgg dGhlCisJICBwdWJsaWMga2V5IHdpdGggd2hpY2ggdGhlIGltYWdlIGhhcyBiZWVuIHNpZ25lZC4K KwogY29uZmlnIENNRF9CT09UVQogCXRyaXN0YXRlCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9j b21tb24vS2NvbmZpZyBiL2NvbW1vbi9LY29uZmlnCmluZGV4IDhlNzk1MDkuLjM0NWRlNTAgMTAw NjQ0Ci0tLSBhL2NvbW1vbi9LY29uZmlnCisrKyBiL2NvbW1vbi9LY29uZmlnCkBAIC02Niw2ICs2 NiwxNSBAQCBjb25maWcgVUlNQUdFCiAJc2VsZWN0IENSQzMyCiAJYm9vbAogCitjb25maWcgRklU SU1BR0UKKwlib29sCisJc2VsZWN0IE9GVFJFRQorCXNlbGVjdCBESUdFU1QKKworY29uZmlnIEZJ VElNQUdFX1NJR05BVFVSRQorCXNlbGVjdCBDUllQVE9fUlNBCisJYm9vbAorCiBjb25maWcgTE9H QlVGCiAJYm9vbAogCmRpZmYgLS1naXQgYS9jb21tb24vTWFrZWZpbGUgYi9jb21tb24vTWFrZWZp bGUKaW5kZXggNTZlNmJlYy4uZmZhZjhlNyAxMDA2NDQKLS0tIGEvY29tbW9uL01ha2VmaWxlCisr KyBiL2NvbW1vbi9NYWtlZmlsZQpAQCAtNDYsNiArNDYsNyBAQCBvYmotJChDT05GSUdfU0hFTExf SFVTSCkJKz0gaHVzaC5vCiBvYmotJChDT05GSUdfU0hFTExfU0lNUExFKQkrPSBwYXJzZXIubwog b2JqLSQoQ09ORklHX1NUQVRFKQkJKz0gc3RhdGUubwogb2JqLSQoQ09ORklHX1VJTUFHRSkJCSs9 IGltYWdlLm8gdWltYWdlLm8KK29iai0kKENPTkZJR19GSVRJTUFHRSkJCSs9IGltYWdlLWZpdC5v CiBvYmotJChDT05GSUdfTUVOVVRSRUUpCQkrPSBtZW51dHJlZS5vCiBvYmotJChDT05GSUdfRUZJ X0dVSUQpCQkrPSBlZmktZ3VpZC5vCiBvYmotJChDT05GSUdfRUZJX0RFVklDRVBBVEgpCSs9IGVm aS1kZXZpY2VwYXRoLm8KZGlmZiAtLWdpdCBhL2NvbW1vbi9ib290bS5jIGIvY29tbW9uL2Jvb3Rt LmMKaW5kZXggNzhhNmJiNS4uZDhhY2ZmOCAxMDA2NDQKLS0tIGEvY29tbW9uL2Jvb3RtLmMKKysr IGIvY29tbW9uL2Jvb3RtLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxtYWxsb2MuaD4K ICNpbmNsdWRlIDxtZW1vcnkuaD4KICNpbmNsdWRlIDxsaWJmaWxlLmg+CisjaW5jbHVkZSA8aW1h Z2UtZml0Lmg+CiAjaW5jbHVkZSA8Z2xvYmFsdmFyLmg+CiAjaW5jbHVkZSA8aW5pdC5oPgogI2lu Y2x1ZGUgPGxpbnV4L3N0YXQuaD4KQEAgLTkyLDYgKzkzLDE3IEBAIGludCBib290bV9sb2FkX29z KHN0cnVjdCBpbWFnZV9kYXRhICpkYXRhLCB1bnNpZ25lZCBsb25nIGxvYWRfYWRkcmVzcykKIAlp ZiAobG9hZF9hZGRyZXNzID09IFVJTUFHRV9JTlZBTElEX0FERFJFU1MpCiAJCXJldHVybiAtRUlO VkFMOwogCisJaWYgKGRhdGEtPm9zX2ZpdCkgeworCQlkYXRhLT5vc19yZXMgPSByZXF1ZXN0X3Nk cmFtX3JlZ2lvbigia2VybmVsIiwKKwkJCQlsb2FkX2FkZHJlc3MsCisJCQkJZGF0YS0+b3NfZml0 LT5rZXJuZWxfc2l6ZSk7CisJCWlmICghZGF0YS0+b3NfcmVzKQorCQkJcmV0dXJuIC1FTk9NRU07 CisJCW1lbWNweSgodm9pZCAqKWxvYWRfYWRkcmVzcywgZGF0YS0+b3NfZml0LT5rZXJuZWwsCisJ CSAgICAgICBkYXRhLT5vc19maXQtPmtlcm5lbF9zaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJ aWYgKGRhdGEtPm9zKSB7CiAJCWludCBudW07CiAKQEAgLTEyMSw2ICsxMzMsOSBAQCBib29sIGJv b3RtX2hhc19pbml0cmQoc3RydWN0IGltYWdlX2RhdGEgKmRhdGEpCiAJaWYgKCFJU19FTkFCTEVE KENPTkZJR19DTURfQk9PVE1fSU5JVFJEKSkKIAkJcmV0dXJuIGZhbHNlOwogCisJaWYgKGRhdGEt Pm9zX2ZpdCAmJiBkYXRhLT5vc19maXQtPmluaXRyZCkKKwkJcmV0dXJuIHRydWU7CisKIAlpZiAo ZGF0YS0+aW5pdHJkX2ZpbGUpCiAJCXJldHVybiB0cnVlOwogCkBAIC0xNzgsNiArMTkzLDE4IEBA IGludCBib290bV9sb2FkX2luaXRyZChzdHJ1Y3QgaW1hZ2VfZGF0YSAqZGF0YSwgdW5zaWduZWQg bG9uZyBsb2FkX2FkZHJlc3MpCiAJaWYgKGRhdGEtPmluaXRyZF9yZXMpCiAJCXJldHVybiAwOwog CisJaWYgKGRhdGEtPm9zX2ZpdCAmJiBkYXRhLT5vc19maXQtPmluaXRyZCkgeworCQlkYXRhLT5p bml0cmRfcmVzID0gcmVxdWVzdF9zZHJhbV9yZWdpb24oImluaXRyZCIsCisJCQkJbG9hZF9hZGRy ZXNzLAorCQkJCWRhdGEtPm9zX2ZpdC0+aW5pdHJkX3NpemUpOworCQlpZiAoIWRhdGEtPmluaXRy ZF9yZXMpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbWVtY3B5KCh2b2lkICopbG9hZF9hZGRyZXNz LCBkYXRhLT5vc19maXQtPmluaXRyZCwKKwkJICAgICAgIGRhdGEtPm9zX2ZpdC0+aW5pdHJkX3Np emUpOworCQlwcmludGYoIkxvYWRlZCBpbml0cmQgZnJvbSBGSVQgaW1hZ2VcbiIpOworCQlnb3Rv IGRvbmUxOworCX0KKwogCXR5cGUgPSBmaWxlX25hbWVfZGV0ZWN0X3R5cGUoZGF0YS0+aW5pdHJk X2ZpbGUpOwogCiAJaWYgKChpbnQpdHlwZSA8IDApIHsKQEAgLTIxNiw3ICsyNDMsNyBAQCBkb25l OgogCWlmICh0eXBlID09IGZpbGV0eXBlX3VpbWFnZSAmJiBkYXRhLT5pbml0cmQtPmhlYWRlci5p aF90eXBlID09IElIX1RZUEVfTVVMVEkpCiAJCXByaW50ZigiLCBtdWx0aWZpbGUgaW1hZ2UgJXMi LCBkYXRhLT5pbml0cmRfcGFydCk7CiAJcHJpbnRmKCJcbiIpOwotCitkb25lMToKIAlwcmludGYo ImluaXRyZCBpcyBhdCAiIFBSSU5URl9DT05WRVJTSU9OX1JFU09VUkNFICItIiBQUklOVEZfQ09O VkVSU0lPTl9SRVNPVVJDRSAiXG4iLAogCQlkYXRhLT5pbml0cmRfcmVzLT5zdGFydCwKIAkJZGF0 YS0+aW5pdHJkX3Jlcy0+ZW5kKTsKQEAgLTI4OSw3ICszMTYsOSBAQCBpbnQgYm9vdG1fbG9hZF9k ZXZpY2V0cmVlKHN0cnVjdCBpbWFnZV9kYXRhICpkYXRhLCB1bnNpZ25lZCBsb25nIGxvYWRfYWRk cmVzcykKIAlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX09GVFJFRSkpCiAJCXJldHVybiAwOwogCi0J aWYgKGRhdGEtPm9mdHJlZV9maWxlKSB7CisJaWYgKGRhdGEtPm9zX2ZpdCAmJiBkYXRhLT5vc19m aXQtPm9mdHJlZSkgeworCQlkYXRhLT5vZl9yb290X25vZGUgPSBvZl91bmZsYXR0ZW5fZHRiKGRh dGEtPm9zX2ZpdC0+b2Z0cmVlKTsKKwl9IGVsc2UgaWYgKGRhdGEtPm9mdHJlZV9maWxlKSB7CiAJ CXNpemVfdCBzaXplOwogCiAJCXR5cGUgPSBmaWxlX25hbWVfZGV0ZWN0X3R5cGUoZGF0YS0+b2Z0 cmVlX2ZpbGUpOwpAQCAtMzc2LDYgKzQwNSw4IEBAIGludCBib290bV9nZXRfb3Nfc2l6ZShzdHJ1 Y3QgaW1hZ2VfZGF0YSAqZGF0YSkKIAlpZiAoZGF0YS0+b3MpCiAJCXJldHVybiB1aW1hZ2VfZ2V0 X3NpemUoZGF0YS0+b3MsCiAJCQkJICAgICAgIHNpbXBsZV9zdHJ0b3VsKGRhdGEtPm9zX3BhcnQs IE5VTEwsIDApKTsKKwlpZiAoZGF0YS0+b3NfZml0KQorCQlyZXR1cm4gZGF0YS0+b3NfZml0LT5r ZXJuZWxfc2l6ZTsKIAogCWlmIChkYXRhLT5vc19maWxlKSB7CiAJCXN0cnVjdCBzdGF0IHM7CkBA IC00OTUsMTAgKzUyNiwyNCBAQCBpbnQgYm9vdG1fYm9vdChzdHJ1Y3QgYm9vdG1fZGF0YSAqYm9v dG1fZGF0YSkKIAkJZ290byBlcnJfb3V0OwogCX0KIAorCWlmIChJU19FTkFCTEVEKENPTkZJR19G SVRJTUFHRSkgJiYgb3NfdHlwZSA9PSBmaWxldHlwZV9vZnRyZWUpIHsKKwkJc3RydWN0IGZpdF9o YW5kbGUgKmZpdDsKKworCQlmaXQgPSBmaXRfb3BlbihkYXRhLT5vc19maWxlLCBkYXRhLT5vc19w YXJ0LCBkYXRhLT52ZXJib3NlLCBkYXRhLT52ZXJpZnkpOworCQlpZiAoSVNfRVJSKGZpdCkpIHsK KwkJCXByaW50ZigiTG9hZGluZyBGSVQgaW1hZ2UgJXMgZmFpbGVkIHdpdGg6ICVzXG4iLCBkYXRh LT5vc19maWxlLAorCQkJICAgICAgIHN0cmVycm9ycChmaXQpKTsKKwkJCXJldCA9IFBUUl9FUlIo Zml0KTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCisJCWRhdGEtPm9zX2ZpdCA9IGZpdDsKKwl9 CisKIAlpZiAob3NfdHlwZSA9PSBmaWxldHlwZV91aW1hZ2UpIHsKIAkJcmV0ID0gYm9vdG1fb3Bl bl9vc191aW1hZ2UoZGF0YSk7CiAJCWlmIChyZXQpIHsKLQkJCXByaW50ZigiTG9hZGluZyBPUyBp bWFnZSBmYWlsZWQgd2l0aCAlc1xuIiwKKwkJCXByaW50ZigiTG9hZGluZyBPUyBpbWFnZSBmYWls ZWQgd2l0aDogJXNcbiIsCiAJCQkJCXN0cmVycm9yKC1yZXQpKTsKIAkJCWdvdG8gZXJyX291dDsK IAkJfQpAQCAtNTQ0LDYgKzU4OSw4IEBAIGVycl9vdXQ6CiAJCXVpbWFnZV9jbG9zZShkYXRhLT5p bml0cmQpOwogCWlmIChkYXRhLT5vcykKIAkJdWltYWdlX2Nsb3NlKGRhdGEtPm9zKTsKKwlpZiAo SVNfRU5BQkxFRChDT05GSUdfRklUSU1BR0UpICYmIGRhdGEtPm9zX2ZpdCkKKwkJZml0X2Nsb3Nl KGRhdGEtPm9zX2ZpdCk7CiAJaWYgKGRhdGEtPm9mX3Jvb3Rfbm9kZSAmJiBkYXRhLT5vZl9yb290 X25vZGUgIT0gb2ZfZ2V0X3Jvb3Rfbm9kZSgpKQogCQlvZl9kZWxldGVfbm9kZShkYXRhLT5vZl9y b290X25vZGUpOwogCmRpZmYgLS1naXQgYS9jb21tb24vaW1hZ2UtZml0LmMgYi9jb21tb24vaW1h Z2UtZml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNlMTExNgotLS0g L2Rldi9udWxsCisrKyBiL2NvbW1vbi9pbWFnZS1maXQuYwpAQCAtMCwwICsxLDU4MSBAQAorLyoK KyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3Vy IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9V VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICog TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl IHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxo dHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIEphbiBM w7xiYmUsIDIwMTQKKyAqLworI2RlZmluZSBwcl9mbXQoZm10KSAiRklUOiAiIGZtdAorI2luY2x1 ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGluaXQuaD4KKyNpbmNsdWRlIDxib290Lmg+CisjaW5j bHVkZSA8bGliZmlsZS5oPgorI2luY2x1ZGUgPGZkdC5oPgorI2luY2x1ZGUgPGRpZ2VzdC5oPgor I2luY2x1ZGUgPG9mLmg+CisjaW5jbHVkZSA8ZnMuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNp bmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNs dWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPHN0cmluZ2xp c3QuaD4KKyNpbmNsdWRlIDxyc2EuaD4KKyNpbmNsdWRlIDxpbWFnZS1maXQuaD4KKworI2RlZmlu ZSBGRFRfTUFYX0RFUFRIIDMyCisjZGVmaW5lIEZEVF9NQVhfUEFUSF9MRU4gMjAwCisKKyNkZWZp bmUgQ0hFQ0tfTEVWRUxfTk9ORSAwCisjZGVmaW5lIENIRUNLX0xFVkVMX0hBU0ggMQorI2RlZmlu ZSBDSEVDS19MRVZFTF9TSUcgMgorI2RlZmluZSBDSEVDS19MRVZFTF9NQVggMworCitzdGF0aWMg dWludDMyX3QgZHRfc3RydWN0X2FkdmFuY2Uoc3RydWN0IGZkdF9oZWFkZXIgKmYsIHVpbnQzMl90 IGR0LCBpbnQgc2l6ZSkKK3sKKwlkdCArPSBzaXplOworCWR0ID0gQUxJR04oZHQsIDQpOworCisJ aWYgKGR0ID4gZi0+b2ZmX2R0X3N0cnVjdCArIGYtPnNpemVfZHRfc3RydWN0KQorCQlyZXR1cm4g MDsKKworCXJldHVybiBkdDsKK30KKworc3RhdGljIGNoYXIgKmR0X3N0cmluZyhzdHJ1Y3QgZmR0 X2hlYWRlciAqZiwgY2hhciAqc3Ryc3RhcnQsIHVpbnQzMl90IG9mcykKK3sKKwlpZiAob2ZzID4g Zi0+c2l6ZV9kdF9zdHJpbmdzKQorCQlyZXR1cm4gTlVMTDsKKwllbHNlCisJCXJldHVybiBzdHJz dGFydCArIG9mczsKK30KKworc3RhdGljIGludCBvZl9yZWFkX3N0cmluZ19saXN0KHN0cnVjdCBk ZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzdHJpbmdfbGlzdCAqc2wp Cit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCWNvbnN0IGNoYXIgKnM7CisKKwlvZl9wcm9w ZXJ0eV9mb3JfZWFjaF9zdHJpbmcobnAsIG5hbWUsIHByb3AsIHMpIHsKKwkJc3RyaW5nX2xpc3Rf YWRkKHNsLCBzKTsKKwl9CisKKwlyZXR1cm4gcHJvcCA/IDAgOiAtRUlOVkFMOworfQorCitzdGF0 aWMgaW50IGZpdF9kaWdlc3Qodm9pZCAqZml0LCBzdHJ1Y3QgZGlnZXN0ICpkaWdlc3QsCisJCSAg ICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqaW5jX25vZGVzLCBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmV4 Y19wcm9wcywKKwkJICAgICAgdWludDMyX3QgaGFzaGVkX3N0cmluZ3Nfc3RhcnQsIHVpbnQzMl90 IGhhc2hlZF9zdHJpbmdzX3NpemUpCit7CisJc3RydWN0IGZkdF9oZWFkZXIgKmZkdCA9IGZpdDsK Kwl1aW50MzJfdCBkdF9zdHJ1Y3Q7CisJdm9pZCAqZHRfc3RyaW5nczsKKwlzdHJ1Y3QgZmR0X2hl YWRlciBmID0ge307CisJaW50IHN0YWNrW0ZEVF9NQVhfREVQVEhdOworCWNoYXIgcGF0aFtGRFRf TUFYX1BBVEhfTEVOXTsKKwljaGFyICplbmQ7CisJdWludDMyX3QgdGFnOworCWludCBzdGFydCA9 IC0xOworCWludCBkZXB0aCA9IC0xOworCWludCB3YW50ID0gMDsKKworCWYudG90YWxzaXplID0g ZmR0MzJfdG9fY3B1KGZkdC0+dG90YWxzaXplKTsKKwlmLm9mZl9kdF9zdHJ1Y3QgPSBmZHQzMl90 b19jcHUoZmR0LT5vZmZfZHRfc3RydWN0KTsKKwlmLnNpemVfZHRfc3RydWN0ID0gZmR0MzJfdG9f Y3B1KGZkdC0+c2l6ZV9kdF9zdHJ1Y3QpOworCWYub2ZmX2R0X3N0cmluZ3MgPSBmZHQzMl90b19j cHUoZmR0LT5vZmZfZHRfc3RyaW5ncyk7CisJZi5zaXplX2R0X3N0cmluZ3MgPSBmZHQzMl90b19j cHUoZmR0LT5zaXplX2R0X3N0cmluZ3MpOworCisJaWYgKGhhc2hlZF9zdHJpbmdzX3N0YXJ0ID4g Zi5zaXplX2R0X3N0cmluZ3MgfHwKKwkgICAgaGFzaGVkX3N0cmluZ3Nfc2l6ZSA+IGYuc2l6ZV9k dF9zdHJpbmdzIHx8CisJICAgIGhhc2hlZF9zdHJpbmdzX3N0YXJ0ICsgaGFzaGVkX3N0cmluZ3Nf c2l6ZSA+IGYuc2l6ZV9kdF9zdHJpbmdzKSB7CisJCXByX2VycigiJXM6IGhhc2hlZC1zdHJpbmdz IHRvbyBsYXJnZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkdF9z dHJ1Y3QgPSBmLm9mZl9kdF9zdHJ1Y3Q7CisJZHRfc3RyaW5ncyA9ICh2b2lkICopZmR0ICsgZi5v ZmZfZHRfc3RyaW5nczsKKworCWVuZCA9IHBhdGg7CisJKmVuZCA9ICdcMCc7CisKKwlkbyB7CisJ CWNvbnN0IHN0cnVjdCBmZHRfcHJvcGVydHkgKmZkdF9wcm9wOworCQljb25zdCBzdHJ1Y3QgZmR0 X25vZGVfaGVhZGVyICpmbmg7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCWludCBpbmNsdWRlID0g MDsKKwkJaW50IHN0b3BfYXQgPSAwOworCQlpbnQgb2Zmc2V0ID0gZHRfc3RydWN0OworCQlpbnQg bWF4bGVuLCBsZW47CisKKwkJdGFnID0gYmUzMl90b19jcHUoKih1aW50MzJfdCAqKShmaXQgKyBk dF9zdHJ1Y3QpKTsKKworCQlzd2l0Y2ggKHRhZykgeworCQljYXNlIEZEVF9CRUdJTl9OT0RFOgor CQkJZm5oID0gZml0ICsgZHRfc3RydWN0OworCQkJbmFtZSA9IGZuaC0+bmFtZTsKKwkJCW1heGxl biA9ICh1bnNpZ25lZCBsb25nKWZkdCArIGYub2ZmX2R0X3N0cnVjdCArCisJCQkJZi5zaXplX2R0 X3N0cnVjdCAtICh1bnNpZ25lZCBsb25nKW5hbWU7CisKKwkJCWxlbiA9IHN0cm5sZW4obmFtZSwg bWF4bGVuICsgMSk7CisJCQlpZiAobGVuID4gbWF4bGVuKQorCQkJCXJldHVybiAtRVNQSVBFOwor CisJCQlkdF9zdHJ1Y3QgPSBkdF9zdHJ1Y3RfYWR2YW5jZSgmZiwgZHRfc3RydWN0LAorCQkJCQkJ ICAgICAgc2l6ZW9mKHN0cnVjdCBmZHRfbm9kZV9oZWFkZXIpICsgbGVuICsgMSk7CisKKwkJCWRl cHRoKys7CisJCQlpZiAoZGVwdGggPT0gRkRUX01BWF9ERVBUSCkKKwkJCQlyZXR1cm4gLUVTUElQ RTsKKwkJCWlmIChlbmQgLSBwYXRoICsgMiArIGxlbiA+PSBGRFRfTUFYX1BBVEhfTEVOKQorCQkJ CXJldHVybiAtRVNQSVBFOworCQkJaWYgKGVuZCAhPSBwYXRoICsgMSkKKwkJCQkqZW5kKysgPSAn Lyc7CisJCQlzdHJjcHkoZW5kLCBuYW1lKTsKKwkJCWVuZCArPSBsZW47CisJCQlzdGFja1tkZXB0 aF0gPSB3YW50OworCQkJaWYgKHdhbnQgPT0gMSkKKwkJCQlzdG9wX2F0ID0gb2Zmc2V0OworCQkJ aWYgKHN0cmluZ19saXN0X2NvbnRhaW5zKGluY19ub2RlcywgcGF0aCkpCisJCQkJd2FudCA9IDI7 CisJCQllbHNlIGlmICh3YW50KQorCQkJCXdhbnQtLTsKKwkJCWVsc2UKKwkJCQlzdG9wX2F0ID0g b2Zmc2V0OworCQkJaW5jbHVkZSA9IHdhbnQ7CisKKwkJCWJyZWFrOworCisJCWNhc2UgRkRUX0VO RF9OT0RFOgorCQkJZHRfc3RydWN0ID0gZHRfc3RydWN0X2FkdmFuY2UoJmYsIGR0X3N0cnVjdCwg RkRUX1RBR1NJWkUpOworCisJCQlpbmNsdWRlID0gd2FudDsKKwkJCXdhbnQgPSBzdGFja1tkZXB0 aC0tXTsKKwkJCXdoaWxlIChlbmQgPiBwYXRoICYmICotLWVuZCAhPSAnLycpCisJCQkJOworCQkJ KmVuZCA9ICdcMCc7CisKKwkJCWJyZWFrOworCisJCWNhc2UgRkRUX1BST1A6CisJCQlmZHRfcHJv cCA9IGZpdCArIGR0X3N0cnVjdDsKKwkJCWxlbiA9IGZkdDMyX3RvX2NwdShmZHRfcHJvcC0+bGVu KTsKKworCQkJbmFtZSA9IGR0X3N0cmluZygmZiwgZHRfc3RyaW5ncywgZmR0MzJfdG9fY3B1KGZk dF9wcm9wLT5uYW1lb2ZmKSk7CisJCQlpZiAoIW5hbWUpCisJCQkJcmV0dXJuIC1FU1BJUEU7CisK KwkJCWR0X3N0cnVjdCA9IGR0X3N0cnVjdF9hZHZhbmNlKCZmLCBkdF9zdHJ1Y3QsCisJCQkJCQkg ICAgICBzaXplb2Yoc3RydWN0IGZkdF9wcm9wZXJ0eSkgKyBsZW4pOworCisJCQlpbmNsdWRlID0g d2FudCA+PSAyOworCQkJc3RvcF9hdCA9IG9mZnNldDsKKwkJCWlmIChzdHJpbmdfbGlzdF9jb250 YWlucyhleGNfcHJvcHMsIG5hbWUpKQorCQkJCWluY2x1ZGUgPSAwOworCisJCQlicmVhazsKKwor CQljYXNlIEZEVF9OT1A6CisJCQlkdF9zdHJ1Y3QgPSBkdF9zdHJ1Y3RfYWR2YW5jZSgmZiwgZHRf c3RydWN0LCBGRFRfVEFHU0laRSk7CisKKwkJCWluY2x1ZGUgPSB3YW50ID49IDI7CisJCQlzdG9w X2F0ID0gb2Zmc2V0OworCisJCQlicmVhazsKKworCQljYXNlIEZEVF9FTkQ6CisJCQlkdF9zdHJ1 Y3QgPSBkdF9zdHJ1Y3RfYWR2YW5jZSgmZiwgZHRfc3RydWN0LCBGRFRfVEFHU0laRSk7CisKKwkJ CWluY2x1ZGUgPSAxOworCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCIlczog VW5rbm93biB0YWcgMHglMDhYXG4iLCBfX2Z1bmNfXywgdGFnKTsKKwkJCXJldHVybiAtRUlOVkFM OworCQl9CisKKwkJaWYgKCFkdF9zdHJ1Y3QpCisJCQlyZXR1cm4gLUVTUElQRTsKKworCQlwcl9k ZWJ1ZygiJXM6IGluY2x1ZGUgJWQsIHdhbnQgJWQsIG9mZnNldCAweCV4LCBsZW4gMHgleFxuIiwK KwkJCSBwYXRoLCBpbmNsdWRlLCB3YW50LCBvZmZzZXQsIGR0X3N0cnVjdC1vZmZzZXQpOworCisJ CWlmIChpbmNsdWRlICYmIHN0YXJ0ID09IC0xKQorCQkJc3RhcnQgPSBvZmZzZXQ7CisKKwkJaWYg KCFpbmNsdWRlICYmIHN0YXJ0ICE9IC0xKSB7CisJCQlwcl9kZWJ1ZygicmVnaW9uOiAweCVwKzB4 JXhcbiIsIGZpdCArIHN0YXJ0LCBvZmZzZXQgLSBzdGFydCk7CisJCQlkaWdlc3RfdXBkYXRlKGRp Z2VzdCwgZml0ICsgc3RhcnQsIG9mZnNldCAtIHN0YXJ0KTsKKwkJCXN0YXJ0ID0gLTE7CisJCX0K Kwl9IHdoaWxlICh0YWcgIT0gRkRUX0VORCk7CisKKwlwcl9kZWJ1ZygicmVnaW9uOiAweCVwKzB4 JXhcbiIsIGZpdCArIHN0YXJ0LCBkdF9zdHJ1Y3QgLSBzdGFydCk7CisJZGlnZXN0X3VwZGF0ZShk aWdlc3QsIGZpdCArIHN0YXJ0LCBkdF9zdHJ1Y3QgLSBzdGFydCk7CisKKwlwcl9kZWJ1Zygic3Ry aW5nczogMHglcCsweCV4XG4iLCBkdF9zdHJpbmdzK2hhc2hlZF9zdHJpbmdzX3N0YXJ0LCBoYXNo ZWRfc3RyaW5nc19zaXplKTsKKwlkaWdlc3RfdXBkYXRlKGRpZ2VzdCwgZHRfc3RyaW5ncyArIGhh c2hlZF9zdHJpbmdzX3N0YXJ0LCBoYXNoZWRfc3RyaW5nc19zaXplKTsKKworCXJldHVybiAwOwor fQorCisvKgorICogVGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBGVEQgc3RydWN0dXJlIHdhcyBhbHJl YWR5IGNoZWNrZWQgYnkgb2ZfdW5mbGF0dGVuX2R0YigpCisgKi8KK3N0YXRpYyBpbnQgZml0X3Zl cmlmeV9zaWduYXR1cmUoc3RydWN0IGRldmljZV9ub2RlICpzaWdfbm9kZSwgdm9pZCAqZml0KQor eworCXVpbnQzMl90IGhhc2hlZF9zdHJpbmdzX3N0YXJ0LCBoYXNoZWRfc3RyaW5nc19zaXplOwor CXN0cnVjdCBzdHJpbmdfbGlzdCBpbmNfbm9kZXMsIGV4Y19wcm9wczsKKwlzdHJ1Y3QgcnNhX3B1 YmxpY19rZXkga2V5ID0ge307CisJc3RydWN0IGRpZ2VzdCAqZGlnZXN0OworCWludCBzaWdfbGVu OworCWNvbnN0IGNoYXIgKmFsZ29fbmFtZSwgKmtleV9uYW1lLCAqc2lnX3ZhbHVlOworCWNoYXIg KmtleV9wYXRoOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqa2V5X25vZGU7CisJZW51bSBoYXNoX2Fs Z28gYWxnbzsKKwl2b2lkICpoYXNoOworCWludCByZXQ7CisKKwlpZiAob2ZfcHJvcGVydHlfcmVh ZF9zdHJpbmcoc2lnX25vZGUsICJhbGdvIiwgJmFsZ29fbmFtZSkpIHsKKwkJcHJfZXJyKCJhbGdv IG5vdCBmb3VuZFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAo c3RyY21wKGFsZ29fbmFtZSwgInNoYTEscnNhMjA0OCIpID09IDApIHsKKwkJYWxnbyA9IEhBU0hf QUxHT19TSEExOworCX0gZWxzZSBpZiAoc3RyY21wKGFsZ29fbmFtZSwgInNoYTI1Nixyc2E0MDk2 IikgPT0gMCkgeworCQlhbGdvID0gSEFTSF9BTEdPX1NIQTI1NjsKKwl9IGVsc2UJeworCQlwcl9l cnIoInVua25vd24gYWxnbyAlc1xuIiwgYWxnb19uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJ Z290byBvdXQ7CisJfQorCWRpZ2VzdCA9IGRpZ2VzdF9hbGxvY19ieV9hbGdvKGFsZ28pOworCWlm ICghZGlnZXN0KSB7CisJCXByX2VycigidW5zdXBwb3J0ZWQgYWxnbyAlc1xuIiwgYWxnb19uYW1l KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJc2lnX3ZhbHVlID0gb2Zf Z2V0X3Byb3BlcnR5KHNpZ19ub2RlLCAidmFsdWUiLCAmc2lnX2xlbik7CisJaWYgKCFzaWdfdmFs dWUpIHsKKwkJcHJfZXJyKCJzaWduYXR1cmUgdmFsdWUgbm90IGZvdW5kIGluICVzXG4iLCBzaWdf bm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZV9kaWdl c3Q7CisJfQorCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHNpZ19ub2RlLCAia2V5LW5h bWUtaGludCIsICZrZXlfbmFtZSkpIHsKKwkJcHJfZXJyKCJrZXkgbmFtZSBub3QgZm91bmQgaW4g JXNcbiIsIHNpZ19ub2RlLT5mdWxsX25hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91 dF9mcmVlX2RpZ2VzdDsKKwl9CisJa2V5X3BhdGggPSB4YXNwcmludGYoIi9zaWduYXR1cmUva2V5 LSVzIiwga2V5X25hbWUpOworCWtleV9ub2RlID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoa2V5X3Bh dGgpOworCWZyZWUoa2V5X3BhdGgpOworCWlmICgha2V5X25vZGUpIHsKKwkJcHJfaW5mbygiZmFp bGVkIHRvIGZpbmQga2V5IG5vZGVcbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dF9m cmVlX2RpZ2VzdDsKKwl9CisKKwlyZXQgPSByc2Ffb2ZfcmVhZF9rZXkoa2V5X25vZGUsICZrZXkp OworCWlmIChyZXQpIHsKKwkJcHJfaW5mbygiZmFpbGVkIHRvIHJlYWQga2V5IGluICVzXG4iLCBr ZXlfbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXRfZnJlZV9k aWdlc3Q7CisJfQorCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KHNpZ19ub2RlLCAi aGFzaGVkLXN0cmluZ3MiLCAwLCAmaGFzaGVkX3N0cmluZ3Nfc3RhcnQpKSB7CisJCXByX2Vycigi aGFzaGVkLXN0cmluZ3Mgc3RhcnQgbm90IGZvdW5kIGluICVzXG4iLCBzaWdfbm9kZS0+ZnVsbF9u YW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZV9kaWdlc3Q7CisJfQorCWlm IChvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChzaWdfbm9kZSwgImhhc2hlZC1zdHJpbmdzIiwg MSwgJmhhc2hlZF9zdHJpbmdzX3NpemUpKSB7CisJCXByX2VycigiaGFzaGVkLXN0cmluZ3Mgc2l6 ZSBub3QgZm91bmQgaW4gJXNcbiIsIHNpZ19ub2RlLT5mdWxsX25hbWUpOworCQlyZXQgPSAtRUlO VkFMOworCQlnb3RvIG91dF9mcmVlX2RpZ2VzdDsKKwl9CisKKwlzdHJpbmdfbGlzdF9pbml0KCZp bmNfbm9kZXMpOworCXN0cmluZ19saXN0X2luaXQoJmV4Y19wcm9wcyk7CisKKwlpZiAob2ZfcmVh ZF9zdHJpbmdfbGlzdChzaWdfbm9kZSwgImhhc2hlZC1ub2RlcyIsICZpbmNfbm9kZXMpKSB7CisJ CXByX2VycigiaGFzaGVkLW5vZGVzIHByb3BlcnR5IG5vdCBmb3VuZCBpbiAlc1xuIiwgc2lnX25v ZGUtPmZ1bGxfbmFtZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3NsOworCX0KKwor CXN0cmluZ19saXN0X2FkZCgmZXhjX3Byb3BzLCAiZGF0YSIpOworCisJZGlnZXN0X2luaXQoZGln ZXN0KTsKKwlyZXQgPSBmaXRfZGlnZXN0KGZpdCwgZGlnZXN0LCAmaW5jX25vZGVzLCAmZXhjX3By b3BzLCBoYXNoZWRfc3RyaW5nc19zdGFydCwgaGFzaGVkX3N0cmluZ3Nfc2l6ZSk7CisJaGFzaCA9 IHh6YWxsb2MoZGlnZXN0X2xlbmd0aChkaWdlc3QpKTsKKwlkaWdlc3RfZmluYWwoZGlnZXN0LCBo YXNoKTsKKworCXJldCA9IHJzYV92ZXJpZnkoJmtleSwgc2lnX3ZhbHVlLCBzaWdfbGVuLCBoYXNo LCBhbGdvKTsKKwlpZiAocmV0KSB7CisJCXByX2luZm8oImltYWdlIHNpZ25hdHVyZSBCQURcbiIp OworCQlyZXQgPSAtRUJBRE1TRzsKKwl9IGVsc2UgeworCQlwcl9pbmZvKCJpbWFnZSBzaWduYXR1 cmUgT0tcbiIpOworCQlyZXQgPSAwOworCX0KKworCWZyZWUoaGFzaCk7Cisgb3V0X3NsOgorCXN0 cmluZ19saXN0X2ZyZWUoJmluY19ub2Rlcyk7CisJc3RyaW5nX2xpc3RfZnJlZSgmZXhjX3Byb3Bz KTsKKyBvdXRfZnJlZV9kaWdlc3Q6CisJZGlnZXN0X2ZyZWUoZGlnZXN0KTsKKyBvdXQ6CisJcmV0 dXJuIHJldDsKK30KKworc3RhdGljIGludCBmaXRfdmVyaWZ5X2hhc2goc3RydWN0IGRldmljZV9u b2RlICpoYXNoLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW4pCit7CisJc3RydWN0IGRp Z2VzdCAqZDsKKwljb25zdCBjaGFyICphbGdvOworCWNvbnN0IGNoYXIgKnZhbHVlX3JlYWQ7CisJ Y2hhciAqdmFsdWVfY2FsYzsKKwlpbnQgaGFzaF9sZW4sIHJldDsKKworCXZhbHVlX3JlYWQgPSBv Zl9nZXRfcHJvcGVydHkoaGFzaCwgInZhbHVlIiwgJmhhc2hfbGVuKTsKKwlpZiAoIXZhbHVlX3Jl YWQpIHsKKwkJcHJfZXJyKCIlczogXCJ2YWx1ZVwiIHByb3BlcnR5IG5vdCBmb3VuZFxuIiwgaGFz aC0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG9mX3Byb3BlcnR5 X3JlYWRfc3RyaW5nKGhhc2gsICJhbGdvIiwgJmFsZ28pKSB7CisJCXByX2VycigiJXM6IFwiYWxn b1wiIHByb3BlcnR5IG5vdCBmb3VuZFxuIiwgaGFzaC0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIC1F SU5WQUw7CisJfQorCisJZCA9IGRpZ2VzdF9hbGxvYyhhbGdvKTsKKwlpZiAoIWQpIHsKKwkJcHJf ZXJyKCIlczogdW5zdXBwb3J0ZWQgYWxnbyAlc1xuIiwgaGFzaC0+ZnVsbF9uYW1lLCBhbGdvKTsK KwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGhhc2hfbGVuICE9IGRpZ2VzdF9sZW5ndGgo ZCkpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBoYXNoIGxlbmd0aCAlZFxuIiwgaGFzaC0+ZnVs bF9uYW1lLCBoYXNoX2xlbik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2RpZ2VzdF9m cmVlOworCX0KKworCXZhbHVlX2NhbGMgPSB4bWFsbG9jKGhhc2hfbGVuKTsKKworCWRpZ2VzdF9p bml0KGQpOworCWRpZ2VzdF91cGRhdGUoZCwgZGF0YSwgZGF0YV9sZW4pOworCWRpZ2VzdF9maW5h bChkLCB2YWx1ZV9jYWxjKTsKKworCWlmIChtZW1jbXAodmFsdWVfcmVhZCwgdmFsdWVfY2FsYywg aGFzaF9sZW4pKSB7CisJCXByX2luZm8oIiVzOiBoYXNoIEJBRFxuIiwgaGFzaC0+ZnVsbF9uYW1l KTsKKwkJcmV0ID0gIC1FQkFETVNHOworCX0gZWxzZSB7CisJCXByX2luZm8oIiVzOiBoYXNoIE9L XG4iLCBoYXNoLT5mdWxsX25hbWUpOworCQlyZXQgPSAwOworCX0KKworCWZyZWUodmFsdWVfY2Fs Yyk7CisKK2Vycl9kaWdlc3RfZnJlZToKKwlkaWdlc3RfZnJlZShkKTsKKworCXJldHVybiByZXQ7 Cit9CisKK3N0YXRpYyBpbnQgZml0X29wZW5faW1hZ2Uoc3RydWN0IGZpdF9oYW5kbGUgKmhhbmRs ZSwgY29uc3QgY2hhciAqdW5pdCwgY29uc3Qgdm9pZCAqKm91dGRhdGEsCisJdW5zaWduZWQgbG9u ZyAqb3V0c2l6ZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmltYWdlID0gTlVMTCwgKmhhc2g7 CisJY29uc3QgY2hhciAqdHlwZSA9IE5VTEwsICpkZXNjPSAiKG5vIGRlc2NyaXB0aW9uKSI7CisJ Y29uc3Qgdm9pZCAqZGF0YTsKKwlpbnQgZGF0YV9sZW47CisJaW50IHJldCA9IDA7CisKKwlpbWFn ZSA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKGhhbmRsZS0+cm9vdCwgImltYWdlcyIpOworCWlmICgh aW1hZ2UpCisJCXJldHVybiAtRU5PRU5UOworCisJaW1hZ2UgPSBvZl9nZXRfY2hpbGRfYnlfbmFt ZShpbWFnZSwgdW5pdCk7CisJaWYgKCFpbWFnZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlvZl9w cm9wZXJ0eV9yZWFkX3N0cmluZyhpbWFnZSwgImRlc2NyaXB0aW9uIiwgJmRlc2MpOworCXByX2lu Zm8oImltYWdlICclcyc6ICclcydcbiIsIHVuaXQsIGRlc2MpOworCisJb2ZfcHJvcGVydHlfcmVh ZF9zdHJpbmcoaW1hZ2UsICJ0eXBlIiwgJnR5cGUpOworCWlmICghdHlwZSkgeworCQlwcl9lcnIo Ik5vIFwidHlwZVwiIHByb3BlcnR5IGZvdW5kIGluICVzXG4iLCBpbWFnZS0+ZnVsbF9uYW1lKTsK KwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YSA9IG9mX2dldF9wcm9wZXJ0eShpbWFnZSwg ImRhdGEiLCAmZGF0YV9sZW4pOworCWlmICghZGF0YSkgeworCQlwcl9lcnIoImRhdGEgbm90IGZv dW5kXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGhhbmRsZS0+dmVyaWZ5ID4g Qk9PVE1fVkVSSUZZX05PTkUpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZm9yX2VhY2hfY2hpbGRf b2Zfbm9kZShpbWFnZSwgaGFzaCkgeworCQkJaWYgKGhhbmRsZS0+dmVyYm9zZSkKKwkJCQlvZl9w cmludF9ub2RlcyhoYXNoLCAwKTsKKwkJCXJldCA9IGZpdF92ZXJpZnlfaGFzaChoYXNoLCBkYXRh LCBkYXRhX2xlbik7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQor CWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKm91dGRhdGEgPSBkYXRhOworCSpvdXRz aXplID0gZGF0YV9sZW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaXRfb3Blbl9j b25maWd1cmF0aW9uKHN0cnVjdCBmaXRfaGFuZGxlICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUp Cit7CisJc3RydWN0IGRldmljZV9ub2RlICpjb25mX25vZGUgPSBOVUxMLCAqc2lnX25vZGU7CisJ Y29uc3QgY2hhciAqdW5pdCwgKmRlc2MgPSAiKG5vIGRlc2NyaXB0aW9uKSI7CisJaW50IHJldDsK KworCWNvbmZfbm9kZSA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKGhhbmRsZS0+cm9vdCwgImNvbmZp Z3VyYXRpb25zIik7CisJaWYgKCFjb25mX25vZGUpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYg KG5hbWUpIHsKKwkJdW5pdCA9IG5hbWU7CisJfSBlbHNlIGlmIChvZl9wcm9wZXJ0eV9yZWFkX3N0 cmluZyhjb25mX25vZGUsICJkZWZhdWx0IiwgJnVuaXQpKSB7CisJCXVuaXQgPSAiY29uZkAxIjsK Kwl9CisKKwljb25mX25vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShjb25mX25vZGUsIHVuaXQp OworCWlmICghY29uZl9ub2RlKSB7CisJCXByX2VycigiY29uZmlndXJhdGlvbiAnJXMnIG5vdCBm b3VuZFxuIiwgdW5pdCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCW9mX3Byb3BlcnR5X3Jl YWRfc3RyaW5nKGNvbmZfbm9kZSwgImRlc2NyaXB0aW9uIiwgJmRlc2MpOworCXByX2luZm8oImNv bmZpZ3VyYXRpb24gJyVzJzogJXNcbiIsIHVuaXQsIGRlc2MpOworCisJaWYgKElTX0VOQUJMRUQo Q09ORklHX0ZJVElNQUdFX1NJR05BVFVSRSkgJiYKKwkgICAgaGFuZGxlLT52ZXJpZnkgPT0gQk9P VE1fVkVSSUZZX1NJR05BVFVSRSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlmb3JfZWFjaF9jaGls ZF9vZl9ub2RlKGNvbmZfbm9kZSwgc2lnX25vZGUpIHsKKwkJCWlmIChoYW5kbGUtPnZlcmJvc2Up CisJCQkJb2ZfcHJpbnRfbm9kZXMoc2lnX25vZGUsIDApOworCQkJcmV0ID0gZml0X3ZlcmlmeV9z aWduYXR1cmUoc2lnX25vZGUsIGhhbmRsZS0+Zml0KTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJl dHVybiByZXQ7CisJCX0KKworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJ aWYgKG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKGNvbmZfbm9kZSwgImtlcm5lbCIsICZ1bml0KSA9 PSAwKSB7CisJCXJldCA9IGZpdF9vcGVuX2ltYWdlKGhhbmRsZSwgdW5pdCwgJmhhbmRsZS0+a2Vy bmVsLCAmaGFuZGxlLT5rZXJuZWxfc2l6ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0Owor CX0gZWxzZSB7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWlmIChvZl9wcm9wZXJ0eV9yZWFk X3N0cmluZyhjb25mX25vZGUsICJmZHQiLCAmdW5pdCkgPT0gMCkgeworCQlyZXQgPSBmaXRfb3Bl bl9pbWFnZShoYW5kbGUsIHVuaXQsICZoYW5kbGUtPm9mdHJlZSwgJmhhbmRsZS0+b2Z0cmVlX3Np emUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAob2ZfcHJvcGVydHlf cmVhZF9zdHJpbmcoY29uZl9ub2RlLCAicmFtZGlzayIsICZ1bml0KSA9PSAwKSB7CisJCXJldCA9 IGZpdF9vcGVuX2ltYWdlKGhhbmRsZSwgdW5pdCwgJmhhbmRsZS0+aW5pdHJkLCAmaGFuZGxlLT5p bml0cmRfc2l6ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAw OworfQorCitzdHJ1Y3QgZml0X2hhbmRsZSAqZml0X29wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUs IGNvbnN0IGNoYXIgKmNvbmZpZywgYm9vbCB2ZXJib3NlLAorCQkJICAgIGVudW0gYm9vdG1fdmVy aWZ5IHZlcmlmeSkKK3sKKwlzdHJ1Y3QgZml0X2hhbmRsZSAqaGFuZGxlID0gTlVMTDsKKwljb25z dCBjaGFyICpkZXNjID0gIihubyBkZXNjcmlwdGlvbikiOworCWludCByZXQ7CisKKwloYW5kbGUg PSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgZml0X2hhbmRsZSkpOworCisJaGFuZGxlLT52ZXJib3Nl ID0gdmVyYm9zZTsKKworCXJldCA9IHJlYWRfZmlsZV8yKGZpbGVuYW1lLCAmaGFuZGxlLT5zaXpl LCAmaGFuZGxlLT5maXQsIEZJTEVTSVpFX01BWCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoInVu YWJsZSB0byByZWFkICVzOiAlc1xuIiwgZmlsZW5hbWUsIHN0cmVycm9yKC1yZXQpKTsKKwkJZ290 byBlcnI7CisJfQorCisJaGFuZGxlLT5yb290ID0gb2ZfdW5mbGF0dGVuX2R0YihoYW5kbGUtPmZp dCk7CisJaWYgKElTX0VSUihoYW5kbGUtPnJvb3QpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxl LT5yb290KTsKKwkJZ290byBlcnI7CisJfQorCisJaGFuZGxlLT52ZXJpZnkgPSB2ZXJpZnk7CisK KwlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhoYW5kbGUtPnJvb3QsICJkZXNjcmlwdGlvbiIsICZk ZXNjKTsKKwlwcl9pbmZvKCInJXMnOiAlc1xuIiwgZmlsZW5hbWUsIGRlc2MpOworCisJcmV0ID0g Zml0X29wZW5fY29uZmlndXJhdGlvbihoYW5kbGUsIGNvbmZpZyk7CisJaWYgKHJldCkKKwkJZ290 byBlcnI7CisKKwlyZXR1cm4gaGFuZGxlOworIGVycjoKKwlpZiAoaGFuZGxlLT5yb290KQorCQlv Zl9kZWxldGVfbm9kZShoYW5kbGUtPnJvb3QpOworCWZyZWUoaGFuZGxlLT5maXQpOworCWZyZWUo aGFuZGxlKTsKKworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKK3ZvaWQgZml0X2Nsb3NlKHN0 cnVjdCBmaXRfaGFuZGxlICpoYW5kbGUpCit7CisJaWYgKGhhbmRsZS0+cm9vdCkKKwkJb2ZfZGVs ZXRlX25vZGUoaGFuZGxlLT5yb290KTsKKwlpZiAoaGFuZGxlLT5maXQpCisJCWZyZWUoaGFuZGxl LT5maXQpOworCWZyZWUoaGFuZGxlKTsKK30KKworI2lmZGVmIENPTkZJR19TQU5EQk9YCitzdGF0 aWMgaW50IGRvX2Jvb3RtX3NhbmRib3hfZml0KHN0cnVjdCBpbWFnZV9kYXRhICpkYXRhKQorewor CXN0cnVjdCBmaXRfaGFuZGxlICpoYW5kbGU7CisJaGFuZGxlID0gZml0X29wZW4oZGF0YS0+b3Nf ZmlsZSwgZGF0YS0+b3NfcGFydCwgZGF0YS0+dmVyYm9zZSk7CisJaWYgKGhhbmRsZSkKKwkJZml0 X2Nsb3NlKGhhbmRsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW1hZ2VfaGFu ZGxlciBzYW5kYm94X2ZpdF9oYW5kbGVyID0geworCS5uYW1lID0gIkZJVCBpbWFnZSIsCisJLmJv b3RtID0gZG9fYm9vdG1fc2FuZGJveF9maXQsCisJLmZpbGV0eXBlID0gZmlsZXR5cGVfb2Z0cmVl LAorfTsKKworc3RhdGljIGludCBzYW5kYm94X2ZpdF9yZWdpc3Rlcih2b2lkKQoreworCXJldHVy biByZWdpc3Rlcl9pbWFnZV9oYW5kbGVyKCZzYW5kYm94X2ZpdF9oYW5kbGVyKTsKK30KK2xhdGVf aW5pdGNhbGwoc2FuZGJveF9maXRfcmVnaXN0ZXIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNs dWRlL2Jvb3QuaCBiL2luY2x1ZGUvYm9vdC5oCmluZGV4IDM2M2EwMmEuLjAxOThjYzggMTAwNjQ0 Ci0tLSBhL2luY2x1ZGUvYm9vdC5oCisrKyBiL2luY2x1ZGUvYm9vdC5oCkBAIC0zNCw2ICszNCwx MCBAQCBzdHJ1Y3QgaW1hZ2VfZGF0YSB7CiAKIAkvKiBpZiBvcyBpcyBhbiB1SW1hZ2UgdGhpcyB3 aWxsIGJlIHByb3ZpZGVkICovCiAJc3RydWN0IHVpbWFnZV9oYW5kbGUgKm9zOworCisJLyogaWYg b3MgaXMgYSBGSVQgaW1hZ2UgdGhpcyB3aWxsIGJlIHByb3ZpZGVkICovCisJc3RydWN0IGZpdF9o YW5kbGUgKm9zX2ZpdDsKKwogCWNoYXIgKm9zX3BhcnQ7CiAKIAkvKiBvdGhlcndpc2Ugb25seSB0 aGUgZmlsZW5hbWUgd2lsbCBiZSBwcm92aWRlZCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pbWFn ZS1maXQuaCBiL2luY2x1ZGUvaW1hZ2UtZml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMC4uYzlkNjkxMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaW1hZ2UtZml0LmgK QEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICog dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGlj ZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1 c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w bGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHBy b2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisg KiBDb3B5cmlnaHQgKEMpIEphbiBMw7xiYmUsIDIwMTQKKyAqLworCisjaWZuZGVmIF9fSU1BR0Vf RklUX0hfXworI2RlZmluZSBfX0lNQUdFX0ZJVF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVz Lmg+CisjaW5jbHVkZSA8Ym9vdC5oPgorCitzdHJ1Y3QgZml0X2hhbmRsZSB7CisJdm9pZCAqZml0 OworCXNpemVfdCBzaXplOworCisJYm9vbCB2ZXJib3NlOworCWVudW0gYm9vdG1fdmVyaWZ5IHZl cmlmeTsKKworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcm9vdDsKKworCWNvbnN0IHZvaWQgKmtlcm5l bDsKKwl1bnNpZ25lZCBsb25nIGtlcm5lbF9zaXplOworCWNvbnN0IHZvaWQgKm9mdHJlZTsKKwl1 bnNpZ25lZCBsb25nIG9mdHJlZV9zaXplOworCWNvbnN0IHZvaWQgKmluaXRyZDsKKwl1bnNpZ25l ZCBsb25nIGluaXRyZF9zaXplOworfTsKKworc3RydWN0IGZpdF9oYW5kbGUgKmZpdF9vcGVuKGNv bnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpjb25maWcsIGJvb2wgdmVyYm9zZSwKKwkJ CSAgICBlbnVtIGJvb3RtX3ZlcmlmeSB2ZXJpZnkpOwordm9pZCBmaXRfY2xvc2Uoc3RydWN0IGZp dF9oYW5kbGUgKmhhbmRsZSk7CisKKyNlbmRpZgkvKiBfX0lNQUdFX0ZJVF9IX18gKi8KLS0gCjIu Ni40CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KYmFy ZWJveCBtYWlsaW5nIGxpc3QKYmFyZWJveEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0 cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vYmFyZWJveAo=