From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTPS id 17D866E2ED for ; Tue, 10 Mar 2020 14:18:34 +0000 (UTC) From: Ville Syrjala Date: Tue, 10 Mar 2020 16:18:25 +0200 Message-Id: <20200310141830.8040-1-ville.syrjala@linux.intel.com> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t 1/6] tools/intel_scaler_coef: Add a tool for calculating scaler coefficients List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: igt-dev@lists.freedesktop.org List-ID: RnJvbTogVmlsbGUgU3lyasOkbMOkIDx2aWxsZS5zeXJqYWxhQGxpbnV4LmludGVsLmNvbT4KClNv bWUgb2Ygb3VyIHNjYWxlcnMgaGF2ZSBwcm9ncmFtbWFibGUgY29lZmZpY2llbnRzLiBBZGQgc3Vw cG9ydCBmb3IKdGhlIGZvcm1hdCBvcmlnaW5hbGx5IGRlZmluZWQgZm9yIHRoZSBnZW4yLzMvNCB2 aWRlbyBvdmVybGF5LiBUaGUKc2FtZSBmb3JtYXQgKG9yIHNsaWdodCB2YXJpYW50cykgaGFzIGJl ZW4gcmV1c2VkIGluIGxhdGVyIHBsYXRmb3Jtcwpmb3IgdGhlIHBhbmVsIGZpdHRlciBhbmQgcGlw ZSBzY2FsZXIuCgpUaGUgZnVsbCBsaXN0IG9mIGhhcmR3YXJlIHRoYXQgc3VwcG9ydHMgdGhpcyBz dHVmZjoKLSBnZW4yLzMvNCB2aWRlbyBvdmVybGF5Ci0gaWxrL3NuYiBwYW5lbCBmaXR0ZXJzCi0g aXZiIHBhbmVsIGZpdHRlciAwCi0gY25sKyBwaXBlIHNjYWxlcnMKClRoZSB0b29sIGNhbiBjYWxj dWxhdGUgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgZm9yIGEgcmFuZG9tIHNtYXR0ZXJpbmcKb2Yg ZmlsdGVyIGFuZCB3aW5kb3cgZnVuY3Rpb25zLgoKU2lnbmVkLW9mZi1ieTogVmlsbGUgU3lyasOk bMOkIDx2aWxsZS5zeXJqYWxhQGxpbnV4LmludGVsLmNvbT4KLS0tCiB0b29scy9NYWtlZmlsZS5z b3VyY2VzICAgIHwgICAgMSArCiB0b29scy9pbnRlbF9zY2FsZXJfY29lZi5jIHwgMTAyMSArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiB0b29scy9tZXNvbi5idWlsZCAgICAg ICAgIHwgICAgMSArCiAzIGZpbGVzIGNoYW5nZWQsIDEwMjMgaW5zZXJ0aW9ucygrKQogY3JlYXRl IG1vZGUgMTAwNjQ0IHRvb2xzL2ludGVsX3NjYWxlcl9jb2VmLmMKCmRpZmYgLS1naXQgYS90b29s cy9NYWtlZmlsZS5zb3VyY2VzIGIvdG9vbHMvTWFrZWZpbGUuc291cmNlcwppbmRleCBiN2E0M2Q0 N2U1ZGYuLmU2OTM3YmI1YzQ3OCAxMDA2NDQKLS0tIGEvdG9vbHMvTWFrZWZpbGUuc291cmNlcwor KysgYi90b29scy9NYWtlZmlsZS5zb3VyY2VzCkBAIC0yOCw2ICsyOCw3IEBAIHRvb2xzX3Byb2df bGlzdHMgPQkJXAogCWludGVsX3BhbmVsX2ZpdHRlcglcCiAJaW50ZWxfcmVnX2NoZWNrZXIJXAog CWludGVsX3Jlc2lkZW5jeQkJXAorCWludGVsX3NjYWxlcl9jb2VmCVwKIAlpbnRlbF9zdGVwcGlu ZwkJXAogCWludGVsX3ZidF9kZWNvZGUJXAogCWludGVsX3dhdGVybWFyawkJXApkaWZmIC0tZ2l0 IGEvdG9vbHMvaW50ZWxfc2NhbGVyX2NvZWYuYyBiL3Rvb2xzL2ludGVsX3NjYWxlcl9jb2VmLmMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi4xOWUyNDdhYjI2NmEKLS0t IC9kZXYvbnVsbAorKysgYi90b29scy9pbnRlbF9zY2FsZXJfY29lZi5jCkBAIC0wLDAgKzEsMTAy MSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDIwIEludGVsIENvcnBvcmF0aW9uCisgKgorICog UGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJz b24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBk b2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBT b2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9u CisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlz dHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdh cmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVy bmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAq CisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGlj ZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGlu IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4K KyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5U WSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1Qg TElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZF TlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBG T1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g QU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJP TSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBP UiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVk ZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2lu Y2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5o PgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVu aXN0ZC5oPgorCisjaW5jbHVkZSAiaWd0X2F1eC5oIgorI2luY2x1ZGUgImRybXRlc3QuaCIKKwor c3RydWN0IGZpbHRlcjsKKworLyoKKyAqIHggPSBbMDpudGFwcy0xXSB3aXRoIGFuIGFkZGl0aW9u YWwgb2Zmc2V0IG9mCisgKiBbLTAuNTowLjVbIGRlcGVuZGluZyBvbiB0aGUgcGhhc2UuCisgKi8K K3R5cGVkZWYgZG91YmxlICgqZnVuYykoY29uc3Qgc3RydWN0IGZpbHRlciAqZiwgZG91YmxlIHgp OworCitzdHJ1Y3QgZnVuY3Rpb24geworCWNvbnN0IGNoYXIgKm5hbWU7CisJZnVuYyBmdW5jOwor fTsKKworc3RydWN0IHBoYXNlIHsKKwlkb3VibGUgKmNvZWZzOworfTsKKworZW51bSBjb2VmX2Zv cm1hdCB7CisJRk9STUFUX09WTF9ZX0hPUlosCisJRk9STUFUX09WTF9VVl9IT1JaLAorCUZPUk1B VF9PVkxfWV9WRVJULAorCUZPUk1BVF9PVkxfVVZfVkVSVCwKKwlGT1JNQVRfSUxLX1BGX0hPUlos CisJRk9STUFUX0lMS19QRl9WRVJUXzVUQVAsCisJRk9STUFUX0lMS19QRl9WRVJUXzNUQVAsCisJ Rk9STUFUX0NOTF9QUywKKwlGT1JNQVRfSU5WQUxJRCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFy ICogY29uc3QgY29lZl9mb3JtYXRzW10gPSB7CisJW0ZPUk1BVF9PVkxfWV9IT1JaXSA9ICJvdmxf eV9ob3J6IiwKKwlbRk9STUFUX09WTF9VVl9IT1JaXSA9ICJvdmxfdXZfaG9yeiIsCisJW0ZPUk1B VF9PVkxfWV9WRVJUXSA9ICJvdmxfeV92ZXJ0IiwKKwlbRk9STUFUX09WTF9VVl9WRVJUXSA9ICJv dmxfdXZfdmVydCIsCisJW0ZPUk1BVF9JTEtfUEZfSE9SWl0gPSAiaWxrX3BmX2hvcnoiLAorCVtG T1JNQVRfSUxLX1BGX1ZFUlRfNVRBUF0gPSAiaWxrX3BmX3ZlcnRfNXRhcCIsCisJW0ZPUk1BVF9J TEtfUEZfVkVSVF8zVEFQXSA9ICJpbGtfcGZfdmVydF8zdGFwIiwKKwlbRk9STUFUX0NOTF9QU10g PSAiY25sX3BzIiwKK307CisKK2VudW0gZmlsdGVyX21vZGUgeworCU1PREVfTE9XUEFTUywKKwlN T0RFX0hJR0hQQVNTLAorCU1PREVfQkFORFBBU1MsCisJTU9ERV9CQU5EU1RPUCwKKwlNT0RFX0lO VkFMSUQsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGZpbHRlcl9tb2Rlc1tdID0g eworCVtNT0RFX0xPV1BBU1NdID0gImxvd3Bhc3MiLAorCVtNT0RFX0hJR0hQQVNTXSA9ICJoaWdo cGFzcyIsCisJW01PREVfQkFORFBBU1NdID0gImJhbmRwYXNzIiwKKwlbTU9ERV9CQU5EU1RPUF0g PSAiYmFuZHN0b3AiLAorfTsKKworc3RydWN0IGZpbHRlcl9jb25maWcgeworCWludCBudGFwczsK KwlpbnQgbnBoYXNlczsKKwlpbnQgY2VudGVyX21hbnRpc3NhX2JpdHM7CisJaW50IG90aGVyX21h bnRpc3NhX2JpdHM7CisJZW51bSBjb2VmX2Zvcm1hdCBmb3JtYXQ7CisJYm9vbCBoaWdoX3ByZWNf dGFwczsKKwlpbnQgbmh3dGFwczsKKwljb25zdCBpbnQgKmh3dGFwczsKK307CisKK3N0cnVjdCBm aWx0ZXIgeworCXN0cnVjdCBmaWx0ZXJfY29uZmlnIGNvbmZpZzsKKwllbnVtIGZpbHRlcl9tb2Rl IG1vZGU7CisJYm9vbCBzdHJpY3Q7CisJZG91YmxlIGN1dG9mZiwgY3V0b2ZmX2hpZ2g7CisJZG91 YmxlIHBoYXNlX29mZnNldDsKKwljb25zdCBzdHJ1Y3QgZnVuY3Rpb24gKmZpbHRlcjsKKwljb25z dCBzdHJ1Y3QgZnVuY3Rpb24gKndpbmRvdzsKKwlzdHJ1Y3QgcGhhc2UgKnBoYXNlczsKK307CisK K3N0YXRpYyBkb3VibGUgX3NpbmMoZG91YmxlIHgpCit7CisJaWYgKHggPT0gMC4wKQorCQlyZXR1 cm4gMS4wOworCWVsc2UKKwkJcmV0dXJuIHNpbih4KSAvIHg7Cit9CisKKy8qIHJldHVybiB0aGUg aW5kZXggb2YgdGhlIGNlbnRlciB0YXAgKi8KK3N0YXRpYyBpbnQgY2VudGVyX3RhcChjb25zdCBz dHJ1Y3QgZmlsdGVyICpmKQoreworCXJldHVybiAoZi0+Y29uZmlnLm50YXBzIC0gMSkgLyAyOwor fQorCisvKiBmaWx0ZXIgZnVuY3Rpb25zICovCisKK3N0YXRpYyBkb3VibGUgbmVhcmVzdChjb25z dCBzdHJ1Y3QgZmlsdGVyICpmLCBkb3VibGUgeCkKK3sKKwlpbnQgbiA9IGNlbnRlcl90YXAoZik7 CisJZG91YmxlIHQgPSAwLjU7CisKKwl4IC09IG47CisKKwlpZiAoeCA+PSAtdCAmJiB4IDwgdCkK KwkJcmV0dXJuIDEuMDsKKwllbHNlCisJCXJldHVybiAwLjA7Cit9CisKK3N0YXRpYyBkb3VibGUg bGluZWFyKGNvbnN0IHN0cnVjdCBmaWx0ZXIgKmYsIGRvdWJsZSB4KQoreworCWludCBuID0gY2Vu dGVyX3RhcChmKTsKKwlkb3VibGUgdCA9IDEuMDsKKworCXggLT0gbjsKKworCWlmICh4ID49IC10 ICYmIHggPCB0KQorCQlyZXR1cm4gMS4wIC0gZmFicyh4KSAvIHQ7CisJZWxzZQorCQlyZXR1cm4g MC4wOworfQorCitzdGF0aWMgZG91YmxlIG5lYXJlc3RfYm94KGNvbnN0IHN0cnVjdCBmaWx0ZXIg KmYsIGRvdWJsZSB4KQoreworCXJldHVybiAxLjA7Cit9CisKK3N0YXRpYyBkb3VibGUgbGluZWFy X2JveChjb25zdCBzdHJ1Y3QgZmlsdGVyICpmLCBkb3VibGUgeCkKK3sKKwlpbnQgaSA9IHggKyAw LjU7CisKKwl4IC09IGk7CisKKwlpZiAoaSA9PSAwKQorCQlyZXR1cm4gMC41IC0gZmFicyh4KTsK KwllbHNlIGlmIChpID09IGYtPmNvbmZpZy5udGFwcyAtIDEpCisJCXJldHVybiAwLjUgKyBmYWJz KHgpOworCWVsc2UKKwkJcmV0dXJuIDEuMDsKK30KKworc3RhdGljIGRvdWJsZSB0ZW50KGNvbnN0 IHN0cnVjdCBmaWx0ZXIgKmYsIGRvdWJsZSB4KQoreworCWludCBuID0gY2VudGVyX3RhcChmKTsK Kwlkb3VibGUgdCA9IGYtPmNvbmZpZy5udGFwcyAvIDI7CisKKwl4IC09IG47CisKKwlpZiAoeCA+ PSAtdCAmJiB4IDwgdCkKKwkJcmV0dXJuIDEuMCAtIGZhYnMoeCkgLyB0OworCWVsc2UKKwkJcmV0 dXJuIDAuMDsKK30KKworc3RhdGljIGRvdWJsZSBzaW5jKGNvbnN0IHN0cnVjdCBmaWx0ZXIgKmYs IGRvdWJsZSB4KQoreworCWludCBuID0gY2VudGVyX3RhcChmKTsKKworCXggPSBmLT5jdXRvZmYg KiAyLjAgKiBNX1BJICogKHggLSBuKTsKKworCXJldHVybiBfc2luYyh4KTsKK30KKworc3RhdGlj IGRvdWJsZSBzaGFycChjb25zdCBzdHJ1Y3QgZmlsdGVyICpmLCBkb3VibGUgeCkKK3sKKwlpbnQg biA9IGNlbnRlcl90YXAoZik7CisJaW50IGkgPSB4ICsgMC41OworCisJaWYgKGkgPT0gbikKKwkJ cmV0dXJuIDUuMDsKKwllbHNlIGlmIChpID09IG4tMSB8fCBpPT1uKzEpCisJCXJldHVybiAtMi4w OworCWVsc2UKKwkJcmV0dXJuIDAuMDsKK30KKworc3RhdGljIGRvdWJsZSBlZGdlKGNvbnN0IHN0 cnVjdCBmaWx0ZXIgKmYsIGRvdWJsZSB4KQoreworCWludCBuID0gY2VudGVyX3RhcChmKTsKKwlp bnQgaSA9IHggKyAwLjU7CisKKwlpZiAoaSA9PSBuKQorCQlyZXR1cm4gLTMuMDsKKwllbHNlIGlm IChpID09IG4tMSB8fCBpPT1uKzEpCisJCXJldHVybiAxLjA7CisJZWxzZSBpZiAoaSA9PSBuLTIg fHwgaT09bisyKQorCQlyZXR1cm4gLTAuMjU7CisJZWxzZQorCQlyZXR1cm4gMC4wOworfQorCitz dGF0aWMgY29uc3Qgc3RydWN0IGZ1bmN0aW9uIGZpbHRlcl9mdW5jc1tdID0geworCXsgLm5hbWUg PSAibmVhcmVzdCIsIC5mdW5jID0gbmVhcmVzdCwgfSwKKwl7IC5uYW1lID0gImxpbmVhciIsIC5m dW5jID0gbGluZWFyLCB9LAorCXsgLm5hbWUgPSAibmVhcmVzdF9ib3giLCAuZnVuYyA9IG5lYXJl c3RfYm94LCB9LAorCXsgLm5hbWUgPSAibGluZWFyX2JveCIsIC5mdW5jID0gbGluZWFyX2JveCwg fSwKKwl7IC5uYW1lID0gInRlbnQiLCAuZnVuYyA9IHRlbnQsIH0sCisJeyAubmFtZSA9ICJzaW5j IiwgLmZ1bmMgPSBzaW5jLCB9LAorCXsgLm5hbWUgPSAic2hhcnAiLCAuZnVuYyA9IHNoYXJwLCB9 LAorCXsgLm5hbWUgPSAiZWRnZSIsIC5mdW5jID0gZWRnZSwgfSwKK307CisKKy8qIHdpbmRvdyBm dW5jdGlvbnMgKi8KKworc3RhdGljIGRvdWJsZSByZWN0KGNvbnN0IHN0cnVjdCBmaWx0ZXIgKmYs IGRvdWJsZSB4KQoreworCXJldHVybiAxLjA7Cit9CisKK3N0YXRpYyBkb3VibGUgaGFubihjb25z dCBzdHJ1Y3QgZmlsdGVyICpmLCBkb3VibGUgeCkKK3sKKwl4ID0gMi4wICogTV9QSSAqIHggLyAo Zi0+Y29uZmlnLm50YXBzIC0gMSk7CisKKwlyZXR1cm4gMC41IC0gMC41ICogY29zKHgpOworfQor CitzdGF0aWMgZG91YmxlIGhhbm5fd2lkZShjb25zdCBzdHJ1Y3QgZmlsdGVyICpmLCBkb3VibGUg eCkKK3sKKwl4ID0gMi4wICogTV9QSSAqICh4ICsgMC41KSAvIGYtPmNvbmZpZy5udGFwczsKKwor CXJldHVybiAwLjUgLSAwLjUgKiBjb3MoeCk7Cit9CisKK3N0YXRpYyBkb3VibGUgaGFtbWluZyhj b25zdCBzdHJ1Y3QgZmlsdGVyICpmLCBkb3VibGUgeCkKK3sKKwl4ID0gMi4wICogTV9QSSAqIHgg LyAoZi0+Y29uZmlnLm50YXBzIC0gMSk7CisKKwlyZXR1cm4gMC41NCAtIDAuNDYgKiBjb3MoeCk7 Cit9CisKK3N0YXRpYyBkb3VibGUgYmxhY2ttYW4oY29uc3Qgc3RydWN0IGZpbHRlciAqZiwgZG91 YmxlIHgpCit7CisJeCA9IDIuMCAqIE1fUEkgKiB4IC8gKGYtPmNvbmZpZy5udGFwcyAtIDEpOwor CisJcmV0dXJuIDAuNDIgLSAwLjUgKiBjb3MoeCkgKyAwLjA4ICogY29zKDIuMCAqIHgpOworfQor CitzdGF0aWMgZG91YmxlIGxhbmN6b3MyKGNvbnN0IHN0cnVjdCBmaWx0ZXIgKmYsIGRvdWJsZSB4 KQoreworCWludCBuID0gY2VudGVyX3RhcChmKTsKKworCXggPSBNX1BJICogKHggLSBuKSAvIDIu MDsKKworCXJldHVybiBfc2luYyh4KTsKK30KKworc3RhdGljIGRvdWJsZSBsYW5jem9zMyhjb25z dCBzdHJ1Y3QgZmlsdGVyICpmLCBkb3VibGUgeCkKK3sKKwlpbnQgbiA9IGNlbnRlcl90YXAoZik7 CisKKwl4ID0gTV9QSSAqICh4IC0gbikgLyAzLjA7CisKKwlyZXR1cm4gX3NpbmMoeCk7Cit9CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnVuY3Rpb24gd2luZG93X2Z1bmNzW10gPSB7CisJeyAubmFt ZSA9ICJyZWN0IiwgLmZ1bmMgPSByZWN0LCB9LAorCXsgLm5hbWUgPSAiYmFydGxldHQiLCAuZnVu YyA9IHRlbnQsIH0sCisJeyAubmFtZSA9ICJoYW5uIiwgLmZ1bmMgPSBoYW5uLCB9LAorCXsgLm5h bWUgPSAiaGFubl93aWRlIiwgLmZ1bmMgPSBoYW5uX3dpZGUsIH0sCisJeyAubmFtZSA9ICJoYW1t aW5nIiwgLmZ1bmMgPSBoYW1taW5nLCB9LAorCXsgLm5hbWUgPSAiYmxhY2ttYW4iLCAuZnVuYyA9 IGJsYWNrbWFuLCB9LAorCXsgLm5hbWUgPSAibGFuY3pvczIiLCAuZnVuYyA9IGxhbmN6b3MyLCB9 LAorCXsgLm5hbWUgPSAibGFuY3pvczMiLCAuZnVuYyA9IGxhbmN6b3MzLCB9LAorfTsKKworLyog Ki8KKworc3RhdGljIGRvdWJsZSBzdW1fdGFwcyhjb25zdCBzdHJ1Y3QgZmlsdGVyICpmLCBpbnQg cCkKK3sKKwljb25zdCBkb3VibGUgKmNvZWZzID0gZi0+cGhhc2VzW3BdLmNvZWZzOworCWRvdWJs ZSBzdW0gPSAwLjA7CisKKwlmb3IgKGludCB0ID0gMDsgdCA8IGYtPmNvbmZpZy5udGFwczsgdCsr KQorCQlzdW0gKz0gY29lZnNbdF07CisKKwlyZXR1cm4gc3VtOworfQorCitzdGF0aWMgZG91Ymxl IGNhbGNfcGhhc2UoY29uc3Qgc3RydWN0IGZpbHRlciAqZiwgaW50IHApCit7CisJLyogWy0wLjU6 MC41WyArIHBoYXNlX29mZnNldCAqLworCXJldHVybiAoZG91YmxlKSBwIC8gZi0+Y29uZmlnLm5w aGFzZXMgLSAwLjUgKyBmLT5waGFzZV9vZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9w aGFzZShzdHJ1Y3QgZmlsdGVyICpmLCBpbnQgcCwgZG91YmxlICpjb2VmcykKK3sKKwlkb3VibGUg cGhhc2UgPSBjYWxjX3BoYXNlKGYsIHApOworCWZ1bmMgZmlsdGVyID0gZi0+ZmlsdGVyLT5mdW5j OworCisJZm9yIChpbnQgdCA9IDA7IHQgPCBmLT5jb25maWcubnRhcHM7IHQrKykKKwkJY29lZnNb dF0gPSBmaWx0ZXIoZiwgdCArIHBoYXNlKTsKK30KKworc3RhdGljIHZvaWQgaW52ZXJ0X3BoYXNl KHN0cnVjdCBmaWx0ZXIgKmYsIGRvdWJsZSAqY29lZnMpCit7CisJaW50IG4gPSBjZW50ZXJfdGFw KGYpOworCisJZm9yIChpbnQgdCA9IDA7IHQgPCBmLT5jb25maWcubnRhcHM7IHQrKykKKwkJY29l ZnNbdF0gPSAtY29lZnNbdF07CisKKwljb2Vmc1tuXSArPSAxLjA7Cit9CisKK3N0YXRpYyB2b2lk IGFkZF9waGFzZShzdHJ1Y3QgZmlsdGVyICpmLCBpbnQgcCwKKwkJICAgICAgY29uc3QgZG91Ymxl ICpjb2VmczIpCit7CisJZG91YmxlICpjb2VmcyA9IGYtPnBoYXNlc1twXS5jb2VmczsKKworCWZv ciAoaW50IHQgPSAwOyB0IDwgZi0+Y29uZmlnLm50YXBzOyB0KyspCisJCWNvZWZzW3RdICs9IGNv ZWZzMlt0XTsKK30KKworc3RhdGljIHZvaWQgbXVsX3BoYXNlKHN0cnVjdCBmaWx0ZXIgKmYsIGlu dCBwLCBkb3VibGUgbXVsKQoreworCWRvdWJsZSAqY29lZnMgPSBmLT5waGFzZXNbcF0uY29lZnM7 CisKKwlmb3IgKGludCB0ID0gMDsgdCA8IGYtPmNvbmZpZy5udGFwczsgdCsrKQorCQljb2Vmc1t0 XSAqPSBtdWw7Cit9CisKK3N0YXRpYyB2b2lkIHdpbmRvd19waGFzZShzdHJ1Y3QgZmlsdGVyICpm LCBpbnQgcCkKK3sKKwlkb3VibGUgcGhhc2UgPSBjYWxjX3BoYXNlKGYsIHApOworCWRvdWJsZSAq Y29lZnMgPSBmLT5waGFzZXNbcF0uY29lZnM7CisJZnVuYyB3aW5kb3cgPSBmLT53aW5kb3ctPmZ1 bmM7CisKKwlmb3IgKGludCB0ID0gMDsgdCA8IGYtPmNvbmZpZy5udGFwczsgdCsrKQorCQljb2Vm c1t0XSAqPSB3aW5kb3coZiwgdCArIHBoYXNlKTsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJhdGVf ZmlsdGVyX3BoYXNlKHN0cnVjdCBmaWx0ZXIgKmYsIGludCBwKQoreworCWRvdWJsZSAqY29lZnMg PSBmLT5waGFzZXNbcF0uY29lZnM7CisKKwkvKiBhcHBseSB0aGUgZmlsdGVyIGZ1bmN0aW9uICov CisJY3JlYXRlX3BoYXNlKGYsIHAsIGNvZWZzKTsKKworCWlmIChmLT5tb2RlID09IE1PREVfSElH SFBBU1MpCisJCWludmVydF9waGFzZShmLCBjb2Vmcyk7CisKKwlpZiAoZi0+bW9kZSA9PSBNT0RF X0JBTkRQQVNTIHx8IGYtPm1vZGUgPT0gTU9ERV9CQU5EU1RPUCkgeworCQlkb3VibGUgY29lZnNf aGlnaFtmLT5jb25maWcubnRhcHNdOworCisJCWlndF9zd2FwKGYtPmN1dG9mZiwgZi0+Y3V0b2Zm X2hpZ2gpOworCisJCWNyZWF0ZV9waGFzZShmLCBwLCBjb2Vmc19oaWdoKTsKKwkJaW52ZXJ0X3Bo YXNlKGYsIGNvZWZzX2hpZ2gpOworCQlhZGRfcGhhc2UoZiwgcCwgY29lZnNfaGlnaCk7CisKKwkJ aWd0X3N3YXAoZi0+Y3V0b2ZmLCBmLT5jdXRvZmZfaGlnaCk7CisKKwkJaWYgKGYtPm1vZGUgPT0g TU9ERV9CQU5EUEFTUykKKwkJCWludmVydF9waGFzZShmLCBjb2Vmcyk7CisJfQorCisJLyogYXBw bHkgd2luZG93IGZ1bmN0aW9uICovCisJd2luZG93X3BoYXNlKGYsIHApOworCisJLyogbm9ybWFs aXplICovCisJbXVsX3BoYXNlKGYsIHAsIDEuMCAvIHN1bV90YXBzKGYsIHApKTsKK30KKworc3Rh dGljIHZvaWQgZ2VuZXJhdGVfZmlsdGVyKHN0cnVjdCBmaWx0ZXIgKmYpCit7CisJaW50IHA7CisK KwlmLT5waGFzZXMgPSBjYWxsb2MoZi0+Y29uZmlnLm5waGFzZXMvMisxLCBzaXplb2YgZi0+cGhh c2VzWzBdKTsKKwlhc3NlcnQoZi0+cGhhc2VzKTsKKworCWZvciAocCA9IDA7IHAgPCBmLT5jb25m aWcubnBoYXNlcy8yKzE7IHArKykgeworCQlmLT5waGFzZXNbcF0uY29lZnMgPSBjYWxsb2MoZi0+ Y29uZmlnLm50YXBzLCBzaXplb2YgZi0+cGhhc2VzW3BdLmNvZWZzWzBdKTsKKwkJYXNzZXJ0KGYt PnBoYXNlc1twXS5jb2Vmcyk7CisKKwkJZ2VuZXJhdGVfZmlsdGVyX3BoYXNlKGYsIHApOworCX0K K30KKworc3RhdGljIGludCBuaHd0YXBzKGNvbnN0IHN0cnVjdCBmaWx0ZXIgKmYpCit7CisJcmV0 dXJuIGYtPmNvbmZpZy5uaHd0YXBzID86IGYtPmNvbmZpZy5udGFwczsKK30KKworc3RhdGljIGlu dCBod3RhcF90b190YXAoY29uc3Qgc3RydWN0IGZpbHRlciAqZiwgaW50IF90KQoreworCWlmICgh Zi0+Y29uZmlnLmh3dGFwcykKKwkJcmV0dXJuIF90OworCisJZm9yIChpbnQgdCA9IDA7IHQgPCBm LT5jb25maWcubmh3dGFwczsgdCsrKSB7CisJCWlmIChmLT5jb25maWcuaHd0YXBzW3RdID09IF90 KQorCQkJcmV0dXJuIHQ7CisJfQorCisJcmV0dXJuIC0xOworfQorCisjaWYgMAorc3RhdGljIGlu dCB0YXBfdG9faHd0YXAoY29uc3Qgc3RydWN0IGZpbHRlciAqZiwgaW50IHQpCit7CisJaWYgKCFm LT5jb25maWcuaHd0YXBzKQorCQlyZXR1cm4gdDsKKworCXJldHVybiBmLT5jb25maWcuaHd0YXBz W3RdOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBpbnQgaWxrX3BmX3ZlcnRfM3RhcF9od3Rh cHNbXSA9IHsgMCwgMiwgNCB9Oworc3RhdGljIGNvbnN0IGludCBjbmxfcHNfaHd0YXBzW10gPSB7 IDYsIDUsIDQsIDMsIDIsIDEsIDAgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWx0ZXJfY29u ZmlnIGNvbmZpZ3NbXSA9IHsKKwlbRk9STUFUX09WTF9ZX0hPUlpdID0geworCQkubnRhcHMgPSA1 LCAubnBoYXNlcyA9IDMyLAorCQkuY2VudGVyX21hbnRpc3NhX2JpdHMgPSA5LAorCQkub3RoZXJf bWFudGlzc2FfYml0cyA9IDcsCisJCS5mb3JtYXQgPSBGT1JNQVRfT1ZMX1lfSE9SWiwKKwl9LAor CVtGT1JNQVRfT1ZMX1VWX0hPUlpdID0geworCQkubnRhcHMgPSAzLCAubnBoYXNlcyA9IDMyLAor CQkuY2VudGVyX21hbnRpc3NhX2JpdHMgPSA5LAorCQkub3RoZXJfbWFudGlzc2FfYml0cyA9IDcs CisJCS5mb3JtYXQgPSBGT1JNQVRfT1ZMX1VWX0hPUlosCisJfSwKKwlbRk9STUFUX09WTF9ZX1ZF UlRdID0geworCQkubnRhcHMgPSAzLCAubnBoYXNlcyA9IDMyLAorCQkuY2VudGVyX21hbnRpc3Nh X2JpdHMgPSA4LAorCQkub3RoZXJfbWFudGlzc2FfYml0cyA9IDYsCisJCS5mb3JtYXQgPSBGT1JN QVRfT1ZMX1lfVkVSVCwKKwl9LAorCVtGT1JNQVRfT1ZMX1VWX1ZFUlRdID0geworCQkubnRhcHMg PSAzLCAubnBoYXNlcyA9IDMyLAorCQkuY2VudGVyX21hbnRpc3NhX2JpdHMgPSA2LAorCQkub3Ro ZXJfbWFudGlzc2FfYml0cyA9IDYsCisJCS5mb3JtYXQgPSBGT1JNQVRfT1ZMX1VWX1ZFUlQsCisJ fSwKKwlbRk9STUFUX0lMS19QRl9IT1JaXSA9IHsKKwkJLm50YXBzID0gNywgLm5waGFzZXMgPSAz MiwKKwkJLmNlbnRlcl9tYW50aXNzYV9iaXRzID0gOSwKKwkJLm90aGVyX21hbnRpc3NhX2JpdHMg PSA3LAorCQkuaGlnaF9wcmVjX3RhcHMgPSB0cnVlLAorCQkuZm9ybWF0ID0gRk9STUFUX0lMS19Q Rl9IT1JaLAorCX0sCisJW0ZPUk1BVF9JTEtfUEZfVkVSVF81VEFQXSA9IHsKKwkJLm50YXBzID0g NSwgLm5waGFzZXMgPSAzMiwKKwkJLmNlbnRlcl9tYW50aXNzYV9iaXRzID0gOSwKKwkJLm90aGVy X21hbnRpc3NhX2JpdHMgPSA3LAorCQkuaGlnaF9wcmVjX3RhcHMgPSB0cnVlLAorCQkuZm9ybWF0 ID0gRk9STUFUX0lMS19QRl9WRVJUXzVUQVAsCisJfSwKKwlbRk9STUFUX0lMS19QRl9WRVJUXzNU QVBdID0geworCQkubnRhcHMgPSAzLCAubnBoYXNlcyA9IDMyLAorCQkuY2VudGVyX21hbnRpc3Nh X2JpdHMgPSA5LAorCQkub3RoZXJfbWFudGlzc2FfYml0cyA9IDcsCisJCS5oaWdoX3ByZWNfdGFw cyA9IHRydWUsCisJCS5mb3JtYXQgPSBGT1JNQVRfSUxLX1BGX1ZFUlRfM1RBUCwKKwkJLmh3dGFw cyA9IGlsa19wZl92ZXJ0XzN0YXBfaHd0YXBzLCAubmh3dGFwcyA9IDUsCisJfSwKKwlbRk9STUFU X0NOTF9QU10gPSB7CisJCS5udGFwcyA9IDcsIC5ucGhhc2VzID0gMzIsCisJCS5jZW50ZXJfbWFu dGlzc2FfYml0cyA9IDksCisJCS5vdGhlcl9tYW50aXNzYV9iaXRzID0gOSwKKwkJLmZvcm1hdCA9 IEZPUk1BVF9DTkxfUFMsCisJCS5od3RhcHMgPSBjbmxfcHNfaHd0YXBzLCAubmh3dGFwcyA9IDcs CisJfSwKK307CisKKy8qCisgKiBGaWx0ZXIgY29lZmZpY2llbnQgZm9ybWF0IHVzZWQgYnk6Cisg KiAtIGdlbjIvMy80IHZpZGVvIG92ZXJsYXkKKyAqIC0gaWxrL3NuYi9pdmIgN3g1IHBhbmVsIGZp dHRlcgorICogLSBjbmwrIHBpcGUgc2NhbGVyCisgKi8KK3VuaW9uIGdlbjJfY29lZl9yZWcKK3sK KwlzdHJ1Y3QgeworCQl1aW50MTZfdCBtYW50aXNzYToxMjsKKwkJdWludDE2X3QgZXhwb25lbnQ6 MzsKKwkJdWludDE2X3Qgc2lnbjoxOworCX07CisJdWludDE2X3QgcmVnOworfTsKKworc3RhdGlj IGludCBleHBfdG9faHcoY29uc3Qgc3RydWN0IGZpbHRlciAqZiwgaW50IHQsIGludCBleHApCit7 CisJLyoKKwkgKiBPbiBzb21lIGh3IHRoZSBub24tY2VudGVyIHRhcHMgdHJhZGUKKwkgKiBhd2F5 ID49IDEuMCB2YWx1ZXMgZm9yIG1vcmUgcHJlY2lzaW9uLgorCSAqLworCWlmIChmLT5jb25maWcu aGlnaF9wcmVjX3RhcHMgJiYgdCAhPSBjZW50ZXJfdGFwKGYpICYmIGV4cCA9PSA0KQorCQlleHAg PSAwOworCisJYXNzZXJ0KGV4cCA+PSAwICYmIGV4cCA8PSAzKTsKKworCXJldHVybiBleHA7Cit9 CisKK3N0YXRpYyBpbnQgZXhwX2Zyb21faHcoY29uc3Qgc3RydWN0IGZpbHRlciAqZiwgaW50IHQs IGludCBleHApCit7CisJYXNzZXJ0KGV4cCA+PSAwICYmIGV4cCA8PSAzKTsKKworCS8qCisJICog T24gc29tZSBodyB0aGUgbm9uLWNlbnRlciB0YXBzIHRyYWRlCisJICogYXdheSA+PSAxLjAgdmFs dWVzIGZvciBtb3JlIHByZWNpc2lvbi4KKwkgKi8KKwlpZiAoZi0+Y29uZmlnLmhpZ2hfcHJlY190 YXBzICYmIHQgIT0gY2VudGVyX3RhcChmKSAmJiBleHAgPT0gMCkKKwkJZXhwID0gNDsKKworCXJl dHVybiBleHA7Cit9CisKK3N0YXRpYyBpbnQgc2lnbl90b19pbnQoYm9vbCBzaWduKQoreworCXJl dHVybiBzaWduID8gLTEgOiAxOworfQorCitzdGF0aWMgZG91YmxlIGdlbjJfcmVnX3RvX2NvZWYo Y29uc3Qgc3RydWN0IGZpbHRlciAqZiwgaW50IHQsCisJCQkgICAgICAgY29uc3QgdW5pb24gZ2Vu Ml9jb2VmX3JlZyAqcikKK3sKKwlyZXR1cm4gKHNpZ25fdG9faW50KHItPnNpZ24pICogKGRvdWJs ZSkgci0+bWFudGlzc2EpIC8KKwkJKDEgPDwgKDExICsgZXhwX2Zyb21faHcoZiwgdCwgci0+ZXhw b25lbnQpKSk7Cit9CisKKworc3RhdGljIGludCBnZW4yX21hbnRpc3NhX2JpdHMoY29uc3Qgc3Ry dWN0IGZpbHRlciAqZiwgaW50IHQpCit7CisJaWYgKHQgPT0gY2VudGVyX3RhcChmKSkKKwkJcmV0 dXJuIGYtPmNvbmZpZy5jZW50ZXJfbWFudGlzc2FfYml0czsKKwllbHNlCisJCXJldHVybiBmLT5j b25maWcub3RoZXJfbWFudGlzc2FfYml0czsKK30KKworc3RhdGljIHZvaWQgZ2VuMl9jb2VmX3Rv X3JlZyhjb25zdCBzdHJ1Y3QgZmlsdGVyICpmLAorCQkJICAgICBpbnQgdCwgZG91YmxlIGNvZWYs CisJCQkgICAgIHVuaW9uIGdlbjJfY29lZl9yZWcgKnIpCit7CisJaW50IG1hbnRpc3NhX2JpdHMg PSBnZW4yX21hbnRpc3NhX2JpdHMoZiwgdCk7CisJaW50IG1heCA9ICgxIDw8IG1hbnRpc3NhX2Jp dHMpIC0gMTsKKwlpbnQgZXhwLCBleHBfbWF4LCBleHBfbWluOworCisJaWYgKGYtPmNvbmZpZy5o aWdoX3ByZWNfdGFwcyAmJiB0ICE9IGNlbnRlcl90YXAoZikpIHsKKwkJZXhwX21pbiA9IDE7CisJ CWV4cF9tYXggPSA0OworCX0gZWxzZSB7CisJCWV4cF9taW4gPSAwOworCQlleHBfbWF4ID0gMzsK Kwl9CisKKwlpZiAoY29lZiA8IDAuMCkgeworCQljb2VmID0gLWNvZWY7CisJCXItPnNpZ24gPSAx OworCX0gZWxzZSB7CisJCXItPnNpZ24gPSAwOworCX0KKworCS8qIGZpbmQgdGhlIGV4cG9uZW50 IHRoYXQgZ2l2ZXMgdGhlIGJlc3QgcHJlY2lzaW9uICovCisJZm9yIChleHAgPSBleHBfbWF4OyBl eHAgPj0gZXhwX21pbjsgZXhwLS0pIHsKKwkJaW50IGMgPSBjb2VmICogKDEgPDwgKG1hbnRpc3Nh X2JpdHMgKyBleHAgLSAxKSkgKyAwLjU7CisKKwkJaWYgKCFmLT5zdHJpY3QgJiYgZXhwID09IGV4 cF9taW4pCisJCQljID0gbWluKGMsIG1heC0xKTsKKworCQlpZiAoYyA8PSBtYXgpIHsKKwkJCXIt PmV4cG9uZW50ID0gZXhwX3RvX2h3KGYsIHQsIGV4cCk7CisJCQlyLT5tYW50aXNzYSA9IGMgPDwg KDEyIC0gbWFudGlzc2FfYml0cyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlmcHJpbnRmKHN0 ZGVyciwgIlVuYWJsZSB0byByZXByZXNlbnQgJWYgaW4gaGFyZHdhcmUgZm9ybWF0XG4iLAorCQlz aWduX3RvX2ludChyLT5zaWduKSAqIGNvZWYpOworCWFzc2VydCgwKTsKK30KKworLyoKKyAqIENh bGN1bGF0ZSB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgcmVnaXN0ZXIgZm9ybWF0IGZvciB0aGUgdGFw CisgKiBhbmQgdHJhbnNsYXRlIHRoYXQgYmFjayB0byBhIGZsb2F0aW5nIHBvaW50IHZhbHVlLiBT byBhZnRlcndhcmRzCisgKiB0aGUgZmxvYXRpbmcgcG9pbnQgdmFsdWUgd2lsbCBiZSBsaW1pdGVk IGJ5IHRoZSBwcmVjaXNpb24gb2YKKyAqIHRoZSBoYXJkd2FyZS4KKyAqLworc3RhdGljIHZvaWQg Z2VuMl91cGRhdGVfdGFwKHN0cnVjdCBmaWx0ZXIgKmYsIGludCBwLCBpbnQgdCkKK3sKKwlkb3Vi bGUgKmNvZWZzID0gZi0+cGhhc2VzW3BdLmNvZWZzOworCXVuaW9uIGdlbjJfY29lZl9yZWcgcjsK KworCWdlbjJfY29lZl90b19yZWcoZiwgdCwgY29lZnNbdF0sICZyKTsKKworCWNvZWZzW3RdID0g Z2VuMl9yZWdfdG9fY29lZihmLCB0LCAmcik7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90YXAo c3RydWN0IGZpbHRlciAqZiwgaW50IHAsIGludCB0KQoreworCXN3aXRjaCAoZi0+Y29uZmlnLmZv cm1hdCkgeworCWRlZmF1bHQ6CisJCWdlbjJfdXBkYXRlX3RhcChmLCBwLCB0KTsKKwkJYnJlYWs7 CisJfQorfQorCisvKgorICogQ29udmVydCB0aGUgY29lZmZpY2llbnRzIGludG8gdGhlIGhhcmR3 YXJlIGZvcm1hdCBhbmQgYmFjaworICovCitzdGF0aWMgdm9pZCB1cGRhdGVfdGFwcyhzdHJ1Y3Qg ZmlsdGVyICpmLCBpbnQgcCkKK3sKKwlmb3IgKGludCB0ID0gMDsgdCA8IGYtPmNvbmZpZy5udGFw czsgdCsrKQorCQl1cGRhdGVfdGFwKGYsIHAsIHQpOworfQorCisvKgorICogTWFrZSB0aGUgdGFw cyBzdW0gdG8gMS4wIGJ5IGFkZGluZyB0aGUgcmVtYWluaW5nIGVycm9yCisgKiB0byBlYWNoIHRh cCBpbiB0dXJuIHN0YXJ0aW5nIGZyb20gdGhlIGNlbnRlciB0YXAuCisgKi8KK3N0YXRpYyB2b2lk IGZpeHVwX3RhcHMoc3RydWN0IGZpbHRlciAqZiwgaW50IHApCit7CisJZG91YmxlICpjb2VmcyA9 IGYtPnBoYXNlc1twXS5jb2VmczsKKwlkb3VibGUgc3VtOworCWludCBpOworCisJc3VtID0gc3Vt X3RhcHMoZiwgcCk7CisKKwl3aGlsZSAoc3VtICE9IDEuMCkgeworCQlmb3IgKGkgPSAwOyBpIDwg Zi0+Y29uZmlnLm50YXBzOyBpKyspIHsKKwkJCWludCBuID0gY2VudGVyX3RhcChmKTsKKwkJCWlu dCB0OworCisJCQlpZiAoaSAmIDEpCisJCQkJdCA9IG4gKyAoaSArIDEpIC8gMjsKKwkJCWVsc2UK KwkJCQl0ID0gbiAtIGkgLyAyOworCisJCQljb2Vmc1t0XSArPSAxLjAgLSBzdW07CisKKwkJCXVw ZGF0ZV90YXAoZiwgcCwgdCk7CisKKwkJCXN1bSA9IHN1bV90YXBzKGYsIHApOworCQkJaWYgKHN1 bSA9PSAxLjApCisJCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qCisgKiBDb252ZXJ0IHRoZSBm aWx0ZXIgY29lZmZpY2llbnRzIGludG8gdGhlIGhhcmR3YXJlIHNwZWNpZmljCisgKiBmb3JtYXQg YW5kIGJhY2suCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9maWx0ZXIoc3RydWN0IGZpbHRlciAq ZikKK3sKKwlmb3IgKGludCBwID0gMDsgcCA8IGYtPmNvbmZpZy5ucGhhc2VzLzIrMTsgcCsrKQor CQl1cGRhdGVfdGFwcyhmLCBwKTsKK30KKworLyoKKyAqIE1ha2Ugc3VyZSB0aGUgdGFwcyBmb3Ig ZWFjaCBwaGFzZSBzdW0gdXAgdG8gMS4wIGFuZCBhZGp1c3QKKyAqIGlmIG5lY2Vzc2FyeSB0byBn dWFyYW50ZWUgdGhhdC4KKyAqLworc3RhdGljIHZvaWQgZml4dXBfZmlsdGVyKHN0cnVjdCBmaWx0 ZXIgKmYpCit7CisJZm9yIChpbnQgcCA9IDA7IHAgPCBmLT5jb25maWcubnBoYXNlcy8yKzE7IHAr KykKKwkJZml4dXBfdGFwcyhmLCBwKTsKK30KKworLyogKi8KKworLyoKKyAqIFByaW50IG91dCB0 aGUgZmlsdGVyIGluZm9ybWF0aW9uIGluIGZsb2F0aW5nIHBvaW50IGZvcm1hdC4KKyAqLworc3Rh dGljIHZvaWQgcHJpbnRfZmlsdGVyKGNvbnN0IHN0cnVjdCBmaWx0ZXIgKmYpCit7CisJaW50IHAs IHQ7CisKKwlwcmludGYoIiBmb3JtYXQgPSAlc1xuIgorCSAgICAgICAiIG50YXBzID0gJWRcbiIK KwkgICAgICAgIiBucGhhc2VzID0gJWRcbiIKKwkgICAgICAgIiBjdXRvZmYgPSAlZlxuIgorCSAg ICAgICAiIGN1dG9mZl9oaWdoID0gJWZcbiIKKwkgICAgICAgIiBmaWx0ZXIgPSAlc1xuIgorCSAg ICAgICAiIHdpbmRvdyA9ICVzXG4iCisJICAgICAgICIgbW9kZSA9ICVzXG4iCisJICAgICAgICIg Y29lZnMgPSB7XG4iLAorCSAgICAgICBjb2VmX2Zvcm1hdHNbZi0+Y29uZmlnLmZvcm1hdF0sCisJ ICAgICAgIGYtPmNvbmZpZy5udGFwcywgZi0+Y29uZmlnLm5waGFzZXMsCisJICAgICAgIGYtPmN1 dG9mZiwgZi0+Y3V0b2ZmX2hpZ2gsCisJICAgICAgIGYtPmZpbHRlci0+bmFtZSwgZi0+d2luZG93 LT5uYW1lLAorCSAgICAgICBmaWx0ZXJfbW9kZXNbZi0+bW9kZV0pOworCisJZm9yIChwID0gMDsg cCA8IGYtPmNvbmZpZy5ucGhhc2VzLzIrMTsgcCsrKSB7CisJCWNvbnN0IGRvdWJsZSAqY29lZnMg PSBmLT5waGFzZXNbcF0uY29lZnM7CisJCWRvdWJsZSBzdW0gPSAwLjA7CisKKwkJcHJpbnRmKCIg JTRkOiB7IiwgcCk7CisJCWZvciAodCA9IDA7IHQgPCBmLT5jb25maWcubnRhcHM7IHQrKykgewor CQkJcHJpbnRmKCIgJSBmIiwgY29lZnNbdF0pOworCQkJc3VtICs9IGNvZWZzW3RdOworCQl9CisJ CXByaW50ZigiIH0gc3VtID0gJS4xMGZcbiIsIHN1bSk7CisJfQorCXByaW50ZigiIH1cbiIpOwor fQorCisvKgorICogUHJpbnQgb3V0IHRoZSBmaWx0ZXIgaW5mb3JtYXRpb24gaW4gaGFyZHdhcmUg c3BlY2lmaWMgZm9ybWF0LgorICovCitzdGF0aWMgdm9pZCBod19wcmludF9maWx0ZXIoY29uc3Qg c3RydWN0IGZpbHRlciAqZikKK3sKKwlwcmludGYoIiBmb3JtYXQgPSAlc1xuIgorCSAgICAgICAi IG50YXBzID0gJWRcbiIKKwkgICAgICAgIiBucGhhc2VzID0gJWRcbiIKKwkgICAgICAgIiBjdXRv ZmYgPSAlZlxuIgorCSAgICAgICAiIGN1dG9mZl9oaWdoID0gJWZcbiIKKwkgICAgICAgIiBmaWx0 ZXIgPSAlc1xuIgorCSAgICAgICAiIHdpbmRvdyA9ICVzXG4iCisJICAgICAgICIgbW9kZSA9ICVz XG4iCisJICAgICAgICIgY29lZnMgPSB7XG4iLAorCSAgICAgICBjb2VmX2Zvcm1hdHNbZi0+Y29u ZmlnLmZvcm1hdF0sCisJICAgICAgIGYtPmNvbmZpZy5udGFwcywgZi0+Y29uZmlnLm5waGFzZXMs CisJICAgICAgIGYtPmN1dG9mZiwgZi0+Y3V0b2ZmX2hpZ2gsCisJICAgICAgIGYtPmZpbHRlci0+ bmFtZSwgZi0+d2luZG93LT5uYW1lLAorCSAgICAgICBmaWx0ZXJfbW9kZXNbZi0+bW9kZV0pOwor CisJZm9yIChpbnQgcCA9IDA7IHAgPCBmLT5jb25maWcubnBoYXNlcy8yKzE7IHArKykgeworCQlj b25zdCBkb3VibGUgKmNvZWZzID0gZi0+cGhhc2VzW3BdLmNvZWZzOworCQlpbnQgc3VtID0gMDsK KworCQlwcmludGYoIiAlNGQ6IHsiLCBwKTsKKwkJZm9yIChpbnQgdCA9IDA7IHQgPCBmLT5jb25m aWcubnRhcHM7IHQrKykgeworCQkJc3dpdGNoIChmLT5jb25maWcuZm9ybWF0KSB7CisJCQlkZWZh dWx0OiB7CisJCQkJdW5pb24gZ2VuMl9jb2VmX3JlZyByOworCQkJCWludCBleHA7CisKKwkJCQln ZW4yX2NvZWZfdG9fcmVnKGYsIHQsIGNvZWZzW3RdLCAmcik7CisKKwkJCQlleHAgPSBleHBfZnJv bV9odyhmLCB0LCByLmV4cG9uZW50KTsKKworCQkJCS8qIHN1bSBpbiAuMTYgYmluYXJ5IGZpeGVk IHBvaW50ICovCisJCQkJc3VtICs9IHNpZ25fdG9faW50KHIuc2lnbikgKiByLm1hbnRpc3NhIDw8 ICg1IC0gZXhwKTsKKworCQkJCXByaW50ZigiICUwNHgiLCByLnJlZyk7CisJCQl9CisJCQkJYnJl YWs7CisJCQl9CisJCX0KKwkJcHJpbnRmKCIgfSBzdW0gPSAweCV4XG4iLCBzdW0pOworCX0KKwlw cmludGYoIiB9XG4iKTsKK30KKworLyoKKyAqIFByaW50IG91dCB0aGUgZmlsdGVyIGNvZWZzIGFz IGEgQyBzdHJ1Y3R1cmUuLgorICovCitzdGF0aWMgdm9pZCBwcmludF9jX2ZpbHRlcihjb25zdCBz dHJ1Y3QgZmlsdGVyICpmKQoreworCXByaW50Zigic3RydWN0ICVzID0ge1xuIiwgY29lZl9mb3Jt YXRzW2YtPmNvbmZpZy5mb3JtYXRdKTsKKworCWZvciAoaW50IHAgPSAwOyBwIDwgZi0+Y29uZmln Lm5waGFzZXMvMisxOyBwKyspIHsKKwkJY29uc3QgZG91YmxlICpjb2VmcyA9IGYtPnBoYXNlc1tw XS5jb2VmczsKKworCQlwcmludGYoIlx0WyUyZF0gPSB7IiwgcCk7CisKKwkJZm9yIChpbnQgX3Qg PSAwOyBfdCA8IG5od3RhcHMoZik7IF90KyspIHsKKwkJCWludCB0ID0gaHd0YXBfdG9fdGFwKGYs IF90KTsKKwkJCWRvdWJsZSBjb2VmOworCisJCQlpZiAodCA+PSAwKQorCQkJCWNvZWYgPSBjb2Vm c1t0XTsKKwkJCWVsc2UKKwkJCQljb2VmID0gMC4wOworCisJCQlzd2l0Y2ggKGYtPmNvbmZpZy5m b3JtYXQpIHsKKwkJCWRlZmF1bHQ6IHsKKwkJCQl1bmlvbiBnZW4yX2NvZWZfcmVnIHI7CisKKwkJ CQlnZW4yX2NvZWZfdG9fcmVnKGYsIHQsIGNvZWYsICZyKTsKKworCQkJCXByaW50ZigiIDB4JTA0 eCwiLCByLnJlZyk7CisJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcHJpbnRmKCIgfSxc biIpOworCX0KKwlwcmludGYoIn07XG4iKTsKK30KKworLyogKi8KKworc3RhdGljIHZvaWQgdXNh Z2UoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBpOworCisJZnByaW50 ZihzdHJlYW0sICJVc2FnZTogJXMgWy1ofC0taGVscF0gWy1zfC0tc3RyaWN0XSIKKwkJIiBbLXR8 LS10YXBzIDx0YXBzPl0gWy1wfC0tcGhhc2VzIDxwaGFzZXM+XSIKKwkJIiBbLWN8LS1jdXRvZmYg PGN1dG9mZj5dIFstQ3wtLWhpZ2gtY3V0b2ZmIDxjdXRvZmY+XSIKKwkJIiBbLWZ8LS1maWx0ZXIg PGZpbHRlcj5dIFstd3wtLXdpbmRvdyA8d2luZG93Pl0iCisJCSIgWy1tfC0tbWFudGlzc2EgPGJp dHM+XSBbLUZ8LS1mb3JtYXQgPGZvcm1hdD5dIgorCQkiIFstTXwtLW1vZGUgPG1vZGU+XSIKKwkJ IlxuIgorCQkiIC1ofC0taGVscDogU2hvdyB0aGlzIGhlbHAgdGV4dFxuIgorCQkiIC1zfC0tc3Ry aWN0OiBGYWlsIGlmIGFueSBjb2VmZmljaWVudCBpcyBvdXQgb2YgcmFuZ2UgZm9yIHRoZSBoYXJk d2FyZSwgb3RoZXJ3aXNlIGNsYW1wIGl0XG4iCisJCSIgLXR8LS10YXBzIDx0YXBzPjogbnVtYmVy IG9mIGZpbHRlciB0YXBzIFsxOjEwMjRdXG4iCisJCSIgLXB8LS1waGFzZXMgPHBoYXNlcz46IG51 bWJlciBvZiBmaWx0ZXIgcGhhc2VzIFsxOjEwMjRdXG4iCisJCSIgLWN8LS1jdXRvZmYgPGN1dG9m Zj46IGN1dG9mZiBmcmVxdWVuY3kgZm9yIHNpbmMgZmlsdGVyIFswLjA6MC41XVxuIgorCQkiIC1D fC0taGlnaC1jdXRvZmYgPGN1dG9mZj46IGhpZ2ggY3V0b2ZmIGZyZXF1ZW5jeSBmb3IgYmFuZHBh c3MvYmFuZHN0b3AgWzAuMDowLjVdXG4iCisJCSIgLWZ8LS1maWx0ZXIgPGZpbHRlcj46IGZpbHRl ciBmdW5jdGlvblxuIgorCQkiIC13fC0td2luZG93IDx3aW5kb3c+OiB3aW5kb3cgZnVuY3Rpb25c biIKKwkJIiAtbXwtLW1hbnRpc3NhIDxiaXRzPjogbnVtYmVyIG9mIG1hbnRpc3NhIGJpdHMgaW4g dGhlIGNvZWZmaWNpZW50cyBbMToxMl1cbiIKKwkJIiAtRnwtLWZvcm1hdCA8Zm9ybWF0PjogaGFy ZHdhcmUgY29lZmZpY2llbnQgZm9ybWF0XG4iCisJCSIgLU18LS1tb2RlIDxtb2RlPjogZmlsdGVy IG1vZGVcbiIKKwkJLCBuYW1lKTsKKworCWZwcmludGYoc3RyZWFtLCAiUG9zc2libGUgZmlsdGVy IGZ1bmN0aW9uczogIik7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmlsdGVyX2Z1bmNz KTsgaSsrKQorCQlmcHJpbnRmKHN0cmVhbSwgIiVzJWMiLCBmaWx0ZXJfZnVuY3NbaV0ubmFtZSwg aSA9PSBBUlJBWV9TSVpFKGZpbHRlcl9mdW5jcykgLSAxID8gJ1xuJyA6ICcsJyk7CisKKwlmcHJp bnRmKHN0cmVhbSwgIlBvc3NpYmxlIHdpbmRvdyBmdW5jdGlvbnM6ICIpOworCWZvciAoaSA9IDA7 IGkgPCBBUlJBWV9TSVpFKHdpbmRvd19mdW5jcyk7IGkrKykKKwkJZnByaW50ZihzdHJlYW0sICIl cyVjIiwgd2luZG93X2Z1bmNzW2ldLm5hbWUsIGkgPT0gQVJSQVlfU0laRSh3aW5kb3dfZnVuY3Mp IC0gMSA/ICdcbicgOiAnLCcpOworCisJZnByaW50ZihzdHJlYW0sICJQb3NzaWJsZSBoYXJkd2Fy ZSBjb2VmZmljaWVudCBmb3JtYXRzOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShj b2VmX2Zvcm1hdHMpOyBpKyspCisJCWZwcmludGYoc3RyZWFtLCAiJXMlYyIsIGNvZWZfZm9ybWF0 c1tpXSwgaSA9PSBGT1JNQVRfSU5WQUxJRCAtIDEgPyAnXG4nIDogJywnKTsKKworCWZwcmludGYo c3RyZWFtLCAiUG9zc2libGUgZmlsdGVyIG1vZGVzOiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJS QVlfU0laRShmaWx0ZXJfbW9kZXMpOyBpKyspCisJCWZwcmludGYoc3RyZWFtLCAiJXMlYyIsIGZp bHRlcl9tb2Rlc1tpXSwgaSA9PSBNT0RFX0lOVkFMSUQgLSAxID8gJ1xuJyA6ICcsJyk7Cit9CisK K2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJY29uc3Qgc3RydWN0IG9wdGlv biBvcHRzW10gPSB7CisJCXsgLm5hbWUgPSAiaGVscCIsIC52YWwgPSAnaCcgfSwKKwkJeyAubmFt ZSA9ICJzdHJpY3QiLCAudmFsID0gJ3MnIH0sCisJCXsgLm5hbWUgPSAidGFwcyIsIC5oYXNfYXJn ID0gdHJ1ZSwgLnZhbCA9ICd0JyB9LAorCQl7IC5uYW1lID0gInBoYXNlcyIsIC5oYXNfYXJnID0g dHJ1ZSwgLnZhbCA9ICdwJyB9LAorCQl7IC5uYW1lID0gImN1dG9mZiIsIC5oYXNfYXJnID0gdHJ1 ZSwgLnZhbCA9ICdjJyB9LAorCQl7IC5uYW1lID0gImhpZ2gtY3V0b2ZmIiwgLmhhc19hcmcgPSB0 cnVlLCAudmFsID0gJ0MnIH0sCisJCXsgLm5hbWUgPSAiZmlsdGVyIiwgLmhhc19hcmcgPSB0cnVl LCAudmFsID0gJ2YnIH0sCisJCXsgLm5hbWUgPSAid2luZG93IiwgLmhhc19hcmcgPSB0cnVlLCAu dmFsID0gJ3cnIH0sCisJCXsgLm5hbWUgPSAibWFudGlzc2EtY2VudGVyIiwgLmhhc19hcmcgPSB0 cnVlLCAudmFsID0gJ0InIH0sCisJCXsgLm5hbWUgPSAibWFudGlzc2Etb3RoZXIiLCAuaGFzX2Fy ZyA9IHRydWUsIC52YWwgPSAnYicgfSwKKwkJeyAubmFtZSA9ICJmb3JtYXQiLCAuaGFzX2FyZyA9 IHRydWUsIC52YWwgPSAnRicgfSwKKwkJeyAubmFtZSA9ICJtb2RlIiwgLmhhc19hcmcgPSB0cnVl LCAudmFsID0gJ00nIH0sCisJCXt9CisJfTsKKwlzdHJ1Y3QgZmlsdGVyIGYgPSB7CisJCS5jb25m aWcgPSBjb25maWdzW0ZPUk1BVF9DTkxfUFNdLAorCQkubW9kZSA9IE1PREVfTE9XUEFTUywKKwkJ LnN0cmljdCA9IGZhbHNlLAorCQkuY3V0b2ZmID0gMC41LAorCQkuY3V0b2ZmX2hpZ2ggPSAwLjUs CisJCS5maWx0ZXIgPSAmZmlsdGVyX2Z1bmNzWzBdLAorCQkud2luZG93ID0gJndpbmRvd19mdW5j c1swXSwKKwl9OworCWJvb2wgZXJyb3IgPSBmYWxzZSwgaGVscCA9IGZhbHNlOworCisJZm9yICg7 OykgeworCQlpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJoc3Q6cDpjOkM6Zjp3OkY6 TTpCOmI6Iiwgb3B0cywgTlVMTCk7CisKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKworCQlz d2l0Y2ggKGMpIHsKKwkJCWludCBpOworCQljYXNlICdoJzoKKwkJCWhlbHAgPSB0cnVlOworCQkJ YnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJZi5zdHJpY3QgPSB0cnVlOworCQkJYnJlYWs7CisJCWNh c2UgJ3QnOgorCQkJZi5jb25maWcubnRhcHMgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAoZi5jb25m aWcubnRhcHMgPCAxIHx8IGYuY29uZmlnLm50YXBzID4gMTAyNCkgeworCQkJCWZwcmludGYoc3Rk ZXJyLCAiSW52YWxpZCBudW1iZXIgb2YgdGFwczogJXNcbiIsIG9wdGFyZyk7CisJCQkJZXJyb3Ig PSB0cnVlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJZi5jb25maWcubnBoYXNl cyA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChmLmNvbmZpZy5ucGhhc2VzIDwgMSB8fCBmLmNvbmZp Zy5ucGhhc2VzID4gMTAyNCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBudW1iZXIg b2YgcGhhc2VzOiAlc1xuIiwgb3B0YXJnKTsKKwkJCQllcnJvciA9IHRydWU7CisJCQl9CisJCQli cmVhazsKKwkJY2FzZSAnYyc6CisJCQlmLmN1dG9mZiA9IHN0cnRvZChvcHRhcmcsIE5VTEwpOwor CQkJaWYgKGYuY3V0b2ZmIDwgMC4wIHx8IGYuY3V0b2ZmID4gMC41KSB7CisJCQkJZnByaW50Zihz dGRlcnIsICJJbnZhbGlkIGN1dG9mZiBmcmVxdWVuY3k6ICVzXG4iLCBvcHRhcmcpOworCQkJCWVy cm9yID0gdHJ1ZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdDJzoKKwkJCWYuY3V0b2ZmX2hp Z2ggPSBzdHJ0b2Qob3B0YXJnLCBOVUxMKTsKKwkJCWlmIChmLmN1dG9mZl9oaWdoIDwgMC4wIHx8 IGYuY3V0b2ZmX2hpZ2ggPiAwLjUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgaGln aCBjdXRvZmYgZnJlcXVlbmN5OiAlc1xuIiwgb3B0YXJnKTsKKwkJCQllcnJvciA9IHRydWU7CisJ CQl9CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQlmLmZpbHRlciA9IE5VTEw7CisJCQlmb3Ig KGkgPSAwOyBpIDwgQVJSQVlfU0laRShmaWx0ZXJfZnVuY3MpOyBpKyspIHsKKwkJCQlpZiAoIXN0 cmNtcChvcHRhcmcsIGZpbHRlcl9mdW5jc1tpXS5uYW1lKSkgeworCQkJCQlmLmZpbHRlciA9ICZm aWx0ZXJfZnVuY3NbaV07CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChmLmZpbHRl ciA9PSBOVUxMKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJVbmtud29uIGZpbHRlciBmdW5jdGlv bjogJXNcbiIsIG9wdGFyZyk7CisJCQkJZXJyb3IgPSB0cnVlOworCQkJfQorCQkJYnJlYWs7CisJ CWNhc2UgJ3cnOgorCQkJZi53aW5kb3cgPSBOVUxMOworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZ X1NJWkUod2luZG93X2Z1bmNzKTsgaSsrKSB7CisJCQkJaWYgKCFzdHJjbXAob3B0YXJnLCB3aW5k b3dfZnVuY3NbaV0ubmFtZSkpIHsKKwkJCQkJZi53aW5kb3cgPSAmd2luZG93X2Z1bmNzW2ldOwor CQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoZi53aW5kb3cgPT0gTlVMTCkgeworCQkJ CWZwcmludGYoc3RkZXJyLCAiVW5rbndvbiB3aW5kb3cgZnVuY3Rpb246ICVzXG4iLCBvcHRhcmcp OworCQkJCWVycm9yID0gdHJ1ZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdCJzoKKwkJCWYu Y29uZmlnLmNlbnRlcl9tYW50aXNzYV9iaXRzID0gYXRvaShvcHRhcmcpOworCQkJaWYgKGYuY29u ZmlnLmNlbnRlcl9tYW50aXNzYV9iaXRzIDwgMSB8fCBmLmNvbmZpZy5jZW50ZXJfbWFudGlzc2Ff Yml0cyA+IDEyKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGNlbnRlciB0YXAgbWFu dGlzc2EgYml0czogJXNcbiIsIG9wdGFyZyk7CisJCQkJZXJyb3IgPSB0cnVlOworCQkJfQorCQkJ YnJlYWs7CisJCWNhc2UgJ2InOgorCQkJZi5jb25maWcub3RoZXJfbWFudGlzc2FfYml0cyA9IGF0 b2kob3B0YXJnKTsKKwkJCWlmIChmLmNvbmZpZy5vdGhlcl9tYW50aXNzYV9iaXRzIDwgMSB8fCBm LmNvbmZpZy5vdGhlcl9tYW50aXNzYV9iaXRzID4gMTIpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwg IkludmFsaWQgb3RoZXIgdGFwIG1hbnRpc3NhIGJpdHM6ICVzXG4iLCBvcHRhcmcpOworCQkJCWVy cm9yID0gdHJ1ZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdGJzoKKwkJCWZvciAoZi5jb25m aWcuZm9ybWF0ID0gMDsKKwkJCSAgICAgZi5jb25maWcuZm9ybWF0IDwgQVJSQVlfU0laRShjb2Vm X2Zvcm1hdHMpOworCQkJICAgICBmLmNvbmZpZy5mb3JtYXQrKykgeworCQkJCWlmICghc3RyY21w KG9wdGFyZywgY29lZl9mb3JtYXRzW2YuY29uZmlnLmZvcm1hdF0pKQorCQkJCQlicmVhazsKKwkJ CX0KKwkJCWlmIChmLmNvbmZpZy5mb3JtYXQgPT0gRk9STUFUX0lOVkFMSUQpIHsKKwkJCQlmcHJp bnRmKHN0ZGVyciwgIlVua25vd24gaGFyZHdhcmUgY29lZmZpY2llbnQgZm9ybWF0OiAlc1xuIiwg b3B0YXJnKTsKKwkJCQllcnJvciA9IHRydWU7CisJCQl9CisJCQlmLmNvbmZpZyA9IGNvbmZpZ3Nb Zi5jb25maWcuZm9ybWF0XTsKKwkJCWJyZWFrOworCQljYXNlICdNJzoKKwkJCWZvciAoZi5tb2Rl ID0gMDsgZi5tb2RlIDwgQVJSQVlfU0laRShmaWx0ZXJfbW9kZXMpOyBmLm1vZGUrKykgeworCQkJ CWlmICghc3RyY21wKG9wdGFyZywgZmlsdGVyX21vZGVzW2YubW9kZV0pKQorCQkJCQlicmVhazsK KwkJCX0KKwkJCWlmIChmLm1vZGUgPT0gTU9ERV9JTlZBTElEKSB7CisJCQkJZnByaW50ZihzdGRl cnIsICJVbmtub3duIGZpbHRlciBtb2RlOiAlc1xuIiwgb3B0YXJnKTsKKwkJCQllcnJvciA9IHRy dWU7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVycm9yID0gdHJ1ZTsKKwkJfQor CX0KKworCWlmIChoZWxwKSB7CisJCXVzYWdlKHN0ZG91dCwgYXJndlswXSk7CisJCXJldHVybiAw OworCX0gZWxzZSBpZiAoZXJyb3IpIHsKKwkJdXNhZ2Uoc3RkZXJyLCBhcmd2WzBdKTsKKwkJcmV0 dXJuIDE7CisJfQorCisJZ2VuZXJhdGVfZmlsdGVyKCZmKTsKKwlwcmludF9maWx0ZXIoJmYpOwor CWh3X3ByaW50X2ZpbHRlcigmZik7CisKKwl1cGRhdGVfZmlsdGVyKCZmKTsKKwlwcmludF9maWx0 ZXIoJmYpOworCWh3X3ByaW50X2ZpbHRlcigmZik7CisKKwlmaXh1cF9maWx0ZXIoJmYpOworCXBy aW50X2ZpbHRlcigmZik7CisJaHdfcHJpbnRfZmlsdGVyKCZmKTsKKworCXByaW50X2NfZmlsdGVy KCZmKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWVzb24uYnVpbGQgYi90 b29scy9tZXNvbi5idWlsZAppbmRleCA1OWI1NmQ1ZGVkYjkuLmE0N2JhZGViZTFiMCAxMDA2NDQK LS0tIGEvdG9vbHMvbWVzb24uYnVpbGQKKysrIGIvdG9vbHMvbWVzb24uYnVpbGQKQEAgLTMwLDYg KzMwLDcgQEAgdG9vbHNfcHJvZ3MgPSBbCiAJJ2ludGVsX3BhbmVsX2ZpdHRlcicsCiAJJ2ludGVs X3JlZ19jaGVja2VyJywKIAknaW50ZWxfcmVzaWRlbmN5JywKKwknaW50ZWxfc2NhbGVyX2NvZWYn LAogCSdpbnRlbF9zdGVwcGluZycsCiAJJ2ludGVsX3ZidF9kZWNvZGUnLAogCSdpbnRlbF93YXRl cm1hcmsnLAotLSAKMi4yNC4xCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwppZ3QtZGV2IG1haWxpbmcgbGlzdAppZ3QtZGV2QGxpc3RzLmZyZWVkZXNrdG9w Lm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lndC1k ZXYK