Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1q7FAh-0005TW-50 for pgsql-hackers@arkaria.postgresql.org; Thu, 08 Jun 2023 12:55:23 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1q7FAf-0006YW-Pb for pgsql-hackers@arkaria.postgresql.org; Thu, 08 Jun 2023 12:55:21 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1q7FAf-0006YN-B9 for pgsql-hackers@lists.postgresql.org; Thu, 08 Jun 2023 12:55:21 +0000 Received: from mail-ej1-x630.google.com ([2a00:1450:4864:20::630]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1q7FAW-0011aD-G0 for pgsql-hackers@lists.postgresql.org; Thu, 08 Jun 2023 12:55:20 +0000 Received: by mail-ej1-x630.google.com with SMTP id a640c23a62f3a-977c88c9021so104012266b.3 for ; Thu, 08 Jun 2023 05:55:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1686228910; x=1688820910; h=subject:from:to:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=+hfy8B9WBmqzJnHZcQJ2w3ZN7Oe4VDP+OVR0fdAA7Cs=; b=cIlD6+PuHzaOaiY1za1DNg3eRtw3Bql4sR7Teq62/++qvB8NwWMMmugbk0BTqxVHpX zbQ9ufi9JNYnYbayki97ZwnikATLkOfR7yHtblwmuSCoOZhOvL/+/gmI9wJcRRnxRsxv chwFQzp+FUHXz/iQ2RJVfLPR6Ik0qPsnq/aTPAKRu8DXRm7pQOGCg/oA/Us3yakbyz6M ReuJD2XXe0hgfqDKj0mohC+gNBeV9FsD9aEo+2IAB6UPEhhMB3DYdPRLVYwq9nLqhBUL 48E9SNAcbv8YlO2QxbeP2RBnoXm/yYcMZW6fim0w1/yrR3DdVvNSJXs7fSkAUk/MbECJ SjGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686228910; x=1688820910; h=subject:from:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=+hfy8B9WBmqzJnHZcQJ2w3ZN7Oe4VDP+OVR0fdAA7Cs=; b=fQvXVduJ4XtowauE8kHtT3LRHjp4uMjPCz0DGMBq8KsISt1e9bz+Ew5Mg0Cj0KbOG6 FPBUx7yx97EI0YJPgGs6RP1nMkcO3/S0M5lZJ5oZ4WqlldJn68pjKN7ohhpUS/a8yioQ YeCUvZgpBC/wvdp3Jq5O/dFfeWBSpxgdJbbRock/JMokGQ3Jy4NXZMvPV5amdN6+ssyQ JH/XZmzucu6w1JEsXnEN1dlhfTm8BknPOUNr5lY+8AymMSX6gTWLOOJL/Zg1KFHr1rI3 6Cx5IPwDR587bDQzEvSg5guqJKWGPCweH7yqQ0GYNgIw5/AX7DjP/+oP+MgiA/7wvtmf BJkQ== X-Gm-Message-State: AC+VfDzbhLH6lRdrCRUZjhnZRRsdRsZ7gE5eJlZTMJN1dI55UwLa39UU 21elbBuvdpQ3Mjyq+bU1O9HIBqYqsZU2Va/G6kvZGqNHS3B5Ejy+0F361lRPuiAzEs2TLPobjoZ KDhmpVooSSktrDm0xEXga2iiw2rkI+ajE4na1oSuPlzrNiw6qxGbC8V6vYX6FHzh8UIaGUNSFlE CxP6q0Ua4qbvRoNRzSOlGMnryqYw== X-Google-Smtp-Source: ACHHUZ63fcgClL+kb3vMN7x3zP9EvTey/XNKnRtGq33raBBm6wQAaU+Cbpi3sC3pyz6tTgoXH8Yy/g== X-Received: by 2002:a17:907:940d:b0:96f:608c:5bdf with SMTP id dk13-20020a170907940d00b0096f608c5bdfmr8002389ejc.64.1686228909868; Thu, 08 Jun 2023 05:55:09 -0700 (PDT) Received: from [10.137.0.17] (static-84-42-175-93.bb.vodafone.cz. [84.42.175.93]) by smtp.gmail.com with ESMTPSA id n14-20020a170906378e00b0096f7500502csm671820ejc.199.2023.06.08.05.55.08 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 08 Jun 2023 05:55:08 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------mZQ0QE79c49k9nkGX6scHErz" Message-ID: Date: Thu, 8 Jun 2023 14:55:09 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.10.0 Content-Language: en-US To: PostgreSQL Hackers From: Tomas Vondra Subject: Parallel CREATE INDEX for BRIN indexes List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------mZQ0QE79c49k9nkGX6scHErz Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi, Here's a WIP patch allowing parallel CREATE INDEX for BRIN indexes. The infrastructure (starting workers etc.) is "inspired" by the BTREE code (i.e. copied from that and massaged a bit to call brin stuff). _bt_begin_parallel -> _brin_begin_parallel _bt_end_parallel -> _brin_end_parallel _bt_parallel_estimate_shared -> _brin_parallel_estimate_shared _bt_leader_participate_as_worker -> _brin_leader_participate_as_worker _bt_parallel_scan_and_sort -> _brin_parallel_scan_and_build This is mostly mechanical stuff - setting up the parallel workers, starting the scan etc. The tricky part is how to divide the work between workers and how we combine the partial results. For BTREE we simply let each worker to read a subset of the table (using a parallel scan), sort it and then do a merge sort on the partial results. For BRIN it's a bit different, because the indexes essentially splits the table into smaller ranges and treat them independently. So the easiest way is to organize the table scan so that each range gets processed by exactly one worker. Each worker writes the index tuples into a temporary file, and then when all workers are done we read and write them into the index. The problem is a parallel scan assigns mostly random subset of the table to each worker - it's not guaranteed a BRIN page range to be processed by a single worker. 0001 does that in a bit silly way - instead of doing single large scan, each worker does a sequence of TID range scans for each worker (see _brin_parallel_scan_and_build), and BrinShared has fields used to track which ranges were already assigned to workers. A bit cumbersome, but it works pretty well. 0002 replaces the TID range scan sequence with a single parallel scan, modified to assign "chunks" in multiple of pagesPerRange. In both cases _brin_end_parallel then reads the summaries from worker files, and adds them into the index. In 0001 this is fairly simple, although we could do one more improvement and sort the ranges by range start to make the index nicer (and possibly a bit more efficient). This should be simple, because the per-worker results are already sorted like that (so a merge sort in _brin_end_parallel would be enough). For 0002 it's a bit more complicated, because with a single parallel scan brinbuildCallbackParallel can't decide if a range is assigned to a different worker or empty. And we want to generate summaries for empty ranges in the index. We could either skip such range during index build, and then add empty summaries in _brin_end_parallel (if needed), or add them and then merge them using "union". I just realized there's a third option to do this - we could just do regular parallel scan (with no particular regard to pagesPerRange), and then do "union" when merging results from workers. It doesn't require the sequence of TID scans, and the union would also handle the empty ranges. The per-worker results might be much larger, though, because each worker might produce up to the "full" BRIN index. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --------------mZQ0QE79c49k9nkGX6scHErz Content-Type: text/x-patch; charset=UTF-8; name="0001-parallel-CREATE-INDEX-for-BRIN-20230608.patch" Content-Disposition: attachment; filename="0001-parallel-CREATE-INDEX-for-BRIN-20230608.patch" Content-Transfer-Encoding: base64 RnJvbSAwZDM3YTgyOWU3Njg3NzJlZjNlOWMwODBmOTYzMzNlMjRjZGQ0M2I3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzLnZvbmRyYUBwb3N0 Z3Jlc3FsLm9yZz4KRGF0ZTogU3VuLCAyNiBNYXIgMjAyMyAwMDo0NDowMSArMDEwMApTdWJq ZWN0OiBbUEFUQ0ggMS8yXSBwYXJhbGxlbCBDUkVBVEUgSU5ERVggZm9yIEJSSU4KCi0tLQog c3JjL2JhY2tlbmQvYWNjZXNzL2JyaW4vYnJpbi5jICAgICAgICB8IDcxNCArKysrKysrKysr KysrKysrKysrKysrKysrLQogc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vcGFyYWxsZWwu YyB8ICAgNCArCiBzcmMvYmFja2VuZC9jYXRhbG9nL2luZGV4LmMgICAgICAgICAgIHwgICAz ICstCiBzcmMvaW5jbHVkZS9hY2Nlc3MvYnJpbi5oICAgICAgICAgICAgIHwgICAzICsKIDQg ZmlsZXMgY2hhbmdlZCwgNzE5IGluc2VydGlvbnMoKyksIDUgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2JyaW4vYnJpbi5jIGIvc3JjL2JhY2tlbmQv YWNjZXNzL2JyaW4vYnJpbi5jCmluZGV4IDNjNmE5NTZlYWEzLi4xM2Q5NDkzMWVmYyAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2JyaW4vYnJpbi5jCisrKyBiL3NyYy9iYWNr ZW5kL2FjY2Vzcy9icmluL2JyaW4uYwpAQCAtMzEsOCArMzEsMTAgQEAKICNpbmNsdWRlICJt aXNjYWRtaW4uaCIKICNpbmNsdWRlICJwZ3N0YXQuaCIKICNpbmNsdWRlICJwb3N0bWFzdGVy L2F1dG92YWN1dW0uaCIKKyNpbmNsdWRlICJzdG9yYWdlL2J1ZmZpbGUuaCIKICNpbmNsdWRl ICJzdG9yYWdlL2J1Zm1nci5oIgogI2luY2x1ZGUgInN0b3JhZ2UvZnJlZXNwYWNlLmgiCisj aW5jbHVkZSAidGNvcC90Y29wcHJvdC5oIgkJLyogcGdybWluY2x1ZGUgaWdub3JlICovCiAj aW5jbHVkZSAidXRpbHMvYWNsLmgiCiAjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKICNp bmNsdWRlICJ1dGlscy9kYXR1bS5oIgpAQCAtNDEsNiArNDMsOTggQEAKICNpbmNsdWRlICJ1 dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL3JlbC5oIgogCisvKiBNYWdpYyBu dW1iZXJzIGZvciBwYXJhbGxlbCBzdGF0ZSBzaGFyaW5nICovCisjZGVmaW5lIFBBUkFMTEVM X0tFWV9CUklOX1NIQVJFRAkJVUlOVDY0Q09OU1QoMHhBMDAwMDAwMDAwMDAwMDAxKQorI2Rl ZmluZSBQQVJBTExFTF9LRVlfUVVFUllfVEVYVAkJCVVJTlQ2NENPTlNUKDB4QTAwMDAwMDAw MDAwMDAwMikKKyNkZWZpbmUgUEFSQUxMRUxfS0VZX1dBTF9VU0FHRQkJCVVJTlQ2NENPTlNU KDB4QTAwMDAwMDAwMDAwMDAwMykKKyNkZWZpbmUgUEFSQUxMRUxfS0VZX0JVRkZFUl9VU0FH RQkJVUlOVDY0Q09OU1QoMHhBMDAwMDAwMDAwMDAwMDA0KQorCisKKy8qCisgKiBTdGF0dXMg Zm9yIGluZGV4IGJ1aWxkcyBwZXJmb3JtZWQgaW4gcGFyYWxsZWwuICBUaGlzIGlzIGFsbG9j YXRlZCBpbiBhCisgKiBkeW5hbWljIHNoYXJlZCBtZW1vcnkgc2VnbWVudC4KKyAqLwordHlw ZWRlZiBzdHJ1Y3QgQnJpblNoYXJlZAoreworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBu b3QgbW9kaWZpZWQgZHVyaW5nIHRoZSBidWlsZC4gIFRoZXkgcHJpbWFyaWx5IGV4aXN0IGZv cgorCSAqIHRoZSBiZW5lZml0IG9mIHdvcmtlciBwcm9jZXNzZXMgdGhhdCBuZWVkIHRvIGNy ZWF0ZSBzdGF0ZSBjb3JyZXNwb25kaW5nCisJICogdG8gdGhhdCB1c2VkIGJ5IHRoZSBsZWFk ZXIuCisJICovCisJT2lkCQkJaGVhcHJlbGlkOworCU9pZAkJCWluZGV4cmVsaWQ7CisJYm9v bAkJaXNjb25jdXJyZW50OworCUJsb2NrTnVtYmVyCXBhZ2VzUGVyUmFuZ2U7CisKKwkvKgor CSAqIHdvcmtlcnNkb25lY3YgaXMgdXNlZCB0byBtb25pdG9yIHRoZSBwcm9ncmVzcyBvZiB3 b3JrZXJzLiAgQWxsIHBhcmFsbGVsCisJICogcGFydGljaXBhbnRzIG11c3QgaW5kaWNhdGUg dGhhdCB0aGV5IGFyZSBkb25lIGJlZm9yZSBsZWFkZXIgY2FuIHVzZQorCSAqIHJlc3VsdHMg YnVpbHQgYnkgdGhlIHdvcmtlcnMgKGFuZCBiZWZvcmUgbGVhZGVyIGNhbiB3cml0ZSB0aGUg ZGF0YSBpbnRvCisJICogdGhlIGluZGV4KS4KKwkgKi8KKwlDb25kaXRpb25WYXJpYWJsZSB3 b3JrZXJzZG9uZWN2OworCisJLyogVXNlZCB0byBwYXNzIGJ1aWx0IEJSSU4gdHVwbGVzIGZy b20gd29ya2VycyB0byBsZWFkZXIgKGZvciBpbnNlcnQpLiAqLworCVNoYXJlZEZpbGVTZXQJ ZmlsZXNldDsKKworCS8qCisJICogbXV0ZXggcHJvdGVjdHMgYWxsIGZpZWxkcyBiZWZvcmUg aGVhcGRlc2MuCisJICoKKwkgKiBUaGVzZSBmaWVsZHMgY29udGFpbiBzdGF0dXMgaW5mb3Jt YXRpb24gb2YgaW50ZXJlc3QgdG8gQlJJTiBpbmRleAorCSAqIGJ1aWxkcyB0aGF0IG11c3Qg d29yayBqdXN0IHRoZSBzYW1lIHdoZW4gYW4gaW5kZXggaXMgYnVpbHQgaW4gcGFyYWxsZWwu CisJICovCisJc2xvY2tfdAkJbXV0ZXg7CisKKwkvKgorCSAqIAorCSAqLworCWludAkJCWxh c3Rfd29ya2VyX2lkOworCUJsb2NrTnVtYmVyCW5leHRfcmFuZ2U7CisJQmxvY2tOdW1iZXIJ bGFzdF9yYW5nZTsKKworCS8qCisJICogTXV0YWJsZSBzdGF0ZSB0aGF0IGlzIG1haW50YWlu ZWQgYnkgd29ya2VycywgYW5kIHJlcG9ydGVkIGJhY2sgdG8KKwkgKiBsZWFkZXIgYXQgZW5k IG9mIHRoZSBzY2Fucy4KKwkgKgorCSAqIG5wYXJ0aWNpcGFudHNkb25lIGlzIG51bWJlciBv ZiB3b3JrZXIgcHJvY2Vzc2VzIGZpbmlzaGVkLgorCSAqCisJICogcmVsdHVwbGVzIGlzIHRo ZSB0b3RhbCBudW1iZXIgb2YgaW5wdXQgaGVhcCB0dXBsZXMuCisJICoKKwkgKiBpbmR0dXBs ZXMgaXMgdGhlIHRvdGFsIG51bWJlciBvZiB0dXBsZXMgdGhhdCBtYWRlIGl0IGludG8gdGhl IGluZGV4LgorCSAqLworCWludAkJCW5wYXJ0aWNpcGFudHNkb25lOworCWRvdWJsZQkJcmVs dHVwbGVzOworCWRvdWJsZQkJaW5kdHVwbGVzOworfSBCcmluU2hhcmVkOworCisvKgorICog U3RhdHVzIGZvciBsZWFkZXIgaW4gcGFyYWxsZWwgaW5kZXggYnVpbGQuCisgKi8KK3R5cGVk ZWYgc3RydWN0IEJyaW5MZWFkZXIKK3sKKwkvKiBwYXJhbGxlbCBjb250ZXh0IGl0c2VsZiAq LworCVBhcmFsbGVsQ29udGV4dCAqcGN4dDsKKworCS8qCisJICogbnBhcnRpY2lwYW50d29y a2VycyBpcyB0aGUgZXhhY3QgbnVtYmVyIG9mIHdvcmtlciBwcm9jZXNzZXMgc3VjY2Vzc2Z1 bGx5CisJICogbGF1bmNoZWQsIHBsdXMgb25lIGxlYWRlciBwcm9jZXNzIGlmIGl0IHBhcnRp Y2lwYXRlcyBhcyBhIHdvcmtlciAob25seQorCSAqIERJU0FCTEVfTEVBREVSX1BBUlRJQ0lQ QVRJT04gYnVpbGRzIGF2b2lkIGxlYWRlciBwYXJ0aWNpcGF0aW5nIGFzIGEKKwkgKiB3b3Jr ZXIpLgorCSAqLworCWludAkJCW5wYXJ0aWNpcGFudHdvcmtlcnM7CisKKwkvKgorCSAqIExl YWRlciBwcm9jZXNzIGNvbnZlbmllbmNlIHBvaW50ZXJzIHRvIHNoYXJlZCBzdGF0ZSAobGVh ZGVyIGF2b2lkcyBUT0MKKwkgKiBsb29rdXBzKS4KKwkgKgorCSAqIGJyaW5zaGFyZWQgaXMg dGhlIHNoYXJlZCBzdGF0ZSBmb3IgZW50aXJlIGJ1aWxkLiAgc25hcHNob3QgaXMgdGhlIHNu YXBzaG90CisJICogdXNlZCBieSB0aGUgc2NhbiBpZmYgYW4gTVZDQyBzbmFwc2hvdCBpcyBy ZXF1aXJlZC4KKwkgKi8KKwlCcmluU2hhcmVkCSAgICpicmluc2hhcmVkOworCVNuYXBzaG90 CXNuYXBzaG90OworCVdhbFVzYWdlICAgKndhbHVzYWdlOworCUJ1ZmZlclVzYWdlICpidWZm ZXJ1c2FnZTsKK30gQnJpbkxlYWRlcjsKIAogLyoKICAqIFdlIHVzZSBhIEJyaW5CdWlsZFN0 YXRlIGR1cmluZyBpbml0aWFsIGNvbnN0cnVjdGlvbiBvZiBhIEJSSU4gaW5kZXguCkBAIC01 MCwxMiArMTQ0LDIyIEBAIHR5cGVkZWYgc3RydWN0IEJyaW5CdWlsZFN0YXRlCiB7CiAJUmVs YXRpb24JYnNfaXJlbDsKIAlpbnQJCQlic19udW10dXBsZXM7CisJaW50CQkJYnNfcmVsdHVw bGVzOwogCUJ1ZmZlcgkJYnNfY3VycmVudEluc2VydEJ1ZjsKIAlCbG9ja051bWJlciBic19w YWdlc1BlclJhbmdlOwogCUJsb2NrTnVtYmVyIGJzX2N1cnJSYW5nZVN0YXJ0OwogCUJyaW5S ZXZtYXAgKmJzX3JtQWNjZXNzOwogCUJyaW5EZXNjICAgKmJzX2JkZXNjOwogCUJyaW5NZW1U dXBsZSAqYnNfZHR1cGxlOworCisJLyoKKwkgKiBic19sZWFkZXIgaXMgb25seSBwcmVzZW50 IHdoZW4gYSBwYXJhbGxlbCBpbmRleCBidWlsZCBpcyBwZXJmb3JtZWQsIGFuZAorCSAqIG9u bHkgaW4gdGhlIGxlYWRlciBwcm9jZXNzLiAoQWN0dWFsbHksIG9ubHkgdGhlIGxlYWRlciBo YXMgYQorCSAqIEJyaW5CdWlsZFN0YXRlLikKKwkgKi8KKwlCcmluTGVhZGVyICpic19sZWFk ZXI7CisJaW50CQkJYnNfd29ya2VyX2lkOworCUJ1ZkZpbGUJICAgKmJzX2ZpbGU7CiB9IEJy aW5CdWlsZFN0YXRlOwogCiAvKgpAQCAtNzYsNiArMTgwLDcgQEAgc3RhdGljIHZvaWQgdGVy bWluYXRlX2JyaW5fYnVpbGRzdGF0ZShCcmluQnVpbGRTdGF0ZSAqc3RhdGUpOwogc3RhdGlj IHZvaWQgYnJpbnN1bW1hcml6ZShSZWxhdGlvbiBpbmRleCwgUmVsYXRpb24gaGVhcFJlbCwg QmxvY2tOdW1iZXIgcGFnZVJhbmdlLAogCQkJCQkJICBib29sIGluY2x1ZGVfcGFydGlhbCwg ZG91YmxlICpudW1TdW1tYXJpemVkLCBkb3VibGUgKm51bUV4aXN0aW5nKTsKIHN0YXRpYyB2 b2lkIGZvcm1fYW5kX2luc2VydF90dXBsZShCcmluQnVpbGRTdGF0ZSAqc3RhdGUpOworc3Rh dGljIHZvaWQgZm9ybV9hbmRfc3BpbGxfdHVwbGUoQnJpbkJ1aWxkU3RhdGUgKnN0YXRlKTsK IHN0YXRpYyB2b2lkIHVuaW9uX3R1cGxlcyhCcmluRGVzYyAqYmRlc2MsIEJyaW5NZW1UdXBs ZSAqYSwKIAkJCQkJCSBCcmluVHVwbGUgKmIpOwogc3RhdGljIHZvaWQgYnJpbl92YWN1dW1f c2NhbihSZWxhdGlvbiBpZHhyZWwsIEJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5KTsK QEAgLTgzLDYgKzE4OCwxOCBAQCBzdGF0aWMgYm9vbCBhZGRfdmFsdWVzX3RvX3JhbmdlKFJl bGF0aW9uIGlkeFJlbCwgQnJpbkRlc2MgKmJkZXNjLAogCQkJCQkJCQlCcmluTWVtVHVwbGUg KmR0dXAsIERhdHVtICp2YWx1ZXMsIGJvb2wgKm51bGxzKTsKIHN0YXRpYyBib29sIGNoZWNr X251bGxfa2V5cyhCcmluVmFsdWVzICpidmFsLCBTY2FuS2V5ICpudWxsa2V5cywgaW50IG5u dWxsa2V5cyk7CiAKKy8qIHBhcmFsbGVsIGluZGV4IGJ1aWxkcyAqLworc3RhdGljIHZvaWQg X2JyaW5fYmVnaW5fcGFyYWxsZWwoQnJpbkJ1aWxkU3RhdGUgKmJ1aWxkc3RhdGUsIFJlbGF0 aW9uIGhlYXAsIFJlbGF0aW9uIGluZGV4LAorCQkJCQkJCQkgYm9vbCBpc2NvbmN1cnJlbnQs IGludCByZXF1ZXN0KTsKK3N0YXRpYyB2b2lkIF9icmluX2VuZF9wYXJhbGxlbChCcmluTGVh ZGVyICpidGxlYWRlciwgQnJpbkJ1aWxkU3RhdGUgKnN0YXRlKTsKK3N0YXRpYyBTaXplIF9i cmluX3BhcmFsbGVsX2VzdGltYXRlX3NoYXJlZChSZWxhdGlvbiBoZWFwLCBTbmFwc2hvdCBz bmFwc2hvdCk7CitzdGF0aWMgdm9pZCBfYnJpbl9sZWFkZXJfcGFydGljaXBhdGVfYXNfd29y a2VyKEJyaW5CdWlsZFN0YXRlICpidWlsZHN0YXRlLAorCQkJCQkJCQkJCQkgICBSZWxhdGlv biBoZWFwLCBSZWxhdGlvbiBpbmRleCk7CitzdGF0aWMgdm9pZCBfYnJpbl9wYXJhbGxlbF9z Y2FuX2FuZF9idWlsZChCcmluQnVpbGRTdGF0ZSAqYnVpbGRzdGF0ZSwKKwkJCQkJCQkJCQkg IEJyaW5TaGFyZWQgKmJyaW5zaGFyZWQsCisJCQkJCQkJCQkJICBSZWxhdGlvbiBoZWFwLCBS ZWxhdGlvbiBpbmRleCwKKwkJCQkJCQkJCQkgIGludCBzb3J0bWVtLCBib29sIHByb2dyZXNz KTsKKwogLyoKICAqIEJSSU4gaGFuZGxlciBmdW5jdGlvbjogcmV0dXJuIEluZGV4QW1Sb3V0 aW5lIHdpdGggYWNjZXNzIG1ldGhvZCBwYXJhbWV0ZXJzCiAgKiBhbmQgY2FsbGJhY2tzLgpA QCAtODIyLDYgKzkzOSw1NCBAQCBicmluYnVpbGRDYWxsYmFjayhSZWxhdGlvbiBpbmRleCwK IAkJCQkJCQkgICB2YWx1ZXMsIGlzbnVsbCk7CiB9CiAKKy8qCisgKiBBIHZlcnNpb24gb2Yg dGhlIGNhbGxiYWNrLCB1c2VkIGJ5IHBhcmFsbGVsIGluZGV4IGJ1aWxkcy4gVGhlIG1haW4g ZGlmZmVyZW5jZQorICogaXMgdGhhdCBpbnN0ZWFkIG9mIHdyaXRpbmcgdGhlIEJSSU4gdHVw bGVzIGludG8gdGhlIGluZGV4LCB3ZSB3cml0ZSB0aGVtIGludG8KKyAqIGEgdGVtcG9yYXJ5 IGZpbGUsIGFuZCBsZWF2ZSB0aGUgaW5zZXJ0aW9uIHVwIHRvIHRoZSBsZWFkZXIgKHdoaWNo IG1heSByZW9yZGVyCisgKiB0aGVtIGEgYml0IGV0Yy4pLgorICovCitzdGF0aWMgdm9pZAor YnJpbmJ1aWxkQ2FsbGJhY2tQYXJhbGxlbChSZWxhdGlvbiBpbmRleCwKKwkJCQkJCSAgSXRl bVBvaW50ZXIgdGlkLAorCQkJCQkJICBEYXR1bSAqdmFsdWVzLAorCQkJCQkJICBib29sICpp c251bGwsCisJCQkJCQkgIGJvb2wgdHVwbGVJc0FsaXZlLAorCQkJCQkJICB2b2lkICpicnN0 YXRlKQoreworCUJyaW5CdWlsZFN0YXRlICpzdGF0ZSA9IChCcmluQnVpbGRTdGF0ZSAqKSBi cnN0YXRlOworCUJsb2NrTnVtYmVyIHRoaXNibG9jazsKKworCXRoaXNibG9jayA9IEl0ZW1Q b2ludGVyR2V0QmxvY2tOdW1iZXIodGlkKTsKKworCS8qCisJICogSWYgd2UncmUgaW4gYSBi bG9jayB0aGF0IGJlbG9uZ3MgdG8gYSBmdXR1cmUgcmFuZ2UsIHN1bW1hcml6ZSB3aGF0CisJ ICogd2UndmUgZ290IGFuZCBzdGFydCBhZnJlc2guICBOb3RlIHRoZSBzY2FuIG1pZ2h0IGhh dmUgc2tpcHBlZCBtYW55CisJICogcGFnZXMsIGlmIHRoZXkgd2VyZSBkZXZvaWQgb2YgbGl2 ZSB0dXBsZXM7IG1ha2Ugc3VyZSB0byBpbnNlcnQgaW5kZXgKKwkgKiB0dXBsZXMgZm9yIHRo b3NlIHRvby4KKwkgKi8KKwl3aGlsZSAodGhpc2Jsb2NrID4gc3RhdGUtPmJzX2N1cnJSYW5n ZVN0YXJ0ICsgc3RhdGUtPmJzX3BhZ2VzUGVyUmFuZ2UgLSAxKQorCXsKKworCQlCUklOX2Vs b2coKERFQlVHMiwKKwkJCQkgICAiYnJpbmJ1aWxkQ2FsbGJhY2s6IGNvbXBsZXRlZCBhIHJh bmdlOiAldS0tJXUiLAorCQkJCSAgIHN0YXRlLT5ic19jdXJyUmFuZ2VTdGFydCwKKwkJCQkg ICBzdGF0ZS0+YnNfY3VyclJhbmdlU3RhcnQgKyBzdGF0ZS0+YnNfcGFnZXNQZXJSYW5nZSkp OworCisJCS8qIGNyZWF0ZSB0aGUgaW5kZXggdHVwbGUgYW5kIHdyaXRlIGl0IGludG8gdGhl IHRlbXBvcmFyeSBmaWxlICovCisJCWZvcm1fYW5kX3NwaWxsX3R1cGxlKHN0YXRlKTsKKwor CQkvKiBzZXQgc3RhdGUgdG8gY29ycmVzcG9uZCB0byB0aGUgbmV4dCByYW5nZSAqLworCQlz dGF0ZS0+YnNfY3VyclJhbmdlU3RhcnQgKz0gc3RhdGUtPmJzX3BhZ2VzUGVyUmFuZ2U7CisK KwkJLyogcmUtaW5pdGlhbGl6ZSBzdGF0ZSBmb3IgaXQgKi8KKwkJYnJpbl9tZW10dXBsZV9p bml0aWFsaXplKHN0YXRlLT5ic19kdHVwbGUsIHN0YXRlLT5ic19iZGVzYyk7CisJfQorCisJ LyogQWNjdW11bGF0ZSB0aGUgY3VycmVudCB0dXBsZSBpbnRvIHRoZSBydW5uaW5nIHN0YXRl ICovCisJKHZvaWQpIGFkZF92YWx1ZXNfdG9fcmFuZ2UoaW5kZXgsIHN0YXRlLT5ic19iZGVz Yywgc3RhdGUtPmJzX2R0dXBsZSwKKwkJCQkJCQkgICB2YWx1ZXMsIGlzbnVsbCk7Cit9CisK IC8qCiAgKiBicmluYnVpbGQoKSAtLSBidWlsZCBhIG5ldyBCUklOIGluZGV4LgogICovCkBA IC04ODMsMTggKzEwNDgsNDYgQEAgYnJpbmJ1aWxkKFJlbGF0aW9uIGhlYXAsIFJlbGF0aW9u IGluZGV4LCBJbmRleEluZm8gKmluZGV4SW5mbykKIAlyZXZtYXAgPSBicmluUmV2bWFwSW5p dGlhbGl6ZShpbmRleCwgJnBhZ2VzUGVyUmFuZ2UsIE5VTEwpOwogCXN0YXRlID0gaW5pdGlh bGl6ZV9icmluX2J1aWxkc3RhdGUoaW5kZXgsIHJldm1hcCwgcGFnZXNQZXJSYW5nZSk7CiAK KwkvKgorCSAqIEF0dGVtcHQgdG8gbGF1bmNoIHBhcmFsbGVsIHdvcmtlciBzY2FuIHdoZW4g cmVxdWlyZWQKKwkgKgorCSAqIFhYWCBwbGFuX2NyZWF0ZV9pbmRleF93b3JrZXJzIG1ha2Vz IHRoZSBudW1iZXIgb2Ygd29ya2VycyBkZXBlbmRlbnQgb24KKwkgKiBtYWludGVuYW5jZV93 b3JrX21lbSwgcmVxdWlyaW5nIDMyTUIgZm9yIGVhY2ggd29ya2VyLiBUaGF0IG1ha2VzIHNl bnNlCisJICogZm9yIGJ0cmVlLCBidXQgbm90IGZvciBCUklOLCB3aGljaCBjYW4gZG8gYXdh eSB3aXRoIG11Y2ggbGVzcyBtZW1vcnkuCisJICogU28gbWF5YmUgbWFrZSB0aGF0IHNvbWVo b3cgbGVzcyBzdHJpY3QsIG9wdGlvbmFsbHk/CisJICovCisJaWYgKGluZGV4SW5mby0+aWlf UGFyYWxsZWxXb3JrZXJzID4gMCkKKwkJX2JyaW5fYmVnaW5fcGFyYWxsZWwoc3RhdGUsIGhl YXAsIGluZGV4LCBpbmRleEluZm8tPmlpX0NvbmN1cnJlbnQsCisJCQkJCQkJIGluZGV4SW5m by0+aWlfUGFyYWxsZWxXb3JrZXJzKTsKKwogCS8qCiAJICogTm93IHNjYW4gdGhlIHJlbGF0 aW9uLiAgTm8gc3luY3NjYW4gYWxsb3dlZCBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUKIAkg KiBoZWFwIGJsb2NrcyBpbiBwaHlzaWNhbCBvcmRlci4KIAkgKi8KLQlyZWx0dXBsZXMgPSB0 YWJsZV9pbmRleF9idWlsZF9zY2FuKGhlYXAsIGluZGV4LCBpbmRleEluZm8sIGZhbHNlLCB0 cnVlLAotCQkJCQkJCQkJICAgYnJpbmJ1aWxkQ2FsbGJhY2ssICh2b2lkICopIHN0YXRlLCBO VUxMKTsKIAotCS8qIHByb2Nlc3MgdGhlIGZpbmFsIGJhdGNoICovCi0JZm9ybV9hbmRfaW5z ZXJ0X3R1cGxlKHN0YXRlKTsKKwkvKiBubyBwYXJhbGxlbCBpbmRleCBidWlsZCwganVzdCBk byB0aGUgdXN1YWwgdGhpbmcgKi8KKwlpZiAoc3RhdGUtPmJzX2xlYWRlciA9PSBOVUxMKQor CXsKKwkJcmVsdHVwbGVzID0gdGFibGVfaW5kZXhfYnVpbGRfc2NhbihoZWFwLCBpbmRleCwg aW5kZXhJbmZvLCBmYWxzZSwgdHJ1ZSwKKwkJCQkJCQkJCQkgICBicmluYnVpbGRDYWxsYmFj aywgKHZvaWQgKikgc3RhdGUsIE5VTEwpOworCisJCS8qIHByb2Nlc3MgdGhlIGZpbmFsIGJh dGNoICovCisJCWZvcm1fYW5kX2luc2VydF90dXBsZShzdGF0ZSk7CisKKwkJLyogdHJhY2sg dGhlIG51bWJlciBvZiByZWxhdGlvbiB0dXBsZXMgKi8KKwkJc3RhdGUtPmJzX3JlbHR1cGxl cyA9IHJlbHR1cGxlczsKKwl9CisKKwkvKgorCSAqIEluIHBhcmFsbGVsIG1vZGUsIHdhaXQg Zm9yIHdvcmtlcnMgdG8gY29tcGxldGUsIGFuZCB0aGVuIHJlYWQKKwkgKiB0aGUgdHVwbGVz IGZyb20gdGhlIHRlbXBvcmFyeSBmaWxlcyBhbmQgaW5zZXJ0IHRoZW0gaW50byB0aGUgaW5k ZXguCisJICovCisJaWYgKHN0YXRlLT5ic19sZWFkZXIpCisJCV9icmluX2VuZF9wYXJhbGxl bChzdGF0ZS0+YnNfbGVhZGVyLCBzdGF0ZSk7CiAKIAkvKiByZWxlYXNlIHJlc291cmNlcyAq LwogCWlkeHR1cGxlcyA9IHN0YXRlLT5ic19udW10dXBsZXM7CisJcmVsdHVwbGVzID0gc3Rh dGUtPmJzX3JlbHR1cGxlczsKIAlicmluUmV2bWFwVGVybWluYXRlKHN0YXRlLT5ic19ybUFj Y2Vzcyk7CiAJdGVybWluYXRlX2JyaW5fYnVpbGRzdGF0ZShzdGF0ZSk7CiAKQEAgLTEyOTks MTIgKzE0OTIsMTUgQEAgaW5pdGlhbGl6ZV9icmluX2J1aWxkc3RhdGUoUmVsYXRpb24gaWR4 UmVsLCBCcmluUmV2bWFwICpyZXZtYXAsCiAKIAlzdGF0ZS0+YnNfaXJlbCA9IGlkeFJlbDsK IAlzdGF0ZS0+YnNfbnVtdHVwbGVzID0gMDsKKwlzdGF0ZS0+YnNfcmVsdHVwbGVzID0gMDsK IAlzdGF0ZS0+YnNfY3VycmVudEluc2VydEJ1ZiA9IEludmFsaWRCdWZmZXI7CiAJc3RhdGUt PmJzX3BhZ2VzUGVyUmFuZ2UgPSBwYWdlc1BlclJhbmdlOwogCXN0YXRlLT5ic19jdXJyUmFu Z2VTdGFydCA9IDA7CiAJc3RhdGUtPmJzX3JtQWNjZXNzID0gcmV2bWFwOwogCXN0YXRlLT5i c19iZGVzYyA9IGJyaW5fYnVpbGRfZGVzYyhpZHhSZWwpOwogCXN0YXRlLT5ic19kdHVwbGUg PSBicmluX25ld19tZW10dXBsZShzdGF0ZS0+YnNfYmRlc2MpOworCXN0YXRlLT5ic19sZWFk ZXIgPSBOVUxMOworCXN0YXRlLT5ic193b3JrZXJfaWQgPSAwOwogCiAJcmV0dXJuIHN0YXRl OwogfQpAQCAtMTU5Nyw2ICsxNzkzLDMxIEBAIGZvcm1fYW5kX2luc2VydF90dXBsZShCcmlu QnVpbGRTdGF0ZSAqc3RhdGUpCiAJcGZyZWUodHVwKTsKIH0KIAorLyoKKyAqIEdpdmVuIGEg ZGVmb3JtZWQgdHVwbGUgaW4gdGhlIGJ1aWxkIHN0YXRlLCBjb252ZXJ0IGl0IGludG8gdGhl IG9uLWRpc2sKKyAqIGZvcm1hdCBhbmQgd3JpdGUgaXQgdG8gYSB0ZW1wb3JhcnkgZmlsZSAo bGVhZGVyIHdpbGwgaW5zZXJ0IGl0IGludG8gdGhlCisgKiBpbmRleCBsYXRlcikuCisgKi8K K3N0YXRpYyB2b2lkCitmb3JtX2FuZF9zcGlsbF90dXBsZShCcmluQnVpbGRTdGF0ZSAqc3Rh dGUpCit7CisJQnJpblR1cGxlICAqdHVwOworCVNpemUJCXNpemU7CisKKwlBc3NlcnQoc3Rh dGUtPmJzX2ZpbGUpOworCisJdHVwID0gYnJpbl9mb3JtX3R1cGxlKHN0YXRlLT5ic19iZGVz Yywgc3RhdGUtPmJzX2N1cnJSYW5nZVN0YXJ0LAorCQkJCQkJICBzdGF0ZS0+YnNfZHR1cGxl LCAmc2l6ZSk7CisKKwlCdWZGaWxlV3JpdGUoc3RhdGUtPmJzX2ZpbGUsICZzaXplLCBzaXpl b2YoU2l6ZSkpOworCUJ1ZkZpbGVXcml0ZShzdGF0ZS0+YnNfZmlsZSwgJnN0YXRlLT5ic19j dXJyUmFuZ2VTdGFydCwgc2l6ZW9mKEJsb2NrTnVtYmVyKSk7CisJQnVmRmlsZVdyaXRlKHN0 YXRlLT5ic19maWxlLCB0dXAsIHNpemUpOworCisJc3RhdGUtPmJzX251bXR1cGxlcysrOwor CisJcGZyZWUodHVwKTsKK30KKwogLyoKICAqIEdpdmVuIHR3byBkZWZvcm1lZCB0dXBsZXMs IGFkanVzdCB0aGUgZmlyc3Qgb25lIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50CiAgKiB3aXRo IHRoZSBzdW1tYXJ5IHZhbHVlcyBpbiBib3RoLgpAQCAtMTkxNiwzICsyMTM3LDQ4OCBAQCBj aGVja19udWxsX2tleXMoQnJpblZhbHVlcyAqYnZhbCwgU2NhbktleSAqbnVsbGtleXMsIGlu dCBubnVsbGtleXMpCiAKIAlyZXR1cm4gdHJ1ZTsKIH0KKworc3RhdGljIHZvaWQKK19icmlu X2JlZ2luX3BhcmFsbGVsKEJyaW5CdWlsZFN0YXRlICpidWlsZHN0YXRlLCBSZWxhdGlvbiBo ZWFwLCBSZWxhdGlvbiBpbmRleCwKKwkJCQkJIGJvb2wgaXNjb25jdXJyZW50LCBpbnQgcmVx dWVzdCkKK3sKKwlQYXJhbGxlbENvbnRleHQgKnBjeHQ7CisJU25hcHNob3QJc25hcHNob3Q7 CisJU2l6ZQkJZXN0YnJpbnNoYXJlZDsKKwlCcmluU2hhcmVkICAgKmJyaW5zaGFyZWQ7CisJ QnJpbkxlYWRlciAgICpicmlubGVhZGVyID0gKEJyaW5MZWFkZXIgKikgcGFsbG9jMChzaXpl b2YoQnJpbkxlYWRlcikpOworCVdhbFVzYWdlICAgKndhbHVzYWdlOworCUJ1ZmZlclVzYWdl ICpidWZmZXJ1c2FnZTsKKwlib29sCQlsZWFkZXJwYXJ0aWNpcGF0ZXMgPSB0cnVlOworCWlu dAkJCXF1ZXJ5bGVuOworCisjaWZkZWYgRElTQUJMRV9MRUFERVJfUEFSVElDSVBBVElPTgor CWxlYWRlcnBhcnRpY2lwYXRlcyA9IGZhbHNlOworI2VuZGlmCisKKwkvKgorCSAqIEVudGVy IHBhcmFsbGVsIG1vZGUsIGFuZCBjcmVhdGUgY29udGV4dCBmb3IgcGFyYWxsZWwgYnVpbGQg b2YgYnJpbgorCSAqIGluZGV4CisJICovCisJRW50ZXJQYXJhbGxlbE1vZGUoKTsKKwlBc3Nl cnQocmVxdWVzdCA+IDApOworCXBjeHQgPSBDcmVhdGVQYXJhbGxlbENvbnRleHQoInBvc3Rn cmVzIiwgIl9icmluX3BhcmFsbGVsX2J1aWxkX21haW4iLAorCQkJCQkJCQkgcmVxdWVzdCk7 CisKKwkvKgorCSAqIFByZXBhcmUgZm9yIHNjYW4gb2YgdGhlIGJhc2UgcmVsYXRpb24uICBJ biBhIG5vcm1hbCBpbmRleCBidWlsZCwgd2UgdXNlCisJICogU25hcHNob3RBbnkgYmVjYXVz ZSB3ZSBtdXN0IHJldHJpZXZlIGFsbCB0dXBsZXMgYW5kIGRvIG91ciBvd24gdGltZQorCSAq IHF1YWwgY2hlY2tzIChiZWNhdXNlIHdlIGhhdmUgdG8gaW5kZXggUkVDRU5UTFlfREVBRCB0 dXBsZXMpLiAgSW4gYQorCSAqIGNvbmN1cnJlbnQgYnVpbGQsIHdlIHRha2UgYSByZWd1bGFy IE1WQ0Mgc25hcHNob3QgYW5kIGluZGV4IHdoYXRldmVyJ3MKKwkgKiBsaXZlIGFjY29yZGlu ZyB0byB0aGF0LgorCSAqLworCWlmICghaXNjb25jdXJyZW50KQorCQlzbmFwc2hvdCA9IFNu YXBzaG90QW55OworCWVsc2UKKwkJc25hcHNob3QgPSBSZWdpc3RlclNuYXBzaG90KEdldFRy YW5zYWN0aW9uU25hcHNob3QoKSk7CisKKwkvKgorCSAqIEVzdGltYXRlIHNpemUgZm9yIG91 ciBvd24gUEFSQUxMRUxfS0VZX0JSSU5fU0hBUkVEIHdvcmtzcGFjZS4KKwkgKi8KKwllc3Ri cmluc2hhcmVkID0gX2JyaW5fcGFyYWxsZWxfZXN0aW1hdGVfc2hhcmVkKGhlYXAsIHNuYXBz aG90KTsKKwlzaG1fdG9jX2VzdGltYXRlX2NodW5rKCZwY3h0LT5lc3RpbWF0b3IsIGVzdGJy aW5zaGFyZWQpOworCisJc2htX3RvY19lc3RpbWF0ZV9rZXlzKCZwY3h0LT5lc3RpbWF0b3Is IDEpOworCisJLyoKKwkgKiBFc3RpbWF0ZSBzcGFjZSBmb3IgV2FsVXNhZ2UgYW5kIEJ1ZmZl clVzYWdlIC0tIFBBUkFMTEVMX0tFWV9XQUxfVVNBR0UKKwkgKiBhbmQgUEFSQUxMRUxfS0VZ X0JVRkZFUl9VU0FHRS4KKwkgKgorCSAqIElmIHRoZXJlIGFyZSBubyBleHRlbnNpb25zIGxv YWRlZCB0aGF0IGNhcmUsIHdlIGNvdWxkIHNraXAgdGhpcy4gIFdlCisJICogaGF2ZSBubyB3 YXkgb2Yga25vd2luZyB3aGV0aGVyIGFueW9uZSdzIGxvb2tpbmcgYXQgcGdXYWxVc2FnZSBv cgorCSAqIHBnQnVmZmVyVXNhZ2UsIHNvIGRvIGl0IHVuY29uZGl0aW9uYWxseS4KKwkgKi8K KwlzaG1fdG9jX2VzdGltYXRlX2NodW5rKCZwY3h0LT5lc3RpbWF0b3IsCisJCQkJCQkgICBt dWxfc2l6ZShzaXplb2YoV2FsVXNhZ2UpLCBwY3h0LT5ud29ya2VycykpOworCXNobV90b2Nf ZXN0aW1hdGVfa2V5cygmcGN4dC0+ZXN0aW1hdG9yLCAxKTsKKwlzaG1fdG9jX2VzdGltYXRl X2NodW5rKCZwY3h0LT5lc3RpbWF0b3IsCisJCQkJCQkgICBtdWxfc2l6ZShzaXplb2YoQnVm ZmVyVXNhZ2UpLCBwY3h0LT5ud29ya2VycykpOworCXNobV90b2NfZXN0aW1hdGVfa2V5cygm cGN4dC0+ZXN0aW1hdG9yLCAxKTsKKworCS8qIEZpbmFsbHksIGVzdGltYXRlIFBBUkFMTEVM X0tFWV9RVUVSWV9URVhUIHNwYWNlICovCisJaWYgKGRlYnVnX3F1ZXJ5X3N0cmluZykKKwl7 CisJCXF1ZXJ5bGVuID0gc3RybGVuKGRlYnVnX3F1ZXJ5X3N0cmluZyk7CisJCXNobV90b2Nf ZXN0aW1hdGVfY2h1bmsoJnBjeHQtPmVzdGltYXRvciwgcXVlcnlsZW4gKyAxKTsKKwkJc2ht X3RvY19lc3RpbWF0ZV9rZXlzKCZwY3h0LT5lc3RpbWF0b3IsIDEpOworCX0KKwllbHNlCisJ CXF1ZXJ5bGVuID0gMDsJCQkvKiBrZWVwIGNvbXBpbGVyIHF1aWV0ICovCisKKwkvKiBFdmVy eW9uZSdzIGhhZCBhIGNoYW5jZSB0byBhc2sgZm9yIHNwYWNlLCBzbyBub3cgY3JlYXRlIHRo ZSBEU00gKi8KKwlJbml0aWFsaXplUGFyYWxsZWxEU00ocGN4dCk7CisKKwkvKiBJZiBubyBE U00gc2VnbWVudCB3YXMgYXZhaWxhYmxlLCBiYWNrIG91dCAoZG8gc2VyaWFsIGJ1aWxkKSAq LworCWlmIChwY3h0LT5zZWcgPT0gTlVMTCkKKwl7CisJCWlmIChJc01WQ0NTbmFwc2hvdChz bmFwc2hvdCkpCisJCQlVbnJlZ2lzdGVyU25hcHNob3Qoc25hcHNob3QpOworCQlEZXN0cm95 UGFyYWxsZWxDb250ZXh0KHBjeHQpOworCQlFeGl0UGFyYWxsZWxNb2RlKCk7CisJCXJldHVy bjsKKwl9CisKKwkvKiBTdG9yZSBzaGFyZWQgYnVpbGQgc3RhdGUsIGZvciB3aGljaCB3ZSBy ZXNlcnZlZCBzcGFjZSAqLworCWJyaW5zaGFyZWQgPSAoQnJpblNoYXJlZCAqKSBzaG1fdG9j X2FsbG9jYXRlKHBjeHQtPnRvYywgZXN0YnJpbnNoYXJlZCk7CisJLyogSW5pdGlhbGl6ZSBp bW11dGFibGUgc3RhdGUgKi8KKwlicmluc2hhcmVkLT5oZWFwcmVsaWQgPSBSZWxhdGlvbkdl dFJlbGlkKGhlYXApOworCWJyaW5zaGFyZWQtPmluZGV4cmVsaWQgPSBSZWxhdGlvbkdldFJl bGlkKGluZGV4KTsKKwlicmluc2hhcmVkLT5pc2NvbmN1cnJlbnQgPSBpc2NvbmN1cnJlbnQ7 CisJYnJpbnNoYXJlZC0+cGFnZXNQZXJSYW5nZSA9IGJ1aWxkc3RhdGUtPmJzX3BhZ2VzUGVy UmFuZ2U7CisJQ29uZGl0aW9uVmFyaWFibGVJbml0KCZicmluc2hhcmVkLT53b3JrZXJzZG9u ZWN2KTsKKwlTcGluTG9ja0luaXQoJmJyaW5zaGFyZWQtPm11dGV4KTsKKworCS8qICovCisJ U2hhcmVkRmlsZVNldEluaXQoJmJyaW5zaGFyZWQtPmZpbGVzZXQsIHBjeHQtPnNlZyk7CisK KwkvKiBJbml0aWFsaXplIG11dGFibGUgc3RhdGUgKi8KKwlicmluc2hhcmVkLT5ucGFydGlj aXBhbnRzZG9uZSA9IDA7CisJYnJpbnNoYXJlZC0+cmVsdHVwbGVzID0gMC4wOworCWJyaW5z aGFyZWQtPmluZHR1cGxlcyA9IDAuMDsKKworCS8qIFRyYWNrIHdvcmsgYXNzaWduZWQgdG8g d29ya2VycyBldGMuICovCisJYnJpbnNoYXJlZC0+bGFzdF93b3JrZXJfaWQgPSAwOworCWJy aW5zaGFyZWQtPm5leHRfcmFuZ2UgPSAwOworCWJyaW5zaGFyZWQtPmxhc3RfcmFuZ2UgPSBS ZWxhdGlvbkdldE51bWJlck9mQmxvY2tzKGhlYXApOworCisJLyoKKwkgKiBTdG9yZSBzaGFy ZWQgdHVwbGVzb3J0LXByaXZhdGUgc3RhdGUsIGZvciB3aGljaCB3ZSByZXNlcnZlZCBzcGFj ZS4KKwkgKiBUaGVuLCBpbml0aWFsaXplIG9wYXF1ZSBzdGF0ZSB1c2luZyB0dXBsZXNvcnQg cm91dGluZS4KKwkgKi8KKwlzaG1fdG9jX2luc2VydChwY3h0LT50b2MsIFBBUkFMTEVMX0tF WV9CUklOX1NIQVJFRCwgYnJpbnNoYXJlZCk7CisKKwkvKiBTdG9yZSBxdWVyeSBzdHJpbmcg Zm9yIHdvcmtlcnMgKi8KKwlpZiAoZGVidWdfcXVlcnlfc3RyaW5nKQorCXsKKwkJY2hhcgkg ICAqc2hhcmVkcXVlcnk7CisKKwkJc2hhcmVkcXVlcnkgPSAoY2hhciAqKSBzaG1fdG9jX2Fs bG9jYXRlKHBjeHQtPnRvYywgcXVlcnlsZW4gKyAxKTsKKwkJbWVtY3B5KHNoYXJlZHF1ZXJ5 LCBkZWJ1Z19xdWVyeV9zdHJpbmcsIHF1ZXJ5bGVuICsgMSk7CisJCXNobV90b2NfaW5zZXJ0 KHBjeHQtPnRvYywgUEFSQUxMRUxfS0VZX1FVRVJZX1RFWFQsIHNoYXJlZHF1ZXJ5KTsKKwl9 CisKKwkvKgorCSAqIEFsbG9jYXRlIHNwYWNlIGZvciBlYWNoIHdvcmtlcidzIFdhbFVzYWdl IGFuZCBCdWZmZXJVc2FnZTsgbm8gbmVlZCB0bworCSAqIGluaXRpYWxpemUuCisJICovCisJ d2FsdXNhZ2UgPSBzaG1fdG9jX2FsbG9jYXRlKHBjeHQtPnRvYywKKwkJCQkJCQkJbXVsX3Np emUoc2l6ZW9mKFdhbFVzYWdlKSwgcGN4dC0+bndvcmtlcnMpKTsKKwlzaG1fdG9jX2luc2Vy dChwY3h0LT50b2MsIFBBUkFMTEVMX0tFWV9XQUxfVVNBR0UsIHdhbHVzYWdlKTsKKwlidWZm ZXJ1c2FnZSA9IHNobV90b2NfYWxsb2NhdGUocGN4dC0+dG9jLAorCQkJCQkJCQkgICBtdWxf c2l6ZShzaXplb2YoQnVmZmVyVXNhZ2UpLCBwY3h0LT5ud29ya2VycykpOworCXNobV90b2Nf aW5zZXJ0KHBjeHQtPnRvYywgUEFSQUxMRUxfS0VZX0JVRkZFUl9VU0FHRSwgYnVmZmVydXNh Z2UpOworCisJLyogTGF1bmNoIHdvcmtlcnMsIHNhdmluZyBzdGF0dXMgZm9yIGxlYWRlci9j YWxsZXIgKi8KKwlMYXVuY2hQYXJhbGxlbFdvcmtlcnMocGN4dCk7CisJYnJpbmxlYWRlci0+ cGN4dCA9IHBjeHQ7CisJYnJpbmxlYWRlci0+bnBhcnRpY2lwYW50d29ya2VycyA9IHBjeHQt Pm53b3JrZXJzX2xhdW5jaGVkOworCWlmIChsZWFkZXJwYXJ0aWNpcGF0ZXMpCisJCWJyaW5s ZWFkZXItPm5wYXJ0aWNpcGFudHdvcmtlcnMrKzsKKwlicmlubGVhZGVyLT5icmluc2hhcmVk ID0gYnJpbnNoYXJlZDsKKwlicmlubGVhZGVyLT5zbmFwc2hvdCA9IHNuYXBzaG90OworCWJy aW5sZWFkZXItPndhbHVzYWdlID0gd2FsdXNhZ2U7CisJYnJpbmxlYWRlci0+YnVmZmVydXNh Z2UgPSBidWZmZXJ1c2FnZTsKKworCS8qIElmIG5vIHdvcmtlcnMgd2VyZSBzdWNjZXNzZnVs bHkgbGF1bmNoZWQsIGJhY2sgb3V0IChkbyBzZXJpYWwgYnVpbGQpICovCisJaWYgKHBjeHQt Pm53b3JrZXJzX2xhdW5jaGVkID09IDApCisJeworCQlfYnJpbl9lbmRfcGFyYWxsZWwoYnJp bmxlYWRlciwgTlVMTCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBTYXZlIGxlYWRlciBzdGF0 ZSBub3cgdGhhdCBpdCdzIGNsZWFyIGJ1aWxkIHdpbGwgYmUgcGFyYWxsZWwgKi8KKwlidWls ZHN0YXRlLT5ic19sZWFkZXIgPSBicmlubGVhZGVyOworCisJLyogSm9pbiBoZWFwIHNjYW4g b3Vyc2VsdmVzICovCisJaWYgKGxlYWRlcnBhcnRpY2lwYXRlcykKKwkJX2JyaW5fbGVhZGVy X3BhcnRpY2lwYXRlX2FzX3dvcmtlcihidWlsZHN0YXRlLCBoZWFwLCBpbmRleCk7CisKKwkv KgorCSAqIENhbGxlciBuZWVkcyB0byB3YWl0IGZvciBhbGwgbGF1bmNoZWQgd29ya2VycyB3 aGVuIHdlIHJldHVybi4gIE1ha2UKKwkgKiBzdXJlIHRoYXQgdGhlIGZhaWx1cmUtdG8tc3Rh cnQgY2FzZSB3aWxsIG5vdCBoYW5nIGZvcmV2ZXIuCisJICovCisJV2FpdEZvclBhcmFsbGVs V29ya2Vyc1RvQXR0YWNoKHBjeHQpOworfQorCisvKgorICogU2h1dCBkb3duIHdvcmtlcnMs IGRlc3Ryb3kgcGFyYWxsZWwgY29udGV4dCwgYW5kIGVuZCBwYXJhbGxlbCBtb2RlLgorICov CitzdGF0aWMgdm9pZAorX2JyaW5fZW5kX3BhcmFsbGVsKEJyaW5MZWFkZXIgKmJyaW5sZWFk ZXIsIEJyaW5CdWlsZFN0YXRlICpzdGF0ZSkKK3sKKwlpbnQJCQlpOworCUJyaW5TaGFyZWQg KmJyaW5zaGFyZWQgPSBicmlubGVhZGVyLT5icmluc2hhcmVkOworCisJLyogU2h1dGRvd24g d29ya2VyIHByb2Nlc3NlcyAqLworCVdhaXRGb3JQYXJhbGxlbFdvcmtlcnNUb0ZpbmlzaChi cmlubGVhZGVyLT5wY3h0KTsKKworCWlmICghc3RhdGUpCisJCXJldHVybjsKKworCS8qIGNv cHkgdGhlIGRhdGEgaW50byBsZWFkZXIgc3RhdGUgKHdlIGhhdmUgdG8gd2FpdCBmb3IgdGhl IHdvcmtlcnMgKSAqLworCXN0YXRlLT5ic19yZWx0dXBsZXMgPSBicmluc2hhcmVkLT5yZWx0 dXBsZXM7CisJc3RhdGUtPmJzX251bXR1cGxlcyA9IGJyaW5zaGFyZWQtPmluZHR1cGxlczsK KworCS8qCisJICogWFhYIG1heWJlIHdlIHNob3VsZCBzb3J0IHRoZSByYW5nZXMgYnkgcmFu Z2VTdGFydD8gVGhhdCdkIGdpdmUgdXMgaW5kZXgKKwkgKiB0aGF0IGlzIGNoZWFwZXIgdG8g d2FsayBzZXF1ZW50aWFsbHksIGJlY2F1c2Ugd2UnZCBub3QgaGF2ZSBhbnkgcGFnZQorCSAq IG1pc3NlcyAobW9zdGx5IGdldHRpbmcgZGF0YSBmcm9tIHRoZSBzYW1lIHBhZ2UgYXMgYmVm b3JlKS4gQWx0aG91Z2ggdGhlCisJICogaW5kZXggc2hvdWxkIGJlIHByZXR0eSBzbWFsbCBp biBnZW5lcmFsLCBhbmQgdGh1cyBjYWNoZWQuIE9UT0ggZWFjaAorCSAqIHdvcmtlciBzaG91 bGQgcHJvZHVjZSB0dXBsZXMgaW4gdGhlIHJpZ2h0IG9yZGVyLCBzbyB3ZSBjb3VsZCBqdXN0 IG1lcmdlCisJICogc29ydCB0aGVtLgorCSAqCisJICogWFhYIEFsdGVybmF0aXZlbHksIHdl IGNvdWxkIGFycmFuZ2UgdGhlIGJ1aWxkIHNvIHRoYXQgdGhlIHdvcmtlcnMgcmVhZAorCSAq IGEgY29udGludW91cyBjaHVuayBvZiB0aGUgdGFibGUuIEZvciBleGFtcGxlLCB3aXRoIEsg d29ya2VycyB3ZSBtaWdodAorCSAqIGxlYXZlIHRoZSBmaXJzdCAxL0sgdG8gdGhlIGZpcnN0 IHdvcmtlciwgdGhlbiAxL0sgdG8gdGhlIHNlY29uZCBldGMuCisJICogVGhlIHdlIHdvdWxk IG5vdCBuZWVkIHRvIHJlb3JkZXIgYW55dGhpbmcsIHdlIHdvdWxkIGp1c3QgcmVhZCB0aGUK KwkgKiByZXN1bHRzIGZvciBhbGwgd29ya2Vycy4KKwkgKgorCSAqIFhYWCBUaGF0J3MgYWxz byBtZWFuIHdlIGRvbid0IGRvIG1hbnkgc21hbGwgVElEIHNjYW5zLCBhcyBub3cuCisJICoK KwkgKiBUaGUgcHJvYmxlbSBpcyB3ZSBkb24ndCBrbm93IGhvdyBtYW55IHdvcmtlcnMgd2ls bCBiZSBzdGFydGVkIHdoaWxlCisJICogZGV0ZXJtaW5pbmcgdGhpcywgYnV0IG1heWJlIHdl IGNvdWxkIHBvc3Rwb25lIHRoYXQgZGVjaXNpb24gc29tZWhvdz8KKwkgKiBXZSdkIGhhdmUg dG8gd2FpdCBmb3IgYWxsIHRoZSBsYXVuY2hlZCB3b3JrZXJzIHRvIGF0dGFjaCwgSSBndWVz cy4KKwkgKi8KKwlmb3IgKGkgPSAxOyBpIDw9IGJyaW5zaGFyZWQtPmxhc3Rfd29ya2VyX2lk OyBpKyspCisJeworCQlCdWZGaWxlCSAgICpmOworCQljaGFyCQluYW1lW01BWFBHUEFUSF07 CisJCWludDY0CQlmc2l6ZTsKKwkJaW50NjQJCWZwb3MgPSAwOworCisJCXNucHJpbnRmKG5h bWUsIE1BWFBHUEFUSCwgInR1cGxlcy4lZCIsIGkpOworCisJCWYgPSBCdWZGaWxlT3BlbkZp bGVTZXQoJmJyaW5zaGFyZWQtPmZpbGVzZXQuZnMsIG5hbWUsIE9fUkRPTkxZLCBmYWxzZSk7 CisJCWZzaXplID0gQnVmRmlsZVNpemUoZik7CisKKwkJd2hpbGUgKGZwb3MgPCBmc2l6ZSkK KwkJeworCQkJU2l6ZQkJc2l6ZTsKKwkJCUJsb2NrTnVtYmVyCXJhbmdlU3RhcnQ7CisJCQlC cmluVHVwbGUgICp0dXA7CisKKwkJCWlmIChCdWZGaWxlUmVhZChmLCAmc2l6ZSwgc2l6ZW9m KFNpemUpKSAhPSBzaXplb2YoU2l6ZSkpCisJCQkJZWxvZyhFUlJPUiwgImZhaWxlZCByZWFk Iik7CisKKwkJCWlmIChCdWZGaWxlUmVhZChmLCAmcmFuZ2VTdGFydCwgc2l6ZW9mKEJsb2Nr TnVtYmVyKSkgIT0gc2l6ZW9mKEJsb2NrTnVtYmVyKSkKKwkJCQllbG9nKEVSUk9SLCAiZmFp bGVkIHJlYWQiKTsKKworCQkJdHVwID0gKEJyaW5UdXBsZSAqKSBwYWxsb2Moc2l6ZSk7CisK KwkJCWlmIChCdWZGaWxlUmVhZChmLCB0dXAsIHNpemUpICE9IHNpemUpCisJCQkJZWxvZyhF UlJPUiwgImZhaWxlZCByZWFkIik7CisKKwkJCWJyaW5fZG9pbnNlcnQoc3RhdGUtPmJzX2ly ZWwsIHN0YXRlLT5ic19wYWdlc1BlclJhbmdlLCBzdGF0ZS0+YnNfcm1BY2Nlc3MsCisJCQkJ CQkgICZzdGF0ZS0+YnNfY3VycmVudEluc2VydEJ1ZiwgcmFuZ2VTdGFydCwgdHVwLCBzaXpl KTsKKworCQkJZnBvcyArPSBzaXplb2YoU2l6ZSkgKyBzaXplb2YoQmxvY2tOdW1iZXIpICsg c2l6ZTsKKwkJfQorCisJCUJ1ZkZpbGVDbG9zZShmKTsKKwl9CisKKwkvKgorCSAqIE5leHQs IGFjY3VtdWxhdGUgV0FMIHVzYWdlLiAgKFRoaXMgbXVzdCB3YWl0IGZvciB0aGUgd29ya2Vy cyB0byBmaW5pc2gsCisJICogb3Igd2UgbWlnaHQgZ2V0IGluY29tcGxldGUgZGF0YS4pCisJ ICovCisJZm9yIChpID0gMDsgaSA8IGJyaW5sZWFkZXItPnBjeHQtPm53b3JrZXJzX2xhdW5j aGVkOyBpKyspCisJCUluc3RyQWNjdW1QYXJhbGxlbFF1ZXJ5KCZicmlubGVhZGVyLT5idWZm ZXJ1c2FnZVtpXSwgJmJyaW5sZWFkZXItPndhbHVzYWdlW2ldKTsKKworCS8qIEZyZWUgbGFz dCByZWZlcmVuY2UgdG8gTVZDQyBzbmFwc2hvdCwgaWYgb25lIHdhcyB1c2VkICovCisJaWYg KElzTVZDQ1NuYXBzaG90KGJyaW5sZWFkZXItPnNuYXBzaG90KSkKKwkJVW5yZWdpc3RlclNu YXBzaG90KGJyaW5sZWFkZXItPnNuYXBzaG90KTsKKwlEZXN0cm95UGFyYWxsZWxDb250ZXh0 KGJyaW5sZWFkZXItPnBjeHQpOworCUV4aXRQYXJhbGxlbE1vZGUoKTsKK30KKworLyoKKyAq IFJldHVybnMgc2l6ZSBvZiBzaGFyZWQgbWVtb3J5IHJlcXVpcmVkIHRvIHN0b3JlIHN0YXRl IGZvciBhIHBhcmFsbGVsCisgKiBicmluIGluZGV4IGJ1aWxkIGJhc2VkIG9uIHRoZSBzbmFw c2hvdCBpdHMgcGFyYWxsZWwgc2NhbiB3aWxsIHVzZS4KKyAqLworc3RhdGljIFNpemUKK19i cmluX3BhcmFsbGVsX2VzdGltYXRlX3NoYXJlZChSZWxhdGlvbiBoZWFwLCBTbmFwc2hvdCBz bmFwc2hvdCkKK3sKKwkvKiBjLmYuIHNobV90b2NfYWxsb2NhdGUgYXMgdG8gd2h5IEJVRkZF UkFMSUdOIGlzIHVzZWQgKi8KKwlyZXR1cm4gYWRkX3NpemUoQlVGRkVSQUxJR04oc2l6ZW9m KEJyaW5TaGFyZWQpKSwKKwkJCQkJdGFibGVfcGFyYWxsZWxzY2FuX2VzdGltYXRlKGhlYXAs IHNuYXBzaG90KSk7Cit9CisKKy8qCisgKiBXaXRoaW4gbGVhZGVyLCBwYXJ0aWNpcGF0ZSBh cyBhIHBhcmFsbGVsIHdvcmtlci4KKyAqLworc3RhdGljIHZvaWQKK19icmluX2xlYWRlcl9w YXJ0aWNpcGF0ZV9hc193b3JrZXIoQnJpbkJ1aWxkU3RhdGUgKmJ1aWxkc3RhdGUsIFJlbGF0 aW9uIGhlYXAsIFJlbGF0aW9uIGluZGV4KQoreworCUJyaW5MZWFkZXIgKmJyaW5sZWFkZXIg PSBidWlsZHN0YXRlLT5ic19sZWFkZXI7CisJaW50CQkJc29ydG1lbTsKKworCS8qCisJICog TWlnaHQgYXMgd2VsbCB1c2UgcmVsaWFibGUgZmlndXJlIHdoZW4gZG9saW5nIG91dCBtYWlu dGVuYW5jZV93b3JrX21lbQorCSAqICh3aGVuIHJlcXVlc3RlZCBudW1iZXIgb2Ygd29ya2Vy cyB3ZXJlIG5vdCBsYXVuY2hlZCwgdGhpcyB3aWxsIGJlCisJICogc29tZXdoYXQgaGlnaGVy IHRoYW4gaXQgaXMgZm9yIG90aGVyIHdvcmtlcnMpLgorCSAqLworCXNvcnRtZW0gPSBtYWlu dGVuYW5jZV93b3JrX21lbSAvIGJyaW5sZWFkZXItPm5wYXJ0aWNpcGFudHdvcmtlcnM7CisK KwkvKiBQZXJmb3JtIHdvcmsgY29tbW9uIHRvIGFsbCBwYXJ0aWNpcGFudHMgKi8KKwlfYnJp bl9wYXJhbGxlbF9zY2FuX2FuZF9idWlsZChidWlsZHN0YXRlLCBicmlubGVhZGVyLT5icmlu c2hhcmVkLAorCQkJCQkJCQkgIGhlYXAsIGluZGV4LCBzb3J0bWVtLCB0cnVlKTsKKworCS8q IGluc2VydCB0aGUgbGFzdCByYW5nZSAqLworCWZvcm1fYW5kX3NwaWxsX3R1cGxlKGJ1aWxk c3RhdGUpOworCisJQnVmRmlsZUNsb3NlKGJ1aWxkc3RhdGUtPmJzX2ZpbGUpOworCWJ1aWxk c3RhdGUtPmJzX2ZpbGUgPSBOVUxMOworfQorCisvKgorICogUGVyZm9ybSBhIHdvcmtlcidz IHBvcnRpb24gb2YgYSBwYXJhbGxlbCBzb3J0LgorICoKKyAqIFRoaXMgZ2VuZXJhdGVzIGEg dHVwbGVzb3J0IGZvciBwYXNzZWQgYnRzcG9vbCwgYW5kIGEgc2Vjb25kIHR1cGxlc29ydAor ICogc3RhdGUgaWYgYSBzZWNvbmQgYnRzcG9vbCBpcyBuZWVkIChpLmUuIGZvciB1bmlxdWUg aW5kZXggYnVpbGRzKS4gIEFsbAorICogb3RoZXIgc3Bvb2wgZmllbGRzIHNob3VsZCBhbHJl YWR5IGJlIHNldCB3aGVuIHRoaXMgaXMgY2FsbGVkLgorICoKKyAqIHNvcnRtZW0gaXMgdGhl IGFtb3VudCBvZiB3b3JraW5nIG1lbW9yeSB0byB1c2Ugd2l0aGluIGVhY2ggd29ya2VyLAor ICogZXhwcmVzc2VkIGluIEtCcy4KKyAqCisgKiBXaGVuIHRoaXMgcmV0dXJucywgd29ya2Vy cyBhcmUgZG9uZSwgYW5kIG5lZWQgb25seSByZWxlYXNlIHJlc291cmNlcy4KKyAqLworc3Rh dGljIHZvaWQKK19icmluX3BhcmFsbGVsX3NjYW5fYW5kX2J1aWxkKEJyaW5CdWlsZFN0YXRl ICpzdGF0ZSwgQnJpblNoYXJlZCAqYnJpbnNoYXJlZCwKKwkJCQkJCQkgIFJlbGF0aW9uIGhl YXAsIFJlbGF0aW9uIGluZGV4LCBpbnQgc29ydG1lbSwKKwkJCQkJCQkgIGJvb2wgcHJvZ3Jl c3MpCit7CisJZG91YmxlCQlyZWx0dXBsZXM7CisJSW5kZXhJbmZvICAqaW5kZXhJbmZvOwor CWNoYXIJCW5hbWVbTUFYUEdQQVRIXTsKKworCS8qIEpvaW4gcGFyYWxsZWwgc2NhbiAqLwor CWluZGV4SW5mbyA9IEJ1aWxkSW5kZXhJbmZvKGluZGV4KTsKKwlpbmRleEluZm8tPmlpX0Nv bmN1cnJlbnQgPSBicmluc2hhcmVkLT5pc2NvbmN1cnJlbnQ7CisKKwlTcGluTG9ja0FjcXVp cmUoJmJyaW5zaGFyZWQtPm11dGV4KTsKKwlzdGF0ZS0+YnNfd29ya2VyX2lkID0gKCsrYnJp bnNoYXJlZC0+bGFzdF93b3JrZXJfaWQpOworCVNwaW5Mb2NrUmVsZWFzZSgmYnJpbnNoYXJl ZC0+bXV0ZXgpOworCisJc25wcmludGYobmFtZSwgTUFYUEdQQVRILCAidHVwbGVzLiVkIiwg c3RhdGUtPmJzX3dvcmtlcl9pZCk7CisKKwlzdGF0ZS0+YnNfZmlsZSA9IEJ1ZkZpbGVDcmVh dGVGaWxlU2V0KCZicmluc2hhcmVkLT5maWxlc2V0LmZzLCBuYW1lKTsKKworCS8qIEdldCBj aHVua3Mgb2YgdGhlIHRhYmxlLCBkbyBUSUQgU2NhbnMgYW5kIGJ1aWxkIHRoZSByYW5nZXMg Ki8KKwl3aGlsZSAodHJ1ZSkKKwl7CisJCVRhYmxlU2NhbkRlc2MJc2NhbjsKKwkJQmxvY2tO dW1iZXIJCXN0YXJ0QmxvY2ssCisJCQkJCQlsYXN0QmxvY2ssCisJCQkJCQljaHVua0Jsb2Nr czsKKwkJSXRlbVBvaW50ZXJEYXRhCW1pbnRpZCwKKwkJCQkJCW1heHRpZDsKKworCQkvKgor CQkgKiBBY3F1aXJlIGxhcmdlciBjaHVua3Mgb2YgZGF0YSAtIHRoaXMgbWF0dGVycyBlc3Bl Y2lhbGx5IGZvciBsb3cKKwkJICogcGFnZXNfcGVyX3JhbmdlIHNldHRpbmdzIChlLmcuIHNl dCB0byAxKS4gT3RoZXJ3aXNlIHRoZXJlIHdvdWxkCisJCSAqIGJlIGEgbG90IG9mIHRyYXNo aW5nIGFuZCBvdmVyaGVhZCB3aXRoIG11bHRpcGxlIHdvcmtlcnMuCisJCSAqCisJCSAqIE5v dCBzdXJlIHdoZXJlJ3MgdGhlIHN3ZWV0IHNwb3QuIE1heWJlIHRpZSB0aGlzIHRvIHRoZSBw cmVmZXRjaGluZworCQkgKiB0b28gKG1haW50ZW5hbmNlX2VmZmVjdGl2ZV9pb19jb25jdWNy cmVuY3kpPworCQkgKgorCQkgKiBGSVhNRSBUaGUgY2h1bmtCbG9ja3MgbmVlZHMgdG8gYmUg YSBtdWx0aXBsZSBvZiBic19wYWdlc1BlclJhbmdlLgorCQkgKi8KKwkJY2h1bmtCbG9ja3Mg PSBNYXgoMTI4LCBzdGF0ZS0+YnNfcGFnZXNQZXJSYW5nZSk7CisKKwkJU3BpbkxvY2tBY3F1 aXJlKCZicmluc2hhcmVkLT5tdXRleCk7CisJCXN0YXJ0QmxvY2sgPSBicmluc2hhcmVkLT5u ZXh0X3JhbmdlOworCQlsYXN0QmxvY2sgPSBicmluc2hhcmVkLT5sYXN0X3JhbmdlOworCQli cmluc2hhcmVkLT5uZXh0X3JhbmdlICs9IGNodW5rQmxvY2tzOworCQlTcGluTG9ja1JlbGVh c2UoJmJyaW5zaGFyZWQtPm11dGV4KTsKKworCQlzdGF0ZS0+YnNfY3VyclJhbmdlU3RhcnQg PSBzdGFydEJsb2NrOworCisJCS8qIGRpZCB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBoZWFw IHJlbGF0aW9uPyAqLworCQlpZiAoc3RhcnRCbG9jayA+IGxhc3RCbG9jaykKKwkJCWJyZWFr OworCisJCS8qIHJlLWluaXRpYWxpemUgc3RhdGUgZm9yIGl0ICovCisJCWJyaW5fbWVtdHVw bGVfaW5pdGlhbGl6ZShzdGF0ZS0+YnNfZHR1cGxlLCBzdGF0ZS0+YnNfYmRlc2MpOworCisJ CUl0ZW1Qb2ludGVyU2V0KCZtaW50aWQsIHN0YXJ0QmxvY2ssIDApOworCQlJdGVtUG9pbnRl clNldCgmbWF4dGlkLCBzdGFydEJsb2NrICsgKGNodW5rQmxvY2tzIC0gMSksCisJCQkJCSAg IE1heEhlYXBUdXBsZXNQZXJQYWdlKTsKKworCQkvKiBzdGFydCB0aWRzY2FuIHRvIHJlYWQg dGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIHRhYmxlICovCisJCXNjYW4gPSB0YWJsZV9iZWdp bnNjYW5fdGlkcmFuZ2UoaGVhcCwgU25hcHNob3RBbnksCS8vIEZJWE1FIHdoaWNoIHNuYXBz aG90IHRvIHVzZT8KKwkJCQkJCQkJCQkmbWludGlkLCAmbWF4dGlkKTsKKworI2lmZGVmIFVT RV9QUkVGRVRDSAorCQkvKiBkbyBwcmVmZXRjaGluZyAodGhpcyBwcmVmZXRjaGVzIHRoZSB3 aG9sZSByYW5nZS4gbm90IHN1cmUgdGhhdCdzIGdvb2QpICovCisJCWZvciAoQmxvY2tOdW1i ZXIgYmxrbm8gPSBzdGFydEJsb2NrOyBibGtubyA8IHN0YXJ0QmxvY2sgKyBjaHVua0Jsb2Nr czsgYmxrbm8rKykKKwkJCVByZWZldGNoQnVmZmVyKHNjYW4tPnJzX3JkLCBNQUlOX0ZPUktO VU0sIGJsa25vKTsKKyNlbmRpZgorCisJCXJlbHR1cGxlcyA9IHRhYmxlX2luZGV4X2J1aWxk X3NjYW4oaGVhcCwgaW5kZXgsIGluZGV4SW5mbywgdHJ1ZSwgdHJ1ZSwKKwkJCQkJCQkJCQkg ICBicmluYnVpbGRDYWxsYmFja1BhcmFsbGVsLCBzdGF0ZSwgc2Nhbik7CisKKwkJLyogc3Bp bGwgdGhlIGxhc3QgdHVwbGUgKi8KKwkJZm9ybV9hbmRfc3BpbGxfdHVwbGUoc3RhdGUpOwor CisJCXN0YXRlLT5ic19yZWx0dXBsZXMgKz0gcmVsdHVwbGVzOworCisJCS8qIHNldCBzdGF0 ZSB0byBpbnZhbGlkIHJhbmdlICovCisJCXN0YXRlLT5ic19jdXJyUmFuZ2VTdGFydCA9IElu dmFsaWRCbG9ja051bWJlcjsKKwl9CisKKwkvKgorCSAqIERvbmUuICBSZWNvcmQgYW1idWls ZCBzdGF0aXN0aWNzLgorCSAqLworCVNwaW5Mb2NrQWNxdWlyZSgmYnJpbnNoYXJlZC0+bXV0 ZXgpOworCWJyaW5zaGFyZWQtPm5wYXJ0aWNpcGFudHNkb25lKys7CisJYnJpbnNoYXJlZC0+ cmVsdHVwbGVzICs9IHN0YXRlLT5ic19yZWx0dXBsZXM7CisJYnJpbnNoYXJlZC0+aW5kdHVw bGVzICs9IHN0YXRlLT5ic19udW10dXBsZXM7CisJU3BpbkxvY2tSZWxlYXNlKCZicmluc2hh cmVkLT5tdXRleCk7CisKKwkvKiBOb3RpZnkgbGVhZGVyICovCisJQ29uZGl0aW9uVmFyaWFi bGVTaWduYWwoJmJyaW5zaGFyZWQtPndvcmtlcnNkb25lY3YpOworfQorCisvKgorICogUGVy Zm9ybSB3b3JrIHdpdGhpbiBhIGxhdW5jaGVkIHBhcmFsbGVsIHByb2Nlc3MuCisgKi8KK3Zv aWQKK19icmluX3BhcmFsbGVsX2J1aWxkX21haW4oZHNtX3NlZ21lbnQgKnNlZywgc2htX3Rv YyAqdG9jKQoreworCWNoYXIJICAgKnNoYXJlZHF1ZXJ5OworCUJyaW5TaGFyZWQgKmJyaW5z aGFyZWQ7CisJQnJpbkJ1aWxkU3RhdGUgKmJ1aWxkc3RhdGU7CisJUmVsYXRpb24JaGVhcFJl bDsKKwlSZWxhdGlvbglpbmRleFJlbDsKKwlMT0NLTU9ERQloZWFwTG9ja21vZGU7CisJTE9D S01PREUJaW5kZXhMb2NrbW9kZTsKKwlXYWxVc2FnZSAgICp3YWx1c2FnZTsKKwlCdWZmZXJV c2FnZSAqYnVmZmVydXNhZ2U7CisJaW50CQkJc29ydG1lbTsKKworCS8qCisJICogVGhlIG9u bHkgcG9zc2libGUgc3RhdHVzIGZsYWcgdGhhdCBjYW4gYmUgc2V0IHRvIHRoZSBwYXJhbGxl bCB3b3JrZXIgaXMKKwkgKiBQUk9DX0lOX1NBRkVfSUMuCisJICovCisJQXNzZXJ0KChNeVBy b2MtPnN0YXR1c0ZsYWdzID09IDApIHx8CisJCSAgIChNeVByb2MtPnN0YXR1c0ZsYWdzID09 IFBST0NfSU5fU0FGRV9JQykpOworCisJLyogU2V0IGRlYnVnX3F1ZXJ5X3N0cmluZyBmb3Ig aW5kaXZpZHVhbCB3b3JrZXJzIGZpcnN0ICovCisJc2hhcmVkcXVlcnkgPSBzaG1fdG9jX2xv b2t1cCh0b2MsIFBBUkFMTEVMX0tFWV9RVUVSWV9URVhULCB0cnVlKTsKKwlkZWJ1Z19xdWVy eV9zdHJpbmcgPSBzaGFyZWRxdWVyeTsKKworCS8qIFJlcG9ydCB0aGUgcXVlcnkgc3RyaW5n IGZyb20gbGVhZGVyICovCisJcGdzdGF0X3JlcG9ydF9hY3Rpdml0eShTVEFURV9SVU5OSU5H LCBkZWJ1Z19xdWVyeV9zdHJpbmcpOworCisJLyogTG9vayB1cCBicmluIHNoYXJlZCBzdGF0 ZSAqLworCWJyaW5zaGFyZWQgPSBzaG1fdG9jX2xvb2t1cCh0b2MsIFBBUkFMTEVMX0tFWV9C UklOX1NIQVJFRCwgZmFsc2UpOworCisJLyogT3BlbiByZWxhdGlvbnMgdXNpbmcgbG9jayBt b2RlcyBrbm93biB0byBiZSBvYnRhaW5lZCBieSBpbmRleC5jICovCisJaWYgKCFicmluc2hh cmVkLT5pc2NvbmN1cnJlbnQpCisJeworCQloZWFwTG9ja21vZGUgPSBTaGFyZUxvY2s7CisJ CWluZGV4TG9ja21vZGUgPSBBY2Nlc3NFeGNsdXNpdmVMb2NrOworCX0KKwllbHNlCisJewor CQloZWFwTG9ja21vZGUgPSBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2s7CisJCWluZGV4TG9j a21vZGUgPSBSb3dFeGNsdXNpdmVMb2NrOworCX0KKworCS8qIE9wZW4gcmVsYXRpb25zIHdp dGhpbiB3b3JrZXIgKi8KKwloZWFwUmVsID0gdGFibGVfb3Blbihicmluc2hhcmVkLT5oZWFw cmVsaWQsIGhlYXBMb2NrbW9kZSk7CisJaW5kZXhSZWwgPSBpbmRleF9vcGVuKGJyaW5zaGFy ZWQtPmluZGV4cmVsaWQsIGluZGV4TG9ja21vZGUpOworCisJYnVpbGRzdGF0ZSA9IGluaXRp YWxpemVfYnJpbl9idWlsZHN0YXRlKGluZGV4UmVsLCBOVUxMLCBicmluc2hhcmVkLT5wYWdl c1BlclJhbmdlKTsKKworCS8qIEF0dGFjaCB0byB0aGUgc2hhcmVkIGZpbGVzZXQuICovCisJ U2hhcmVkRmlsZVNldEF0dGFjaCgmYnJpbnNoYXJlZC0+ZmlsZXNldCwgc2VnKTsKKworCS8q IFByZXBhcmUgdG8gdHJhY2sgYnVmZmVyIHVzYWdlIGR1cmluZyBwYXJhbGxlbCBleGVjdXRp b24gKi8KKwlJbnN0clN0YXJ0UGFyYWxsZWxRdWVyeSgpOworCisJLyogRklYTUUgdGllIHRo aXMgdG8gbnVtYmVyIG9mIHBhcnRpY2lwYW50cywgc29tZWhvdyAqLworCXNvcnRtZW0gPSBt YWludGVuYW5jZV93b3JrX21lbSAvIDI7CisJX2JyaW5fcGFyYWxsZWxfc2Nhbl9hbmRfYnVp bGQoYnVpbGRzdGF0ZSwgYnJpbnNoYXJlZCwKKwkJCQkJCQkJICBoZWFwUmVsLCBpbmRleFJl bCwgc29ydG1lbSwgZmFsc2UpOworCisJLyogaW5zZXJ0IHRoZSBsYXN0IHJhbmdlICovCisJ Zm9ybV9hbmRfc3BpbGxfdHVwbGUoYnVpbGRzdGF0ZSk7CisKKwlCdWZGaWxlQ2xvc2UoYnVp bGRzdGF0ZS0+YnNfZmlsZSk7CisJYnVpbGRzdGF0ZS0+YnNfZmlsZSA9IE5VTEw7CisKKwkv KiBSZXBvcnQgV0FML2J1ZmZlciB1c2FnZSBkdXJpbmcgcGFyYWxsZWwgZXhlY3V0aW9uICov CisJYnVmZmVydXNhZ2UgPSBzaG1fdG9jX2xvb2t1cCh0b2MsIFBBUkFMTEVMX0tFWV9CVUZG RVJfVVNBR0UsIGZhbHNlKTsKKwl3YWx1c2FnZSA9IHNobV90b2NfbG9va3VwKHRvYywgUEFS QUxMRUxfS0VZX1dBTF9VU0FHRSwgZmFsc2UpOworCUluc3RyRW5kUGFyYWxsZWxRdWVyeSgm YnVmZmVydXNhZ2VbUGFyYWxsZWxXb3JrZXJOdW1iZXJdLAorCQkJCQkJICAmd2FsdXNhZ2Vb UGFyYWxsZWxXb3JrZXJOdW1iZXJdKTsKKworCWluZGV4X2Nsb3NlKGluZGV4UmVsLCBpbmRl eExvY2ttb2RlKTsKKwl0YWJsZV9jbG9zZShoZWFwUmVsLCBoZWFwTG9ja21vZGUpOworfQpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vcGFyYWxsZWwuYyBiL3Ny Yy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3BhcmFsbGVsLmMKaW5kZXggMmI4YmMyZjU4ZGQu LjcyMDg2MjEyZjQ3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9w YXJhbGxlbC5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3BhcmFsbGVsLmMK QEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgInBvc3RncmVzLmgiCiAKKyNpbmNsdWRl ICJhY2Nlc3MvYnJpbi5oIgogI2luY2x1ZGUgImFjY2Vzcy9uYnRyZWUuaCIKICNpbmNsdWRl ICJhY2Nlc3MvcGFyYWxsZWwuaCIKICNpbmNsdWRlICJhY2Nlc3Mvc2Vzc2lvbi5oIgpAQCAt MTQ0LDYgKzE0NSw5IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QKIAl7CiAJCSJfYnRfcGFyYWxs ZWxfYnVpbGRfbWFpbiIsIF9idF9wYXJhbGxlbF9idWlsZF9tYWluCiAJfSwKKwl7CisJCSJf YnJpbl9wYXJhbGxlbF9idWlsZF9tYWluIiwgX2JyaW5fcGFyYWxsZWxfYnVpbGRfbWFpbgor CX0sCiAJewogCQkicGFyYWxsZWxfdmFjdXVtX21haW4iLCBwYXJhbGxlbF92YWN1dW1fbWFp bgogCX0KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvaW5kZXguYyBiL3NyYy9i YWNrZW5kL2NhdGFsb2cvaW5kZXguYwppbmRleCAzNTJlNDNkMGU2MS4uNWJkZDAyNWJiMjUg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvaW5kZXguYworKysgYi9zcmMvYmFj a2VuZC9jYXRhbG9nL2luZGV4LmMKQEAgLTI5ODAsNyArMjk4MCw4IEBAIGluZGV4X2J1aWxk KFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwKIAkgKiBOb3RlIHRoYXQgcGxhbm5lciBjb25zaWRl cnMgcGFyYWxsZWwgc2FmZXR5IGZvciB1cy4KIAkgKi8KIAlpZiAocGFyYWxsZWwgJiYgSXNO b3JtYWxQcm9jZXNzaW5nTW9kZSgpICYmCi0JCWluZGV4UmVsYXRpb24tPnJkX3JlbC0+cmVs YW0gPT0gQlRSRUVfQU1fT0lEKQorCQkoaW5kZXhSZWxhdGlvbi0+cmRfcmVsLT5yZWxhbSA9 PSBCVFJFRV9BTV9PSUQgfHwKKwkJIGluZGV4UmVsYXRpb24tPnJkX3JlbC0+cmVsYW0gPT0g QlJJTl9BTV9PSUQpKQogCQlpbmRleEluZm8tPmlpX1BhcmFsbGVsV29ya2VycyA9CiAJCQlw bGFuX2NyZWF0ZV9pbmRleF93b3JrZXJzKFJlbGF0aW9uR2V0UmVsaWQoaGVhcFJlbGF0aW9u KSwKIAkJCQkJCQkJCSAgUmVsYXRpb25HZXRSZWxpZChpbmRleFJlbGF0aW9uKSk7CmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS9hY2Nlc3MvYnJpbi5oIGIvc3JjL2luY2x1ZGUvYWNjZXNz L2JyaW4uaAppbmRleCBlZDY2ZjFiM2Q1MS4uMzQ1MWVjYjIxMWYgMTAwNjQ0Ci0tLSBhL3Ny Yy9pbmNsdWRlL2FjY2Vzcy9icmluLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL2JyaW4u aApAQCAtMTEsNiArMTEsNyBAQAogI2RlZmluZSBCUklOX0gKIAogI2luY2x1ZGUgIm5vZGVz L2V4ZWNub2Rlcy5oIgorI2luY2x1ZGUgInN0b3JhZ2Uvc2htX3RvYy5oIgogI2luY2x1ZGUg InV0aWxzL3JlbGNhY2hlLmgiCiAKIApAQCAtNTIsNCArNTMsNiBAQCB0eXBlZGVmIHN0cnVj dCBCcmluU3RhdHNEYXRhCiAKIGV4dGVybiB2b2lkIGJyaW5HZXRTdGF0cyhSZWxhdGlvbiBp bmRleCwgQnJpblN0YXRzRGF0YSAqc3RhdHMpOwogCitleHRlcm4gdm9pZCBfYnJpbl9wYXJh bGxlbF9idWlsZF9tYWluKGRzbV9zZWdtZW50ICpzZWcsIHNobV90b2MgKnRvYyk7CisKICNl bmRpZgkJCQkJCQkvKiBCUklOX0ggKi8KLS0gCjIuNDAuMQoK --------------mZQ0QE79c49k9nkGX6scHErz Content-Type: text/x-patch; charset=UTF-8; name="0002-switch-CREATE-INDEX-for-BRIN-to-parallel-sc-20230608.patch" Content-Disposition: attachment; filename*0="0002-switch-CREATE-INDEX-for-BRIN-to-parallel-sc-20230608.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA1ZTE5ODg3ZWZhNTdmNzdiMTdkZjQ1YTY1YTEwMWI4NDcyMWY2NjVjIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzLnZvbmRyYUBwb3N0 Z3Jlc3FsLm9yZz4KRGF0ZTogU2F0LCA4IEFwciAyMDIzIDE2OjM5OjUxICswMjAwClN1Ympl Y3Q6IFtQQVRDSCAyLzJdIHN3aXRjaCBDUkVBVEUgSU5ERVggZm9yIEJSSU4gdG8gcGFyYWxs ZWwgc2NhbgoKLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvYnJpbi9icmluLmMgICAgICB8IDEx MCArKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvbmJ0 cmVlL25idHNvcnQuYyB8ICAgMiArLQogc3JjL2JhY2tlbmQvYWNjZXNzL3RhYmxlL3RhYmxl YW0uYyAgfCAgMjYgKysrKystLQogc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZVNlcXNjYW4u YyAgfCAgIDMgKy0KIHNyYy9pbmNsdWRlL2FjY2Vzcy9yZWxzY2FuLmggICAgICAgIHwgICAx ICsKIHNyYy9pbmNsdWRlL2FjY2Vzcy90YWJsZWFtLmggICAgICAgIHwgICA5ICsrLQogNiBm aWxlcyBjaGFuZ2VkLCA3MyBpbnNlcnRpb25zKCspLCA3OCBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvYnJpbi9icmluLmMgYi9zcmMvYmFja2VuZC9h Y2Nlc3MvYnJpbi9icmluLmMKaW5kZXggMTNkOTQ5MzFlZmMuLjc5NmMwZWNmMDZlIDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvYnJpbi9icmluLmMKKysrIGIvc3JjL2JhY2tl bmQvYWNjZXNzL2JyaW4vYnJpbi5jCkBAIC04NSwxMiArODUsOCBAQCB0eXBlZGVmIHN0cnVj dCBCcmluU2hhcmVkCiAJICovCiAJc2xvY2tfdAkJbXV0ZXg7CiAKLQkvKgotCSAqIAotCSAq LworCS8qIFhYWCBQcm9iYWJseSBub3QgbmVlZGVkLiBJZGVudGlmaWVzIHRoZSB3b3JrZXIu ICovCiAJaW50CQkJbGFzdF93b3JrZXJfaWQ7Ci0JQmxvY2tOdW1iZXIJbmV4dF9yYW5nZTsK LQlCbG9ja051bWJlcglsYXN0X3JhbmdlOwogCiAJLyoKIAkgKiBNdXRhYmxlIHN0YXRlIHRo YXQgaXMgbWFpbnRhaW5lZCBieSB3b3JrZXJzLCBhbmQgcmVwb3J0ZWQgYmFjayB0bwpAQCAt MTA1LDggKzEwMSwyMyBAQCB0eXBlZGVmIHN0cnVjdCBCcmluU2hhcmVkCiAJaW50CQkJbnBh cnRpY2lwYW50c2RvbmU7CiAJZG91YmxlCQlyZWx0dXBsZXM7CiAJZG91YmxlCQlpbmR0dXBs ZXM7CisKKwkvKgorCSAqIFBhcmFsbGVsVGFibGVTY2FuRGVzY0RhdGEgZGF0YSBmb2xsb3dz LiBDYW4ndCBkaXJlY3RseSBlbWJlZCBoZXJlLCBhcworCSAqIGltcGxlbWVudGF0aW9ucyBv ZiB0aGUgcGFyYWxsZWwgdGFibGUgc2NhbiBkZXNjIGludGVyZmFjZSBtaWdodCBuZWVkCisJ ICogc3Ryb25nZXIgYWxpZ25tZW50LgorCSAqLwogfSBCcmluU2hhcmVkOwogCisvKgorICog UmV0dXJuIHBvaW50ZXIgdG8gYSBCcmluU2hhcmVkJ3MgcGFyYWxsZWwgdGFibGUgc2Nhbi4K KyAqCisgKiBjLmYuIHNobV90b2NfYWxsb2NhdGUgYXMgdG8gd2h5IEJVRkZFUkFMSUdOIGlz IHVzZWQsIHJhdGhlciB0aGFuIGp1c3QKKyAqIE1BWEFMSUdOLgorICovCisjZGVmaW5lIFBh cmFsbGVsVGFibGVTY2FuRnJvbUJyaW5TaGFyZWQoc2hhcmVkKSBcCisJKFBhcmFsbGVsVGFi bGVTY2FuRGVzYykgKChjaGFyICopIChzaGFyZWQpICsgQlVGRkVSQUxJR04oc2l6ZW9mKEJy aW5TaGFyZWQpKSkKKwogLyoKICAqIFN0YXR1cyBmb3IgbGVhZGVyIGluIHBhcmFsbGVsIGlu ZGV4IGJ1aWxkLgogICovCkBAIC05NzUsOCArOTg2LDIwIEBAIGJyaW5idWlsZENhbGxiYWNr UGFyYWxsZWwoUmVsYXRpb24gaW5kZXgsCiAJCS8qIGNyZWF0ZSB0aGUgaW5kZXggdHVwbGUg YW5kIHdyaXRlIGl0IGludG8gdGhlIHRlbXBvcmFyeSBmaWxlICovCiAJCWZvcm1fYW5kX3Nw aWxsX3R1cGxlKHN0YXRlKTsKIAotCQkvKiBzZXQgc3RhdGUgdG8gY29ycmVzcG9uZCB0byB0 aGUgbmV4dCByYW5nZSAqLwotCQlzdGF0ZS0+YnNfY3VyclJhbmdlU3RhcnQgKz0gc3RhdGUt PmJzX3BhZ2VzUGVyUmFuZ2U7CisJCS8qCisJCSAqIHNldCBzdGF0ZSB0byBjb3JyZXNwb25k IHRvIHRoZSBuZXh0IHJhbmdlCisJCSAqCisJCSAqIFhYWCBUaGlzIGhhcyB0aGUgaXNzdWUg dGhhdCBpdCBza2lwcyByYW5nZXMgc3VtbWFyaXplZCBieSBvdGhlcgorCQkgKiB3b3JrZXJz LCBidXQgaXQgYWxzbyBza2lwcyBlbXB0eSByYW5nZXMgdGhhdCBzaG91bGQgaGF2ZSBiZWVu CisJCSAqIHN1bW1hcml6ZWQuIFdlJ2QgbmVlZCB0byBlaXRoZXIgbWFrZSB0aGUgd29ya2Vy cyBhd2FyZSB3aGljaAorCQkgKiBjaHVuayB0aGV5IGFyZSBhY3R1YWxseSBwcm9jZXNzaW5n ICh3aGljaCBpcyBjdXJyZW50bHkga25vd24KKwkJICogb25seSBpbiB0aGUgUGFyYWxsZWxC bG9ja1RhYmxlU2NhbiBiaXQpLiBPciB3ZSBjb3VsZCBpZ25vcmUgaXQKKwkJICogaGVyZSwg YW5kIHRoZW4gZGVjaWRlIGl0IHdoaWxlICJtZXJnaW5nIiByZXN1bHRzIGZyb20gd29ya2Vy cworCQkgKiAoaWYgdGhlcmUncyBubyBlbnRyeSBmb3IgdGhlIHJhbmdlLCBpdCBoYWQgdG8g YmUgZW1wdHkgc28gd2UKKwkJICoganVzdCBhZGQgYW4gZW1wdHkgb25lKS4KKwkJICovCisJ CXdoaWxlICh0aGlzYmxvY2sgPiBzdGF0ZS0+YnNfY3VyclJhbmdlU3RhcnQgKyBzdGF0ZS0+ YnNfcGFnZXNQZXJSYW5nZSAtIDEpCisJCQlzdGF0ZS0+YnNfY3VyclJhbmdlU3RhcnQgKz0g c3RhdGUtPmJzX3BhZ2VzUGVyUmFuZ2U7CiAKIAkJLyogcmUtaW5pdGlhbGl6ZSBzdGF0ZSBm b3IgaXQgKi8KIAkJYnJpbl9tZW10dXBsZV9pbml0aWFsaXplKHN0YXRlLT5ic19kdHVwbGUs IHN0YXRlLT5ic19iZGVzYyk7CkBAIC0yMjQzLDggKzIyNjYsMTAgQEAgX2JyaW5fYmVnaW5f cGFyYWxsZWwoQnJpbkJ1aWxkU3RhdGUgKmJ1aWxkc3RhdGUsIFJlbGF0aW9uIGhlYXAsIFJl bGF0aW9uIGluZGV4LAogCiAJLyogVHJhY2sgd29yayBhc3NpZ25lZCB0byB3b3JrZXJzIGV0 Yy4gKi8KIAlicmluc2hhcmVkLT5sYXN0X3dvcmtlcl9pZCA9IDA7Ci0JYnJpbnNoYXJlZC0+ bmV4dF9yYW5nZSA9IDA7Ci0JYnJpbnNoYXJlZC0+bGFzdF9yYW5nZSA9IFJlbGF0aW9uR2V0 TnVtYmVyT2ZCbG9ja3MoaGVhcCk7CisKKwl0YWJsZV9wYXJhbGxlbHNjYW5faW5pdGlhbGl6 ZShoZWFwLAorCQkJCQkJCQkgIFBhcmFsbGVsVGFibGVTY2FuRnJvbUJyaW5TaGFyZWQoYnJp bnNoYXJlZCksCisJCQkJCQkJCSAgc25hcHNob3QsIGJyaW5zaGFyZWQtPnBhZ2VzUGVyUmFu Z2UpOwogCiAJLyoKIAkgKiBTdG9yZSBzaGFyZWQgdHVwbGVzb3J0LXByaXZhdGUgc3RhdGUs IGZvciB3aGljaCB3ZSByZXNlcnZlZCBzcGFjZS4KQEAgLTI0NTIsNiArMjQ3Nyw3IEBAIF9i cmluX3BhcmFsbGVsX3NjYW5fYW5kX2J1aWxkKEJyaW5CdWlsZFN0YXRlICpzdGF0ZSwgQnJp blNoYXJlZCAqYnJpbnNoYXJlZCwKIAkJCQkJCQkgIFJlbGF0aW9uIGhlYXAsIFJlbGF0aW9u IGluZGV4LCBpbnQgc29ydG1lbSwKIAkJCQkJCQkgIGJvb2wgcHJvZ3Jlc3MpCiB7CisJVGFi bGVTY2FuRGVzYwlzY2FuOwogCWRvdWJsZQkJcmVsdHVwbGVzOwogCUluZGV4SW5mbyAgKmlu ZGV4SW5mbzsKIAljaGFyCQluYW1lW01BWFBHUEFUSF07CkBAIC0yNDY4LDY4ICsyNDk0LDE2 IEBAIF9icmluX3BhcmFsbGVsX3NjYW5fYW5kX2J1aWxkKEJyaW5CdWlsZFN0YXRlICpzdGF0 ZSwgQnJpblNoYXJlZCAqYnJpbnNoYXJlZCwKIAogCXN0YXRlLT5ic19maWxlID0gQnVmRmls ZUNyZWF0ZUZpbGVTZXQoJmJyaW5zaGFyZWQtPmZpbGVzZXQuZnMsIG5hbWUpOwogCi0JLyog R2V0IGNodW5rcyBvZiB0aGUgdGFibGUsIGRvIFRJRCBTY2FucyBhbmQgYnVpbGQgdGhlIHJh bmdlcyAqLwotCXdoaWxlICh0cnVlKQotCXsKLQkJVGFibGVTY2FuRGVzYwlzY2FuOwotCQlC bG9ja051bWJlcgkJc3RhcnRCbG9jaywKLQkJCQkJCWxhc3RCbG9jaywKLQkJCQkJCWNodW5r QmxvY2tzOwotCQlJdGVtUG9pbnRlckRhdGEJbWludGlkLAotCQkJCQkJbWF4dGlkOworCXNj YW4gPSB0YWJsZV9iZWdpbnNjYW5fcGFyYWxsZWwoaGVhcCwKKwkJCQkJCQkJCVBhcmFsbGVs VGFibGVTY2FuRnJvbUJyaW5TaGFyZWQoYnJpbnNoYXJlZCkpOwogCi0JCS8qCi0JCSAqIEFj cXVpcmUgbGFyZ2VyIGNodW5rcyBvZiBkYXRhIC0gdGhpcyBtYXR0ZXJzIGVzcGVjaWFsbHkg Zm9yIGxvdwotCQkgKiBwYWdlc19wZXJfcmFuZ2Ugc2V0dGluZ3MgKGUuZy4gc2V0IHRvIDEp LiBPdGhlcndpc2UgdGhlcmUgd291bGQKLQkJICogYmUgYSBsb3Qgb2YgdHJhc2hpbmcgYW5k IG92ZXJoZWFkIHdpdGggbXVsdGlwbGUgd29ya2Vycy4KLQkJICoKLQkJICogTm90IHN1cmUg d2hlcmUncyB0aGUgc3dlZXQgc3BvdC4gTWF5YmUgdGllIHRoaXMgdG8gdGhlIHByZWZldGNo aW5nCi0JCSAqIHRvbyAobWFpbnRlbmFuY2VfZWZmZWN0aXZlX2lvX2NvbmN1Y3JyZW5jeSk/ Ci0JCSAqCi0JCSAqIEZJWE1FIFRoZSBjaHVua0Jsb2NrcyBuZWVkcyB0byBiZSBhIG11bHRp cGxlIG9mIGJzX3BhZ2VzUGVyUmFuZ2UuCi0JCSAqLwotCQljaHVua0Jsb2NrcyA9IE1heCgx MjgsIHN0YXRlLT5ic19wYWdlc1BlclJhbmdlKTsKLQotCQlTcGluTG9ja0FjcXVpcmUoJmJy aW5zaGFyZWQtPm11dGV4KTsKLQkJc3RhcnRCbG9jayA9IGJyaW5zaGFyZWQtPm5leHRfcmFu Z2U7Ci0JCWxhc3RCbG9jayA9IGJyaW5zaGFyZWQtPmxhc3RfcmFuZ2U7Ci0JCWJyaW5zaGFy ZWQtPm5leHRfcmFuZ2UgKz0gY2h1bmtCbG9ja3M7Ci0JCVNwaW5Mb2NrUmVsZWFzZSgmYnJp bnNoYXJlZC0+bXV0ZXgpOwotCi0JCXN0YXRlLT5ic19jdXJyUmFuZ2VTdGFydCA9IHN0YXJ0 QmxvY2s7Ci0KLQkJLyogZGlkIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGhlYXAgcmVsYXRp b24/ICovCi0JCWlmIChzdGFydEJsb2NrID4gbGFzdEJsb2NrKQotCQkJYnJlYWs7Ci0KLQkJ LyogcmUtaW5pdGlhbGl6ZSBzdGF0ZSBmb3IgaXQgKi8KLQkJYnJpbl9tZW10dXBsZV9pbml0 aWFsaXplKHN0YXRlLT5ic19kdHVwbGUsIHN0YXRlLT5ic19iZGVzYyk7CisJcmVsdHVwbGVz ID0gdGFibGVfaW5kZXhfYnVpbGRfc2NhbihoZWFwLCBpbmRleCwgaW5kZXhJbmZvLCB0cnVl LCB0cnVlLAorCQkJCQkJCQkJICAgYnJpbmJ1aWxkQ2FsbGJhY2tQYXJhbGxlbCwgc3RhdGUs IHNjYW4pOwogCi0JCUl0ZW1Qb2ludGVyU2V0KCZtaW50aWQsIHN0YXJ0QmxvY2ssIDApOwot CQlJdGVtUG9pbnRlclNldCgmbWF4dGlkLCBzdGFydEJsb2NrICsgKGNodW5rQmxvY2tzIC0g MSksCi0JCQkJCSAgIE1heEhlYXBUdXBsZXNQZXJQYWdlKTsKKwkvKiBzcGlsbCB0aGUgbGFz dCB0dXBsZSAqLworCWZvcm1fYW5kX3NwaWxsX3R1cGxlKHN0YXRlKTsKIAotCQkvKiBzdGFy dCB0aWRzY2FuIHRvIHJlYWQgdGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIHRhYmxlICovCi0J CXNjYW4gPSB0YWJsZV9iZWdpbnNjYW5fdGlkcmFuZ2UoaGVhcCwgU25hcHNob3RBbnksCS8v IEZJWE1FIHdoaWNoIHNuYXBzaG90IHRvIHVzZT8KLQkJCQkJCQkJCQkmbWludGlkLCAmbWF4 dGlkKTsKLQotI2lmZGVmIFVTRV9QUkVGRVRDSAotCQkvKiBkbyBwcmVmZXRjaGluZyAodGhp cyBwcmVmZXRjaGVzIHRoZSB3aG9sZSByYW5nZS4gbm90IHN1cmUgdGhhdCdzIGdvb2QpICov Ci0JCWZvciAoQmxvY2tOdW1iZXIgYmxrbm8gPSBzdGFydEJsb2NrOyBibGtubyA8IHN0YXJ0 QmxvY2sgKyBjaHVua0Jsb2NrczsgYmxrbm8rKykKLQkJCVByZWZldGNoQnVmZmVyKHNjYW4t PnJzX3JkLCBNQUlOX0ZPUktOVU0sIGJsa25vKTsKLSNlbmRpZgotCi0JCXJlbHR1cGxlcyA9 IHRhYmxlX2luZGV4X2J1aWxkX3NjYW4oaGVhcCwgaW5kZXgsIGluZGV4SW5mbywgdHJ1ZSwg dHJ1ZSwKLQkJCQkJCQkJCQkgICBicmluYnVpbGRDYWxsYmFja1BhcmFsbGVsLCBzdGF0ZSwg c2Nhbik7Ci0KLQkJLyogc3BpbGwgdGhlIGxhc3QgdHVwbGUgKi8KLQkJZm9ybV9hbmRfc3Bp bGxfdHVwbGUoc3RhdGUpOwotCi0JCXN0YXRlLT5ic19yZWx0dXBsZXMgKz0gcmVsdHVwbGVz OwotCi0JCS8qIHNldCBzdGF0ZSB0byBpbnZhbGlkIHJhbmdlICovCi0JCXN0YXRlLT5ic19j dXJyUmFuZ2VTdGFydCA9IEludmFsaWRCbG9ja051bWJlcjsKLQl9CisJc3RhdGUtPmJzX3Jl bHR1cGxlcyArPSByZWx0dXBsZXM7CiAKIAkvKgogCSAqIERvbmUuICBSZWNvcmQgYW1idWls ZCBzdGF0aXN0aWNzLgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9u YnRzb3J0LmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHNvcnQuYwppbmRleCA2 YWQzZjNjNTRkNS4uNjllYzlkNWZlOWMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vz cy9uYnRyZWUvbmJ0c29ydC5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0 c29ydC5jCkBAIC0xNTc1LDcgKzE1NzUsNyBAQCBfYnRfYmVnaW5fcGFyYWxsZWwoQlRCdWls ZFN0YXRlICpidWlsZHN0YXRlLCBib29sIGlzY29uY3VycmVudCwgaW50IHJlcXVlc3QpCiAJ YnRzaGFyZWQtPmJyb2tlbmhvdGNoYWluID0gZmFsc2U7CiAJdGFibGVfcGFyYWxsZWxzY2Fu X2luaXRpYWxpemUoYnRzcG9vbC0+aGVhcCwKIAkJCQkJCQkJICBQYXJhbGxlbFRhYmxlU2Nh bkZyb21CVFNoYXJlZChidHNoYXJlZCksCi0JCQkJCQkJCSAgc25hcHNob3QpOworCQkJCQkJ CQkgIHNuYXBzaG90LCBJbnZhbGlkQmxvY2tOdW1iZXIpOwogCiAJLyoKIAkgKiBTdG9yZSBz aGFyZWQgdHVwbGVzb3J0LXByaXZhdGUgc3RhdGUsIGZvciB3aGljaCB3ZSByZXNlcnZlZCBz cGFjZS4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90YWJsZS90YWJsZWFtLmMg Yi9zcmMvYmFja2VuZC9hY2Nlc3MvdGFibGUvdGFibGVhbS5jCmluZGV4IDc3MTQzOGM4Y2Vj Li44MzRjYzljZDdjNiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RhYmxlL3Rh YmxlYW0uYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdGFibGUvdGFibGVhbS5jCkBAIC0x NTMsOSArMTUzLDkgQEAgdGFibGVfcGFyYWxsZWxzY2FuX2VzdGltYXRlKFJlbGF0aW9uIHJl bCwgU25hcHNob3Qgc25hcHNob3QpCiAKIHZvaWQKIHRhYmxlX3BhcmFsbGVsc2Nhbl9pbml0 aWFsaXplKFJlbGF0aW9uIHJlbCwgUGFyYWxsZWxUYWJsZVNjYW5EZXNjIHBzY2FuLAotCQkJ CQkJCSAgU25hcHNob3Qgc25hcHNob3QpCisJCQkJCQkJICBTbmFwc2hvdCBzbmFwc2hvdCwg QmxvY2tOdW1iZXIgY2h1bmtfZmFjdG9yKQogewotCVNpemUJCXNuYXBzaG90X29mZiA9IHJl bC0+cmRfdGFibGVhbS0+cGFyYWxsZWxzY2FuX2luaXRpYWxpemUocmVsLCBwc2Nhbik7CisJ U2l6ZQkJc25hcHNob3Rfb2ZmID0gcmVsLT5yZF90YWJsZWFtLT5wYXJhbGxlbHNjYW5faW5p dGlhbGl6ZShyZWwsIHBzY2FuLCBjaHVua19mYWN0b3IpOwogCiAJcHNjYW4tPnBoc19zbmFw c2hvdF9vZmYgPSBzbmFwc2hvdF9vZmY7CiAKQEAgLTM5NSwxNiArMzk1LDIxIEBAIHRhYmxl X2Jsb2NrX3BhcmFsbGVsc2Nhbl9lc3RpbWF0ZShSZWxhdGlvbiByZWwpCiB9CiAKIFNpemUK LXRhYmxlX2Jsb2NrX3BhcmFsbGVsc2Nhbl9pbml0aWFsaXplKFJlbGF0aW9uIHJlbCwgUGFy YWxsZWxUYWJsZVNjYW5EZXNjIHBzY2FuKQordGFibGVfYmxvY2tfcGFyYWxsZWxzY2FuX2lu aXRpYWxpemUoUmVsYXRpb24gcmVsLCBQYXJhbGxlbFRhYmxlU2NhbkRlc2MgcHNjYW4sIEJs b2NrTnVtYmVyIGNodW5rX2ZhY3RvcikKIHsKIAlQYXJhbGxlbEJsb2NrVGFibGVTY2FuRGVz YyBicHNjYW4gPSAoUGFyYWxsZWxCbG9ja1RhYmxlU2NhbkRlc2MpIHBzY2FuOwogCiAJYnBz Y2FuLT5iYXNlLnBoc19yZWxpZCA9IFJlbGF0aW9uR2V0UmVsaWQocmVsKTsKIAlicHNjYW4t PnBoc19uYmxvY2tzID0gUmVsYXRpb25HZXROdW1iZXJPZkJsb2NrcyhyZWwpOwotCS8qIGNv bXBhcmUgcGhzX3N5bmNzY2FuIGluaXRpYWxpemF0aW9uIHRvIHNpbWlsYXIgbG9naWMgaW4g aW5pdHNjYW4gKi8KKwlicHNjYW4tPnBoc19jaHVua19mYWN0b3IgPSBjaHVua19mYWN0b3I7 CisJLyogY29tcGFyZSBwaHNfc3luY3NjYW4gaW5pdGlhbGl6YXRpb24gdG8gc2ltaWxhciBs b2dpYyBpbiBpbml0c2NhbgorCSAqCisJICogRGlzYWJsZSBzeW5jIHNjYW5zIGlmIHRoZSBj aHVuayBmYWN0b3IgaXMgc2V0ICh2YWxpZCBibG9jayBudW1iZXIpLgorCSAqLwogCWJwc2Nh bi0+YmFzZS5waHNfc3luY3NjYW4gPSBzeW5jaHJvbml6ZV9zZXFzY2FucyAmJgogCQkhUmVs YXRpb25Vc2VzTG9jYWxCdWZmZXJzKHJlbCkgJiYKLQkJYnBzY2FuLT5waHNfbmJsb2NrcyA+ IE5CdWZmZXJzIC8gNDsKKwkJKGJwc2Nhbi0+cGhzX25ibG9ja3MgPiBOQnVmZmVycyAvIDQp ICYmCisJCSFCbG9ja051bWJlcklzVmFsaWQoYnBzY2FuLT5waHNfY2h1bmtfZmFjdG9yKTsK IAlTcGluTG9ja0luaXQoJmJwc2Nhbi0+cGhzX211dGV4KTsKIAlicHNjYW4tPnBoc19zdGFy dGJsb2NrID0gSW52YWxpZEJsb2NrTnVtYmVyOwogCXBnX2F0b21pY19pbml0X3U2NCgmYnBz Y2FuLT5waHNfbmFsbG9jYXRlZCwgMCk7CkBAIC00NTksNiArNDY0LDE3IEBAIHRhYmxlX2Js b2NrX3BhcmFsbGVsc2Nhbl9zdGFydGJsb2NrX2luaXQoUmVsYXRpb24gcmVsLAogCXBic2Nh bndvcmstPnBoc3dfY2h1bmtfc2l6ZSA9IE1pbihwYnNjYW53b3JrLT5waHN3X2NodW5rX3Np emUsCiAJCQkJCQkJCQkgIFBBUkFMTEVMX1NFUVNDQU5fTUFYX0NIVU5LX1NJWkUpOwogCisJ LyoKKwkgKiBJZiB0aGUgY2h1bmsgc2l6ZSBmYWN0b3IgaXMgc2V0LCB3ZSBuZWVkIHRvIG1h a2Ugc3VyZSB0aGUgY2h1bmsgc2l6ZSBpcworCSAqIGEgbXVsdGlwbGUgb2YgdGhhdCB2YWx1 ZS4KKwkgKi8KKwlpZiAocGJzY2FuLT5waHNfY2h1bmtfZmFjdG9yICE9IEludmFsaWRCbG9j a051bWJlcikKKwl7CisJCWludAkJbmNodW5rcyA9IChwYnNjYW53b3JrLT5waHN3X2NodW5r X3NpemUgLyBwYnNjYW4tPnBoc19jaHVua19mYWN0b3IpOworCisJCXBic2NhbndvcmstPnBo c3dfY2h1bmtfc2l6ZSA9IE1heCgxLCBuY2h1bmtzKSAqIHBic2Nhbi0+cGhzX2NodW5rX2Zh Y3RvcjsKKwl9CisKIHJldHJ5OgogCS8qIEdyYWIgdGhlIHNwaW5sb2NrLiAqLwogCVNwaW5M b2NrQWNxdWlyZSgmcGJzY2FuLT5waHNfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvZXhlY3V0b3Ivbm9kZVNlcXNjYW4uYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVT ZXFzY2FuLmMKaW5kZXggNGRhMGYyOGY3YmEuLmUwMTdmMDVmNzgwIDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9leGVjdXRvci9ub2RlU2Vxc2Nhbi5jCisrKyBiL3NyYy9iYWNrZW5kL2V4 ZWN1dG9yL25vZGVTZXFzY2FuLmMKQEAgLTI3NCw3ICsyNzQsOCBAQCBFeGVjU2VxU2Nhbklu aXRpYWxpemVEU00oU2VxU2NhblN0YXRlICpub2RlLAogCXBzY2FuID0gc2htX3RvY19hbGxv Y2F0ZShwY3h0LT50b2MsIG5vZGUtPnBzY2FuX2xlbik7CiAJdGFibGVfcGFyYWxsZWxzY2Fu X2luaXRpYWxpemUobm9kZS0+c3Muc3NfY3VycmVudFJlbGF0aW9uLAogCQkJCQkJCQkgIHBz Y2FuLAotCQkJCQkJCQkgIGVzdGF0ZS0+ZXNfc25hcHNob3QpOworCQkJCQkJCQkgIGVzdGF0 ZS0+ZXNfc25hcHNob3QsCisJCQkJCQkJCSAgSW52YWxpZEJsb2NrTnVtYmVyKTsKIAlzaG1f dG9jX2luc2VydChwY3h0LT50b2MsIG5vZGUtPnNzLnBzLnBsYW4tPnBsYW5fbm9kZV9pZCwg cHNjYW4pOwogCW5vZGUtPnNzLnNzX2N1cnJlbnRTY2FuRGVzYyA9CiAJCXRhYmxlX2JlZ2lu c2Nhbl9wYXJhbGxlbChub2RlLT5zcy5zc19jdXJyZW50UmVsYXRpb24sIHBzY2FuKTsKZGlm ZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9yZWxzY2FuLmggYi9zcmMvaW5jbHVkZS9h Y2Nlc3MvcmVsc2Nhbi5oCmluZGV4IGQwMzM2MGVhYzA0Li43MmEyMGQ4ODJmNSAxMDA2NDQK LS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNjYW4uaAorKysgYi9zcmMvaW5jbHVkZS9h Y2Nlc3MvcmVsc2Nhbi5oCkBAIC03OSw2ICs3OSw3IEBAIHR5cGVkZWYgc3RydWN0IFBhcmFs bGVsQmxvY2tUYWJsZVNjYW5EZXNjRGF0YQogCUJsb2NrTnVtYmVyIHBoc19uYmxvY2tzOwkv KiAjIGJsb2NrcyBpbiByZWxhdGlvbiBhdCBzdGFydCBvZiBzY2FuICovCiAJc2xvY2tfdAkJ cGhzX211dGV4OwkJLyogbXV0dWFsIGV4Y2x1c2lvbiBmb3Igc2V0dGluZyBzdGFydGJsb2Nr ICovCiAJQmxvY2tOdW1iZXIgcGhzX3N0YXJ0YmxvY2s7IC8qIHN0YXJ0aW5nIGJsb2NrIG51 bWJlciAqLworCUJsb2NrTnVtYmVyIHBoc19jaHVua19mYWN0b3I7IC8qIGNodW5rcyBuZWVk IHRvIGJlIGEgbXVsdGlwbGUgb2YgdGhpcyAqLwogCXBnX2F0b21pY191aW50NjQgcGhzX25h bGxvY2F0ZWQ7CS8qIG51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkIHRvCiAJCQkJCQkJCQkJ ICogd29ya2VycyBzbyBmYXIuICovCiB9CQkJUGFyYWxsZWxCbG9ja1RhYmxlU2NhbkRlc2NE YXRhOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL3RhYmxlYW0uaCBiL3NyYy9p bmNsdWRlL2FjY2Vzcy90YWJsZWFtLmgKaW5kZXggMjMwYmMzOWNjMGUuLjgyMjk3NTQ2ZTI3 IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9hY2Nlc3MvdGFibGVhbS5oCisrKyBiL3NyYy9p bmNsdWRlL2FjY2Vzcy90YWJsZWFtLmgKQEAgLTM5MCw3ICszOTAsOCBAQCB0eXBlZGVmIHN0 cnVjdCBUYWJsZUFtUm91dGluZQogCSAqIHJlbGF0aW9uLgogCSAqLwogCVNpemUJCSgqcGFy YWxsZWxzY2FuX2luaXRpYWxpemUpIChSZWxhdGlvbiByZWwsCi0JCQkJCQkJCQkJCVBhcmFs bGVsVGFibGVTY2FuRGVzYyBwc2Nhbik7CisJCQkJCQkJCQkJCVBhcmFsbGVsVGFibGVTY2Fu RGVzYyBwc2NhbiwKKwkJCQkJCQkJCQkJQmxvY2tOdW1iZXIgY2h1bmtfZmFjdG9yKTsKIAog CS8qCiAJICogUmVpbml0aWFsaXplIGBwc2NhbmAgZm9yIGEgbmV3IHNjYW4uIGByZWxgIHdp bGwgYmUgdGhlIHNhbWUgcmVsYXRpb24gYXMKQEAgLTExNDgsNyArMTE0OSw4IEBAIGV4dGVy biBTaXplIHRhYmxlX3BhcmFsbGVsc2Nhbl9lc3RpbWF0ZShSZWxhdGlvbiByZWwsIFNuYXBz aG90IHNuYXBzaG90KTsKICAqLwogZXh0ZXJuIHZvaWQgdGFibGVfcGFyYWxsZWxzY2FuX2lu aXRpYWxpemUoUmVsYXRpb24gcmVsLAogCQkJCQkJCQkJCSAgUGFyYWxsZWxUYWJsZVNjYW5E ZXNjIHBzY2FuLAotCQkJCQkJCQkJCSAgU25hcHNob3Qgc25hcHNob3QpOworCQkJCQkJCQkJ CSAgU25hcHNob3Qgc25hcHNob3QsCisJCQkJCQkJCQkJICBCbG9ja051bWJlciBjaHVua19m YWN0b3IpOwogCiAvKgogICogQmVnaW4gYSBwYXJhbGxlbCBzY2FuLiBgcHNjYW5gIG5lZWRz IHRvIGhhdmUgYmVlbiBpbml0aWFsaXplZCB3aXRoCkBAIC0yMDY0LDcgKzIwNjYsOCBAQCBl eHRlcm4gdm9pZCBzaW1wbGVfdGFibGVfdHVwbGVfdXBkYXRlKFJlbGF0aW9uIHJlbCwgSXRl bVBvaW50ZXIgb3RpZCwKIAogZXh0ZXJuIFNpemUgdGFibGVfYmxvY2tfcGFyYWxsZWxzY2Fu X2VzdGltYXRlKFJlbGF0aW9uIHJlbCk7CiBleHRlcm4gU2l6ZSB0YWJsZV9ibG9ja19wYXJh bGxlbHNjYW5faW5pdGlhbGl6ZShSZWxhdGlvbiByZWwsCi0JCQkJCQkJCQkJCQlQYXJhbGxl bFRhYmxlU2NhbkRlc2MgcHNjYW4pOworCQkJCQkJCQkJCQkJUGFyYWxsZWxUYWJsZVNjYW5E ZXNjIHBzY2FuLAorCQkJCQkJCQkJCQkJQmxvY2tOdW1iZXIgY2h1bmtfZmFjdG9yKTsKIGV4 dGVybiB2b2lkIHRhYmxlX2Jsb2NrX3BhcmFsbGVsc2Nhbl9yZWluaXRpYWxpemUoUmVsYXRp b24gcmVsLAogCQkJCQkJCQkJCQkJICBQYXJhbGxlbFRhYmxlU2NhbkRlc2MgcHNjYW4pOwog ZXh0ZXJuIEJsb2NrTnVtYmVyIHRhYmxlX2Jsb2NrX3BhcmFsbGVsc2Nhbl9uZXh0cGFnZShS ZWxhdGlvbiByZWwsCi0tIAoyLjQwLjEKCg== --------------mZQ0QE79c49k9nkGX6scHErz--