From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.bootlin.com (mail.bootlin.com [62.4.15.54]) by gabe.freedesktop.org (Postfix) with ESMTP id 8189989C82 for ; Tue, 22 Jan 2019 13:43:10 +0000 (UTC) From: Maxime Ripard Date: Tue, 22 Jan 2019 14:42:46 +0100 Message-Id: <20190122134257.14038-4-maxime.ripard@bootlin.com> In-Reply-To: <20190122134257.14038-1-maxime.ripard@bootlin.com> References: <20190122134257.14038-1-maxime.ripard@bootlin.com> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t v3 03/14] igt: fb: generic YUV convertion function 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 Cc: Petri Latvala , eben@raspberrypi.org, Thomas Petazzoni List-ID: VGhlIGN1cnJlbnQgd2F5IHdlIHdvcmsgd2hlbiB3ZSB3YW50IHRvIHN1cHBvcnQgYSBuZXcgWVVW IGZvcm1hdCB0byBJR1QsIHdlCmFsc28gbmVlZCB0byBhZGQgbmV3IGZ1bmN0aW9uIHRvIGNvbnZl cnQgdG8gYW5kIGZyb20gWFJHQjg4ODguCgpUaGlzIGRvZXNuJ3QgcmVhbGx5IHNjYWxlIGhvd2V2 ZXIsIGFuZCBjcmVhdGVzIGEgbG90IG9mIGNvZGUgdG8gbWFpbnRhaW4uCkluIG9yZGVyIHRvIHdv cmsgYXJvdW5kIHRoaXMsIGNyZWF0ZSBhIGdlbmVyaWMgZnVuY3Rpb24gdG8gY29udmVydCB0byBS R0IKYW5kIG9uZSB0byBjb252ZXJ0IGZyb20gUkdCLgoKVGhlIG9ubHkgdGhpbmcgdGhhdCBpcyBu ZWVkZWQgbm93IGlzIHRvIGFkZCBuZXcgcGFyYW1ldGVycywgYW5kIHRoYXQncyBpdC4KClJldmll d2VkLWJ5OiBQYXVsIEtvY2lhbGtvd3NraSA8cGF1bC5rb2NpYWxrb3dza2lAYm9vdGxpbi5jb20+ ClNpZ25lZC1vZmYtYnk6IE1heGltZSBSaXBhcmQgPG1heGltZS5yaXBhcmRAYm9vdGxpbi5jb20+ Ci0tLQogbGliL2lndF9mYi5jIHwgNTM3ICsrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDE3MSBpbnNlcnRpb25zKCspLCAz NjYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvbGliL2lndF9mYi5jIGIvbGliL2lndF9mYi5j CmluZGV4IDFhNWMzMzhlYTUzMi4uNDU2OTFmZDQ0MWQ5IDEwMDY0NAotLS0gYS9saWIvaWd0X2Zi LmMKKysrIGIvbGliL2lndF9mYi5jCkBAIC0xNTc3LDQyNCArMTU3NywyMzcgQEAgc3RhdGljIHZv aWQgY29udmVydF9zcmNfcHV0KGNvbnN0IHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQsCiAJCWZyZWUo c3JjX2J1Zik7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRfbnYxMl90b19yZ2IyNChzdHJ1Y3Qg ZmJfY29udmVydCAqY3Z0KQorc3RydWN0IHl1dl9wYXJhbWV0ZXJzIHsKKwl1bnNpZ25lZAl5X2lu YzsKKwl1bnNpZ25lZAl1dl9pbmM7CisJdW5zaWduZWQJeV9zdHJpZGU7CisJdW5zaWduZWQJdXZf c3RyaWRlOworCXVuc2lnbmVkCXlfb2Zmc2V0OworCXVuc2lnbmVkCXVfb2Zmc2V0OworCXVuc2ln bmVkCXZfb2Zmc2V0OworfTsKKworc3RhdGljIHZvaWQgZ2V0X3l1dl9wYXJhbWV0ZXJzKHN0cnVj dCBpZ3RfZmIgKmZiLCBzdHJ1Y3QgeXV2X3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKLQlpbnQgaSwg ajsKLQljb25zdCB1aW50OF90ICp5LCAqdXY7Ci0JdWludDhfdCAqcmdiMjQgPSBjdnQtPmRzdC5w dHI7Ci0JdW5zaWduZWQgaW50IHJnYjI0X3N0cmlkZSA9IGN2dC0+ZHN0LmZiLT5zdHJpZGVzWzBd OwotCXVuc2lnbmVkIGludCBwbGFuYXJfc3RyaWRlID0gY3Z0LT5zcmMuZmItPnN0cmlkZXNbMF07 Ci0Jc3RydWN0IGlndF9tYXQ0IG0gPSBpZ3RfeWNiY3JfdG9fcmdiX21hdHJpeChjdnQtPnNyYy5m Yi0+Y29sb3JfZW5jb2RpbmcsCi0JCQkJCQkgICAgY3Z0LT5zcmMuZmItPmNvbG9yX3JhbmdlKTsK LQl1aW50OF90ICpidWY7Ci0KLQlpZ3RfYXNzZXJ0KGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0ID09 IERSTV9GT1JNQVRfTlYxMiAmJgotCQkgICBjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBEUk1f Rk9STUFUX1hSR0I4ODg4KTsKLQotCWJ1ZiA9IGNvbnZlcnRfc3JjX2dldChjdnQpOwotCXkgPSBi dWYgKyBjdnQtPnNyYy5mYi0+b2Zmc2V0c1swXTsKLQl1diA9IGJ1ZiArIGN2dC0+c3JjLmZiLT5v ZmZzZXRzWzFdOwotCi0JZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQgLyAyOyBp KyspIHsKLQkJZm9yIChqID0gMDsgaiA8IGN2dC0+ZHN0LmZiLT53aWR0aCAvIDI7IGorKykgewot CQkJLyogQ29udmVydCAyeDIgcGl4ZWwgYmxvY2tzICovCi0JCQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2 WzRdOwotCQkJc3RydWN0IGlndF92ZWM0IHJnYls0XTsKLQotCQkJeXV2WzBdLmRbMF0gPSB5W2og KiAyICsgMF07Ci0JCQl5dXZbMV0uZFswXSA9IHlbaiAqIDIgKyAxXTsKLQkJCXl1dlsyXS5kWzBd ID0geVtqICogMiArIDAgKyBwbGFuYXJfc3RyaWRlXTsKLQkJCXl1dlszXS5kWzBdID0geVtqICog MiArIDEgKyBwbGFuYXJfc3RyaWRlXTsKLQotCQkJeXV2WzBdLmRbMV0gPSB5dXZbMV0uZFsxXSA9 IHl1dlsyXS5kWzFdID0geXV2WzNdLmRbMV0gPSB1dltqICogMiArIDBdOwotCQkJeXV2WzBdLmRb Ml0gPSB5dXZbMV0uZFsyXSA9IHl1dlsyXS5kWzJdID0geXV2WzNdLmRbMl0gPSB1dltqICogMiAr IDFdOwotCQkJeXV2WzBdLmRbM10gPSB5dXZbMV0uZFszXSA9IHl1dlsyXS5kWzNdID0geXV2WzNd LmRbM10gPSAxLjBmOwotCi0JCQlyZ2JbMF0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1 dlswXSk7Ci0JCQlyZ2JbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlsxXSk7Ci0J CQlyZ2JbMl0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlsyXSk7Ci0JCQlyZ2JbM10g PSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlszXSk7Ci0KLQkJCXdyaXRlX3JnYigmcmdi MjRbaiAqIDggKyAwXSwgJnJnYlswXSk7Ci0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgNF0s ICZyZ2JbMV0pOwotCQkJd3JpdGVfcmdiKCZyZ2IyNFtqICogOCArIDAgKyByZ2IyNF9zdHJpZGVd LCAmcmdiWzJdKTsKLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyA0ICsgcmdiMjRfc3RyaWRl XSwgJnJnYlszXSk7Ci0JCX0KLQotCQlpZiAoY3Z0LT5kc3QuZmItPndpZHRoICYgMSkgewotCQkJ LyogQ29udmVydCAxeDIgcGl4ZWwgYmxvY2sgKi8KLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbMl07 Ci0JCQlzdHJ1Y3QgaWd0X3ZlYzQgcmdiWzJdOwotCi0JCQl5dXZbMF0uZFswXSA9IHlbaiAqIDIg KyAwXTsKLQkJCXl1dlsxXS5kWzBdID0geVtqICogMiArIDAgKyBwbGFuYXJfc3RyaWRlXTsKKwlp Z3RfYXNzZXJ0KGlndF9mb3JtYXRfaXNfeXV2KGZiLT5kcm1fZm9ybWF0KSk7CiAKLQkJCXl1dlsw XS5kWzFdID0geXV2WzFdLmRbMV0gPSB1dltqICogMiArIDBdOwotCQkJeXV2WzBdLmRbMl0gPSB5 dXZbMV0uZFsyXSA9IHV2W2ogKiAyICsgMV07Ci0JCQl5dXZbMF0uZFszXSA9IHl1dlsxXS5kWzNd ID0gMS4wZjsKKwlzd2l0Y2ggKGZiLT5kcm1fZm9ybWF0KSB7CisJY2FzZSBEUk1fRk9STUFUX05W MTI6CisJCXBhcmFtcy0+eV9pbmMgPSAxOworCQlwYXJhbXMtPnV2X2luYyA9IDI7CisJCWJyZWFr OwogCi0JCQlyZ2JbMF0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlswXSk7Ci0JCQly Z2JbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlsxXSk7Ci0KLQkJCXdyaXRlX3Jn YigmcmdiMjRbaiAqIDggKyAwXSwgJnJnYlswXSk7Ci0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4 ICsgMCArIHJnYjI0X3N0cmlkZV0sICZyZ2JbMV0pOwotCQl9Ci0KLQkJcmdiMjQgKz0gMiAqIHJn YjI0X3N0cmlkZTsKLQkJeSArPSAyICogcGxhbmFyX3N0cmlkZTsKLQkJdXYgKz0gcGxhbmFyX3N0 cmlkZTsKKwljYXNlIERSTV9GT1JNQVRfWVVZVjoKKwljYXNlIERSTV9GT1JNQVRfWVZZVToKKwlj YXNlIERSTV9GT1JNQVRfVVlWWToKKwljYXNlIERSTV9GT1JNQVRfVllVWToKKwkJcGFyYW1zLT55 X2luYyA9IDI7CisJCXBhcmFtcy0+dXZfaW5jID0gNDsKKwkJYnJlYWs7CisKKwljYXNlIERSTV9G T1JNQVRfWFlVVjg4ODg6CisJCXBhcmFtcy0+eV9pbmMgPSA0OworCQlwYXJhbXMtPnV2X2luYyA9 IDQ7CisJCWJyZWFrOwogCX0KIAotCWlmIChjdnQtPmRzdC5mYi0+aGVpZ2h0ICYgMSkgewotCQkv KiBDb252ZXJ0IGxhc3Qgcm93ICovCi0JCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lk dGggLyAyOyBqKyspIHsKLQkJCS8qIENvbnZlcnQgMngxIHBpeGVsIGJsb2NrcyAqLwotCQkJc3Ry dWN0IGlndF92ZWM0IHl1dlsyXTsKLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2JbMl07Ci0KLQkJCXl1 dlswXS5kWzBdID0geVtqICogMiArIDBdOwotCQkJeXV2WzFdLmRbMF0gPSB5W2ogKiAyICsgMV07 Ci0JCQl5dXZbMF0uZFsxXSA9IHl1dlsxXS5kWzFdID0gdXZbaiAqIDIgKyAwXTsKLQkJCXl1dlsw XS5kWzJdID0geXV2WzFdLmRbMl0gPSB1dltqICogMiArIDFdOwotCQkJeXV2WzBdLmRbM10gPSB5 dXZbMV0uZFszXSA9IDEuMGY7CisJc3dpdGNoIChmYi0+ZHJtX2Zvcm1hdCkgeworCWNhc2UgRFJN X0ZPUk1BVF9OVjEyOgorCQlwYXJhbXMtPnlfc3RyaWRlID0gZmItPnN0cmlkZXNbMF07CisJCXBh cmFtcy0+dXZfc3RyaWRlID0gZmItPnN0cmlkZXNbMV07CisJCWJyZWFrOwogCi0JCQlyZ2JbMF0g PSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnl1dlswXSk7Ci0JCQlyZ2JbMV0gPSBpZ3RfbWF0 cml4X3RyYW5zZm9ybSgmbSwgJnl1dlsxXSk7CisJY2FzZSBEUk1fRk9STUFUX1lVWVY6CisJY2Fz ZSBEUk1fRk9STUFUX1lWWVU6CisJY2FzZSBEUk1fRk9STUFUX1VZVlk6CisJY2FzZSBEUk1fRk9S TUFUX1ZZVVk6CisJY2FzZSBEUk1fRk9STUFUX1hZVVY4ODg4OgorCQlwYXJhbXMtPnlfc3RyaWRl ID0gZmItPnN0cmlkZXNbMF07CisJCXBhcmFtcy0+dXZfc3RyaWRlID0gZmItPnN0cmlkZXNbMF07 CisJCWJyZWFrOworCX0KIAotCQkJd3JpdGVfcmdiKCZyZ2IyNFtqICogOCArIDBdLCAmcmdiWzBd KTsKLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyA0XSwgJnJnYlswXSk7Ci0JCX0KKwlzd2l0 Y2ggKGZiLT5kcm1fZm9ybWF0KSB7CisJY2FzZSBEUk1fRk9STUFUX05WMTI6CisJCXBhcmFtcy0+ eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXTsKKwkJcGFyYW1zLT51X29mZnNldCA9IGZiLT5vZmZz ZXRzWzFdOworCQlwYXJhbXMtPnZfb2Zmc2V0ID0gZmItPm9mZnNldHNbMV0gKyAxOworCQlicmVh azsKIAotCQlpZiAoY3Z0LT5kc3QuZmItPndpZHRoICYgMSkgewotCQkJLyogQ29udmVydCBzaW5n bGUgcGl4ZWwgKi8KLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXY7Ci0JCQlzdHJ1Y3QgaWd0X3ZlYzQg cmdiOworCWNhc2UgRFJNX0ZPUk1BVF9ZVVlWOgorCQlwYXJhbXMtPnlfb2Zmc2V0ID0gZmItPm9m ZnNldHNbMF07CisJCXBhcmFtcy0+dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7CisJCXBh cmFtcy0+dl9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDM7CisJCWJyZWFrOwogCi0JCQl5dXYu ZFswXSA9IHlbaiAqIDIgKyAwXTsKLQkJCXl1di5kWzFdID0gdXZbaiAqIDIgKyAwXTsKLQkJCXl1 di5kWzJdID0gdXZbaiAqIDIgKyAxXTsKLQkJCXl1di5kWzNdID0gMS4wZjsKKwljYXNlIERSTV9G T1JNQVRfWVZZVToKKwkJcGFyYW1zLT55X29mZnNldCA9IGZiLT5vZmZzZXRzWzBdOworCQlwYXJh bXMtPnVfb2Zmc2V0ID0gZmItPm9mZnNldHNbMF0gKyAzOworCQlwYXJhbXMtPnZfb2Zmc2V0ID0g ZmItPm9mZnNldHNbMF0gKyAxOworCQlicmVhazsKIAotCQkJcmdiID0gaWd0X21hdHJpeF90cmFu c2Zvcm0oJm0sICZ5dXYpOworCWNhc2UgRFJNX0ZPUk1BVF9VWVZZOgorCQlwYXJhbXMtPnlfb2Zm c2V0ID0gZmItPm9mZnNldHNbMF0gKyAxOworCQlwYXJhbXMtPnVfb2Zmc2V0ID0gZmItPm9mZnNl dHNbMF07CisJCXBhcmFtcy0+dl9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDI7CisJCWJyZWFr OwogCi0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgMF0sICZyZ2IpOwotCQl9CisJY2FzZSBE Uk1fRk9STUFUX1ZZVVk6CisJCXBhcmFtcy0+eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7 CisJCXBhcmFtcy0+dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDI7CisJCXBhcmFtcy0+dl9v ZmZzZXQgPSBmYi0+b2Zmc2V0c1swXTsKKwkJYnJlYWs7CisKKwljYXNlIERSTV9GT1JNQVRfWFlV Vjg4ODg6CisJCXBhcmFtcy0+eV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDE7CisJCXBhcmFt cy0+dV9vZmZzZXQgPSBmYi0+b2Zmc2V0c1swXSArIDI7CisJCXBhcmFtcy0+dl9vZmZzZXQgPSBm Yi0+b2Zmc2V0c1swXSArIDM7CisJCWJyZWFrOwogCX0KLQotCWNvbnZlcnRfc3JjX3B1dChjdnQs IGJ1Zik7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRfeXV2NDQ0X3RvX3JnYjI0KHN0cnVjdCBm Yl9jb252ZXJ0ICpjdnQpCitzdGF0aWMgdm9pZCBjb252ZXJ0X3l1dl90b19yZ2IyNChzdHJ1Y3Qg ZmJfY29udmVydCAqY3Z0KQogeworCWNvbnN0IHN0cnVjdCBmb3JtYXRfZGVzY19zdHJ1Y3QgKnNy Y19mbXQgPQorCQlsb29rdXBfZHJtX2Zvcm1hdChjdnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCk7CiAJ aW50IGksIGo7Ci0JdWludDhfdCAqeXV2MjQ7CisJdWludDhfdCBicHAgPSA0OworCXVpbnQ4X3Qg KnksICp1LCAqdjsKIAl1aW50OF90ICpyZ2IyNCA9IGN2dC0+ZHN0LnB0cjsKLQl1bnNpZ25lZCBy Z2IyNF9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRlc1swXSwgeHl1dl9zdHJpZGUgPSBjdnQt PnNyYy5mYi0+c3RyaWRlc1swXTsKLQl1aW50OF90ICpidWYgPSBtYWxsb2MoY3Z0LT5zcmMuZmIt PnNpemUpOworCXVuc2lnbmVkIGludCByZ2IyNF9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRl c1swXTsKIAlzdHJ1Y3QgaWd0X21hdDQgbSA9IGlndF95Y2Jjcl90b19yZ2JfbWF0cml4KGN2dC0+ c3JjLmZiLT5jb2xvcl9lbmNvZGluZywKIAkJCQkJCSAgICBjdnQtPnNyYy5mYi0+Y29sb3JfcmFu Z2UpOworCXVpbnQ4X3QgKmJ1ZjsKKwlzdHJ1Y3QgeXV2X3BhcmFtZXRlcnMgcGFyYW1zID0geyB9 OwogCi0JLyoKLQkgKiBSZWFkaW5nIGZyb20gdGhlIEJPIGlzIGF3ZnVsbHkgc2xvdyBiZWNhdXNl IG9mIGxhY2sgb2YgcmVhZCBjYWNoaW5nLAotCSAqIGl0J3MgZmFzdGVyIHRvIGNvcHkgdGhlIHdo b2xlIEJPIHRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgY29udmVydAotCSAqIGZyb20gdGhlcmUu Ci0JICovCi0JaWd0X21lbWNweV9mcm9tX3djKGJ1ZiwgY3Z0LT5zcmMucHRyICsgY3Z0LT5zcmMu ZmItPm9mZnNldHNbMF0sIGN2dC0+c3JjLmZiLT5zaXplKTsKLQl5dXYyNCA9IGJ1ZjsKKwlpZ3Rf YXNzZXJ0KGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRfWFJHQjg4ODggJiYK KwkJICAgaWd0X2Zvcm1hdF9pc195dXYoY3Z0LT5zcmMuZmItPmRybV9mb3JtYXQpKTsKKworCWJ1 ZiA9IGNvbnZlcnRfc3JjX2dldChjdnQpOworCWdldF95dXZfcGFyYW1ldGVycyhjdnQtPnNyYy5m YiwgJnBhcmFtcyk7CisJeSA9IGJ1ZiArIHBhcmFtcy55X29mZnNldDsKKwl1ID0gYnVmICsgcGFy YW1zLnVfb2Zmc2V0OworCXYgPSBidWYgKyBwYXJhbXMudl9vZmZzZXQ7CiAKIAlmb3IgKGkgPSAw OyBpIDwgY3Z0LT5kc3QuZmItPmhlaWdodDsgaSsrKSB7CisJCWNvbnN0IHVpbnQ4X3QgKnlfdG1w ID0geTsKKwkJY29uc3QgdWludDhfdCAqdV90bXAgPSB1OworCQljb25zdCB1aW50OF90ICp2X3Rt cCA9IHY7CisJCXVpbnQ4X3QgKnJnYl90bXAgPSByZ2IyNDsKKwogCQlmb3IgKGogPSAwOyBqIDwg Y3Z0LT5kc3QuZmItPndpZHRoOyBqKyspIHsKLQkJCWZsb2F0IHksIHUsIHY7Ci0JCQlzdHJ1Y3Qg aWd0X3ZlYzQgeXV2OwotCQkJc3RydWN0IGlndF92ZWM0IHJnYjsKLQotCQkJdiA9IHl1djI0W2kg KiB4eXV2X3N0cmlkZSArIGogKiA0XTsKLQkJCXUgPSB5dXYyNFtpICogeHl1dl9zdHJpZGUgKyBq ICogNCArIDFdOwotCQkJeSA9IHl1djI0W2kgKiB4eXV2X3N0cmlkZSArIGogKiA0ICsgMl07Ci0J CQl5dXYuZFswXSA9IHk7Ci0JCQl5dXYuZFsxXSA9IHU7Ci0JCQl5dXYuZFsyXSA9IHY7CisJCQlz dHJ1Y3QgaWd0X3ZlYzQgcmdiLCB5dXY7CisKKwkJCXl1di5kWzBdID0gKnlfdG1wOworCQkJeXV2 LmRbMV0gPSAqdV90bXA7CisJCQl5dXYuZFsyXSA9ICp2X3RtcDsKIAkJCXl1di5kWzNdID0gMS4w ZjsKIAogCQkJcmdiID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZ5dXYpOworCQkJd3JpdGVf cmdiKHJnYl90bXAsICZyZ2IpOwogCi0JCQl3cml0ZV9yZ2IoJnJnYjI0W2kgKiByZ2IyNF9zdHJp ZGUgKyBqICogNF0sICZyZ2IpOwotCQl9Ci0JfQotCi0JZnJlZShidWYpOwotfQotCi0KLXN0YXRp YyB2b2lkIGNvbnZlcnRfcmdiMjRfdG9feXV2NDQ0KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCi17 Ci0JaW50IGksIGo7Ci0JdWludDhfdCAqcmdiMjQ7Ci0JdWludDhfdCAqeXV2NDQ0ID0gY3Z0LT5k c3QucHRyICsgY3Z0LT5kc3QuZmItPm9mZnNldHNbMF07Ci0JdW5zaWduZWQgaW50IHJnYjI0X3N0 cmlkZSA9IGN2dC0+c3JjLmZiLT5zdHJpZGVzWzBdLCB4eXV2X3N0cmlkZSA9IGN2dC0+ZHN0LmZi LT5zdHJpZGVzWzBdOwotCXN0cnVjdCBpZ3RfbWF0NCBtID0gaWd0X3JnYl90b195Y2Jjcl9tYXRy aXgoY3Z0LT5kc3QuZmItPmNvbG9yX2VuY29kaW5nLAotCQkJCQkJICAgIGN2dC0+ZHN0LmZiLT5j b2xvcl9yYW5nZSk7Ci0KLQlyZ2IyNCA9IGN2dC0+c3JjLnB0cjsKKwkJCXJnYl90bXAgKz0gYnBw OworCQkJeV90bXAgKz0gcGFyYW1zLnlfaW5jOwogCi0JaWd0X2Fzc2VydF9mKGN2dC0+ZHN0LmZi LT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRfWFlVVjg4ODgsCi0JCSAgICAgIkNvbnZlcnNpb24g bm90IGltcGxlbWVudGVkIGZvciAhWFlVViBwYWNrZWQgZm9ybWF0c1xuIik7Ci0KLQlmb3IgKGkg PSAwOyBpIDwgY3Z0LT5kc3QuZmItPmhlaWdodDsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBj dnQtPmRzdC5mYi0+d2lkdGg7IGorKykgewotCQkJc3RydWN0IGlndF92ZWM0IHJnYjsKLQkJCXN0 cnVjdCBpZ3RfdmVjNCB5dXY7Ci0KLQkJCXJlYWRfcmdiKCZyZ2IsICZyZ2IyNFtpICogcmdiMjRf c3RyaWRlICsgaiAqIDRdKTsKKwkJCWlmICgoc3JjX2ZtdC0+aHN1YiA9PSAxKSB8fCAoaiAlIHNy Y19mbXQtPmhzdWIpKSB7CisJCQkJdV90bXAgKz0gcGFyYW1zLnV2X2luYzsKKwkJCQl2X3RtcCAr PSBwYXJhbXMudXZfaW5jOworCQkJfQorCQl9CiAKLQkJCXl1diA9IGlndF9tYXRyaXhfdHJhbnNm b3JtKCZtLCAmcmdiKTsKKwkJcmdiMjQgKz0gcmdiMjRfc3RyaWRlOworCQl5ICs9IHBhcmFtcy55 X3N0cmlkZTsKIAotCQkJeXV2NDQ0W2kgKiB4eXV2X3N0cmlkZSArIGogKiA0XSA9IHl1di5kWzJd OwotCQkJeXV2NDQ0W2kgKiB4eXV2X3N0cmlkZSArIGogKiA0ICsgMV0gPSB5dXYuZFsxXTsKLQkJ CXl1djQ0NFtpICogeHl1dl9zdHJpZGUgKyBqICogNCArIDJdID0geXV2LmRbMF07CisJCWlmICgo c3JjX2ZtdC0+dnN1YiA9PSAxKSB8fCAoaSAlIHNyY19mbXQtPnZzdWIpKSB7CisJCQl1ICs9IHBh cmFtcy51dl9zdHJpZGU7CisJCQl2ICs9IHBhcmFtcy51dl9zdHJpZGU7CiAJCX0KIAl9CisKKwlj b252ZXJ0X3NyY19wdXQoY3Z0LCBidWYpOwogfQogCi1zdGF0aWMgdm9pZCBjb252ZXJ0X3JnYjI0 X3RvX252MTIoc3RydWN0IGZiX2NvbnZlcnQgKmN2dCkKK3N0YXRpYyB2b2lkIGNvbnZlcnRfcmdi MjRfdG9feXV2KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCiB7CisJY29uc3Qgc3RydWN0IGZvcm1h dF9kZXNjX3N0cnVjdCAqZHN0X2ZtdCA9CisJCWxvb2t1cF9kcm1fZm9ybWF0KGN2dC0+ZHN0LmZi LT5kcm1fZm9ybWF0KTsKIAlpbnQgaSwgajsKLQl1aW50OF90ICp5ID0gY3Z0LT5kc3QucHRyICsg Y3Z0LT5kc3QuZmItPm9mZnNldHNbMF07Ci0JdWludDhfdCAqdXYgPSBjdnQtPmRzdC5wdHIgKyBj dnQtPmRzdC5mYi0+b2Zmc2V0c1sxXTsKKwl1aW50OF90ICp5LCAqdSwgKnY7CiAJY29uc3QgdWlu dDhfdCAqcmdiMjQgPSBjdnQtPnNyYy5wdHI7CisJdWludDhfdCBicHAgPSA0OwogCXVuc2lnbmVk IHJnYjI0X3N0cmlkZSA9IGN2dC0+c3JjLmZiLT5zdHJpZGVzWzBdOwotCXVuc2lnbmVkIHBsYW5h cl9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+c3RyaWRlc1swXTsKIAlzdHJ1Y3QgaWd0X21hdDQgbSA9 IGlndF9yZ2JfdG9feWNiY3JfbWF0cml4KGN2dC0+ZHN0LmZiLT5jb2xvcl9lbmNvZGluZywKIAkJ CQkJCSAgICBjdnQtPmRzdC5mYi0+Y29sb3JfcmFuZ2UpOworCXN0cnVjdCB5dXZfcGFyYW1ldGVy cyBwYXJhbXMgPSB7IH07CiAKIAlpZ3RfYXNzZXJ0KGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0ID09 IERSTV9GT1JNQVRfWFJHQjg4ODggJiYKLQkJICAgY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQgPT0g RFJNX0ZPUk1BVF9OVjEyKTsKKwkJICAgaWd0X2Zvcm1hdF9pc195dXYoY3Z0LT5kc3QuZmItPmRy bV9mb3JtYXQpKTsKIAotCWZvciAoaSA9IDA7IGkgPCBjdnQtPmRzdC5mYi0+aGVpZ2h0IC8gMjsg aSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lkdGggLyAyOyBqKyspIHsK LQkJCS8qIENvbnZlcnQgMngyIHBpeGVsIGJsb2NrcyAqLwotCQkJc3RydWN0IGlndF92ZWM0IHJn Yls0XTsKLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbNF07CisJZ2V0X3l1dl9wYXJhbWV0ZXJzKGN2 dC0+ZHN0LmZiLCAmcGFyYW1zKTsKKwl5ID0gY3Z0LT5kc3QucHRyICsgcGFyYW1zLnlfb2Zmc2V0 OworCXUgPSBjdnQtPmRzdC5wdHIgKyBwYXJhbXMudV9vZmZzZXQ7CisJdiA9IGN2dC0+ZHN0LnB0 ciArIHBhcmFtcy52X29mZnNldDsKIAotCQkJcmVhZF9yZ2IoJnJnYlswXSwgJnJnYjI0W2ogKiA4 ICsgMF0pOwotCQkJcmVhZF9yZ2IoJnJnYlsxXSwgJnJnYjI0W2ogKiA4ICsgNF0pOwotCQkJcmVh ZF9yZ2IoJnJnYlsyXSwgJnJnYjI0W2ogKiA4ICsgMCArIHJnYjI0X3N0cmlkZV0pOwotCQkJcmVh ZF9yZ2IoJnJnYlszXSwgJnJnYjI0W2ogKiA4ICsgNCArIHJnYjI0X3N0cmlkZV0pOwotCi0JCQl5 dXZbMF0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlswXSk7Ci0JCQl5dXZbMV0gPSBp Z3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlsxXSk7Ci0JCQl5dXZbMl0gPSBpZ3RfbWF0cml4 X3RyYW5zZm9ybSgmbSwgJnJnYlsyXSk7Ci0JCQl5dXZbM10gPSBpZ3RfbWF0cml4X3RyYW5zZm9y bSgmbSwgJnJnYlszXSk7Ci0KLQkJCXlbaiAqIDIgKyAwXSA9IHl1dlswXS5kWzBdOwotCQkJeVtq ICogMiArIDFdID0geXV2WzFdLmRbMF07Ci0JCQl5W2ogKiAyICsgMCArIHBsYW5hcl9zdHJpZGVd ID0geXV2WzJdLmRbMF07Ci0JCQl5W2ogKiAyICsgMSArIHBsYW5hcl9zdHJpZGVdID0geXV2WzNd LmRbMF07CisJZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQ7IGkrKykgeworCQlj b25zdCB1aW50OF90ICpyZ2JfdG1wID0gcmdiMjQ7CisJCXVpbnQ4X3QgKnlfdG1wID0geTsKKwkJ dWludDhfdCAqdV90bXAgPSB1OworCQl1aW50OF90ICp2X3RtcCA9IHY7CiAKLQkJCS8qCi0JCQkg KiBXZSBhc3N1bWUgdGhlIE1QRUcyIGNocm9tYSBzaXRpbmcgY29udmVudGlvbiwgd2hlcmUKLQkJ CSAqIHBpeGVsIGNlbnRlciBmb3IgQ2InQ3InIGlzIGJldHdlZW4gdGhlIGxlZnQgdG9wIGFuZAot CQkJICogYm90dG9tIHBpeGVsIGluIGEgMngyIGJsb2NrLCBzbyB0YWtlIHRoZSBhdmVyYWdlLgot CQkJICovCi0JCQl1dltqICogMiArIDBdID0gKHl1dlswXS5kWzFdICsgeXV2WzJdLmRbMV0pIC8g Mi4wZjsKLQkJCXV2W2ogKiAyICsgMV0gPSAoeXV2WzBdLmRbMl0gKyB5dXZbMl0uZFsyXSkgLyAy LjBmOwotCQl9CisJCWZvciAoaiA9IDA7IGogPCBjdnQtPmRzdC5mYi0+d2lkdGg7IGorKykgewor CQkJY29uc3QgdWludDhfdCAqcGFpcl9yZ2IyNCA9IHJnYl90bXA7CisJCQlzdHJ1Y3QgaWd0X3Zl YzQgcGFpcl9yZ2IsIHJnYjsKKwkJCXN0cnVjdCBpZ3RfdmVjNCBwYWlyX3l1diwgeXV2OwogCi0J CWlmIChjdnQtPmRzdC5mYi0+d2lkdGggJiAxKSB7Ci0JCQkvKiBDb252ZXJ0IDF4MiBwaXhlbCBi bG9jayAqLwotCQkJc3RydWN0IGlndF92ZWM0IHJnYlsyXTsKLQkJCXN0cnVjdCBpZ3RfdmVjNCB5 dXZbMl07CisJCQlyZWFkX3JnYigmcmdiLCByZ2JfdG1wKTsKKwkJCXl1diA9IGlndF9tYXRyaXhf dHJhbnNmb3JtKCZtLCAmcmdiKTsKIAotCQkJcmVhZF9yZ2IoJnJnYlswXSwgJnJnYjI0W2ogKiA4 ICsgMF0pOwotCQkJcmVhZF9yZ2IoJnJnYlsxXSwgJnJnYjI0W2ogKiA4ICsgMCArIHJnYjI0X3N0 cmlkZV0pOworCQkJcmdiX3RtcCArPSBicHA7CiAKLQkJCXl1dlswXSA9IGlndF9tYXRyaXhfdHJh bnNmb3JtKCZtLCAmcmdiWzBdKTsKLQkJCXl1dlsxXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZt LCAmcmdiWzFdKTsKKwkJCSp5X3RtcCA9IHl1di5kWzBdOworCQkJeV90bXAgKz0gcGFyYW1zLnlf aW5jOwogCi0JCQl5W2ogKiAyICsgMF0gPSB5dXZbMF0uZFswXTsKLQkJCXlbaiAqIDIgKyAwICsg cGxhbmFyX3N0cmlkZV0gPSB5dXZbMV0uZFswXTsKKwkJCWlmICgoaSAlIGRzdF9mbXQtPnZzdWIp IHx8IChqICUgZHN0X2ZtdC0+aHN1YikpCisJCQkJY29udGludWU7CiAKIAkJCS8qCiAJCQkgKiBX ZSBhc3N1bWUgdGhlIE1QRUcyIGNocm9tYSBzaXRpbmcgY29udmVudGlvbiwgd2hlcmUKIAkJCSAq IHBpeGVsIGNlbnRlciBmb3IgQ2InQ3InIGlzIGJldHdlZW4gdGhlIGxlZnQgdG9wIGFuZAogCQkJ ICogYm90dG9tIHBpeGVsIGluIGEgMngyIGJsb2NrLCBzbyB0YWtlIHRoZSBhdmVyYWdlLgorCQkJ ICoKKwkJCSAqIFRoZXJlZm9yZSwgaWYgd2UgdXNlIHN1YnNhbXBsaW5nLCB3ZSBvbmx5IHJlYWxs eSBjYXJlCisJCQkgKiBhYm91dCB0d28gcGl4ZWxzIGFsbCB0aGUgdGltZSwgZWl0aGVyIHRoZSB0 d28KKwkJCSAqIHN1YnNlcXVlbnQgcGl4ZWxzIGhvcml6b250YWxseSwgdmVydGljYWxseSwgb3Ig dGhlCisJCQkgKiB0d28gY29ybmVycyBpbiBhIDJ4MiBibG9jay4KKwkJCSAqCisJCQkgKiBUaGUg b25seSBjb3JuZXIgY2FzZSBpcyB3aGVuIHdlIGhhdmUgYW4gb2RkIG51bWJlciBvZgorCQkJICog cGl4ZWxzLCBidXQgdGhpcyBjYW4gYmUgaGFuZGxlZCBwcmV0dHkgZWFzaWx5IGJ5IG5vdAorCQkJ ICogaW5jcmVtZW50aW5nIHRoZSBwYWlyZWQgcGl4ZWwgcG9pbnRlciBpbiB0aGUKKwkJCSAqIGRp cmVjdGlvbiBpdCdzIG9kZCBpbi4KIAkJCSAqLwotCQkJdXZbaiAqIDIgKyAwXSA9ICh5dXZbMF0u ZFsxXSArIHl1dlsxXS5kWzFdKSAvIDIuMGY7Ci0JCQl1dltqICogMiArIDFdID0gKHl1dlswXS5k WzJdICsgeXV2WzFdLmRbMl0pIC8gMi4wZjsKLQkJfQotCi0JCXJnYjI0ICs9IDIgKiByZ2IyNF9z dHJpZGU7Ci0JCXkgKz0gMiAqIHBsYW5hcl9zdHJpZGU7Ci0JCXV2ICs9IHBsYW5hcl9zdHJpZGU7 Ci0JfQotCi0JLyogTGFzdCByb3cgY2Fubm90IGJlIGludGVycG9sYXRlZCBiZXR3ZWVuIDIgcGl4 ZWxzLCB0YWtlIHRoZSBzaW5nbGUgdmFsdWUgKi8KLQlpZiAoY3Z0LT5kc3QuZmItPmhlaWdodCAm IDEpIHsKLQkJZm9yIChqID0gMDsgaiA8IGN2dC0+ZHN0LmZiLT53aWR0aCAvIDI7IGorKykgewot CQkJLyogQ29udmVydCAyeDEgcGl4ZWwgYmxvY2tzICovCi0JCQlzdHJ1Y3QgaWd0X3ZlYzQgcmdi WzJdOwotCQkJc3RydWN0IGlndF92ZWM0IHl1dlsyXTsKLQotCQkJcmVhZF9yZ2IoJnJnYlswXSwg JnJnYjI0W2ogKiA4ICsgMF0pOwotCQkJcmVhZF9yZ2IoJnJnYlsxXSwgJnJnYjI0W2ogKiA4ICsg NF0pOwotCi0JCQl5dXZbMF0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlswXSk7Ci0J CQl5dXZbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnJnYlsxXSk7CisJCQlpZiAoaiAh PSAoY3Z0LT5kc3QuZmItPndpZHRoIC0gMSkpCisJCQkJcGFpcl9yZ2IyNCArPSAoZHN0X2ZtdC0+ aHN1YiAtIDEpICogYnBwOwogCi0JCQl5W2ogKiAyICsgMF0gPSB5dXZbMF0uZFswXTsKLQkJCXlb aiAqIDIgKyAxXSA9IHl1dlsxXS5kWzBdOwotCQkJdXZbaiAqIDIgKyAwXSA9IHl1dlswXS5kWzFd OwotCQkJdXZbaiAqIDIgKyAxXSA9IHl1dlswXS5kWzJdOwotCQl9Ci0KLQkJaWYgKGN2dC0+ZHN0 LmZiLT53aWR0aCAmIDEpIHsKLQkJCS8qIENvbnZlcnQgc2luZ2xlIHBpeGVsICovCi0JCQlzdHJ1 Y3QgaWd0X3ZlYzQgcmdiOwotCQkJc3RydWN0IGlndF92ZWM0IHl1djsKKwkJCWlmIChpICE9IChj dnQtPmRzdC5mYi0+aGVpZ2h0IC0gMSkpCisJCQkJcGFpcl9yZ2IyNCArPSByZ2IyNF9zdHJpZGUg KiAoZHN0X2ZtdC0+dnN1YiAtIDEpOwogCi0JCQlyZWFkX3JnYigmcmdiLCAmcmdiMjRbaiAqIDgg KyAwXSk7CisJCQlyZWFkX3JnYigmcGFpcl9yZ2IsIHBhaXJfcmdiMjQpOworCQkJcGFpcl95dXYg PSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgmbSwgJnBhaXJfcmdiKTsKIAotCQkJeXV2ID0gaWd0X21h dHJpeF90cmFuc2Zvcm0oJm0sICZyZ2IpOworCQkJKnVfdG1wID0gKHl1di5kWzFdICsgcGFpcl95 dXYuZFsxXSkgLyAyLjBmOworCQkJKnZfdG1wID0gKHl1di5kWzJdICsgcGFpcl95dXYuZFsyXSkg LyAyLjBmOwogCi0JCQl5W2ogKiAyICsgMF0gPSB5dXYuZFswXTsKLQkJCXV2W2ogKiAyICsgMF0g PSB5dXYuZFsxXTsKLQkJCXV2W2ogKiAyICsgMV0gPSB5dXYuZFsyXTsKLQkJfQotCX0KLX0KLQot LyogeyBZMCwgVSwgWTEsIFYgfSAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc3dpenps ZV95dXl2W10gPSB7IDAsIDEsIDIsIDMgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHN3 aXp6bGVfeXZ5dVtdID0geyAwLCAzLCAyLCAxIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hh ciBzd2l6emxlX3V5dnlbXSA9IHsgMSwgMCwgMywgMiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVk IGNoYXIgc3dpenpsZV92eXV5W10gPSB7IDEsIDIsIDMsIDAgfTsKLQotc3RhdGljIGNvbnN0IHVu c2lnbmVkIGNoYXIgKnl1eXZfc3dpenpsZSh1aW50MzJfdCBmb3JtYXQpCi17Ci0Jc3dpdGNoIChm b3JtYXQpIHsKLQlkZWZhdWx0OgotCWNhc2UgRFJNX0ZPUk1BVF9ZVVlWOgotCQlyZXR1cm4gc3dp enpsZV95dXl2OwotCWNhc2UgRFJNX0ZPUk1BVF9ZVllVOgotCQlyZXR1cm4gc3dpenpsZV95dnl1 OwotCWNhc2UgRFJNX0ZPUk1BVF9VWVZZOgotCQlyZXR1cm4gc3dpenpsZV91eXZ5OwotCWNhc2Ug RFJNX0ZPUk1BVF9WWVVZOgotCQlyZXR1cm4gc3dpenpsZV92eXV5OwotCX0KLX0KLQotc3RhdGlj IHZvaWQgY29udmVydF95dXl2X3RvX3JnYjI0KHN0cnVjdCBmYl9jb252ZXJ0ICpjdnQpCi17Ci0J aW50IGksIGo7Ci0JY29uc3QgdWludDhfdCAqeXV5djsKLQl1aW50OF90ICpyZ2IyNCA9IGN2dC0+ ZHN0LnB0cjsKLQl1bnNpZ25lZCBpbnQgcmdiMjRfc3RyaWRlID0gY3Z0LT5kc3QuZmItPnN0cmlk ZXNbMF07Ci0JdW5zaWduZWQgaW50IHl1eXZfc3RyaWRlID0gY3Z0LT5zcmMuZmItPnN0cmlkZXNb MF07Ci0Jc3RydWN0IGlndF9tYXQ0IG0gPSBpZ3RfeWNiY3JfdG9fcmdiX21hdHJpeChjdnQtPnNy Yy5mYi0+Y29sb3JfZW5jb2RpbmcsCi0JCQkJCQkgICAgY3Z0LT5zcmMuZmItPmNvbG9yX3Jhbmdl KTsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpzd3ogPSB5dXl2X3N3aXp6bGUoY3Z0LT5zcmMuZmIt PmRybV9mb3JtYXQpOwotCXVpbnQ4X3QgKmJ1ZjsKLQotCWlndF9hc3NlcnQoKGN2dC0+c3JjLmZi LT5kcm1fZm9ybWF0ID09IERSTV9GT1JNQVRfWVVZViB8fAotCQkgICAgY3Z0LT5zcmMuZmItPmRy bV9mb3JtYXQgPT0gRFJNX0ZPUk1BVF9VWVZZIHx8Ci0JCSAgICBjdnQtPnNyYy5mYi0+ZHJtX2Zv cm1hdCA9PSBEUk1fRk9STUFUX1lWWVUgfHwKLQkJICAgIGN2dC0+c3JjLmZiLT5kcm1fZm9ybWF0 ID09IERSTV9GT1JNQVRfVllVWSkgJiYKLQkJICAgY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQgPT0g RFJNX0ZPUk1BVF9YUkdCODg4OCk7Ci0KLQlidWYgPSBjb252ZXJ0X3NyY19nZXQoY3Z0KTsKLQl5 dXl2ID0gYnVmOwotCi0JZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQ7IGkrKykg ewotCQlmb3IgKGogPSAwOyBqIDwgY3Z0LT5kc3QuZmItPndpZHRoIC8gMjsgaisrKSB7Ci0JCQkv KiBDb252ZXJ0IDJ4MSBwaXhlbCBibG9ja3MgKi8KLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXZbMl07 Ci0JCQlzdHJ1Y3QgaWd0X3ZlYzQgcmdiWzJdOwotCi0JCQl5dXZbMF0uZFswXSA9IHl1eXZbaiAq IDQgKyBzd3pbMF1dOwotCQkJeXV2WzFdLmRbMF0gPSB5dXl2W2ogKiA0ICsgc3d6WzJdXTsKLQkJ CXl1dlswXS5kWzFdID0geXV2WzFdLmRbMV0gPSB5dXl2W2ogKiA0ICsgc3d6WzFdXTsKLQkJCXl1 dlswXS5kWzJdID0geXV2WzFdLmRbMl0gPSB5dXl2W2ogKiA0ICsgc3d6WzNdXTsKLQkJCXl1dlsw XS5kWzNdID0geXV2WzFdLmRbM10gPSAxLjBmOwotCi0JCQlyZ2JbMF0gPSBpZ3RfbWF0cml4X3Ry YW5zZm9ybSgmbSwgJnl1dlswXSk7Ci0JCQlyZ2JbMV0gPSBpZ3RfbWF0cml4X3RyYW5zZm9ybSgm bSwgJnl1dlsxXSk7Ci0KLQkJCXdyaXRlX3JnYigmcmdiMjRbaiAqIDggKyAwXSwgJnJnYlswXSk7 Ci0JCQl3cml0ZV9yZ2IoJnJnYjI0W2ogKiA4ICsgNF0sICZyZ2JbMV0pOwotCQl9Ci0KLQkJaWYg KGN2dC0+ZHN0LmZiLT53aWR0aCAmIDEpIHsKLQkJCXN0cnVjdCBpZ3RfdmVjNCB5dXY7Ci0JCQlz dHJ1Y3QgaWd0X3ZlYzQgcmdiOwotCi0JCQl5dXYuZFswXSA9IHl1eXZbaiAqIDQgKyBzd3pbMF1d OwotCQkJeXV2LmRbMV0gPSB5dXl2W2ogKiA0ICsgc3d6WzFdXTsKLQkJCXl1di5kWzJdID0geXV5 dltqICogNCArIHN3elszXV07Ci0JCQl5dXYuZFszXSA9IDEuMGY7Ci0KLQkJCXJnYiA9IGlndF9t YXRyaXhfdHJhbnNmb3JtKCZtLCAmeXV2KTsKLQotCQkJd3JpdGVfcmdiKCZyZ2IyNFtqICogOCAr IDBdLCAmcmdiKTsKKwkJCXVfdG1wICs9IHBhcmFtcy51dl9pbmM7CisJCQl2X3RtcCArPSBwYXJh bXMudXZfaW5jOwogCQl9CiAKIAkJcmdiMjQgKz0gcmdiMjRfc3RyaWRlOwotCQl5dXl2ICs9IHl1 eXZfc3RyaWRlOwotCX0KLQotCWNvbnZlcnRfc3JjX3B1dChjdnQsIGJ1Zik7Ci19Ci0KLXN0YXRp YyB2b2lkIGNvbnZlcnRfcmdiMjRfdG9feXV5dihzdHJ1Y3QgZmJfY29udmVydCAqY3Z0KQotewot CWludCBpLCBqOwotCXVpbnQ4X3QgKnl1eXYgPSBjdnQtPmRzdC5wdHI7Ci0JY29uc3QgdWludDhf dCAqcmdiMjQgPSBjdnQtPnNyYy5wdHI7Ci0JdW5zaWduZWQgcmdiMjRfc3RyaWRlID0gY3Z0LT5z cmMuZmItPnN0cmlkZXNbMF07Ci0JdW5zaWduZWQgeXV5dl9zdHJpZGUgPSBjdnQtPmRzdC5mYi0+ c3RyaWRlc1swXTsKLQlzdHJ1Y3QgaWd0X21hdDQgbSA9IGlndF9yZ2JfdG9feWNiY3JfbWF0cml4 KGN2dC0+ZHN0LmZiLT5jb2xvcl9lbmNvZGluZywKLQkJCQkJCSAgICBjdnQtPmRzdC5mYi0+Y29s b3JfcmFuZ2UpOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnN3eiA9IHl1eXZfc3dpenpsZShjdnQt PmRzdC5mYi0+ZHJtX2Zvcm1hdCk7Ci0KLQlpZ3RfYXNzZXJ0KGN2dC0+c3JjLmZiLT5kcm1fZm9y bWF0ID09IERSTV9GT1JNQVRfWFJHQjg4ODggJiYKLQkJICAgKGN2dC0+ZHN0LmZiLT5kcm1fZm9y bWF0ID09IERSTV9GT1JNQVRfWVVZViB8fAotCQkgICAgY3Z0LT5kc3QuZmItPmRybV9mb3JtYXQg PT0gRFJNX0ZPUk1BVF9VWVZZIHx8Ci0JCSAgICBjdnQtPmRzdC5mYi0+ZHJtX2Zvcm1hdCA9PSBE Uk1fRk9STUFUX1lWWVUgfHwKLQkJICAgIGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9G T1JNQVRfVllVWSkpOwotCi0JZm9yIChpID0gMDsgaSA8IGN2dC0+ZHN0LmZiLT5oZWlnaHQ7IGkr KykgewotCQlmb3IgKGogPSAwOyBqIDwgY3Z0LT5kc3QuZmItPndpZHRoIC8gMjsgaisrKSB7Ci0J CQkvKiBDb252ZXJ0IDJ4MSBwaXhlbCBibG9ja3MgKi8KLQkJCXN0cnVjdCBpZ3RfdmVjNCByZ2Jb Ml07Ci0JCQlzdHJ1Y3QgaWd0X3ZlYzQgeXV2WzJdOwotCi0JCQlyZWFkX3JnYigmcmdiWzBdLCAm cmdiMjRbaiAqIDggKyAwXSk7Ci0JCQlyZWFkX3JnYigmcmdiWzFdLCAmcmdiMjRbaiAqIDggKyA0 XSk7Ci0KLQkJCXl1dlswXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiWzBdKTsKLQkJ CXl1dlsxXSA9IGlndF9tYXRyaXhfdHJhbnNmb3JtKCZtLCAmcmdiWzFdKTsKKwkJeSArPSBwYXJh bXMueV9zdHJpZGU7CiAKLQkJCXl1eXZbaiAqIDQgKyBzd3pbMF1dID0geXV2WzBdLmRbMF07Ci0J CQl5dXl2W2ogKiA0ICsgc3d6WzJdXSA9IHl1dlsxXS5kWzBdOwotCQkJeXV5dltqICogNCArIHN3 elsxXV0gPSAoeXV2WzBdLmRbMV0gKyB5dXZbMV0uZFsxXSkgLyAyLjBmOwotCQkJeXV5dltqICog NCArIHN3elszXV0gPSAoeXV2WzBdLmRbMl0gKyB5dXZbMV0uZFsyXSkgLyAyLjBmOworCQlpZiAo KGkgJSBkc3RfZm10LT52c3ViKSA9PSAoZHN0X2ZtdC0+dnN1YiAtIDEpKSB7CisJCQl1ICs9IHBh cmFtcy51dl9zdHJpZGU7CisJCQl2ICs9IHBhcmFtcy51dl9zdHJpZGU7CiAJCX0KLQotCQlpZiAo Y3Z0LT5kc3QuZmItPndpZHRoICYgMSkgewotCQkJc3RydWN0IGlndF92ZWM0IHJnYjsKLQkJCXN0 cnVjdCBpZ3RfdmVjNCB5dXY7Ci0KLQkJCXJlYWRfcmdiKCZyZ2IsICZyZ2IyNFtqICogOCArIDBd KTsKLQotCQkJeXV2ID0gaWd0X21hdHJpeF90cmFuc2Zvcm0oJm0sICZyZ2IpOwotCi0JCQl5dXl2 W2ogKiA0ICsgc3d6WzBdXSA9IHl1di5kWzBdOwotCQkJeXV5dltqICogNCArIHN3elsxXV0gPSB5 dXYuZFsxXTsKLQkJCXl1eXZbaiAqIDQgKyBzd3pbM11dID0geXV2LmRbMl07Ci0JCX0KLQotCQly Z2IyNCArPSByZ2IyNF9zdHJpZGU7Ci0JCXl1eXYgKz0geXV5dl9zdHJpZGU7CiAJfQogfQogCkBA IC0yMDQ2LDMxICsxODU5LDIzIEBAIHN0YXRpYyB2b2lkIGZiX2NvbnZlcnQoc3RydWN0IGZiX2Nv bnZlcnQgKmN2dCkKIAl9IGVsc2UgaWYgKGN2dC0+ZHN0LmZiLT5kcm1fZm9ybWF0ID09IERSTV9G T1JNQVRfWFJHQjg4ODgpIHsKIAkJc3dpdGNoIChjdnQtPnNyYy5mYi0+ZHJtX2Zvcm1hdCkgewog CQljYXNlIERSTV9GT1JNQVRfWFlVVjg4ODg6Ci0JCQljb252ZXJ0X3l1djQ0NF90b19yZ2IyNChj dnQpOwotCQkJcmV0dXJuOwogCQljYXNlIERSTV9GT1JNQVRfTlYxMjoKLQkJCWNvbnZlcnRfbnYx Ml90b19yZ2IyNChjdnQpOwotCQkJcmV0dXJuOwotCQljYXNlIERSTV9GT1JNQVRfWVVZVjoKLQkJ Y2FzZSBEUk1fRk9STUFUX1lWWVU6CiAJCWNhc2UgRFJNX0ZPUk1BVF9VWVZZOgogCQljYXNlIERS TV9GT1JNQVRfVllVWToKLQkJCWNvbnZlcnRfeXV5dl90b19yZ2IyNChjdnQpOworCQljYXNlIERS TV9GT1JNQVRfWVVZVjoKKwkJY2FzZSBEUk1fRk9STUFUX1lWWVU6CisJCQljb252ZXJ0X3l1dl90 b19yZ2IyNChjdnQpOwogCQkJcmV0dXJuOwogCQl9CiAJfSBlbHNlIGlmIChjdnQtPnNyYy5mYi0+ ZHJtX2Zvcm1hdCA9PSBEUk1fRk9STUFUX1hSR0I4ODg4KSB7CiAJCXN3aXRjaCAoY3Z0LT5kc3Qu ZmItPmRybV9mb3JtYXQpIHsKIAkJY2FzZSBEUk1fRk9STUFUX1hZVVY4ODg4OgotCQkJY29udmVy dF9yZ2IyNF90b195dXY0NDQoY3Z0KTsKLQkJCXJldHVybjsKIAkJY2FzZSBEUk1fRk9STUFUX05W MTI6Ci0JCQljb252ZXJ0X3JnYjI0X3RvX252MTIoY3Z0KTsKLQkJCXJldHVybjsKIAkJY2FzZSBE Uk1fRk9STUFUX1lVWVY6CiAJCWNhc2UgRFJNX0ZPUk1BVF9ZVllVOgogCQljYXNlIERSTV9GT1JN QVRfVVlWWToKIAkJY2FzZSBEUk1fRk9STUFUX1ZZVVk6Ci0JCQljb252ZXJ0X3JnYjI0X3RvX3l1 eXYoY3Z0KTsKKwkJCWNvbnZlcnRfcmdiMjRfdG9feXV2KGN2dCk7CiAJCQlyZXR1cm47CiAJCX0K IAl9Ci0tIAoyLjIwLjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmlndC1kZXYgbWFpbGluZyBsaXN0CmlndC1kZXZAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaWd0LWRldgo=