From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH 26/29] xl: split out vm lifecycle control functions Date: Fri, 24 Feb 2017 16:13:11 +0000 Message-ID: <20170224161314.22154-27-wei.liu2@citrix.com> References: <20170224161314.22154-1-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1chIY4-00070J-9R for xen-devel@lists.xenproject.org; Fri, 24 Feb 2017 16:16:48 +0000 In-Reply-To: <20170224161314.22154-1-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Xen-devel Cc: Wei Liu , Ian Jackson List-Id: xen-devel@lists.xenproject.org SW5jbHVkaW5nIGNyZWF0ZSwgcmVib290LCBzaHV0ZG93biwgcGF1c2UsIHVucGF1c2UgYW5kIGRl c3Ryb3kuCgpMaWZ0IGEgYnVuY2ggb2YgY29yZSBkYXRhIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9u IGRlY2xhcmF0aW9ucyB0byB4bC5oCmJlY2F1c2UgdGhleSBhcmUgbmVlZGVkIGluIGJvdGggeGxf Y21kaW1wbC5jIGFuZCB4bF92bWNvbnRyb2wuYy4KClNpZ25lZC1vZmYtYnk6IFdlaSBMaXUgPHdl aS5saXUyQGNpdHJpeC5jb20+Ci0tLQogdG9vbHMveGwvTWFrZWZpbGUgICAgICAgfCAgICAxICsK IHRvb2xzL3hsL3hsLmggICAgICAgICAgIHwgICA2NyArKysKIHRvb2xzL3hsL3hsX2NtZGltcGwu YyAgIHwgMTI0MyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQogdG9vbHMveGwveGxfdm1jb250cm9sLmMgfCAxMjI1ICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgMTI5MyBpbnNlcnRpb25z KCspLCAxMjQzIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHRvb2xzL3hsL3hsX3Zt Y29udHJvbC5jCgpkaWZmIC0tZ2l0IGEvdG9vbHMveGwvTWFrZWZpbGUgYi90b29scy94bC9NYWtl ZmlsZQppbmRleCAzZTgzNjFiMTIxLi4wZjk2NjY4NGJlIDEwMDY0NAotLS0gYS90b29scy94bC9N YWtlZmlsZQorKysgYi90b29scy94bC9NYWtlZmlsZQpAQCAtMjAsNiArMjAsNyBAQCBYTF9PQkpT ICs9IHhsX3RtZW0ubyB4bF9wYXJzZS5vIHhsX2NwdXBvb2wubyB4bF9mbGFzay5vCiBYTF9PQkpT ICs9IHhsX3Z0cG0ubyB4bF9ibG9jay5vIHhsX25pYy5vIHhsX3VzYi5vCiBYTF9PQkpTICs9IHhs X3NjaGVkLm8geGxfcGNpLm8geGxfdmNwdS5vIHhsX2NkLm8geGxfbWVtLm8KIFhMX09CSlMgKz0g eGxfcHNyLm8geGxfaW5mby5vIHhsX2NvbnNvbGUubyB4bF9taXNjLm8KK1hMX09CSlMgKz0geGxf dm1jb250cm9sLm8KIAogJChYTF9PQkpTKTogQ0ZMQUdTICs9ICQoQ0ZMQUdTX2xpYnhlbnRvb2xs b2cpCiAkKFhMX09CSlMpOiBDRkxBR1MgKz0gJChDRkxBR1NfWEwpCmRpZmYgLS1naXQgYS90b29s cy94bC94bC5oIGIvdG9vbHMveGwveGwuaAppbmRleCBhOGI2MjY0YzU5Li42MmQwMTAwNzZiIDEw MDY0NAotLS0gYS90b29scy94bC94bC5oCisrKyBiL3Rvb2xzL3hsL3hsLmgKQEAgLTMwLDYgKzMw LDczIEBAIHN0cnVjdCBjbWRfc3BlYyB7CiAgICAgY2hhciAqY21kX29wdGlvbjsKIH07CiAKK3N0 cnVjdCBkb21haW5fY3JlYXRlIHsKKyAgICBpbnQgZGVidWc7CisgICAgaW50IGRhZW1vbml6ZTsK KyAgICBpbnQgbW9uaXRvcjsgLyogaGFuZGxlIGd1ZXN0IHJlYm9vdHMgZXRjICovCisgICAgaW50 IHBhdXNlZDsKKyAgICBpbnQgZHJ5cnVuOworICAgIGludCBxdWlldDsKKyAgICBpbnQgdm5jOwor ICAgIGludCB2bmNhdXRvcGFzczsKKyAgICBpbnQgY29uc29sZV9hdXRvY29ubmVjdDsKKyAgICBp bnQgY2hlY2twb2ludGVkX3N0cmVhbTsKKyAgICBjb25zdCBjaGFyICpjb25maWdfZmlsZTsKKyAg ICBjaGFyICpleHRyYV9jb25maWc7IC8qIGV4dHJhIGNvbmZpZyBzdHJpbmcgKi8KKyAgICBjb25z dCBjaGFyICpyZXN0b3JlX2ZpbGU7CisgICAgY2hhciAqY29sb19wcm94eV9zY3JpcHQ7CisgICAg aW50IG1pZ3JhdGVfZmQ7IC8qIC0xIG1lYW5zIG5vbmUgKi8KKyAgICBpbnQgc2VuZF9iYWNrX2Zk OyAvKiAtMSBtZWFucyBub25lICovCisgICAgY2hhciAqKm1pZ3JhdGlvbl9kb21uYW1lX3I7IC8q IGZyb20gbWFsbG9jICovCit9OworCitpbnQgY3JlYXRlX2RvbWFpbihzdHJ1Y3QgZG9tYWluX2Ny ZWF0ZSAqZG9tX2luZm8pOworCisKK3N0YXRpYyBjb25zdCBjaGFyIHNhdmVmaWxlaGVhZGVyX21h Z2ljWzMyXT0KKyAgICAiWGVuIHNhdmVkIGRvbWFpbiwgeGwgZm9ybWF0XG4gXDAgXHIiOworCisj aWZuZGVmIExJQlhMX0hBVkVfTk9fU1VTUEVORF9SRVNVTUUKK3N0YXRpYyBjb25zdCBjaGFyIG1p Z3JhdGVfcmVjZWl2ZXJfYmFubmVyW109CisgICAgInhsIG1pZ3JhdGlvbiByZWNlaXZlciByZWFk eSwgc2VuZCBiaW5hcnkgZG9tYWluIGRhdGEuXG4iOworc3RhdGljIGNvbnN0IGNoYXIgbWlncmF0 ZV9yZWNlaXZlcl9yZWFkeVtdPQorICAgICJkb21haW4gcmVjZWl2ZWQsIHJlYWR5IHRvIHVucGF1 c2UiOworc3RhdGljIGNvbnN0IGNoYXIgbWlncmF0ZV9wZXJtaXNzaW9uX3RvX2dvW109CisgICAg ImRvbWFpbiBpcyB5b3VycywgeW91IGFyZSBjbGVhcmVkIHRvIHVucGF1c2UiOworc3RhdGljIGNv bnN0IGNoYXIgbWlncmF0ZV9yZXBvcnRbXT0KKyAgICAibXkgY29weSB1bnBhdXNlIHJlc3VsdHMg YXJlIGFzIGZvbGxvd3MiOworI2VuZGlmCisKKyAgLyogZm9sbG93ZWQgYnkgb25lIGJ5dGU6Cisg ICAqICAgICAwOiBldmVyeXRoaW5nIHdlbnQgd2VsbCwgZG9tYWluIGlzIHJ1bm5pbmcKKyAgICog ICAgICAgICAgICBuZXh0IHRoaW5nIGlzIHdlIGFsbCBleGl0CisgICAqIG5vbi0wOiB0aGluZ3Mg d2VudCBiYWRseQorICAgKiAgICAgICAgICAgIG5leHQgdGhpbmcgc2hvdWxkIGJlIGEgbWlncmF0 ZV9wZXJtaXNzaW9uX3RvX2dvCisgICAqICAgICAgICAgICAgZnJvbSB0YXJnZXQgdG8gc291cmNl CisgICAqLworCisjZGVmaW5lIFhMX01BTkRBVE9SWV9GTEFHX0pTT04gKDFVIDw8IDApIC8qIGNv bmZpZyBkYXRhIGlzIGluIEpTT04gZm9ybWF0ICovCisjZGVmaW5lIFhMX01BTkRBVE9SWV9GTEFH X1NUUkVBTXYyICgxVSA8PCAxKSAvKiBzdHJlYW0gaXMgdjIgKi8KKyNkZWZpbmUgWExfTUFOREFU T1JZX0ZMQUdfQUxMICAoWExfTUFOREFUT1JZX0ZMQUdfSlNPTiB8ICAgICAgICBcCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFhMX01BTkRBVE9SWV9GTEFHX1NUUkVBTXYyKQorCitz dHJ1Y3Qgc2F2ZV9maWxlX2hlYWRlciB7CisgICAgY2hhciBtYWdpY1szMl07IC8qIHNhdmVmaWxl aGVhZGVyX21hZ2ljICovCisgICAgLyogQWxsIHVpbnQzMl90cyBhcmUgaW4gZG9tYWluJ3MgYnl0 ZSBvcmRlci4gKi8KKyAgICB1aW50MzJfdCBieXRlb3JkZXI7IC8qIFNBVkVGSUxFX0JZVEVPUkRF Ul9WQUxVRSAqLworICAgIHVpbnQzMl90IG1hbmRhdG9yeV9mbGFnczsgLyogdW5rbm93biBmbGFn cyA9PiByZWplY3QgcmVzdG9yZSAqLworICAgIHVpbnQzMl90IG9wdGlvbmFsX2ZsYWdzOyAvKiB1 bmtub3duIGZsYWdzID0+IHJlamVjdCByZXN0b3JlICovCisgICAgdWludDMyX3Qgb3B0aW9uYWxf ZGF0YV9sZW47IC8qIHNraXAsIG9yIHNraXAgdGFpbCwgaWYgbm90IHVuZGVyc3Rvb2QgKi8KK307 CisKKy8qIE9wdGlvbmFsIGRhdGEsIGluIG9yZGVyOgorICogICA0IGJ5dGVzIHVpbnQzMl90ICBj b25maWcgZmlsZSBzaXplCisgKiAgIG4gYnl0ZXMgICAgICAgICAgIGNvbmZpZyBmaWxlIGluIFVu aXggdGV4dCBmaWxlIGZvcm1hdAorICovCisKKyNkZWZpbmUgU0FWRUZJTEVfQllURU9SREVSX1ZB TFVFICgodWludDMyX3QpMHgwMTAyMDMwNFVMKQorCisKIC8qCiAgKiBUaGUgeGwgcHJvY2VzcyBz aG91bGQgYWx3YXlzIHJldHVybiBlaXRoZXIgRVhJVF9TVUNDRVNTIG9yCiAgKiBFWElUX0ZBSUxV UkUuIG1haW5fKiBmdW5jdGlvbnMsIGltcGxlbWVudGluZyB0aGUgdmFyaW91cyB4bApkaWZmIC0t Z2l0IGEvdG9vbHMveGwveGxfY21kaW1wbC5jIGIvdG9vbHMveGwveGxfY21kaW1wbC5jCmluZGV4 IDc4NTFmYzAzZDQuLmIzYTE3ZDVmYTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3hsL3hsX2NtZGltcGwu YworKysgYi90b29scy94bC94bF9jbWRpbXBsLmMKQEAgLTQ5LDcwICs0OSw2IEBAIGxpYnhsX2N0 eCAqY3R4OwogeGxjaGlsZCBjaGlsZHJlbltjaGlsZF9tYXhdOwogCiBjb25zdCBjaGFyICpjb21t b25fZG9tbmFtZTsKLXN0YXRpYyBpbnQgZmRfbG9jayA9IC0xOwotCi1zdGF0aWMgY29uc3QgY2hh ciBzYXZlZmlsZWhlYWRlcl9tYWdpY1szMl09Ci0gICAgIlhlbiBzYXZlZCBkb21haW4sIHhsIGZv cm1hdFxuIFwwIFxyIjsKLQotI2lmbmRlZiBMSUJYTF9IQVZFX05PX1NVU1BFTkRfUkVTVU1FCi1z dGF0aWMgY29uc3QgY2hhciBtaWdyYXRlX3JlY2VpdmVyX2Jhbm5lcltdPQotICAgICJ4bCBtaWdy YXRpb24gcmVjZWl2ZXIgcmVhZHksIHNlbmQgYmluYXJ5IGRvbWFpbiBkYXRhLlxuIjsKLXN0YXRp YyBjb25zdCBjaGFyIG1pZ3JhdGVfcmVjZWl2ZXJfcmVhZHlbXT0KLSAgICAiZG9tYWluIHJlY2Vp dmVkLCByZWFkeSB0byB1bnBhdXNlIjsKLXN0YXRpYyBjb25zdCBjaGFyIG1pZ3JhdGVfcGVybWlz c2lvbl90b19nb1tdPQotICAgICJkb21haW4gaXMgeW91cnMsIHlvdSBhcmUgY2xlYXJlZCB0byB1 bnBhdXNlIjsKLXN0YXRpYyBjb25zdCBjaGFyIG1pZ3JhdGVfcmVwb3J0W109Ci0gICAgIm15IGNv cHkgdW5wYXVzZSByZXN1bHRzIGFyZSBhcyBmb2xsb3dzIjsKLSNlbmRpZgotCi0gIC8qIGZvbGxv d2VkIGJ5IG9uZSBieXRlOgotICAgKiAgICAgMDogZXZlcnl0aGluZyB3ZW50IHdlbGwsIGRvbWFp biBpcyBydW5uaW5nCi0gICAqICAgICAgICAgICAgbmV4dCB0aGluZyBpcyB3ZSBhbGwgZXhpdAot ICAgKiBub24tMDogdGhpbmdzIHdlbnQgYmFkbHkKLSAgICogICAgICAgICAgICBuZXh0IHRoaW5n IHNob3VsZCBiZSBhIG1pZ3JhdGVfcGVybWlzc2lvbl90b19nbwotICAgKiAgICAgICAgICAgIGZy b20gdGFyZ2V0IHRvIHNvdXJjZQotICAgKi8KLQotI2RlZmluZSBYTF9NQU5EQVRPUllfRkxBR19K U09OICgxVSA8PCAwKSAvKiBjb25maWcgZGF0YSBpcyBpbiBKU09OIGZvcm1hdCAqLwotI2RlZmlu ZSBYTF9NQU5EQVRPUllfRkxBR19TVFJFQU12MiAoMVUgPDwgMSkgLyogc3RyZWFtIGlzIHYyICov Ci0jZGVmaW5lIFhMX01BTkRBVE9SWV9GTEFHX0FMTCAgKFhMX01BTkRBVE9SWV9GTEFHX0pTT04g fCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTF9NQU5EQVRPUllf RkxBR19TVFJFQU12MikKLQotc3RydWN0IHNhdmVfZmlsZV9oZWFkZXIgewotICAgIGNoYXIgbWFn aWNbMzJdOyAvKiBzYXZlZmlsZWhlYWRlcl9tYWdpYyAqLwotICAgIC8qIEFsbCB1aW50MzJfdHMg YXJlIGluIGRvbWFpbidzIGJ5dGUgb3JkZXIuICovCi0gICAgdWludDMyX3QgYnl0ZW9yZGVyOyAv KiBTQVZFRklMRV9CWVRFT1JERVJfVkFMVUUgKi8KLSAgICB1aW50MzJfdCBtYW5kYXRvcnlfZmxh Z3M7IC8qIHVua25vd24gZmxhZ3MgPT4gcmVqZWN0IHJlc3RvcmUgKi8KLSAgICB1aW50MzJfdCBv cHRpb25hbF9mbGFnczsgLyogdW5rbm93biBmbGFncyA9PiByZWplY3QgcmVzdG9yZSAqLwotICAg IHVpbnQzMl90IG9wdGlvbmFsX2RhdGFfbGVuOyAvKiBza2lwLCBvciBza2lwIHRhaWwsIGlmIG5v dCB1bmRlcnN0b29kICovCi19OwotCi0vKiBPcHRpb25hbCBkYXRhLCBpbiBvcmRlcjoKLSAqICAg NCBieXRlcyB1aW50MzJfdCAgY29uZmlnIGZpbGUgc2l6ZQotICogICBuIGJ5dGVzICAgICAgICAg ICBjb25maWcgZmlsZSBpbiBVbml4IHRleHQgZmlsZSBmb3JtYXQKLSAqLwotCi0jZGVmaW5lIFNB VkVGSUxFX0JZVEVPUkRFUl9WQUxVRSAoKHVpbnQzMl90KTB4MDEwMjAzMDRVTCkKLQotc3RydWN0 IGRvbWFpbl9jcmVhdGUgewotICAgIGludCBkZWJ1ZzsKLSAgICBpbnQgZGFlbW9uaXplOwotICAg IGludCBtb25pdG9yOyAvKiBoYW5kbGUgZ3Vlc3QgcmVib290cyBldGMgKi8KLSAgICBpbnQgcGF1 c2VkOwotICAgIGludCBkcnlydW47Ci0gICAgaW50IHF1aWV0OwotICAgIGludCB2bmM7Ci0gICAg aW50IHZuY2F1dG9wYXNzOwotICAgIGludCBjb25zb2xlX2F1dG9jb25uZWN0OwotICAgIGludCBj aGVja3BvaW50ZWRfc3RyZWFtOwotICAgIGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlOwotICAgIGNo YXIgKmV4dHJhX2NvbmZpZzsgLyogZXh0cmEgY29uZmlnIHN0cmluZyAqLwotICAgIGNvbnN0IGNo YXIgKnJlc3RvcmVfZmlsZTsKLSAgICBjaGFyICpjb2xvX3Byb3h5X3NjcmlwdDsKLSAgICBpbnQg bWlncmF0ZV9mZDsgLyogLTEgbWVhbnMgbm9uZSAqLwotICAgIGludCBzZW5kX2JhY2tfZmQ7IC8q IC0xIG1lYW5zIG5vbmUgKi8KLSAgICBjaGFyICoqbWlncmF0aW9uX2RvbW5hbWVfcjsgLyogZnJv bSBtYWxsb2MgKi8KLX07CiAKIGludCBjaGlsZF9yZXBvcnQoeGxjaGlsZG51bSBjaGlsZCkKIHsK QEAgLTEzMCw4NDcgKzY2LDYgQEAgaW50IGNoaWxkX3JlcG9ydCh4bGNoaWxkbnVtIGNoaWxkKQog ICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29uc29sZV9jaGlsZF9yZXBvcnQoeGxjaGlsZG51bSBj aGlsZCkKLXsKLSAgICBpZiAoeGxfY2hpbGRfcGlkKGNoaWxkKSkKLSAgICAgICAgY2hpbGRfcmVw b3J0KGNoaWxkKTsKLX0KLQotc3RhdGljIGludCB2bmN2aWV3ZXIodWludDMyX3QgZG9taWQsIGlu dCBhdXRvcGFzcykKLXsKLSAgICBsaWJ4bF92bmN2aWV3ZXJfZXhlYyhjdHgsIGRvbWlkLCBhdXRv cGFzcyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZXhlY3V0ZSB2bmN2aWV3ZXJc biIpOwotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBhdXRvY29ubmVjdF92bmN2aWV3 ZXIodWludDMyX3QgZG9taWQsIGludCBhdXRvcGFzcykKLXsKLSAgIGNvbnNvbGVfY2hpbGRfcmVw b3J0KGNoaWxkX3ZuY3ZpZXdlcik7Ci0KLSAgICBwaWRfdCBwaWQgPSB4bF9mb3JrKGNoaWxkX3Zu Y3ZpZXdlciwgInZuY3ZpZXdlciBjaGlsZCIpOwotICAgIGlmIChwaWQpCi0gICAgICAgIHJldHVy bjsKLQotICAgIHBvc3Rmb3JrKCk7Ci0KLSAgICBzbGVlcCgxKTsKLSAgICB2bmN2aWV3ZXIoZG9t aWQsIGF1dG9wYXNzKTsKLSAgICBfZXhpdChFWElUX0ZBSUxVUkUpOwotfQotCi1zdGF0aWMgaW50 IGFjcXVpcmVfbG9jayh2b2lkKQotewotICAgIGludCByYzsKLSAgICBzdHJ1Y3QgZmxvY2sgZmw7 Ci0KLSAgICAvKiBsb2NrIGFscmVhZHkgYWNxdWlyZWQgKi8KLSAgICBpZiAoZmRfbG9jayA+PSAw KQotICAgICAgICByZXR1cm4gRVJST1JfSU5WQUw7Ci0KLSAgICBmbC5sX3R5cGUgPSBGX1dSTENL OwotICAgIGZsLmxfd2hlbmNlID0gU0VFS19TRVQ7Ci0gICAgZmwubF9zdGFydCA9IDA7Ci0gICAg ZmwubF9sZW4gPSAwOwotICAgIGZkX2xvY2sgPSBvcGVuKGxvY2tmaWxlLCBPX1dST05MWXxPX0NS RUFULCBTX0lXVVNSKTsKLSAgICBpZiAoZmRfbG9jayA8IDApIHsKLSAgICAgICAgZnByaW50Zihz dGRlcnIsICJjYW5ub3Qgb3BlbiB0aGUgbG9ja2ZpbGUgJXMgZXJybm89JWRcbiIsIGxvY2tmaWxl LCBlcnJubyk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9GQUlMOwotICAgIH0KLSAgICBpZiAoZmNu dGwoZmRfbG9jaywgRl9TRVRGRCwgRkRfQ0xPRVhFQykgPCAwKSB7Ci0gICAgICAgIGNsb3NlKGZk X2xvY2spOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCBzZXQgY2xvZXhlYyB0byBs b2NrZmlsZSAlcyBlcnJubz0lZFxuIiwgbG9ja2ZpbGUsIGVycm5vKTsKLSAgICAgICAgcmV0dXJu IEVSUk9SX0ZBSUw7Ci0gICAgfQotZ2V0X2xvY2s6Ci0gICAgcmMgPSBmY250bChmZF9sb2NrLCBG X1NFVExLVywgJmZsKTsKLSAgICBpZiAocmMgPCAwICYmIGVycm5vID09IEVJTlRSKQotICAgICAg ICBnb3RvIGdldF9sb2NrOwotICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRl cnIsICJjYW5ub3QgYWNxdWlyZSBsb2NrICVzIGVycm5vPSVkXG4iLCBsb2NrZmlsZSwgZXJybm8p OwotICAgICAgICByYyA9IEVSUk9SX0ZBSUw7Ci0gICAgfSBlbHNlCi0gICAgICAgIHJjID0gMDsK LSAgICByZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgcmVsZWFzZV9sb2NrKHZvaWQpCi17Ci0g ICAgaW50IHJjOwotICAgIHN0cnVjdCBmbG9jayBmbDsKLQotICAgIC8qIGxvY2sgbm90IGFjcXVp cmVkICovCi0gICAgaWYgKGZkX2xvY2sgPCAwKQotICAgICAgICByZXR1cm4gRVJST1JfSU5WQUw7 Ci0KLXJlbGVhc2VfbG9jazoKLSAgICBmbC5sX3R5cGUgPSBGX1VOTENLOwotICAgIGZsLmxfd2hl bmNlID0gU0VFS19TRVQ7Ci0gICAgZmwubF9zdGFydCA9IDA7Ci0gICAgZmwubF9sZW4gPSAwOwot Ci0gICAgcmMgPSBmY250bChmZF9sb2NrLCBGX1NFVExLVywgJmZsKTsKLSAgICBpZiAocmMgPCAw ICYmIGVycm5vID09IEVJTlRSKQotICAgICAgICBnb3RvIHJlbGVhc2VfbG9jazsKLSAgICBpZiAo cmMgPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2Fubm90IHJlbGVhc2UgbG9jayAl cywgZXJybm89JWRcbiIsIGxvY2tmaWxlLCBlcnJubyk7Ci0gICAgICAgIHJjID0gRVJST1JfRkFJ TDsKLSAgICB9IGVsc2UKLSAgICAgICAgcmMgPSAwOwotICAgIGNsb3NlKGZkX2xvY2spOwotICAg IGZkX2xvY2sgPSAtMTsKLQotICAgIHJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgcmVsb2Fk X2RvbWFpbl9jb25maWcodWludDMyX3QgZG9taWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBsaWJ4bF9kb21haW5fY29uZmlnICpkX2NvbmZpZykKLXsKLSAgICBpbnQgcmM7Ci0g ICAgdWludDhfdCAqdF9kYXRhOwotICAgIGludCByZXQsIHRfbGVuOwotICAgIGxpYnhsX2RvbWFp bl9jb25maWcgZF9jb25maWdfbmV3OwotCi0gICAgLyogSW4gY2FzZSB1c2VyIGhhcyB1c2VkICJj b25maWctdXBkYXRlIiB0byBzdG9yZSBhIG5ldyBjb25maWcKLSAgICAgKiBmaWxlLgotICAgICAq LwotICAgIHJldCA9IGxpYnhsX3VzZXJkYXRhX3JldHJpZXZlKGN0eCwgZG9taWQsICJ4bCIsICZ0 X2RhdGEsICZ0X2xlbik7Ci0gICAgaWYgKHJldCAmJiBlcnJubyAhPSBFTk9FTlQpIHsKLSAgICAg ICAgTE9HKCJcInhsXCIgY29uZmlndXJhdGlvbiBmb3VuZCBidXQgZmFpbGVkIHRvIGxvYWRcbiIp OwotICAgIH0KLSAgICBpZiAodF9sZW4gPiAwKSB7Ci0gICAgICAgIExPRygiXCJ4bFwiIGNvbmZp Z3VyYXRpb24gZm91bmQsIHVzaW5nIGl0XG4iKTsKLSAgICAgICAgbGlieGxfZG9tYWluX2NvbmZp Z19kaXNwb3NlKGRfY29uZmlnKTsKLSAgICAgICAgbGlieGxfZG9tYWluX2NvbmZpZ19pbml0KGRf Y29uZmlnKTsKLSAgICAgICAgcGFyc2VfY29uZmlnX2RhdGEoIjx1cGRhdGVkPiIsIChjb25zdCBj aGFyICopdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xlbiwgZF9jb25maWcp OwotICAgICAgICBmcmVlKHRfZGF0YSk7Ci0gICAgICAgIGxpYnhsX3VzZXJkYXRhX3VubGluayhj dHgsIGRvbWlkLCAieGwiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGxpYnhsX2Rv bWFpbl9jb25maWdfaW5pdCgmZF9jb25maWdfbmV3KTsKLSAgICByYyA9IGxpYnhsX3JldHJpZXZl X2RvbWFpbl9jb25maWd1cmF0aW9uKGN0eCwgZG9taWQsICZkX2NvbmZpZ19uZXcpOwotICAgIGlm IChyYykgewotICAgICAgICBMT0coImZhaWxlZCB0byByZXRyaWV2ZSBndWVzdCBjb25maWd1cmF0 aW9uIChyYz0lZCkuICIKLSAgICAgICAgICAgICJyZXVzaW5nIG9sZCBjb25maWd1cmF0aW9uIiwg cmMpOwotICAgICAgICBsaWJ4bF9kb21haW5fY29uZmlnX2Rpc3Bvc2UoJmRfY29uZmlnX25ldyk7 Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbGlieGxfZG9tYWluX2NvbmZpZ19kaXNwb3NlKGRfY29u ZmlnKTsKLSAgICAgICAgLyogU3RlYWwgYWxsb2NhdGlvbnMgKi8KLSAgICAgICAgbWVtY3B5KGRf Y29uZmlnLCAmZF9jb25maWdfbmV3LCBzaXplb2YobGlieGxfZG9tYWluX2NvbmZpZykpOwotICAg IH0KLX0KLQotLyogQ2FuIHVwZGF0ZSByX2RvbWlkIGlmIGRvbWFpbiBpcyBkZXN0cm95ZWQgKi8K LXN0YXRpYyBkb21haW5fcmVzdGFydF90eXBlIGhhbmRsZV9kb21haW5fZGVhdGgodWludDMyX3Qg KnJfZG9taWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGxpYnhsX2V2ZW50ICpldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgbGlieGxfZG9tYWluX2NvbmZpZyAqZF9jb25maWcpCi17Ci0gICAgZG9tYWlu X3Jlc3RhcnRfdHlwZSByZXN0YXJ0ID0gRE9NQUlOX1JFU1RBUlRfTk9ORTsKLSAgICBsaWJ4bF9h Y3Rpb25fb25fc2h1dGRvd24gYWN0aW9uOwotCi0gICAgc3dpdGNoIChldmVudC0+dS5kb21haW5f c2h1dGRvd24uc2h1dGRvd25fcmVhc29uKSB7Ci0gICAgY2FzZSBMSUJYTF9TSFVURE9XTl9SRUFT T05fUE9XRVJPRkY6Ci0gICAgICAgIGFjdGlvbiA9IGRfY29uZmlnLT5vbl9wb3dlcm9mZjsKLSAg ICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMSUJYTF9TSFVURE9XTl9SRUFTT05fUkVCT09UOgotICAg ICAgICBhY3Rpb24gPSBkX2NvbmZpZy0+b25fcmVib290OwotICAgICAgICBicmVhazsKLSAgICBj YXNlIExJQlhMX1NIVVRET1dOX1JFQVNPTl9TVVNQRU5EOgotICAgICAgICBMT0coIkRvbWFpbiBo YXMgc3VzcGVuZGVkLiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICBjYXNlIExJQlhMX1NIVVRE T1dOX1JFQVNPTl9DUkFTSDoKLSAgICAgICAgYWN0aW9uID0gZF9jb25maWctPm9uX2NyYXNoOwot ICAgICAgICBicmVhazsKLSAgICBjYXNlIExJQlhMX1NIVVRET1dOX1JFQVNPTl9XQVRDSERPRzoK LSAgICAgICAgYWN0aW9uID0gZF9jb25maWctPm9uX3dhdGNoZG9nOwotICAgICAgICBicmVhazsK LSAgICBjYXNlIExJQlhMX1NIVVRET1dOX1JFQVNPTl9TT0ZUX1JFU0VUOgotICAgICAgICBhY3Rp b24gPSBkX2NvbmZpZy0+b25fc29mdF9yZXNldDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVs dDoKLSAgICAgICAgTE9HKCJVbmtub3duIHNodXRkb3duIHJlYXNvbiBjb2RlICVkLiBEZXN0cm95 aW5nIGRvbWFpbi4iLAotICAgICAgICAgICAgZXZlbnQtPnUuZG9tYWluX3NodXRkb3duLnNodXRk b3duX3JlYXNvbik7Ci0gICAgICAgIGFjdGlvbiA9IExJQlhMX0FDVElPTl9PTl9TSFVURE9XTl9E RVNUUk9ZOwotICAgIH0KLQotICAgIExPRygiQWN0aW9uIGZvciBzaHV0ZG93biByZWFzb24gY29k ZSAlZCBpcyAlcyIsCi0gICAgICAgIGV2ZW50LT51LmRvbWFpbl9zaHV0ZG93bi5zaHV0ZG93bl9y ZWFzb24sCi0gICAgICAgIGdldF9hY3Rpb25fb25fc2h1dGRvd25fbmFtZShhY3Rpb24pKTsKLQot ICAgIGlmIChhY3Rpb24gPT0gTElCWExfQUNUSU9OX09OX1NIVVRET1dOX0NPUkVEVU1QX0RFU1RS T1kgfHwgYWN0aW9uID09IExJQlhMX0FDVElPTl9PTl9TSFVURE9XTl9DT1JFRFVNUF9SRVNUQVJU KSB7Ci0gICAgICAgIGNoYXIgKmNvcmVmaWxlOwotICAgICAgICBpbnQgcmM7Ci0KLSAgICAgICAg eGFzcHJpbnRmKCZjb3JlZmlsZSwgWEVOX0RVTVBfRElSICIvJXMiLCBkX2NvbmZpZy0+Y19pbmZv Lm5hbWUpOwotICAgICAgICBMT0coImR1bXBpbmcgY29yZSB0byAlcyIsIGNvcmVmaWxlKTsKLSAg ICAgICAgcmMgPSBsaWJ4bF9kb21haW5fY29yZV9kdW1wKGN0eCwgKnJfZG9taWQsIGNvcmVmaWxl LCBOVUxMKTsKLSAgICAgICAgaWYgKHJjKSBMT0coImNvcmUgZHVtcCBmYWlsZWQgKHJjPSVkKS4i LCByYyk7Ci0gICAgICAgIGZyZWUoY29yZWZpbGUpOwotICAgICAgICAvKiBObyBwb2ludCBjcnlp bmcgb3ZlciBzcGlsbGVkIG1pbGssIGNvbnRpbnVlIG9uIGZhaWx1cmUuICovCi0KLSAgICAgICAg aWYgKGFjdGlvbiA9PSBMSUJYTF9BQ1RJT05fT05fU0hVVERPV05fQ09SRURVTVBfREVTVFJPWSkK LSAgICAgICAgICAgIGFjdGlvbiA9IExJQlhMX0FDVElPTl9PTl9TSFVURE9XTl9ERVNUUk9ZOwot ICAgICAgICBlbHNlCi0gICAgICAgICAgICBhY3Rpb24gPSBMSUJYTF9BQ1RJT05fT05fU0hVVERP V05fUkVTVEFSVDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGFjdGlvbikgewotICAgIGNhc2UgTElC WExfQUNUSU9OX09OX1NIVVRET1dOX1BSRVNFUlZFOgotICAgICAgICBicmVhazsKLQotICAgIGNh c2UgTElCWExfQUNUSU9OX09OX1NIVVRET1dOX1JFU1RBUlRfUkVOQU1FOgotICAgICAgICByZWxv YWRfZG9tYWluX2NvbmZpZygqcl9kb21pZCwgZF9jb25maWcpOwotICAgICAgICByZXN0YXJ0ID0g RE9NQUlOX1JFU1RBUlRfUkVOQU1FOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTElCWExf QUNUSU9OX09OX1NIVVRET1dOX1JFU1RBUlQ6Ci0gICAgICAgIHJlbG9hZF9kb21haW5fY29uZmln KCpyX2RvbWlkLCBkX2NvbmZpZyk7Ci0gICAgICAgIHJlc3RhcnQgPSBET01BSU5fUkVTVEFSVF9O T1JNQUw7Ci0gICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLwotICAgIGNhc2UgTElCWExfQUNUSU9O X09OX1NIVVRET1dOX0RFU1RST1k6Ci0gICAgICAgIExPRygiRG9tYWluICVkIG5lZWRzIHRvIGJl IGNsZWFuZWQgdXA6IGRlc3Ryb3lpbmcgdGhlIGRvbWFpbiIsCi0gICAgICAgICAgICAqcl9kb21p ZCk7Ci0gICAgICAgIGxpYnhsX2RvbWFpbl9kZXN0cm95KGN0eCwgKnJfZG9taWQsIDApOwotICAg ICAgICAqcl9kb21pZCA9IElOVkFMSURfRE9NSUQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2Fz ZSBMSUJYTF9BQ1RJT05fT05fU0hVVERPV05fU09GVF9SRVNFVDoKLSAgICAgICAgcmVsb2FkX2Rv bWFpbl9jb25maWcoKnJfZG9taWQsIGRfY29uZmlnKTsKLSAgICAgICAgcmVzdGFydCA9IERPTUFJ Tl9SRVNUQVJUX1NPRlRfUkVTRVQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBMSUJYTF9B Q1RJT05fT05fU0hVVERPV05fQ09SRURVTVBfREVTVFJPWToKLSAgICBjYXNlIExJQlhMX0FDVElP Tl9PTl9TSFVURE9XTl9DT1JFRFVNUF9SRVNUQVJUOgotICAgICAgICAvKiBBbHJlYWR5IGhhbmRs ZWQgdGhlc2UgYWJvdmUuICovCi0gICAgICAgIGFib3J0KCk7Ci0gICAgfQotCi0gICAgcmV0dXJu IHJlc3RhcnQ7Ci19Ci0KLS8qIFByZXNlcnZlIGEgY29weSBvZiBhIGRvbWFpbiB1bmRlciBhIG5l dyBuYW1lLiBVcGRhdGVzICpyX2RvbWlkICovCi1zdGF0aWMgaW50IHByZXNlcnZlX2RvbWFpbih1 aW50MzJfdCAqcl9kb21pZCwgbGlieGxfZXZlbnQgKmV2ZW50LAotICAgICAgICAgICAgICAgICAg ICAgICAgICAgbGlieGxfZG9tYWluX2NvbmZpZyAqZF9jb25maWcpCi17Ci0gICAgdGltZV90IG5v dzsKLSAgICBzdHJ1Y3QgdG0gdG07Ci0gICAgY2hhciBzdHJ0aW1lWzI0XTsKLQotICAgIGxpYnhs X3V1aWQgbmV3X3V1aWQ7Ci0KLSAgICBpbnQgcmM7Ci0KLSAgICBub3cgPSB0aW1lKE5VTEwpOwot ICAgIGlmIChub3cgPT0gKCh0aW1lX3QpIC0xKSkgewotICAgICAgICBMT0coIkZhaWxlZCB0byBn ZXQgY3VycmVudCB0aW1lIGZvciBkb21haW4gcmVuYW1lIik7Ci0gICAgICAgIHJldHVybiAwOwot ICAgIH0KLQotICAgIHR6c2V0KCk7Ci0gICAgaWYgKGdtdGltZV9yKCZub3csICZ0bSkgPT0gTlVM TCkgewotICAgICAgICBMT0coIkZhaWxlZCB0byBjb252ZXJ0IHRpbWUgdG8gVVRDIik7Ci0gICAg ICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICghc3RyZnRpbWUoJnN0cnRpbWVbMF0sIHNp emVvZihzdHJ0aW1lKSwgIi0lWSVtJWRUJUglTVoiLCAmdG0pKSB7Ci0gICAgICAgIExPRygiRmFp bGVkIHRvIGZvcm1hdCB0aW1lIGFzIGEgc3RyaW5nIik7Ci0gICAgICAgIHJldHVybiAwOwotICAg IH0KLQotICAgIGxpYnhsX3V1aWRfZ2VuZXJhdGUoJm5ld191dWlkKTsKLQotICAgIExPRygiUHJl c2VydmluZyBkb21haW4gJXUgJXMgd2l0aCBzdWZmaXglcyIsCi0gICAgICAgICpyX2RvbWlkLCBk X2NvbmZpZy0+Y19pbmZvLm5hbWUsIHN0cnRpbWUpOwotICAgIHJjID0gbGlieGxfZG9tYWluX3By ZXNlcnZlKGN0eCwgKnJfZG9taWQsICZkX2NvbmZpZy0+Y19pbmZvLAotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHN0cnRpbWUsIG5ld191dWlkKTsKLQotICAgIC8qCi0gICAgICogQWx0 aG91Z2ggdGhlIGRvbWFpbiBzdGlsbCBleGlzdHMgaXQgaXMgbm8gbG9uZ2VyIHRoZSBvbmUgd2Ug YXJlCi0gICAgICogY29uY2VybmVkIHdpdGguCi0gICAgICovCi0gICAgKnJfZG9taWQgPSBJTlZB TElEX0RPTUlEOwotCi0gICAgcmV0dXJuIHJjID09IDAgPyAxIDogMDsKLX0KLQotLyoKLSAqIFJl dHVybnMgZmFsc2UgaWYgbWVtb3J5IGNhbid0IGJlIGZyZWVkLCBidXQgYWxzbyBpZiB3ZSBlbmNv dW50ZXIgZXJyb3JzLgotICogUmV0dXJucyB0cnVlIGluIGNhc2UgdGhlcmUgaXMgYWxyZWFkeSwg b3Igd2UgbWFuYWdlIHRvIGZyZWUgaXQsIGVub3VnaAotICogbWVtb3J5LCBidXQgYWxzbyBpZiBh dXRvYmFsbG9vbiBpcyBmYWxzZS4KLSAqLwotc3RhdGljIGJvb2wgZnJlZW1lbSh1aW50MzJfdCBk b21pZCwgbGlieGxfZG9tYWluX2J1aWxkX2luZm8gKmJfaW5mbykKLXsKLSAgICBpbnQgcmMsIHJl dHJpZXMgPSAzOwotICAgIHVpbnQ2NF90IG5lZWRfbWVta2IsIGZyZWVfbWVta2I7Ci0KLSAgICBp ZiAoIWF1dG9iYWxsb29uKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJjID0gbGlieGxf ZG9tYWluX25lZWRfbWVtb3J5KGN0eCwgYl9pbmZvLCAmbmVlZF9tZW1rYik7Ci0gICAgaWYgKHJj IDwgMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZG8gewotICAgICAgICByYyA9IGxp YnhsX2dldF9mcmVlX21lbW9yeShjdHgsICZmcmVlX21lbWtiKTsKLSAgICAgICAgaWYgKHJjIDwg MCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoZnJlZV9tZW1rYiA+ PSBuZWVkX21lbWtiKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgcmMgPSBs aWJ4bF9zZXRfbWVtb3J5X3RhcmdldChjdHgsIDAsIGZyZWVfbWVta2IgLSBuZWVkX21lbWtiLCAx LCAwKTsKLSAgICAgICAgaWYgKHJjIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQot ICAgICAgICAvKiB3YWl0IHVudGlsIGRvbTAgcmVhY2hlcyBpdHMgdGFyZ2V0LCBhcyBsb25nIGFz IHdlIGFyZSBtYWtpbmcKLSAgICAgICAgICogcHJvZ3Jlc3MgKi8KLSAgICAgICAgcmMgPSBsaWJ4 bF93YWl0X2Zvcl9tZW1vcnlfdGFyZ2V0KGN0eCwgMCwgMTApOwotICAgICAgICBpZiAocmMgPCAw KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHJpZXMtLTsKLSAgICB9 IHdoaWxlIChyZXRyaWVzID4gMCk7Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2 b2lkIGF1dG9jb25uZWN0X2NvbnNvbGUobGlieGxfY3R4ICpjdHhfaWdub3JlZCwKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbGlieGxfZXZlbnQgKmV2LCB2b2lkICpwcml2KQotewot ICAgIHVpbnQzMl90IGJsZG9taWQgPSBldi0+ZG9taWQ7Ci0gICAgaW50IG5vdGlmeV9mZCA9ICoo aW50Kilwcml2OyAvKiB3cml0ZSBlbmQgb2YgdGhlIG5vdGlmaWNhdGlvbiBwaXBlICovCi0KLSAg ICBsaWJ4bF9ldmVudF9mcmVlKGN0eCwgZXYpOwotCi0gICAgY29uc29sZV9jaGlsZF9yZXBvcnQo Y2hpbGRfY29uc29sZSk7Ci0KLSAgICBwaWRfdCBwaWQgPSB4bF9mb3JrKGNoaWxkX2NvbnNvbGUs ICJjb25zb2xlIGNoaWxkIik7Ci0gICAgaWYgKHBpZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg cG9zdGZvcmsoKTsKLQotICAgIHNsZWVwKDEpOwotICAgIGxpYnhsX3ByaW1hcnlfY29uc29sZV9l eGVjKGN0eCwgYmxkb21pZCwgbm90aWZ5X2ZkKTsKLSAgICAvKiBEbyBub3QgcmV0dXJuLiB4bCBj b250aW51ZWQgaW4gY2hpbGQgcHJvY2VzcyAqLwotICAgIHBlcnJvcigieGw6IHVuYWJsZSB0byBl eGVjIGNvbnNvbGUgY2xpZW50Iik7Ci0gICAgX2V4aXQoMSk7Ci19Ci0KLXN0YXRpYyBpbnQgZG9t YWluX3dhaXRfZXZlbnQodWludDMyX3QgZG9taWQsIGxpYnhsX2V2ZW50ICoqZXZlbnRfcikKLXsK LSAgICBpbnQgcmV0OwotICAgIGZvciAoOzspIHsKLSAgICAgICAgcmV0ID0gbGlieGxfZXZlbnRf d2FpdChjdHgsIGV2ZW50X3IsIExJQlhMX0VWRU5UTUFTS19BTEwsIDAsMCk7Ci0gICAgICAgIGlm IChyZXQpIHsKLSAgICAgICAgICAgIExPRygiRG9tYWluICV1LCBmYWlsZWQgdG8gZ2V0IGV2ZW50 LCBxdWl0dGluZyAocmM9JWQpIiwgZG9taWQsIHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0 OwotICAgICAgICB9Ci0gICAgICAgIGlmICgoKmV2ZW50X3IpLT5kb21pZCAhPSBkb21pZCkgewot ICAgICAgICAgICAgY2hhciAqZXZzdHIgPSBsaWJ4bF9ldmVudF90b19qc29uKGN0eCwgKmV2ZW50 X3IpOwotICAgICAgICAgICAgTE9HKCJJTlRFUk5BTCBQUk9CTEVNIC0gaWdub3JpbmcgdW5leHBl Y3RlZCBldmVudCBmb3IiCi0gICAgICAgICAgICAgICAgIiBkb21haW4gJWQgKGV4cGVjdGVkICVk KTogZXZlbnQ9JXMiLAotICAgICAgICAgICAgICAgICgqZXZlbnRfciktPmRvbWlkLCBkb21pZCwg ZXZzdHIpOwotICAgICAgICAgICAgZnJlZShldnN0cik7Ci0gICAgICAgICAgICBsaWJ4bF9ldmVu dF9mcmVlKGN0eCwgKmV2ZW50X3IpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0K LSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGV2ZGlzYWJsZV9k aXNrX2VqZWN0cyhsaWJ4bF9ldmdlbl9kaXNrX2VqZWN0ICoqZGlza3dzLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kaXNrcykKLXsKLSAgICBpbnQgaTsKLQotICAg IGZvciAoaSA9IDA7IGkgPCBudW1fZGlza3M7IGkrKykgewotICAgICAgICBpZiAoZGlza3dzW2ld KQotICAgICAgICAgICAgbGlieGxfZXZkaXNhYmxlX2Rpc2tfZWplY3QoY3R4LCBkaXNrd3NbaV0p OwotICAgICAgICBkaXNrd3NbaV0gPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGludCBjcmVh dGVfZG9tYWluKHN0cnVjdCBkb21haW5fY3JlYXRlICpkb21faW5mbykKLXsKLSAgICB1aW50MzJf dCBkb21pZCA9IElOVkFMSURfRE9NSUQ7Ci0KLSAgICBsaWJ4bF9kb21haW5fY29uZmlnIGRfY29u ZmlnOwotCi0gICAgaW50IGRlYnVnID0gZG9tX2luZm8tPmRlYnVnOwotICAgIGludCBkYWVtb25p emUgPSBkb21faW5mby0+ZGFlbW9uaXplOwotICAgIGludCBtb25pdG9yID0gZG9tX2luZm8tPm1v bml0b3I7Ci0gICAgaW50IHBhdXNlZCA9IGRvbV9pbmZvLT5wYXVzZWQ7Ci0gICAgaW50IHZuY2F1 dG9wYXNzID0gZG9tX2luZm8tPnZuY2F1dG9wYXNzOwotICAgIGNvbnN0IGNoYXIgKmNvbmZpZ19m aWxlID0gZG9tX2luZm8tPmNvbmZpZ19maWxlOwotICAgIGNvbnN0IGNoYXIgKmV4dHJhX2NvbmZp ZyA9IGRvbV9pbmZvLT5leHRyYV9jb25maWc7Ci0gICAgY29uc3QgY2hhciAqcmVzdG9yZV9maWxl ID0gZG9tX2luZm8tPnJlc3RvcmVfZmlsZTsKLSAgICBjb25zdCBjaGFyICpjb25maWdfc291cmNl ID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICpyZXN0b3JlX3NvdXJjZSA9IE5VTEw7Ci0gICAgaW50 IG1pZ3JhdGVfZmQgPSBkb21faW5mby0+bWlncmF0ZV9mZDsKLSAgICBib29sIGNvbmZpZ19pbl9q c29uOwotCi0gICAgaW50IGk7Ci0gICAgaW50IG5lZWRfZGFlbW9uID0gZGFlbW9uaXplOwotICAg IGludCByZXQsIHJjOwotICAgIGxpYnhsX2V2Z2VuX2RvbWFpbl9kZWF0aCAqZGVhdGh3ID0gTlVM TDsKLSAgICBsaWJ4bF9ldmdlbl9kaXNrX2VqZWN0ICoqZGlza3dzID0gTlVMTDsgLyogb25lIHBl ciBkaXNrICovCi0gICAgdW5zaWduZWQgaW50IG51bV9kaXNrd3MgPSAwOwotICAgIHZvaWQgKmNv bmZpZ19kYXRhID0gMDsKLSAgICBpbnQgY29uZmlnX2xlbiA9IDA7Ci0gICAgaW50IHJlc3RvcmVf ZmQgPSAtMTsKLSAgICBpbnQgcmVzdG9yZV9mZF90b19jbG9zZSA9IC0xOwotICAgIGludCBzZW5k X2JhY2tfZmQgPSAtMTsKLSAgICBjb25zdCBsaWJ4bF9hc3luY3Byb2dyZXNzX2hvdyAqYXV0b2Nv bm5lY3RfY29uc29sZV9ob3c7Ci0gICAgaW50IG5vdGlmeV9waXBlWzJdID0geyAtMSwgLTEgfTsK LSAgICBzdHJ1Y3Qgc2F2ZV9maWxlX2hlYWRlciBoZHI7Ci0gICAgdWludDMyX3QgZG9taWRfc29m dF9yZXNldCA9IElOVkFMSURfRE9NSUQ7Ci0KLSAgICBpbnQgcmVzdG9yaW5nID0gKHJlc3RvcmVf ZmlsZSB8fCAobWlncmF0ZV9mZCA+PSAwKSk7Ci0KLSAgICBsaWJ4bF9kb21haW5fY29uZmlnX2lu aXQoJmRfY29uZmlnKTsKLQotICAgIGlmIChyZXN0b3JpbmcpIHsKLSAgICAgICAgdWludDhfdCAq b3B0ZGF0YV9iZWdpbiA9IDA7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKm9wdGRhdGFfaGVyZSA9 IDA7Ci0gICAgICAgIHVuaW9uIHsgdWludDMyX3QgdTMyOyBjaGFyIGJbNF07IH0gdTMyYnVmOwot ICAgICAgICB1aW50MzJfdCBiYWRmbGFnczsKLQotICAgICAgICBpZiAobWlncmF0ZV9mZCA+PSAw KSB7Ci0gICAgICAgICAgICByZXN0b3JlX3NvdXJjZSA9ICI8aW5jb21pbmcgbWlncmF0aW9uIHN0 cmVhbT4iOwotICAgICAgICAgICAgcmVzdG9yZV9mZCA9IG1pZ3JhdGVfZmQ7Ci0gICAgICAgICAg ICBzZW5kX2JhY2tfZmQgPSBkb21faW5mby0+c2VuZF9iYWNrX2ZkOwotICAgICAgICB9IGVsc2Ug ewotICAgICAgICAgICAgcmVzdG9yZV9zb3VyY2UgPSByZXN0b3JlX2ZpbGU7Ci0gICAgICAgICAg ICByZXN0b3JlX2ZkID0gb3BlbihyZXN0b3JlX2ZpbGUsIE9fUkRPTkxZKTsKLSAgICAgICAgICAg IGlmIChyZXN0b3JlX2ZkID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIs ICJDYW4ndCBvcGVuIHJlc3RvcmUgZmlsZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAg ICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMOwotICAgICAgICAgICAgfQotICAgICAgICAg ICAgcmVzdG9yZV9mZF90b19jbG9zZSA9IHJlc3RvcmVfZmQ7Ci0gICAgICAgICAgICByYyA9IGxp YnhsX2ZkX3NldF9jbG9leGVjKGN0eCwgcmVzdG9yZV9mZCwgMSk7Ci0gICAgICAgICAgICBpZiAo cmMpIHJldHVybiByYzsKLSAgICAgICAgfQotCi0gICAgICAgIENIS19FUlJOT1ZBTChsaWJ4bF9y ZWFkX2V4YWN0bHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3R4LCByZXN0b3JlX2ZkLCAm aGRyLCBzaXplb2YoaGRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlX3NvdXJj ZSwgImhlYWRlciIpKTsKLSAgICAgICAgaWYgKG1lbWNtcChoZHIubWFnaWMsIHNhdmVmaWxlaGVh ZGVyX21hZ2ljLCBzaXplb2YoaGRyLm1hZ2ljKSkpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3Rk ZXJyLCAiRmlsZSBoYXMgd3JvbmcgbWFnaWMgbnVtYmVyIC0iCi0gICAgICAgICAgICAgICAgICAg ICIgY29ycnVwdCBvciBmb3IgYSBkaWZmZXJlbnQgdG9vbD9cbiIpOwotICAgICAgICAgICAgcmV0 dXJuIEVSUk9SX0lOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChoZHIuYnl0ZW9yZGVyICE9 IFNBVkVGSUxFX0JZVEVPUkRFUl9WQUxVRSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIs ICJGaWxlIGhhcyB3cm9uZyBieXRlIG9yZGVyXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJP Ul9JTlZBTDsKLSAgICAgICAgfQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkxvYWRpbmcgbmV3 IHNhdmUgZmlsZSAlcyIKLSAgICAgICAgICAgICAgICAiIChuZXcgeGwgZm10IGluZm8iCi0gICAg ICAgICAgICAgICAgIiAweCUiUFJJeDMyIi8weCUiUFJJeDMyIi8lIlBSSXUzMiIpXG4iLAotICAg ICAgICAgICAgICAgIHJlc3RvcmVfc291cmNlLCBoZHIubWFuZGF0b3J5X2ZsYWdzLCBoZHIub3B0 aW9uYWxfZmxhZ3MsCi0gICAgICAgICAgICAgICAgaGRyLm9wdGlvbmFsX2RhdGFfbGVuKTsKLQot ICAgICAgICBiYWRmbGFncyA9IGhkci5tYW5kYXRvcnlfZmxhZ3MgJiB+WExfTUFOREFUT1JZX0ZM QUdfQUxMOwotICAgICAgICBpZiAoYmFkZmxhZ3MpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3Rk ZXJyLCAiU2F2ZWZpbGUgaGFzIG1hbmRhdG9yeSBmbGFnKHMpIDB4JSJQUkl4MzIiICIKLSAgICAg ICAgICAgICAgICAgICAgIndoaWNoIGFyZSBub3Qgc3VwcG9ydGVkOyBuZWVkIG5ld2VyIHhsXG4i LAotICAgICAgICAgICAgICAgICAgICBiYWRmbGFncyk7Ci0gICAgICAgICAgICByZXR1cm4gRVJS T1JfSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGhkci5vcHRpb25hbF9kYXRhX2xlbikg ewotICAgICAgICAgICAgb3B0ZGF0YV9iZWdpbiA9IHhtYWxsb2MoaGRyLm9wdGlvbmFsX2RhdGFf bGVuKTsKLSAgICAgICAgICAgIENIS19FUlJOT1ZBTChsaWJ4bF9yZWFkX2V4YWN0bHkoCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGN0eCwgcmVzdG9yZV9mZCwgb3B0ZGF0YV9iZWdpbiwK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRyLm9wdGlvbmFsX2RhdGFfbGVuLCByZXN0 b3JlX3NvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGRhdGEiKSk7Ci0g ICAgICAgIH0KLQotI2RlZmluZSBPUFREQVRBX0xFRlQgIChoZHIub3B0aW9uYWxfZGF0YV9sZW4g LSAob3B0ZGF0YV9oZXJlIC0gb3B0ZGF0YV9iZWdpbikpCi0jZGVmaW5lIFdJVEhfT1BUREFUQShh bXQsIGJvZHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAg aWYgKE9QVERBVEFfTEVGVCA8IChhbXQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAg ICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNhdmVmaWxlIHRydW5jYXRlZC5cbiIpOyAg ICAgICBcCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMOyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBib2R5OyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgb3B0 ZGF0YV9oZXJlICs9IChhbXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAg ICAgfQotCi0gICAgICAgIG9wdGRhdGFfaGVyZSA9IG9wdGRhdGFfYmVnaW47Ci0KLSAgICAgICAg aWYgKE9QVERBVEFfTEVGVCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgU2F2ZWZp bGUgY29udGFpbnMgeGwgZG9tYWluIGNvbmZpZyVzXG4iLAotICAgICAgICAgICAgICAgICAgICAh IShoZHIubWFuZGF0b3J5X2ZsYWdzICYgWExfTUFOREFUT1JZX0ZMQUdfSlNPTikKLSAgICAgICAg ICAgICAgICAgICAgPyAiIGluIEpTT04gZm9ybWF0IiA6ICIiKTsKLSAgICAgICAgICAgIFdJVEhf T1BUREFUQSg0LCB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHUzMmJ1Zi5iLCBvcHRkYXRhX2hl cmUsIDQpOwotICAgICAgICAgICAgICAgIGNvbmZpZ19sZW4gPSB1MzJidWYudTMyOwotICAgICAg ICAgICAgfSk7Ci0gICAgICAgICAgICBXSVRIX09QVERBVEEoY29uZmlnX2xlbiwgewotICAgICAg ICAgICAgICAgIGNvbmZpZ19kYXRhID0geG1hbGxvYyhjb25maWdfbGVuKTsKLSAgICAgICAgICAg ICAgICBtZW1jcHkoY29uZmlnX2RhdGEsIG9wdGRhdGFfaGVyZSwgY29uZmlnX2xlbik7Ci0gICAg ICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgaWYgKGNvbmZpZ19maWxlKSB7 Ci0gICAgICAgIGZyZWUoY29uZmlnX2RhdGEpOyAgY29uZmlnX2RhdGEgPSAwOwotICAgICAgICAv KiAvZGV2L251bGwgcmVwcmVzZW50cyBzcGVjaWFsIGNhc2UgKHJlYWQgY29uZmlnLiBmcm9tIGNv bW1hbmQgbGluZSkgKi8KLSAgICAgICAgaWYgKCFzdHJjbXAoY29uZmlnX2ZpbGUsICIvZGV2L251 bGwiKSkgewotICAgICAgICAgICAgY29uZmlnX2xlbiA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0g ICAgICAgICAgICByZXQgPSBsaWJ4bF9yZWFkX2ZpbGVfY29udGVudHMoY3R4LCBjb25maWdfZmls ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnX2Rh dGEsICZjb25maWdfbGVuKTsKLSAgICAgICAgICAgIGlmIChyZXQpIHsgZnByaW50ZihzdGRlcnIs ICJGYWlsZWQgdG8gcmVhZCBjb25maWcgZmlsZTogJXM6ICVzXG4iLAotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbmZpZ19maWxlLCBzdHJlcnJvcihlcnJubykpOyByZXR1cm4gRVJS T1JfRkFJTDsgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghcmVzdG9yaW5nICYmIGV4dHJhX2Nv bmZpZyAmJiBzdHJsZW4oZXh0cmFfY29uZmlnKSkgewotICAgICAgICAgICAgaWYgKGNvbmZpZ19s ZW4gPiBJTlRfTUFYIC0gKHN0cmxlbihleHRyYV9jb25maWcpICsgMiArIDEpKSB7Ci0gICAgICAg ICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gYXR0YWNoIGV4dHJhIGNvbmZpZ3Vy YXRpb25cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9GQUlMOwotICAgICAgICAg ICAgfQotICAgICAgICAgICAgLyogYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBleHRyYSBjb25maWcg cGx1cyB0d28gRU9McyBwbHVzIFwwICovCi0gICAgICAgICAgICBjb25maWdfZGF0YSA9IHhyZWFs bG9jKGNvbmZpZ19kYXRhLCBjb25maWdfbGVuCi0gICAgICAgICAgICAgICAgKyBzdHJsZW4oZXh0 cmFfY29uZmlnKSArIDIgKyAxKTsKLSAgICAgICAgICAgIGNvbmZpZ19sZW4gKz0gc3ByaW50Zihj b25maWdfZGF0YSArIGNvbmZpZ19sZW4sICJcbiVzXG4iLAotICAgICAgICAgICAgICAgIGV4dHJh X2NvbmZpZyk7Ci0gICAgICAgIH0KLSAgICAgICAgY29uZmlnX3NvdXJjZT1jb25maWdfZmlsZTsK LSAgICAgICAgY29uZmlnX2luX2pzb24gPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBp ZiAoIWNvbmZpZ19kYXRhKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbmZpZyBm aWxlIG5vdCBzcGVjaWZpZWQgYW5kIgotICAgICAgICAgICAgICAgICAgICAiIG5vbmUgaW4gc2F2 ZSBmaWxlXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTDsKLSAgICAgICAgfQot ICAgICAgICBjb25maWdfc291cmNlID0gIjxzYXZlZD4iOwotICAgICAgICBjb25maWdfaW5fanNv biA9ICEhKGhkci5tYW5kYXRvcnlfZmxhZ3MgJiBYTF9NQU5EQVRPUllfRkxBR19KU09OKTsKLSAg ICB9Ci0KLSAgICBpZiAoIWRvbV9pbmZvLT5xdWlldCkKLSAgICAgICAgZnByaW50ZihzdGRlcnIs ICJQYXJzaW5nIGNvbmZpZyBmcm9tICVzXG4iLCBjb25maWdfc291cmNlKTsKLQotICAgIGlmIChj b25maWdfaW5fanNvbikgewotICAgICAgICBsaWJ4bF9kb21haW5fY29uZmlnX2Zyb21fanNvbihj dHgsICZkX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNv bnN0IGNoYXIgKiljb25maWdfZGF0YSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcGFyc2VfY29u ZmlnX2RhdGEoY29uZmlnX3NvdXJjZSwgY29uZmlnX2RhdGEsIGNvbmZpZ19sZW4sICZkX2NvbmZp Zyk7Ci0gICAgfQotCi0gICAgaWYgKG1pZ3JhdGVfZmQgPj0gMCkgewotICAgICAgICBpZiAoZF9j b25maWcuY19pbmZvLm5hbWUpIHsKLSAgICAgICAgICAgIC8qIHdoZW4gd2UgcmVjZWl2ZSBhIGRv bWFpbiB3ZSBnZXQgaXRzIG5hbWUgZnJvbSB0aGUgY29uZmlnCi0gICAgICAgICAgICAgKiBmaWxl OyBhbmQgd2UgcmVjZWl2ZSBpdCB0byBhIHRlbXBvcmFyeSBuYW1lICovCi0gICAgICAgICAgICBh c3NlcnQoIWNvbW1vbl9kb21uYW1lKTsKLQotICAgICAgICAgICAgY29tbW9uX2RvbW5hbWUgPSBk X2NvbmZpZy5jX2luZm8ubmFtZTsKLSAgICAgICAgICAgIGRfY29uZmlnLmNfaW5mby5uYW1lID0g MDsgLyogc3RlYWxzIGFsbG9jYXRpb24gZnJvbSBjb25maWcgKi8KLQotICAgICAgICAgICAgeGFz cHJpbnRmKCZkX2NvbmZpZy5jX2luZm8ubmFtZSwgIiVzLS1pbmNvbWluZyIsIGNvbW1vbl9kb21u YW1lKTsKLSAgICAgICAgICAgICpkb21faW5mby0+bWlncmF0aW9uX2RvbW5hbWVfciA9IHN0cmR1 cChkX2NvbmZpZy5jX2luZm8ubmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZGVi dWcgfHwgZG9tX2luZm8tPmRyeXJ1bikgewotICAgICAgICBGSUxFICpjZmdfcHJpbnRfZmggPSAo ZGVidWcgJiYgIWRvbV9pbmZvLT5kcnlydW4pID8gc3RkZXJyIDogc3Rkb3V0OwotICAgICAgICBp ZiAoZGVmYXVsdF9vdXRwdXRfZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfU1hQKSB7Ci0gICAgICAg ICAgICBwcmludGZfaW5mb19zZXhwKC0xLCAmZF9jb25maWcsIGNmZ19wcmludF9maCk7Ci0gICAg ICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGFyICpqc29uID0gbGlieGxfZG9tYWluX2NvbmZp Z190b19qc29uKGN0eCwgJmRfY29uZmlnKTsKLSAgICAgICAgICAgIGlmICghanNvbikgewotICAg ICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgIkZh aWxlZCB0byBjb252ZXJ0IGRvbWFpbiBjb25maWd1cmF0aW9uIHRvIEpTT05cbiIpOwotICAgICAg ICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHV0cyhqc29u LCBjZmdfcHJpbnRfZmgpOwotICAgICAgICAgICAgZnJlZShqc29uKTsKLSAgICAgICAgICAgIHhm bHVzaF9zdHJlYW0oY2ZnX3ByaW50X2ZoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcmV0 ID0gMDsKLSAgICBpZiAoZG9tX2luZm8tPmRyeXJ1bikKLSAgICAgICAgZ290byBvdXQ7Ci0KLXN0 YXJ0OgotICAgIGFzc2VydChkb21pZCA9PSBJTlZBTElEX0RPTUlEKTsKLQotICAgIHJjID0gYWNx dWlyZV9sb2NrKCk7Ci0gICAgaWYgKHJjIDwgMCkKLSAgICAgICAgZ290byBlcnJvcl9vdXQ7Ci0K LSAgICBpZiAoZG9taWRfc29mdF9yZXNldCA9PSBJTlZBTElEX0RPTUlEKSB7Ci0gICAgICAgIGlm ICghZnJlZW1lbShkb21pZCwgJmRfY29uZmlnLmJfaW5mbykpIHsKLSAgICAgICAgICAgIGZwcmlu dGYoc3RkZXJyLCAiZmFpbGVkIHRvIGZyZWUgbWVtb3J5IGZvciB0aGUgZG9tYWluXG4iKTsKLSAg ICAgICAgICAgIHJldCA9IEVSUk9SX0ZBSUw7Ci0gICAgICAgICAgICBnb3RvIGVycm9yX291dDsK LSAgICAgICAgfQotICAgIH0KLQotICAgIGxpYnhsX2FzeW5jcHJvZ3Jlc3NfaG93IGF1dG9jb25u ZWN0X2NvbnNvbGVfaG93X2J1ZjsKLSAgICBpZiAoIGRvbV9pbmZvLT5jb25zb2xlX2F1dG9jb25u ZWN0ICkgewotICAgICAgICBpZiAobGlieGxfcGlwZShjdHgsIG5vdGlmeV9waXBlKSkgewotICAg ICAgICAgICAgcmV0ID0gRVJST1JfRkFJTDsKLSAgICAgICAgICAgIGdvdG8gZXJyb3Jfb3V0Owot ICAgICAgICB9Ci0gICAgICAgIGF1dG9jb25uZWN0X2NvbnNvbGVfaG93X2J1Zi5jYWxsYmFjayA9 IGF1dG9jb25uZWN0X2NvbnNvbGU7Ci0gICAgICAgIGF1dG9jb25uZWN0X2NvbnNvbGVfaG93X2J1 Zi5mb3JfY2FsbGJhY2sgPSAmbm90aWZ5X3BpcGVbMV07Ci0gICAgICAgIGF1dG9jb25uZWN0X2Nv bnNvbGVfaG93ID0gJmF1dG9jb25uZWN0X2NvbnNvbGVfaG93X2J1ZjsKLSAgICB9ZWxzZXsKLSAg ICAgICAgYXV0b2Nvbm5lY3RfY29uc29sZV9ob3cgPSAwOwotICAgIH0KLQotICAgIGlmICggcmVz dG9yaW5nICkgewotICAgICAgICBsaWJ4bF9kb21haW5fcmVzdG9yZV9wYXJhbXMgcGFyYW1zOwot Ci0gICAgICAgIGxpYnhsX2RvbWFpbl9yZXN0b3JlX3BhcmFtc19pbml0KCZwYXJhbXMpOwotCi0g ICAgICAgIHBhcmFtcy5jaGVja3BvaW50ZWRfc3RyZWFtID0gZG9tX2luZm8tPmNoZWNrcG9pbnRl ZF9zdHJlYW07Ci0gICAgICAgIHBhcmFtcy5zdHJlYW1fdmVyc2lvbiA9Ci0gICAgICAgICAgICAo aGRyLm1hbmRhdG9yeV9mbGFncyAmIFhMX01BTkRBVE9SWV9GTEFHX1NUUkVBTXYyKSA/IDIgOiAx OwotICAgICAgICBwYXJhbXMuY29sb19wcm94eV9zY3JpcHQgPSBkb21faW5mby0+Y29sb19wcm94 eV9zY3JpcHQ7Ci0KLSAgICAgICAgcmV0ID0gbGlieGxfZG9tYWluX2NyZWF0ZV9yZXN0b3JlKGN0 eCwgJmRfY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg JmRvbWlkLCByZXN0b3JlX2ZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc2VuZF9iYWNrX2ZkLCAmcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgMCwgYXV0b2Nvbm5lY3RfY29uc29sZV9ob3cpOwotCi0gICAgICAgIGxp YnhsX2RvbWFpbl9yZXN0b3JlX3BhcmFtc19kaXNwb3NlKCZwYXJhbXMpOwotCi0gICAgICAgIC8q Ci0gICAgICAgICAqIE9uIHN1YnNlcXVlbnQgcmVib290IGV0YyB3ZSBzaG91bGQgY3JlYXRlIHRo ZSBkb21haW4sIG5vdAotICAgICAgICAgKiByZXN0b3JlL21pZ3JhdGUtcmVjZWl2ZSBpdCBhZ2Fp bi4KLSAgICAgICAgICovCi0gICAgICAgIHJlc3RvcmluZyA9IDA7Ci0gICAgfSBlbHNlIGlmIChk b21pZF9zb2Z0X3Jlc2V0ICE9IElOVkFMSURfRE9NSUQpIHsKLSAgICAgICAgLyogRG8gc29mdCBy ZXNldC4gKi8KLSAgICAgICAgcmV0ID0gbGlieGxfZG9tYWluX3NvZnRfcmVzZXQoY3R4LCAmZF9j b25maWcsIGRvbWlkX3NvZnRfcmVzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDAsIGF1dG9jb25uZWN0X2NvbnNvbGVfaG93KTsKLSAgICAgICAgZG9taWQgPSBkb21p ZF9zb2Z0X3Jlc2V0OwotICAgICAgICBkb21pZF9zb2Z0X3Jlc2V0ID0gSU5WQUxJRF9ET01JRDsK LSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBsaWJ4bF9kb21haW5fY3JlYXRlX25ldyhjdHgs ICZkX2NvbmZpZywgJmRvbWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAwLCBhdXRvY29ubmVjdF9jb25zb2xlX2hvdyk7Ci0gICAgfQotICAgIGlmICggcmV0ICkKLSAg ICAgICAgZ290byBlcnJvcl9vdXQ7Ci0KLSAgICByZWxlYXNlX2xvY2soKTsKLQotICAgIGlmIChy ZXN0b3JlX2ZkX3RvX2Nsb3NlID49IDApIHsKLSAgICAgICAgaWYgKGNsb3NlKHJlc3RvcmVfZmRf dG9fY2xvc2UpKQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY2xvc2Ug cmVzdG9yaW5nIGZpbGUsIGZkICVkLCBlcnJubyAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAg cmVzdG9yZV9mZF90b19jbG9zZSwgZXJybm8pOwotICAgICAgICByZXN0b3JlX2ZkX3RvX2Nsb3Nl ID0gLTE7Ci0gICAgfQotCi0gICAgaWYgKGF1dG9jb25uZWN0X2NvbnNvbGVfaG93KSB7Ci0gICAg ICAgIGNoYXIgYnVmWzFdOwotICAgICAgICBpbnQgcjsKLQotICAgICAgICAvKiBUcnkgdG8gZ2V0 IG5vdGlmaWNhdGlvbiBmcm9tIHhlbmNvbnNvbGUuIEp1c3QgbW92ZSBvbiBpZgotICAgICAgICAg KiBlcnJvciBvY2N1cnMgLS0gaXQncyBvbmx5IG1pbm9yIGFubm95YW5jZSBpZiBjb25zb2xlCi0g ICAgICAgICAqIGRvZXNuJ3Qgc2hvdyB1cC4KLSAgICAgICAgICovCi0gICAgICAgIGRvIHsKLSAg ICAgICAgICAgIHIgPSByZWFkKG5vdGlmeV9waXBlWzBdLCBidWYsIDEpOwotICAgICAgICB9IHdo aWxlIChyID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKLQotICAgICAgICBpZiAociA9PSAtMSkK LSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgICAgICAiRmFpbGVk IHRvIGdldCBub3RpZmljYXRpb24gZnJvbSB4ZW5jb25zb2xlOiAlc1xuIiwKLSAgICAgICAgICAg ICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZWxzZSBpZiAociA9PSAwKQotICAg ICAgICAgICAgZnByaW50ZihzdGRlcnIsICJHb3QgRU9GIGZyb20geGVuY29uc29sZSBub3RpZmlj YXRpb24gZmRcbiIpOwotICAgICAgICBlbHNlIGlmIChyID09IDEgJiYgYnVmWzBdICE9IDB4MDAp Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdvdCB1bmV4cGVjdGVkIHJlc3BvbnNlIGZy b20geGVuY29uc29sZTogJSN4XG4iLAotICAgICAgICAgICAgICAgICAgICBidWZbMF0pOwotCi0g ICAgICAgIGNsb3NlKG5vdGlmeV9waXBlWzBdKTsKLSAgICAgICAgY2xvc2Uobm90aWZ5X3BpcGVb MV0pOwotICAgICAgICBub3RpZnlfcGlwZVswXSA9IG5vdGlmeV9waXBlWzFdID0gLTE7Ci0gICAg fQotCi0gICAgaWYgKCFwYXVzZWQpCi0gICAgICAgIGxpYnhsX2RvbWFpbl91bnBhdXNlKGN0eCwg ZG9taWQpOwotCi0gICAgcmV0ID0gZG9taWQ7IC8qIGNhbGxlciBnZXRzIHN1Y2Nlc3MgaW4gcGFy ZW50ICovCi0gICAgaWYgKCFkYWVtb25pemUgJiYgIW1vbml0b3IpCi0gICAgICAgIGdvdG8gb3V0 OwotCi0gICAgaWYgKGRvbV9pbmZvLT52bmMpCi0gICAgICAgIGF1dG9jb25uZWN0X3ZuY3ZpZXdl cihkb21pZCwgdm5jYXV0b3Bhc3MpOwotCi0gICAgaWYgKG5lZWRfZGFlbW9uKSB7Ci0gICAgICAg IGNoYXIgKm5hbWU7Ci0KLSAgICAgICAgeGFzcHJpbnRmKCZuYW1lLCAieGwtJXMiLCBkX2NvbmZp Zy5jX2luZm8ubmFtZSk7Ci0gICAgICAgIHJldCA9IGRvX2RhZW1vbml6ZShuYW1lLCBOVUxMKTsK LSAgICAgICAgZnJlZShuYW1lKTsKLSAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgcmV0 ID0gKHJldCA9PSAxKSA/IGRvbWlkIDogcmV0OwotICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAg ICAgIH0KLSAgICAgICAgbmVlZF9kYWVtb24gPSAwOwotICAgIH0KLSAgICBMT0coIldhaXRpbmcg Zm9yIGRvbWFpbiAlcyAoZG9taWQgJXUpIHRvIGRpZSBbcGlkICVsZF0iLAotICAgICAgICBkX2Nv bmZpZy5jX2luZm8ubmFtZSwgZG9taWQsIChsb25nKWdldHBpZCgpKTsKLQotICAgIHJldCA9IGxp YnhsX2V2ZW5hYmxlX2RvbWFpbl9kZWF0aChjdHgsIGRvbWlkLCAwLCAmZGVhdGh3KTsKLSAgICBp ZiAocmV0KSBnb3RvIG91dDsKLQotICAgIGlmICghZGlza3dzKSB7Ci0gICAgICAgIGRpc2t3cyA9 IHhtYWxsb2Moc2l6ZW9mKCpkaXNrd3MpICogZF9jb25maWcubnVtX2Rpc2tzKTsKLSAgICAgICAg Zm9yIChpID0gMDsgaSA8IGRfY29uZmlnLm51bV9kaXNrczsgaSsrKQotICAgICAgICAgICAgZGlz a3dzW2ldID0gTlVMTDsKLSAgICAgICAgbnVtX2Rpc2t3cyA9IGRfY29uZmlnLm51bV9kaXNrczsK LSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bV9kaXNrd3M7IGkrKykgewotICAgICAgICBp ZiAoZF9jb25maWcuZGlza3NbaV0ucmVtb3ZhYmxlKSB7Ci0gICAgICAgICAgICByZXQgPSBsaWJ4 bF9ldmVuYWJsZV9kaXNrX2VqZWN0KGN0eCwgZG9taWQsIGRfY29uZmlnLmRpc2tzW2ldLnZkZXYs Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZkaXNrd3Nb aV0pOwotICAgICAgICAgICAgaWYgKHJldCkgZ290byBvdXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0g ICAgd2hpbGUgKDEpIHsKLSAgICAgICAgbGlieGxfZXZlbnQgKmV2ZW50OwotICAgICAgICByZXQg PSBkb21haW5fd2FpdF9ldmVudChkb21pZCwgJmV2ZW50KTsKLSAgICAgICAgaWYgKHJldCkgZ290 byBvdXQ7Ci0KLSAgICAgICAgc3dpdGNoIChldmVudC0+dHlwZSkgewotCi0gICAgICAgIGNhc2Ug TElCWExfRVZFTlRfVFlQRV9ET01BSU5fU0hVVERPV046Ci0gICAgICAgICAgICBMT0coIkRvbWFp biAldSBoYXMgc2h1dCBkb3duLCByZWFzb24gY29kZSAlZCAweCV4IiwgZG9taWQsCi0gICAgICAg ICAgICAgICAgZXZlbnQtPnUuZG9tYWluX3NodXRkb3duLnNodXRkb3duX3JlYXNvbiwKLSAgICAg ICAgICAgICAgICBldmVudC0+dS5kb21haW5fc2h1dGRvd24uc2h1dGRvd25fcmVhc29uKTsKLSAg ICAgICAgICAgIHN3aXRjaCAoaGFuZGxlX2RvbWFpbl9kZWF0aCgmZG9taWQsIGV2ZW50LCAmZF9j b25maWcpKSB7Ci0gICAgICAgICAgICBjYXNlIERPTUFJTl9SRVNUQVJUX1NPRlRfUkVTRVQ6Ci0g ICAgICAgICAgICAgICAgZG9taWRfc29mdF9yZXNldCA9IGRvbWlkOwotICAgICAgICAgICAgICAg IGRvbWlkID0gSU5WQUxJRF9ET01JRDsKLSAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2gg Ki8KLSAgICAgICAgICAgIGNhc2UgRE9NQUlOX1JFU1RBUlRfUkVOQU1FOgotICAgICAgICAgICAg ICAgIGlmIChkb21pZF9zb2Z0X3Jlc2V0ID09IElOVkFMSURfRE9NSUQgJiYKLSAgICAgICAgICAg ICAgICAgICAgIXByZXNlcnZlX2RvbWFpbigmZG9taWQsIGV2ZW50LCAmZF9jb25maWcpKSB7Ci0g ICAgICAgICAgICAgICAgICAgIGxpYnhsX2V2ZW50X2ZyZWUoY3R4LCBldmVudCk7Ci0gICAgICAg ICAgICAgICAgICAgIC8qIElmIHdlIGZhaWwgdGhlbiBleGl0IGxlYXZpbmcgdGhlIG9sZCBkb21h aW4gaW4gcGxhY2UuICovCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IC0xOwotICAgICAgICAg ICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAg ICAvKiBPdGhlcndpc2UgZmFsbCB0aHJvdWdoIGFuZCByZXN0YXJ0LiAqLwotICAgICAgICAgICAg Y2FzZSBET01BSU5fUkVTVEFSVF9OT1JNQUw6Ci0gICAgICAgICAgICAgICAgbGlieGxfZXZlbnRf ZnJlZShjdHgsIGV2ZW50KTsKLSAgICAgICAgICAgICAgICBsaWJ4bF9ldmRpc2FibGVfZG9tYWlu X2RlYXRoKGN0eCwgZGVhdGh3KTsKLSAgICAgICAgICAgICAgICBkZWF0aHcgPSBOVUxMOwotICAg ICAgICAgICAgICAgIGV2ZGlzYWJsZV9kaXNrX2VqZWN0cyhkaXNrd3MsIG51bV9kaXNrd3MpOwot ICAgICAgICAgICAgICAgIGZyZWUoZGlza3dzKTsKLSAgICAgICAgICAgICAgICBkaXNrd3MgPSBO VUxMOwotICAgICAgICAgICAgICAgIG51bV9kaXNrd3MgPSAwOwotICAgICAgICAgICAgICAgIC8q IGRpc2NhcmQgYW55IG90aGVyIGV2ZW50cyB3aGljaCBtYXkgaGF2ZSBiZWVuIGdlbmVyYXRlZCAq LwotICAgICAgICAgICAgICAgIHdoaWxlICghKHJldCA9IGxpYnhsX2V2ZW50X2NoZWNrKGN0eCwg JmV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IExJQlhMX0VWRU5UTUFTS19BTEwsIDAsMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpYnhs X2V2ZW50X2ZyZWUoY3R4LCBldmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg ICAgIGlmIChyZXQgIT0gRVJST1JfTk9UX1JFQURZKSB7Ci0gICAgICAgICAgICAgICAgICAgIExP Rygid2FybmluZywgbGlieGxfZXZlbnRfY2hlY2sgKGNsZWFudXApIGZhaWxlZCAocmM9JWQpIiwK LSAgICAgICAgICAgICAgICAgICAgICAgIHJldCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAg ICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBEbyBub3QgYXR0ZW1wdCB0byByZWNv bm5lY3QgaWYgd2UgY29tZSByb3VuZCBhZ2FpbiBkdWUgdG8gYQotICAgICAgICAgICAgICAgICAq IGd1ZXN0IHJlYm9vdCAtLSB0aGUgc3RkaW4vb3V0IHdpbGwgYmUgZGlzY29ubmVjdGVkIGJ5IHRo ZW4uCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgZG9tX2luZm8tPmNvbnNv bGVfYXV0b2Nvbm5lY3QgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogU29tZSBzZXR0aW5ncyBv bmx5IG1ha2Ugc2Vuc2Ugb24gZmlyc3QgYm9vdC4gKi8KLSAgICAgICAgICAgICAgICBwYXVzZWQg PSAwOwotICAgICAgICAgICAgICAgIGlmIChjb21tb25fZG9tbmFtZQotICAgICAgICAgICAgICAg ICAgICAmJiBzdHJjbXAoZF9jb25maWcuY19pbmZvLm5hbWUsIGNvbW1vbl9kb21uYW1lKSkgewot ICAgICAgICAgICAgICAgICAgICBkX2NvbmZpZy5jX2luZm8ubmFtZSA9IHN0cmR1cChjb21tb25f ZG9tbmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAg ICAgICAgICAgICAgKiBYWFggRklYTUU6IElmIHRoaXMgc2xlZXAgaXMgbm90IHRoZXJlIHRoZW4g ZG9tYWluCi0gICAgICAgICAgICAgICAgICogcmUtY3JlYXRpb24gZmFpbHMgc29tZXRpbWVzLgot ICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIExPRygiRG9uZS4gUmVib290aW5n IG5vdyIpOwotICAgICAgICAgICAgICAgIHNsZWVwKDIpOwotICAgICAgICAgICAgICAgIGdvdG8g c3RhcnQ7Ci0KLSAgICAgICAgICAgIGNhc2UgRE9NQUlOX1JFU1RBUlRfTk9ORToKLSAgICAgICAg ICAgICAgICBMT0coIkRvbmUuIEV4aXRpbmcgbm93Iik7Ci0gICAgICAgICAgICAgICAgbGlieGxf ZXZlbnRfZnJlZShjdHgsIGV2ZW50KTsKLSAgICAgICAgICAgICAgICByZXQgPSAwOwotICAgICAg ICAgICAgICAgIGdvdG8gb3V0OwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAg ICAgIGFib3J0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBMSUJYTF9FVkVOVF9U WVBFX0RPTUFJTl9ERUFUSDoKLSAgICAgICAgICAgIExPRygiRG9tYWluICV1IGhhcyBiZWVuIGRl c3Ryb3llZC4iLCBkb21pZCk7Ci0gICAgICAgICAgICBsaWJ4bF9ldmVudF9mcmVlKGN0eCwgZXZl bnQpOwotICAgICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgICAgIGdvdG8gb3V0OwotCi0gICAg ICAgIGNhc2UgTElCWExfRVZFTlRfVFlQRV9ESVNLX0VKRUNUOgotICAgICAgICAgICAgLyogWFhY IHdoYXQgaXMgdGhpcyBmb3I/ICovCi0gICAgICAgICAgICBsaWJ4bF9jZHJvbV9pbnNlcnQoY3R4 LCBkb21pZCwgJmV2ZW50LT51LmRpc2tfZWplY3QuZGlzaywgTlVMTCk7Ci0gICAgICAgICAgICBi cmVhazsKLQotICAgICAgICBkZWZhdWx0OjsKLSAgICAgICAgICAgIGNoYXIgKmV2c3RyID0gbGli eGxfZXZlbnRfdG9fanNvbihjdHgsIGV2ZW50KTsKLSAgICAgICAgICAgIExPRygid2FybmluZywg Z290IHVuZXhwZWN0ZWQgZXZlbnQgdHlwZSAlZCwgZXZlbnQ9JXMiLAotICAgICAgICAgICAgICAg IGV2ZW50LT50eXBlLCBldnN0cik7Ci0gICAgICAgICAgICBmcmVlKGV2c3RyKTsKLSAgICAgICAg fQotCi0gICAgICAgIGxpYnhsX2V2ZW50X2ZyZWUoY3R4LCBldmVudCk7Ci0gICAgfQotCi1lcnJv cl9vdXQ6Ci0gICAgcmVsZWFzZV9sb2NrKCk7Ci0gICAgaWYgKGxpYnhsX2RvbWlkX3ZhbGlkX2d1 ZXN0KGRvbWlkKSkgewotICAgICAgICBsaWJ4bF9kb21haW5fZGVzdHJveShjdHgsIGRvbWlkLCAw KTsKLSAgICAgICAgZG9taWQgPSBJTlZBTElEX0RPTUlEOwotICAgIH0KLQotb3V0OgotICAgIGlm IChyZXN0b3JlX2ZkX3RvX2Nsb3NlID49IDApIHsKLSAgICAgICAgaWYgKGNsb3NlKHJlc3RvcmVf ZmRfdG9fY2xvc2UpKQotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY2xv c2UgcmVzdG9yaW5nIGZpbGUsIGZkICVkLCBlcnJubyAlZFxuIiwKLSAgICAgICAgICAgICAgICAg ICAgcmVzdG9yZV9mZF90b19jbG9zZSwgZXJybm8pOwotICAgICAgICByZXN0b3JlX2ZkX3RvX2Ns b3NlID0gLTE7Ci0gICAgfQotCi0gICAgaWYgKGxvZ2ZpbGUgIT0gMikKLSAgICAgICAgY2xvc2Uo bG9nZmlsZSk7Ci0KLSAgICBsaWJ4bF9kb21haW5fY29uZmlnX2Rpc3Bvc2UoJmRfY29uZmlnKTsK LQotICAgIGZyZWUoY29uZmlnX2RhdGEpOwotCi0gICAgY29uc29sZV9jaGlsZF9yZXBvcnQoY2hp bGRfY29uc29sZSk7Ci0KLSAgICBpZiAoZGVhdGh3KQotICAgICAgICBsaWJ4bF9ldmRpc2FibGVf ZG9tYWluX2RlYXRoKGN0eCwgZGVhdGh3KTsKLSAgICBpZiAoZGlza3dzKSB7Ci0gICAgICAgIGV2 ZGlzYWJsZV9kaXNrX2VqZWN0cyhkaXNrd3MsIGRfY29uZmlnLm51bV9kaXNrcyk7Ci0gICAgICAg IGZyZWUoZGlza3dzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIHdlIGhhdmUgZGFlbW9u aXplZCB0aGVuIGRvIG5vdCByZXR1cm4gdG8gdGhlIGNhbGxlciAtLSB0aGlzIGhhcwotICAgICAq IGFscmVhZHkgaGFwcGVuZWQgaW4gdGhlIHBhcmVudC4KLSAgICAgKi8KLSAgICBpZiAoIGRhZW1v bml6ZSAmJiAhbmVlZF9kYWVtb24gKQotICAgICAgICBleGl0KHJldCk7Ci0KLSAgICByZXR1cm4g cmV0OwotfQotCiB2b2lkIGhlbHAoY29uc3QgY2hhciAqY29tbWFuZCkKIHsKICAgICBpbnQgaTsK QEAgLTEwMDMsMTI3ICs5OCw2IEBAIHZvaWQgaGVscChjb25zdCBjaGFyICpjb21tYW5kKQogICAg IH0KIH0KIAotc3RhdGljIHZvaWQgcGF1c2VfZG9tYWluKHVpbnQzMl90IGRvbWlkKQotewotICAg IGxpYnhsX2RvbWFpbl9wYXVzZShjdHgsIGRvbWlkKTsKLX0KLQotc3RhdGljIHZvaWQgdW5wYXVz ZV9kb21haW4odWludDMyX3QgZG9taWQpCi17Ci0gICAgbGlieGxfZG9tYWluX3VucGF1c2UoY3R4 LCBkb21pZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfZG9tYWluKHVpbnQzMl90IGRvbWlk LCBpbnQgZm9yY2UpCi17Ci0gICAgaW50IHJjOwotCi0gICAgaWYgKGRvbWlkID09IDAgJiYgIWZv cmNlKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm90IGRlc3Ryb3lpbmcgZG9tYWluIDA7 IHVzZSAtZiB0byBmb3JjZS5cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGNhbiBv bmx5IGJlIGRvbmUgd2hlbiB1c2luZyBhIGRpc2FnZ3JlZ2F0ZWQgIgotICAgICAgICAgICAgICAg ICAgICAgICAgImhhcmR3YXJlIGRvbWFpbiBhbmQgdG9vbHN0YWNrLlxuXG4iKTsKLSAgICAgICAg ZXhpdChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgICByYyA9IGxpYnhsX2RvbWFpbl9kZXN0cm95 KGN0eCwgZG9taWQsIDApOwotICAgIGlmIChyYykgeyBmcHJpbnRmKHN0ZGVyciwiZGVzdHJveSBm YWlsZWQgKHJjPSVkKVxuIixyYyk7IGV4aXQoRVhJVF9GQUlMVVJFKTsgfQotfQotCi1zdGF0aWMg dm9pZCB3YWl0X2Zvcl9kb21haW5fZGVhdGhzKGxpYnhsX2V2Z2VuX2RvbWFpbl9kZWF0aCAqKmRl YXRod3MsIGludCBucikKLXsKLSAgICBpbnQgcmMsIGNvdW50ID0gMDsKLSAgICBMT0coIldhaXRp bmcgZm9yICVkIGRvbWFpbnMiLCBucik7Ci0gICAgd2hpbGUoMSAmJiBjb3VudCA8IG5yKSB7Ci0g ICAgICAgIGxpYnhsX2V2ZW50ICpldmVudDsKLSAgICAgICAgcmMgPSBsaWJ4bF9ldmVudF93YWl0 KGN0eCwgJmV2ZW50LCBMSUJYTF9FVkVOVE1BU0tfQUxMLCAwLDApOwotICAgICAgICBpZiAocmMp IHsKLSAgICAgICAgICAgIExPRygiRmFpbGVkIHRvIGdldCBldmVudCwgcXVpdHRpbmcgKHJjPSVk KSIsIHJjKTsKLSAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICAgICAgfQotCi0g ICAgICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKLSAgICAgICAgY2FzZSBMSUJYTF9FVkVOVF9U WVBFX0RPTUFJTl9ERUFUSDoKLSAgICAgICAgICAgIExPRygiRG9tYWluICVkIGhhcyBiZWVuIGRl c3Ryb3llZCIsIGV2ZW50LT5kb21pZCk7Ci0gICAgICAgICAgICBsaWJ4bF9ldmRpc2FibGVfZG9t YWluX2RlYXRoKGN0eCwgZGVhdGh3c1tldmVudC0+Zm9yX3VzZXJdKTsKLSAgICAgICAgICAgIGNv dW50Kys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMSUJYTF9FVkVOVF9UWVBF X0RPTUFJTl9TSFVURE9XTjoKLSAgICAgICAgICAgIExPRygiRG9tYWluICVkIGhhcyBiZWVuIHNo dXQgZG93biwgcmVhc29uIGNvZGUgJWQiLAotICAgICAgICAgICAgICAgIGV2ZW50LT5kb21pZCwg ZXZlbnQtPnUuZG9tYWluX3NodXRkb3duLnNodXRkb3duX3JlYXNvbik7Ci0gICAgICAgICAgICBs aWJ4bF9ldmRpc2FibGVfZG9tYWluX2RlYXRoKGN0eCwgZGVhdGh3c1tldmVudC0+Zm9yX3VzZXJd KTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVm YXVsdDoKLSAgICAgICAgICAgIExPRygiVW5leHBlY3RlZCBldmVudCB0eXBlICVkIiwgZXZlbnQt PnR5cGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbGlieGxfZXZl bnRfZnJlZShjdHgsIGV2ZW50KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHNodXRkb3duX2Rv bWFpbih1aW50MzJfdCBkb21pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF9l dmdlbl9kb21haW5fZGVhdGggKipkZWF0aHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg bGlieGxfZXZfdXNlciBmb3JfdXNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQg ZmFsbGJhY2tfdHJpZ2dlcikKLXsKLSAgICBpbnQgcmM7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwg IlNodXR0aW5nIGRvd24gZG9tYWluICV1XG4iLCBkb21pZCk7Ci0gICAgcmM9bGlieGxfZG9tYWlu X3NodXRkb3duKGN0eCwgZG9taWQpOwotICAgIGlmIChyYyA9PSBFUlJPUl9OT1BBUkFWSVJUKSB7 Ci0gICAgICAgIGlmIChmYWxsYmFja190cmlnZ2VyKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0 ZGVyciwgIlBWIGNvbnRyb2wgaW50ZXJmYWNlIG5vdCBhdmFpbGFibGU6IgotICAgICAgICAgICAg ICAgICAgICAiIHNlbmRpbmcgQUNQSSBwb3dlciBidXR0b24gZXZlbnQuXG4iKTsKLSAgICAgICAg ICAgIHJjID0gbGlieGxfc2VuZF90cmlnZ2VyKGN0eCwgZG9taWQsIExJQlhMX1RSSUdHRVJfUE9X RVIsIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQ ViBjb250cm9sIGludGVyZmFjZSBub3QgYXZhaWxhYmxlOiIKLSAgICAgICAgICAgICAgICAgICAg IiBleHRlcm5hbCBncmFjZWZ1bCBzaHV0ZG93biBub3QgcG9zc2libGUuXG4iKTsKLSAgICAgICAg ICAgIGZwcmludGYoc3RkZXJyLCAiVXNlIFwiLUZcIiB0byBmYWxsYmFjayB0byBBQ1BJIHBvd2Vy IGV2ZW50LlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmMpIHsKLSAgICAgICAg ZnByaW50ZihzdGRlcnIsInNodXRkb3duIGZhaWxlZCAocmM9JWQpXG4iLHJjKTtleGl0KEVYSVRf RkFJTFVSRSk7Ci0gICAgfQotCi0gICAgaWYgKGRlYXRodykgewotICAgICAgICByYyA9IGxpYnhs X2V2ZW5hYmxlX2RvbWFpbl9kZWF0aChjdHgsIGRvbWlkLCBmb3JfdXNlciwgZGVhdGh3KTsKLSAg ICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwid2FpdCBmb3IgZGVh dGggZmFpbGVkIChldmdlbiwgcmM9JWQpXG4iLHJjKTsKLSAgICAgICAgICAgIGV4aXQoRVhJVF9G QUlMVVJFKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgcmVib290X2RvbWFp bih1aW50MzJfdCBkb21pZCwgbGlieGxfZXZnZW5fZG9tYWluX2RlYXRoICoqZGVhdGh3LAotICAg ICAgICAgICAgICAgICAgICAgICAgICBsaWJ4bF9ldl91c2VyIGZvcl91c2VyLCBpbnQgZmFsbGJh Y2tfdHJpZ2dlcikKLXsKLSAgICBpbnQgcmM7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIlJlYm9v dGluZyBkb21haW4gJXVcbiIsIGRvbWlkKTsKLSAgICByYz1saWJ4bF9kb21haW5fcmVib290KGN0 eCwgZG9taWQpOwotICAgIGlmIChyYyA9PSBFUlJPUl9OT1BBUkFWSVJUKSB7Ci0gICAgICAgIGlm IChmYWxsYmFja190cmlnZ2VyKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBWIGNv bnRyb2wgaW50ZXJmYWNlIG5vdCBhdmFpbGFibGU6IgotICAgICAgICAgICAgICAgICAgICAiIHNl bmRpbmcgQUNQSSByZXNldCBidXR0b24gZXZlbnQuXG4iKTsKLSAgICAgICAgICAgIHJjID0gbGli eGxfc2VuZF90cmlnZ2VyKGN0eCwgZG9taWQsIExJQlhMX1RSSUdHRVJfUkVTRVQsIDApOwotICAg ICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQViBjb250cm9sIGlu dGVyZmFjZSBub3QgYXZhaWxhYmxlOiIKLSAgICAgICAgICAgICAgICAgICAgIiBleHRlcm5hbCBn cmFjZWZ1bCByZWJvb3Qgbm90IHBvc3NpYmxlLlxuIik7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0 ZGVyciwgIlVzZSBcIi1GXCIgdG8gZmFsbGJhY2sgdG8gQUNQSSByZXNldCBldmVudC5cbiIpOwot ICAgICAgICB9Ci0gICAgfQotICAgIGlmIChyYykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwi cmVib290IGZhaWxlZCAocmM9JWQpXG4iLHJjKTtleGl0KEVYSVRfRkFJTFVSRSk7Ci0gICAgfQot Ci0gICAgaWYgKGRlYXRodykgewotICAgICAgICByYyA9IGxpYnhsX2V2ZW5hYmxlX2RvbWFpbl9k ZWF0aChjdHgsIGRvbWlkLCBmb3JfdXNlciwgZGVhdGh3KTsKLSAgICAgICAgaWYgKHJjKSB7Ci0g ICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwid2FpdCBmb3IgZGVhdGggZmFpbGVkIChldmdlbiwg cmM9JWQpXG4iLHJjKTsKLSAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgICAgICAg fQotICAgIH0KLX0KLQogI2lmbmRlZiBMSUJYTF9IQVZFX05PX1NVU1BFTkRfUkVTVU1FCiBzdGF0 aWMgdm9pZCBzYXZlX2RvbWFpbl9jb3JlX2JlZ2luKHVpbnQzMl90IGRvbWlkLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvdmVycmlkZV9jb25maWdfZmls ZSwKQEAgLTE5MTUsMjIzICs4ODksNiBAQCBpbnQgbWFpbl9taWdyYXRlKGludCBhcmdjLCBjaGFy ICoqYXJndikKIH0KICNlbmRpZgogCi1pbnQgbWFpbl9wYXVzZShpbnQgYXJnYywgY2hhciAqKmFy Z3YpCi17Ci0gICAgaW50IG9wdDsKLQotICAgIFNXSVRDSF9GT1JFQUNIX09QVChvcHQsICIiLCBO VUxMLCAicGF1c2UiLCAxKSB7Ci0gICAgICAgIC8qIE5vIG9wdGlvbnMgKi8KLSAgICB9Ci0KLSAg ICBwYXVzZV9kb21haW4oeGZpbmRfZG9tYWluKGFyZ3Zbb3B0aW5kXSkpOwotCi0gICAgcmV0dXJu IEVYSVRfU1VDQ0VTUzsKLX0KLQotaW50IG1haW5fdW5wYXVzZShpbnQgYXJnYywgY2hhciAqKmFy Z3YpCi17Ci0gICAgaW50IG9wdDsKLQotICAgIFNXSVRDSF9GT1JFQUNIX09QVChvcHQsICIiLCBO VUxMLCAidW5wYXVzZSIsIDEpIHsKLSAgICAgICAgLyogTm8gb3B0aW9ucyAqLwotICAgIH0KLQot ICAgIHVucGF1c2VfZG9tYWluKHhmaW5kX2RvbWFpbihhcmd2W29wdGluZF0pKTsKLQotICAgIHJl dHVybiBFWElUX1NVQ0NFU1M7Ci19Ci0KLWludCBtYWluX2Rlc3Ryb3koaW50IGFyZ2MsIGNoYXIg Kiphcmd2KQotewotICAgIGludCBvcHQ7Ci0gICAgaW50IGZvcmNlID0gMDsKLQotICAgIFNXSVRD SF9GT1JFQUNIX09QVChvcHQsICJmIiwgTlVMTCwgImRlc3Ryb3kiLCAxKSB7Ci0gICAgY2FzZSAn Zic6Ci0gICAgICAgIGZvcmNlID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVz dHJveV9kb21haW4oeGZpbmRfZG9tYWluKGFyZ3Zbb3B0aW5kXSksIGZvcmNlKTsKLSAgICByZXR1 cm4gRVhJVF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IG1haW5fc2h1dGRvd25fb3JfcmVib290 KGludCBkb19yZWJvb3QsIGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBjb25zdCBjaGFy ICp3aGF0ID0gZG9fcmVib290ID8gInJlYm9vdCIgOiAic2h1dGRvd24iOwotICAgIHZvaWQgKCpm bikodWludDMyX3QgZG9taWQsCi0gICAgICAgICAgICAgICBsaWJ4bF9ldmdlbl9kb21haW5fZGVh dGggKiosIGxpYnhsX2V2X3VzZXIsIGludCkgPQotICAgICAgICBkb19yZWJvb3QgPyAmcmVib290 X2RvbWFpbiA6ICZzaHV0ZG93bl9kb21haW47Ci0gICAgaW50IG9wdCwgaSwgbmJfZG9tYWluOwot ICAgIGludCB3YWl0X2Zvcl9pdCA9IDAsIGFsbCA9IDAsIG5yZGVhdGh3cyA9IDA7Ci0gICAgaW50 IGZhbGxiYWNrX3RyaWdnZXIgPSAwOwotICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdHNbXSA9 IHsKLSAgICAgICAgeyJhbGwiLCAwLCAwLCAnYSd9LAotICAgICAgICB7IndhaXQiLCAwLCAwLCAn dyd9LAotICAgICAgICBDT01NT05fTE9OR19PUFRTCi0gICAgfTsKLQotICAgIFNXSVRDSF9GT1JF QUNIX09QVChvcHQsICJhd0YiLCBvcHRzLCB3aGF0LCAwKSB7Ci0gICAgY2FzZSAnYSc6Ci0gICAg ICAgIGFsbCA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3cnOgotICAgICAgICB3YWl0 X2Zvcl9pdCA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0YnOgotICAgICAgICBmYWxs YmFja190cmlnZ2VyID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCFhcmd2 W29wdGluZF0gJiYgIWFsbCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIllvdSBtdXN0IHNw ZWNpZnkgLWEgb3IgYSBkb21haW4gaWQuXG5cbiIpOwotICAgICAgICByZXR1cm4gRVhJVF9GQUlM VVJFOwotICAgIH0KLQotICAgIGlmIChhbGwpIHsKLSAgICAgICAgbGlieGxfZG9taW5mbyAqZG9t aW5mbzsKLSAgICAgICAgbGlieGxfZXZnZW5fZG9tYWluX2RlYXRoICoqZGVhdGh3cyA9IE5VTEw7 Ci0gICAgICAgIGlmICghKGRvbWluZm8gPSBsaWJ4bF9saXN0X2RvbWFpbihjdHgsICZuYl9kb21h aW4pKSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJsaWJ4bF9saXN0X2RvbWFpbiBm YWlsZWQuXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICAgICAgIH0K LQotICAgICAgICBpZiAod2FpdF9mb3JfaXQpCi0gICAgICAgICAgICBkZWF0aHdzID0gY2FsbG9j KG5iX2RvbWFpbiwgc2l6ZW9mKCpkZWF0aHdzKSk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaTxu Yl9kb21haW47IGkrKykgewotICAgICAgICAgICAgaWYgKGRvbWluZm9baV0uZG9taWQgPT0gMCB8 fCBkb21pbmZvW2ldLm5ldmVyX3N0b3ApCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAg ICAgICAgICBmbihkb21pbmZvW2ldLmRvbWlkLCBkZWF0aHdzID8gJmRlYXRod3NbaV0gOiBOVUxM LCBpLAotICAgICAgICAgICAgICAgZmFsbGJhY2tfdHJpZ2dlcik7Ci0gICAgICAgICAgICBucmRl YXRod3MrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZWF0aHdzKSB7Ci0gICAgICAgICAg ICB3YWl0X2Zvcl9kb21haW5fZGVhdGhzKGRlYXRod3MsIG5yZGVhdGh3cyk7Ci0gICAgICAgICAg ICBmcmVlKGRlYXRod3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgbGlieGxfZG9taW5mb19saXN0 X2ZyZWUoZG9taW5mbywgbmJfZG9tYWluKTsKLSAgICB9IGVsc2UgewotICAgICAgICBsaWJ4bF9l dmdlbl9kb21haW5fZGVhdGggKmRlYXRodyA9IE5VTEw7Ci0gICAgICAgIHVpbnQzMl90IGRvbWlk ID0geGZpbmRfZG9tYWluKGFyZ3Zbb3B0aW5kXSk7Ci0KLSAgICAgICAgZm4oZG9taWQsIHdhaXRf Zm9yX2l0ID8gJmRlYXRodyA6IE5VTEwsIDAsIGZhbGxiYWNrX3RyaWdnZXIpOwotCi0gICAgICAg IGlmICh3YWl0X2Zvcl9pdCkKLSAgICAgICAgICAgIHdhaXRfZm9yX2RvbWFpbl9kZWF0aHMoJmRl YXRodywgMSk7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwotfQotCi1pbnQg bWFpbl9zaHV0ZG93bihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgcmV0dXJuIG1haW5f c2h1dGRvd25fb3JfcmVib290KDAsIGFyZ2MsIGFyZ3YpOwotfQotCi1pbnQgbWFpbl9yZWJvb3Qo aW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIHJldHVybiBtYWluX3NodXRkb3duX29yX3Jl Ym9vdCgxLCBhcmdjLCBhcmd2KTsKLX0KLQotaW50IG1haW5fY3JlYXRlKGludCBhcmdjLCBjaGFy ICoqYXJndikKLXsKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IE5VTEw7Ci0gICAgc3RydWN0 IGRvbWFpbl9jcmVhdGUgZG9tX2luZm87Ci0gICAgaW50IHBhdXNlZCA9IDAsIGRlYnVnID0gMCwg ZGFlbW9uaXplID0gMSwgY29uc29sZV9hdXRvY29ubmVjdCA9IDAsCi0gICAgICAgIHF1aWV0ID0g MCwgbW9uaXRvciA9IDEsIHZuYyA9IDAsIHZuY2F1dG9wYXNzID0gMDsKLSAgICBpbnQgb3B0LCBy YzsKLSAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7Ci0gICAgICAgIHsiZHJ5cnVu IiwgMCwgMCwgJ24nfSwKLSAgICAgICAgeyJxdWlldCIsIDAsIDAsICdxJ30sCi0gICAgICAgIHsi ZGVmY29uZmlnIiwgMSwgMCwgJ2YnfSwKLSAgICAgICAgeyJ2bmN2aWV3ZXIiLCAwLCAwLCAnVid9 LAotICAgICAgICB7InZuY3ZpZXdlci1hdXRvcGFzcyIsIDAsIDAsICdBJ30sCi0gICAgICAgIENP TU1PTl9MT05HX09QVFMKLSAgICB9OwotCi0gICAgZG9tX2luZm8uZXh0cmFfY29uZmlnID0gTlVM TDsKLQotICAgIGlmIChhcmd2WzFdICYmIGFyZ3ZbMV1bMF0gIT0gJy0nICYmICFzdHJjaHIoYXJn dlsxXSwgJz0nKSkgewotICAgICAgICBmaWxlbmFtZSA9IGFyZ3ZbMV07Ci0gICAgICAgIGFyZ2Mt LTsgYXJndisrOwotICAgIH0KLQotICAgIFNXSVRDSF9GT1JFQUNIX09QVChvcHQsICJGbnFmOnBj ZGVWQSIsIG9wdHMsICJjcmVhdGUiLCAwKSB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAgIGZpbGVu YW1lID0gb3B0YXJnOwotICAgICAgICBicmVhazsKLSAgICBjYXNlICdwJzoKLSAgICAgICAgcGF1 c2VkID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYyc6Ci0gICAgICAgIGNvbnNvbGVf YXV0b2Nvbm5lY3QgPSAxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgICAg ZGVidWcgPSAxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlICdGJzoKLSAgICAgICAgZGFlbW9u aXplID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZSc6Ci0gICAgICAgIGRhZW1vbml6 ZSA9IDA7Ci0gICAgICAgIG1vbml0b3IgPSAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlICdu JzoKLSAgICAgICAgZHJ5cnVuX29ubHkgPSAxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlICdx JzoKLSAgICAgICAgcXVpZXQgPSAxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlICdWJzoKLSAg ICAgICAgdm5jID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnQSc6Ci0gICAgICAgIHZu YyA9IHZuY2F1dG9wYXNzID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbWVtc2V0 KCZkb21faW5mbywgMCwgc2l6ZW9mKGRvbV9pbmZvKSk7Ci0KLSAgICBmb3IgKDsgb3B0aW5kIDwg YXJnYzsgb3B0aW5kKyspIHsKLSAgICAgICAgaWYgKHN0cmNocihhcmd2W29wdGluZF0sICc9Jykg IT0gTlVMTCkgewotICAgICAgICAgICAgeHN0cmluZ19yZWFsbG9jX2FwcGVuZCgmZG9tX2luZm8u ZXh0cmFfY29uZmlnLCBhcmd2W29wdGluZF0pOwotICAgICAgICAgICAgeHN0cmluZ19yZWFsbG9j X2FwcGVuZCgmZG9tX2luZm8uZXh0cmFfY29uZmlnLCAiXG4iKTsKLSAgICAgICAgfSBlbHNlIGlm ICghZmlsZW5hbWUpIHsKLSAgICAgICAgICAgIGZpbGVuYW1lID0gYXJndltvcHRpbmRdOwotICAg ICAgICB9IGVsc2UgewotICAgICAgICAgICAgaGVscCgiY3JlYXRlIik7Ci0gICAgICAgICAgICBm cmVlKGRvbV9pbmZvLmV4dHJhX2NvbmZpZyk7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAg ICAgfQotICAgIH0KLQotICAgIGRvbV9pbmZvLmRlYnVnID0gZGVidWc7Ci0gICAgZG9tX2luZm8u ZGFlbW9uaXplID0gZGFlbW9uaXplOwotICAgIGRvbV9pbmZvLm1vbml0b3IgPSBtb25pdG9yOwot ICAgIGRvbV9pbmZvLnBhdXNlZCA9IHBhdXNlZDsKLSAgICBkb21faW5mby5kcnlydW4gPSBkcnly dW5fb25seTsKLSAgICBkb21faW5mby5xdWlldCA9IHF1aWV0OwotICAgIGRvbV9pbmZvLmNvbmZp Z19maWxlID0gZmlsZW5hbWU7Ci0gICAgZG9tX2luZm8ubWlncmF0ZV9mZCA9IC0xOwotICAgIGRv bV9pbmZvLnNlbmRfYmFja19mZCA9IC0xOwotICAgIGRvbV9pbmZvLnZuYyA9IHZuYzsKLSAgICBk b21faW5mby52bmNhdXRvcGFzcyA9IHZuY2F1dG9wYXNzOwotICAgIGRvbV9pbmZvLmNvbnNvbGVf YXV0b2Nvbm5lY3QgPSBjb25zb2xlX2F1dG9jb25uZWN0OwotCi0gICAgcmMgPSBjcmVhdGVfZG9t YWluKCZkb21faW5mbyk7Ci0gICAgaWYgKHJjIDwgMCkgewotICAgICAgICBmcmVlKGRvbV9pbmZv LmV4dHJhX2NvbmZpZyk7Ci0gICAgICAgIHJldHVybiAtcmM7Ci0gICAgfQotCi0gICAgZnJlZShk b21faW5mby5leHRyYV9jb25maWcpOwotICAgIHJldHVybiAwOwotfQotCiAjaWZuZGVmIExJQlhM X0hBVkVfTk9fU1VTUEVORF9SRVNVTUUKIGludCBtYWluX3JlbXVzKGludCBhcmdjLCBjaGFyICoq YXJndikKIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3hsL3hsX3ZtY29udHJvbC5jIGIvdG9vbHMveGwv eGxfdm1jb250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uMzA5 YzJmYjExMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3hsL3hsX3ZtY29udHJvbC5jCkBAIC0w LDAgKzEsMTIyNSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA5LTIwMTcgQ2l0cml4IEx0ZCBhbmQg b3RoZXIgY29udHJpYnV0b3JzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0 ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hl ZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyLjEgb25seS4g d2l0aCB0aGUgc3BlY2lhbAorICogZXhjZXB0aW9uIG9uIGxpbmtpbmcgZGVzY3JpYmVkIGluIGZp bGUgTElDRU5TRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkg b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVz c2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5j bHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpbWl0cy5o PgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8 c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+ CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxsaWJ4bC5oPgorI2luY2x1ZGUgPGxp YnhsX3V0aWxzLmg+CisjaW5jbHVkZSA8bGlieGx1dGlsLmg+CisKKyNpbmNsdWRlICJ4bC5oIgor I2luY2x1ZGUgInhsX3V0aWxzLmgiCisjaW5jbHVkZSAieGxfcGFyc2UuaCIKKworZXh0ZXJuIGxp YnhsX2N0eCAqY3R4OworZXh0ZXJuIGludCBsb2dmaWxlOworZXh0ZXJuIGNvbnN0IGNoYXIgKmNv bW1vbl9kb21uYW1lOworCitzdGF0aWMgaW50IGZkX2xvY2sgPSAtMTsKKworc3RhdGljIHZvaWQg cGF1c2VfZG9tYWluKHVpbnQzMl90IGRvbWlkKQoreworICAgIGxpYnhsX2RvbWFpbl9wYXVzZShj dHgsIGRvbWlkKTsKK30KKworc3RhdGljIHZvaWQgdW5wYXVzZV9kb21haW4odWludDMyX3QgZG9t aWQpCit7CisgICAgbGlieGxfZG9tYWluX3VucGF1c2UoY3R4LCBkb21pZCk7Cit9CisKK3N0YXRp YyB2b2lkIGRlc3Ryb3lfZG9tYWluKHVpbnQzMl90IGRvbWlkLCBpbnQgZm9yY2UpCit7CisgICAg aW50IHJjOworCisgICAgaWYgKGRvbWlkID09IDAgJiYgIWZvcmNlKSB7CisgICAgICAgIGZwcmlu dGYoc3RkZXJyLCAiTm90IGRlc3Ryb3lpbmcgZG9tYWluIDA7IHVzZSAtZiB0byBmb3JjZS5cbiIK KyAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGNhbiBvbmx5IGJlIGRvbmUgd2hlbiB1c2lu ZyBhIGRpc2FnZ3JlZ2F0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImhhcmR3YXJlIGRv bWFpbiBhbmQgdG9vbHN0YWNrLlxuXG4iKTsKKyAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwor ICAgIH0KKyAgICByYyA9IGxpYnhsX2RvbWFpbl9kZXN0cm95KGN0eCwgZG9taWQsIDApOworICAg IGlmIChyYykgeyBmcHJpbnRmKHN0ZGVyciwiZGVzdHJveSBmYWlsZWQgKHJjPSVkKVxuIixyYyk7 IGV4aXQoRVhJVF9GQUlMVVJFKTsgfQorfQorCitpbnQgbWFpbl9wYXVzZShpbnQgYXJnYywgY2hh ciAqKmFyZ3YpCit7CisgICAgaW50IG9wdDsKKworICAgIFNXSVRDSF9GT1JFQUNIX09QVChvcHQs ICIiLCBOVUxMLCAicGF1c2UiLCAxKSB7CisgICAgICAgIC8qIE5vIG9wdGlvbnMgKi8KKyAgICB9 CisKKyAgICBwYXVzZV9kb21haW4oeGZpbmRfZG9tYWluKGFyZ3Zbb3B0aW5kXSkpOworCisgICAg cmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworaW50IG1haW5fdW5wYXVzZShpbnQgYXJnYywgY2hh ciAqKmFyZ3YpCit7CisgICAgaW50IG9wdDsKKworICAgIFNXSVRDSF9GT1JFQUNIX09QVChvcHQs ICIiLCBOVUxMLCAidW5wYXVzZSIsIDEpIHsKKyAgICAgICAgLyogTm8gb3B0aW9ucyAqLworICAg IH0KKworICAgIHVucGF1c2VfZG9tYWluKHhmaW5kX2RvbWFpbihhcmd2W29wdGluZF0pKTsKKwor ICAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKK2ludCBtYWluX2Rlc3Ryb3koaW50IGFyZ2Ms IGNoYXIgKiphcmd2KQoreworICAgIGludCBvcHQ7CisgICAgaW50IGZvcmNlID0gMDsKKworICAg IFNXSVRDSF9GT1JFQUNIX09QVChvcHQsICJmIiwgTlVMTCwgImRlc3Ryb3kiLCAxKSB7CisgICAg Y2FzZSAnZic6CisgICAgICAgIGZvcmNlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisg ICAgZGVzdHJveV9kb21haW4oeGZpbmRfZG9tYWluKGFyZ3Zbb3B0aW5kXSksIGZvcmNlKTsKKyAg ICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCByZWJvb3RfZG9tYWluKHVp bnQzMl90IGRvbWlkLCBsaWJ4bF9ldmdlbl9kb21haW5fZGVhdGggKipkZWF0aHcsCisgICAgICAg ICAgICAgICAgICAgICAgICAgIGxpYnhsX2V2X3VzZXIgZm9yX3VzZXIsIGludCBmYWxsYmFja190 cmlnZ2VyKQoreworICAgIGludCByYzsKKworICAgIGZwcmludGYoc3RkZXJyLCAiUmVib290aW5n IGRvbWFpbiAldVxuIiwgZG9taWQpOworICAgIHJjPWxpYnhsX2RvbWFpbl9yZWJvb3QoY3R4LCBk b21pZCk7CisgICAgaWYgKHJjID09IEVSUk9SX05PUEFSQVZJUlQpIHsKKyAgICAgICAgaWYgKGZh bGxiYWNrX3RyaWdnZXIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUFYgY29udHJv bCBpbnRlcmZhY2Ugbm90IGF2YWlsYWJsZToiCisgICAgICAgICAgICAgICAgICAgICIgc2VuZGlu ZyBBQ1BJIHJlc2V0IGJ1dHRvbiBldmVudC5cbiIpOworICAgICAgICAgICAgcmMgPSBsaWJ4bF9z ZW5kX3RyaWdnZXIoY3R4LCBkb21pZCwgTElCWExfVFJJR0dFUl9SRVNFVCwgMCk7CisgICAgICAg IH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBWIGNvbnRyb2wgaW50ZXJm YWNlIG5vdCBhdmFpbGFibGU6IgorICAgICAgICAgICAgICAgICAgICAiIGV4dGVybmFsIGdyYWNl ZnVsIHJlYm9vdCBub3QgcG9zc2libGUuXG4iKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJy LCAiVXNlIFwiLUZcIiB0byBmYWxsYmFjayB0byBBQ1BJIHJlc2V0IGV2ZW50LlxuIik7CisgICAg ICAgIH0KKyAgICB9CisgICAgaWYgKHJjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJyZWJv b3QgZmFpbGVkIChyYz0lZClcbiIscmMpO2V4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyAg ICBpZiAoZGVhdGh3KSB7CisgICAgICAgIHJjID0gbGlieGxfZXZlbmFibGVfZG9tYWluX2RlYXRo KGN0eCwgZG9taWQsIGZvcl91c2VyLCBkZWF0aHcpOworICAgICAgICBpZiAocmMpIHsKKyAgICAg ICAgICAgIGZwcmludGYoc3RkZXJyLCJ3YWl0IGZvciBkZWF0aCBmYWlsZWQgKGV2Z2VuLCByYz0l ZClcbiIscmMpOworICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9Cisg ICAgfQorfQorCitzdGF0aWMgdm9pZCBzaHV0ZG93bl9kb21haW4odWludDMyX3QgZG9taWQsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlieGxfZXZnZW5fZG9tYWluX2RlYXRoICoqZGVh dGh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhsX2V2X3VzZXIgZm9yX3VzZXIs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZhbGxiYWNrX3RyaWdnZXIpCit7Cisg ICAgaW50IHJjOworCisgICAgZnByaW50ZihzdGRlcnIsICJTaHV0dGluZyBkb3duIGRvbWFpbiAl dVxuIiwgZG9taWQpOworICAgIHJjPWxpYnhsX2RvbWFpbl9zaHV0ZG93bihjdHgsIGRvbWlkKTsK KyAgICBpZiAocmMgPT0gRVJST1JfTk9QQVJBVklSVCkgeworICAgICAgICBpZiAoZmFsbGJhY2tf dHJpZ2dlcikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJQViBjb250cm9sIGludGVy ZmFjZSBub3QgYXZhaWxhYmxlOiIKKyAgICAgICAgICAgICAgICAgICAgIiBzZW5kaW5nIEFDUEkg cG93ZXIgYnV0dG9uIGV2ZW50LlxuIik7CisgICAgICAgICAgICByYyA9IGxpYnhsX3NlbmRfdHJp Z2dlcihjdHgsIGRvbWlkLCBMSUJYTF9UUklHR0VSX1BPV0VSLCAwKTsKKyAgICAgICAgfSBlbHNl IHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUFYgY29udHJvbCBpbnRlcmZhY2Ugbm90 IGF2YWlsYWJsZToiCisgICAgICAgICAgICAgICAgICAgICIgZXh0ZXJuYWwgZ3JhY2VmdWwgc2h1 dGRvd24gbm90IHBvc3NpYmxlLlxuIik7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVz ZSBcIi1GXCIgdG8gZmFsbGJhY2sgdG8gQUNQSSBwb3dlciBldmVudC5cbiIpOworICAgICAgICB9 CisgICAgfQorCisgICAgaWYgKHJjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJzaHV0ZG93 biBmYWlsZWQgKHJjPSVkKVxuIixyYyk7ZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKworICAg IGlmIChkZWF0aHcpIHsKKyAgICAgICAgcmMgPSBsaWJ4bF9ldmVuYWJsZV9kb21haW5fZGVhdGgo Y3R4LCBkb21pZCwgZm9yX3VzZXIsIGRlYXRodyk7CisgICAgICAgIGlmIChyYykgeworICAgICAg ICAgICAgZnByaW50ZihzdGRlcnIsIndhaXQgZm9yIGRlYXRoIGZhaWxlZCAoZXZnZW4sIHJjPSVk KVxuIixyYyk7CisgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgIH0KKyAg ICB9Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRfZm9yX2RvbWFpbl9kZWF0aHMobGlieGxfZXZnZW5f ZG9tYWluX2RlYXRoICoqZGVhdGh3cywgaW50IG5yKQoreworICAgIGludCByYywgY291bnQgPSAw OworICAgIExPRygiV2FpdGluZyBmb3IgJWQgZG9tYWlucyIsIG5yKTsKKyAgICB3aGlsZSgxICYm IGNvdW50IDwgbnIpIHsKKyAgICAgICAgbGlieGxfZXZlbnQgKmV2ZW50OworICAgICAgICByYyA9 IGxpYnhsX2V2ZW50X3dhaXQoY3R4LCAmZXZlbnQsIExJQlhMX0VWRU5UTUFTS19BTEwsIDAsMCk7 CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgTE9HKCJGYWlsZWQgdG8gZ2V0IGV2ZW50 LCBxdWl0dGluZyAocmM9JWQpIiwgcmMpOworICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUp OworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChldmVudC0+dHlwZSkgeworICAgICAgICBj YXNlIExJQlhMX0VWRU5UX1RZUEVfRE9NQUlOX0RFQVRIOgorICAgICAgICAgICAgTE9HKCJEb21h aW4gJWQgaGFzIGJlZW4gZGVzdHJveWVkIiwgZXZlbnQtPmRvbWlkKTsKKyAgICAgICAgICAgIGxp YnhsX2V2ZGlzYWJsZV9kb21haW5fZGVhdGgoY3R4LCBkZWF0aHdzW2V2ZW50LT5mb3JfdXNlcl0p OworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl IExJQlhMX0VWRU5UX1RZUEVfRE9NQUlOX1NIVVRET1dOOgorICAgICAgICAgICAgTE9HKCJEb21h aW4gJWQgaGFzIGJlZW4gc2h1dCBkb3duLCByZWFzb24gY29kZSAlZCIsCisgICAgICAgICAgICAg ICAgZXZlbnQtPmRvbWlkLCBldmVudC0+dS5kb21haW5fc2h1dGRvd24uc2h1dGRvd25fcmVhc29u KTsKKyAgICAgICAgICAgIGxpYnhsX2V2ZGlzYWJsZV9kb21haW5fZGVhdGgoY3R4LCBkZWF0aHdz W2V2ZW50LT5mb3JfdXNlcl0pOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIGJy ZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HKCJVbmV4cGVjdGVkIGV2ZW50 IHR5cGUgJWQiLCBldmVudC0+dHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor ICAgICAgICBsaWJ4bF9ldmVudF9mcmVlKGN0eCwgZXZlbnQpOworICAgIH0KK30KKworc3RhdGlj IGludCBtYWluX3NodXRkb3duX29yX3JlYm9vdChpbnQgZG9fcmVib290LCBpbnQgYXJnYywgY2hh ciAqKmFyZ3YpCit7CisgICAgY29uc3QgY2hhciAqd2hhdCA9IGRvX3JlYm9vdCA/ICJyZWJvb3Qi IDogInNodXRkb3duIjsKKyAgICB2b2lkICgqZm4pKHVpbnQzMl90IGRvbWlkLAorICAgICAgICAg ICAgICAgbGlieGxfZXZnZW5fZG9tYWluX2RlYXRoICoqLCBsaWJ4bF9ldl91c2VyLCBpbnQpID0K KyAgICAgICAgZG9fcmVib290ID8gJnJlYm9vdF9kb21haW4gOiAmc2h1dGRvd25fZG9tYWluOwor ICAgIGludCBvcHQsIGksIG5iX2RvbWFpbjsKKyAgICBpbnQgd2FpdF9mb3JfaXQgPSAwLCBhbGwg PSAwLCBucmRlYXRod3MgPSAwOworICAgIGludCBmYWxsYmFja190cmlnZ2VyID0gMDsKKyAgICBz dGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisgICAgICAgIHsiYWxsIiwgMCwgMCwgJ2En fSwKKyAgICAgICAgeyJ3YWl0IiwgMCwgMCwgJ3cnfSwKKyAgICAgICAgQ09NTU9OX0xPTkdfT1BU UworICAgIH07CisKKyAgICBTV0lUQ0hfRk9SRUFDSF9PUFQob3B0LCAiYXdGIiwgb3B0cywgd2hh dCwgMCkgeworICAgIGNhc2UgJ2EnOgorICAgICAgICBhbGwgPSAxOworICAgICAgICBicmVhazsK KyAgICBjYXNlICd3JzoKKyAgICAgICAgd2FpdF9mb3JfaXQgPSAxOworICAgICAgICBicmVhazsK KyAgICBjYXNlICdGJzoKKyAgICAgICAgZmFsbGJhY2tfdHJpZ2dlciA9IDE7CisgICAgICAgIGJy ZWFrOworICAgIH0KKworICAgIGlmICghYXJndltvcHRpbmRdICYmICFhbGwpIHsKKyAgICAgICAg ZnByaW50ZihzdGRlcnIsICJZb3UgbXVzdCBzcGVjaWZ5IC1hIG9yIGEgZG9tYWluIGlkLlxuXG4i KTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisKKyAgICBpZiAoYWxsKSB7 CisgICAgICAgIGxpYnhsX2RvbWluZm8gKmRvbWluZm87CisgICAgICAgIGxpYnhsX2V2Z2VuX2Rv bWFpbl9kZWF0aCAqKmRlYXRod3MgPSBOVUxMOworICAgICAgICBpZiAoIShkb21pbmZvID0gbGli eGxfbGlzdF9kb21haW4oY3R4LCAmbmJfZG9tYWluKSkpIHsKKyAgICAgICAgICAgIGZwcmludGYo c3RkZXJyLCAibGlieGxfbGlzdF9kb21haW4gZmFpbGVkLlxuIik7CisgICAgICAgICAgICByZXR1 cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdhaXRfZm9yX2l0KQor ICAgICAgICAgICAgZGVhdGh3cyA9IGNhbGxvYyhuYl9kb21haW4sIHNpemVvZigqZGVhdGh3cykp OworCisgICAgICAgIGZvciAoaSA9IDA7IGk8bmJfZG9tYWluOyBpKyspIHsKKyAgICAgICAgICAg IGlmIChkb21pbmZvW2ldLmRvbWlkID09IDAgfHwgZG9taW5mb1tpXS5uZXZlcl9zdG9wKQorICAg ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZm4oZG9taW5mb1tpXS5kb21pZCwg ZGVhdGh3cyA/ICZkZWF0aHdzW2ldIDogTlVMTCwgaSwKKyAgICAgICAgICAgICAgIGZhbGxiYWNr X3RyaWdnZXIpOworICAgICAgICAgICAgbnJkZWF0aHdzKys7CisgICAgICAgIH0KKworICAgICAg ICBpZiAoZGVhdGh3cykgeworICAgICAgICAgICAgd2FpdF9mb3JfZG9tYWluX2RlYXRocyhkZWF0 aHdzLCBucmRlYXRod3MpOworICAgICAgICAgICAgZnJlZShkZWF0aHdzKTsKKyAgICAgICAgfQor CisgICAgICAgIGxpYnhsX2RvbWluZm9fbGlzdF9mcmVlKGRvbWluZm8sIG5iX2RvbWFpbik7Cisg ICAgfSBlbHNlIHsKKyAgICAgICAgbGlieGxfZXZnZW5fZG9tYWluX2RlYXRoICpkZWF0aHcgPSBO VUxMOworICAgICAgICB1aW50MzJfdCBkb21pZCA9IHhmaW5kX2RvbWFpbihhcmd2W29wdGluZF0p OworCisgICAgICAgIGZuKGRvbWlkLCB3YWl0X2Zvcl9pdCA/ICZkZWF0aHcgOiBOVUxMLCAwLCBm YWxsYmFja190cmlnZ2VyKTsKKworICAgICAgICBpZiAod2FpdF9mb3JfaXQpCisgICAgICAgICAg ICB3YWl0X2Zvcl9kb21haW5fZGVhdGhzKCZkZWF0aHcsIDEpOworICAgIH0KKworCisgICAgcmV0 dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworaW50IG1haW5fc2h1dGRvd24oaW50IGFyZ2MsIGNoYXIg Kiphcmd2KQoreworICAgIHJldHVybiBtYWluX3NodXRkb3duX29yX3JlYm9vdCgwLCBhcmdjLCBh cmd2KTsKK30KKworaW50IG1haW5fcmVib290KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAg ICByZXR1cm4gbWFpbl9zaHV0ZG93bl9vcl9yZWJvb3QoMSwgYXJnYywgYXJndik7Cit9CisKK3N0 YXRpYyB2b2lkIGV2ZGlzYWJsZV9kaXNrX2VqZWN0cyhsaWJ4bF9ldmdlbl9kaXNrX2VqZWN0ICoq ZGlza3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9kaXNrcykK K3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZGlza3M7IGkrKykgewor ICAgICAgICBpZiAoZGlza3dzW2ldKQorICAgICAgICAgICAgbGlieGxfZXZkaXNhYmxlX2Rpc2tf ZWplY3QoY3R4LCBkaXNrd3NbaV0pOworICAgICAgICBkaXNrd3NbaV0gPSBOVUxMOworICAgIH0K K30KKworc3RhdGljIGludCBkb21haW5fd2FpdF9ldmVudCh1aW50MzJfdCBkb21pZCwgbGlieGxf ZXZlbnQgKipldmVudF9yKQoreworICAgIGludCByZXQ7CisgICAgZm9yICg7OykgeworICAgICAg ICByZXQgPSBsaWJ4bF9ldmVudF93YWl0KGN0eCwgZXZlbnRfciwgTElCWExfRVZFTlRNQVNLX0FM TCwgMCwwKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgTE9HKCJEb21haW4gJXUs IGZhaWxlZCB0byBnZXQgZXZlbnQsIHF1aXR0aW5nIChyYz0lZCkiLCBkb21pZCwgcmV0KTsKKyAg ICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgqZXZlbnRfcikt PmRvbWlkICE9IGRvbWlkKSB7CisgICAgICAgICAgICBjaGFyICpldnN0ciA9IGxpYnhsX2V2ZW50 X3RvX2pzb24oY3R4LCAqZXZlbnRfcik7CisgICAgICAgICAgICBMT0coIklOVEVSTkFMIFBST0JM RU0gLSBpZ25vcmluZyB1bmV4cGVjdGVkIGV2ZW50IGZvciIKKyAgICAgICAgICAgICAgICAiIGRv bWFpbiAlZCAoZXhwZWN0ZWQgJWQpOiBldmVudD0lcyIsCisgICAgICAgICAgICAgICAgKCpldmVu dF9yKS0+ZG9taWQsIGRvbWlkLCBldnN0cik7CisgICAgICAgICAgICBmcmVlKGV2c3RyKTsKKyAg ICAgICAgICAgIGxpYnhsX2V2ZW50X2ZyZWUoY3R4LCAqZXZlbnRfcik7CisgICAgICAgICAgICBj b250aW51ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KKworLyoK KyAqIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGNhbid0IGJlIGZyZWVkLCBidXQgYWxzbyBpZiB3 ZSBlbmNvdW50ZXIgZXJyb3JzLgorICogUmV0dXJucyB0cnVlIGluIGNhc2UgdGhlcmUgaXMgYWxy ZWFkeSwgb3Igd2UgbWFuYWdlIHRvIGZyZWUgaXQsIGVub3VnaAorICogbWVtb3J5LCBidXQgYWxz byBpZiBhdXRvYmFsbG9vbiBpcyBmYWxzZS4KKyAqLworc3RhdGljIGJvb2wgZnJlZW1lbSh1aW50 MzJfdCBkb21pZCwgbGlieGxfZG9tYWluX2J1aWxkX2luZm8gKmJfaW5mbykKK3sKKyAgICBpbnQg cmMsIHJldHJpZXMgPSAzOworICAgIHVpbnQ2NF90IG5lZWRfbWVta2IsIGZyZWVfbWVta2I7CisK KyAgICBpZiAoIWF1dG9iYWxsb29uKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJjID0g bGlieGxfZG9tYWluX25lZWRfbWVtb3J5KGN0eCwgYl9pbmZvLCAmbmVlZF9tZW1rYik7CisgICAg aWYgKHJjIDwgMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZG8geworICAgICAgICBy YyA9IGxpYnhsX2dldF9mcmVlX21lbW9yeShjdHgsICZmcmVlX21lbWtiKTsKKyAgICAgICAgaWYg KHJjIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoZnJlZV9t ZW1rYiA+PSBuZWVkX21lbWtiKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAg cmMgPSBsaWJ4bF9zZXRfbWVtb3J5X3RhcmdldChjdHgsIDAsIGZyZWVfbWVta2IgLSBuZWVkX21l bWtiLCAxLCAwKTsKKyAgICAgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxz ZTsKKworICAgICAgICAvKiB3YWl0IHVudGlsIGRvbTAgcmVhY2hlcyBpdHMgdGFyZ2V0LCBhcyBs b25nIGFzIHdlIGFyZSBtYWtpbmcKKyAgICAgICAgICogcHJvZ3Jlc3MgKi8KKyAgICAgICAgcmMg PSBsaWJ4bF93YWl0X2Zvcl9tZW1vcnlfdGFyZ2V0KGN0eCwgMCwgMTApOworICAgICAgICBpZiAo cmMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHJpZXMtLTsK KyAgICB9IHdoaWxlIChyZXRyaWVzID4gMCk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0 YXRpYyB2b2lkIHJlbG9hZF9kb21haW5fY29uZmlnKHVpbnQzMl90IGRvbWlkLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbGlieGxfZG9tYWluX2NvbmZpZyAqZF9jb25maWcpCit7 CisgICAgaW50IHJjOworICAgIHVpbnQ4X3QgKnRfZGF0YTsKKyAgICBpbnQgcmV0LCB0X2xlbjsK KyAgICBsaWJ4bF9kb21haW5fY29uZmlnIGRfY29uZmlnX25ldzsKKworICAgIC8qIEluIGNhc2Ug dXNlciBoYXMgdXNlZCAiY29uZmlnLXVwZGF0ZSIgdG8gc3RvcmUgYSBuZXcgY29uZmlnCisgICAg ICogZmlsZS4KKyAgICAgKi8KKyAgICByZXQgPSBsaWJ4bF91c2VyZGF0YV9yZXRyaWV2ZShjdHgs IGRvbWlkLCAieGwiLCAmdF9kYXRhLCAmdF9sZW4pOworICAgIGlmIChyZXQgJiYgZXJybm8gIT0g RU5PRU5UKSB7CisgICAgICAgIExPRygiXCJ4bFwiIGNvbmZpZ3VyYXRpb24gZm91bmQgYnV0IGZh aWxlZCB0byBsb2FkXG4iKTsKKyAgICB9CisgICAgaWYgKHRfbGVuID4gMCkgeworICAgICAgICBM T0coIlwieGxcIiBjb25maWd1cmF0aW9uIGZvdW5kLCB1c2luZyBpdFxuIik7CisgICAgICAgIGxp YnhsX2RvbWFpbl9jb25maWdfZGlzcG9zZShkX2NvbmZpZyk7CisgICAgICAgIGxpYnhsX2RvbWFp bl9jb25maWdfaW5pdChkX2NvbmZpZyk7CisgICAgICAgIHBhcnNlX2NvbmZpZ19kYXRhKCI8dXBk YXRlZD4iLCAoY29uc3QgY2hhciAqKXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg dF9sZW4sIGRfY29uZmlnKTsKKyAgICAgICAgZnJlZSh0X2RhdGEpOworICAgICAgICBsaWJ4bF91 c2VyZGF0YV91bmxpbmsoY3R4LCBkb21pZCwgInhsIik7CisgICAgICAgIHJldHVybjsKKyAgICB9 CisKKyAgICBsaWJ4bF9kb21haW5fY29uZmlnX2luaXQoJmRfY29uZmlnX25ldyk7CisgICAgcmMg PSBsaWJ4bF9yZXRyaWV2ZV9kb21haW5fY29uZmlndXJhdGlvbihjdHgsIGRvbWlkLCAmZF9jb25m aWdfbmV3KTsKKyAgICBpZiAocmMpIHsKKyAgICAgICAgTE9HKCJmYWlsZWQgdG8gcmV0cmlldmUg Z3Vlc3QgY29uZmlndXJhdGlvbiAocmM9JWQpLiAiCisgICAgICAgICAgICAicmV1c2luZyBvbGQg Y29uZmlndXJhdGlvbiIsIHJjKTsKKyAgICAgICAgbGlieGxfZG9tYWluX2NvbmZpZ19kaXNwb3Nl KCZkX2NvbmZpZ19uZXcpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxpYnhsX2RvbWFpbl9jb25m aWdfZGlzcG9zZShkX2NvbmZpZyk7CisgICAgICAgIC8qIFN0ZWFsIGFsbG9jYXRpb25zICovCisg ICAgICAgIG1lbWNweShkX2NvbmZpZywgJmRfY29uZmlnX25ldywgc2l6ZW9mKGxpYnhsX2RvbWFp bl9jb25maWcpKTsKKyAgICB9Cit9CisKKy8qIENhbiB1cGRhdGUgcl9kb21pZCBpZiBkb21haW4g aXMgZGVzdHJveWVkICovCitzdGF0aWMgZG9tYWluX3Jlc3RhcnRfdHlwZSBoYW5kbGVfZG9tYWlu X2RlYXRoKHVpbnQzMl90ICpyX2RvbWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBsaWJ4bF9ldmVudCAqZXZlbnQsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhsX2RvbWFpbl9jb25maWcgKmRfY29uZmln KQoreworICAgIGRvbWFpbl9yZXN0YXJ0X3R5cGUgcmVzdGFydCA9IERPTUFJTl9SRVNUQVJUX05P TkU7CisgICAgbGlieGxfYWN0aW9uX29uX3NodXRkb3duIGFjdGlvbjsKKworICAgIHN3aXRjaCAo ZXZlbnQtPnUuZG9tYWluX3NodXRkb3duLnNodXRkb3duX3JlYXNvbikgeworICAgIGNhc2UgTElC WExfU0hVVERPV05fUkVBU09OX1BPV0VST0ZGOgorICAgICAgICBhY3Rpb24gPSBkX2NvbmZpZy0+ b25fcG93ZXJvZmY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTElCWExfU0hVVERPV05fUkVB U09OX1JFQk9PVDoKKyAgICAgICAgYWN0aW9uID0gZF9jb25maWctPm9uX3JlYm9vdDsKKyAgICAg ICAgYnJlYWs7CisgICAgY2FzZSBMSUJYTF9TSFVURE9XTl9SRUFTT05fU1VTUEVORDoKKyAgICAg ICAgTE9HKCJEb21haW4gaGFzIHN1c3BlbmRlZC4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAg Y2FzZSBMSUJYTF9TSFVURE9XTl9SRUFTT05fQ1JBU0g6CisgICAgICAgIGFjdGlvbiA9IGRfY29u ZmlnLT5vbl9jcmFzaDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMSUJYTF9TSFVURE9XTl9S RUFTT05fV0FUQ0hET0c6CisgICAgICAgIGFjdGlvbiA9IGRfY29uZmlnLT5vbl93YXRjaGRvZzsK KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMSUJYTF9TSFVURE9XTl9SRUFTT05fU09GVF9SRVNF VDoKKyAgICAgICAgYWN0aW9uID0gZF9jb25maWctPm9uX3NvZnRfcmVzZXQ7CisgICAgICAgIGJy ZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRygiVW5rbm93biBzaHV0ZG93biByZWFzb24g Y29kZSAlZC4gRGVzdHJveWluZyBkb21haW4uIiwKKyAgICAgICAgICAgIGV2ZW50LT51LmRvbWFp bl9zaHV0ZG93bi5zaHV0ZG93bl9yZWFzb24pOworICAgICAgICBhY3Rpb24gPSBMSUJYTF9BQ1RJ T05fT05fU0hVVERPV05fREVTVFJPWTsKKyAgICB9CisKKyAgICBMT0coIkFjdGlvbiBmb3Igc2h1 dGRvd24gcmVhc29uIGNvZGUgJWQgaXMgJXMiLAorICAgICAgICBldmVudC0+dS5kb21haW5fc2h1 dGRvd24uc2h1dGRvd25fcmVhc29uLAorICAgICAgICBnZXRfYWN0aW9uX29uX3NodXRkb3duX25h bWUoYWN0aW9uKSk7CisKKyAgICBpZiAoYWN0aW9uID09IExJQlhMX0FDVElPTl9PTl9TSFVURE9X Tl9DT1JFRFVNUF9ERVNUUk9ZIHx8IGFjdGlvbiA9PSBMSUJYTF9BQ1RJT05fT05fU0hVVERPV05f Q09SRURVTVBfUkVTVEFSVCkgeworICAgICAgICBjaGFyICpjb3JlZmlsZTsKKyAgICAgICAgaW50 IHJjOworCisgICAgICAgIHhhc3ByaW50ZigmY29yZWZpbGUsIFhFTl9EVU1QX0RJUiAiLyVzIiwg ZF9jb25maWctPmNfaW5mby5uYW1lKTsKKyAgICAgICAgTE9HKCJkdW1waW5nIGNvcmUgdG8gJXMi LCBjb3JlZmlsZSk7CisgICAgICAgIHJjID0gbGlieGxfZG9tYWluX2NvcmVfZHVtcChjdHgsICpy X2RvbWlkLCBjb3JlZmlsZSwgTlVMTCk7CisgICAgICAgIGlmIChyYykgTE9HKCJjb3JlIGR1bXAg ZmFpbGVkIChyYz0lZCkuIiwgcmMpOworICAgICAgICBmcmVlKGNvcmVmaWxlKTsKKyAgICAgICAg LyogTm8gcG9pbnQgY3J5aW5nIG92ZXIgc3BpbGxlZCBtaWxrLCBjb250aW51ZSBvbiBmYWlsdXJl LiAqLworCisgICAgICAgIGlmIChhY3Rpb24gPT0gTElCWExfQUNUSU9OX09OX1NIVVRET1dOX0NP UkVEVU1QX0RFU1RST1kpCisgICAgICAgICAgICBhY3Rpb24gPSBMSUJYTF9BQ1RJT05fT05fU0hV VERPV05fREVTVFJPWTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWN0aW9uID0gTElCWExf QUNUSU9OX09OX1NIVVRET1dOX1JFU1RBUlQ7CisgICAgfQorCisgICAgc3dpdGNoIChhY3Rpb24p IHsKKyAgICBjYXNlIExJQlhMX0FDVElPTl9PTl9TSFVURE9XTl9QUkVTRVJWRToKKyAgICAgICAg YnJlYWs7CisKKyAgICBjYXNlIExJQlhMX0FDVElPTl9PTl9TSFVURE9XTl9SRVNUQVJUX1JFTkFN RToKKyAgICAgICAgcmVsb2FkX2RvbWFpbl9jb25maWcoKnJfZG9taWQsIGRfY29uZmlnKTsKKyAg ICAgICAgcmVzdGFydCA9IERPTUFJTl9SRVNUQVJUX1JFTkFNRTsKKyAgICAgICAgYnJlYWs7CisK KyAgICBjYXNlIExJQlhMX0FDVElPTl9PTl9TSFVURE9XTl9SRVNUQVJUOgorICAgICAgICByZWxv YWRfZG9tYWluX2NvbmZpZygqcl9kb21pZCwgZF9jb25maWcpOworICAgICAgICByZXN0YXJ0ID0g RE9NQUlOX1JFU1RBUlRfTk9STUFMOworICAgICAgICAvKiBmYWxsLXRocm91Z2ggKi8KKyAgICBj YXNlIExJQlhMX0FDVElPTl9PTl9TSFVURE9XTl9ERVNUUk9ZOgorICAgICAgICBMT0coIkRvbWFp biAlZCBuZWVkcyB0byBiZSBjbGVhbmVkIHVwOiBkZXN0cm95aW5nIHRoZSBkb21haW4iLAorICAg ICAgICAgICAgKnJfZG9taWQpOworICAgICAgICBsaWJ4bF9kb21haW5fZGVzdHJveShjdHgsICpy X2RvbWlkLCAwKTsKKyAgICAgICAgKnJfZG9taWQgPSBJTlZBTElEX0RPTUlEOworICAgICAgICBi cmVhazsKKworICAgIGNhc2UgTElCWExfQUNUSU9OX09OX1NIVVRET1dOX1NPRlRfUkVTRVQ6Cisg ICAgICAgIHJlbG9hZF9kb21haW5fY29uZmlnKCpyX2RvbWlkLCBkX2NvbmZpZyk7CisgICAgICAg IHJlc3RhcnQgPSBET01BSU5fUkVTVEFSVF9TT0ZUX1JFU0VUOworICAgICAgICBicmVhazsKKwor ICAgIGNhc2UgTElCWExfQUNUSU9OX09OX1NIVVRET1dOX0NPUkVEVU1QX0RFU1RST1k6CisgICAg Y2FzZSBMSUJYTF9BQ1RJT05fT05fU0hVVERPV05fQ09SRURVTVBfUkVTVEFSVDoKKyAgICAgICAg LyogQWxyZWFkeSBoYW5kbGVkIHRoZXNlIGFib3ZlLiAqLworICAgICAgICBhYm9ydCgpOworICAg IH0KKworICAgIHJldHVybiByZXN0YXJ0OworfQorCisvKiBQcmVzZXJ2ZSBhIGNvcHkgb2YgYSBk b21haW4gdW5kZXIgYSBuZXcgbmFtZS4gVXBkYXRlcyAqcl9kb21pZCAqLworc3RhdGljIGludCBw cmVzZXJ2ZV9kb21haW4odWludDMyX3QgKnJfZG9taWQsIGxpYnhsX2V2ZW50ICpldmVudCwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnhsX2RvbWFpbl9jb25maWcgKmRfY29uZmlnKQor eworICAgIHRpbWVfdCBub3c7CisgICAgc3RydWN0IHRtIHRtOworICAgIGNoYXIgc3RydGltZVsy NF07CisKKyAgICBsaWJ4bF91dWlkIG5ld191dWlkOworCisgICAgaW50IHJjOworCisgICAgbm93 ID0gdGltZShOVUxMKTsKKyAgICBpZiAobm93ID09ICgodGltZV90KSAtMSkpIHsKKyAgICAgICAg TE9HKCJGYWlsZWQgdG8gZ2V0IGN1cnJlbnQgdGltZSBmb3IgZG9tYWluIHJlbmFtZSIpOworICAg ICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB0enNldCgpOworICAgIGlmIChnbXRpbWVfcigm bm93LCAmdG0pID09IE5VTEwpIHsKKyAgICAgICAgTE9HKCJGYWlsZWQgdG8gY29udmVydCB0aW1l IHRvIFVUQyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIXN0cmZ0aW1l KCZzdHJ0aW1lWzBdLCBzaXplb2Yoc3RydGltZSksICItJVklbSVkVCVIJU1aIiwgJnRtKSkgewor ICAgICAgICBMT0coIkZhaWxlZCB0byBmb3JtYXQgdGltZSBhcyBhIHN0cmluZyIpOworICAgICAg ICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBsaWJ4bF91dWlkX2dlbmVyYXRlKCZuZXdfdXVpZCk7 CisKKyAgICBMT0coIlByZXNlcnZpbmcgZG9tYWluICV1ICVzIHdpdGggc3VmZml4JXMiLAorICAg ICAgICAqcl9kb21pZCwgZF9jb25maWctPmNfaW5mby5uYW1lLCBzdHJ0aW1lKTsKKyAgICByYyA9 IGxpYnhsX2RvbWFpbl9wcmVzZXJ2ZShjdHgsICpyX2RvbWlkLCAmZF9jb25maWctPmNfaW5mbywK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ0aW1lLCBuZXdfdXVpZCk7CisKKyAg ICAvKgorICAgICAqIEFsdGhvdWdoIHRoZSBkb21haW4gc3RpbGwgZXhpc3RzIGl0IGlzIG5vIGxv bmdlciB0aGUgb25lIHdlIGFyZQorICAgICAqIGNvbmNlcm5lZCB3aXRoLgorICAgICAqLworICAg ICpyX2RvbWlkID0gSU5WQUxJRF9ET01JRDsKKworICAgIHJldHVybiByYyA9PSAwID8gMSA6IDA7 Cit9CisKK3N0YXRpYyB2b2lkIGNvbnNvbGVfY2hpbGRfcmVwb3J0KHhsY2hpbGRudW0gY2hpbGQp Cit7CisgICAgaWYgKHhsX2NoaWxkX3BpZChjaGlsZCkpCisgICAgICAgIGNoaWxkX3JlcG9ydChj aGlsZCk7Cit9CisKK3N0YXRpYyBpbnQgdm5jdmlld2VyKHVpbnQzMl90IGRvbWlkLCBpbnQgYXV0 b3Bhc3MpCit7CisgICAgbGlieGxfdm5jdmlld2VyX2V4ZWMoY3R4LCBkb21pZCwgYXV0b3Bhc3Mp OworICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGV4ZWN1dGUgdm5jdmlld2VyXG4iKTsK KyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgYXV0b2Nvbm5lY3Rfdm5jdmlld2VyKHVp bnQzMl90IGRvbWlkLCBpbnQgYXV0b3Bhc3MpCit7CisgICBjb25zb2xlX2NoaWxkX3JlcG9ydChj aGlsZF92bmN2aWV3ZXIpOworCisgICAgcGlkX3QgcGlkID0geGxfZm9yayhjaGlsZF92bmN2aWV3 ZXIsICJ2bmN2aWV3ZXIgY2hpbGQiKTsKKyAgICBpZiAocGlkKQorICAgICAgICByZXR1cm47CisK KyAgICBwb3N0Zm9yaygpOworCisgICAgc2xlZXAoMSk7CisgICAgdm5jdmlld2VyKGRvbWlkLCBh dXRvcGFzcyk7CisgICAgX2V4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworc3RhdGljIGludCBhY3F1 aXJlX2xvY2sodm9pZCkKK3sKKyAgICBpbnQgcmM7CisgICAgc3RydWN0IGZsb2NrIGZsOworCisg ICAgLyogbG9jayBhbHJlYWR5IGFjcXVpcmVkICovCisgICAgaWYgKGZkX2xvY2sgPj0gMCkKKyAg ICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMOworCisgICAgZmwubF90eXBlID0gRl9XUkxDSzsKKyAg ICBmbC5sX3doZW5jZSA9IFNFRUtfU0VUOworICAgIGZsLmxfc3RhcnQgPSAwOworICAgIGZsLmxf bGVuID0gMDsKKyAgICBmZF9sb2NrID0gb3Blbihsb2NrZmlsZSwgT19XUk9OTFl8T19DUkVBVCwg U19JV1VTUik7CisgICAgaWYgKGZkX2xvY2sgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJy LCAiY2Fubm90IG9wZW4gdGhlIGxvY2tmaWxlICVzIGVycm5vPSVkXG4iLCBsb2NrZmlsZSwgZXJy bm8pOworICAgICAgICByZXR1cm4gRVJST1JfRkFJTDsKKyAgICB9CisgICAgaWYgKGZjbnRsKGZk X2xvY2ssIEZfU0VURkQsIEZEX0NMT0VYRUMpIDwgMCkgeworICAgICAgICBjbG9zZShmZF9sb2Nr KTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjYW5ub3Qgc2V0IGNsb2V4ZWMgdG8gbG9ja2Zp bGUgJXMgZXJybm89JWRcbiIsIGxvY2tmaWxlLCBlcnJubyk7CisgICAgICAgIHJldHVybiBFUlJP Ul9GQUlMOworICAgIH0KK2dldF9sb2NrOgorICAgIHJjID0gZmNudGwoZmRfbG9jaywgRl9TRVRM S1csICZmbCk7CisgICAgaWYgKHJjIDwgMCAmJiBlcnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290 byBnZXRfbG9jazsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAi Y2Fubm90IGFjcXVpcmUgbG9jayAlcyBlcnJubz0lZFxuIiwgbG9ja2ZpbGUsIGVycm5vKTsKKyAg ICAgICAgcmMgPSBFUlJPUl9GQUlMOworICAgIH0gZWxzZQorICAgICAgICByYyA9IDA7CisgICAg cmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJlbGVhc2VfbG9jayh2b2lkKQoreworICAgIGlu dCByYzsKKyAgICBzdHJ1Y3QgZmxvY2sgZmw7CisKKyAgICAvKiBsb2NrIG5vdCBhY3F1aXJlZCAq LworICAgIGlmIChmZF9sb2NrIDwgMCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMOworCity ZWxlYXNlX2xvY2s6CisgICAgZmwubF90eXBlID0gRl9VTkxDSzsKKyAgICBmbC5sX3doZW5jZSA9 IFNFRUtfU0VUOworICAgIGZsLmxfc3RhcnQgPSAwOworICAgIGZsLmxfbGVuID0gMDsKKworICAg IHJjID0gZmNudGwoZmRfbG9jaywgRl9TRVRMS1csICZmbCk7CisgICAgaWYgKHJjIDwgMCAmJiBl cnJubyA9PSBFSU5UUikKKyAgICAgICAgZ290byByZWxlYXNlX2xvY2s7CisgICAgaWYgKHJjIDwg MCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCByZWxlYXNlIGxvY2sgJXMsIGVy cm5vPSVkXG4iLCBsb2NrZmlsZSwgZXJybm8pOworICAgICAgICByYyA9IEVSUk9SX0ZBSUw7Cisg ICAgfSBlbHNlCisgICAgICAgIHJjID0gMDsKKyAgICBjbG9zZShmZF9sb2NrKTsKKyAgICBmZF9s b2NrID0gLTE7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQgYXV0b2Nvbm5l Y3RfY29uc29sZShsaWJ4bF9jdHggKmN0eF9pZ25vcmVkLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBsaWJ4bF9ldmVudCAqZXYsIHZvaWQgKnByaXYpCit7CisgICAgdWludDMyX3Qg Ymxkb21pZCA9IGV2LT5kb21pZDsKKyAgICBpbnQgbm90aWZ5X2ZkID0gKihpbnQqKXByaXY7IC8q IHdyaXRlIGVuZCBvZiB0aGUgbm90aWZpY2F0aW9uIHBpcGUgKi8KKworICAgIGxpYnhsX2V2ZW50 X2ZyZWUoY3R4LCBldik7CisKKyAgICBjb25zb2xlX2NoaWxkX3JlcG9ydChjaGlsZF9jb25zb2xl KTsKKworICAgIHBpZF90IHBpZCA9IHhsX2ZvcmsoY2hpbGRfY29uc29sZSwgImNvbnNvbGUgY2hp bGQiKTsKKyAgICBpZiAocGlkKQorICAgICAgICByZXR1cm47CisKKyAgICBwb3N0Zm9yaygpOwor CisgICAgc2xlZXAoMSk7CisgICAgbGlieGxfcHJpbWFyeV9jb25zb2xlX2V4ZWMoY3R4LCBibGRv bWlkLCBub3RpZnlfZmQpOworICAgIC8qIERvIG5vdCByZXR1cm4uIHhsIGNvbnRpbnVlZCBpbiBj aGlsZCBwcm9jZXNzICovCisgICAgcGVycm9yKCJ4bDogdW5hYmxlIHRvIGV4ZWMgY29uc29sZSBj bGllbnQiKTsKKyAgICBfZXhpdCgxKTsKK30KKworaW50IGNyZWF0ZV9kb21haW4oc3RydWN0IGRv bWFpbl9jcmVhdGUgKmRvbV9pbmZvKQoreworICAgIHVpbnQzMl90IGRvbWlkID0gSU5WQUxJRF9E T01JRDsKKworICAgIGxpYnhsX2RvbWFpbl9jb25maWcgZF9jb25maWc7CisKKyAgICBpbnQgZGVi dWcgPSBkb21faW5mby0+ZGVidWc7CisgICAgaW50IGRhZW1vbml6ZSA9IGRvbV9pbmZvLT5kYWVt b25pemU7CisgICAgaW50IG1vbml0b3IgPSBkb21faW5mby0+bW9uaXRvcjsKKyAgICBpbnQgcGF1 c2VkID0gZG9tX2luZm8tPnBhdXNlZDsKKyAgICBpbnQgdm5jYXV0b3Bhc3MgPSBkb21faW5mby0+ dm5jYXV0b3Bhc3M7CisgICAgY29uc3QgY2hhciAqY29uZmlnX2ZpbGUgPSBkb21faW5mby0+Y29u ZmlnX2ZpbGU7CisgICAgY29uc3QgY2hhciAqZXh0cmFfY29uZmlnID0gZG9tX2luZm8tPmV4dHJh X2NvbmZpZzsKKyAgICBjb25zdCBjaGFyICpyZXN0b3JlX2ZpbGUgPSBkb21faW5mby0+cmVzdG9y ZV9maWxlOworICAgIGNvbnN0IGNoYXIgKmNvbmZpZ19zb3VyY2UgPSBOVUxMOworICAgIGNvbnN0 IGNoYXIgKnJlc3RvcmVfc291cmNlID0gTlVMTDsKKyAgICBpbnQgbWlncmF0ZV9mZCA9IGRvbV9p bmZvLT5taWdyYXRlX2ZkOworICAgIGJvb2wgY29uZmlnX2luX2pzb247CisKKyAgICBpbnQgaTsK KyAgICBpbnQgbmVlZF9kYWVtb24gPSBkYWVtb25pemU7CisgICAgaW50IHJldCwgcmM7CisgICAg bGlieGxfZXZnZW5fZG9tYWluX2RlYXRoICpkZWF0aHcgPSBOVUxMOworICAgIGxpYnhsX2V2Z2Vu X2Rpc2tfZWplY3QgKipkaXNrd3MgPSBOVUxMOyAvKiBvbmUgcGVyIGRpc2sgKi8KKyAgICB1bnNp Z25lZCBpbnQgbnVtX2Rpc2t3cyA9IDA7CisgICAgdm9pZCAqY29uZmlnX2RhdGEgPSAwOworICAg IGludCBjb25maWdfbGVuID0gMDsKKyAgICBpbnQgcmVzdG9yZV9mZCA9IC0xOworICAgIGludCBy ZXN0b3JlX2ZkX3RvX2Nsb3NlID0gLTE7CisgICAgaW50IHNlbmRfYmFja19mZCA9IC0xOworICAg IGNvbnN0IGxpYnhsX2FzeW5jcHJvZ3Jlc3NfaG93ICphdXRvY29ubmVjdF9jb25zb2xlX2hvdzsK KyAgICBpbnQgbm90aWZ5X3BpcGVbMl0gPSB7IC0xLCAtMSB9OworICAgIHN0cnVjdCBzYXZlX2Zp bGVfaGVhZGVyIGhkcjsKKyAgICB1aW50MzJfdCBkb21pZF9zb2Z0X3Jlc2V0ID0gSU5WQUxJRF9E T01JRDsKKworICAgIGludCByZXN0b3JpbmcgPSAocmVzdG9yZV9maWxlIHx8IChtaWdyYXRlX2Zk ID49IDApKTsKKworICAgIGxpYnhsX2RvbWFpbl9jb25maWdfaW5pdCgmZF9jb25maWcpOworCisg ICAgaWYgKHJlc3RvcmluZykgeworICAgICAgICB1aW50OF90ICpvcHRkYXRhX2JlZ2luID0gMDsK KyAgICAgICAgY29uc3QgdWludDhfdCAqb3B0ZGF0YV9oZXJlID0gMDsKKyAgICAgICAgdW5pb24g eyB1aW50MzJfdCB1MzI7IGNoYXIgYls0XTsgfSB1MzJidWY7CisgICAgICAgIHVpbnQzMl90IGJh ZGZsYWdzOworCisgICAgICAgIGlmIChtaWdyYXRlX2ZkID49IDApIHsKKyAgICAgICAgICAgIHJl c3RvcmVfc291cmNlID0gIjxpbmNvbWluZyBtaWdyYXRpb24gc3RyZWFtPiI7CisgICAgICAgICAg ICByZXN0b3JlX2ZkID0gbWlncmF0ZV9mZDsKKyAgICAgICAgICAgIHNlbmRfYmFja19mZCA9IGRv bV9pbmZvLT5zZW5kX2JhY2tfZmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN0 b3JlX3NvdXJjZSA9IHJlc3RvcmVfZmlsZTsKKyAgICAgICAgICAgIHJlc3RvcmVfZmQgPSBvcGVu KHJlc3RvcmVfZmlsZSwgT19SRE9OTFkpOworICAgICAgICAgICAgaWYgKHJlc3RvcmVfZmQgPT0g LTEpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG9wZW4gcmVzdG9y ZSBmaWxlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4g RVJST1JfSU5WQUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN0b3JlX2ZkX3RvX2Ns b3NlID0gcmVzdG9yZV9mZDsKKyAgICAgICAgICAgIHJjID0gbGlieGxfZmRfc2V0X2Nsb2V4ZWMo Y3R4LCByZXN0b3JlX2ZkLCAxKTsKKyAgICAgICAgICAgIGlmIChyYykgcmV0dXJuIHJjOworICAg ICAgICB9CisKKyAgICAgICAgQ0hLX0VSUk5PVkFMKGxpYnhsX3JlYWRfZXhhY3RseSgKKyAgICAg ICAgICAgICAgICAgICAgICAgICBjdHgsIHJlc3RvcmVfZmQsICZoZHIsIHNpemVvZihoZHIpLAor ICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfc291cmNlLCAiaGVhZGVyIikpOworICAg ICAgICBpZiAobWVtY21wKGhkci5tYWdpYywgc2F2ZWZpbGVoZWFkZXJfbWFnaWMsIHNpemVvZiho ZHIubWFnaWMpKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGaWxlIGhhcyB3cm9u ZyBtYWdpYyBudW1iZXIgLSIKKyAgICAgICAgICAgICAgICAgICAgIiBjb3JydXB0IG9yIGZvciBh IGRpZmZlcmVudCB0b29sP1xuIik7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfSU5WQUw7Cisg ICAgICAgIH0KKyAgICAgICAgaWYgKGhkci5ieXRlb3JkZXIgIT0gU0FWRUZJTEVfQllURU9SREVS X1ZBTFVFKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZpbGUgaGFzIHdyb25nIGJ5 dGUgb3JkZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMOworICAgICAgICB9 CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTG9hZGluZyBuZXcgc2F2ZSBmaWxlICVzIgorICAg ICAgICAgICAgICAgICIgKG5ldyB4bCBmbXQgaW5mbyIKKyAgICAgICAgICAgICAgICAiIDB4JSJQ Ukl4MzIiLzB4JSJQUkl4MzIiLyUiUFJJdTMyIilcbiIsCisgICAgICAgICAgICAgICAgcmVzdG9y ZV9zb3VyY2UsIGhkci5tYW5kYXRvcnlfZmxhZ3MsIGhkci5vcHRpb25hbF9mbGFncywKKyAgICAg ICAgICAgICAgICBoZHIub3B0aW9uYWxfZGF0YV9sZW4pOworCisgICAgICAgIGJhZGZsYWdzID0g aGRyLm1hbmRhdG9yeV9mbGFncyAmIH5YTF9NQU5EQVRPUllfRkxBR19BTEw7CisgICAgICAgIGlm IChiYWRmbGFncykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTYXZlZmlsZSBoYXMg bWFuZGF0b3J5IGZsYWcocykgMHglIlBSSXgzMiIgIgorICAgICAgICAgICAgICAgICAgICAid2hp Y2ggYXJlIG5vdCBzdXBwb3J0ZWQ7IG5lZWQgbmV3ZXIgeGxcbiIsCisgICAgICAgICAgICAgICAg ICAgIGJhZGZsYWdzKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTlZBTDsKKyAgICAgICAg fQorICAgICAgICBpZiAoaGRyLm9wdGlvbmFsX2RhdGFfbGVuKSB7CisgICAgICAgICAgICBvcHRk YXRhX2JlZ2luID0geG1hbGxvYyhoZHIub3B0aW9uYWxfZGF0YV9sZW4pOworICAgICAgICAgICAg Q0hLX0VSUk5PVkFMKGxpYnhsX3JlYWRfZXhhY3RseSgKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY3R4LCByZXN0b3JlX2ZkLCBvcHRkYXRhX2JlZ2luLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBoZHIub3B0aW9uYWxfZGF0YV9sZW4sIHJlc3RvcmVfc291cmNlLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAib3B0ZGF0YSIpKTsKKyAgICAgICAgfQorCisjZGVmaW5l IE9QVERBVEFfTEVGVCAgKGhkci5vcHRpb25hbF9kYXRhX2xlbiAtIChvcHRkYXRhX2hlcmUgLSBv cHRkYXRhX2JlZ2luKSkKKyNkZWZpbmUgV0lUSF9PUFREQVRBKGFtdCwgYm9keSkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoT1BUREFUQV9MRUZUIDwg KGFtdCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZwcmlu dGYoc3RkZXJyLCAiU2F2ZWZpbGUgdHJ1bmNhdGVkLlxuIik7ICAgICAgIFwKKyAgICAgICAgICAg ICAgICByZXR1cm4gRVJST1JfSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg ICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAorICAgICAgICAgICAgICAgIGJvZHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBvcHRkYXRhX2hlcmUgKz0gKGFtdCk7 ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9CisKKyAgICAgICAgb3B0 ZGF0YV9oZXJlID0gb3B0ZGF0YV9iZWdpbjsKKworICAgICAgICBpZiAoT1BUREFUQV9MRUZUKSB7 CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBTYXZlZmlsZSBjb250YWlucyB4bCBkb21h aW4gY29uZmlnJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICEhKGhkci5tYW5kYXRvcnlfZmxh Z3MgJiBYTF9NQU5EQVRPUllfRkxBR19KU09OKQorICAgICAgICAgICAgICAgICAgICA/ICIgaW4g SlNPTiBmb3JtYXQiIDogIiIpOworICAgICAgICAgICAgV0lUSF9PUFREQVRBKDQsIHsKKyAgICAg ICAgICAgICAgICBtZW1jcHkodTMyYnVmLmIsIG9wdGRhdGFfaGVyZSwgNCk7CisgICAgICAgICAg ICAgICAgY29uZmlnX2xlbiA9IHUzMmJ1Zi51MzI7CisgICAgICAgICAgICB9KTsKKyAgICAgICAg ICAgIFdJVEhfT1BUREFUQShjb25maWdfbGVuLCB7CisgICAgICAgICAgICAgICAgY29uZmlnX2Rh dGEgPSB4bWFsbG9jKGNvbmZpZ19sZW4pOworICAgICAgICAgICAgICAgIG1lbWNweShjb25maWdf ZGF0YSwgb3B0ZGF0YV9oZXJlLCBjb25maWdfbGVuKTsKKyAgICAgICAgICAgIH0pOworICAgICAg ICB9CisKKyAgICB9CisKKyAgICBpZiAoY29uZmlnX2ZpbGUpIHsKKyAgICAgICAgZnJlZShjb25m aWdfZGF0YSk7ICBjb25maWdfZGF0YSA9IDA7CisgICAgICAgIC8qIC9kZXYvbnVsbCByZXByZXNl bnRzIHNwZWNpYWwgY2FzZSAocmVhZCBjb25maWcuIGZyb20gY29tbWFuZCBsaW5lKSAqLworICAg ICAgICBpZiAoIXN0cmNtcChjb25maWdfZmlsZSwgIi9kZXYvbnVsbCIpKSB7CisgICAgICAgICAg ICBjb25maWdfbGVuID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGxp YnhsX3JlYWRfZmlsZV9jb250ZW50cyhjdHgsIGNvbmZpZ19maWxlLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWdfZGF0YSwgJmNvbmZpZ19sZW4pOwor ICAgICAgICAgICAgaWYgKHJldCkgeyBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZWFkIGNv bmZpZyBmaWxlOiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u ZmlnX2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7IHJldHVybiBFUlJPUl9GQUlMOyB9CisgICAgICAg IH0KKyAgICAgICAgaWYgKCFyZXN0b3JpbmcgJiYgZXh0cmFfY29uZmlnICYmIHN0cmxlbihleHRy YV9jb25maWcpKSB7CisgICAgICAgICAgICBpZiAoY29uZmlnX2xlbiA+IElOVF9NQVggLSAoc3Ry bGVuKGV4dHJhX2NvbmZpZykgKyAyICsgMSkpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0 ZGVyciwgIkZhaWxlZCB0byBhdHRhY2ggZXh0cmEgY29uZmlndXJhdGlvblxuIik7CisgICAgICAg ICAgICAgICAgcmV0dXJuIEVSUk9SX0ZBSUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAv KiBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGV4dHJhIGNvbmZpZyBwbHVzIHR3byBFT0xzIHBsdXMg XDAgKi8KKyAgICAgICAgICAgIGNvbmZpZ19kYXRhID0geHJlYWxsb2MoY29uZmlnX2RhdGEsIGNv bmZpZ19sZW4KKyAgICAgICAgICAgICAgICArIHN0cmxlbihleHRyYV9jb25maWcpICsgMiArIDEp OworICAgICAgICAgICAgY29uZmlnX2xlbiArPSBzcHJpbnRmKGNvbmZpZ19kYXRhICsgY29uZmln X2xlbiwgIlxuJXNcbiIsCisgICAgICAgICAgICAgICAgZXh0cmFfY29uZmlnKTsKKyAgICAgICAg fQorICAgICAgICBjb25maWdfc291cmNlPWNvbmZpZ19maWxlOworICAgICAgICBjb25maWdfaW5f anNvbiA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghY29uZmlnX2RhdGEpIHsK KyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29uZmlnIGZpbGUgbm90IHNwZWNpZmllZCBh bmQiCisgICAgICAgICAgICAgICAgICAgICIgbm9uZSBpbiBzYXZlIGZpbGVcbiIpOworICAgICAg ICAgICAgcmV0dXJuIEVSUk9SX0lOVkFMOworICAgICAgICB9CisgICAgICAgIGNvbmZpZ19zb3Vy Y2UgPSAiPHNhdmVkPiI7CisgICAgICAgIGNvbmZpZ19pbl9qc29uID0gISEoaGRyLm1hbmRhdG9y eV9mbGFncyAmIFhMX01BTkRBVE9SWV9GTEFHX0pTT04pOworICAgIH0KKworICAgIGlmICghZG9t X2luZm8tPnF1aWV0KQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnNpbmcgY29uZmlnIGZy b20gJXNcbiIsIGNvbmZpZ19zb3VyY2UpOworCisgICAgaWYgKGNvbmZpZ19pbl9qc29uKSB7Cisg ICAgICAgIGxpYnhsX2RvbWFpbl9jb25maWdfZnJvbV9qc29uKGN0eCwgJmRfY29uZmlnLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKWNvbmZpZ19k YXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXJzZV9jb25maWdfZGF0YShjb25maWdfc291 cmNlLCBjb25maWdfZGF0YSwgY29uZmlnX2xlbiwgJmRfY29uZmlnKTsKKyAgICB9CisKKyAgICBp ZiAobWlncmF0ZV9mZCA+PSAwKSB7CisgICAgICAgIGlmIChkX2NvbmZpZy5jX2luZm8ubmFtZSkg eworICAgICAgICAgICAgLyogd2hlbiB3ZSByZWNlaXZlIGEgZG9tYWluIHdlIGdldCBpdHMgbmFt ZSBmcm9tIHRoZSBjb25maWcKKyAgICAgICAgICAgICAqIGZpbGU7IGFuZCB3ZSByZWNlaXZlIGl0 IHRvIGEgdGVtcG9yYXJ5IG5hbWUgKi8KKyAgICAgICAgICAgIGFzc2VydCghY29tbW9uX2RvbW5h bWUpOworCisgICAgICAgICAgICBjb21tb25fZG9tbmFtZSA9IGRfY29uZmlnLmNfaW5mby5uYW1l OworICAgICAgICAgICAgZF9jb25maWcuY19pbmZvLm5hbWUgPSAwOyAvKiBzdGVhbHMgYWxsb2Nh dGlvbiBmcm9tIGNvbmZpZyAqLworCisgICAgICAgICAgICB4YXNwcmludGYoJmRfY29uZmlnLmNf aW5mby5uYW1lLCAiJXMtLWluY29taW5nIiwgY29tbW9uX2RvbW5hbWUpOworICAgICAgICAgICAg KmRvbV9pbmZvLT5taWdyYXRpb25fZG9tbmFtZV9yID0gc3RyZHVwKGRfY29uZmlnLmNfaW5mby5u YW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkZWJ1ZyB8fCBkb21faW5mby0+ZHJ5 cnVuKSB7CisgICAgICAgIEZJTEUgKmNmZ19wcmludF9maCA9IChkZWJ1ZyAmJiAhZG9tX2luZm8t PmRyeXJ1bikgPyBzdGRlcnIgOiBzdGRvdXQ7CisgICAgICAgIGlmIChkZWZhdWx0X291dHB1dF9m b3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9TWFApIHsKKyAgICAgICAgICAgIHByaW50Zl9pbmZvX3Nl eHAoLTEsICZkX2NvbmZpZywgY2ZnX3ByaW50X2ZoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg ICAgICAgIGNoYXIgKmpzb24gPSBsaWJ4bF9kb21haW5fY29uZmlnX3RvX2pzb24oY3R4LCAmZF9j b25maWcpOworICAgICAgICAgICAgaWYgKCFqc29uKSB7CisgICAgICAgICAgICAgICAgZnByaW50 ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNvbnZlcnQgZG9t YWluIGNvbmZpZ3VyYXRpb24gdG8gSlNPTlxuIik7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsK KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZwdXRzKGpzb24sIGNmZ19wcmludF9maCk7Cisg ICAgICAgICAgICBmcmVlKGpzb24pOworICAgICAgICAgICAgeGZsdXNoX3N0cmVhbShjZmdfcHJp bnRfZmgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICByZXQgPSAwOworICAgIGlmIChkb21f aW5mby0+ZHJ5cnVuKQorICAgICAgICBnb3RvIG91dDsKKworc3RhcnQ6CisgICAgYXNzZXJ0KGRv bWlkID09IElOVkFMSURfRE9NSUQpOworCisgICAgcmMgPSBhY3F1aXJlX2xvY2soKTsKKyAgICBp ZiAocmMgPCAwKQorICAgICAgICBnb3RvIGVycm9yX291dDsKKworICAgIGlmIChkb21pZF9zb2Z0 X3Jlc2V0ID09IElOVkFMSURfRE9NSUQpIHsKKyAgICAgICAgaWYgKCFmcmVlbWVtKGRvbWlkLCAm ZF9jb25maWcuYl9pbmZvKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsZWQg dG8gZnJlZSBtZW1vcnkgZm9yIHRoZSBkb21haW5cbiIpOworICAgICAgICAgICAgcmV0ID0gRVJS T1JfRkFJTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3Jfb3V0OworICAgICAgICB9CisgICAgfQor CisgICAgbGlieGxfYXN5bmNwcm9ncmVzc19ob3cgYXV0b2Nvbm5lY3RfY29uc29sZV9ob3dfYnVm OworICAgIGlmICggZG9tX2luZm8tPmNvbnNvbGVfYXV0b2Nvbm5lY3QgKSB7CisgICAgICAgIGlm IChsaWJ4bF9waXBlKGN0eCwgbm90aWZ5X3BpcGUpKSB7CisgICAgICAgICAgICByZXQgPSBFUlJP Ul9GQUlMOworICAgICAgICAgICAgZ290byBlcnJvcl9vdXQ7CisgICAgICAgIH0KKyAgICAgICAg YXV0b2Nvbm5lY3RfY29uc29sZV9ob3dfYnVmLmNhbGxiYWNrID0gYXV0b2Nvbm5lY3RfY29uc29s ZTsKKyAgICAgICAgYXV0b2Nvbm5lY3RfY29uc29sZV9ob3dfYnVmLmZvcl9jYWxsYmFjayA9ICZu b3RpZnlfcGlwZVsxXTsKKyAgICAgICAgYXV0b2Nvbm5lY3RfY29uc29sZV9ob3cgPSAmYXV0b2Nv bm5lY3RfY29uc29sZV9ob3dfYnVmOworICAgIH1lbHNleworICAgICAgICBhdXRvY29ubmVjdF9j b25zb2xlX2hvdyA9IDA7CisgICAgfQorCisgICAgaWYgKCByZXN0b3JpbmcgKSB7CisgICAgICAg IGxpYnhsX2RvbWFpbl9yZXN0b3JlX3BhcmFtcyBwYXJhbXM7CisKKyAgICAgICAgbGlieGxfZG9t YWluX3Jlc3RvcmVfcGFyYW1zX2luaXQoJnBhcmFtcyk7CisKKyAgICAgICAgcGFyYW1zLmNoZWNr cG9pbnRlZF9zdHJlYW0gPSBkb21faW5mby0+Y2hlY2twb2ludGVkX3N0cmVhbTsKKyAgICAgICAg cGFyYW1zLnN0cmVhbV92ZXJzaW9uID0KKyAgICAgICAgICAgIChoZHIubWFuZGF0b3J5X2ZsYWdz ICYgWExfTUFOREFUT1JZX0ZMQUdfU1RSRUFNdjIpID8gMiA6IDE7CisgICAgICAgIHBhcmFtcy5j b2xvX3Byb3h5X3NjcmlwdCA9IGRvbV9pbmZvLT5jb2xvX3Byb3h5X3NjcmlwdDsKKworICAgICAg ICByZXQgPSBsaWJ4bF9kb21haW5fY3JlYXRlX3Jlc3RvcmUoY3R4LCAmZF9jb25maWcsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG9taWQsIHJlc3RvcmVfZmQs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2JhY2tfZmQs ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBh dXRvY29ubmVjdF9jb25zb2xlX2hvdyk7CisKKyAgICAgICAgbGlieGxfZG9tYWluX3Jlc3RvcmVf cGFyYW1zX2Rpc3Bvc2UoJnBhcmFtcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogT24gc3Vi c2VxdWVudCByZWJvb3QgZXRjIHdlIHNob3VsZCBjcmVhdGUgdGhlIGRvbWFpbiwgbm90CisgICAg ICAgICAqIHJlc3RvcmUvbWlncmF0ZS1yZWNlaXZlIGl0IGFnYWluLgorICAgICAgICAgKi8KKyAg ICAgICAgcmVzdG9yaW5nID0gMDsKKyAgICB9IGVsc2UgaWYgKGRvbWlkX3NvZnRfcmVzZXQgIT0g SU5WQUxJRF9ET01JRCkgeworICAgICAgICAvKiBEbyBzb2Z0IHJlc2V0LiAqLworICAgICAgICBy ZXQgPSBsaWJ4bF9kb21haW5fc29mdF9yZXNldChjdHgsICZkX2NvbmZpZywgZG9taWRfc29mdF9y ZXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYXV0b2Nvbm5l Y3RfY29uc29sZV9ob3cpOworICAgICAgICBkb21pZCA9IGRvbWlkX3NvZnRfcmVzZXQ7CisgICAg ICAgIGRvbWlkX3NvZnRfcmVzZXQgPSBJTlZBTElEX0RPTUlEOworICAgIH0gZWxzZSB7CisgICAg ICAgIHJldCA9IGxpYnhsX2RvbWFpbl9jcmVhdGVfbmV3KGN0eCwgJmRfY29uZmlnLCAmZG9taWQs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGF1dG9jb25uZWN0X2Nv bnNvbGVfaG93KTsKKyAgICB9CisgICAgaWYgKCByZXQgKQorICAgICAgICBnb3RvIGVycm9yX291 dDsKKworICAgIHJlbGVhc2VfbG9jaygpOworCisgICAgaWYgKHJlc3RvcmVfZmRfdG9fY2xvc2Ug Pj0gMCkgeworICAgICAgICBpZiAoY2xvc2UocmVzdG9yZV9mZF90b19jbG9zZSkpCisgICAgICAg ICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjbG9zZSByZXN0b3JpbmcgZmlsZSwgZmQg JWQsIGVycm5vICVkXG4iLAorICAgICAgICAgICAgICAgICAgICByZXN0b3JlX2ZkX3RvX2Nsb3Nl LCBlcnJubyk7CisgICAgICAgIHJlc3RvcmVfZmRfdG9fY2xvc2UgPSAtMTsKKyAgICB9CisKKyAg ICBpZiAoYXV0b2Nvbm5lY3RfY29uc29sZV9ob3cpIHsKKyAgICAgICAgY2hhciBidWZbMV07Cisg ICAgICAgIGludCByOworCisgICAgICAgIC8qIFRyeSB0byBnZXQgbm90aWZpY2F0aW9uIGZyb20g eGVuY29uc29sZS4gSnVzdCBtb3ZlIG9uIGlmCisgICAgICAgICAqIGVycm9yIG9jY3VycyAtLSBp dCdzIG9ubHkgbWlub3IgYW5ub3lhbmNlIGlmIGNvbnNvbGUKKyAgICAgICAgICogZG9lc24ndCBz aG93IHVwLgorICAgICAgICAgKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgciA9IHJlYWQo bm90aWZ5X3BpcGVbMF0sIGJ1ZiwgMSk7CisgICAgICAgIH0gd2hpbGUgKHIgPT0gLTEgJiYgZXJy bm8gPT0gRUlOVFIpOworCisgICAgICAgIGlmIChyID09IC0xKQorICAgICAgICAgICAgZnByaW50 ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IG5vdGlmaWNhdGlv biBmcm9tIHhlbmNvbnNvbGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihl cnJubykpOworICAgICAgICBlbHNlIGlmIChyID09IDApCisgICAgICAgICAgICBmcHJpbnRmKHN0 ZGVyciwgIkdvdCBFT0YgZnJvbSB4ZW5jb25zb2xlIG5vdGlmaWNhdGlvbiBmZFxuIik7CisgICAg ICAgIGVsc2UgaWYgKHIgPT0gMSAmJiBidWZbMF0gIT0gMHgwMCkKKyAgICAgICAgICAgIGZwcmlu dGYoc3RkZXJyLCAiR290IHVuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSB4ZW5jb25zb2xlOiAlI3hc biIsCisgICAgICAgICAgICAgICAgICAgIGJ1ZlswXSk7CisKKyAgICAgICAgY2xvc2Uobm90aWZ5 X3BpcGVbMF0pOworICAgICAgICBjbG9zZShub3RpZnlfcGlwZVsxXSk7CisgICAgICAgIG5vdGlm eV9waXBlWzBdID0gbm90aWZ5X3BpcGVbMV0gPSAtMTsKKyAgICB9CisKKyAgICBpZiAoIXBhdXNl ZCkKKyAgICAgICAgbGlieGxfZG9tYWluX3VucGF1c2UoY3R4LCBkb21pZCk7CisKKyAgICByZXQg PSBkb21pZDsgLyogY2FsbGVyIGdldHMgc3VjY2VzcyBpbiBwYXJlbnQgKi8KKyAgICBpZiAoIWRh ZW1vbml6ZSAmJiAhbW9uaXRvcikKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICBpZiAoZG9tX2lu Zm8tPnZuYykKKyAgICAgICAgYXV0b2Nvbm5lY3Rfdm5jdmlld2VyKGRvbWlkLCB2bmNhdXRvcGFz cyk7CisKKyAgICBpZiAobmVlZF9kYWVtb24pIHsKKyAgICAgICAgY2hhciAqbmFtZTsKKworICAg ICAgICB4YXNwcmludGYoJm5hbWUsICJ4bC0lcyIsIGRfY29uZmlnLmNfaW5mby5uYW1lKTsKKyAg ICAgICAgcmV0ID0gZG9fZGFlbW9uaXplKG5hbWUsIE5VTEwpOworICAgICAgICBmcmVlKG5hbWUp OworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICByZXQgPSAocmV0ID09IDEpID8gZG9t aWQgOiByZXQ7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgICAgICBuZWVk X2RhZW1vbiA9IDA7CisgICAgfQorICAgIExPRygiV2FpdGluZyBmb3IgZG9tYWluICVzIChkb21p ZCAldSkgdG8gZGllIFtwaWQgJWxkXSIsCisgICAgICAgIGRfY29uZmlnLmNfaW5mby5uYW1lLCBk b21pZCwgKGxvbmcpZ2V0cGlkKCkpOworCisgICAgcmV0ID0gbGlieGxfZXZlbmFibGVfZG9tYWlu X2RlYXRoKGN0eCwgZG9taWQsIDAsICZkZWF0aHcpOworICAgIGlmIChyZXQpIGdvdG8gb3V0Owor CisgICAgaWYgKCFkaXNrd3MpIHsKKyAgICAgICAgZGlza3dzID0geG1hbGxvYyhzaXplb2YoKmRp c2t3cykgKiBkX2NvbmZpZy5udW1fZGlza3MpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZF9j b25maWcubnVtX2Rpc2tzOyBpKyspCisgICAgICAgICAgICBkaXNrd3NbaV0gPSBOVUxMOworICAg ICAgICBudW1fZGlza3dzID0gZF9jb25maWcubnVtX2Rpc2tzOworICAgIH0KKyAgICBmb3IgKGkg PSAwOyBpIDwgbnVtX2Rpc2t3czsgaSsrKSB7CisgICAgICAgIGlmIChkX2NvbmZpZy5kaXNrc1tp XS5yZW1vdmFibGUpIHsKKyAgICAgICAgICAgIHJldCA9IGxpYnhsX2V2ZW5hYmxlX2Rpc2tfZWpl Y3QoY3R4LCBkb21pZCwgZF9jb25maWcuZGlza3NbaV0udmRldiwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJmRpc2t3c1tpXSk7CisgICAgICAgICAgICBp ZiAocmV0KSBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoMSkgeworICAg ICAgICBsaWJ4bF9ldmVudCAqZXZlbnQ7CisgICAgICAgIHJldCA9IGRvbWFpbl93YWl0X2V2ZW50 KGRvbWlkLCAmZXZlbnQpOworICAgICAgICBpZiAocmV0KSBnb3RvIG91dDsKKworICAgICAgICBz d2l0Y2ggKGV2ZW50LT50eXBlKSB7CisKKyAgICAgICAgY2FzZSBMSUJYTF9FVkVOVF9UWVBFX0RP TUFJTl9TSFVURE9XTjoKKyAgICAgICAgICAgIExPRygiRG9tYWluICV1IGhhcyBzaHV0IGRvd24s IHJlYXNvbiBjb2RlICVkIDB4JXgiLCBkb21pZCwKKyAgICAgICAgICAgICAgICBldmVudC0+dS5k b21haW5fc2h1dGRvd24uc2h1dGRvd25fcmVhc29uLAorICAgICAgICAgICAgICAgIGV2ZW50LT51 LmRvbWFpbl9zaHV0ZG93bi5zaHV0ZG93bl9yZWFzb24pOworICAgICAgICAgICAgc3dpdGNoICho YW5kbGVfZG9tYWluX2RlYXRoKCZkb21pZCwgZXZlbnQsICZkX2NvbmZpZykpIHsKKyAgICAgICAg ICAgIGNhc2UgRE9NQUlOX1JFU1RBUlRfU09GVF9SRVNFVDoKKyAgICAgICAgICAgICAgICBkb21p ZF9zb2Z0X3Jlc2V0ID0gZG9taWQ7CisgICAgICAgICAgICAgICAgZG9taWQgPSBJTlZBTElEX0RP TUlEOworICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgY2Fz ZSBET01BSU5fUkVTVEFSVF9SRU5BTUU6CisgICAgICAgICAgICAgICAgaWYgKGRvbWlkX3NvZnRf cmVzZXQgPT0gSU5WQUxJRF9ET01JRCAmJgorICAgICAgICAgICAgICAgICAgICAhcHJlc2VydmVf ZG9tYWluKCZkb21pZCwgZXZlbnQsICZkX2NvbmZpZykpIHsKKyAgICAgICAgICAgICAgICAgICAg bGlieGxfZXZlbnRfZnJlZShjdHgsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgLyogSWYg d2UgZmFpbCB0aGVuIGV4aXQgbGVhdmluZyB0aGUgb2xkIGRvbWFpbiBpbiBwbGFjZS4gKi8KKyAg ICAgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0 OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIE90aGVyd2lzZSBmYWxs IHRocm91Z2ggYW5kIHJlc3RhcnQuICovCisgICAgICAgICAgICBjYXNlIERPTUFJTl9SRVNUQVJU X05PUk1BTDoKKyAgICAgICAgICAgICAgICBsaWJ4bF9ldmVudF9mcmVlKGN0eCwgZXZlbnQpOwor ICAgICAgICAgICAgICAgIGxpYnhsX2V2ZGlzYWJsZV9kb21haW5fZGVhdGgoY3R4LCBkZWF0aHcp OworICAgICAgICAgICAgICAgIGRlYXRodyA9IE5VTEw7CisgICAgICAgICAgICAgICAgZXZkaXNh YmxlX2Rpc2tfZWplY3RzKGRpc2t3cywgbnVtX2Rpc2t3cyk7CisgICAgICAgICAgICAgICAgZnJl ZShkaXNrd3MpOworICAgICAgICAgICAgICAgIGRpc2t3cyA9IE5VTEw7CisgICAgICAgICAgICAg ICAgbnVtX2Rpc2t3cyA9IDA7CisgICAgICAgICAgICAgICAgLyogZGlzY2FyZCBhbnkgb3RoZXIg ZXZlbnRzIHdoaWNoIG1heSBoYXZlIGJlZW4gZ2VuZXJhdGVkICovCisgICAgICAgICAgICAgICAg d2hpbGUgKCEocmV0ID0gbGlieGxfZXZlbnRfY2hlY2soY3R4LCAmZXZlbnQsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCWExfRVZFTlRNQVNLX0FM TCwgMCwwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlieGxfZXZlbnRfZnJlZShjdHgsIGV2 ZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBFUlJP Ul9OT1RfUkVBRFkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKCJ3YXJuaW5nLCBsaWJ4bF9l dmVudF9jaGVjayAoY2xlYW51cCkgZmFpbGVkIChyYz0lZCkiLAorICAgICAgICAgICAgICAgICAg ICAgICAgcmV0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKgorICAg ICAgICAgICAgICAgICAqIERvIG5vdCBhdHRlbXB0IHRvIHJlY29ubmVjdCBpZiB3ZSBjb21lIHJv dW5kIGFnYWluIGR1ZSB0byBhCisgICAgICAgICAgICAgICAgICogZ3Vlc3QgcmVib290IC0tIHRo ZSBzdGRpbi9vdXQgd2lsbCBiZSBkaXNjb25uZWN0ZWQgYnkgdGhlbi4KKyAgICAgICAgICAgICAg ICAgKi8KKyAgICAgICAgICAgICAgICBkb21faW5mby0+Y29uc29sZV9hdXRvY29ubmVjdCA9IDA7 CisKKyAgICAgICAgICAgICAgICAvKiBTb21lIHNldHRpbmdzIG9ubHkgbWFrZSBzZW5zZSBvbiBm aXJzdCBib290LiAqLworICAgICAgICAgICAgICAgIHBhdXNlZCA9IDA7CisgICAgICAgICAgICAg ICAgaWYgKGNvbW1vbl9kb21uYW1lCisgICAgICAgICAgICAgICAgICAgICYmIHN0cmNtcChkX2Nv bmZpZy5jX2luZm8ubmFtZSwgY29tbW9uX2RvbW5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAg IGRfY29uZmlnLmNfaW5mby5uYW1lID0gc3RyZHVwKGNvbW1vbl9kb21uYW1lKTsKKyAgICAgICAg ICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFhYWCBG SVhNRTogSWYgdGhpcyBzbGVlcCBpcyBub3QgdGhlcmUgdGhlbiBkb21haW4KKyAgICAgICAgICAg ICAgICAgKiByZS1jcmVhdGlvbiBmYWlscyBzb21ldGltZXMuCisgICAgICAgICAgICAgICAgICov CisgICAgICAgICAgICAgICAgTE9HKCJEb25lLiBSZWJvb3Rpbmcgbm93Iik7CisgICAgICAgICAg ICAgICAgc2xlZXAoMik7CisgICAgICAgICAgICAgICAgZ290byBzdGFydDsKKworICAgICAgICAg ICAgY2FzZSBET01BSU5fUkVTVEFSVF9OT05FOgorICAgICAgICAgICAgICAgIExPRygiRG9uZS4g RXhpdGluZyBub3ciKTsKKyAgICAgICAgICAgICAgICBsaWJ4bF9ldmVudF9mcmVlKGN0eCwgZXZl bnQpOworICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7 CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAg ICAgICAgIH0KKworICAgICAgICBjYXNlIExJQlhMX0VWRU5UX1RZUEVfRE9NQUlOX0RFQVRIOgor ICAgICAgICAgICAgTE9HKCJEb21haW4gJXUgaGFzIGJlZW4gZGVzdHJveWVkLiIsIGRvbWlkKTsK KyAgICAgICAgICAgIGxpYnhsX2V2ZW50X2ZyZWUoY3R4LCBldmVudCk7CisgICAgICAgICAgICBy ZXQgPSAwOworICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgY2FzZSBMSUJYTF9FVkVO VF9UWVBFX0RJU0tfRUpFQ1Q6CisgICAgICAgICAgICAvKiBYWFggd2hhdCBpcyB0aGlzIGZvcj8g Ki8KKyAgICAgICAgICAgIGxpYnhsX2Nkcm9tX2luc2VydChjdHgsIGRvbWlkLCAmZXZlbnQtPnUu ZGlza19lamVjdC5kaXNrLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRl ZmF1bHQ6OworICAgICAgICAgICAgY2hhciAqZXZzdHIgPSBsaWJ4bF9ldmVudF90b19qc29uKGN0 eCwgZXZlbnQpOworICAgICAgICAgICAgTE9HKCJ3YXJuaW5nLCBnb3QgdW5leHBlY3RlZCBldmVu dCB0eXBlICVkLCBldmVudD0lcyIsCisgICAgICAgICAgICAgICAgZXZlbnQtPnR5cGUsIGV2c3Ry KTsKKyAgICAgICAgICAgIGZyZWUoZXZzdHIpOworICAgICAgICB9CisKKyAgICAgICAgbGlieGxf ZXZlbnRfZnJlZShjdHgsIGV2ZW50KTsKKyAgICB9CisKK2Vycm9yX291dDoKKyAgICByZWxlYXNl X2xvY2soKTsKKyAgICBpZiAobGlieGxfZG9taWRfdmFsaWRfZ3Vlc3QoZG9taWQpKSB7CisgICAg ICAgIGxpYnhsX2RvbWFpbl9kZXN0cm95KGN0eCwgZG9taWQsIDApOworICAgICAgICBkb21pZCA9 IElOVkFMSURfRE9NSUQ7CisgICAgfQorCitvdXQ6CisgICAgaWYgKHJlc3RvcmVfZmRfdG9fY2xv c2UgPj0gMCkgeworICAgICAgICBpZiAoY2xvc2UocmVzdG9yZV9mZF90b19jbG9zZSkpCisgICAg ICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjbG9zZSByZXN0b3JpbmcgZmlsZSwg ZmQgJWQsIGVycm5vICVkXG4iLAorICAgICAgICAgICAgICAgICAgICByZXN0b3JlX2ZkX3RvX2Ns b3NlLCBlcnJubyk7CisgICAgICAgIHJlc3RvcmVfZmRfdG9fY2xvc2UgPSAtMTsKKyAgICB9CisK KyAgICBpZiAobG9nZmlsZSAhPSAyKQorICAgICAgICBjbG9zZShsb2dmaWxlKTsKKworICAgIGxp YnhsX2RvbWFpbl9jb25maWdfZGlzcG9zZSgmZF9jb25maWcpOworCisgICAgZnJlZShjb25maWdf ZGF0YSk7CisKKyAgICBjb25zb2xlX2NoaWxkX3JlcG9ydChjaGlsZF9jb25zb2xlKTsKKworICAg IGlmIChkZWF0aHcpCisgICAgICAgIGxpYnhsX2V2ZGlzYWJsZV9kb21haW5fZGVhdGgoY3R4LCBk ZWF0aHcpOworICAgIGlmIChkaXNrd3MpIHsKKyAgICAgICAgZXZkaXNhYmxlX2Rpc2tfZWplY3Rz KGRpc2t3cywgZF9jb25maWcubnVtX2Rpc2tzKTsKKyAgICAgICAgZnJlZShkaXNrd3MpOworICAg IH0KKworICAgIC8qCisgICAgICogSWYgd2UgaGF2ZSBkYWVtb25pemVkIHRoZW4gZG8gbm90IHJl dHVybiB0byB0aGUgY2FsbGVyIC0tIHRoaXMgaGFzCisgICAgICogYWxyZWFkeSBoYXBwZW5lZCBp biB0aGUgcGFyZW50LgorICAgICAqLworICAgIGlmICggZGFlbW9uaXplICYmICFuZWVkX2RhZW1v biApCisgICAgICAgIGV4aXQocmV0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBtYWlu X2NyZWF0ZShpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgY29uc3QgY2hhciAqZmlsZW5h bWUgPSBOVUxMOworICAgIHN0cnVjdCBkb21haW5fY3JlYXRlIGRvbV9pbmZvOworICAgIGludCBw YXVzZWQgPSAwLCBkZWJ1ZyA9IDAsIGRhZW1vbml6ZSA9IDEsIGNvbnNvbGVfYXV0b2Nvbm5lY3Qg PSAwLAorICAgICAgICBxdWlldCA9IDAsIG1vbml0b3IgPSAxLCB2bmMgPSAwLCB2bmNhdXRvcGFz cyA9IDA7CisgICAgaW50IG9wdCwgcmM7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0c1td ID0geworICAgICAgICB7ImRyeXJ1biIsIDAsIDAsICduJ30sCisgICAgICAgIHsicXVpZXQiLCAw LCAwLCAncSd9LAorICAgICAgICB7ImRlZmNvbmZpZyIsIDEsIDAsICdmJ30sCisgICAgICAgIHsi dm5jdmlld2VyIiwgMCwgMCwgJ1YnfSwKKyAgICAgICAgeyJ2bmN2aWV3ZXItYXV0b3Bhc3MiLCAw LCAwLCAnQSd9LAorICAgICAgICBDT01NT05fTE9OR19PUFRTCisgICAgfTsKKworICAgIGRvbV9p bmZvLmV4dHJhX2NvbmZpZyA9IE5VTEw7CisKKyAgICBpZiAoYXJndlsxXSAmJiBhcmd2WzFdWzBd ICE9ICctJyAmJiAhc3RyY2hyKGFyZ3ZbMV0sICc9JykpIHsKKyAgICAgICAgZmlsZW5hbWUgPSBh cmd2WzFdOworICAgICAgICBhcmdjLS07IGFyZ3YrKzsKKyAgICB9CisKKyAgICBTV0lUQ0hfRk9S RUFDSF9PUFQob3B0LCAiRm5xZjpwY2RlVkEiLCBvcHRzLCAiY3JlYXRlIiwgMCkgeworICAgIGNh c2UgJ2YnOgorICAgICAgICBmaWxlbmFtZSA9IG9wdGFyZzsKKyAgICAgICAgYnJlYWs7CisgICAg Y2FzZSAncCc6CisgICAgICAgIHBhdXNlZCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug J2MnOgorICAgICAgICBjb25zb2xlX2F1dG9jb25uZWN0ID0gMTsKKyAgICAgICAgYnJlYWs7Cisg ICAgY2FzZSAnZCc6CisgICAgICAgIGRlYnVnID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz ZSAnRic6CisgICAgICAgIGRhZW1vbml6ZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug J2UnOgorICAgICAgICBkYWVtb25pemUgPSAwOworICAgICAgICBtb25pdG9yID0gMDsKKyAgICAg ICAgYnJlYWs7CisgICAgY2FzZSAnbic6CisgICAgICAgIGRyeXJ1bl9vbmx5ID0gMTsKKyAgICAg ICAgYnJlYWs7CisgICAgY2FzZSAncSc6CisgICAgICAgIHF1aWV0ID0gMTsKKyAgICAgICAgYnJl YWs7CisgICAgY2FzZSAnVic6CisgICAgICAgIHZuYyA9IDE7CisgICAgICAgIGJyZWFrOworICAg IGNhc2UgJ0EnOgorICAgICAgICB2bmMgPSB2bmNhdXRvcGFzcyA9IDE7CisgICAgICAgIGJyZWFr OworICAgIH0KKworICAgIG1lbXNldCgmZG9tX2luZm8sIDAsIHNpemVvZihkb21faW5mbykpOwor CisgICAgZm9yICg7IG9wdGluZCA8IGFyZ2M7IG9wdGluZCsrKSB7CisgICAgICAgIGlmIChzdHJj aHIoYXJndltvcHRpbmRdLCAnPScpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHhzdHJpbmdfcmVh bGxvY19hcHBlbmQoJmRvbV9pbmZvLmV4dHJhX2NvbmZpZywgYXJndltvcHRpbmRdKTsKKyAgICAg ICAgICAgIHhzdHJpbmdfcmVhbGxvY19hcHBlbmQoJmRvbV9pbmZvLmV4dHJhX2NvbmZpZywgIlxu Iik7CisgICAgICAgIH0gZWxzZSBpZiAoIWZpbGVuYW1lKSB7CisgICAgICAgICAgICBmaWxlbmFt ZSA9IGFyZ3Zbb3B0aW5kXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhlbHAoImNy ZWF0ZSIpOworICAgICAgICAgICAgZnJlZShkb21faW5mby5leHRyYV9jb25maWcpOworICAgICAg ICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkb21faW5mby5kZWJ1ZyA9 IGRlYnVnOworICAgIGRvbV9pbmZvLmRhZW1vbml6ZSA9IGRhZW1vbml6ZTsKKyAgICBkb21faW5m by5tb25pdG9yID0gbW9uaXRvcjsKKyAgICBkb21faW5mby5wYXVzZWQgPSBwYXVzZWQ7CisgICAg ZG9tX2luZm8uZHJ5cnVuID0gZHJ5cnVuX29ubHk7CisgICAgZG9tX2luZm8ucXVpZXQgPSBxdWll dDsKKyAgICBkb21faW5mby5jb25maWdfZmlsZSA9IGZpbGVuYW1lOworICAgIGRvbV9pbmZvLm1p Z3JhdGVfZmQgPSAtMTsKKyAgICBkb21faW5mby5zZW5kX2JhY2tfZmQgPSAtMTsKKyAgICBkb21f aW5mby52bmMgPSB2bmM7CisgICAgZG9tX2luZm8udm5jYXV0b3Bhc3MgPSB2bmNhdXRvcGFzczsK KyAgICBkb21faW5mby5jb25zb2xlX2F1dG9jb25uZWN0ID0gY29uc29sZV9hdXRvY29ubmVjdDsK KworICAgIHJjID0gY3JlYXRlX2RvbWFpbigmZG9tX2luZm8pOworICAgIGlmIChyYyA8IDApIHsK KyAgICAgICAgZnJlZShkb21faW5mby5leHRyYV9jb25maWcpOworICAgICAgICByZXR1cm4gLXJj OworICAgIH0KKworICAgIGZyZWUoZG9tX2luZm8uZXh0cmFfY29uZmlnKTsKKyAgICByZXR1cm4g MDsKK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIG1vZGU6IEMKKyAqIGMtYmFzaWMt b2Zmc2V0OiA0CisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIEVuZDoKKyAqLwotLSAKMi4x MS4wCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVu LWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3Rz Lnhlbi5vcmcveGVuLWRldmVsCg==