From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chris Wilson Subject: [PATCH i-g-t 09/12] i915: Add gem_exec_balancer Date: Wed, 22 May 2019 12:37:09 +0100 Message-ID: <20190522113712.23512-9-chris@chris-wilson.co.uk> References: <20190522113712.23512-1-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190522113712.23512-1-chris@chris-wilson.co.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org Cc: igt-dev@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RXhlcmNpc2UgdGhlIGluLWtlcm5lbCBsb2FkIGJhbGFuY2VyIGNoZWNraW5nIHRoYXQgd2UgY2Fu IGRpc3RyaWJ1dGUKYmF0Y2hlcyBhY3Jvc3MgdGhlIHNldCBvZiBjdHgtPmVuZ2luZXMgdG8gYXZv aWQgbG9hZC4KCnYyOiBNYW55IGFzc29ydGVkIGltcHJvdmVtZW50cyBmcm9tIFR2cnRrby4KClNp Z25lZC1vZmYtYnk6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgotLS0K IHRlc3RzL01ha2VmaWxlLmFtICAgICAgICAgICAgICB8ICAgIDEgKwogdGVzdHMvTWFrZWZpbGUu c291cmNlcyAgICAgICAgIHwgICAgMSArCiB0ZXN0cy9pOTE1L2dlbV9leGVjX2JhbGFuY2VyLmMg fCAxMDUyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiB0ZXN0cy9tZXNvbi5idWls ZCAgICAgICAgICAgICAgfCAgICA3ICsKIDQgZmlsZXMgY2hhbmdlZCwgMTA2MSBpbnNlcnRpb25z KCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgdGVzdHMvaTkxNS9nZW1fZXhlY19iYWxhbmNlci5jCgpk aWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuYW0gYi90ZXN0cy9NYWtlZmlsZS5hbQppbmRleCA1 MDk3ZGViZjYuLmM2YWYwYWVhZiAxMDA2NDQKLS0tIGEvdGVzdHMvTWFrZWZpbGUuYW0KKysrIGIv dGVzdHMvTWFrZWZpbGUuYW0KQEAgLTk2LDYgKzk2LDcgQEAgZ2VtX2Nsb3NlX3JhY2VfTERBREQg PSAkKExEQUREKSAtbHB0aHJlYWQKIGdlbV9jdHhfdGhyYXNoX0NGTEFHUyA9ICQoQU1fQ0ZMQUdT KSAkKFRIUkVBRF9DRkxBR1MpCiBnZW1fY3R4X3RocmFzaF9MREFERCA9ICQoTERBREQpIC1scHRo cmVhZAogZ2VtX2N0eF9zc2V1X0xEQUREID0gJChMREFERCkgJCh0b3BfYnVpbGRkaXIpL2xpYi9s aWJpZ3RfcGVyZi5sYQoraTkxNV9nZW1fZXhlY19iYWxhbmNlcl9MREFERCA9ICQoTERBREQpICQo dG9wX2J1aWxkZGlyKS9saWIvbGliaWd0X3BlcmYubGEKIGdlbV9leGVjX2NhcHR1cmVfTERBREQg PSAkKExEQUREKSAtbHoKIGdlbV9leGVjX3BhcmFsbGVsX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAk KFRIUkVBRF9DRkxBR1MpCiBnZW1fZXhlY19wYXJhbGxlbF9MREFERCA9ICQoTERBREQpIC1scHRo cmVhZApkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcyBiL3Rlc3RzL01ha2VmaWxl LnNvdXJjZXMKaW5kZXggMmVmNjg5MDIzLi4xN2ZjYTZkNzcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL01h a2VmaWxlLnNvdXJjZXMKKysrIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwpAQCAtMjQsNiArMjQs NyBAQCBURVNUU19wcm9ncyA9IFwKIAlpOTE1L2dlbV9jdHhfY2xvbmUgXAogCWk5MTUvZ2VtX2N0 eF9lbmdpbmVzIFwKIAlpOTE1L2dlbV9jdHhfc2hhcmVkIFwKKwlpOTE1L2dlbV9leGVjX2JhbGFu Y2VyIFwKIAlpOTE1L2dlbV92bV9jcmVhdGUgXAogCWttc18zZCBcCiAJa21zX2FkZGZiX2Jhc2lj IFwKZGlmZiAtLWdpdCBhL3Rlc3RzL2k5MTUvZ2VtX2V4ZWNfYmFsYW5jZXIuYyBiL3Rlc3RzL2k5 MTUvZ2VtX2V4ZWNfYmFsYW5jZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAuLjQwYTI3MTljMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2k5MTUvZ2VtX2V4ZWNfYmFs YW5jZXIuYwpAQCAtMCwwICsxLDEwNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxOC0yMDE5 IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwg ZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhp cyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3 YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBp bmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwg bW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9v ciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3 aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRo ZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGlj ZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJh Z3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9y dGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklE RUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICog SU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBN RVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQg Tk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENP UFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVS CisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9S IE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lU SCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNP RlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzY2hlZC5oPgorCisjaW5jbHVkZSAiaWd0LmgiCisj aW5jbHVkZSAiaWd0X3BlcmYuaCIKKyNpbmNsdWRlICJpOTE1L2dlbV9yaW5nLmgiCisjaW5jbHVk ZSAic3dfc3luYy5oIgorCitJR1RfVEVTVF9ERVNDUklQVElPTigiRXhlcmNpc2UgaW4ta2VybmVs IGxvYWQtYmFsYW5jaW5nIik7CisKKyNkZWZpbmUgSU5TVEFOQ0VfQ09VTlQgKDEgPDwgSTkxNV9Q TVVfU0FNUExFX0lOU1RBTkNFX0JJVFMpCisKK3N0YXRpYyBib29sIGhhc19jbGFzc19pbnN0YW5j ZShpbnQgaTkxNSwgdWludDE2X3QgY2xhc3MsIHVpbnQxNl90IGluc3RhbmNlKQoreworCWludCBm ZDsKKworCWZkID0gcGVyZl9pOTE1X29wZW4oSTkxNV9QTVVfRU5HSU5FX0JVU1koY2xhc3MsIGlu c3RhbmNlKSk7CisJaWYgKGZkICE9IC0xKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIHRydWU7 CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgc3RydWN0IGk5MTVfZW5naW5lX2Ns YXNzX2luc3RhbmNlICoKK2xpc3RfZW5naW5lcyhpbnQgaTkxNSwgdWludDMyX3QgY2xhc3NfbWFz aywgdW5zaWduZWQgaW50ICpvdXQpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMCwgc2l6ZSA9 IDY0OworCXN0cnVjdCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSAqZW5naW5lczsKKworCWVu Z2luZXMgPSBtYWxsb2Moc2l6ZSAqIHNpemVvZigqZW5naW5lcykpOworCWlmICghZW5naW5lcykg eworCQkqb3V0ID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZm9yIChlbnVtIGRybV9pOTE1 X2dlbV9lbmdpbmVfY2xhc3MgY2xhc3MgPSBJOTE1X0VOR0lORV9DTEFTU19SRU5ERVI7CisJICAg ICBjbGFzc19tYXNrOworCSAgICAgY2xhc3MrKywgY2xhc3NfbWFzayA+Pj0gMSkgeworCQlpZiAo IShjbGFzc19tYXNrICYgMSkpCisJCQljb250aW51ZTsKKworCQlmb3IgKHVuc2lnbmVkIGludCBp bnN0YW5jZSA9IDA7CisJCSAgICAgaW5zdGFuY2UgPCBJTlNUQU5DRV9DT1VOVDsKKwkJICAgICBp bnN0YW5jZSsrKSB7CisJCQlpZiAoIWhhc19jbGFzc19pbnN0YW5jZShpOTE1LCBjbGFzcywgaW5z dGFuY2UpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoY291bnQgPT0gc2l6ZSkgeworCQkJCXN0 cnVjdCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSAqZTsKKworCQkJCXNpemUgKj0gMjsKKwkJ CQllID0gcmVhbGxvYyhlbmdpbmVzLCBzaXplKnNpemVvZigqZW5naW5lcykpOworCQkJCWlmICgh ZSkgeworCQkJCQkqb3V0ID0gY291bnQ7CisJCQkJCXJldHVybiBlbmdpbmVzOworCQkJCX0KKwor CQkJCWVuZ2luZXMgPSBlOworCQkJfQorCisJCQllbmdpbmVzW2NvdW50KytdID0gKHN0cnVjdCBp OTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSl7CisJCQkJLmVuZ2luZV9jbGFzcyA9IGNsYXNzLAor CQkJCQkuZW5naW5lX2luc3RhbmNlID0gaW5zdGFuY2UsCisJCQl9OworCQl9CisJfQorCisJaWYg KCFjb3VudCkgeworCQlmcmVlKGVuZ2luZXMpOworCQllbmdpbmVzID0gTlVMTDsKKwl9CisKKwkq b3V0ID0gY291bnQ7CisJcmV0dXJuIGVuZ2luZXM7Cit9CisKK3N0YXRpYyBpbnQgX19zZXRfbG9h ZF9iYWxhbmNlcihpbnQgaTkxNSwgdWludDMyX3QgY3R4LAorCQkJICAgICAgIGNvbnN0IHN0cnVj dCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSAqY2ksCisJCQkgICAgICAgdW5zaWduZWQgaW50 IGNvdW50KQoreworCUk5MTVfREVGSU5FX0NPTlRFWFRfRU5HSU5FU19MT0FEX0JBTEFOQ0UoYmFs YW5jZXIsIGNvdW50KTsKKwlJOTE1X0RFRklORV9DT05URVhUX1BBUkFNX0VOR0lORVMoZW5naW5l cywgMSArIGNvdW50KTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0gcCA9IHsK KwkJLmN0eF9pZCA9IGN0eCwKKwkJLnBhcmFtID0gSTkxNV9DT05URVhUX1BBUkFNX0VOR0lORVMs CisJCS5zaXplID0gc2l6ZW9mKGVuZ2luZXMpLAorCQkudmFsdWUgPSB0b191c2VyX3BvaW50ZXIo JmVuZ2luZXMpCisJfTsKKworCW1lbXNldCgmYmFsYW5jZXIsIDAsIHNpemVvZihiYWxhbmNlcikp OworCWJhbGFuY2VyLmJhc2UubmFtZSA9IEk5MTVfQ09OVEVYVF9FTkdJTkVTX0VYVF9MT0FEX0JB TEFOQ0U7CisKKwlpZ3RfYXNzZXJ0KGNvdW50KTsKKwliYWxhbmNlci5udW1fc2libGluZ3MgPSBj b3VudDsKKwltZW1jcHkoYmFsYW5jZXIuZW5naW5lcywgY2ksIGNvdW50ICogc2l6ZW9mKCpjaSkp OworCisJbWVtc2V0KCZlbmdpbmVzLCAwLCBzaXplb2YoZW5naW5lcykpOworCWVuZ2luZXMuZXh0 ZW5zaW9ucyA9IHRvX3VzZXJfcG9pbnRlcigmYmFsYW5jZXIpOworCWVuZ2luZXMuZW5naW5lc1sw XS5lbmdpbmVfY2xhc3MgPQorCQlJOTE1X0VOR0lORV9DTEFTU19JTlZBTElEOworCWVuZ2luZXMu ZW5naW5lc1swXS5lbmdpbmVfaW5zdGFuY2UgPQorCQlJOTE1X0VOR0lORV9DTEFTU19JTlZBTElE X05PTkU7CisJbWVtY3B5KGVuZ2luZXMuZW5naW5lcyArIDEsIGNpLCBjb3VudCAqIHNpemVvZigq Y2kpKTsKKworCXJldHVybiBfX2dlbV9jb250ZXh0X3NldF9wYXJhbShpOTE1LCAmcCk7Cit9CisK K3N0YXRpYyB2b2lkIHNldF9sb2FkX2JhbGFuY2VyKGludCBpOTE1LCB1aW50MzJfdCBjdHgsCisJ CQkgICAgICBjb25zdCBzdHJ1Y3QgaTkxNV9lbmdpbmVfY2xhc3NfaW5zdGFuY2UgKmNpLAorCQkJ ICAgICAgdW5zaWduZWQgaW50IGNvdW50KQoreworCWlndF9hc3NlcnRfZXEoX19zZXRfbG9hZF9i YWxhbmNlcihpOTE1LCBjdHgsIGNpLCBjb3VudCksIDApOworfQorCitzdGF0aWMgdWludDMyX3Qg bG9hZF9iYWxhbmNlcl9jcmVhdGUoaW50IGk5MTUsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgaTkx NV9lbmdpbmVfY2xhc3NfaW5zdGFuY2UgKmNpLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNvdW50 KQoreworCXVpbnQzMl90IGN0eDsKKworCWN0eCA9IGdlbV9jb250ZXh0X2NyZWF0ZShpOTE1KTsK KwlzZXRfbG9hZF9iYWxhbmNlcihpOTE1LCBjdHgsIGNpLCBjb3VudCk7CisKKwlyZXR1cm4gY3R4 OworfQorCitzdGF0aWMgdWludDMyX3QgX19iYXRjaF9jcmVhdGUoaW50IGk5MTUsIHVpbnQzMl90 IG9mZnNldCkKK3sKKwljb25zdCB1aW50MzJfdCBiYmUgPSBNSV9CQVRDSF9CVUZGRVJfRU5EOwor CXVpbnQzMl90IGhhbmRsZTsKKworCWhhbmRsZSA9IGdlbV9jcmVhdGUoaTkxNSwgQUxJR04ob2Zm c2V0ICsgNCwgNDA5NikpOworCWdlbV93cml0ZShpOTE1LCBoYW5kbGUsIG9mZnNldCwgJmJiZSwg c2l6ZW9mKGJiZSkpOworCisJcmV0dXJuIGhhbmRsZTsKK30KKworc3RhdGljIHVpbnQzMl90IGJh dGNoX2NyZWF0ZShpbnQgaTkxNSkKK3sKKwlyZXR1cm4gX19iYXRjaF9jcmVhdGUoaTkxNSwgMCk7 Cit9CisKK3N0YXRpYyB2b2lkIGludmFsaWRfYmFsYW5jZXIoaW50IGk5MTUpCit7CisJSTkxNV9E RUZJTkVfQ09OVEVYVF9FTkdJTkVTX0xPQURfQkFMQU5DRShiYWxhbmNlciwgNjQpOworCUk5MTVf REVGSU5FX0NPTlRFWFRfUEFSQU1fRU5HSU5FUyhlbmdpbmVzLCA2NCk7CisJc3RydWN0IGRybV9p OTE1X2dlbV9jb250ZXh0X3BhcmFtIHAgPSB7CisJCS5wYXJhbSA9IEk5MTVfQ09OVEVYVF9QQVJB TV9FTkdJTkVTLAorCQkudmFsdWUgPSB0b191c2VyX3BvaW50ZXIoJmVuZ2luZXMpCisJfTsKKwl1 aW50MzJfdCBoYW5kbGU7CisJdm9pZCAqcHRyOworCisJLyoKKwkgKiBBc3N1bWUgdGhhdCBJOTE1 X0NPTlRFWFRfUEFSQU1fRU5HSU5FIHZhbGlkYXRlcyB0aGUgYXJyYXkKKwkgKiBvZiBlbmdpbmVz W10sIG91ciBqb2IgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBsb2FkX2JhbGFuY2VyCisJICogZXh0 ZW5zaW9uIGV4cGxvZGVzLgorCSAqLworCisJZm9yIChpbnQgY2xhc3MgPSAwOyBjbGFzcyA8IDMy OyBjbGFzcysrKSB7CisJCXN0cnVjdCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSAqY2k7CisJ CXVuc2lnbmVkIGludCBjb3VudDsKKworCQljaSA9IGxpc3RfZW5naW5lcyhpOTE1LCAxIDw8IGNs YXNzLCAmY291bnQpOworCQlpZiAoIWNpKQorCQkJY29udGludWU7CisKKwkJaWd0X2Fzc2VydF9s dGUoY291bnQsIDY0KTsKKworCQlwLmN0eF9pZCA9IGdlbV9jb250ZXh0X2NyZWF0ZShpOTE1KTsK KwkJcC5zaXplID0gKHNpemVvZihzdHJ1Y3QgaTkxNV9jb250ZXh0X3BhcmFtX2VuZ2luZXMpICsK KwkJCSAgKGNvdW50ICsgMSkgKiBzaXplb2YoKmVuZ2luZXMuZW5naW5lcykpOworCisJCW1lbXNl dCgmZW5naW5lcywgMCwgc2l6ZW9mKGVuZ2luZXMpKTsKKwkJZW5naW5lcy5lbmdpbmVzWzBdLmVu Z2luZV9jbGFzcyA9IEk5MTVfRU5HSU5FX0NMQVNTX0lOVkFMSUQ7CisJCWVuZ2luZXMuZW5naW5l c1swXS5lbmdpbmVfaW5zdGFuY2UgPSBJOTE1X0VOR0lORV9DTEFTU19JTlZBTElEX05PTkU7CisJ CW1lbWNweShlbmdpbmVzLmVuZ2luZXMgKyAxLCBjaSwgY291bnQgKiBzaXplb2YoKmNpKSk7CisJ CWdlbV9jb250ZXh0X3NldF9wYXJhbShpOTE1LCAmcCk7CisKKwkJZW5naW5lcy5leHRlbnNpb25z ID0gLTF1bGw7CisJCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9zZXRfcGFyYW0oaTkxNSwg JnApLCAtRUZBVUxUKTsKKworCQllbmdpbmVzLmV4dGVuc2lvbnMgPSAxdWxsOworCQlpZ3RfYXNz ZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGk5MTUsICZwKSwgLUVGQVVMVCk7CisKKwkJ bWVtc2V0KCZiYWxhbmNlciwgMCwgc2l6ZW9mKGJhbGFuY2VyKSk7CisJCWJhbGFuY2VyLmJhc2Uu bmFtZSA9IEk5MTVfQ09OVEVYVF9FTkdJTkVTX0VYVF9MT0FEX0JBTEFOQ0U7CisJCWJhbGFuY2Vy Lm51bV9zaWJsaW5ncyA9IGNvdW50OworCQltZW1jcHkoYmFsYW5jZXIuZW5naW5lcywgY2ksIGNv dW50ICogc2l6ZW9mKCpjaSkpOworCisJCWVuZ2luZXMuZXh0ZW5zaW9ucyA9IHRvX3VzZXJfcG9p bnRlcigmYmFsYW5jZXIpOworCQlnZW1fY29udGV4dF9zZXRfcGFyYW0oaTkxNSwgJnApOworCisJ CWJhbGFuY2VyLmVuZ2luZV9pbmRleCA9IDE7CisJCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4 dF9zZXRfcGFyYW0oaTkxNSwgJnApLCAtRUVYSVNUKTsKKworCQliYWxhbmNlci5lbmdpbmVfaW5k ZXggPSBjb3VudDsKKwkJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJhbShpOTE1 LCAmcCksIC1FRVhJU1QpOworCisJCWJhbGFuY2VyLmVuZ2luZV9pbmRleCA9IGNvdW50ICsgMTsK KwkJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJhbShpOTE1LCAmcCksIC1FSU5W QUwpOworCisJCWJhbGFuY2VyLmVuZ2luZV9pbmRleCA9IDA7CisJCWdlbV9jb250ZXh0X3NldF9w YXJhbShpOTE1LCAmcCk7CisKKwkJYmFsYW5jZXIuYmFzZS5uZXh0X2V4dGVuc2lvbiA9IHRvX3Vz ZXJfcG9pbnRlcigmYmFsYW5jZXIpOworCQlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0 X3BhcmFtKGk5MTUsICZwKSwgLUVFWElTVCk7CisKKwkJYmFsYW5jZXIuYmFzZS5uZXh0X2V4dGVu c2lvbiA9IC0xdWxsOworCQlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGk5 MTUsICZwKSwgLUVGQVVMVCk7CisKKwkJaGFuZGxlID0gZ2VtX2NyZWF0ZShpOTE1LCA0MDk2ICog Myk7CisJCXB0ciA9IGdlbV9tbWFwX19ndHQoaTkxNSwgaGFuZGxlLCA0MDk2ICogMywgUFJPVF9X UklURSk7CisJCWdlbV9jbG9zZShpOTE1LCBoYW5kbGUpOworCisJCW1lbXNldCgmZW5naW5lcywg MCwgc2l6ZW9mKGVuZ2luZXMpKTsKKwkJZW5naW5lcy5lbmdpbmVzWzBdLmVuZ2luZV9jbGFzcyA9 IEk5MTVfRU5HSU5FX0NMQVNTX0lOVkFMSUQ7CisJCWVuZ2luZXMuZW5naW5lc1swXS5lbmdpbmVf aW5zdGFuY2UgPSBJOTE1X0VOR0lORV9DTEFTU19JTlZBTElEX05PTkU7CisJCWVuZ2luZXMuZW5n aW5lc1sxXS5lbmdpbmVfY2xhc3MgPSBJOTE1X0VOR0lORV9DTEFTU19JTlZBTElEOworCQllbmdp bmVzLmVuZ2luZXNbMV0uZW5naW5lX2luc3RhbmNlID0gSTkxNV9FTkdJTkVfQ0xBU1NfSU5WQUxJ RF9OT05FOworCQltZW1jcHkoZW5naW5lcy5lbmdpbmVzICsgMiwgY2ksIGNvdW50ICogc2l6ZW9m KGNpKSk7CisJCXAuc2l6ZSA9IChzaXplb2Yoc3RydWN0IGk5MTVfY29udGV4dF9wYXJhbV9lbmdp bmVzKSArCisJCQkgIChjb3VudCArIDIpICogc2l6ZW9mKCplbmdpbmVzLmVuZ2luZXMpKTsKKwkJ Z2VtX2NvbnRleHRfc2V0X3BhcmFtKGk5MTUsICZwKTsKKworCQliYWxhbmNlci5iYXNlLm5leHRf ZXh0ZW5zaW9uID0gMDsKKwkJYmFsYW5jZXIuZW5naW5lX2luZGV4ID0gMTsKKwkJZW5naW5lcy5l eHRlbnNpb25zID0gdG9fdXNlcl9wb2ludGVyKCZiYWxhbmNlcik7CisJCWdlbV9jb250ZXh0X3Nl dF9wYXJhbShpOTE1LCAmcCk7CisKKwkJbWVtY3B5KHB0ciArIDQwOTYgLSA4LCAmYmFsYW5jZXIs IHNpemVvZihiYWxhbmNlcikpOworCQltZW1jcHkocHRyICsgODE5MiAtIDgsICZiYWxhbmNlciwg c2l6ZW9mKGJhbGFuY2VyKSk7CisJCWJhbGFuY2VyLmVuZ2luZV9pbmRleCA9IDA7CisKKwkJZW5n aW5lcy5leHRlbnNpb25zID0gdG9fdXNlcl9wb2ludGVyKHB0cikgKyA0MDk2IC0gODsKKwkJZ2Vt X2NvbnRleHRfc2V0X3BhcmFtKGk5MTUsICZwKTsKKworCQliYWxhbmNlci5iYXNlLm5leHRfZXh0 ZW5zaW9uID0gZW5naW5lcy5leHRlbnNpb25zOworCQllbmdpbmVzLmV4dGVuc2lvbnMgPSB0b191 c2VyX3BvaW50ZXIoJmJhbGFuY2VyKTsKKwkJZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGk5MTUsICZw KTsKKworCQltdW5tYXAocHRyLCA0MDk2KTsKKwkJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0 X3NldF9wYXJhbShpOTE1LCAmcCksIC1FRkFVTFQpOworCQllbmdpbmVzLmV4dGVuc2lvbnMgPSB0 b191c2VyX3BvaW50ZXIocHRyKSArIDQwOTYgLSA4OworCQlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2Nv bnRleHRfc2V0X3BhcmFtKGk5MTUsICZwKSwgLUVGQVVMVCk7CisKKwkJZW5naW5lcy5leHRlbnNp b25zID0gdG9fdXNlcl9wb2ludGVyKHB0cikgKyA4MTkyIC0gODsKKwkJZ2VtX2NvbnRleHRfc2V0 X3BhcmFtKGk5MTUsICZwKTsKKworCQliYWxhbmNlci5iYXNlLm5leHRfZXh0ZW5zaW9uID0gZW5n aW5lcy5leHRlbnNpb25zOworCQllbmdpbmVzLmV4dGVuc2lvbnMgPSB0b191c2VyX3BvaW50ZXIo JmJhbGFuY2VyKTsKKwkJZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGk5MTUsICZwKTsKKworCQltdW5t YXAocHRyICsgODE5MiwgNDA5Nik7CisJCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9zZXRf cGFyYW0oaTkxNSwgJnApLCAtRUZBVUxUKTsKKwkJZW5naW5lcy5leHRlbnNpb25zID0gdG9fdXNl cl9wb2ludGVyKHB0cikgKyA4MTkyIC0gODsKKwkJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0 X3NldF9wYXJhbShpOTE1LCAmcCksIC1FRkFVTFQpOworCisJCW11bm1hcChwdHIgKyA0MDk2LCA0 MDk2KTsKKworCQlnZW1fY29udGV4dF9kZXN0cm95KGk5MTUsIHAuY3R4X2lkKTsKKwkJZnJlZShj aSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBraWNrX2t0aHJlYWRzKHZvaWQpCit7CisJdXNsZWVw KDIwICogMTAwMCk7IC8qIDIwbXMgc2hvdWxkIGJlIGVub3VnaCBmb3Iga3NvZnRpcnFkISAqLwor fQorCitzdGF0aWMgZG91YmxlIG1lYXN1cmVfbG9hZChpbnQgcG11LCBpbnQgcGVyaW9kX3VzKQor eworCXVpbnQ2NF90IGRhdGFbMl07CisJdWludDY0X3QgZF90LCBkX3Y7CisKKwlraWNrX2t0aHJl YWRzKCk7CisKKwlpZ3RfYXNzZXJ0X2VxKHJlYWQocG11LCBkYXRhLCBzaXplb2YoZGF0YSkpLCBz aXplb2YoZGF0YSkpOworCWRfdiA9IC1kYXRhWzBdOworCWRfdCA9IC1kYXRhWzFdOworCisJdXNs ZWVwKHBlcmlvZF91cyk7CisKKwlpZ3RfYXNzZXJ0X2VxKHJlYWQocG11LCBkYXRhLCBzaXplb2Yo ZGF0YSkpLCBzaXplb2YoZGF0YSkpOworCWRfdiArPSBkYXRhWzBdOworCWRfdCArPSBkYXRhWzFd OworCisJcmV0dXJuIGRfdiAvIChkb3VibGUpZF90OworfQorCitzdGF0aWMgZG91YmxlIG1lYXN1 cmVfbWluX2xvYWQoaW50IHBtdSwgdW5zaWduZWQgaW50IG51bSwgaW50IHBlcmlvZF91cykKK3sK Kwl1aW50NjRfdCBkYXRhWzIgKyBudW1dOworCXVpbnQ2NF90IGRfdCwgZF92W251bV07CisJdWlu dDY0X3QgbWluID0gLTEsIG1heCA9IDA7CisKKwlraWNrX2t0aHJlYWRzKCk7CisKKwlpZ3RfYXNz ZXJ0X2VxKHJlYWQocG11LCBkYXRhLCBzaXplb2YoZGF0YSkpLCBzaXplb2YoZGF0YSkpOworCWZv ciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwgbnVtOyBuKyspCisJCWRfdltuXSA9IC1kYXRhWzIg KyBuXTsKKwlkX3QgPSAtZGF0YVsxXTsKKworCXVzbGVlcChwZXJpb2RfdXMpOworCisJaWd0X2Fz c2VydF9lcShyZWFkKHBtdSwgZGF0YSwgc2l6ZW9mKGRhdGEpKSwgc2l6ZW9mKGRhdGEpKTsKKwor CWRfdCArPSBkYXRhWzFdOworCWZvciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwgbnVtOyBuKysp IHsKKwkJZF92W25dICs9IGRhdGFbMiArIG5dOworCQlpZ3RfZGVidWcoImVuZ2luZVslZF06ICUu MWYlJVxuIiwKKwkJCSAgbiwgZF92W25dIC8gKGRvdWJsZSlkX3QgKiAxMDApOworCQlpZiAoZF92 W25dIDwgbWluKQorCQkJbWluID0gZF92W25dOworCQlpZiAoZF92W25dID4gbWF4KQorCQkJbWF4 ID0gZF92W25dOworCX0KKworCWlndF9kZWJ1ZygiZWxhcHNlZDogJSJQUkl1NjQibnMsIGxvYWQg WyUuMWYsICUuMWZdJSVcbiIsCisJCSAgZF90LCBtaW4gLyAoZG91YmxlKWRfdCAqIDEwMCwgIG1h eCAvIChkb3VibGUpZF90ICogMTAwKTsKKworCXJldHVybiBtaW4gLyAoZG91YmxlKWRfdDsKK30K Kworc3RhdGljIHZvaWQgY2hlY2tfaW5kaXZpZHVhbF9lbmdpbmUoaW50IGk5MTUsCisJCQkJICAg IHVpbnQzMl90IGN0eCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGk5MTVfZW5naW5lX2NsYXNzX2lu c3RhbmNlICpjaSwKKwkJCQkgICAgaW50IGlkeCkKK3sKKwlpZ3Rfc3Bpbl90ICpzcGluOworCWRv dWJsZSBsb2FkOworCWludCBwbXU7CisKKwlwbXUgPSBwZXJmX2k5MTVfb3BlbihJOTE1X1BNVV9F TkdJTkVfQlVTWShjaVtpZHhdLmVuZ2luZV9jbGFzcywKKwkJCQkJCSAgY2lbaWR4XS5lbmdpbmVf aW5zdGFuY2UpKTsKKworCXNwaW4gPSBpZ3Rfc3Bpbl9uZXcoaTkxNSwgLmN0eCA9IGN0eCwgLmVu Z2luZSA9IGlkeCArIDEpOworCWxvYWQgPSBtZWFzdXJlX2xvYWQocG11LCAxMDAwMCk7CisJaWd0 X3NwaW5fZnJlZShpOTE1LCBzcGluKTsKKworCWNsb3NlKHBtdSk7CisKKwlpZ3RfYXNzZXJ0X2Yo bG9hZCA+IDAuOTAsCisJCSAgICAgImVuZ2luZSAlZCAoY2xhc3M6aW5zdGFuY2UgJWQ6JWQpIHdh cyBmb3VuZCB0byBiZSBvbmx5ICUuMWYlJSBidXN5XG4iLAorCQkgICAgIGlkeCwgY2lbaWR4XS5l bmdpbmVfY2xhc3MsIGNpW2lkeF0uZW5naW5lX2luc3RhbmNlLCBsb2FkKjEwMCk7Cit9CisKK3N0 YXRpYyB2b2lkIGluZGl2aWR1YWwoaW50IGk5MTUpCit7CisJdWludDMyX3QgY3R4OworCisJLyoK KwkgKiBJOTE1X0NPTlRFWFRfUEFSQU1fRU5HSU5FIGFsbG93cyB1cyB0byBpbmRleCBpbnRvIHRo ZSB1c2VyCisJICogc3VwcGxpZWQgYXJyYXkgZnJvbSBnZW1fZXhlY2J1ZigpLiBPdXIgY2hlY2sg aXMgdG8gYnVpbGQgdGhlCisJICogY3R4LT5lbmdpbmVbXSB3aXRoIHZhcmlvdXMgZGlmZmVyZW50 IGVuZ2luZSBjbGFzc2VzLCBmZWVkIGluCisJICogYSBzcGlubmVyIGFuZCB0aGVuIGFzayBwbXUg dG8gY29uZmlybSBpdCB0aGUgZXhwZWN0ZWQgZW5naW5lCisJICogd2FzIGJ1c3kuCisJICovCisK KwljdHggPSBnZW1fY29udGV4dF9jcmVhdGUoaTkxNSk7CisKKwlmb3IgKGludCBjbGFzcyA9IDA7 IGNsYXNzIDwgMzI7IGNsYXNzKyspIHsKKwkJc3RydWN0IGk5MTVfZW5naW5lX2NsYXNzX2luc3Rh bmNlICpjaTsKKwkJdW5zaWduZWQgaW50IGNvdW50OworCisJCWNpID0gbGlzdF9lbmdpbmVzKGk5 MTUsIDF1IDw8IGNsYXNzLCAmY291bnQpOworCQlpZiAoIWNpKQorCQkJY29udGludWU7CisKKwkJ Zm9yIChpbnQgcGFzcyA9IDA7IHBhc3MgPCBjb3VudDsgcGFzcysrKSB7IC8qIGFwcHJveC4gY291 bnQhICovCisJCQlpZ3RfYXNzZXJ0KHNpemVvZigqY2kpID09IHNpemVvZihpbnQpKTsKKwkJCWln dF9wZXJtdXRlX2FycmF5KGNpLCBjb3VudCwgaWd0X2V4Y2hhbmdlX2ludCk7CisJCQlzZXRfbG9h ZF9iYWxhbmNlcihpOTE1LCBjdHgsIGNpLCBjb3VudCk7CisJCQlmb3IgKHVuc2lnbmVkIGludCBu ID0gMDsgbiA8IGNvdW50OyBuKyspCisJCQkJY2hlY2tfaW5kaXZpZHVhbF9lbmdpbmUoaTkxNSwg Y3R4LCBjaSwgbik7CisJCX0KKworCQlmcmVlKGNpKTsKKwl9CisKKwlnZW1fY29udGV4dF9kZXN0 cm95KGk5MTUsIGN0eCk7CisJZ2VtX3F1aWVzY2VudF9ncHUoaTkxNSk7Cit9CisKK3N0YXRpYyB2 b2lkIGluZGljZXMoaW50IGk5MTUpCit7CisJSTkxNV9ERUZJTkVfQ09OVEVYVF9QQVJBTV9FTkdJ TkVTKGVuZ2luZXMsIEk5MTVfRVhFQ19SSU5HX01BU0sgKyAxKTsKKwlzdHJ1Y3QgZHJtX2k5MTVf Z2VtX2NvbnRleHRfcGFyYW0gcCA9IHsKKwkJLmN0eF9pZCA9IGdlbV9jb250ZXh0X2NyZWF0ZShp OTE1KSwKKwkJLnBhcmFtID0gSTkxNV9DT05URVhUX1BBUkFNX0VOR0lORVMsCisJCS52YWx1ZSA9 IHRvX3VzZXJfcG9pbnRlcigmZW5naW5lcykKKwl9OworCisJc3RydWN0IGRybV9pOTE1X2dlbV9l eGVjX29iamVjdDIgYmF0Y2ggPSB7CisJCS5oYW5kbGUgPSBiYXRjaF9jcmVhdGUoaTkxNSksCisJ fTsKKworCXVuc2lnbmVkIGludCBuZW5naW5lcyA9IDA7CisJdm9pZCAqYmFsYW5jZXJzID0gTlVM TDsKKworCS8qCisJICogV2UgY2FuIHBvcHVsYXRlIG91ciBlbmdpbmUgbWFwIHdpdGggbXVsdGlw bGUgdmlydHVhbCBlbmdpbmVzLgorCSAqIERvIHNvLgorCSAqLworCisJZm9yIChpbnQgY2xhc3Mg PSAwOyBjbGFzcyA8IDMyOyBjbGFzcysrKSB7CisJCXN0cnVjdCBpOTE1X2VuZ2luZV9jbGFzc19p bnN0YW5jZSAqY2k7CisJCXVuc2lnbmVkIGludCBjb3VudDsKKworCQljaSA9IGxpc3RfZW5naW5l cyhpOTE1LCAxdSA8PCBjbGFzcywgJmNvdW50KTsKKwkJaWYgKCFjaSkKKwkJCWNvbnRpbnVlOwor CisJCWZvciAoaW50IG4gPSAwOyBuIDwgY291bnQ7IG4rKykgeworCQkJSTkxNV9ERUZJTkVfQ09O VEVYVF9FTkdJTkVTX0xPQURfQkFMQU5DRSgqYmFsYW5jZXIsCisJCQkJCQkJCSBjb3VudCk7CisK KwkJCWVuZ2luZXMuZW5naW5lc1tuZW5naW5lc10uZW5naW5lX2NsYXNzID0KKwkJCQlJOTE1X0VO R0lORV9DTEFTU19JTlZBTElEOworCQkJZW5naW5lcy5lbmdpbmVzW25lbmdpbmVzXS5lbmdpbmVf aW5zdGFuY2UgPQorCQkJCUk5MTVfRU5HSU5FX0NMQVNTX0lOVkFMSURfTk9ORTsKKworCQkJYmFs YW5jZXIgPSBjYWxsb2Moc2l6ZW9mKCpiYWxhbmNlciksIDEpOworCQkJaWd0X2Fzc2VydChiYWxh bmNlcik7CisKKwkJCWJhbGFuY2VyLT5iYXNlLm5hbWUgPQorCQkJCUk5MTVfQ09OVEVYVF9FTkdJ TkVTX0VYVF9MT0FEX0JBTEFOQ0U7CisJCQliYWxhbmNlci0+YmFzZS5uZXh0X2V4dGVuc2lvbiA9 CisJCQkJdG9fdXNlcl9wb2ludGVyKGJhbGFuY2Vycyk7CisJCQliYWxhbmNlcnMgPSBiYWxhbmNl cjsKKworCQkJYmFsYW5jZXItPmVuZ2luZV9pbmRleCA9IG5lbmdpbmVzKys7CisJCQliYWxhbmNl ci0+bnVtX3NpYmxpbmdzID0gY291bnQ7CisKKwkJCW1lbWNweShiYWxhbmNlci0+ZW5naW5lcywK KwkJCSAgICAgICBjaSwgY291bnQgKiBzaXplb2YoKmNpKSk7CisJCX0KKwkJZnJlZShjaSk7CisJ fQorCisJaWd0X3JlcXVpcmUoYmFsYW5jZXJzKTsKKwllbmdpbmVzLmV4dGVuc2lvbnMgPSB0b191 c2VyX3BvaW50ZXIoYmFsYW5jZXJzKTsKKwlwLnNpemUgPSAoc2l6ZW9mKHN0cnVjdCBpOTE1X2Vu Z2luZV9jbGFzc19pbnN0YW5jZSkgKiBuZW5naW5lcyArCisJCSAgc2l6ZW9mKHN0cnVjdCBpOTE1 X2NvbnRleHRfcGFyYW1fZW5naW5lcykpOworCWdlbV9jb250ZXh0X3NldF9wYXJhbShpOTE1LCAm cCk7CisKKwlmb3IgKHVuc2lnbmVkIGludCBuID0gMDsgbiA8IG5lbmdpbmVzOyBuKyspIHsKKwkJ c3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBlYiA9IHsKKwkJCS5idWZmZXJzX3B0ciA9 IHRvX3VzZXJfcG9pbnRlcigmYmF0Y2gpLAorCQkJLmJ1ZmZlcl9jb3VudCA9IDEsCisJCQkuZmxh Z3MgPSBuLAorCQkJLnJzdmQxID0gcC5jdHhfaWQsCisJCX07CisJCWlndF9kZWJ1ZygiRXhlY3V0 aW5nIG9uIGluZGV4PSVkXG4iLCBuKTsKKwkJZ2VtX2V4ZWNidWYoaTkxNSwgJmViKTsKKwl9CisJ Z2VtX2NvbnRleHRfZGVzdHJveShpOTE1LCBwLmN0eF9pZCk7CisKKwlnZW1fc3luYyhpOTE1LCBi YXRjaC5oYW5kbGUpOworCWdlbV9jbG9zZShpOTE1LCBiYXRjaC5oYW5kbGUpOworCisJd2hpbGUg KGJhbGFuY2VycykgeworCQlzdHJ1Y3QgaTkxNV9jb250ZXh0X2VuZ2luZXNfbG9hZF9iYWxhbmNl ICpiLCAqbjsKKworCQliID0gYmFsYW5jZXJzOworCQluID0gZnJvbV91c2VyX3BvaW50ZXIoYi0+ YmFzZS5uZXh0X2V4dGVuc2lvbik7CisJCWZyZWUoYik7CisKKwkJYmFsYW5jZXJzID0gbjsKKwl9 CisKKwlnZW1fcXVpZXNjZW50X2dwdShpOTE1KTsKK30KKworc3RhdGljIHZvaWQgYnVzeShpbnQg aTkxNSkKK3sKKwl1aW50MzJfdCBzY3JhdGNoID0gZ2VtX2NyZWF0ZShpOTE1LCA0MDk2KTsKKwor CS8qCisJICogQ2hlY2sgdGhhdCB2aXJ0dWFsIGVuZ2luZXMgYXJlIHJlcG9ydGVkIHZpYSBHRU1f QlVTWS4KKwkgKgorCSAqIFdoZW4gcnVubmluZywgdGhlIGJhdGNoIHdpbGwgYmUgb24gdGhlIHJl YWwgZW5naW5lIGFuZCByZXBvcnQKKwkgKiB0aGUgYWN0dWFsIGNsYXNzLgorCSAqCisJICogUHJp b3IgdG8gcnVubmluZywgaWYgdGhlIGxvYWQtYmFsYW5jZXIgaXMgYWNyb3NzIG11bHRpcGxlCisJ ICogY2xhc3NlcyB3ZSBkb24ndCBrbm93IHdoaWNoIGVuZ2luZSB0aGUgYmF0Y2ggd2lsbAorCSAq IGV4ZWN1dGUgb24sIHNvIHdlIHJlcG9ydCB0aGVtIGFsbCEKKwkgKgorCSAqIEhvd2V2ZXIsIGFz IHdlIG9ubHkgc3VwcG9ydCAoYW5kIHRlc3QpIGNyZWF0aW5nIGEgbG9hZC1iYWxhbmNlcgorCSAq IGZyb20gZW5naW5lcyBvZiBvbmx5IG9uZSBjbGFzcywgdGhhdCBjYW4gYmUgcHJvcGFnYXRlZCBh Y2N1cmF0ZWx5CisJICogdGhyb3VnaCB0byBHRU1fQlVTWS4KKwkgKi8KKworCWZvciAoaW50IGNs YXNzID0gMDsgY2xhc3MgPCAxNjsgY2xhc3MrKykgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2J1 c3kgYnVzeTsKKwkJc3RydWN0IGk5MTVfZW5naW5lX2NsYXNzX2luc3RhbmNlICpjaTsKKwkJdW5z aWduZWQgaW50IGNvdW50OworCQlpZ3Rfc3Bpbl90ICpzcGluWzJdOworCQl1aW50MzJfdCBjdHg7 CisKKwkJY2kgPSBsaXN0X2VuZ2luZXMoaTkxNSwgMXUgPDwgY2xhc3MsICZjb3VudCk7CisJCWlm ICghY2kpCisJCQljb250aW51ZTsKKworCQljdHggPSBsb2FkX2JhbGFuY2VyX2NyZWF0ZShpOTE1 LCBjaSwgY291bnQpOworCQlmcmVlKGNpKTsKKworCQlzcGluWzBdID0gX19pZ3Rfc3Bpbl9uZXco aTkxNSwKKwkJCQkJIC5jdHggPSBjdHgsCisJCQkJCSAuZmxhZ3MgPSBJR1RfU1BJTl9QT0xMX1JV Tik7CisJCXNwaW5bMV0gPSBfX2lndF9zcGluX25ldyhpOTE1LAorCQkJCQkgLmN0eCA9IGN0eCwK KwkJCQkJIC5kZXBlbmRlbmN5ID0gc2NyYXRjaCk7CisKKwkJaWd0X3NwaW5fYnVzeXdhaXRfdW50 aWxfc3RhcnRlZChzcGluWzBdKTsKKworCQkvKiBSdW5uaW5nOiBhY3R1YWwgY2xhc3MgKi8KKwkJ YnVzeS5oYW5kbGUgPSBzcGluWzBdLT5oYW5kbGU7CisJCWRvX2lvY3RsKGk5MTUsIERSTV9JT0NU TF9JOTE1X0dFTV9CVVNZLCAmYnVzeSk7CisJCWlndF9hc3NlcnRfZXFfdTMyKGJ1c3kuYnVzeSwg MXUgPDwgKGNsYXNzICsgMTYpKTsKKworCQkvKiBRdWV1ZWQocmVhZCk6IGV4cGVjdGVkIGNsYXNz ICovCisJCWJ1c3kuaGFuZGxlID0gc3BpblsxXS0+aGFuZGxlOworCQlkb19pb2N0bChpOTE1LCBE Uk1fSU9DVExfSTkxNV9HRU1fQlVTWSwgJmJ1c3kpOworCQlpZ3RfYXNzZXJ0X2VxX3UzMihidXN5 LmJ1c3ksIDF1IDw8IChjbGFzcyArIDE2KSk7CisKKwkJLyogUXVldWVkKHdyaXRlKTogZXhwZWN0 ZWQgY2xhc3MgKi8KKwkJYnVzeS5oYW5kbGUgPSBzY3JhdGNoOworCQlkb19pb2N0bChpOTE1LCBE Uk1fSU9DVExfSTkxNV9HRU1fQlVTWSwgJmJ1c3kpOworCQlpZ3RfYXNzZXJ0X2VxX3UzMihidXN5 LmJ1c3ksCisJCQkJICAoMXUgPDwgKGNsYXNzICsgMTYpKSB8IChjbGFzcyArIDEpKTsKKworCQlp Z3Rfc3Bpbl9mcmVlKGk5MTUsIHNwaW5bMV0pOworCQlpZ3Rfc3Bpbl9mcmVlKGk5MTUsIHNwaW5b MF0pOworCisJCWdlbV9jb250ZXh0X2Rlc3Ryb3koaTkxNSwgY3R4KTsKKwl9CisKKwlnZW1fY2xv c2UoaTkxNSwgc2NyYXRjaCk7CisJZ2VtX3F1aWVzY2VudF9ncHUoaTkxNSk7Cit9CisKK3N0YXRp YyBpbnQgYWRkX3BtdShpbnQgcG11LCBjb25zdCBzdHJ1Y3QgaTkxNV9lbmdpbmVfY2xhc3NfaW5z dGFuY2UgKmNpKQoreworCXJldHVybiBwZXJmX2k5MTVfb3Blbl9ncm91cChJOTE1X1BNVV9FTkdJ TkVfQlVTWShjaS0+ZW5naW5lX2NsYXNzLAorCQkJCQkJCSBjaS0+ZW5naW5lX2luc3RhbmNlKSwK KwkJCQkgICAgcG11KTsKK30KKworc3RhdGljIHZvaWQgZnVsbChpbnQgaTkxNSwgdW5zaWduZWQg aW50IGZsYWdzKQorI2RlZmluZSBQVUxTRSAweDEKKyNkZWZpbmUgTEFURSAweDIKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBiYXRjaCA9IHsKKwkJLmhhbmRsZSA9IGJhdGNo X2NyZWF0ZShpOTE1KSwKKwl9OworCisJaWYgKGZsYWdzICYgTEFURSkKKwkJaWd0X3JlcXVpcmVf c3dfc3luYygpOworCisJLyoKKwkgKiBJOTE1X0NPTlRFWFRfUEFSQU1fRU5HSU5FIGNoYW5nZXMg dGhlIG1lYW5pbmcgb2YgZW5naW5lIHNlbGVjdG9yIGluCisJICogZXhlY2J1ZiB0byB1dGlsaXpl IG91ciBvd24gbWFwLCBpbnRvIHdoaWNoIHdlIHJlcGxhY2UgSTkxNV9FWEVDX0RFRkFVTFQKKwkg KiB0byBwcm92aWRlIGFuIGF1dG9tYXRpYyBzZWxlY3Rpb24gZnJvbSB0aGUgb3RoZXIgY3R4LT5l bmdpbmVbXS4gSXQKKwkgKiBlbXBsb3lzIGxvYWQtYmFsYW5jaW5nIHRvIGV2ZW5seSBkaXN0cmli dXRlIHRoZSB3b3JrbG9hZCB0aGUKKwkgKiBhcnJheS4gSWYgd2Ugc3VibWl0IE4gc3Bpbm5lcnMs IHdlIGV4cGVjdCB0aGVtIHRvIGJlIHNpbXVsdGFuZW91c2x5CisJICogcnVubmluZyBhY3Jvc3Mg TiBlbmdpbmVzIGFuZCB1c2UgUE1VIHRvIGNvbmZpcm0gdGhhdCB0aGUgZW50aXJlCisJICogc2V0 IG9mIGVuZ2luZXMgYXJlIGJ1c3kuCisJICoKKwkgKiBXZSBjb21wbGljYXRlIG1hdHRlcnMgYnkg aW50ZXJzcGVyc2luZyBzaG9ydC1saXZlZCB0YXNrcyB0bworCSAqIGNoYWxsZW5nZSB0aGUga2Vy bmVsIHRvIHNlYXJjaCBmb3Igc3BhY2UgaW4gd2hpY2ggdG8gaW5zZXJ0IG5ldworCSAqIGJhdGNo ZXMuCisJICovCisKKwlmb3IgKGludCBjbGFzcyA9IDA7IGNsYXNzIDwgMzI7IGNsYXNzKyspIHsK KwkJc3RydWN0IGk5MTVfZW5naW5lX2NsYXNzX2luc3RhbmNlICpjaTsKKwkJaWd0X3NwaW5fdCAq c3BpbiA9IE5VTEw7CisJCUlHVF9DT1JLX0ZFTkNFKGNvcmspOworCQl1bnNpZ25lZCBpbnQgY291 bnQ7CisJCWRvdWJsZSBsb2FkOworCQlpbnQgZmVuY2UgPSAtMTsKKwkJaW50ICpwbXU7CisKKwkJ Y2kgPSBsaXN0X2VuZ2luZXMoaTkxNSwgMXUgPDwgY2xhc3MsICZjb3VudCk7CisJCWlmICghY2kp CisJCQljb250aW51ZTsKKworCQlwbXUgPSBtYWxsb2Moc2l6ZW9mKCpwbXUpICogY291bnQpOwor CQlpZ3RfYXNzZXJ0KHBtdSk7CisKKwkJaWYgKGZsYWdzICYgTEFURSkKKwkJCWZlbmNlID0gaWd0 X2NvcmtfcGx1ZygmY29yaywgaTkxNSk7CisKKwkJcG11WzBdID0gLTE7CisJCWZvciAodW5zaWdu ZWQgaW50IG4gPSAwOyBuIDwgY291bnQ7IG4rKykgeworCQkJdWludDMyX3QgY3R4OworCisJCQlw bXVbbl0gPSBhZGRfcG11KHBtdVswXSwgJmNpW25dKTsKKworCQkJaWYgKGZsYWdzICYgUFVMU0Up IHsKKwkJCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGViID0geworCQkJCQkuYnVm ZmVyc19wdHIgPSB0b191c2VyX3BvaW50ZXIoJmJhdGNoKSwKKwkJCQkJLmJ1ZmZlcl9jb3VudCA9 IDEsCisJCQkJCS5yc3ZkMiA9IGZlbmNlLAorCQkJCQkuZmxhZ3MgPSBmbGFncyAmIExBVEUgPyBJ OTE1X0VYRUNfRkVOQ0VfSU4gOiAwLAorCQkJCX07CisJCQkJZ2VtX2V4ZWNidWYoaTkxNSwgJmVi KTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEVhY2ggc3Bpbm5lciBuZWVkcyB0byBiZSBvbmUgYSBu ZXcgdGltZWxpbmUsCisJCQkgKiBvdGhlcndpc2UgdGhleSB3aWxsIGp1c3Qgc2l0IGluIHRoZSBz aW5nbGUgcXVldWUKKwkJCSAqIGFuZCBub3QgcnVuIGNvbmN1cnJlbnRseS4KKwkJCSAqLworCQkJ Y3R4ID0gbG9hZF9iYWxhbmNlcl9jcmVhdGUoaTkxNSwgY2ksIGNvdW50KTsKKworCQkJaWYgKHNw aW4gPT0gTlVMTCkgeworCQkJCXNwaW4gPSBfX2lndF9zcGluX25ldyhpOTE1LCAuY3R4ID0gY3R4 KTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBlYiA9 IHsKKwkJCQkJLmJ1ZmZlcnNfcHRyID0gc3Bpbi0+ZXhlY2J1Zi5idWZmZXJzX3B0ciwKKwkJCQkJ LmJ1ZmZlcl9jb3VudCA9IHNwaW4tPmV4ZWNidWYuYnVmZmVyX2NvdW50LAorCQkJCQkucnN2ZDEg PSBjdHgsCisJCQkJCS5yc3ZkMiA9IGZlbmNlLAorCQkJCQkuZmxhZ3MgPSBmbGFncyAmIExBVEUg PyBJOTE1X0VYRUNfRkVOQ0VfSU4gOiAwLAorCQkJCX07CisJCQkJZ2VtX2V4ZWNidWYoaTkxNSwg JmViKTsKKwkJCX0KKworCQkJZ2VtX2NvbnRleHRfZGVzdHJveShpOTE1LCBjdHgpOworCQl9CisK KwkJaWYgKGZsYWdzICYgTEFURSkgeworCQkJaWd0X2NvcmtfdW5wbHVnKCZjb3JrKTsKKwkJCWNs b3NlKGZlbmNlKTsKKwkJfQorCisJCWxvYWQgPSBtZWFzdXJlX21pbl9sb2FkKHBtdVswXSwgY291 bnQsIDEwMDAwKTsKKwkJaWd0X3NwaW5fZnJlZShpOTE1LCBzcGluKTsKKworCQljbG9zZShwbXVb MF0pOworCQlmcmVlKHBtdSk7CisKKwkJZnJlZShjaSk7CisKKwkJaWd0X2Fzc2VydF9mKGxvYWQg PiAwLjkwLAorCQkJICAgICAibWluaW11bSBsb2FkIGZvciAlZCB4IGNsYXNzOiVkIHdhcyBmb3Vu ZCB0byBiZSBvbmx5ICUuMWYlJSBidXN5XG4iLAorCQkJICAgICBjb3VudCwgY2xhc3MsIGxvYWQq MTAwKTsKKwkJZ2VtX3F1aWVzY2VudF9ncHUoaTkxNSk7CisJfQorCisJZ2VtX2Nsb3NlKGk5MTUs IGJhdGNoLmhhbmRsZSk7CisJZ2VtX3F1aWVzY2VudF9ncHUoaTkxNSk7Cit9CisKK3N0YXRpYyBj b25zdCBjaGFyICpjbGFzc190b19zdHIoaW50IGNsYXNzKQoreworCWNvbnN0IGNoYXIgKnN0cltd ID0geworCQlbSTkxNV9FTkdJTkVfQ0xBU1NfUkVOREVSXSA9ICJyY3MiLAorCQlbSTkxNV9FTkdJ TkVfQ0xBU1NfQ09QWV0gPSAiYmNzIiwKKwkJW0k5MTVfRU5HSU5FX0NMQVNTX1ZJREVPXSA9ICJ2 Y3MiLAorCQlbSTkxNV9FTkdJTkVfQ0xBU1NfVklERU9fRU5IQU5DRV0gPSAidmVjcyIsCisJfTsK KworCWlmIChjbGFzcyA8IEFSUkFZX1NJWkUoc3RyKSkKKwkJcmV0dXJuIHN0cltjbGFzc107CisK KwlyZXR1cm4gInVuayI7Cit9CisKK3N0YXRpYyB2b2lkIG5vcChpbnQgaTkxNSkKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBiYXRjaCA9IHsKKwkJLmhhbmRsZSA9IGJhdGNo X2NyZWF0ZShpOTE1KSwKKwl9OworCisJZm9yIChpbnQgY2xhc3MgPSAwOyBjbGFzcyA8IDMyOyBj bGFzcysrKSB7CisJCXN0cnVjdCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSAqY2k7CisJCXVu c2lnbmVkIGludCBjb3VudDsKKwkJdWludDMyX3QgY3R4OworCisJCWNpID0gbGlzdF9lbmdpbmVz KGk5MTUsIDF1IDw8IGNsYXNzLCAmY291bnQpOworCQlpZiAoIWNpKQorCQkJY29udGludWU7CisK KwkJY3R4ID0gbG9hZF9iYWxhbmNlcl9jcmVhdGUoaTkxNSwgY2ksIGNvdW50KTsKKworCQlmb3Ig KGludCBuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKKwkJCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhl Y2J1ZmZlcjIgZXhlY2J1ZiA9IHsKKwkJCQkuYnVmZmVyc19wdHIgPSB0b191c2VyX3BvaW50ZXIo JmJhdGNoKSwKKwkJCQkuYnVmZmVyX2NvdW50ID0gMSwKKwkJCQkuZmxhZ3MgPSBuICsgMSwKKwkJ CQkucnN2ZDEgPSBjdHgsCisJCQl9OworCQkJc3RydWN0IHRpbWVzcGVjIHR2ID0ge307CisJCQl1 bnNpZ25lZCBsb25nIG5vcHM7CisJCQlkb3VibGUgdDsKKworCQkJaWd0X25zZWNfZWxhcHNlZCgm dHYpOworCQkJbm9wcyA9IDA7CisJCQlkbyB7CisJCQkJZm9yIChpbnQgciA9IDA7IHIgPCAxMDI0 OyByKyspCisJCQkJCWdlbV9leGVjYnVmKGk5MTUsICZleGVjYnVmKTsKKwkJCQlub3BzICs9IDEw MjQ7CisJCQl9IHdoaWxlIChpZ3Rfc2Vjb25kc19lbGFwc2VkKCZ0dikgPCAyKTsKKwkJCWdlbV9z eW5jKGk5MTUsIGJhdGNoLmhhbmRsZSk7CisKKwkJCXQgPSBpZ3RfbnNlY19lbGFwc2VkKCZ0dikg KiAxZS0zIC8gbm9wczsKKwkJCWlndF9pbmZvKCIlczolZCAlLjNmdXNcbiIsIGNsYXNzX3RvX3N0 cihjbGFzcyksIG4sIHQpOworCQl9CisKKwkJeworCQkJc3RydWN0IGRybV9pOTE1X2dlbV9leGVj YnVmZmVyMiBleGVjYnVmID0geworCQkJCS5idWZmZXJzX3B0ciA9IHRvX3VzZXJfcG9pbnRlcigm YmF0Y2gpLAorCQkJCS5idWZmZXJfY291bnQgPSAxLAorCQkJCS5yc3ZkMSA9IGN0eCwKKwkJCX07 CisJCQlzdHJ1Y3QgdGltZXNwZWMgdHYgPSB7fTsKKwkJCXVuc2lnbmVkIGxvbmcgbm9wczsKKwkJ CWRvdWJsZSB0OworCisJCQlpZ3RfbnNlY19lbGFwc2VkKCZ0dik7CisJCQlub3BzID0gMDsKKwkJ CWRvIHsKKwkJCQlmb3IgKGludCByID0gMDsgciA8IDEwMjQ7IHIrKykKKwkJCQkJZ2VtX2V4ZWNi dWYoaTkxNSwgJmV4ZWNidWYpOworCQkJCW5vcHMgKz0gMTAyNDsKKwkJCX0gd2hpbGUgKGlndF9z ZWNvbmRzX2VsYXBzZWQoJnR2KSA8IDIpOworCQkJZ2VtX3N5bmMoaTkxNSwgYmF0Y2guaGFuZGxl KTsKKworCQkJdCA9IGlndF9uc2VjX2VsYXBzZWQoJnR2KSAqIDFlLTMgLyBub3BzOworCQkJaWd0 X2luZm8oIiVzOiogJS4zZnVzXG4iLCBjbGFzc190b19zdHIoY2xhc3MpLCB0KTsKKwkJfQorCisK KwkJaWd0X2ZvcmsoY2hpbGQsIGNvdW50KSB7CisJCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNi dWZmZXIyIGV4ZWNidWYgPSB7CisJCQkJLmJ1ZmZlcnNfcHRyID0gdG9fdXNlcl9wb2ludGVyKCZi YXRjaCksCisJCQkJLmJ1ZmZlcl9jb3VudCA9IDEsCisJCQkJLmZsYWdzID0gY2hpbGQgKyAxLAor CQkJCS5yc3ZkMSA9IGdlbV9jb250ZXh0X2Nsb25lKGk5MTUsIGN0eCwKKwkJCQkJCQkgICBJOTE1 X0NPTlRFWFRfQ0xPTkVfRU5HSU5FUywgMCksCisJCQl9OworCQkJc3RydWN0IHRpbWVzcGVjIHR2 ID0ge307CisJCQl1bnNpZ25lZCBsb25nIG5vcHM7CisJCQlkb3VibGUgdDsKKworCQkJaWd0X25z ZWNfZWxhcHNlZCgmdHYpOworCQkJbm9wcyA9IDA7CisJCQlkbyB7CisJCQkJZm9yIChpbnQgciA9 IDA7IHIgPCAxMDI0OyByKyspCisJCQkJCWdlbV9leGVjYnVmKGk5MTUsICZleGVjYnVmKTsKKwkJ CQlub3BzICs9IDEwMjQ7CisJCQl9IHdoaWxlIChpZ3Rfc2Vjb25kc19lbGFwc2VkKCZ0dikgPCAy KTsKKwkJCWdlbV9zeW5jKGk5MTUsIGJhdGNoLmhhbmRsZSk7CisKKwkJCXQgPSBpZ3RfbnNlY19l bGFwc2VkKCZ0dikgKiAxZS0zIC8gbm9wczsKKwkJCWlndF9pbmZvKCJbJWRdICVzOiVkICUuM2Z1 c1xuIiwKKwkJCQkgY2hpbGQsIGNsYXNzX3RvX3N0cihjbGFzcyksIGNoaWxkLCB0KTsKKworCQkJ bWVtc2V0KCZ0diwgMCwgc2l6ZW9mKHR2KSk7CisJCQlleGVjYnVmLmZsYWdzID0gMDsKKworCQkJ aWd0X25zZWNfZWxhcHNlZCgmdHYpOworCQkJbm9wcyA9IDA7CisJCQlkbyB7CisJCQkJZm9yIChp bnQgciA9IDA7IHIgPCAxMDI0OyByKyspCisJCQkJCWdlbV9leGVjYnVmKGk5MTUsICZleGVjYnVm KTsKKwkJCQlub3BzICs9IDEwMjQ7CisJCQl9IHdoaWxlIChpZ3Rfc2Vjb25kc19lbGFwc2VkKCZ0 dikgPCAyKTsKKwkJCWdlbV9zeW5jKGk5MTUsIGJhdGNoLmhhbmRsZSk7CisKKwkJCXQgPSBpZ3Rf bnNlY19lbGFwc2VkKCZ0dikgKiAxZS0zIC8gbm9wczsKKwkJCWlndF9pbmZvKCJbJWRdICVzOiog JS4zZnVzXG4iLAorCQkJCSBjaGlsZCwgY2xhc3NfdG9fc3RyKGNsYXNzKSwgdCk7CisKKwkJCWdl bV9jb250ZXh0X2Rlc3Ryb3koaTkxNSwgZXhlY2J1Zi5yc3ZkMSk7CisJCX0KKworCQlpZ3Rfd2Fp dGNoaWxkcmVuKCk7CisKKwkJZ2VtX2NvbnRleHRfZGVzdHJveShpOTE1LCBjdHgpOworCQlmcmVl KGNpKTsKKwl9CisKKwlnZW1fY2xvc2UoaTkxNSwgYmF0Y2guaGFuZGxlKTsKKwlnZW1fcXVpZXNj ZW50X2dwdShpOTE1KTsKK30KKworc3RhdGljIHZvaWQgcGluZyhpbnQgaTkxNSwgdWludDMyX3Qg Y3R4LCB1bnNpZ25lZCBpbnQgZW5naW5lKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19v YmplY3QyIG9iaiA9IHsKKwkJLmhhbmRsZSA9IGJhdGNoX2NyZWF0ZShpOTE1KSwKKwl9OworCXN0 cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgZXhlY2J1ZiA9IHsKKwkJLmJ1ZmZlcnNfcHRy ID0gdG9fdXNlcl9wb2ludGVyKCZvYmopLAorCQkuYnVmZmVyX2NvdW50ID0gMSwKKwkJLmZsYWdz ID0gZW5naW5lLAorCQkucnN2ZDEgPSBjdHgsCisJfTsKKwlnZW1fZXhlY2J1ZihpOTE1LCAmZXhl Y2J1Zik7CisJZ2VtX3N5bmMoaTkxNSwgb2JqLmhhbmRsZSk7CisJZ2VtX2Nsb3NlKGk5MTUsIG9i ai5oYW5kbGUpOworfQorCitzdGF0aWMgdm9pZCBzZW1hcGhvcmUoaW50IGk5MTUpCit7CisJdWlu dDMyX3QgYmxvY2tbMl0sIHNjcmF0Y2g7CisJaWd0X3NwaW5fdCAqc3BpblszXTsKKworCS8qCisJ ICogSWYgd2UgYXJlIHVzaW5nIEhXIHNlbWFwaG9yZXMgdG8gbGF1bmNoIHNlcmlhbGlzZWQgcmVx dWVzdHMKKwkgKiBvbiBkaWZmZXJlbnQgZW5naW5lIGNvbmN1cnJlbnRseSwgd2Ugd2FudCB0byB2 ZXJpZnkgdGhhdCByZWFsCisJICogd29yayBpcyB1bmltcGVkZWQuCisJICovCisJaWd0X3JlcXVp cmUoZ2VtX3NjaGVkdWxlcl9oYXNfcHJlZW1wdGlvbihpOTE1KSk7CisKKwlibG9ja1swXSA9IGdl bV9jb250ZXh0X2NyZWF0ZShpOTE1KTsKKwlibG9ja1sxXSA9IGdlbV9jb250ZXh0X2NyZWF0ZShp OTE1KTsKKworCXNjcmF0Y2ggPSBnZW1fY3JlYXRlKGk5MTUsIDQwOTYpOworCXNwaW5bMl0gPSBp Z3Rfc3Bpbl9uZXcoaTkxNSwgLmRlcGVuZGVuY3kgPSBzY3JhdGNoKTsKKwlmb3IgKGludCBjbGFz cyA9IDE7IGNsYXNzIDwgMzI7IGNsYXNzKyspIHsKKwkJc3RydWN0IGk5MTVfZW5naW5lX2NsYXNz X2luc3RhbmNlICpjaTsKKwkJdW5zaWduZWQgaW50IGNvdW50OworCQl1aW50MzJfdCB2aXA7CisK KwkJY2kgPSBsaXN0X2VuZ2luZXMoaTkxNSwgMXUgPDwgY2xhc3MsICZjb3VudCk7CisJCWlmICgh Y2kpCisJCQljb250aW51ZTsKKworCQlpZiAoY291bnQgPCBBUlJBWV9TSVpFKGJsb2NrKSkKKwkJ CWNvbnRpbnVlOworCisJCS8qIEVuc3VyZSB0aGF0IHdlIGNvbXBsZXRlbHkgb2NjdXB5IGFsbCBl bmdpbmVzIGluIHRoaXMgZ3JvdXAgKi8KKwkJY291bnQgPSBBUlJBWV9TSVpFKGJsb2NrKTsKKwor CQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCXNldF9sb2FkX2JhbGFuY2Vy KGk5MTUsIGJsb2NrW2ldLCBjaSwgY291bnQpOworCQkJc3BpbltpXSA9IF9faWd0X3NwaW5fbmV3 KGk5MTUsCisJCQkJCQkgLmN0eCA9IGJsb2NrW2ldLAorCQkJCQkJIC5kZXBlbmRlbmN5ID0gc2Ny YXRjaCk7CisJCX0KKworCQkvKgorCQkgKiBFaXRoZXIgd2UgaGF2ZW4ndCBibG9ja2VkIGJvdGgg ZW5naW5lcyB3aXRoIHNlbWFwaG9yZXMsCisJCSAqIG9yIHdlIGxldCB0aGUgdmlwIHRocm91Z2gu IElmIG5vdCwgd2UgaGFuZy4KKwkJICovCisJCXZpcCA9IGdlbV9jb250ZXh0X2NyZWF0ZShpOTE1 KTsKKwkJc2V0X2xvYWRfYmFsYW5jZXIoaTkxNSwgdmlwLCBjaSwgY291bnQpOworCQlwaW5nKGk5 MTUsIHZpcCwgMCk7CisJCWdlbV9jb250ZXh0X2Rlc3Ryb3koaTkxNSwgdmlwKTsKKworCQlmb3Ig KGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQlpZ3Rfc3Bpbl9mcmVlKGk5MTUsIHNwaW5b aV0pOworCisJCWZyZWUoY2kpOworCX0KKwlpZ3Rfc3Bpbl9mcmVlKGk5MTUsIHNwaW5bMl0pOwor CWdlbV9jbG9zZShpOTE1LCBzY3JhdGNoKTsKKworCWdlbV9jb250ZXh0X2Rlc3Ryb3koaTkxNSwg YmxvY2tbMV0pOworCWdlbV9jb250ZXh0X2Rlc3Ryb3koaTkxNSwgYmxvY2tbMF0pOworCisJZ2Vt X3F1aWVzY2VudF9ncHUoaTkxNSk7Cit9CisKK3N0YXRpYyB2b2lkIHNtb2tldGVzdChpbnQgaTkx NSwgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgYmF0 Y2hbMl0gPSB7CisJCXsgLmhhbmRsZSA9IF9fYmF0Y2hfY3JlYXRlKGk5MTUsIDE2MzgwKSB9CisJ fTsKKwl1bnNpZ25lZCBpbnQgbmNvbnRleHQgPSAwOworCXVpbnQzMl90ICpjb250ZXh0cyA9IE5V TEw7CisJdWludDMyX3QgKmhhbmRsZXMgPSBOVUxMOworCisJaWd0X3JlcXVpcmVfc3dfc3luYygp OworCisJZm9yIChpbnQgY2xhc3MgPSAwOyBjbGFzcyA8IDMyOyBjbGFzcysrKSB7CisJCXN0cnVj dCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSAqY2k7CisJCXVuc2lnbmVkIGludCBjb3VudCA9 IDA7CisKKwkJY2kgPSBsaXN0X2VuZ2luZXMoaTkxNSwgMXUgPDwgY2xhc3MsICZjb3VudCk7CisJ CWlmICghY2kgfHwgY291bnQgPCAyKSB7CisJCQlmcmVlKGNpKTsKKwkJCWNvbnRpbnVlOworCQl9 CisKKwkJbmNvbnRleHQgKz0gMTI4OworCQljb250ZXh0cyA9IHJlYWxsb2MoY29udGV4dHMsIHNp emVvZigqY29udGV4dHMpICogbmNvbnRleHQpOworCQlpZ3RfYXNzZXJ0KGNvbnRleHRzKTsKKwor CQlmb3IgKHVuc2lnbmVkIGludCBuID0gbmNvbnRleHQgLSAxMjg7IG4gPCBuY29udGV4dDsgbisr KSB7CisJCQljb250ZXh0c1tuXSA9IGxvYWRfYmFsYW5jZXJfY3JlYXRlKGk5MTUsIGNpLCBjb3Vu dCk7CisJCQlpZ3RfYXNzZXJ0KGNvbnRleHRzW25dKTsKKwkJfQorCisJCWZyZWUoY2kpOworCX0K KwlpZ3RfZGVidWcoIkNyZWF0ZWQgJWQgdmlydHVhbCBlbmdpbmVzIChvbmUgcGVyIGNvbnRleHQp XG4iLCBuY29udGV4dCk7CisJaWd0X3JlcXVpcmUobmNvbnRleHQpOworCisJY29udGV4dHMgPSBy ZWFsbG9jKGNvbnRleHRzLCBzaXplb2YoKmNvbnRleHRzKSAqIG5jb250ZXh0ICogNCk7CisJaWd0 X2Fzc2VydChjb250ZXh0cyk7CisJbWVtY3B5KGNvbnRleHRzICsgbmNvbnRleHQsIGNvbnRleHRz LCBuY29udGV4dCAqIHNpemVvZigqY29udGV4dHMpKTsKKwluY29udGV4dCAqPSAyOworCW1lbWNw eShjb250ZXh0cyArIG5jb250ZXh0LCBjb250ZXh0cywgbmNvbnRleHQgKiBzaXplb2YoKmNvbnRl eHRzKSk7CisJbmNvbnRleHQgKj0gMjsKKworCWhhbmRsZXMgPSBtYWxsb2Moc2l6ZW9mKCpoYW5k bGVzKSAqIG5jb250ZXh0KTsKKwlpZ3RfYXNzZXJ0KGhhbmRsZXMpOworCWZvciAodW5zaWduZWQg aW50IG4gPSAwOyBuIDwgbmNvbnRleHQ7IG4rKykKKwkJaGFuZGxlc1tuXSA9IGdlbV9jcmVhdGUo aTkxNSwgNDA5Nik7CisKKwlpZ3RfdW50aWxfdGltZW91dCh0aW1lb3V0KSB7CisJCXVuc2lnbmVk IGludCBjb3VudCA9IDEgKyAocmFuZCgpICUgKG5jb250ZXh0IC0gMSkpOworCQlJR1RfQ09SS19G RU5DRShjb3JrKTsKKwkJaW50IGZlbmNlID0gaWd0X2NvcmtfcGx1ZygmY29yaywgaTkxNSk7CisK KwkJZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCBjb3VudDsgbisrKSB7CisJCQlzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGViID0geworCQkJCS5idWZmZXJzX3B0ciA9IHRvX3Vz ZXJfcG9pbnRlcihiYXRjaCksCisJCQkJLmJ1ZmZlcl9jb3VudCA9IEFSUkFZX1NJWkUoYmF0Y2gp LAorCQkJCS5yc3ZkMSA9IGNvbnRleHRzW25dLAorCQkJCS5yc3ZkMiA9IGZlbmNlLAorCQkJCS5m bGFncyA9IEk5MTVfRVhFQ19CQVRDSF9GSVJTVCB8IEk5MTVfRVhFQ19GRU5DRV9JTiwKKwkJCX07 CisJCQliYXRjaFsxXS5oYW5kbGUgPSBoYW5kbGVzW25dOworCQkJZ2VtX2V4ZWNidWYoaTkxNSwg JmViKTsKKwkJfQorCQlpZ3RfcGVybXV0ZV9hcnJheShoYW5kbGVzLCBjb3VudCwgaWd0X2V4Y2hh bmdlX2ludCk7CisKKwkJaWd0X2NvcmtfdW5wbHVnKCZjb3JrKTsKKwkJZm9yICh1bnNpZ25lZCBp bnQgbiA9IDA7IG4gPCBjb3VudDsgbisrKQorCQkJZ2VtX3N5bmMoaTkxNSwgaGFuZGxlc1tuXSk7 CisKKwkJY2xvc2UoZmVuY2UpOworCX0KKworCWZvciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwg bmNvbnRleHQ7IG4rKykgeworCQlnZW1fY2xvc2UoaTkxNSwgaGFuZGxlc1tuXSk7CisJCV9fZ2Vt X2NvbnRleHRfZGVzdHJveShpOTE1LCBjb250ZXh0c1tuXSk7CisJfQorCWZyZWUoaGFuZGxlcyk7 CisJZnJlZShjb250ZXh0cyk7CisJZ2VtX2Nsb3NlKGk5MTUsIGJhdGNoWzBdLmhhbmRsZSk7Cit9 CisKK3N0YXRpYyBib29sIGhhc19jb250ZXh0X2VuZ2luZXMoaW50IGk5MTUpCit7CisJc3RydWN0 IGRybV9pOTE1X2dlbV9jb250ZXh0X3BhcmFtIHAgPSB7CisJCS5wYXJhbSA9IEk5MTVfQ09OVEVY VF9QQVJBTV9FTkdJTkVTLAorCX07CisKKwlyZXR1cm4gX19nZW1fY29udGV4dF9zZXRfcGFyYW0o aTkxNSwgJnApID09IDA7Cit9CisKK3N0YXRpYyBib29sIGhhc19sb2FkX2JhbGFuY2VyKGludCBp OTE1KQoreworCXN0cnVjdCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSBjaSA9IHt9OworCXVp bnQzMl90IGN0eDsKKwlpbnQgZXJyOworCisJY3R4ID0gZ2VtX2NvbnRleHRfY3JlYXRlKGk5MTUp OworCWVyciA9IF9fc2V0X2xvYWRfYmFsYW5jZXIoaTkxNSwgY3R4LCAmY2ksIDEpOworCWdlbV9j b250ZXh0X2Rlc3Ryb3koaTkxNSwgY3R4KTsKKworCXJldHVybiBlcnIgPT0gMDsKK30KKworaWd0 X21haW4KK3sKKwlpbnQgaTkxNSA9IC0xOworCisJaWd0X3NraXBfb25fc2ltdWxhdGlvbigpOwor CisJaWd0X2ZpeHR1cmUgeworCQlpOTE1ID0gZHJtX29wZW5fZHJpdmVyKERSSVZFUl9JTlRFTCk7 CisJCWlndF9yZXF1aXJlX2dlbShpOTE1KTsKKworCQlnZW1fcmVxdWlyZV9jb250ZXh0cyhpOTE1 KTsKKwkJaWd0X3JlcXVpcmUoaGFzX2NvbnRleHRfZW5naW5lcyhpOTE1KSk7CisJCWlndF9yZXF1 aXJlKGhhc19sb2FkX2JhbGFuY2VyKGk5MTUpKTsKKworCQlpZ3RfZm9ya19oYW5nX2RldGVjdG9y KGk5MTUpOworCX0KKworCWlndF9zdWJ0ZXN0KCJpbnZhbGlkLWJhbGFuY2VyIikKKwkJaW52YWxp ZF9iYWxhbmNlcihpOTE1KTsKKworCWlndF9zdWJ0ZXN0KCJpbmRpdmlkdWFsIikKKwkJaW5kaXZp ZHVhbChpOTE1KTsKKworCWlndF9zdWJ0ZXN0KCJpbmRpY2VzIikKKwkJaW5kaWNlcyhpOTE1KTsK KworCWlndF9zdWJ0ZXN0KCJidXN5IikKKwkJYnVzeShpOTE1KTsKKworCWlndF9zdWJ0ZXN0X2dy b3VwIHsKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCQljb25zdCBjaGFyICpuYW1lOworCQkJ dW5zaWduZWQgaW50IGZsYWdzOworCQl9IHBoYXNlc1tdID0geworCQkJeyAiIiwgMCB9LAorCQkJ eyAiLXB1bHNlIiwgUFVMU0UgfSwKKwkJCXsgIi1sYXRlIiwgTEFURSB9LAorCQkJeyAiLWxhdGUt cHVsc2UiLCBQVUxTRSB8IExBVEUgfSwKKwkJCXsgfQorCQl9OworCQlmb3IgKHR5cGVvZigqcGhh c2VzKSAqcCA9IHBoYXNlczsgcC0+bmFtZTsgcCsrKQorCQkJaWd0X3N1YnRlc3RfZigiZnVsbCVz IiwgcC0+bmFtZSkKKwkJCQlmdWxsKGk5MTUsIHAtPmZsYWdzKTsKKwl9CisKKwlpZ3Rfc3VidGVz dCgibm9wIikKKwkJbm9wKGk5MTUpOworCisJaWd0X3N1YnRlc3QoInNlbWFwaG9yZSIpCisJCXNl bWFwaG9yZShpOTE1KTsKKworCWlndF9zdWJ0ZXN0KCJzbW9rZSIpCisJCXNtb2tldGVzdChpOTE1 LCAyMCk7CisKKwlpZ3RfZml4dHVyZSB7CisJCWlndF9zdG9wX2hhbmdfZGV0ZWN0b3IoKTsKKwl9 Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZXNvbi5idWlsZCBiL3Rlc3RzL21lc29uLmJ1aWxkCmlu ZGV4IGI3ZTU2MTAzZC4uMjAzNjZiNjhiIDEwMDY0NAotLS0gYS90ZXN0cy9tZXNvbi5idWlsZAor KysgYi90ZXN0cy9tZXNvbi5idWlsZApAQCAtMjkzLDYgKzI5MywxMyBAQCB0ZXN0X2V4ZWN1dGFi bGVzICs9IGV4ZWN1dGFibGUoJ2dlbV9laW8nLAogCSAgIGluc3RhbGwgOiB0cnVlKQogdGVzdF9s aXN0ICs9ICdnZW1fZWlvJwogCit0ZXN0X2V4ZWN1dGFibGVzICs9IGV4ZWN1dGFibGUoJ2dlbV9l eGVjX2JhbGFuY2VyJywgJ2k5MTUvZ2VtX2V4ZWNfYmFsYW5jZXIuYycsCisJICAgZGVwZW5kZW5j aWVzIDogdGVzdF9kZXBzICsgWyBsaWJfaWd0X3BlcmYgXSwKKwkgICBpbnN0YWxsX2RpciA6IGxp YmV4ZWNkaXIsCisJICAgaW5zdGFsbF9ycGF0aCA6IGxpYmV4ZWNkaXJfcnBhdGhkaXIsCisJICAg aW5zdGFsbCA6IHRydWUpCit0ZXN0X3Byb2dzICs9ICdnZW1fZXhlY19iYWxhbmNlcicKKwogdGVz dF9leGVjdXRhYmxlcyArPSBleGVjdXRhYmxlKCdnZW1fbW9jc19zZXR0aW5ncycsCiAJICAgam9p bl9wYXRocygnaTkxNScsICdnZW1fbW9jc19zZXR0aW5ncy5jJyksCiAJICAgZGVwZW5kZW5jaWVz IDogdGVzdF9kZXBzICsgWyBsaWJfaWd0X3BlcmYgXSwKLS0gCjIuMjAuMQoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlz dApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0 b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Chris Wilson Date: Wed, 22 May 2019 12:37:09 +0100 Message-Id: <20190522113712.23512-9-chris@chris-wilson.co.uk> In-Reply-To: <20190522113712.23512-1-chris@chris-wilson.co.uk> References: <20190522113712.23512-1-chris@chris-wilson.co.uk> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t 09/12] i915: Add gem_exec_balancer 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: intel-gfx@lists.freedesktop.org Cc: igt-dev@lists.freedesktop.org List-ID: RXhlcmNpc2UgdGhlIGluLWtlcm5lbCBsb2FkIGJhbGFuY2VyIGNoZWNraW5nIHRoYXQgd2UgY2Fu IGRpc3RyaWJ1dGUKYmF0Y2hlcyBhY3Jvc3MgdGhlIHNldCBvZiBjdHgtPmVuZ2luZXMgdG8gYXZv aWQgbG9hZC4KCnYyOiBNYW55IGFzc29ydGVkIGltcHJvdmVtZW50cyBmcm9tIFR2cnRrby4KClNp Z25lZC1vZmYtYnk6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgotLS0K IHRlc3RzL01ha2VmaWxlLmFtICAgICAgICAgICAgICB8ICAgIDEgKwogdGVzdHMvTWFrZWZpbGUu c291cmNlcyAgICAgICAgIHwgICAgMSArCiB0ZXN0cy9pOTE1L2dlbV9leGVjX2JhbGFuY2VyLmMg fCAxMDUyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiB0ZXN0cy9tZXNvbi5idWls ZCAgICAgICAgICAgICAgfCAgICA3ICsKIDQgZmlsZXMgY2hhbmdlZCwgMTA2MSBpbnNlcnRpb25z KCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgdGVzdHMvaTkxNS9nZW1fZXhlY19iYWxhbmNlci5jCgpk aWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuYW0gYi90ZXN0cy9NYWtlZmlsZS5hbQppbmRleCA1 MDk3ZGViZjYuLmM2YWYwYWVhZiAxMDA2NDQKLS0tIGEvdGVzdHMvTWFrZWZpbGUuYW0KKysrIGIv dGVzdHMvTWFrZWZpbGUuYW0KQEAgLTk2LDYgKzk2LDcgQEAgZ2VtX2Nsb3NlX3JhY2VfTERBREQg PSAkKExEQUREKSAtbHB0aHJlYWQKIGdlbV9jdHhfdGhyYXNoX0NGTEFHUyA9ICQoQU1fQ0ZMQUdT KSAkKFRIUkVBRF9DRkxBR1MpCiBnZW1fY3R4X3RocmFzaF9MREFERCA9ICQoTERBREQpIC1scHRo cmVhZAogZ2VtX2N0eF9zc2V1X0xEQUREID0gJChMREFERCkgJCh0b3BfYnVpbGRkaXIpL2xpYi9s aWJpZ3RfcGVyZi5sYQoraTkxNV9nZW1fZXhlY19iYWxhbmNlcl9MREFERCA9ICQoTERBREQpICQo dG9wX2J1aWxkZGlyKS9saWIvbGliaWd0X3BlcmYubGEKIGdlbV9leGVjX2NhcHR1cmVfTERBREQg PSAkKExEQUREKSAtbHoKIGdlbV9leGVjX3BhcmFsbGVsX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAk KFRIUkVBRF9DRkxBR1MpCiBnZW1fZXhlY19wYXJhbGxlbF9MREFERCA9ICQoTERBREQpIC1scHRo cmVhZApkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuc291cmNlcyBiL3Rlc3RzL01ha2VmaWxl LnNvdXJjZXMKaW5kZXggMmVmNjg5MDIzLi4xN2ZjYTZkNzcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL01h a2VmaWxlLnNvdXJjZXMKKysrIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwpAQCAtMjQsNiArMjQs NyBAQCBURVNUU19wcm9ncyA9IFwKIAlpOTE1L2dlbV9jdHhfY2xvbmUgXAogCWk5MTUvZ2VtX2N0 eF9lbmdpbmVzIFwKIAlpOTE1L2dlbV9jdHhfc2hhcmVkIFwKKwlpOTE1L2dlbV9leGVjX2JhbGFu Y2VyIFwKIAlpOTE1L2dlbV92bV9jcmVhdGUgXAogCWttc18zZCBcCiAJa21zX2FkZGZiX2Jhc2lj IFwKZGlmZiAtLWdpdCBhL3Rlc3RzL2k5MTUvZ2VtX2V4ZWNfYmFsYW5jZXIuYyBiL3Rlc3RzL2k5 MTUvZ2VtX2V4ZWNfYmFsYW5jZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAuLjQwYTI3MTljMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2k5MTUvZ2VtX2V4ZWNfYmFs YW5jZXIuYwpAQCAtMCwwICsxLDEwNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxOC0yMDE5 IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwg ZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhp cyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3 YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBp bmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwg bW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9v ciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3 aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRo ZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGlj ZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJh Z3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9y dGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklE RUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICog SU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBN RVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQg Tk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENP UFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVS CisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9S IE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lU SCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhFIFNP RlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxzY2hlZC5oPgorCisjaW5jbHVkZSAiaWd0LmgiCisj aW5jbHVkZSAiaWd0X3BlcmYuaCIKKyNpbmNsdWRlICJpOTE1L2dlbV9yaW5nLmgiCisjaW5jbHVk ZSAic3dfc3luYy5oIgorCitJR1RfVEVTVF9ERVNDUklQVElPTigiRXhlcmNpc2UgaW4ta2VybmVs IGxvYWQtYmFsYW5jaW5nIik7CisKKyNkZWZpbmUgSU5TVEFOQ0VfQ09VTlQgKDEgPDwgSTkxNV9Q TVVfU0FNUExFX0lOU1RBTkNFX0JJVFMpCisKK3N0YXRpYyBib29sIGhhc19jbGFzc19pbnN0YW5j ZShpbnQgaTkxNSwgdWludDE2X3QgY2xhc3MsIHVpbnQxNl90IGluc3RhbmNlKQoreworCWludCBm ZDsKKworCWZkID0gcGVyZl9pOTE1X29wZW4oSTkxNV9QTVVfRU5HSU5FX0JVU1koY2xhc3MsIGlu c3RhbmNlKSk7CisJaWYgKGZkICE9IC0xKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIHRydWU7 CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgc3RydWN0IGk5MTVfZW5naW5lX2Ns YXNzX2luc3RhbmNlICoKK2xpc3RfZW5naW5lcyhpbnQgaTkxNSwgdWludDMyX3QgY2xhc3NfbWFz aywgdW5zaWduZWQgaW50ICpvdXQpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMCwgc2l6ZSA9 IDY0OworCXN0cnVjdCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSAqZW5naW5lczsKKworCWVu Z2luZXMgPSBtYWxsb2Moc2l6ZSAqIHNpemVvZigqZW5naW5lcykpOworCWlmICghZW5naW5lcykg eworCQkqb3V0ID0gMDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZm9yIChlbnVtIGRybV9pOTE1 X2dlbV9lbmdpbmVfY2xhc3MgY2xhc3MgPSBJOTE1X0VOR0lORV9DTEFTU19SRU5ERVI7CisJICAg ICBjbGFzc19tYXNrOworCSAgICAgY2xhc3MrKywgY2xhc3NfbWFzayA+Pj0gMSkgeworCQlpZiAo IShjbGFzc19tYXNrICYgMSkpCisJCQljb250aW51ZTsKKworCQlmb3IgKHVuc2lnbmVkIGludCBp bnN0YW5jZSA9IDA7CisJCSAgICAgaW5zdGFuY2UgPCBJTlNUQU5DRV9DT1VOVDsKKwkJICAgICBp bnN0YW5jZSsrKSB7CisJCQlpZiAoIWhhc19jbGFzc19pbnN0YW5jZShpOTE1LCBjbGFzcywgaW5z dGFuY2UpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoY291bnQgPT0gc2l6ZSkgeworCQkJCXN0 cnVjdCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSAqZTsKKworCQkJCXNpemUgKj0gMjsKKwkJ CQllID0gcmVhbGxvYyhlbmdpbmVzLCBzaXplKnNpemVvZigqZW5naW5lcykpOworCQkJCWlmICgh ZSkgeworCQkJCQkqb3V0ID0gY291bnQ7CisJCQkJCXJldHVybiBlbmdpbmVzOworCQkJCX0KKwor CQkJCWVuZ2luZXMgPSBlOworCQkJfQorCisJCQllbmdpbmVzW2NvdW50KytdID0gKHN0cnVjdCBp OTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSl7CisJCQkJLmVuZ2luZV9jbGFzcyA9IGNsYXNzLAor CQkJCQkuZW5naW5lX2luc3RhbmNlID0gaW5zdGFuY2UsCisJCQl9OworCQl9CisJfQorCisJaWYg KCFjb3VudCkgeworCQlmcmVlKGVuZ2luZXMpOworCQllbmdpbmVzID0gTlVMTDsKKwl9CisKKwkq b3V0ID0gY291bnQ7CisJcmV0dXJuIGVuZ2luZXM7Cit9CisKK3N0YXRpYyBpbnQgX19zZXRfbG9h ZF9iYWxhbmNlcihpbnQgaTkxNSwgdWludDMyX3QgY3R4LAorCQkJICAgICAgIGNvbnN0IHN0cnVj dCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSAqY2ksCisJCQkgICAgICAgdW5zaWduZWQgaW50 IGNvdW50KQoreworCUk5MTVfREVGSU5FX0NPTlRFWFRfRU5HSU5FU19MT0FEX0JBTEFOQ0UoYmFs YW5jZXIsIGNvdW50KTsKKwlJOTE1X0RFRklORV9DT05URVhUX1BBUkFNX0VOR0lORVMoZW5naW5l cywgMSArIGNvdW50KTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2NvbnRleHRfcGFyYW0gcCA9IHsK KwkJLmN0eF9pZCA9IGN0eCwKKwkJLnBhcmFtID0gSTkxNV9DT05URVhUX1BBUkFNX0VOR0lORVMs CisJCS5zaXplID0gc2l6ZW9mKGVuZ2luZXMpLAorCQkudmFsdWUgPSB0b191c2VyX3BvaW50ZXIo JmVuZ2luZXMpCisJfTsKKworCW1lbXNldCgmYmFsYW5jZXIsIDAsIHNpemVvZihiYWxhbmNlcikp OworCWJhbGFuY2VyLmJhc2UubmFtZSA9IEk5MTVfQ09OVEVYVF9FTkdJTkVTX0VYVF9MT0FEX0JB TEFOQ0U7CisKKwlpZ3RfYXNzZXJ0KGNvdW50KTsKKwliYWxhbmNlci5udW1fc2libGluZ3MgPSBj b3VudDsKKwltZW1jcHkoYmFsYW5jZXIuZW5naW5lcywgY2ksIGNvdW50ICogc2l6ZW9mKCpjaSkp OworCisJbWVtc2V0KCZlbmdpbmVzLCAwLCBzaXplb2YoZW5naW5lcykpOworCWVuZ2luZXMuZXh0 ZW5zaW9ucyA9IHRvX3VzZXJfcG9pbnRlcigmYmFsYW5jZXIpOworCWVuZ2luZXMuZW5naW5lc1sw XS5lbmdpbmVfY2xhc3MgPQorCQlJOTE1X0VOR0lORV9DTEFTU19JTlZBTElEOworCWVuZ2luZXMu ZW5naW5lc1swXS5lbmdpbmVfaW5zdGFuY2UgPQorCQlJOTE1X0VOR0lORV9DTEFTU19JTlZBTElE X05PTkU7CisJbWVtY3B5KGVuZ2luZXMuZW5naW5lcyArIDEsIGNpLCBjb3VudCAqIHNpemVvZigq Y2kpKTsKKworCXJldHVybiBfX2dlbV9jb250ZXh0X3NldF9wYXJhbShpOTE1LCAmcCk7Cit9CisK K3N0YXRpYyB2b2lkIHNldF9sb2FkX2JhbGFuY2VyKGludCBpOTE1LCB1aW50MzJfdCBjdHgsCisJ CQkgICAgICBjb25zdCBzdHJ1Y3QgaTkxNV9lbmdpbmVfY2xhc3NfaW5zdGFuY2UgKmNpLAorCQkJ ICAgICAgdW5zaWduZWQgaW50IGNvdW50KQoreworCWlndF9hc3NlcnRfZXEoX19zZXRfbG9hZF9i YWxhbmNlcihpOTE1LCBjdHgsIGNpLCBjb3VudCksIDApOworfQorCitzdGF0aWMgdWludDMyX3Qg bG9hZF9iYWxhbmNlcl9jcmVhdGUoaW50IGk5MTUsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgaTkx NV9lbmdpbmVfY2xhc3NfaW5zdGFuY2UgKmNpLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNvdW50 KQoreworCXVpbnQzMl90IGN0eDsKKworCWN0eCA9IGdlbV9jb250ZXh0X2NyZWF0ZShpOTE1KTsK KwlzZXRfbG9hZF9iYWxhbmNlcihpOTE1LCBjdHgsIGNpLCBjb3VudCk7CisKKwlyZXR1cm4gY3R4 OworfQorCitzdGF0aWMgdWludDMyX3QgX19iYXRjaF9jcmVhdGUoaW50IGk5MTUsIHVpbnQzMl90 IG9mZnNldCkKK3sKKwljb25zdCB1aW50MzJfdCBiYmUgPSBNSV9CQVRDSF9CVUZGRVJfRU5EOwor CXVpbnQzMl90IGhhbmRsZTsKKworCWhhbmRsZSA9IGdlbV9jcmVhdGUoaTkxNSwgQUxJR04ob2Zm c2V0ICsgNCwgNDA5NikpOworCWdlbV93cml0ZShpOTE1LCBoYW5kbGUsIG9mZnNldCwgJmJiZSwg c2l6ZW9mKGJiZSkpOworCisJcmV0dXJuIGhhbmRsZTsKK30KKworc3RhdGljIHVpbnQzMl90IGJh dGNoX2NyZWF0ZShpbnQgaTkxNSkKK3sKKwlyZXR1cm4gX19iYXRjaF9jcmVhdGUoaTkxNSwgMCk7 Cit9CisKK3N0YXRpYyB2b2lkIGludmFsaWRfYmFsYW5jZXIoaW50IGk5MTUpCit7CisJSTkxNV9E RUZJTkVfQ09OVEVYVF9FTkdJTkVTX0xPQURfQkFMQU5DRShiYWxhbmNlciwgNjQpOworCUk5MTVf REVGSU5FX0NPTlRFWFRfUEFSQU1fRU5HSU5FUyhlbmdpbmVzLCA2NCk7CisJc3RydWN0IGRybV9p OTE1X2dlbV9jb250ZXh0X3BhcmFtIHAgPSB7CisJCS5wYXJhbSA9IEk5MTVfQ09OVEVYVF9QQVJB TV9FTkdJTkVTLAorCQkudmFsdWUgPSB0b191c2VyX3BvaW50ZXIoJmVuZ2luZXMpCisJfTsKKwl1 aW50MzJfdCBoYW5kbGU7CisJdm9pZCAqcHRyOworCisJLyoKKwkgKiBBc3N1bWUgdGhhdCBJOTE1 X0NPTlRFWFRfUEFSQU1fRU5HSU5FIHZhbGlkYXRlcyB0aGUgYXJyYXkKKwkgKiBvZiBlbmdpbmVz W10sIG91ciBqb2IgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBsb2FkX2JhbGFuY2VyCisJICogZXh0 ZW5zaW9uIGV4cGxvZGVzLgorCSAqLworCisJZm9yIChpbnQgY2xhc3MgPSAwOyBjbGFzcyA8IDMy OyBjbGFzcysrKSB7CisJCXN0cnVjdCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSAqY2k7CisJ CXVuc2lnbmVkIGludCBjb3VudDsKKworCQljaSA9IGxpc3RfZW5naW5lcyhpOTE1LCAxIDw8IGNs YXNzLCAmY291bnQpOworCQlpZiAoIWNpKQorCQkJY29udGludWU7CisKKwkJaWd0X2Fzc2VydF9s dGUoY291bnQsIDY0KTsKKworCQlwLmN0eF9pZCA9IGdlbV9jb250ZXh0X2NyZWF0ZShpOTE1KTsK KwkJcC5zaXplID0gKHNpemVvZihzdHJ1Y3QgaTkxNV9jb250ZXh0X3BhcmFtX2VuZ2luZXMpICsK KwkJCSAgKGNvdW50ICsgMSkgKiBzaXplb2YoKmVuZ2luZXMuZW5naW5lcykpOworCisJCW1lbXNl dCgmZW5naW5lcywgMCwgc2l6ZW9mKGVuZ2luZXMpKTsKKwkJZW5naW5lcy5lbmdpbmVzWzBdLmVu Z2luZV9jbGFzcyA9IEk5MTVfRU5HSU5FX0NMQVNTX0lOVkFMSUQ7CisJCWVuZ2luZXMuZW5naW5l c1swXS5lbmdpbmVfaW5zdGFuY2UgPSBJOTE1X0VOR0lORV9DTEFTU19JTlZBTElEX05PTkU7CisJ CW1lbWNweShlbmdpbmVzLmVuZ2luZXMgKyAxLCBjaSwgY291bnQgKiBzaXplb2YoKmNpKSk7CisJ CWdlbV9jb250ZXh0X3NldF9wYXJhbShpOTE1LCAmcCk7CisKKwkJZW5naW5lcy5leHRlbnNpb25z ID0gLTF1bGw7CisJCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9zZXRfcGFyYW0oaTkxNSwg JnApLCAtRUZBVUxUKTsKKworCQllbmdpbmVzLmV4dGVuc2lvbnMgPSAxdWxsOworCQlpZ3RfYXNz ZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGk5MTUsICZwKSwgLUVGQVVMVCk7CisKKwkJ bWVtc2V0KCZiYWxhbmNlciwgMCwgc2l6ZW9mKGJhbGFuY2VyKSk7CisJCWJhbGFuY2VyLmJhc2Uu bmFtZSA9IEk5MTVfQ09OVEVYVF9FTkdJTkVTX0VYVF9MT0FEX0JBTEFOQ0U7CisJCWJhbGFuY2Vy Lm51bV9zaWJsaW5ncyA9IGNvdW50OworCQltZW1jcHkoYmFsYW5jZXIuZW5naW5lcywgY2ksIGNv dW50ICogc2l6ZW9mKCpjaSkpOworCisJCWVuZ2luZXMuZXh0ZW5zaW9ucyA9IHRvX3VzZXJfcG9p bnRlcigmYmFsYW5jZXIpOworCQlnZW1fY29udGV4dF9zZXRfcGFyYW0oaTkxNSwgJnApOworCisJ CWJhbGFuY2VyLmVuZ2luZV9pbmRleCA9IDE7CisJCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4 dF9zZXRfcGFyYW0oaTkxNSwgJnApLCAtRUVYSVNUKTsKKworCQliYWxhbmNlci5lbmdpbmVfaW5k ZXggPSBjb3VudDsKKwkJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJhbShpOTE1 LCAmcCksIC1FRVhJU1QpOworCisJCWJhbGFuY2VyLmVuZ2luZV9pbmRleCA9IGNvdW50ICsgMTsK KwkJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0X3NldF9wYXJhbShpOTE1LCAmcCksIC1FSU5W QUwpOworCisJCWJhbGFuY2VyLmVuZ2luZV9pbmRleCA9IDA7CisJCWdlbV9jb250ZXh0X3NldF9w YXJhbShpOTE1LCAmcCk7CisKKwkJYmFsYW5jZXIuYmFzZS5uZXh0X2V4dGVuc2lvbiA9IHRvX3Vz ZXJfcG9pbnRlcigmYmFsYW5jZXIpOworCQlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0 X3BhcmFtKGk5MTUsICZwKSwgLUVFWElTVCk7CisKKwkJYmFsYW5jZXIuYmFzZS5uZXh0X2V4dGVu c2lvbiA9IC0xdWxsOworCQlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGk5 MTUsICZwKSwgLUVGQVVMVCk7CisKKwkJaGFuZGxlID0gZ2VtX2NyZWF0ZShpOTE1LCA0MDk2ICog Myk7CisJCXB0ciA9IGdlbV9tbWFwX19ndHQoaTkxNSwgaGFuZGxlLCA0MDk2ICogMywgUFJPVF9X UklURSk7CisJCWdlbV9jbG9zZShpOTE1LCBoYW5kbGUpOworCisJCW1lbXNldCgmZW5naW5lcywg MCwgc2l6ZW9mKGVuZ2luZXMpKTsKKwkJZW5naW5lcy5lbmdpbmVzWzBdLmVuZ2luZV9jbGFzcyA9 IEk5MTVfRU5HSU5FX0NMQVNTX0lOVkFMSUQ7CisJCWVuZ2luZXMuZW5naW5lc1swXS5lbmdpbmVf aW5zdGFuY2UgPSBJOTE1X0VOR0lORV9DTEFTU19JTlZBTElEX05PTkU7CisJCWVuZ2luZXMuZW5n aW5lc1sxXS5lbmdpbmVfY2xhc3MgPSBJOTE1X0VOR0lORV9DTEFTU19JTlZBTElEOworCQllbmdp bmVzLmVuZ2luZXNbMV0uZW5naW5lX2luc3RhbmNlID0gSTkxNV9FTkdJTkVfQ0xBU1NfSU5WQUxJ RF9OT05FOworCQltZW1jcHkoZW5naW5lcy5lbmdpbmVzICsgMiwgY2ksIGNvdW50ICogc2l6ZW9m KGNpKSk7CisJCXAuc2l6ZSA9IChzaXplb2Yoc3RydWN0IGk5MTVfY29udGV4dF9wYXJhbV9lbmdp bmVzKSArCisJCQkgIChjb3VudCArIDIpICogc2l6ZW9mKCplbmdpbmVzLmVuZ2luZXMpKTsKKwkJ Z2VtX2NvbnRleHRfc2V0X3BhcmFtKGk5MTUsICZwKTsKKworCQliYWxhbmNlci5iYXNlLm5leHRf ZXh0ZW5zaW9uID0gMDsKKwkJYmFsYW5jZXIuZW5naW5lX2luZGV4ID0gMTsKKwkJZW5naW5lcy5l eHRlbnNpb25zID0gdG9fdXNlcl9wb2ludGVyKCZiYWxhbmNlcik7CisJCWdlbV9jb250ZXh0X3Nl dF9wYXJhbShpOTE1LCAmcCk7CisKKwkJbWVtY3B5KHB0ciArIDQwOTYgLSA4LCAmYmFsYW5jZXIs IHNpemVvZihiYWxhbmNlcikpOworCQltZW1jcHkocHRyICsgODE5MiAtIDgsICZiYWxhbmNlciwg c2l6ZW9mKGJhbGFuY2VyKSk7CisJCWJhbGFuY2VyLmVuZ2luZV9pbmRleCA9IDA7CisKKwkJZW5n aW5lcy5leHRlbnNpb25zID0gdG9fdXNlcl9wb2ludGVyKHB0cikgKyA0MDk2IC0gODsKKwkJZ2Vt X2NvbnRleHRfc2V0X3BhcmFtKGk5MTUsICZwKTsKKworCQliYWxhbmNlci5iYXNlLm5leHRfZXh0 ZW5zaW9uID0gZW5naW5lcy5leHRlbnNpb25zOworCQllbmdpbmVzLmV4dGVuc2lvbnMgPSB0b191 c2VyX3BvaW50ZXIoJmJhbGFuY2VyKTsKKwkJZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGk5MTUsICZw KTsKKworCQltdW5tYXAocHRyLCA0MDk2KTsKKwkJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0 X3NldF9wYXJhbShpOTE1LCAmcCksIC1FRkFVTFQpOworCQllbmdpbmVzLmV4dGVuc2lvbnMgPSB0 b191c2VyX3BvaW50ZXIocHRyKSArIDQwOTYgLSA4OworCQlpZ3RfYXNzZXJ0X2VxKF9fZ2VtX2Nv bnRleHRfc2V0X3BhcmFtKGk5MTUsICZwKSwgLUVGQVVMVCk7CisKKwkJZW5naW5lcy5leHRlbnNp b25zID0gdG9fdXNlcl9wb2ludGVyKHB0cikgKyA4MTkyIC0gODsKKwkJZ2VtX2NvbnRleHRfc2V0 X3BhcmFtKGk5MTUsICZwKTsKKworCQliYWxhbmNlci5iYXNlLm5leHRfZXh0ZW5zaW9uID0gZW5n aW5lcy5leHRlbnNpb25zOworCQllbmdpbmVzLmV4dGVuc2lvbnMgPSB0b191c2VyX3BvaW50ZXIo JmJhbGFuY2VyKTsKKwkJZ2VtX2NvbnRleHRfc2V0X3BhcmFtKGk5MTUsICZwKTsKKworCQltdW5t YXAocHRyICsgODE5MiwgNDA5Nik7CisJCWlndF9hc3NlcnRfZXEoX19nZW1fY29udGV4dF9zZXRf cGFyYW0oaTkxNSwgJnApLCAtRUZBVUxUKTsKKwkJZW5naW5lcy5leHRlbnNpb25zID0gdG9fdXNl cl9wb2ludGVyKHB0cikgKyA4MTkyIC0gODsKKwkJaWd0X2Fzc2VydF9lcShfX2dlbV9jb250ZXh0 X3NldF9wYXJhbShpOTE1LCAmcCksIC1FRkFVTFQpOworCisJCW11bm1hcChwdHIgKyA0MDk2LCA0 MDk2KTsKKworCQlnZW1fY29udGV4dF9kZXN0cm95KGk5MTUsIHAuY3R4X2lkKTsKKwkJZnJlZShj aSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBraWNrX2t0aHJlYWRzKHZvaWQpCit7CisJdXNsZWVw KDIwICogMTAwMCk7IC8qIDIwbXMgc2hvdWxkIGJlIGVub3VnaCBmb3Iga3NvZnRpcnFkISAqLwor fQorCitzdGF0aWMgZG91YmxlIG1lYXN1cmVfbG9hZChpbnQgcG11LCBpbnQgcGVyaW9kX3VzKQor eworCXVpbnQ2NF90IGRhdGFbMl07CisJdWludDY0X3QgZF90LCBkX3Y7CisKKwlraWNrX2t0aHJl YWRzKCk7CisKKwlpZ3RfYXNzZXJ0X2VxKHJlYWQocG11LCBkYXRhLCBzaXplb2YoZGF0YSkpLCBz aXplb2YoZGF0YSkpOworCWRfdiA9IC1kYXRhWzBdOworCWRfdCA9IC1kYXRhWzFdOworCisJdXNs ZWVwKHBlcmlvZF91cyk7CisKKwlpZ3RfYXNzZXJ0X2VxKHJlYWQocG11LCBkYXRhLCBzaXplb2Yo ZGF0YSkpLCBzaXplb2YoZGF0YSkpOworCWRfdiArPSBkYXRhWzBdOworCWRfdCArPSBkYXRhWzFd OworCisJcmV0dXJuIGRfdiAvIChkb3VibGUpZF90OworfQorCitzdGF0aWMgZG91YmxlIG1lYXN1 cmVfbWluX2xvYWQoaW50IHBtdSwgdW5zaWduZWQgaW50IG51bSwgaW50IHBlcmlvZF91cykKK3sK Kwl1aW50NjRfdCBkYXRhWzIgKyBudW1dOworCXVpbnQ2NF90IGRfdCwgZF92W251bV07CisJdWlu dDY0X3QgbWluID0gLTEsIG1heCA9IDA7CisKKwlraWNrX2t0aHJlYWRzKCk7CisKKwlpZ3RfYXNz ZXJ0X2VxKHJlYWQocG11LCBkYXRhLCBzaXplb2YoZGF0YSkpLCBzaXplb2YoZGF0YSkpOworCWZv ciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwgbnVtOyBuKyspCisJCWRfdltuXSA9IC1kYXRhWzIg KyBuXTsKKwlkX3QgPSAtZGF0YVsxXTsKKworCXVzbGVlcChwZXJpb2RfdXMpOworCisJaWd0X2Fz c2VydF9lcShyZWFkKHBtdSwgZGF0YSwgc2l6ZW9mKGRhdGEpKSwgc2l6ZW9mKGRhdGEpKTsKKwor CWRfdCArPSBkYXRhWzFdOworCWZvciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwgbnVtOyBuKysp IHsKKwkJZF92W25dICs9IGRhdGFbMiArIG5dOworCQlpZ3RfZGVidWcoImVuZ2luZVslZF06ICUu MWYlJVxuIiwKKwkJCSAgbiwgZF92W25dIC8gKGRvdWJsZSlkX3QgKiAxMDApOworCQlpZiAoZF92 W25dIDwgbWluKQorCQkJbWluID0gZF92W25dOworCQlpZiAoZF92W25dID4gbWF4KQorCQkJbWF4 ID0gZF92W25dOworCX0KKworCWlndF9kZWJ1ZygiZWxhcHNlZDogJSJQUkl1NjQibnMsIGxvYWQg WyUuMWYsICUuMWZdJSVcbiIsCisJCSAgZF90LCBtaW4gLyAoZG91YmxlKWRfdCAqIDEwMCwgIG1h eCAvIChkb3VibGUpZF90ICogMTAwKTsKKworCXJldHVybiBtaW4gLyAoZG91YmxlKWRfdDsKK30K Kworc3RhdGljIHZvaWQgY2hlY2tfaW5kaXZpZHVhbF9lbmdpbmUoaW50IGk5MTUsCisJCQkJICAg IHVpbnQzMl90IGN0eCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGk5MTVfZW5naW5lX2NsYXNzX2lu c3RhbmNlICpjaSwKKwkJCQkgICAgaW50IGlkeCkKK3sKKwlpZ3Rfc3Bpbl90ICpzcGluOworCWRv dWJsZSBsb2FkOworCWludCBwbXU7CisKKwlwbXUgPSBwZXJmX2k5MTVfb3BlbihJOTE1X1BNVV9F TkdJTkVfQlVTWShjaVtpZHhdLmVuZ2luZV9jbGFzcywKKwkJCQkJCSAgY2lbaWR4XS5lbmdpbmVf aW5zdGFuY2UpKTsKKworCXNwaW4gPSBpZ3Rfc3Bpbl9uZXcoaTkxNSwgLmN0eCA9IGN0eCwgLmVu Z2luZSA9IGlkeCArIDEpOworCWxvYWQgPSBtZWFzdXJlX2xvYWQocG11LCAxMDAwMCk7CisJaWd0 X3NwaW5fZnJlZShpOTE1LCBzcGluKTsKKworCWNsb3NlKHBtdSk7CisKKwlpZ3RfYXNzZXJ0X2Yo bG9hZCA+IDAuOTAsCisJCSAgICAgImVuZ2luZSAlZCAoY2xhc3M6aW5zdGFuY2UgJWQ6JWQpIHdh cyBmb3VuZCB0byBiZSBvbmx5ICUuMWYlJSBidXN5XG4iLAorCQkgICAgIGlkeCwgY2lbaWR4XS5l bmdpbmVfY2xhc3MsIGNpW2lkeF0uZW5naW5lX2luc3RhbmNlLCBsb2FkKjEwMCk7Cit9CisKK3N0 YXRpYyB2b2lkIGluZGl2aWR1YWwoaW50IGk5MTUpCit7CisJdWludDMyX3QgY3R4OworCisJLyoK KwkgKiBJOTE1X0NPTlRFWFRfUEFSQU1fRU5HSU5FIGFsbG93cyB1cyB0byBpbmRleCBpbnRvIHRo ZSB1c2VyCisJICogc3VwcGxpZWQgYXJyYXkgZnJvbSBnZW1fZXhlY2J1ZigpLiBPdXIgY2hlY2sg aXMgdG8gYnVpbGQgdGhlCisJICogY3R4LT5lbmdpbmVbXSB3aXRoIHZhcmlvdXMgZGlmZmVyZW50 IGVuZ2luZSBjbGFzc2VzLCBmZWVkIGluCisJICogYSBzcGlubmVyIGFuZCB0aGVuIGFzayBwbXUg dG8gY29uZmlybSBpdCB0aGUgZXhwZWN0ZWQgZW5naW5lCisJICogd2FzIGJ1c3kuCisJICovCisK KwljdHggPSBnZW1fY29udGV4dF9jcmVhdGUoaTkxNSk7CisKKwlmb3IgKGludCBjbGFzcyA9IDA7 IGNsYXNzIDwgMzI7IGNsYXNzKyspIHsKKwkJc3RydWN0IGk5MTVfZW5naW5lX2NsYXNzX2luc3Rh bmNlICpjaTsKKwkJdW5zaWduZWQgaW50IGNvdW50OworCisJCWNpID0gbGlzdF9lbmdpbmVzKGk5 MTUsIDF1IDw8IGNsYXNzLCAmY291bnQpOworCQlpZiAoIWNpKQorCQkJY29udGludWU7CisKKwkJ Zm9yIChpbnQgcGFzcyA9IDA7IHBhc3MgPCBjb3VudDsgcGFzcysrKSB7IC8qIGFwcHJveC4gY291 bnQhICovCisJCQlpZ3RfYXNzZXJ0KHNpemVvZigqY2kpID09IHNpemVvZihpbnQpKTsKKwkJCWln dF9wZXJtdXRlX2FycmF5KGNpLCBjb3VudCwgaWd0X2V4Y2hhbmdlX2ludCk7CisJCQlzZXRfbG9h ZF9iYWxhbmNlcihpOTE1LCBjdHgsIGNpLCBjb3VudCk7CisJCQlmb3IgKHVuc2lnbmVkIGludCBu ID0gMDsgbiA8IGNvdW50OyBuKyspCisJCQkJY2hlY2tfaW5kaXZpZHVhbF9lbmdpbmUoaTkxNSwg Y3R4LCBjaSwgbik7CisJCX0KKworCQlmcmVlKGNpKTsKKwl9CisKKwlnZW1fY29udGV4dF9kZXN0 cm95KGk5MTUsIGN0eCk7CisJZ2VtX3F1aWVzY2VudF9ncHUoaTkxNSk7Cit9CisKK3N0YXRpYyB2 b2lkIGluZGljZXMoaW50IGk5MTUpCit7CisJSTkxNV9ERUZJTkVfQ09OVEVYVF9QQVJBTV9FTkdJ TkVTKGVuZ2luZXMsIEk5MTVfRVhFQ19SSU5HX01BU0sgKyAxKTsKKwlzdHJ1Y3QgZHJtX2k5MTVf Z2VtX2NvbnRleHRfcGFyYW0gcCA9IHsKKwkJLmN0eF9pZCA9IGdlbV9jb250ZXh0X2NyZWF0ZShp OTE1KSwKKwkJLnBhcmFtID0gSTkxNV9DT05URVhUX1BBUkFNX0VOR0lORVMsCisJCS52YWx1ZSA9 IHRvX3VzZXJfcG9pbnRlcigmZW5naW5lcykKKwl9OworCisJc3RydWN0IGRybV9pOTE1X2dlbV9l eGVjX29iamVjdDIgYmF0Y2ggPSB7CisJCS5oYW5kbGUgPSBiYXRjaF9jcmVhdGUoaTkxNSksCisJ fTsKKworCXVuc2lnbmVkIGludCBuZW5naW5lcyA9IDA7CisJdm9pZCAqYmFsYW5jZXJzID0gTlVM TDsKKworCS8qCisJICogV2UgY2FuIHBvcHVsYXRlIG91ciBlbmdpbmUgbWFwIHdpdGggbXVsdGlw bGUgdmlydHVhbCBlbmdpbmVzLgorCSAqIERvIHNvLgorCSAqLworCisJZm9yIChpbnQgY2xhc3Mg PSAwOyBjbGFzcyA8IDMyOyBjbGFzcysrKSB7CisJCXN0cnVjdCBpOTE1X2VuZ2luZV9jbGFzc19p bnN0YW5jZSAqY2k7CisJCXVuc2lnbmVkIGludCBjb3VudDsKKworCQljaSA9IGxpc3RfZW5naW5l cyhpOTE1LCAxdSA8PCBjbGFzcywgJmNvdW50KTsKKwkJaWYgKCFjaSkKKwkJCWNvbnRpbnVlOwor CisJCWZvciAoaW50IG4gPSAwOyBuIDwgY291bnQ7IG4rKykgeworCQkJSTkxNV9ERUZJTkVfQ09O VEVYVF9FTkdJTkVTX0xPQURfQkFMQU5DRSgqYmFsYW5jZXIsCisJCQkJCQkJCSBjb3VudCk7CisK KwkJCWVuZ2luZXMuZW5naW5lc1tuZW5naW5lc10uZW5naW5lX2NsYXNzID0KKwkJCQlJOTE1X0VO R0lORV9DTEFTU19JTlZBTElEOworCQkJZW5naW5lcy5lbmdpbmVzW25lbmdpbmVzXS5lbmdpbmVf aW5zdGFuY2UgPQorCQkJCUk5MTVfRU5HSU5FX0NMQVNTX0lOVkFMSURfTk9ORTsKKworCQkJYmFs YW5jZXIgPSBjYWxsb2Moc2l6ZW9mKCpiYWxhbmNlciksIDEpOworCQkJaWd0X2Fzc2VydChiYWxh bmNlcik7CisKKwkJCWJhbGFuY2VyLT5iYXNlLm5hbWUgPQorCQkJCUk5MTVfQ09OVEVYVF9FTkdJ TkVTX0VYVF9MT0FEX0JBTEFOQ0U7CisJCQliYWxhbmNlci0+YmFzZS5uZXh0X2V4dGVuc2lvbiA9 CisJCQkJdG9fdXNlcl9wb2ludGVyKGJhbGFuY2Vycyk7CisJCQliYWxhbmNlcnMgPSBiYWxhbmNl cjsKKworCQkJYmFsYW5jZXItPmVuZ2luZV9pbmRleCA9IG5lbmdpbmVzKys7CisJCQliYWxhbmNl ci0+bnVtX3NpYmxpbmdzID0gY291bnQ7CisKKwkJCW1lbWNweShiYWxhbmNlci0+ZW5naW5lcywK KwkJCSAgICAgICBjaSwgY291bnQgKiBzaXplb2YoKmNpKSk7CisJCX0KKwkJZnJlZShjaSk7CisJ fQorCisJaWd0X3JlcXVpcmUoYmFsYW5jZXJzKTsKKwllbmdpbmVzLmV4dGVuc2lvbnMgPSB0b191 c2VyX3BvaW50ZXIoYmFsYW5jZXJzKTsKKwlwLnNpemUgPSAoc2l6ZW9mKHN0cnVjdCBpOTE1X2Vu Z2luZV9jbGFzc19pbnN0YW5jZSkgKiBuZW5naW5lcyArCisJCSAgc2l6ZW9mKHN0cnVjdCBpOTE1 X2NvbnRleHRfcGFyYW1fZW5naW5lcykpOworCWdlbV9jb250ZXh0X3NldF9wYXJhbShpOTE1LCAm cCk7CisKKwlmb3IgKHVuc2lnbmVkIGludCBuID0gMDsgbiA8IG5lbmdpbmVzOyBuKyspIHsKKwkJ c3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBlYiA9IHsKKwkJCS5idWZmZXJzX3B0ciA9 IHRvX3VzZXJfcG9pbnRlcigmYmF0Y2gpLAorCQkJLmJ1ZmZlcl9jb3VudCA9IDEsCisJCQkuZmxh Z3MgPSBuLAorCQkJLnJzdmQxID0gcC5jdHhfaWQsCisJCX07CisJCWlndF9kZWJ1ZygiRXhlY3V0 aW5nIG9uIGluZGV4PSVkXG4iLCBuKTsKKwkJZ2VtX2V4ZWNidWYoaTkxNSwgJmViKTsKKwl9CisJ Z2VtX2NvbnRleHRfZGVzdHJveShpOTE1LCBwLmN0eF9pZCk7CisKKwlnZW1fc3luYyhpOTE1LCBi YXRjaC5oYW5kbGUpOworCWdlbV9jbG9zZShpOTE1LCBiYXRjaC5oYW5kbGUpOworCisJd2hpbGUg KGJhbGFuY2VycykgeworCQlzdHJ1Y3QgaTkxNV9jb250ZXh0X2VuZ2luZXNfbG9hZF9iYWxhbmNl ICpiLCAqbjsKKworCQliID0gYmFsYW5jZXJzOworCQluID0gZnJvbV91c2VyX3BvaW50ZXIoYi0+ YmFzZS5uZXh0X2V4dGVuc2lvbik7CisJCWZyZWUoYik7CisKKwkJYmFsYW5jZXJzID0gbjsKKwl9 CisKKwlnZW1fcXVpZXNjZW50X2dwdShpOTE1KTsKK30KKworc3RhdGljIHZvaWQgYnVzeShpbnQg aTkxNSkKK3sKKwl1aW50MzJfdCBzY3JhdGNoID0gZ2VtX2NyZWF0ZShpOTE1LCA0MDk2KTsKKwor CS8qCisJICogQ2hlY2sgdGhhdCB2aXJ0dWFsIGVuZ2luZXMgYXJlIHJlcG9ydGVkIHZpYSBHRU1f QlVTWS4KKwkgKgorCSAqIFdoZW4gcnVubmluZywgdGhlIGJhdGNoIHdpbGwgYmUgb24gdGhlIHJl YWwgZW5naW5lIGFuZCByZXBvcnQKKwkgKiB0aGUgYWN0dWFsIGNsYXNzLgorCSAqCisJICogUHJp b3IgdG8gcnVubmluZywgaWYgdGhlIGxvYWQtYmFsYW5jZXIgaXMgYWNyb3NzIG11bHRpcGxlCisJ ICogY2xhc3NlcyB3ZSBkb24ndCBrbm93IHdoaWNoIGVuZ2luZSB0aGUgYmF0Y2ggd2lsbAorCSAq IGV4ZWN1dGUgb24sIHNvIHdlIHJlcG9ydCB0aGVtIGFsbCEKKwkgKgorCSAqIEhvd2V2ZXIsIGFz IHdlIG9ubHkgc3VwcG9ydCAoYW5kIHRlc3QpIGNyZWF0aW5nIGEgbG9hZC1iYWxhbmNlcgorCSAq IGZyb20gZW5naW5lcyBvZiBvbmx5IG9uZSBjbGFzcywgdGhhdCBjYW4gYmUgcHJvcGFnYXRlZCBh Y2N1cmF0ZWx5CisJICogdGhyb3VnaCB0byBHRU1fQlVTWS4KKwkgKi8KKworCWZvciAoaW50IGNs YXNzID0gMDsgY2xhc3MgPCAxNjsgY2xhc3MrKykgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2J1 c3kgYnVzeTsKKwkJc3RydWN0IGk5MTVfZW5naW5lX2NsYXNzX2luc3RhbmNlICpjaTsKKwkJdW5z aWduZWQgaW50IGNvdW50OworCQlpZ3Rfc3Bpbl90ICpzcGluWzJdOworCQl1aW50MzJfdCBjdHg7 CisKKwkJY2kgPSBsaXN0X2VuZ2luZXMoaTkxNSwgMXUgPDwgY2xhc3MsICZjb3VudCk7CisJCWlm ICghY2kpCisJCQljb250aW51ZTsKKworCQljdHggPSBsb2FkX2JhbGFuY2VyX2NyZWF0ZShpOTE1 LCBjaSwgY291bnQpOworCQlmcmVlKGNpKTsKKworCQlzcGluWzBdID0gX19pZ3Rfc3Bpbl9uZXco aTkxNSwKKwkJCQkJIC5jdHggPSBjdHgsCisJCQkJCSAuZmxhZ3MgPSBJR1RfU1BJTl9QT0xMX1JV Tik7CisJCXNwaW5bMV0gPSBfX2lndF9zcGluX25ldyhpOTE1LAorCQkJCQkgLmN0eCA9IGN0eCwK KwkJCQkJIC5kZXBlbmRlbmN5ID0gc2NyYXRjaCk7CisKKwkJaWd0X3NwaW5fYnVzeXdhaXRfdW50 aWxfc3RhcnRlZChzcGluWzBdKTsKKworCQkvKiBSdW5uaW5nOiBhY3R1YWwgY2xhc3MgKi8KKwkJ YnVzeS5oYW5kbGUgPSBzcGluWzBdLT5oYW5kbGU7CisJCWRvX2lvY3RsKGk5MTUsIERSTV9JT0NU TF9JOTE1X0dFTV9CVVNZLCAmYnVzeSk7CisJCWlndF9hc3NlcnRfZXFfdTMyKGJ1c3kuYnVzeSwg MXUgPDwgKGNsYXNzICsgMTYpKTsKKworCQkvKiBRdWV1ZWQocmVhZCk6IGV4cGVjdGVkIGNsYXNz ICovCisJCWJ1c3kuaGFuZGxlID0gc3BpblsxXS0+aGFuZGxlOworCQlkb19pb2N0bChpOTE1LCBE Uk1fSU9DVExfSTkxNV9HRU1fQlVTWSwgJmJ1c3kpOworCQlpZ3RfYXNzZXJ0X2VxX3UzMihidXN5 LmJ1c3ksIDF1IDw8IChjbGFzcyArIDE2KSk7CisKKwkJLyogUXVldWVkKHdyaXRlKTogZXhwZWN0 ZWQgY2xhc3MgKi8KKwkJYnVzeS5oYW5kbGUgPSBzY3JhdGNoOworCQlkb19pb2N0bChpOTE1LCBE Uk1fSU9DVExfSTkxNV9HRU1fQlVTWSwgJmJ1c3kpOworCQlpZ3RfYXNzZXJ0X2VxX3UzMihidXN5 LmJ1c3ksCisJCQkJICAoMXUgPDwgKGNsYXNzICsgMTYpKSB8IChjbGFzcyArIDEpKTsKKworCQlp Z3Rfc3Bpbl9mcmVlKGk5MTUsIHNwaW5bMV0pOworCQlpZ3Rfc3Bpbl9mcmVlKGk5MTUsIHNwaW5b MF0pOworCisJCWdlbV9jb250ZXh0X2Rlc3Ryb3koaTkxNSwgY3R4KTsKKwl9CisKKwlnZW1fY2xv c2UoaTkxNSwgc2NyYXRjaCk7CisJZ2VtX3F1aWVzY2VudF9ncHUoaTkxNSk7Cit9CisKK3N0YXRp YyBpbnQgYWRkX3BtdShpbnQgcG11LCBjb25zdCBzdHJ1Y3QgaTkxNV9lbmdpbmVfY2xhc3NfaW5z dGFuY2UgKmNpKQoreworCXJldHVybiBwZXJmX2k5MTVfb3Blbl9ncm91cChJOTE1X1BNVV9FTkdJ TkVfQlVTWShjaS0+ZW5naW5lX2NsYXNzLAorCQkJCQkJCSBjaS0+ZW5naW5lX2luc3RhbmNlKSwK KwkJCQkgICAgcG11KTsKK30KKworc3RhdGljIHZvaWQgZnVsbChpbnQgaTkxNSwgdW5zaWduZWQg aW50IGZsYWdzKQorI2RlZmluZSBQVUxTRSAweDEKKyNkZWZpbmUgTEFURSAweDIKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBiYXRjaCA9IHsKKwkJLmhhbmRsZSA9IGJhdGNo X2NyZWF0ZShpOTE1KSwKKwl9OworCisJaWYgKGZsYWdzICYgTEFURSkKKwkJaWd0X3JlcXVpcmVf c3dfc3luYygpOworCisJLyoKKwkgKiBJOTE1X0NPTlRFWFRfUEFSQU1fRU5HSU5FIGNoYW5nZXMg dGhlIG1lYW5pbmcgb2YgZW5naW5lIHNlbGVjdG9yIGluCisJICogZXhlY2J1ZiB0byB1dGlsaXpl IG91ciBvd24gbWFwLCBpbnRvIHdoaWNoIHdlIHJlcGxhY2UgSTkxNV9FWEVDX0RFRkFVTFQKKwkg KiB0byBwcm92aWRlIGFuIGF1dG9tYXRpYyBzZWxlY3Rpb24gZnJvbSB0aGUgb3RoZXIgY3R4LT5l bmdpbmVbXS4gSXQKKwkgKiBlbXBsb3lzIGxvYWQtYmFsYW5jaW5nIHRvIGV2ZW5seSBkaXN0cmli dXRlIHRoZSB3b3JrbG9hZCB0aGUKKwkgKiBhcnJheS4gSWYgd2Ugc3VibWl0IE4gc3Bpbm5lcnMs IHdlIGV4cGVjdCB0aGVtIHRvIGJlIHNpbXVsdGFuZW91c2x5CisJICogcnVubmluZyBhY3Jvc3Mg TiBlbmdpbmVzIGFuZCB1c2UgUE1VIHRvIGNvbmZpcm0gdGhhdCB0aGUgZW50aXJlCisJICogc2V0 IG9mIGVuZ2luZXMgYXJlIGJ1c3kuCisJICoKKwkgKiBXZSBjb21wbGljYXRlIG1hdHRlcnMgYnkg aW50ZXJzcGVyc2luZyBzaG9ydC1saXZlZCB0YXNrcyB0bworCSAqIGNoYWxsZW5nZSB0aGUga2Vy bmVsIHRvIHNlYXJjaCBmb3Igc3BhY2UgaW4gd2hpY2ggdG8gaW5zZXJ0IG5ldworCSAqIGJhdGNo ZXMuCisJICovCisKKwlmb3IgKGludCBjbGFzcyA9IDA7IGNsYXNzIDwgMzI7IGNsYXNzKyspIHsK KwkJc3RydWN0IGk5MTVfZW5naW5lX2NsYXNzX2luc3RhbmNlICpjaTsKKwkJaWd0X3NwaW5fdCAq c3BpbiA9IE5VTEw7CisJCUlHVF9DT1JLX0ZFTkNFKGNvcmspOworCQl1bnNpZ25lZCBpbnQgY291 bnQ7CisJCWRvdWJsZSBsb2FkOworCQlpbnQgZmVuY2UgPSAtMTsKKwkJaW50ICpwbXU7CisKKwkJ Y2kgPSBsaXN0X2VuZ2luZXMoaTkxNSwgMXUgPDwgY2xhc3MsICZjb3VudCk7CisJCWlmICghY2kp CisJCQljb250aW51ZTsKKworCQlwbXUgPSBtYWxsb2Moc2l6ZW9mKCpwbXUpICogY291bnQpOwor CQlpZ3RfYXNzZXJ0KHBtdSk7CisKKwkJaWYgKGZsYWdzICYgTEFURSkKKwkJCWZlbmNlID0gaWd0 X2NvcmtfcGx1ZygmY29yaywgaTkxNSk7CisKKwkJcG11WzBdID0gLTE7CisJCWZvciAodW5zaWdu ZWQgaW50IG4gPSAwOyBuIDwgY291bnQ7IG4rKykgeworCQkJdWludDMyX3QgY3R4OworCisJCQlw bXVbbl0gPSBhZGRfcG11KHBtdVswXSwgJmNpW25dKTsKKworCQkJaWYgKGZsYWdzICYgUFVMU0Up IHsKKwkJCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGViID0geworCQkJCQkuYnVm ZmVyc19wdHIgPSB0b191c2VyX3BvaW50ZXIoJmJhdGNoKSwKKwkJCQkJLmJ1ZmZlcl9jb3VudCA9 IDEsCisJCQkJCS5yc3ZkMiA9IGZlbmNlLAorCQkJCQkuZmxhZ3MgPSBmbGFncyAmIExBVEUgPyBJ OTE1X0VYRUNfRkVOQ0VfSU4gOiAwLAorCQkJCX07CisJCQkJZ2VtX2V4ZWNidWYoaTkxNSwgJmVi KTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEVhY2ggc3Bpbm5lciBuZWVkcyB0byBiZSBvbmUgYSBu ZXcgdGltZWxpbmUsCisJCQkgKiBvdGhlcndpc2UgdGhleSB3aWxsIGp1c3Qgc2l0IGluIHRoZSBz aW5nbGUgcXVldWUKKwkJCSAqIGFuZCBub3QgcnVuIGNvbmN1cnJlbnRseS4KKwkJCSAqLworCQkJ Y3R4ID0gbG9hZF9iYWxhbmNlcl9jcmVhdGUoaTkxNSwgY2ksIGNvdW50KTsKKworCQkJaWYgKHNw aW4gPT0gTlVMTCkgeworCQkJCXNwaW4gPSBfX2lndF9zcGluX25ldyhpOTE1LCAuY3R4ID0gY3R4 KTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBlYiA9 IHsKKwkJCQkJLmJ1ZmZlcnNfcHRyID0gc3Bpbi0+ZXhlY2J1Zi5idWZmZXJzX3B0ciwKKwkJCQkJ LmJ1ZmZlcl9jb3VudCA9IHNwaW4tPmV4ZWNidWYuYnVmZmVyX2NvdW50LAorCQkJCQkucnN2ZDEg PSBjdHgsCisJCQkJCS5yc3ZkMiA9IGZlbmNlLAorCQkJCQkuZmxhZ3MgPSBmbGFncyAmIExBVEUg PyBJOTE1X0VYRUNfRkVOQ0VfSU4gOiAwLAorCQkJCX07CisJCQkJZ2VtX2V4ZWNidWYoaTkxNSwg JmViKTsKKwkJCX0KKworCQkJZ2VtX2NvbnRleHRfZGVzdHJveShpOTE1LCBjdHgpOworCQl9CisK KwkJaWYgKGZsYWdzICYgTEFURSkgeworCQkJaWd0X2NvcmtfdW5wbHVnKCZjb3JrKTsKKwkJCWNs b3NlKGZlbmNlKTsKKwkJfQorCisJCWxvYWQgPSBtZWFzdXJlX21pbl9sb2FkKHBtdVswXSwgY291 bnQsIDEwMDAwKTsKKwkJaWd0X3NwaW5fZnJlZShpOTE1LCBzcGluKTsKKworCQljbG9zZShwbXVb MF0pOworCQlmcmVlKHBtdSk7CisKKwkJZnJlZShjaSk7CisKKwkJaWd0X2Fzc2VydF9mKGxvYWQg PiAwLjkwLAorCQkJICAgICAibWluaW11bSBsb2FkIGZvciAlZCB4IGNsYXNzOiVkIHdhcyBmb3Vu ZCB0byBiZSBvbmx5ICUuMWYlJSBidXN5XG4iLAorCQkJICAgICBjb3VudCwgY2xhc3MsIGxvYWQq MTAwKTsKKwkJZ2VtX3F1aWVzY2VudF9ncHUoaTkxNSk7CisJfQorCisJZ2VtX2Nsb3NlKGk5MTUs IGJhdGNoLmhhbmRsZSk7CisJZ2VtX3F1aWVzY2VudF9ncHUoaTkxNSk7Cit9CisKK3N0YXRpYyBj b25zdCBjaGFyICpjbGFzc190b19zdHIoaW50IGNsYXNzKQoreworCWNvbnN0IGNoYXIgKnN0cltd ID0geworCQlbSTkxNV9FTkdJTkVfQ0xBU1NfUkVOREVSXSA9ICJyY3MiLAorCQlbSTkxNV9FTkdJ TkVfQ0xBU1NfQ09QWV0gPSAiYmNzIiwKKwkJW0k5MTVfRU5HSU5FX0NMQVNTX1ZJREVPXSA9ICJ2 Y3MiLAorCQlbSTkxNV9FTkdJTkVfQ0xBU1NfVklERU9fRU5IQU5DRV0gPSAidmVjcyIsCisJfTsK KworCWlmIChjbGFzcyA8IEFSUkFZX1NJWkUoc3RyKSkKKwkJcmV0dXJuIHN0cltjbGFzc107CisK KwlyZXR1cm4gInVuayI7Cit9CisKK3N0YXRpYyB2b2lkIG5vcChpbnQgaTkxNSkKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNfb2JqZWN0MiBiYXRjaCA9IHsKKwkJLmhhbmRsZSA9IGJhdGNo X2NyZWF0ZShpOTE1KSwKKwl9OworCisJZm9yIChpbnQgY2xhc3MgPSAwOyBjbGFzcyA8IDMyOyBj bGFzcysrKSB7CisJCXN0cnVjdCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSAqY2k7CisJCXVu c2lnbmVkIGludCBjb3VudDsKKwkJdWludDMyX3QgY3R4OworCisJCWNpID0gbGlzdF9lbmdpbmVz KGk5MTUsIDF1IDw8IGNsYXNzLCAmY291bnQpOworCQlpZiAoIWNpKQorCQkJY29udGludWU7CisK KwkJY3R4ID0gbG9hZF9iYWxhbmNlcl9jcmVhdGUoaTkxNSwgY2ksIGNvdW50KTsKKworCQlmb3Ig KGludCBuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKKwkJCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhl Y2J1ZmZlcjIgZXhlY2J1ZiA9IHsKKwkJCQkuYnVmZmVyc19wdHIgPSB0b191c2VyX3BvaW50ZXIo JmJhdGNoKSwKKwkJCQkuYnVmZmVyX2NvdW50ID0gMSwKKwkJCQkuZmxhZ3MgPSBuICsgMSwKKwkJ CQkucnN2ZDEgPSBjdHgsCisJCQl9OworCQkJc3RydWN0IHRpbWVzcGVjIHR2ID0ge307CisJCQl1 bnNpZ25lZCBsb25nIG5vcHM7CisJCQlkb3VibGUgdDsKKworCQkJaWd0X25zZWNfZWxhcHNlZCgm dHYpOworCQkJbm9wcyA9IDA7CisJCQlkbyB7CisJCQkJZm9yIChpbnQgciA9IDA7IHIgPCAxMDI0 OyByKyspCisJCQkJCWdlbV9leGVjYnVmKGk5MTUsICZleGVjYnVmKTsKKwkJCQlub3BzICs9IDEw MjQ7CisJCQl9IHdoaWxlIChpZ3Rfc2Vjb25kc19lbGFwc2VkKCZ0dikgPCAyKTsKKwkJCWdlbV9z eW5jKGk5MTUsIGJhdGNoLmhhbmRsZSk7CisKKwkJCXQgPSBpZ3RfbnNlY19lbGFwc2VkKCZ0dikg KiAxZS0zIC8gbm9wczsKKwkJCWlndF9pbmZvKCIlczolZCAlLjNmdXNcbiIsIGNsYXNzX3RvX3N0 cihjbGFzcyksIG4sIHQpOworCQl9CisKKwkJeworCQkJc3RydWN0IGRybV9pOTE1X2dlbV9leGVj YnVmZmVyMiBleGVjYnVmID0geworCQkJCS5idWZmZXJzX3B0ciA9IHRvX3VzZXJfcG9pbnRlcigm YmF0Y2gpLAorCQkJCS5idWZmZXJfY291bnQgPSAxLAorCQkJCS5yc3ZkMSA9IGN0eCwKKwkJCX07 CisJCQlzdHJ1Y3QgdGltZXNwZWMgdHYgPSB7fTsKKwkJCXVuc2lnbmVkIGxvbmcgbm9wczsKKwkJ CWRvdWJsZSB0OworCisJCQlpZ3RfbnNlY19lbGFwc2VkKCZ0dik7CisJCQlub3BzID0gMDsKKwkJ CWRvIHsKKwkJCQlmb3IgKGludCByID0gMDsgciA8IDEwMjQ7IHIrKykKKwkJCQkJZ2VtX2V4ZWNi dWYoaTkxNSwgJmV4ZWNidWYpOworCQkJCW5vcHMgKz0gMTAyNDsKKwkJCX0gd2hpbGUgKGlndF9z ZWNvbmRzX2VsYXBzZWQoJnR2KSA8IDIpOworCQkJZ2VtX3N5bmMoaTkxNSwgYmF0Y2guaGFuZGxl KTsKKworCQkJdCA9IGlndF9uc2VjX2VsYXBzZWQoJnR2KSAqIDFlLTMgLyBub3BzOworCQkJaWd0 X2luZm8oIiVzOiogJS4zZnVzXG4iLCBjbGFzc190b19zdHIoY2xhc3MpLCB0KTsKKwkJfQorCisK KwkJaWd0X2ZvcmsoY2hpbGQsIGNvdW50KSB7CisJCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4ZWNi dWZmZXIyIGV4ZWNidWYgPSB7CisJCQkJLmJ1ZmZlcnNfcHRyID0gdG9fdXNlcl9wb2ludGVyKCZi YXRjaCksCisJCQkJLmJ1ZmZlcl9jb3VudCA9IDEsCisJCQkJLmZsYWdzID0gY2hpbGQgKyAxLAor CQkJCS5yc3ZkMSA9IGdlbV9jb250ZXh0X2Nsb25lKGk5MTUsIGN0eCwKKwkJCQkJCQkgICBJOTE1 X0NPTlRFWFRfQ0xPTkVfRU5HSU5FUywgMCksCisJCQl9OworCQkJc3RydWN0IHRpbWVzcGVjIHR2 ID0ge307CisJCQl1bnNpZ25lZCBsb25nIG5vcHM7CisJCQlkb3VibGUgdDsKKworCQkJaWd0X25z ZWNfZWxhcHNlZCgmdHYpOworCQkJbm9wcyA9IDA7CisJCQlkbyB7CisJCQkJZm9yIChpbnQgciA9 IDA7IHIgPCAxMDI0OyByKyspCisJCQkJCWdlbV9leGVjYnVmKGk5MTUsICZleGVjYnVmKTsKKwkJ CQlub3BzICs9IDEwMjQ7CisJCQl9IHdoaWxlIChpZ3Rfc2Vjb25kc19lbGFwc2VkKCZ0dikgPCAy KTsKKwkJCWdlbV9zeW5jKGk5MTUsIGJhdGNoLmhhbmRsZSk7CisKKwkJCXQgPSBpZ3RfbnNlY19l bGFwc2VkKCZ0dikgKiAxZS0zIC8gbm9wczsKKwkJCWlndF9pbmZvKCJbJWRdICVzOiVkICUuM2Z1 c1xuIiwKKwkJCQkgY2hpbGQsIGNsYXNzX3RvX3N0cihjbGFzcyksIGNoaWxkLCB0KTsKKworCQkJ bWVtc2V0KCZ0diwgMCwgc2l6ZW9mKHR2KSk7CisJCQlleGVjYnVmLmZsYWdzID0gMDsKKworCQkJ aWd0X25zZWNfZWxhcHNlZCgmdHYpOworCQkJbm9wcyA9IDA7CisJCQlkbyB7CisJCQkJZm9yIChp bnQgciA9IDA7IHIgPCAxMDI0OyByKyspCisJCQkJCWdlbV9leGVjYnVmKGk5MTUsICZleGVjYnVm KTsKKwkJCQlub3BzICs9IDEwMjQ7CisJCQl9IHdoaWxlIChpZ3Rfc2Vjb25kc19lbGFwc2VkKCZ0 dikgPCAyKTsKKwkJCWdlbV9zeW5jKGk5MTUsIGJhdGNoLmhhbmRsZSk7CisKKwkJCXQgPSBpZ3Rf bnNlY19lbGFwc2VkKCZ0dikgKiAxZS0zIC8gbm9wczsKKwkJCWlndF9pbmZvKCJbJWRdICVzOiog JS4zZnVzXG4iLAorCQkJCSBjaGlsZCwgY2xhc3NfdG9fc3RyKGNsYXNzKSwgdCk7CisKKwkJCWdl bV9jb250ZXh0X2Rlc3Ryb3koaTkxNSwgZXhlY2J1Zi5yc3ZkMSk7CisJCX0KKworCQlpZ3Rfd2Fp dGNoaWxkcmVuKCk7CisKKwkJZ2VtX2NvbnRleHRfZGVzdHJveShpOTE1LCBjdHgpOworCQlmcmVl KGNpKTsKKwl9CisKKwlnZW1fY2xvc2UoaTkxNSwgYmF0Y2guaGFuZGxlKTsKKwlnZW1fcXVpZXNj ZW50X2dwdShpOTE1KTsKK30KKworc3RhdGljIHZvaWQgcGluZyhpbnQgaTkxNSwgdWludDMyX3Qg Y3R4LCB1bnNpZ25lZCBpbnQgZW5naW5lKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19v YmplY3QyIG9iaiA9IHsKKwkJLmhhbmRsZSA9IGJhdGNoX2NyZWF0ZShpOTE1KSwKKwl9OworCXN0 cnVjdCBkcm1faTkxNV9nZW1fZXhlY2J1ZmZlcjIgZXhlY2J1ZiA9IHsKKwkJLmJ1ZmZlcnNfcHRy ID0gdG9fdXNlcl9wb2ludGVyKCZvYmopLAorCQkuYnVmZmVyX2NvdW50ID0gMSwKKwkJLmZsYWdz ID0gZW5naW5lLAorCQkucnN2ZDEgPSBjdHgsCisJfTsKKwlnZW1fZXhlY2J1ZihpOTE1LCAmZXhl Y2J1Zik7CisJZ2VtX3N5bmMoaTkxNSwgb2JqLmhhbmRsZSk7CisJZ2VtX2Nsb3NlKGk5MTUsIG9i ai5oYW5kbGUpOworfQorCitzdGF0aWMgdm9pZCBzZW1hcGhvcmUoaW50IGk5MTUpCit7CisJdWlu dDMyX3QgYmxvY2tbMl0sIHNjcmF0Y2g7CisJaWd0X3NwaW5fdCAqc3BpblszXTsKKworCS8qCisJ ICogSWYgd2UgYXJlIHVzaW5nIEhXIHNlbWFwaG9yZXMgdG8gbGF1bmNoIHNlcmlhbGlzZWQgcmVx dWVzdHMKKwkgKiBvbiBkaWZmZXJlbnQgZW5naW5lIGNvbmN1cnJlbnRseSwgd2Ugd2FudCB0byB2 ZXJpZnkgdGhhdCByZWFsCisJICogd29yayBpcyB1bmltcGVkZWQuCisJICovCisJaWd0X3JlcXVp cmUoZ2VtX3NjaGVkdWxlcl9oYXNfcHJlZW1wdGlvbihpOTE1KSk7CisKKwlibG9ja1swXSA9IGdl bV9jb250ZXh0X2NyZWF0ZShpOTE1KTsKKwlibG9ja1sxXSA9IGdlbV9jb250ZXh0X2NyZWF0ZShp OTE1KTsKKworCXNjcmF0Y2ggPSBnZW1fY3JlYXRlKGk5MTUsIDQwOTYpOworCXNwaW5bMl0gPSBp Z3Rfc3Bpbl9uZXcoaTkxNSwgLmRlcGVuZGVuY3kgPSBzY3JhdGNoKTsKKwlmb3IgKGludCBjbGFz cyA9IDE7IGNsYXNzIDwgMzI7IGNsYXNzKyspIHsKKwkJc3RydWN0IGk5MTVfZW5naW5lX2NsYXNz X2luc3RhbmNlICpjaTsKKwkJdW5zaWduZWQgaW50IGNvdW50OworCQl1aW50MzJfdCB2aXA7CisK KwkJY2kgPSBsaXN0X2VuZ2luZXMoaTkxNSwgMXUgPDwgY2xhc3MsICZjb3VudCk7CisJCWlmICgh Y2kpCisJCQljb250aW51ZTsKKworCQlpZiAoY291bnQgPCBBUlJBWV9TSVpFKGJsb2NrKSkKKwkJ CWNvbnRpbnVlOworCisJCS8qIEVuc3VyZSB0aGF0IHdlIGNvbXBsZXRlbHkgb2NjdXB5IGFsbCBl bmdpbmVzIGluIHRoaXMgZ3JvdXAgKi8KKwkJY291bnQgPSBBUlJBWV9TSVpFKGJsb2NrKTsKKwor CQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCXNldF9sb2FkX2JhbGFuY2Vy KGk5MTUsIGJsb2NrW2ldLCBjaSwgY291bnQpOworCQkJc3BpbltpXSA9IF9faWd0X3NwaW5fbmV3 KGk5MTUsCisJCQkJCQkgLmN0eCA9IGJsb2NrW2ldLAorCQkJCQkJIC5kZXBlbmRlbmN5ID0gc2Ny YXRjaCk7CisJCX0KKworCQkvKgorCQkgKiBFaXRoZXIgd2UgaGF2ZW4ndCBibG9ja2VkIGJvdGgg ZW5naW5lcyB3aXRoIHNlbWFwaG9yZXMsCisJCSAqIG9yIHdlIGxldCB0aGUgdmlwIHRocm91Z2gu IElmIG5vdCwgd2UgaGFuZy4KKwkJICovCisJCXZpcCA9IGdlbV9jb250ZXh0X2NyZWF0ZShpOTE1 KTsKKwkJc2V0X2xvYWRfYmFsYW5jZXIoaTkxNSwgdmlwLCBjaSwgY291bnQpOworCQlwaW5nKGk5 MTUsIHZpcCwgMCk7CisJCWdlbV9jb250ZXh0X2Rlc3Ryb3koaTkxNSwgdmlwKTsKKworCQlmb3Ig KGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQlpZ3Rfc3Bpbl9mcmVlKGk5MTUsIHNwaW5b aV0pOworCisJCWZyZWUoY2kpOworCX0KKwlpZ3Rfc3Bpbl9mcmVlKGk5MTUsIHNwaW5bMl0pOwor CWdlbV9jbG9zZShpOTE1LCBzY3JhdGNoKTsKKworCWdlbV9jb250ZXh0X2Rlc3Ryb3koaTkxNSwg YmxvY2tbMV0pOworCWdlbV9jb250ZXh0X2Rlc3Ryb3koaTkxNSwgYmxvY2tbMF0pOworCisJZ2Vt X3F1aWVzY2VudF9ncHUoaTkxNSk7Cit9CisKK3N0YXRpYyB2b2lkIHNtb2tldGVzdChpbnQgaTkx NSwgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9leGVjX29iamVjdDIgYmF0 Y2hbMl0gPSB7CisJCXsgLmhhbmRsZSA9IF9fYmF0Y2hfY3JlYXRlKGk5MTUsIDE2MzgwKSB9CisJ fTsKKwl1bnNpZ25lZCBpbnQgbmNvbnRleHQgPSAwOworCXVpbnQzMl90ICpjb250ZXh0cyA9IE5V TEw7CisJdWludDMyX3QgKmhhbmRsZXMgPSBOVUxMOworCisJaWd0X3JlcXVpcmVfc3dfc3luYygp OworCisJZm9yIChpbnQgY2xhc3MgPSAwOyBjbGFzcyA8IDMyOyBjbGFzcysrKSB7CisJCXN0cnVj dCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSAqY2k7CisJCXVuc2lnbmVkIGludCBjb3VudCA9 IDA7CisKKwkJY2kgPSBsaXN0X2VuZ2luZXMoaTkxNSwgMXUgPDwgY2xhc3MsICZjb3VudCk7CisJ CWlmICghY2kgfHwgY291bnQgPCAyKSB7CisJCQlmcmVlKGNpKTsKKwkJCWNvbnRpbnVlOworCQl9 CisKKwkJbmNvbnRleHQgKz0gMTI4OworCQljb250ZXh0cyA9IHJlYWxsb2MoY29udGV4dHMsIHNp emVvZigqY29udGV4dHMpICogbmNvbnRleHQpOworCQlpZ3RfYXNzZXJ0KGNvbnRleHRzKTsKKwor CQlmb3IgKHVuc2lnbmVkIGludCBuID0gbmNvbnRleHQgLSAxMjg7IG4gPCBuY29udGV4dDsgbisr KSB7CisJCQljb250ZXh0c1tuXSA9IGxvYWRfYmFsYW5jZXJfY3JlYXRlKGk5MTUsIGNpLCBjb3Vu dCk7CisJCQlpZ3RfYXNzZXJ0KGNvbnRleHRzW25dKTsKKwkJfQorCisJCWZyZWUoY2kpOworCX0K KwlpZ3RfZGVidWcoIkNyZWF0ZWQgJWQgdmlydHVhbCBlbmdpbmVzIChvbmUgcGVyIGNvbnRleHQp XG4iLCBuY29udGV4dCk7CisJaWd0X3JlcXVpcmUobmNvbnRleHQpOworCisJY29udGV4dHMgPSBy ZWFsbG9jKGNvbnRleHRzLCBzaXplb2YoKmNvbnRleHRzKSAqIG5jb250ZXh0ICogNCk7CisJaWd0 X2Fzc2VydChjb250ZXh0cyk7CisJbWVtY3B5KGNvbnRleHRzICsgbmNvbnRleHQsIGNvbnRleHRz LCBuY29udGV4dCAqIHNpemVvZigqY29udGV4dHMpKTsKKwluY29udGV4dCAqPSAyOworCW1lbWNw eShjb250ZXh0cyArIG5jb250ZXh0LCBjb250ZXh0cywgbmNvbnRleHQgKiBzaXplb2YoKmNvbnRl eHRzKSk7CisJbmNvbnRleHQgKj0gMjsKKworCWhhbmRsZXMgPSBtYWxsb2Moc2l6ZW9mKCpoYW5k bGVzKSAqIG5jb250ZXh0KTsKKwlpZ3RfYXNzZXJ0KGhhbmRsZXMpOworCWZvciAodW5zaWduZWQg aW50IG4gPSAwOyBuIDwgbmNvbnRleHQ7IG4rKykKKwkJaGFuZGxlc1tuXSA9IGdlbV9jcmVhdGUo aTkxNSwgNDA5Nik7CisKKwlpZ3RfdW50aWxfdGltZW91dCh0aW1lb3V0KSB7CisJCXVuc2lnbmVk IGludCBjb3VudCA9IDEgKyAocmFuZCgpICUgKG5jb250ZXh0IC0gMSkpOworCQlJR1RfQ09SS19G RU5DRShjb3JrKTsKKwkJaW50IGZlbmNlID0gaWd0X2NvcmtfcGx1ZygmY29yaywgaTkxNSk7CisK KwkJZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCBjb3VudDsgbisrKSB7CisJCQlzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX2V4ZWNidWZmZXIyIGViID0geworCQkJCS5idWZmZXJzX3B0ciA9IHRvX3Vz ZXJfcG9pbnRlcihiYXRjaCksCisJCQkJLmJ1ZmZlcl9jb3VudCA9IEFSUkFZX1NJWkUoYmF0Y2gp LAorCQkJCS5yc3ZkMSA9IGNvbnRleHRzW25dLAorCQkJCS5yc3ZkMiA9IGZlbmNlLAorCQkJCS5m bGFncyA9IEk5MTVfRVhFQ19CQVRDSF9GSVJTVCB8IEk5MTVfRVhFQ19GRU5DRV9JTiwKKwkJCX07 CisJCQliYXRjaFsxXS5oYW5kbGUgPSBoYW5kbGVzW25dOworCQkJZ2VtX2V4ZWNidWYoaTkxNSwg JmViKTsKKwkJfQorCQlpZ3RfcGVybXV0ZV9hcnJheShoYW5kbGVzLCBjb3VudCwgaWd0X2V4Y2hh bmdlX2ludCk7CisKKwkJaWd0X2NvcmtfdW5wbHVnKCZjb3JrKTsKKwkJZm9yICh1bnNpZ25lZCBp bnQgbiA9IDA7IG4gPCBjb3VudDsgbisrKQorCQkJZ2VtX3N5bmMoaTkxNSwgaGFuZGxlc1tuXSk7 CisKKwkJY2xvc2UoZmVuY2UpOworCX0KKworCWZvciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwg bmNvbnRleHQ7IG4rKykgeworCQlnZW1fY2xvc2UoaTkxNSwgaGFuZGxlc1tuXSk7CisJCV9fZ2Vt X2NvbnRleHRfZGVzdHJveShpOTE1LCBjb250ZXh0c1tuXSk7CisJfQorCWZyZWUoaGFuZGxlcyk7 CisJZnJlZShjb250ZXh0cyk7CisJZ2VtX2Nsb3NlKGk5MTUsIGJhdGNoWzBdLmhhbmRsZSk7Cit9 CisKK3N0YXRpYyBib29sIGhhc19jb250ZXh0X2VuZ2luZXMoaW50IGk5MTUpCit7CisJc3RydWN0 IGRybV9pOTE1X2dlbV9jb250ZXh0X3BhcmFtIHAgPSB7CisJCS5wYXJhbSA9IEk5MTVfQ09OVEVY VF9QQVJBTV9FTkdJTkVTLAorCX07CisKKwlyZXR1cm4gX19nZW1fY29udGV4dF9zZXRfcGFyYW0o aTkxNSwgJnApID09IDA7Cit9CisKK3N0YXRpYyBib29sIGhhc19sb2FkX2JhbGFuY2VyKGludCBp OTE1KQoreworCXN0cnVjdCBpOTE1X2VuZ2luZV9jbGFzc19pbnN0YW5jZSBjaSA9IHt9OworCXVp bnQzMl90IGN0eDsKKwlpbnQgZXJyOworCisJY3R4ID0gZ2VtX2NvbnRleHRfY3JlYXRlKGk5MTUp OworCWVyciA9IF9fc2V0X2xvYWRfYmFsYW5jZXIoaTkxNSwgY3R4LCAmY2ksIDEpOworCWdlbV9j b250ZXh0X2Rlc3Ryb3koaTkxNSwgY3R4KTsKKworCXJldHVybiBlcnIgPT0gMDsKK30KKworaWd0 X21haW4KK3sKKwlpbnQgaTkxNSA9IC0xOworCisJaWd0X3NraXBfb25fc2ltdWxhdGlvbigpOwor CisJaWd0X2ZpeHR1cmUgeworCQlpOTE1ID0gZHJtX29wZW5fZHJpdmVyKERSSVZFUl9JTlRFTCk7 CisJCWlndF9yZXF1aXJlX2dlbShpOTE1KTsKKworCQlnZW1fcmVxdWlyZV9jb250ZXh0cyhpOTE1 KTsKKwkJaWd0X3JlcXVpcmUoaGFzX2NvbnRleHRfZW5naW5lcyhpOTE1KSk7CisJCWlndF9yZXF1 aXJlKGhhc19sb2FkX2JhbGFuY2VyKGk5MTUpKTsKKworCQlpZ3RfZm9ya19oYW5nX2RldGVjdG9y KGk5MTUpOworCX0KKworCWlndF9zdWJ0ZXN0KCJpbnZhbGlkLWJhbGFuY2VyIikKKwkJaW52YWxp ZF9iYWxhbmNlcihpOTE1KTsKKworCWlndF9zdWJ0ZXN0KCJpbmRpdmlkdWFsIikKKwkJaW5kaXZp ZHVhbChpOTE1KTsKKworCWlndF9zdWJ0ZXN0KCJpbmRpY2VzIikKKwkJaW5kaWNlcyhpOTE1KTsK KworCWlndF9zdWJ0ZXN0KCJidXN5IikKKwkJYnVzeShpOTE1KTsKKworCWlndF9zdWJ0ZXN0X2dy b3VwIHsKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCQljb25zdCBjaGFyICpuYW1lOworCQkJ dW5zaWduZWQgaW50IGZsYWdzOworCQl9IHBoYXNlc1tdID0geworCQkJeyAiIiwgMCB9LAorCQkJ eyAiLXB1bHNlIiwgUFVMU0UgfSwKKwkJCXsgIi1sYXRlIiwgTEFURSB9LAorCQkJeyAiLWxhdGUt cHVsc2UiLCBQVUxTRSB8IExBVEUgfSwKKwkJCXsgfQorCQl9OworCQlmb3IgKHR5cGVvZigqcGhh c2VzKSAqcCA9IHBoYXNlczsgcC0+bmFtZTsgcCsrKQorCQkJaWd0X3N1YnRlc3RfZigiZnVsbCVz IiwgcC0+bmFtZSkKKwkJCQlmdWxsKGk5MTUsIHAtPmZsYWdzKTsKKwl9CisKKwlpZ3Rfc3VidGVz dCgibm9wIikKKwkJbm9wKGk5MTUpOworCisJaWd0X3N1YnRlc3QoInNlbWFwaG9yZSIpCisJCXNl bWFwaG9yZShpOTE1KTsKKworCWlndF9zdWJ0ZXN0KCJzbW9rZSIpCisJCXNtb2tldGVzdChpOTE1 LCAyMCk7CisKKwlpZ3RfZml4dHVyZSB7CisJCWlndF9zdG9wX2hhbmdfZGV0ZWN0b3IoKTsKKwl9 Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZXNvbi5idWlsZCBiL3Rlc3RzL21lc29uLmJ1aWxkCmlu ZGV4IGI3ZTU2MTAzZC4uMjAzNjZiNjhiIDEwMDY0NAotLS0gYS90ZXN0cy9tZXNvbi5idWlsZAor KysgYi90ZXN0cy9tZXNvbi5idWlsZApAQCAtMjkzLDYgKzI5MywxMyBAQCB0ZXN0X2V4ZWN1dGFi bGVzICs9IGV4ZWN1dGFibGUoJ2dlbV9laW8nLAogCSAgIGluc3RhbGwgOiB0cnVlKQogdGVzdF9s aXN0ICs9ICdnZW1fZWlvJwogCit0ZXN0X2V4ZWN1dGFibGVzICs9IGV4ZWN1dGFibGUoJ2dlbV9l eGVjX2JhbGFuY2VyJywgJ2k5MTUvZ2VtX2V4ZWNfYmFsYW5jZXIuYycsCisJICAgZGVwZW5kZW5j aWVzIDogdGVzdF9kZXBzICsgWyBsaWJfaWd0X3BlcmYgXSwKKwkgICBpbnN0YWxsX2RpciA6IGxp YmV4ZWNkaXIsCisJICAgaW5zdGFsbF9ycGF0aCA6IGxpYmV4ZWNkaXJfcnBhdGhkaXIsCisJICAg aW5zdGFsbCA6IHRydWUpCit0ZXN0X3Byb2dzICs9ICdnZW1fZXhlY19iYWxhbmNlcicKKwogdGVz dF9leGVjdXRhYmxlcyArPSBleGVjdXRhYmxlKCdnZW1fbW9jc19zZXR0aW5ncycsCiAJICAgam9p bl9wYXRocygnaTkxNScsICdnZW1fbW9jc19zZXR0aW5ncy5jJyksCiAJICAgZGVwZW5kZW5jaWVz IDogdGVzdF9kZXBzICsgWyBsaWJfaWd0X3BlcmYgXSwKLS0gCjIuMjAuMQoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KaWd0LWRldiBtYWlsaW5nIGxpc3QK aWd0LWRldkBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9pZ3QtZGV2