From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756868AbXGaKPU (ORCPT ); Tue, 31 Jul 2007 06:15:20 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754466AbXGaKPD (ORCPT ); Tue, 31 Jul 2007 06:15:03 -0400 Received: from nf-out-0910.google.com ([64.233.182.187]:46519 "EHLO nf-out-0910.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754031AbXGaKO6 (ORCPT ); Tue, 31 Jul 2007 06:14:58 -0400 DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlemail.com; s=beta; h=received:message-id:date:from:to:subject:mime-version:content-type; b=CH4/MyLZUmIxTyZQZQUvx5zVxEnDEIjWAFcD3eWFPaFtIZ+VOMYx4aRCy/mrZqQDKki9WFBKljee1iI2wrTu7x4kTyXfDXewkYvsh1/YddvMGiZVzlDeIkoMQzguDE1b1J6rudbIZYgxgvhJitIeW932iKcwFDuU2We5H9zXers= Message-ID: <1158166a0707310314p647bd5c3m58e7e8f46c54a5b5@mail.gmail.com> Date: Tue, 31 Jul 2007 11:14:52 +0100 From: "Denis Vlasenko" To: "Andrew Morton" , linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org, arjan@infradead.org, hare@suse.de, gibbs@scsiguy.com Subject: [PATCH] debloat aic7xxx and aic79xx drivers by deinlining MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_39676_15670452.1185876892413" Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org ------=_Part_39676_15670452.1185876892413 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi, [now with patch attached. sorry] Attached patch deinlines and moves big functions from .h to .c files in drivers/scsi/aic7xxx/*. I also had to add prototypes for ahc_lookup_scb and ahd_lookup_scb to .h files. No other code changes made. Compile-tested on i386 and x86-64. Total .text size reduction: ~60k in 64 bits, ~90k in 32 bits. Per-object-file and whole-module size difference: for x86-64: text data bss dec hex filename 261433 50018 1172 312623 4c52f org/built-in.o 199622 50018 1172 250812 3d3bc aic/built-in.o 11680 7168 0 18848 49a0 org/aic7xxx_reg_print.o 11680 7168 0 18848 49a0 aic/aic7xxx_reg_print.o 3065 0 0 3065 bf9 org/aic7xxx_proc.o 2849 0 0 2849 b21 aic/aic7xxx_proc.o 16037 1984 0 18021 4665 org/aic7xxx_pci.o 12896 1984 0 14880 3a20 aic/aic7xxx_pci.o 1977 4768 0 6745 1a59 aic/aic7xxx_osm_pci.o 1704 4768 0 6472 1948 org/aic7xxx_osm_pci.o 15033 865 564 16462 404e org/aic7xxx_osm.o 13752 865 564 15181 3b4d aic/aic7xxx_osm.o 53228 7424 0 60652 ecec org/aic7xxx_core.o 42925 7424 0 50349 c4ad aic/aic7xxx_core.o 3193 72 0 3265 cc1 org/aic7xxx_93cx6.o 1778 72 0 1850 73a aic/aic7xxx_93cx6.o 103971 22321 564 126856 1ef88 org/aic7xxx.o 87888 22321 564 110773 1b0b5 aic/aic7xxx.o 25743 14016 0 39759 9b4f org/aic79xx_reg_print.o 25743 14016 0 39759 9b4f aic/aic79xx_reg_print.o 3312 0 0 3312 cf0 org/aic79xx_proc.o 2764 0 0 2764 acc aic/aic79xx_proc.o 9420 544 24 9988 2704 org/aic79xx_pci.o 6539 544 24 7107 1bc3 aic/aic79xx_pci.o 1805 6336 0 8141 1fcd org/aic79xx_osm_pci.o 1791 6336 0 8127 1fbf aic/aic79xx_osm_pci.o 18982 1189 564 20735 50ff org/aic79xx_osm.o 17287 1189 564 19040 4a60 aic/aic79xx_osm.o 98160 5600 0 103760 19550 org/aic79xx_core.o 57572 5600 0 63172 f6c4 aic/aic79xx_core.o 157435 27697 596 185728 2d580 org/aic79xx.o 111708 27697 596 140001 222e1 aic/aic79xx.o and for i386: text data bss dec hex filename 280361 32633 1112 314106 4cafa org/built-in.o 190406 32633 1112 224151 36b97 aic/built-in.o 11697 3336 0 15033 3ab9 org/aic7xxx_reg_print.o 11697 3336 0 15033 3ab9 aic/aic7xxx_reg_print.o 2970 0 0 2970 b9a org/aic7xxx_proc.o 2698 0 0 2698 a8a aic/aic7xxx_proc.o 16700 1488 0 18188 470c org/aic7xxx_pci.o 11984 1488 0 13472 34a0 aic/aic7xxx_pci.o 1857 4044 0 5901 170d aic/aic7xxx_osm_pci.o 1575 4044 0 5619 15f3 org/aic7xxx_osm_pci.o 14876 561 548 15985 3e71 org/aic7xxx_osm.o 12849 561 548 13958 3686 aic/aic7xxx_osm.o 58959 5512 0 64471 fbd7 org/aic7xxx_core.o 40907 5512 0 46419 b553 aic/aic7xxx_core.o 3851 72 0 3923 f53 org/aic7xxx_93cx6.o 1618 72 0 1690 69a aic/aic7xxx_93cx6.o 110645 15013 548 126206 1ecfe org/aic7xxx.o 83619 15013 548 99180 1836c aic/aic7xxx.o 25762 6496 0 32258 7e02 org/aic79xx_reg_print.o 25762 6496 0 32258 7e02 aic/aic79xx_reg_print.o 3258 0 0 3258 cba org/aic79xx_proc.o 2619 0 0 2619 a3b aic/aic79xx_proc.o 10082 408 12 10502 2906 org/aic79xx_pci.o 6145 408 12 6565 19a5 aic/aic79xx_pci.o 1716 5416 0 7132 1bdc org/aic79xx_osm_pci.o 1704 5416 0 7120 1bd0 aic/aic79xx_osm_pci.o 18499 865 552 19916 4dcc org/aic79xx_osm.o 16232 865 552 17649 44f1 aic/aic79xx_osm.o 110391 4432 0 114823 1c087 org/aic79xx_core.o 54314 4432 0 58746 e57a aic/aic79xx_core.o 169715 17617 564 187896 2ddf8 org/aic79xx.o 106784 17617 564 124965 1e825 aic/aic79xx.o Please apply. Signed-off-by: Denys Vlasenko -- vda ------=_Part_39676_15670452.1185876892413 Content-Type: text/x-patch; name=linux-2.6.23-rc1.aic.diff; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_f4s8g5yg Content-Disposition: attachment; filename="linux-2.6.23-rc1.aic.diff" LS0tIGxpbnV4LTIuNi4yMy1yYzEub3JnL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfY29y ZS5jCU1vbiBKdWwgIDkgMDA6MzI6MTcgMjAwNworKysgbGludXgtMi42LjIzLXJjMS5haWMvZHJp dmVycy9zY3NpL2FpYzd4eHgvYWljNzl4eF9jb3JlLmMJVHVlIEp1bCAzMSAwMTo0MToxMyAyMDA3 CkBAIC0yNjYsOCArMjY2LDc1MiBAQAogCQkJCSAgICAgIGludCB0YXJnZXQsIGNoYXIgY2hhbm5l bCwgaW50IGx1biwKIAkJCQkgICAgICB1X2ludCB0YWcsIHJvbGVfdCByb2xlKTsKIAotLyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqIFByaXZhdGUgSW5saW5lcyAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKiogU2VxdWVuY2VyIEV4 ZWN1dGlvbiBDb250cm9sICoqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCithaGRfc2V0 X21vZGVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgYWhkX21vZGUgc3JjLCBhaGRfbW9kZSBkc3Qp Cit7CisJaWYgKGFoZC0+c3JjX21vZGUgPT0gc3JjICYmIGFoZC0+ZHN0X21vZGUgPT0gZHN0KQor CQlyZXR1cm47CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKGFoZC0+c3JjX21vZGUgPT0gQUhEX01P REVfVU5LTk9XTgorCSB8fCBhaGQtPmRzdF9tb2RlID09IEFIRF9NT0RFX1VOS05PV04pCisJCXBh bmljKCJTZXR0aW5nIG1vZGUgcHJpb3IgdG8gc2F2aW5nIGl0LlxuIik7CisJaWYgKChhaGRfZGVi dWcgJiBBSERfU0hPV19NT0RFUFRSKSAhPSAwKQorCQlwcmludGYoIiVzOiBTZXR0aW5nIG1vZGUg MHgleFxuIiwgYWhkX25hbWUoYWhkKSwKKwkJICAgICAgIGFoZF9idWlsZF9tb2RlX3N0YXRlKGFo ZCwgc3JjLCBkc3QpKTsKKyNlbmRpZgorCWFoZF9vdXRiKGFoZCwgTU9ERV9QVFIsIGFoZF9idWls ZF9tb2RlX3N0YXRlKGFoZCwgc3JjLCBkc3QpKTsKKwlhaGQtPnNyY19tb2RlID0gc3JjOworCWFo ZC0+ZHN0X21vZGUgPSBkc3Q7Cit9CiAKK3ZvaWQKK2FoZF91cGRhdGVfbW9kZXMoc3RydWN0IGFo ZF9zb2Z0YyAqYWhkKQoreworCWFoZF9tb2RlX3N0YXRlIG1vZGVfcHRyOworCWFoZF9tb2RlIHNy YzsKKwlhaGRfbW9kZSBkc3Q7CisKKwltb2RlX3B0ciA9IGFoZF9pbmIoYWhkLCBNT0RFX1BUUik7 CisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19NT0RFUFRSKSAh PSAwKQorCQlwcmludGYoIlJlYWRpbmcgbW9kZSAweCV4XG4iLCBtb2RlX3B0cik7CisjZW5kaWYK KwlhaGRfZXh0cmFjdF9tb2RlX3N0YXRlKGFoZCwgbW9kZV9wdHIsICZzcmMsICZkc3QpOworCWFo ZF9rbm93bl9tb2RlcyhhaGQsIHNyYywgZHN0KTsKK30KKwordm9pZAorYWhkX2Fzc2VydF9tb2Rl cyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGFoZF9tb2RlIHNyY21vZGUsCisJCSBhaGRfbW9kZSBk c3Rtb2RlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKyNpZmRlZiBBSERfREVCVUcK KwlpZiAoKHNyY21vZGUgJiBBSERfTUtfTVNLKGFoZC0+c3JjX21vZGUpKSA9PSAwCisJIHx8IChk c3Rtb2RlICYgQUhEX01LX01TSyhhaGQtPmRzdF9tb2RlKSkgPT0gMCkgeworCQlwYW5pYygiJXM6 JXM6JWQ6IE1vZGUgYXNzZXJ0aW9uIGZhaWxlZC5cbiIsCisJCSAgICAgICBhaGRfbmFtZShhaGQp LCBmaWxlLCBsaW5lKTsKKwl9CisjZW5kaWYKK30KKworI2RlZmluZSBBSERfQVNTRVJUX01PREVT KGFoZCwgc291cmNlLCBkZXN0KSBcCisJYWhkX2Fzc2VydF9tb2RlcyhhaGQsIHNvdXJjZSwgZGVz dCwgX19GSUxFX18sIF9fTElORV9fKTsKKworYWhkX21vZGVfc3RhdGUKK2FoZF9zYXZlX21vZGVz KHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlpZiAoYWhkLT5zcmNfbW9kZSA9PSBBSERfTU9E RV9VTktOT1dOCisJIHx8IGFoZC0+ZHN0X21vZGUgPT0gQUhEX01PREVfVU5LTk9XTikKKwkJYWhk X3VwZGF0ZV9tb2RlcyhhaGQpOworCisJcmV0dXJuIChhaGRfYnVpbGRfbW9kZV9zdGF0ZShhaGQs IGFoZC0+c3JjX21vZGUsIGFoZC0+ZHN0X21vZGUpKTsKK30KKwordm9pZAorYWhkX3Jlc3RvcmVf bW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBhaGRfbW9kZV9zdGF0ZSBzdGF0ZSkKK3sKKwlh aGRfbW9kZSBzcmM7CisJYWhkX21vZGUgZHN0OworCisJYWhkX2V4dHJhY3RfbW9kZV9zdGF0ZShh aGQsIHN0YXRlLCAmc3JjLCAmZHN0KTsKKwlhaGRfc2V0X21vZGVzKGFoZCwgc3JjLCBkc3QpOwor fQorCisvKgorICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlcXVlbmNlciBoYXMgaGFsdGVkIGNv ZGUgZXhlY3V0aW9uLgorICogUmV0dXJucyBub24temVybyBzdGF0dXMgaWYgdGhlIHNlcXVlbmNl ciBpcyBzdG9wcGVkLgorICovCitpbnQKK2FoZF9pc19wYXVzZWQoc3RydWN0IGFoZF9zb2Z0YyAq YWhkKQoreworCXJldHVybiAoKGFoZF9pbmIoYWhkLCBIQ05UUkwpICYgUEFVU0UpICE9IDApOwor fQorCisvKgorICogUmVxdWVzdCB0aGF0IHRoZSBzZXF1ZW5jZXIgc3RvcCBhbmQgd2FpdCwgaW5k ZWZpbml0ZWx5LCBmb3IgaXQKKyAqIHRvIHN0b3AuICBUaGUgc2VxdWVuY2VyIHdpbGwgb25seSBh Y2tub3dsZWRnZSB0aGF0IGl0IGlzIHBhdXNlZAorICogb25jZSBpdCBoYXMgcmVhY2hlZCBhbiBp bnN0cnVjdGlvbiBib3VuZGFyeSBhbmQgUEFVU0VESVMgaXMKKyAqIGNsZWFyZWQgaW4gdGhlIFNF UUNUTCByZWdpc3Rlci4gIFRoZSBzZXF1ZW5jZXIgbWF5IHVzZSBQQVVTRURJUworICogZm9yIGNy aXRpY2FsIHNlY3Rpb25zLgorICovCit2b2lkCithaGRfcGF1c2Uoc3RydWN0IGFoZF9zb2Z0YyAq YWhkKQoreworCWFoZF9vdXRiKGFoZCwgSENOVFJMLCBhaGQtPnBhdXNlKTsKKworCS8qCisJICog U2luY2UgdGhlIHNlcXVlbmNlciBjYW4gZGlzYWJsZSBwYXVzaW5nIGluIGEgY3JpdGljYWwgc2Vj dGlvbiwgd2UKKwkgKiBtdXN0IGxvb3AgdW50aWwgaXQgYWN0dWFsbHkgc3RvcHMuCisJICovCisJ d2hpbGUgKGFoZF9pc19wYXVzZWQoYWhkKSA9PSAwKQorCQk7Cit9CisKKy8qCisgKiBBbGxvdyB0 aGUgc2VxdWVuY2VyIHRvIGNvbnRpbnVlIHByb2dyYW0gZXhlY3V0aW9uLgorICogV2UgY2hlY2sg aGVyZSB0byBlbnN1cmUgdGhhdCBubyBhZGRpdGlvbmFsIGludGVycnVwdAorICogc291cmNlcyB0 aGF0IHdvdWxkIGNhdXNlIHRoZSBzZXF1ZW5jZXIgdG8gaGFsdCBoYXZlIGJlZW4KKyAqIGFzc2Vy dGVkLiAgSWYsIGZvciBleGFtcGxlLCBhIFNDU0kgYnVzIHJlc2V0IGlzIGRldGVjdGVkCisgKiB3 aGlsZSB3ZSBhcmUgZmllbGRpbmcgYSBkaWZmZXJlbnQsIHBhdXNpbmcsIGludGVycnVwdCB0eXBl LAorICogd2UgZG9uJ3Qgd2FudCB0byByZWxlYXNlIHRoZSBzZXF1ZW5jZXIgYmVmb3JlIGdvaW5n IGJhY2sKKyAqIGludG8gb3VyIGludGVycnVwdCBoYW5kbGVyIGFuZCBkZWFsaW5nIHdpdGggdGhp cyBuZXcKKyAqIGNvbmRpdGlvbi4KKyAqLwordm9pZAorYWhkX3VucGF1c2Uoc3RydWN0IGFoZF9z b2Z0YyAqYWhkKQoreworCS8qCisJICogQXV0b21hdGljYWxseSByZXN0b3JlIG91ciBtb2RlcyB0 byB0aG9zZSBzYXZlZAorCSAqIHByaW9yIHRvIHRoZSBmaXJzdCBjaGFuZ2Ugb2YgdGhlIG1vZGUu CisJICovCisJaWYgKGFoZC0+c2F2ZWRfc3JjX21vZGUgIT0gQUhEX01PREVfVU5LTk9XTgorCSAm JiBhaGQtPnNhdmVkX2RzdF9tb2RlICE9IEFIRF9NT0RFX1VOS05PV04pIHsKKwkJaWYgKChhaGQt PmZsYWdzICYgQUhEX1VQREFURV9QRU5EX0NNRFMpICE9IDApCisJCQlhaGRfcmVzZXRfY21kc19w ZW5kaW5nKGFoZCk7CisJCWFoZF9zZXRfbW9kZXMoYWhkLCBhaGQtPnNhdmVkX3NyY19tb2RlLCBh aGQtPnNhdmVkX2RzdF9tb2RlKTsKKwl9CisKKwlpZiAoKGFoZF9pbmIoYWhkLCBJTlRTVEFUKSAm IH5DTURDTVBMVCkgPT0gMCkKKwkJYWhkX291dGIoYWhkLCBIQ05UUkwsIGFoZC0+dW5wYXVzZSk7 CisKKwlhaGRfa25vd25fbW9kZXMoYWhkLCBBSERfTU9ERV9VTktOT1dOLCBBSERfTU9ERV9VTktO T1dOKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqIFNjYXR0ZXIgR2F0aGVyIExpc3Qg SGFuZGxpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgKgorYWhkX3NnX3NldHVw KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiLAorCSAgICAgdm9pZCAqc2dw dHIsIGRtYV9hZGRyX3QgYWRkciwgYnVzX3NpemVfdCBsZW4sIGludCBsYXN0KQoreworCXNjYi0+ c2dfY291bnQrKzsKKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gNAorCSAmJiAoYWhkLT5mbGFn cyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKSB7CisJCXN0cnVjdCBhaGRfZG1hNjRfc2Vn ICpzZzsKKworCQlzZyA9IChzdHJ1Y3QgYWhkX2RtYTY0X3NlZyAqKXNncHRyOworCQlzZy0+YWRk ciA9IGFoZF9odG9sZTY0KGFkZHIpOworCQlzZy0+bGVuID0gYWhkX2h0b2xlMzIobGVuIHwgKGxh c3QgPyBBSERfRE1BX0xBU1RfU0VHIDogMCkpOworCQlyZXR1cm4gKHNnICsgMSk7CisJfSBlbHNl IHsKKwkJc3RydWN0IGFoZF9kbWFfc2VnICpzZzsKKworCQlzZyA9IChzdHJ1Y3QgYWhkX2RtYV9z ZWcgKilzZ3B0cjsKKwkJc2ctPmFkZHIgPSBhaGRfaHRvbGUzMihhZGRyICYgMHhGRkZGRkZGRik7 CisJCXNnLT5sZW4gPSBhaGRfaHRvbGUzMihsZW4gfCAoKGFkZHIgPj4gOCkgJiAweDdGMDAwMDAw KQorCQkJCSAgICB8IChsYXN0ID8gQUhEX0RNQV9MQVNUX1NFRyA6IDApKTsKKwkJcmV0dXJuIChz ZyArIDEpOworCX0KK30KKwordm9pZAorYWhkX3NldHVwX3NjYl9jb21tb24oc3RydWN0IGFoZF9z b2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJLyogWFhYIEhhbmRsZSB0YXJnZXQgbW9k ZSBTQ0JzLiAqLworCXNjYi0+Y3JjX3JldHJ5X2NvdW50ID0gMDsKKwlpZiAoKHNjYi0+ZmxhZ3Mg JiBTQ0JfUEFDS0VUSVpFRCkgIT0gMCkgeworCQkvKiBYWFggd2hhdCBhYm91dCBBQ0E/PyAgSXQg aXMgdHlwZSA0LCBidXQgVEFHX1RZUEUgPT0gMHgzLiAqLworCQlzY2ItPmhzY2ItPnRhc2tfYXR0 cmlidXRlID0gc2NiLT5oc2NiLT5jb250cm9sICYgU0NCX1RBR19UWVBFOworCX0gZWxzZSB7CisJ CWlmIChhaGRfZ2V0X3RyYW5zZmVyX2xlbmd0aChzY2IpICYgMHgwMSkKKwkJCXNjYi0+aHNjYi0+ dGFza19hdHRyaWJ1dGUgPSBTQ0JfWEZFUkxFTl9PREQ7CisJCWVsc2UKKwkJCXNjYi0+aHNjYi0+ dGFza19hdHRyaWJ1dGUgPSAwOworCX0KKworCWlmIChzY2ItPmhzY2ItPmNkYl9sZW4gPD0gTUFY X0NEQl9MRU5fV0lUSF9TRU5TRV9BRERSCisJIHx8IChzY2ItPmhzY2ItPmNkYl9sZW4gJiBTQ0Jf Q0RCX0xFTl9QVFIpICE9IDApCisJCXNjYi0+aHNjYi0+c2hhcmVkX2RhdGEuaWRhdGEuY2RiX3Bs dXNfc2FkZHIuc2Vuc2VfYWRkciA9CisJCSAgICBhaGRfaHRvbGUzMihzY2ItPnNlbnNlX2J1c2Fk ZHIpOworfQorCit2b2lkCithaGRfc2V0dXBfZGF0YV9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhk LCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJLyoKKwkgKiBDb3B5IHRoZSBmaXJzdCBTRyBpbnRvIHRo ZSAiY3VycmVudCIgZGF0YSBwb250ZXIgYXJlYS4KKwkgKi8KKwlpZiAoKGFoZC0+ZmxhZ3MgJiBB SERfNjRCSVRfQUREUkVTU0lORykgIT0gMCkgeworCQlzdHJ1Y3QgYWhkX2RtYTY0X3NlZyAqc2c7 CisKKwkJc2cgPSAoc3RydWN0IGFoZF9kbWE2NF9zZWcgKilzY2ItPnNnX2xpc3Q7CisJCXNjYi0+ aHNjYi0+ZGF0YXB0ciA9IHNnLT5hZGRyOworCQlzY2ItPmhzY2ItPmRhdGFjbnQgPSBzZy0+bGVu OworCX0gZWxzZSB7CisJCXN0cnVjdCBhaGRfZG1hX3NlZyAqc2c7CisJCXVpbnQzMl90ICpkYXRh cHRyX3dvcmRzOworCisJCXNnID0gKHN0cnVjdCBhaGRfZG1hX3NlZyAqKXNjYi0+c2dfbGlzdDsK KwkJZGF0YXB0cl93b3JkcyA9ICh1aW50MzJfdCopJnNjYi0+aHNjYi0+ZGF0YXB0cjsKKwkJZGF0 YXB0cl93b3Jkc1swXSA9IHNnLT5hZGRyOworCQlkYXRhcHRyX3dvcmRzWzFdID0gMDsKKwkJaWYg KChhaGQtPmZsYWdzICYgQUhEXzM5QklUX0FERFJFU1NJTkcpICE9IDApIHsKKwkJCXVpbnQ2NF90 IGhpZ2hfYWRkcjsKKworCQkJaGlnaF9hZGRyID0gYWhkX2xlMzJ0b2goc2ctPmxlbikgJiAweDdG MDAwMDAwOworCQkJc2NiLT5oc2NiLT5kYXRhcHRyIHw9IGFoZF9odG9sZTY0KGhpZ2hfYWRkciA8 PCA4KTsKKwkJfQorCQlzY2ItPmhzY2ItPmRhdGFjbnQgPSBzZy0+bGVuOworCX0KKwkvKgorCSAq IE5vdGUgd2hlcmUgdG8gZmluZCB0aGUgU0cgZW50cmllcyBpbiBidXMgc3BhY2UuCisJICogV2Ug YWxzbyBzZXQgdGhlIGZ1bGwgcmVzaWR1YWwgZmxhZyB3aGljaCB0aGUgCisJICogc2VxdWVuY2Vy IHdpbGwgY2xlYXIgYXMgc29vbiBhcyBhIGRhdGEgdHJhbnNmZXIKKwkgKiBvY2N1cnMuCisJICov CisJc2NiLT5oc2NiLT5zZ3B0ciA9IGFoZF9odG9sZTMyKHNjYi0+c2dfbGlzdF9idXNhZGRyfFNH X0ZVTExfUkVTSUQpOworfQorCit2b2lkCithaGRfc2V0dXBfbm94ZmVyX3NjYihzdHJ1Y3QgYWhk X3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlzY2ItPmhzY2ItPnNncHRyID0gYWhk X2h0b2xlMzIoU0dfTElTVF9OVUxMKTsKKwlzY2ItPmhzY2ItPmRhdGFwdHIgPSAwOworCXNjYi0+ aHNjYi0+ZGF0YWNudCA9IDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBNZW1v cnkgbWFwcGluZyByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICoK K2FoZF9zZ19idXNfdG9fdmlydChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNj YiwgdWludDMyX3Qgc2dfYnVzYWRkcikKK3sKKwlkbWFfYWRkcl90IHNnX29mZnNldDsKKworCS8q IHNnX2xpc3RfcGh5cyBwb2ludHMgdG8gZW50cnkgMSwgbm90IDAgKi8KKwlzZ19vZmZzZXQgPSBz Z19idXNhZGRyIC0gKHNjYi0+c2dfbGlzdF9idXNhZGRyIC0gYWhkX3NnX3NpemUoYWhkKSk7CisJ cmV0dXJuICgodWludDhfdCAqKXNjYi0+c2dfbGlzdCArIHNnX29mZnNldCk7Cit9CisKK3VpbnQz Ml90CithaGRfc2dfdmlydF90b19idXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2Ni ICpzY2IsIHZvaWQgKnNnKQoreworCWRtYV9hZGRyX3Qgc2dfb2Zmc2V0OworCisJLyogc2dfbGlz dF9waHlzIHBvaW50cyB0byBlbnRyeSAxLCBub3QgMCAqLworCXNnX29mZnNldCA9ICgodWludDhf dCAqKXNnIC0gKHVpbnQ4X3QgKilzY2ItPnNnX2xpc3QpCisJCSAgLSBhaGRfc2dfc2l6ZShhaGQp OworCisJcmV0dXJuIChzY2ItPnNnX2xpc3RfYnVzYWRkciArIHNnX29mZnNldCk7Cit9CisKK3Zv aWQKK2FoZF9zeW5jX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYiwg aW50IG9wKQoreworCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2NiX2RhdGEuaHNjYl9kbWF0 LAorCQkJc2NiLT5oc2NiX21hcC0+ZG1hbWFwLAorCQkJLypvZmZzZXQqLyh1aW50OF90KilzY2It PmhzY2IgLSBzY2ItPmhzY2JfbWFwLT52YWRkciwKKwkJCS8qbGVuKi9zaXplb2YoKnNjYi0+aHNj YiksIG9wKTsKK30KKwordm9pZAorYWhkX3N5bmNfc2dsaXN0KHN0cnVjdCBhaGRfc29mdGMgKmFo ZCwgc3RydWN0IHNjYiAqc2NiLCBpbnQgb3ApCit7CisJaWYgKHNjYi0+c2dfY291bnQgPT0gMCkK KwkJcmV0dXJuOworCisJYWhkX2RtYW1hcF9zeW5jKGFoZCwgYWhkLT5zY2JfZGF0YS5zZ19kbWF0 LAorCQkJc2NiLT5zZ19tYXAtPmRtYW1hcCwKKwkJCS8qb2Zmc2V0Ki9zY2ItPnNnX2xpc3RfYnVz YWRkciAtIGFoZF9zZ19zaXplKGFoZCksCisJCQkvKmxlbiovYWhkX3NnX3NpemUoYWhkKSAqIHNj Yi0+c2dfY291bnQsIG9wKTsKK30KKwordm9pZAorYWhkX3N5bmNfc2Vuc2Uoc3RydWN0IGFoZF9z b2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCkKK3sKKwlhaGRfZG1hbWFwX3N5bmMo YWhkLCBhaGQtPnNjYl9kYXRhLnNlbnNlX2RtYXQsCisJCQlzY2ItPnNlbnNlX21hcC0+ZG1hbWFw LAorCQkJLypvZmZzZXQqL3NjYi0+c2Vuc2VfYnVzYWRkciwKKwkJCS8qbGVuKi9BSERfU0VOU0Vf QlVGU0laRSwgb3ApOworfQorCit1aW50MzJfdAorYWhkX3RhcmdldGNtZF9vZmZzZXQoc3RydWN0 IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBpbmRleCkKK3sKKwlyZXR1cm4gKCgodWludDhfdCAqKSZh aGQtPnRhcmdldGNtZHNbaW5kZXhdKQorCSAgICAgICAtICh1aW50OF90ICopYWhkLT5xb3V0Zmlm byk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBNaXNjZWxhbmVvdXMgU3VwcG9ydCBG dW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUmV0dXJuIHBvaW50ZXJz IHRvIHRoZSB0cmFuc2ZlciBuZWdvdGlhdGlvbiBpbmZvcm1hdGlvbgorICogZm9yIHRoZSBzcGVj aWZpZWQgb3VyX2lkL3JlbW90ZV9pZCBwYWlyLgorICovCitzdHJ1Y3QgYWhkX2luaXRpYXRvcl90 aW5mbyAqCithaGRfZmV0Y2hfdHJhbnNpbmZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgY2hhciBj aGFubmVsLCB1X2ludCBvdXJfaWQsCisJCSAgICB1X2ludCByZW1vdGVfaWQsIHN0cnVjdCBhaGRf dG1vZGVfdHN0YXRlICoqdHN0YXRlKQoreworCS8qCisJICogVHJhbnNmZXIgZGF0YSBzdHJ1Y3R1 cmVzIGFyZSBzdG9yZWQgZnJvbSB0aGUgcGVyc3BlY3RpdmUKKwkgKiBvZiB0aGUgdGFyZ2V0IHJv bGUuICBTaW5jZSB0aGUgcGFyYW1ldGVycyBmb3IgYSBjb25uZWN0aW9uCisJICogaW4gdGhlIGlu aXRpYXRvciByb2xlIHRvIGEgZ2l2ZW4gdGFyZ2V0IGFyZSB0aGUgc2FtZSBhcworCSAqIHdoZW4g dGhlIHJvbGVzIGFyZSByZXZlcnNlZCwgd2UgcHJldGVuZCB3ZSBhcmUgdGhlIHRhcmdldC4KKwkg Ki8KKwlpZiAoY2hhbm5lbCA9PSAnQicpCisJCW91cl9pZCArPSA4OworCSp0c3RhdGUgPSBhaGQt PmVuYWJsZWRfdGFyZ2V0c1tvdXJfaWRdOworCXJldHVybiAoJigqdHN0YXRlKS0+dHJhbnNpbmZv W3JlbW90ZV9pZF0pOworfQorCit1aW50MTZfdAorYWhkX2ludyhzdHJ1Y3QgYWhkX3NvZnRjICph aGQsIHVfaW50IHBvcnQpCit7CisJLyoKKwkgKiBSZWFkIGhpZ2ggYnl0ZSBmaXJzdCBhcyBzb21l IHJlZ2lzdGVycyBpbmNyZW1lbnQKKwkgKiBvciBoYXZlIG90aGVyIHNpZGUgZWZmZWN0cyB3aGVu IHRoZSBsb3cgYnl0ZSBpcworCSAqIHJlYWQuCisJICovCisJdWludDE2X3QgciA9IGFoZF9pbmIo YWhkLCBwb3J0KzEpIDw8IDg7CisJcmV0dXJuIHIgfCBhaGRfaW5iKGFoZCwgcG9ydCk7Cit9CisK K3ZvaWQKK2FoZF9vdXR3KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCwgdV9pbnQg dmFsdWUpCit7CisJLyoKKwkgKiBXcml0ZSBsb3cgYnl0ZSBmaXJzdCB0byBhY2NvbW9kYXRlIHJl Z2lzdGVycworCSAqIHN1Y2ggYXMgUFJHTUNOVCB3aGVyZSB0aGUgb3JkZXIgbWF0ZXJzLgorCSAq LworCWFoZF9vdXRiKGFoZCwgcG9ydCwgdmFsdWUgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIHBv cnQrMSwgKHZhbHVlID4+IDgpICYgMHhGRik7Cit9CisKK3VpbnQzMl90CithaGRfaW5sKHN0cnVj dCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCkKK3sKKwlyZXR1cm4gKChhaGRfaW5iKGFoZCwg cG9ydCkpCisJICAgICAgfCAoYWhkX2luYihhaGQsIHBvcnQrMSkgPDwgOCkKKwkgICAgICB8IChh aGRfaW5iKGFoZCwgcG9ydCsyKSA8PCAxNikKKwkgICAgICB8IChhaGRfaW5iKGFoZCwgcG9ydCsz KSA8PCAyNCkpOworfQorCit2b2lkCithaGRfb3V0bChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVf aW50IHBvcnQsIHVpbnQzMl90IHZhbHVlKQoreworCWFoZF9vdXRiKGFoZCwgcG9ydCwgKHZhbHVl KSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgcG9ydCsxLCAoKHZhbHVlKSA+PiA4KSAmIDB4RkYp OworCWFoZF9vdXRiKGFoZCwgcG9ydCsyLCAoKHZhbHVlKSA+PiAxNikgJiAweEZGKTsKKwlhaGRf b3V0YihhaGQsIHBvcnQrMywgKCh2YWx1ZSkgPj4gMjQpICYgMHhGRik7Cit9CisKK3VpbnQ2NF90 CithaGRfaW5xKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCkKK3sKKwlyZXR1cm4g KChhaGRfaW5iKGFoZCwgcG9ydCkpCisJICAgICAgfCAoYWhkX2luYihhaGQsIHBvcnQrMSkgPDwg OCkKKwkgICAgICB8IChhaGRfaW5iKGFoZCwgcG9ydCsyKSA8PCAxNikKKwkgICAgICB8IChhaGRf aW5iKGFoZCwgcG9ydCszKSA8PCAyNCkKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoZF9pbmIoYWhk LCBwb3J0KzQpKSA8PCAzMikKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoZF9pbmIoYWhkLCBwb3J0 KzUpKSA8PCA0MCkKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoZF9pbmIoYWhkLCBwb3J0KzYpKSA8 PCA0OCkKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoZF9pbmIoYWhkLCBwb3J0KzcpKSA8PCA1Nikp OworfQorCit2b2lkCithaGRfb3V0cShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQs IHVpbnQ2NF90IHZhbHVlKQoreworCWFoZF9vdXRiKGFoZCwgcG9ydCwgdmFsdWUgJiAweEZGKTsK KwlhaGRfb3V0YihhaGQsIHBvcnQrMSwgKHZhbHVlID4+IDgpICYgMHhGRik7CisJYWhkX291dGIo YWhkLCBwb3J0KzIsICh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKwlhaGRfb3V0YihhaGQsIHBvcnQr MywgKHZhbHVlID4+IDI0KSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgcG9ydCs0LCAodmFsdWUg Pj4gMzIpICYgMHhGRik7CisJYWhkX291dGIoYWhkLCBwb3J0KzUsICh2YWx1ZSA+PiA0MCkgJiAw eEZGKTsKKwlhaGRfb3V0YihhaGQsIHBvcnQrNiwgKHZhbHVlID4+IDQ4KSAmIDB4RkYpOworCWFo ZF9vdXRiKGFoZCwgcG9ydCs3LCAodmFsdWUgPj4gNTYpICYgMHhGRik7Cit9CisKK3VfaW50Cith aGRfZ2V0X3NjYnB0cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCit7CisJQUhEX0FTU0VSVF9NT0RF UyhhaGQsIH4oQUhEX01PREVfVU5LTk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSyksCisJCQkgfihB SERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9ERV9DRkdfTVNLKSk7CisJcmV0dXJuIChhaGRfaW5i KGFoZCwgU0NCUFRSKSB8IChhaGRfaW5iKGFoZCwgU0NCUFRSICsgMSkgPDwgOCkpOworfQorCit2 b2lkCithaGRfc2V0X3NjYnB0cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHNjYnB0cikK K3sKKwlBSERfQVNTRVJUX01PREVTKGFoZCwgfihBSERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9E RV9DRkdfTVNLKSwKKwkJCSB+KEFIRF9NT0RFX1VOS05PV05fTVNLfEFIRF9NT0RFX0NGR19NU0sp KTsKKwlhaGRfb3V0YihhaGQsIFNDQlBUUiwgc2NicHRyICYgMHhGRik7CisJYWhkX291dGIoYWhk LCBTQ0JQVFIrMSwgKHNjYnB0ciA+PiA4KSAmIDB4RkYpOworfQorCit1X2ludAorYWhkX2dldF9o bnNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKK3sKKwlyZXR1cm4gKGFoZF9pbndfYXRv bWljKGFoZCwgSE5TQ0JfUU9GRikpOworfQorCit2b2lkCithaGRfc2V0X2huc2NiX3FvZmYoc3Ry dWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB2YWx1ZSkKK3sKKwlhaGRfb3V0d19hdG9taWMoYWhk LCBITlNDQl9RT0ZGLCB2YWx1ZSk7Cit9CisKK3VfaW50CithaGRfZ2V0X2hlc2NiX3FvZmYoc3Ry dWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXJldHVybiAoYWhkX2luYihhaGQsIEhFU0NCX1FPRkYp KTsKK30KKwordm9pZAorYWhkX3NldF9oZXNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwg dV9pbnQgdmFsdWUpCit7CisJYWhkX291dGIoYWhkLCBIRVNDQl9RT0ZGLCB2YWx1ZSk7Cit9CisK K3VfaW50CithaGRfZ2V0X3Nuc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXVf aW50IG9sZHZhbHVlOworCisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01T SywgQUhEX01PREVfQ0NIQU5fTVNLKTsKKwlvbGR2YWx1ZSA9IGFoZF9pbncoYWhkLCBTTlNDQl9R T0ZGKTsKKwlhaGRfb3V0dyhhaGQsIFNOU0NCX1FPRkYsIG9sZHZhbHVlKTsKKwlyZXR1cm4gKG9s ZHZhbHVlKTsKK30KKwordm9pZAorYWhkX3NldF9zbnNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMg KmFoZCwgdV9pbnQgdmFsdWUpCit7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0ND SEFOX01TSywgQUhEX01PREVfQ0NIQU5fTVNLKTsKKwlhaGRfb3V0dyhhaGQsIFNOU0NCX1FPRkYs IHZhbHVlKTsKK30KKwordV9pbnQKK2FoZF9nZXRfc2VzY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRj ICphaGQpCit7CisJQUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhE X01PREVfQ0NIQU5fTVNLKTsKKwlyZXR1cm4gKGFoZF9pbmIoYWhkLCBTRVNDQl9RT0ZGKSk7Cit9 CisKK3ZvaWQKK2FoZF9zZXRfc2VzY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50 IHZhbHVlKQoreworCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9DQ0hBTl9NU0ssIEFI RF9NT0RFX0NDSEFOX01TSyk7CisJYWhkX291dGIoYWhkLCBTRVNDQl9RT0ZGLCB2YWx1ZSk7Cit9 CisKK3VfaW50CithaGRfZ2V0X3Nkc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQorewor CUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9DQ0hBTl9NU0ssIEFIRF9NT0RFX0NDSEFO X01TSyk7CisJcmV0dXJuIChhaGRfaW5iKGFoZCwgU0RTQ0JfUU9GRikgfCAoYWhkX2luYihhaGQs IFNEU0NCX1FPRkYgKyAxKSA8PCA4KSk7Cit9CisKK3ZvaWQKK2FoZF9zZXRfc2RzY2JfcW9mZihz dHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHZhbHVlKQoreworCUFIRF9BU1NFUlRfTU9ERVMo YWhkLCBBSERfTU9ERV9DQ0hBTl9NU0ssIEFIRF9NT0RFX0NDSEFOX01TSyk7CisJYWhkX291dGIo YWhkLCBTRFNDQl9RT0ZGLCB2YWx1ZSAmIDB4RkYpOworCWFoZF9vdXRiKGFoZCwgU0RTQ0JfUU9G RisxLCAodmFsdWUgPj4gOCkgJiAweEZGKTsKK30KKwordV9pbnQKK2FoZF9pbmJfc2NicmFtKHN0 cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgb2Zmc2V0KQoreworCXVfaW50IHZhbHVlOworCisJ LyoKKwkgKiBXb3JrYXJvdW5kIFBDSS1YIFJldiBBLiBoYXJkd2FyZSBidWcuCisJICogQWZ0ZXIg YSBob3N0IHJlYWQgb2YgU0NCIG1lbW9yeSwgdGhlIGNoaXAKKwkgKiBtYXkgYmVjb21lIGNvbmZ1 c2VkIGludG8gdGhpbmtpbmcgcHJlZmV0Y2gKKwkgKiB3YXMgcmVxdWlyZWQuICBUaGlzIHN0YXJ0 cyB0aGUgZGlzY2FyZCB0aW1lcgorCSAqIHJ1bm5pbmcgYW5kIGNhbiBjYXVzZSBhbiB1bmV4cGVj dGVkIGRpc2NhcmQKKwkgKiB0aW1lciBpbnRlcnJ1cHQuICBUaGUgd29yayBhcm91bmQgaXMgdG8g cmVhZAorCSAqIGEgbm9ybWFsIHJlZ2lzdGVyIHByaW9yIHRvIHRoZSBleGhhdXN0aW9uIG9mCisJ ICogdGhlIGRpc2NhcmQgdGltZXIuICBUaGUgbW9kZSBwb2ludGVyIHJlZ2lzdGVyCisJICogaGFz IG5vIHNpZGUgZWZmZWN0cyBhbmQgc28gc2VydmVzIHdlbGwgZm9yCisJICogdGhpcyBwdXJwb3Nl LgorCSAqCisJICogUmF6b3IgIzUyOAorCSAqLworCXZhbHVlID0gYWhkX2luYihhaGQsIG9mZnNl dCk7CisJaWYgKChhaGQtPmJ1Z3MgJiBBSERfUENJWF9TQ0JSQU1fUkRfQlVHKSAhPSAwKQorCQlh aGRfaW5iKGFoZCwgTU9ERV9QVFIpOworCXJldHVybiAodmFsdWUpOworfQorCit1X2ludAorYWhk X2lud19zY2JyYW0oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBvZmZzZXQpCit7CisJcmV0 dXJuIChhaGRfaW5iX3NjYnJhbShhaGQsIG9mZnNldCkKKwkgICAgICB8IChhaGRfaW5iX3NjYnJh bShhaGQsIG9mZnNldCsxKSA8PCA4KSk7Cit9CisKK3VpbnQzMl90CithaGRfaW5sX3NjYnJhbShz dHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKGFoZF9pbndf c2NicmFtKGFoZCwgb2Zmc2V0KQorCSAgICAgIHwgKGFoZF9pbndfc2NicmFtKGFoZCwgb2Zmc2V0 KzIpIDw8IDE2KSk7Cit9CisKK3VpbnQ2NF90CithaGRfaW5xX3NjYnJhbShzdHJ1Y3QgYWhkX3Nv ZnRjICphaGQsIHVfaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gKGFoZF9pbmxfc2NicmFtKGFoZCwg b2Zmc2V0KQorCSAgICAgIHwgKCh1aW50NjRfdClhaGRfaW5sX3NjYnJhbShhaGQsIG9mZnNldCs0 KSkgPDwgMzIpOworfQorCitzdHJ1Y3Qgc2NiICoKK2FoZF9sb29rdXBfc2NiKHN0cnVjdCBhaGRf c29mdGMgKmFoZCwgdV9pbnQgdGFnKQoreworCXN0cnVjdCBzY2IqIHNjYjsKKworCWlmICh0YWcg Pj0gQUhEX1NDQl9NQVgpCisJCXJldHVybiAoTlVMTCk7CisJc2NiID0gYWhkLT5zY2JfZGF0YS5z Y2JpbmRleFt0YWddOworCWlmIChzY2IgIT0gTlVMTCkKKwkJYWhkX3N5bmNfc2NiKGFoZCwgc2Ni LAorCQkJICAgICBCVVNfRE1BU1lOQ19QT1NUUkVBRHxCVVNfRE1BU1lOQ19QT1NUV1JJVEUpOwor CXJldHVybiAoc2NiKTsKK30KKwordm9pZAorYWhkX3N3YXBfd2l0aF9uZXh0X2hzY2Ioc3RydWN0 IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJc3RydWN0CSBoYXJkd2FyZV9z Y2IgKnFfaHNjYjsKKwlzdHJ1Y3QJIG1hcF9ub2RlICpxX2hzY2JfbWFwOworCXVpbnQzMl90IHNh dmVkX2hzY2JfYnVzYWRkcjsKKworCS8qCisJICogT3VyIHF1ZXVpbmcgbWV0aG9kIGlzIGEgYml0 IHRyaWNreS4gIFRoZSBjYXJkCisJICoga25vd3MgaW4gYWR2YW5jZSB3aGljaCBIU0NCIChieSBh ZGRyZXNzKSB0byBkb3dubG9hZCwKKwkgKiBhbmQgd2UgY2FuJ3QgZGlzYXBwb2ludCBpdC4gIFRv IGFjaGlldmUgdGhpcywgdGhlIG5leHQKKwkgKiBIU0NCIHRvIGRvd25sb2FkIGlzIHNhdmVkIG9m ZiBpbiBhaGQtPm5leHRfcXVldWVkX2hzY2IuCisJICogV2hlbiB3ZSBhcmUgY2FsbGVkIHRvIHF1 ZXVlICJhbiBhcmJpdHJhcnkgc2NiIiwKKwkgKiB3ZSBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUg aW5jb21pbmcgSFNDQiB0byB0aGUgb25lCisJICogdGhlIHNlcXVlbmNlciBrbm93cyBhYm91dCwg c3dhcCBIU0NCIHBvaW50ZXJzIGFuZAorCSAqIGZpbmFsbHkgYXNzaWduIHRoZSBTQ0IgdG8gdGhl IHRhZyBpbmRleGVkIGxvY2F0aW9uCisJICogaW4gdGhlIHNjYl9hcnJheS4gIFRoaXMgbWFrZXMg c3VyZSB0aGF0IHdlIGNhbiBzdGlsbAorCSAqIGxvY2F0ZSB0aGUgY29ycmVjdCBTQ0IgYnkgU0NC X1RBRy4KKwkgKi8KKwlxX2hzY2IgPSBhaGQtPm5leHRfcXVldWVkX2hzY2I7CisJcV9oc2NiX21h cCA9IGFoZC0+bmV4dF9xdWV1ZWRfaHNjYl9tYXA7CisJc2F2ZWRfaHNjYl9idXNhZGRyID0gcV9o c2NiLT5oc2NiX2J1c2FkZHI7CisJbWVtY3B5KHFfaHNjYiwgc2NiLT5oc2NiLCBzaXplb2YoKnNj Yi0+aHNjYikpOworCXFfaHNjYi0+aHNjYl9idXNhZGRyID0gc2F2ZWRfaHNjYl9idXNhZGRyOwor CXFfaHNjYi0+bmV4dF9oc2NiX2J1c2FkZHIgPSBzY2ItPmhzY2ItPmhzY2JfYnVzYWRkcjsKKwor CS8qIE5vdyBzd2FwIEhTQ0IgcG9pbnRlcnMuICovCisJYWhkLT5uZXh0X3F1ZXVlZF9oc2NiID0g c2NiLT5oc2NiOworCWFoZC0+bmV4dF9xdWV1ZWRfaHNjYl9tYXAgPSBzY2ItPmhzY2JfbWFwOwor CXNjYi0+aHNjYiA9IHFfaHNjYjsKKwlzY2ItPmhzY2JfbWFwID0gcV9oc2NiX21hcDsKKworCS8q IE5vdyBkZWZpbmUgdGhlIG1hcHBpbmcgZnJvbSB0YWcgdG8gU0NCIGluIHRoZSBzY2JpbmRleCAq LworCWFoZC0+c2NiX2RhdGEuc2NiaW5kZXhbU0NCX0dFVF9UQUcoc2NiKV0gPSBzY2I7Cit9CisK Ky8qCisgKiBUZWxsIHRoZSBzZXF1ZW5jZXIgYWJvdXQgYSBuZXcgdHJhbnNhY3Rpb24gdG8gZXhl Y3V0ZS4KKyAqLwordm9pZAorYWhkX3F1ZXVlX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0 cnVjdCBzY2IgKnNjYikKK3sKKwlhaGRfc3dhcF93aXRoX25leHRfaHNjYihhaGQsIHNjYik7CisK KwlpZiAoU0NCSURfSVNfTlVMTChTQ0JfR0VUX1RBRyhzY2IpKSkKKwkJcGFuaWMoIkF0dGVtcHQg dG8gcXVldWUgaW52YWxpZCBTQ0IgdGFnICV4XG4iLAorCQkgICAgICBTQ0JfR0VUX1RBRyhzY2Ip KTsKKworCS8qCisJICogS2VlcCBhIGhpc3Rvcnkgb2YgU0NCcyB3ZSd2ZSBkb3dubG9hZGVkIGlu IHRoZSBxaW5maWZvLgorCSAqLworCWFoZC0+cWluZmlmb1tBSERfUUlOX1dSQVAoYWhkLT5xaW5m aWZvbmV4dCldID0gU0NCX0dFVF9UQUcoc2NiKTsKKwlhaGQtPnFpbmZpZm9uZXh0Kys7CisKKwlp ZiAoc2NiLT5zZ19jb3VudCAhPSAwKQorCQlhaGRfc2V0dXBfZGF0YV9zY2IoYWhkLCBzY2IpOwor CWVsc2UKKwkJYWhkX3NldHVwX25veGZlcl9zY2IoYWhkLCBzY2IpOworCWFoZF9zZXR1cF9zY2Jf Y29tbW9uKGFoZCwgc2NiKTsKKworCS8qCisJICogTWFrZSBzdXJlIG91ciBkYXRhIGlzIGNvbnNp c3RlbnQgZnJvbSB0aGUKKwkgKiBwZXJzcGVjdGl2ZSBvZiB0aGUgYWRhcHRlci4KKwkgKi8KKwlh aGRfc3luY19zY2IoYWhkLCBzY2IsIEJVU19ETUFTWU5DX1BSRVJFQUR8QlVTX0RNQVNZTkNfUFJF V1JJVEUpOworCisjaWZkZWYgQUhEX0RFQlVHCisJaWYgKChhaGRfZGVidWcgJiBBSERfU0hPV19R VUVVRSkgIT0gMCkgeworCQl1aW50NjRfdCBob3N0X2RhdGFwdHI7CisKKwkJaG9zdF9kYXRhcHRy ID0gYWhkX2xlNjR0b2goc2NiLT5oc2NiLT5kYXRhcHRyKTsKKwkJcHJpbnRmKCIlczogUXVldWVp bmcgU0NCICVkOjB4JXggYnVzIGFkZHIgMHgleCAtIDB4JXgleC8weCV4XG4iLAorCQkgICAgICAg YWhkX25hbWUoYWhkKSwKKwkJICAgICAgIFNDQl9HRVRfVEFHKHNjYiksIHNjYi0+aHNjYi0+c2Nz aWlkLAorCQkgICAgICAgYWhkX2xlMzJ0b2goc2NiLT5oc2NiLT5oc2NiX2J1c2FkZHIpLAorCQkg ICAgICAgKHVfaW50KSgoaG9zdF9kYXRhcHRyID4+IDMyKSAmIDB4RkZGRkZGRkYpLAorCQkgICAg ICAgKHVfaW50KShob3N0X2RhdGFwdHIgJiAweEZGRkZGRkZGKSwKKwkJICAgICAgIGFoZF9sZTMy dG9oKHNjYi0+aHNjYi0+ZGF0YWNudCkpOworCX0KKyNlbmRpZgorCS8qIFRlbGwgdGhlIGFkYXB0 ZXIgYWJvdXQgdGhlIG5ld2x5IHF1ZXVlZCBTQ0IgKi8KKwlhaGRfc2V0X2huc2NiX3FvZmYoYWhk LCBhaGQtPnFpbmZpZm9uZXh0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIElu dGVycnVwdCBQcm9jZXNzaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQK K2FoZF9zeW5jX3FvdXRmaWZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IG9wKQoreworCWFo ZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwgYWhkLT5zaGFyZWRfZGF0 YV9tYXAuZG1hbWFwLAorCQkJLypvZmZzZXQqLzAsCisJCQkvKmxlbiovQUhEX1NDQl9NQVggKiBz aXplb2Yoc3RydWN0IGFoZF9jb21wbGV0aW9uKSwgb3ApOworfQorCit2b2lkCithaGRfc3luY190 cWluZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCBvcCkKK3sKKyNpZmRlZiBBSERfVEFS R0VUX01PREUKKwlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfVEFSR0VUUk9MRSkgIT0gMCkgeworCQlh aGRfZG1hbWFwX3N5bmMoYWhkLCBhaGQtPnNoYXJlZF9kYXRhX2RtYXQsCisJCQkJYWhkLT5zaGFy ZWRfZGF0YV9tYXAuZG1hbWFwLAorCQkJCWFoZF90YXJnZXRjbWRfb2Zmc2V0KGFoZCwgMCksCisJ CQkJc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKSAqIEFIRF9UTU9ERV9DTURTLAorCQkJCW9wKTsK Kwl9CisjZW5kaWYKK30KKworLyoKKyAqIFNlZSBpZiB0aGUgZmlybXdhcmUgaGFzIHBvc3RlZCBh bnkgY29tcGxldGVkIGNvbW1hbmRzCisgKiBpbnRvIG91ciBpbi1jb3JlIGNvbW1hbmQgY29tcGxl dGUgZmlmb3MuCisgKi8KKyNkZWZpbmUgQUhEX1JVTl9RT1VURklGTyAweDEKKyNkZWZpbmUgQUhE X1JVTl9UUUlORklGTyAweDIKK3VfaW50CithaGRfY2hlY2tfY21kY21wbHRxdWV1ZXMoc3RydWN0 IGFoZF9zb2Z0YyAqYWhkKQoreworCXVfaW50IHJldHZhbDsKKworCXJldHZhbCA9IDA7CisJYWhk X2RtYW1hcF9zeW5jKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LCBhaGQtPnNoYXJlZF9kYXRh X21hcC5kbWFtYXAsCisJCQkvKm9mZnNldCovYWhkLT5xb3V0Zmlmb25leHQgKiBzaXplb2YoKmFo ZC0+cW91dGZpZm8pLAorCQkJLypsZW4qL3NpemVvZigqYWhkLT5xb3V0ZmlmbyksIEJVU19ETUFT WU5DX1BPU1RSRUFEKTsKKwlpZiAoYWhkLT5xb3V0Zmlmb1thaGQtPnFvdXRmaWZvbmV4dF0udmFs aWRfdGFnCisJICA9PSBhaGQtPnFvdXRmaWZvbmV4dF92YWxpZF90YWcpCisJCXJldHZhbCB8PSBB SERfUlVOX1FPVVRGSUZPOworI2lmZGVmIEFIRF9UQVJHRVRfTU9ERQorCWlmICgoYWhkLT5mbGFn cyAmIEFIRF9UQVJHRVRST0xFKSAhPSAwCisJICYmIChhaGQtPmZsYWdzICYgQUhEX1RRSU5GSUZP X0JMT0NLRUQpID09IDApIHsKKwkJYWhkX2RtYW1hcF9zeW5jKGFoZCwgYWhkLT5zaGFyZWRfZGF0 YV9kbWF0LAorCQkJCWFoZC0+c2hhcmVkX2RhdGFfbWFwLmRtYW1hcCwKKwkJCQlhaGRfdGFyZ2V0 Y21kX29mZnNldChhaGQsIGFoZC0+dHFpbmZpZm9mbmV4dCksCisJCQkJLypsZW4qL3NpemVvZihz dHJ1Y3QgdGFyZ2V0X2NtZCksCisJCQkJQlVTX0RNQVNZTkNfUE9TVFJFQUQpOworCQlpZiAoYWhk LT50YXJnZXRjbWRzW2FoZC0+dHFpbmZpZm9uZXh0XS5jbWRfdmFsaWQgIT0gMCkKKwkJCXJldHZh bCB8PSBBSERfUlVOX1RRSU5GSUZPOworCX0KKyNlbmRpZgorCXJldHVybiAocmV0dmFsKTsKK30K KworLyoKKyAqIENhdGNoIGFuIGludGVycnVwdCBmcm9tIHRoZSBhZGFwdGVyCisgKi8KK2ludAor YWhkX2ludHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQoreworCXVfaW50CWludHN0YXQ7CisKKwlp ZiAoKGFoZC0+cGF1c2UgJiBJTlRFTikgPT0gMCkgeworCQkvKgorCQkgKiBPdXIgaW50ZXJydXB0 IGlzIG5vdCBlbmFibGVkIG9uIHRoZSBjaGlwCisJCSAqIGFuZCBtYXkgYmUgZGlzYWJsZWQgZm9y IHJlLWVudHJhbmN5IHJlYXNvbnMsCisJCSAqIHNvIGp1c3QgcmV0dXJuLiAgVGhpcyBpcyBsaWtl bHkganVzdCBhIHNoYXJlZAorCQkgKiBpbnRlcnJ1cHQuCisJCSAqLworCQlyZXR1cm4gKDApOwor CX0KKworCS8qCisJICogSW5zdGVhZCBvZiBkaXJlY3RseSByZWFkaW5nIHRoZSBpbnRlcnJ1cHQg c3RhdHVzIHJlZ2lzdGVyLAorCSAqIGluZmVyIHRoZSBjYXVzZSBvZiB0aGUgaW50ZXJydXB0IGJ5 IGNoZWNraW5nIG91ciBpbi1jb3JlCisJICogY29tcGxldGlvbiBxdWV1ZXMuICBUaGlzIGF2b2lk cyBhIGNvc3RseSBQQ0kgYnVzIHJlYWQgaW4KKwkgKiBtb3N0IGNhc2VzLgorCSAqLworCWlmICgo YWhkLT5mbGFncyAmIEFIRF9BTExfSU5URVJSVVBUUykgPT0gMAorCSAmJiAoYWhkX2NoZWNrX2Nt ZGNtcGx0cXVldWVzKGFoZCkgIT0gMCkpCisJCWludHN0YXQgPSBDTURDTVBMVDsKKwllbHNlCisJ CWludHN0YXQgPSBhaGRfaW5iKGFoZCwgSU5UU1RBVCk7CisKKwlpZiAoKGludHN0YXQgJiBJTlRf UEVORCkgPT0gMCkKKwkJcmV0dXJuICgwKTsKKworCWlmIChpbnRzdGF0ICYgQ01EQ01QTFQpIHsK KwkJYWhkX291dGIoYWhkLCBDTFJJTlQsIENMUkNNRElOVCk7CisKKwkJLyoKKwkJICogRW5zdXJl IHRoYXQgdGhlIGNoaXAgc2VlcyB0aGF0IHdlJ3ZlIGNsZWFyZWQKKwkJICogdGhpcyBpbnRlcnJ1 cHQgYmVmb3JlIHdlIHdhbGsgdGhlIG91dHB1dCBmaWZvLgorCQkgKiBPdGhlcndpc2UsIHdlIG1h eSwgZHVlIHRvIHBvc3RlZCBidXMgd3JpdGVzLAorCQkgKiBjbGVhciB0aGUgaW50ZXJydXB0IGFm dGVyIHdlIGZpbmlzaCB0aGUgc2NhbiwKKwkJICogYW5kIGFmdGVyIHRoZSBzZXF1ZW5jZXIgaGFz IGFkZGVkIG5ldyBlbnRyaWVzCisJCSAqIGFuZCBhc3NlcnRlZCB0aGUgaW50ZXJydXB0IGFnYWlu LgorCQkgKi8KKwkJaWYgKChhaGQtPmJ1Z3MgJiBBSERfSU5UQ09MTElTSU9OX0JVRykgIT0gMCkg eworCQkJaWYgKGFoZF9pc19wYXVzZWQoYWhkKSkgeworCQkJCS8qCisJCQkJICogUG90ZW50aWFs bHkgbG9zdCBTRVFJTlQuCisJCQkJICogSWYgU0VRSU5UQ09ERSBpcyBub24temVybywKKwkJCQkg KiBzaW11bGF0ZSB0aGUgU0VRSU5ULgorCQkJCSAqLworCQkJCWlmIChhaGRfaW5iKGFoZCwgU0VR SU5UQ09ERSkgIT0gTk9fU0VRSU5UKQorCQkJCQlpbnRzdGF0IHw9IFNFUUlOVDsKKwkJCX0KKwkJ fSBlbHNlIHsKKwkJCWFoZF9mbHVzaF9kZXZpY2Vfd3JpdGVzKGFoZCk7CisJCX0KKwkJYWhkX3J1 bl9xb3V0ZmlmbyhhaGQpOworCQlhaGQtPmNtZGNtcGx0X2NvdW50c1thaGQtPmNtZGNtcGx0X2J1 Y2tldF0rKzsKKwkJYWhkLT5jbWRjbXBsdF90b3RhbCsrOworI2lmZGVmIEFIRF9UQVJHRVRfTU9E RQorCQlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfVEFSR0VUUk9MRSkgIT0gMCkKKwkJCWFoZF9ydW5f dHFpbmZpZm8oYWhkLCAvKnBhdXNlZCovRkFMU0UpOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBI YW5kbGUgc3RhdHVzZXMgdGhhdCBtYXkgaW52YWxpZGF0ZSBvdXIgY2FjaGVkCisJICogY29weSBv ZiBJTlRTVEFUIHNlcGFyYXRlbHkuCisJICovCisJaWYgKGludHN0YXQgPT0gMHhGRiAmJiAoYWhk LT5mZWF0dXJlcyAmIEFIRF9SRU1PVkFCTEUpICE9IDApIHsKKwkJLyogSG90IGVqZWN0LiAgRG8g bm90aGluZyAqLworCX0gZWxzZSBpZiAoaW50c3RhdCAmIEhXRVJSSU5UKSB7CisJCWFoZF9oYW5k bGVfaHdlcnJpbnQoYWhkKTsKKwl9IGVsc2UgaWYgKChpbnRzdGF0ICYgKFBDSUlOVHxTUExUSU5U KSkgIT0gMCkgeworCQlhaGQtPmJ1c19pbnRyKGFoZCk7CisJfSBlbHNlIHsKKworCQlpZiAoKGlu dHN0YXQgJiBTRVFJTlQpICE9IDApCisJCQlhaGRfaGFuZGxlX3NlcWludChhaGQsIGludHN0YXQp OworCisJCWlmICgoaW50c3RhdCAmIFNDU0lJTlQpICE9IDApCisJCQlhaGRfaGFuZGxlX3Njc2lp bnQoYWhkLCBpbnRzdGF0KTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworLyoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqIFByaXZhdGUgSW5saW5lcyAqKioqKioqKioqKioqKioqKioqKioq KioqKioqKi8KIHN0YXRpYyBfX2lubGluZSB2b2lkCiBhaGRfYXNzZXJ0X2F0bihzdHJ1Y3QgYWhk X3NvZnRjICphaGQpCiB7CkBAIC0yODAsNyArMTAyNCw3IEBACiAgKiBhcmUgY3VycmVudGx5IGlu IGEgcGFja2V0aXplZCB0cmFuc2Zlci4gIFdlIGNvdWxkCiAgKiBqdXN0IGFzIGVhc2lseSBiZSBz ZW5kaW5nIG9yIHJlY2VpdmluZyBhIG1lc3NhZ2UuCiAgKi8KLXN0YXRpYyBfX2lubGluZSBpbnQK K3N0YXRpYyBpbnQKIGFoZF9jdXJyZW50bHlfcGFja2V0aXplZChzdHJ1Y3QgYWhkX3NvZnRjICph aGQpCiB7CiAJYWhkX21vZGVfc3RhdGUJIHNhdmVkX21vZGVzOwpAQCAtNjI3MSw2ICs3MDE1LDI0 IEBACiAJIlVuZGVyIFRlcm1pbmF0ZWQiLAogCSJOb3QgQ29uZmlndXJlZCIKIH07CisKKy8qKioq KioqKioqKioqKioqKioqKioqKioqKioqKiBUaW1lciBGYWNpbGl0aWVzICoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovCisjZGVmaW5lIGFoZF90aW1lcl9pbml0IGluaXRfdGltZXIKKyNk ZWZpbmUgYWhkX3RpbWVyX3N0b3AgZGVsX3RpbWVyX3N5bmMKK3R5cGVkZWYgdm9pZCBhaGRfbGlu dXhfY2FsbGJhY2tfdCAodV9sb25nKTsKKworc3RhdGljIHZvaWQKK2FoZF90aW1lcl9yZXNldChh aGRfdGltZXJfdCAqdGltZXIsIGludCB1c2VjLCBhaGRfY2FsbGJhY2tfdCAqZnVuYywgdm9pZCAq YXJnKQoreworCXN0cnVjdCBhaGRfc29mdGMgKmFoZDsKKworCWFoZCA9IChzdHJ1Y3QgYWhkX3Nv ZnRjICopYXJnOworCWRlbF90aW1lcih0aW1lcik7CisJdGltZXItPmRhdGEgPSAodV9sb25nKWFy ZzsKKwl0aW1lci0+ZXhwaXJlcyA9IGppZmZpZXMgKyAodXNlYyAqIEhaKS8xMDAwMDAwOworCXRp bWVyLT5mdW5jdGlvbiA9IChhaGRfbGludXhfY2FsbGJhY2tfdCopZnVuYzsKKwlhZGRfdGltZXIo dGltZXIpOworfQogCiAvKgogICogU3RhcnQgdGhlIGJvYXJkLCByZWFkeSBmb3Igbm9ybWFsIG9w ZXJhdGlvbgotLS0gbGludXgtMi42LjIzLXJjMS5vcmcvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWlj Nzl4eF9pbmxpbmUuaAlNb24gSnVsICA5IDAwOjMyOjE3IDIwMDcKKysrIGxpbnV4LTIuNi4yMy1y YzEuYWljL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfaW5saW5lLmgJVHVlIEp1bCAzMSAw NzozMToyMCAyMDA3CkBAIC02MywxOSArNjMsMjAgQEAKIHN0YXRpYyBfX2lubGluZSB2b2lkIGFo ZF9leHRyYWN0X21vZGVfc3RhdGUoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAogCQkJCQkgICAgYWhk X21vZGVfc3RhdGUgc3RhdGUsCiAJCQkJCSAgICBhaGRfbW9kZSAqc3JjLCBhaGRfbW9kZSAqZHN0 KTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9zZXRfbW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAq YWhkLCBhaGRfbW9kZSBzcmMsCi0JCQkJICAgYWhkX21vZGUgZHN0KTsKLXN0YXRpYyBfX2lubGlu ZSB2b2lkIGFoZF91cGRhdGVfbW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXN0YXRpYyBf X2lubGluZSB2b2lkIGFoZF9hc3NlcnRfbW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBhaGRf bW9kZSBzcmNtb2RlLAotCQkJCSAgICAgIGFoZF9tb2RlIGRzdG1vZGUsIGNvbnN0IGNoYXIgKmZp bGUsCi0JCQkJICAgICAgaW50IGxpbmUpOwotc3RhdGljIF9faW5saW5lIGFoZF9tb2RlX3N0YXRl IGFoZF9zYXZlX21vZGVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci1zdGF0aWMgX19pbmxpbmUg dm9pZCBhaGRfcmVzdG9yZV9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJICAgICAg IGFoZF9tb2RlX3N0YXRlIHN0YXRlKTsKLXN0YXRpYyBfX2lubGluZSBpbnQgIGFoZF9pc19wYXVz ZWQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9wYXVz ZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX3VucGF1 c2Uoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIAordm9pZCBhaGRfc2V0X21vZGVzKHN0cnVjdCBh aGRfc29mdGMgKmFoZCwgYWhkX21vZGUgc3JjLAorCQkgICBhaGRfbW9kZSBkc3QpOwordm9pZCBh aGRfdXBkYXRlX21vZGVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Cit2b2lkIGFoZF9hc3NlcnRf bW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBhaGRfbW9kZSBzcmNtb2RlLAorCQkgICAgICBh aGRfbW9kZSBkc3Rtb2RlLCBjb25zdCBjaGFyICpmaWxlLAorCQkgICAgICBpbnQgbGluZSk7Cith aGRfbW9kZV9zdGF0ZSBhaGRfc2F2ZV9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwordm9p ZCBhaGRfcmVzdG9yZV9tb2RlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCSAgICAgICBhaGRf bW9kZV9zdGF0ZSBzdGF0ZSk7CitpbnQgIGFoZF9pc19wYXVzZWQoc3RydWN0IGFoZF9zb2Z0YyAq YWhkKTsKK3ZvaWQgYWhkX3BhdXNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Cit2b2lkIGFoZF91 bnBhdXNlKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7CisKIHN0YXRpYyBfX2lubGluZSB2b2lkCiBh aGRfa25vd25fbW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBhaGRfbW9kZSBzcmMsIGFoZF9t b2RlIGRzdCkKIHsKQEAgLTk5LDI1NyArMTAwLDM4IEBACiAJKmRzdCA9IChzdGF0ZSAmIERTVF9N T0RFKSA+PiBEU1RfTU9ERV9TSElGVDsKIH0KIAotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9z ZXRfbW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBhaGRfbW9kZSBzcmMsIGFoZF9tb2RlIGRz dCkKLXsKLQlpZiAoYWhkLT5zcmNfbW9kZSA9PSBzcmMgJiYgYWhkLT5kc3RfbW9kZSA9PSBkc3Qp Ci0JCXJldHVybjsKLSNpZmRlZiBBSERfREVCVUcKLQlpZiAoYWhkLT5zcmNfbW9kZSA9PSBBSERf TU9ERV9VTktOT1dOCi0JIHx8IGFoZC0+ZHN0X21vZGUgPT0gQUhEX01PREVfVU5LTk9XTikKLQkJ cGFuaWMoIlNldHRpbmcgbW9kZSBwcmlvciB0byBzYXZpbmcgaXQuXG4iKTsKLQlpZiAoKGFoZF9k ZWJ1ZyAmIEFIRF9TSE9XX01PREVQVFIpICE9IDApCi0JCXByaW50ZigiJXM6IFNldHRpbmcgbW9k ZSAweCV4XG4iLCBhaGRfbmFtZShhaGQpLAotCQkgICAgICAgYWhkX2J1aWxkX21vZGVfc3RhdGUo YWhkLCBzcmMsIGRzdCkpOwotI2VuZGlmCi0JYWhkX291dGIoYWhkLCBNT0RFX1BUUiwgYWhkX2J1 aWxkX21vZGVfc3RhdGUoYWhkLCBzcmMsIGRzdCkpOwotCWFoZC0+c3JjX21vZGUgPSBzcmM7Ci0J YWhkLT5kc3RfbW9kZSA9IGRzdDsKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF91cGRh dGVfbW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQotewotCWFoZF9tb2RlX3N0YXRlIG1vZGVf cHRyOwotCWFoZF9tb2RlIHNyYzsKLQlhaGRfbW9kZSBkc3Q7Ci0KLQltb2RlX3B0ciA9IGFoZF9p bmIoYWhkLCBNT0RFX1BUUik7Ci0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKChhaGRfZGVidWcgJiBB SERfU0hPV19NT0RFUFRSKSAhPSAwKQotCQlwcmludGYoIlJlYWRpbmcgbW9kZSAweCV4XG4iLCBt b2RlX3B0cik7Ci0jZW5kaWYKLQlhaGRfZXh0cmFjdF9tb2RlX3N0YXRlKGFoZCwgbW9kZV9wdHIs ICZzcmMsICZkc3QpOwotCWFoZF9rbm93bl9tb2RlcyhhaGQsIHNyYywgZHN0KTsKLX0KLQotc3Rh dGljIF9faW5saW5lIHZvaWQKLWFoZF9hc3NlcnRfbW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhk LCBhaGRfbW9kZSBzcmNtb2RlLAotCQkgYWhkX21vZGUgZHN0bW9kZSwgY29uc3QgY2hhciAqZmls ZSwgaW50IGxpbmUpCi17Ci0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKChzcmNtb2RlICYgQUhEX01L X01TSyhhaGQtPnNyY19tb2RlKSkgPT0gMAotCSB8fCAoZHN0bW9kZSAmIEFIRF9NS19NU0soYWhk LT5kc3RfbW9kZSkpID09IDApIHsKLQkJcGFuaWMoIiVzOiVzOiVkOiBNb2RlIGFzc2VydGlvbiBm YWlsZWQuXG4iLAotCQkgICAgICAgYWhkX25hbWUoYWhkKSwgZmlsZSwgbGluZSk7Ci0JfQotI2Vu ZGlmCi19Ci0KLXN0YXRpYyBfX2lubGluZSBhaGRfbW9kZV9zdGF0ZQotYWhkX3NhdmVfbW9kZXMo c3RydWN0IGFoZF9zb2Z0YyAqYWhkKQotewotCWlmIChhaGQtPnNyY19tb2RlID09IEFIRF9NT0RF X1VOS05PV04KLQkgfHwgYWhkLT5kc3RfbW9kZSA9PSBBSERfTU9ERV9VTktOT1dOKQotCQlhaGRf dXBkYXRlX21vZGVzKGFoZCk7Ci0KLQlyZXR1cm4gKGFoZF9idWlsZF9tb2RlX3N0YXRlKGFoZCwg YWhkLT5zcmNfbW9kZSwgYWhkLT5kc3RfbW9kZSkpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9p ZAotYWhkX3Jlc3RvcmVfbW9kZXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBhaGRfbW9kZV9zdGF0 ZSBzdGF0ZSkKLXsKLQlhaGRfbW9kZSBzcmM7Ci0JYWhkX21vZGUgZHN0OwotCi0JYWhkX2V4dHJh Y3RfbW9kZV9zdGF0ZShhaGQsIHN0YXRlLCAmc3JjLCAmZHN0KTsKLQlhaGRfc2V0X21vZGVzKGFo ZCwgc3JjLCBkc3QpOwotfQotCi0jZGVmaW5lIEFIRF9BU1NFUlRfTU9ERVMoYWhkLCBzb3VyY2Us IGRlc3QpIFwKLQlhaGRfYXNzZXJ0X21vZGVzKGFoZCwgc291cmNlLCBkZXN0LCBfX0ZJTEVfXywg X19MSU5FX18pOwotCi0vKgotICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlcXVlbmNlciBoYXMg aGFsdGVkIGNvZGUgZXhlY3V0aW9uLgotICogUmV0dXJucyBub24temVybyBzdGF0dXMgaWYgdGhl IHNlcXVlbmNlciBpcyBzdG9wcGVkLgotICovCi1zdGF0aWMgX19pbmxpbmUgaW50Ci1haGRfaXNf cGF1c2VkKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQlyZXR1cm4gKChhaGRfaW5iKGFoZCwg SENOVFJMKSAmIFBBVVNFKSAhPSAwKTsKLX0KLQotLyoKLSAqIFJlcXVlc3QgdGhhdCB0aGUgc2Vx dWVuY2VyIHN0b3AgYW5kIHdhaXQsIGluZGVmaW5pdGVseSwgZm9yIGl0Ci0gKiB0byBzdG9wLiAg VGhlIHNlcXVlbmNlciB3aWxsIG9ubHkgYWNrbm93bGVkZ2UgdGhhdCBpdCBpcyBwYXVzZWQKLSAq IG9uY2UgaXQgaGFzIHJlYWNoZWQgYW4gaW5zdHJ1Y3Rpb24gYm91bmRhcnkgYW5kIFBBVVNFRElT IGlzCi0gKiBjbGVhcmVkIGluIHRoZSBTRVFDVEwgcmVnaXN0ZXIuICBUaGUgc2VxdWVuY2VyIG1h eSB1c2UgUEFVU0VESVMKLSAqIGZvciBjcml0aWNhbCBzZWN0aW9ucy4KLSAqLwotc3RhdGljIF9f aW5saW5lIHZvaWQKLWFoZF9wYXVzZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0JYWhkX291 dGIoYWhkLCBIQ05UUkwsIGFoZC0+cGF1c2UpOwotCi0JLyoKLQkgKiBTaW5jZSB0aGUgc2VxdWVu Y2VyIGNhbiBkaXNhYmxlIHBhdXNpbmcgaW4gYSBjcml0aWNhbCBzZWN0aW9uLCB3ZQotCSAqIG11 c3QgbG9vcCB1bnRpbCBpdCBhY3R1YWxseSBzdG9wcy4KLQkgKi8KLQl3aGlsZSAoYWhkX2lzX3Bh dXNlZChhaGQpID09IDApCi0JCTsKLX0KLQotLyoKLSAqIEFsbG93IHRoZSBzZXF1ZW5jZXIgdG8g Y29udGludWUgcHJvZ3JhbSBleGVjdXRpb24uCi0gKiBXZSBjaGVjayBoZXJlIHRvIGVuc3VyZSB0 aGF0IG5vIGFkZGl0aW9uYWwgaW50ZXJydXB0Ci0gKiBzb3VyY2VzIHRoYXQgd291bGQgY2F1c2Ug dGhlIHNlcXVlbmNlciB0byBoYWx0IGhhdmUgYmVlbgotICogYXNzZXJ0ZWQuICBJZiwgZm9yIGV4 YW1wbGUsIGEgU0NTSSBidXMgcmVzZXQgaXMgZGV0ZWN0ZWQKLSAqIHdoaWxlIHdlIGFyZSBmaWVs ZGluZyBhIGRpZmZlcmVudCwgcGF1c2luZywgaW50ZXJydXB0IHR5cGUsCi0gKiB3ZSBkb24ndCB3 YW50IHRvIHJlbGVhc2UgdGhlIHNlcXVlbmNlciBiZWZvcmUgZ29pbmcgYmFjawotICogaW50byBv dXIgaW50ZXJydXB0IGhhbmRsZXIgYW5kIGRlYWxpbmcgd2l0aCB0aGlzIG5ldwotICogY29uZGl0 aW9uLgotICovCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX3VucGF1c2Uoc3RydWN0IGFoZF9z b2Z0YyAqYWhkKQotewotCS8qCi0JICogQXV0b21hdGljYWxseSByZXN0b3JlIG91ciBtb2RlcyB0 byB0aG9zZSBzYXZlZAotCSAqIHByaW9yIHRvIHRoZSBmaXJzdCBjaGFuZ2Ugb2YgdGhlIG1vZGUu Ci0JICovCi0JaWYgKGFoZC0+c2F2ZWRfc3JjX21vZGUgIT0gQUhEX01PREVfVU5LTk9XTgotCSAm JiBhaGQtPnNhdmVkX2RzdF9tb2RlICE9IEFIRF9NT0RFX1VOS05PV04pIHsKLQkJaWYgKChhaGQt PmZsYWdzICYgQUhEX1VQREFURV9QRU5EX0NNRFMpICE9IDApCi0JCQlhaGRfcmVzZXRfY21kc19w ZW5kaW5nKGFoZCk7Ci0JCWFoZF9zZXRfbW9kZXMoYWhkLCBhaGQtPnNhdmVkX3NyY19tb2RlLCBh aGQtPnNhdmVkX2RzdF9tb2RlKTsKLQl9Ci0KLQlpZiAoKGFoZF9pbmIoYWhkLCBJTlRTVEFUKSAm IH5DTURDTVBMVCkgPT0gMCkKLQkJYWhkX291dGIoYWhkLCBIQ05UUkwsIGFoZC0+dW5wYXVzZSk7 Ci0KLQlhaGRfa25vd25fbW9kZXMoYWhkLCBBSERfTU9ERV9VTktOT1dOLCBBSERfTU9ERV9VTktO T1dOKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqIFNjYXR0ZXIgR2F0aGVyIExpc3Qg SGFuZGxpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBfX2lubGluZSB2b2lk CSphaGRfc2dfc2V0dXAoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IsCi0J CQkJICAgICAgdm9pZCAqc2dwdHIsIGRtYV9hZGRyX3QgYWRkciwKLQkJCQkgICAgICBidXNfc2l6 ZV90IGxlbiwgaW50IGxhc3QpOwotc3RhdGljIF9faW5saW5lIHZvaWQJIGFoZF9zZXR1cF9zY2Jf Y29tbW9uKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCQkJICAgICAgc3RydWN0IHNjYiAqc2Ni KTsKLXN0YXRpYyBfX2lubGluZSB2b2lkCSBhaGRfc2V0dXBfZGF0YV9zY2Ioc3RydWN0IGFoZF9z b2Z0YyAqYWhkLAotCQkJCQkgICAgc3RydWN0IHNjYiAqc2NiKTsKLXN0YXRpYyBfX2lubGluZSB2 b2lkCSBhaGRfc2V0dXBfbm94ZmVyX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJCSAg ICAgIHN0cnVjdCBzY2IgKnNjYik7Cit2b2lkCSphaGRfc2dfc2V0dXAoc3RydWN0IGFoZF9zb2Z0 YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2IsCisJCSAgICAgIHZvaWQgKnNncHRyLCBkbWFfYWRkcl90 IGFkZHIsCisJCSAgICAgIGJ1c19zaXplX3QgbGVuLCBpbnQgbGFzdCk7Cit2b2lkCSBhaGRfc2V0 dXBfc2NiX2NvbW1vbihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkgICAgICBzdHJ1Y3Qgc2Ni ICpzY2IpOwordm9pZAkgYWhkX3NldHVwX2RhdGFfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwK KwkJCSAgICBzdHJ1Y3Qgc2NiICpzY2IpOwordm9pZAkgYWhkX3NldHVwX25veGZlcl9zY2Ioc3Ry dWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJICAgICAgc3RydWN0IHNjYiAqc2NiKTsKIAotc3RhdGlj IF9faW5saW5lIHZvaWQgKgotYWhkX3NnX3NldHVwKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3Ry dWN0IHNjYiAqc2NiLAotCSAgICAgdm9pZCAqc2dwdHIsIGRtYV9hZGRyX3QgYWRkciwgYnVzX3Np emVfdCBsZW4sIGludCBsYXN0KQotewotCXNjYi0+c2dfY291bnQrKzsKLQlpZiAoc2l6ZW9mKGRt YV9hZGRyX3QpID4gNAotCSAmJiAoYWhkLT5mbGFncyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAh PSAwKSB7Ci0JCXN0cnVjdCBhaGRfZG1hNjRfc2VnICpzZzsKLQotCQlzZyA9IChzdHJ1Y3QgYWhk X2RtYTY0X3NlZyAqKXNncHRyOwotCQlzZy0+YWRkciA9IGFoZF9odG9sZTY0KGFkZHIpOwotCQlz Zy0+bGVuID0gYWhkX2h0b2xlMzIobGVuIHwgKGxhc3QgPyBBSERfRE1BX0xBU1RfU0VHIDogMCkp OwotCQlyZXR1cm4gKHNnICsgMSk7Ci0JfSBlbHNlIHsKLQkJc3RydWN0IGFoZF9kbWFfc2VnICpz ZzsKLQotCQlzZyA9IChzdHJ1Y3QgYWhkX2RtYV9zZWcgKilzZ3B0cjsKLQkJc2ctPmFkZHIgPSBh aGRfaHRvbGUzMihhZGRyICYgMHhGRkZGRkZGRik7Ci0JCXNnLT5sZW4gPSBhaGRfaHRvbGUzMihs ZW4gfCAoKGFkZHIgPj4gOCkgJiAweDdGMDAwMDAwKQotCQkJCSAgICB8IChsYXN0ID8gQUhEX0RN QV9MQVNUX1NFRyA6IDApKTsKLQkJcmV0dXJuIChzZyArIDEpOwotCX0KLX0KLQotc3RhdGljIF9f aW5saW5lIHZvaWQKLWFoZF9zZXR1cF9zY2JfY29tbW9uKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwg c3RydWN0IHNjYiAqc2NiKQotewotCS8qIFhYWCBIYW5kbGUgdGFyZ2V0IG1vZGUgU0NCcy4gKi8K LQlzY2ItPmNyY19yZXRyeV9jb3VudCA9IDA7Ci0JaWYgKChzY2ItPmZsYWdzICYgU0NCX1BBQ0tF VElaRUQpICE9IDApIHsKLQkJLyogWFhYIHdoYXQgYWJvdXQgQUNBPz8gIEl0IGlzIHR5cGUgNCwg YnV0IFRBR19UWVBFID09IDB4My4gKi8KLQkJc2NiLT5oc2NiLT50YXNrX2F0dHJpYnV0ZSA9IHNj Yi0+aHNjYi0+Y29udHJvbCAmIFNDQl9UQUdfVFlQRTsKLQl9IGVsc2UgewotCQlpZiAoYWhkX2dl dF90cmFuc2Zlcl9sZW5ndGgoc2NiKSAmIDB4MDEpCi0JCQlzY2ItPmhzY2ItPnRhc2tfYXR0cmli dXRlID0gU0NCX1hGRVJMRU5fT0REOwotCQllbHNlCi0JCQlzY2ItPmhzY2ItPnRhc2tfYXR0cmli dXRlID0gMDsKLQl9Ci0KLQlpZiAoc2NiLT5oc2NiLT5jZGJfbGVuIDw9IE1BWF9DREJfTEVOX1dJ VEhfU0VOU0VfQUREUgotCSB8fCAoc2NiLT5oc2NiLT5jZGJfbGVuICYgU0NCX0NEQl9MRU5fUFRS KSAhPSAwKQotCQlzY2ItPmhzY2ItPnNoYXJlZF9kYXRhLmlkYXRhLmNkYl9wbHVzX3NhZGRyLnNl bnNlX2FkZHIgPQotCQkgICAgYWhkX2h0b2xlMzIoc2NiLT5zZW5zZV9idXNhZGRyKTsKLX0KLQot c3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9zZXR1cF9kYXRhX3NjYihzdHJ1Y3QgYWhkX3NvZnRj ICphaGQsIHN0cnVjdCBzY2IgKnNjYikKLXsKLQkvKgotCSAqIENvcHkgdGhlIGZpcnN0IFNHIGlu dG8gdGhlICJjdXJyZW50IiBkYXRhIHBvbnRlciBhcmVhLgotCSAqLwotCWlmICgoYWhkLT5mbGFn cyAmIEFIRF82NEJJVF9BRERSRVNTSU5HKSAhPSAwKSB7Ci0JCXN0cnVjdCBhaGRfZG1hNjRfc2Vn ICpzZzsKLQotCQlzZyA9IChzdHJ1Y3QgYWhkX2RtYTY0X3NlZyAqKXNjYi0+c2dfbGlzdDsKLQkJ c2NiLT5oc2NiLT5kYXRhcHRyID0gc2ctPmFkZHI7Ci0JCXNjYi0+aHNjYi0+ZGF0YWNudCA9IHNn LT5sZW47Ci0JfSBlbHNlIHsKLQkJc3RydWN0IGFoZF9kbWFfc2VnICpzZzsKLQkJdWludDMyX3Qg KmRhdGFwdHJfd29yZHM7Ci0KLQkJc2cgPSAoc3RydWN0IGFoZF9kbWFfc2VnICopc2NiLT5zZ19s aXN0OwotCQlkYXRhcHRyX3dvcmRzID0gKHVpbnQzMl90Kikmc2NiLT5oc2NiLT5kYXRhcHRyOwot CQlkYXRhcHRyX3dvcmRzWzBdID0gc2ctPmFkZHI7Ci0JCWRhdGFwdHJfd29yZHNbMV0gPSAwOwot CQlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfMzlCSVRfQUREUkVTU0lORykgIT0gMCkgewotCQkJdWlu dDY0X3QgaGlnaF9hZGRyOwotCi0JCQloaWdoX2FkZHIgPSBhaGRfbGUzMnRvaChzZy0+bGVuKSAm IDB4N0YwMDAwMDA7Ci0JCQlzY2ItPmhzY2ItPmRhdGFwdHIgfD0gYWhkX2h0b2xlNjQoaGlnaF9h ZGRyIDw8IDgpOwotCQl9Ci0JCXNjYi0+aHNjYi0+ZGF0YWNudCA9IHNnLT5sZW47Ci0JfQotCS8q Ci0JICogTm90ZSB3aGVyZSB0byBmaW5kIHRoZSBTRyBlbnRyaWVzIGluIGJ1cyBzcGFjZS4KLQkg KiBXZSBhbHNvIHNldCB0aGUgZnVsbCByZXNpZHVhbCBmbGFnIHdoaWNoIHRoZSAKLQkgKiBzZXF1 ZW5jZXIgd2lsbCBjbGVhciBhcyBzb29uIGFzIGEgZGF0YSB0cmFuc2ZlcgotCSAqIG9jY3Vycy4K LQkgKi8KLQlzY2ItPmhzY2ItPnNncHRyID0gYWhkX2h0b2xlMzIoc2NiLT5zZ19saXN0X2J1c2Fk ZHJ8U0dfRlVMTF9SRVNJRCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfc2V0dXBf bm94ZmVyX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYikKLXsKLQlz Y2ItPmhzY2ItPnNncHRyID0gYWhkX2h0b2xlMzIoU0dfTElTVF9OVUxMKTsKLQlzY2ItPmhzY2It PmRhdGFwdHIgPSAwOwotCXNjYi0+aHNjYi0+ZGF0YWNudCA9IDA7Ci19Ci0KIC8qKioqKioqKioq KioqKioqKioqKioqKioqKiBNZW1vcnkgbWFwcGluZyByb3V0aW5lcyAqKioqKioqKioqKioqKioq KioqKioqKioqKiovCiBzdGF0aWMgX19pbmxpbmUgc2l6ZV90CWFoZF9zZ19zaXplKHN0cnVjdCBh aGRfc29mdGMgKmFoZCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCAqCi0JCQlhaGRfc2dfYnVzX3Rv X3ZpcnQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQkgICBzdHJ1Y3Qgc2NiICpzY2IsCi0J CQkJCSAgIHVpbnQzMl90IHNnX2J1c2FkZHIpOwotc3RhdGljIF9faW5saW5lIHVpbnQzMl90Ci0J CQlhaGRfc2dfdmlydF90b19idXMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQkgICBzdHJ1 Y3Qgc2NiICpzY2IsCi0JCQkJCSAgIHZvaWQgKnNnKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkCWFo ZF9zeW5jX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJICAgICBzdHJ1Y3Qgc2NiICpz Y2IsIGludCBvcCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfc3luY19zZ2xpc3Qoc3RydWN0 IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQlzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCk7Ci1zdGF0aWMg X19pbmxpbmUgdm9pZAlhaGRfc3luY19zZW5zZShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0JCQkJ ICAgICAgIHN0cnVjdCBzY2IgKnNjYiwgaW50IG9wKTsKLXN0YXRpYyBfX2lubGluZSB1aW50MzJf dAotCQkJYWhkX3RhcmdldGNtZF9vZmZzZXQoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAotCQkJCQkg ICAgIHVfaW50IGluZGV4KTsKIAordm9pZCAqCisJYWhkX3NnX2J1c190b192aXJ0KHN0cnVjdCBh aGRfc29mdGMgKmFoZCwKKwkJCSAgIHN0cnVjdCBzY2IgKnNjYiwKKwkJCSAgIHVpbnQzMl90IHNn X2J1c2FkZHIpOwordWludDMyX3QKKwlhaGRfc2dfdmlydF90b19idXMoc3RydWN0IGFoZF9zb2Z0 YyAqYWhkLAorCQkJICAgc3RydWN0IHNjYiAqc2NiLAorCQkJICAgdm9pZCAqc2cpOwordm9pZAlh aGRfc3luY19zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkgICAgIHN0cnVjdCBzY2IgKnNj YiwgaW50IG9wKTsKK3ZvaWQJYWhkX3N5bmNfc2dsaXN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwK KwkJCXN0cnVjdCBzY2IgKnNjYiwgaW50IG9wKTsKK3ZvaWQJYWhkX3N5bmNfc2Vuc2Uoc3RydWN0 IGFoZF9zb2Z0YyAqYWhkLAorCQkgICAgICAgc3RydWN0IHNjYiAqc2NiLCBpbnQgb3ApOwordWlu dDMyX3QKKwlhaGRfdGFyZ2V0Y21kX29mZnNldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCisJCQkg ICAgIHVfaW50IGluZGV4KTsKKwogc3RhdGljIF9faW5saW5lIHNpemVfdAogYWhkX3NnX3NpemUo c3RydWN0IGFoZF9zb2Z0YyAqYWhkKQogewpAQCAtMzU4LDEwNCArMTQwLDQ4IEBACiAJcmV0dXJu IChzaXplb2Yoc3RydWN0IGFoZF9kbWFfc2VnKSk7CiB9CiAKLXN0YXRpYyBfX2lubGluZSB2b2lk ICoKLWFoZF9zZ19idXNfdG9fdmlydChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2Ig KnNjYiwgdWludDMyX3Qgc2dfYnVzYWRkcikKLXsKLQlkbWFfYWRkcl90IHNnX29mZnNldDsKLQot CS8qIHNnX2xpc3RfcGh5cyBwb2ludHMgdG8gZW50cnkgMSwgbm90IDAgKi8KLQlzZ19vZmZzZXQg PSBzZ19idXNhZGRyIC0gKHNjYi0+c2dfbGlzdF9idXNhZGRyIC0gYWhkX3NnX3NpemUoYWhkKSk7 Ci0JcmV0dXJuICgodWludDhfdCAqKXNjYi0+c2dfbGlzdCArIHNnX29mZnNldCk7Ci19Ci0KLXN0 YXRpYyBfX2lubGluZSB1aW50MzJfdAotYWhkX3NnX3ZpcnRfdG9fYnVzKHN0cnVjdCBhaGRfc29m dGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiLCB2b2lkICpzZykKLXsKLQlkbWFfYWRkcl90IHNnX29m ZnNldDsKLQotCS8qIHNnX2xpc3RfcGh5cyBwb2ludHMgdG8gZW50cnkgMSwgbm90IDAgKi8KLQlz Z19vZmZzZXQgPSAoKHVpbnQ4X3QgKilzZyAtICh1aW50OF90ICopc2NiLT5zZ19saXN0KQotCQkg IC0gYWhkX3NnX3NpemUoYWhkKTsKLQotCXJldHVybiAoc2NiLT5zZ19saXN0X2J1c2FkZHIgKyBz Z19vZmZzZXQpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX3N5bmNfc2NiKHN0cnVj dCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiLCBpbnQgb3ApCi17Ci0JYWhkX2RtYW1h cF9zeW5jKGFoZCwgYWhkLT5zY2JfZGF0YS5oc2NiX2RtYXQsCi0JCQlzY2ItPmhzY2JfbWFwLT5k bWFtYXAsCi0JCQkvKm9mZnNldCovKHVpbnQ4X3QqKXNjYi0+aHNjYiAtIHNjYi0+aHNjYl9tYXAt PnZhZGRyLAotCQkJLypsZW4qL3NpemVvZigqc2NiLT5oc2NiKSwgb3ApOwotfQotCi1zdGF0aWMg X19pbmxpbmUgdm9pZAotYWhkX3N5bmNfc2dsaXN0KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgc3Ry dWN0IHNjYiAqc2NiLCBpbnQgb3ApCi17Ci0JaWYgKHNjYi0+c2dfY291bnQgPT0gMCkKLQkJcmV0 dXJuOwotCi0JYWhkX2RtYW1hcF9zeW5jKGFoZCwgYWhkLT5zY2JfZGF0YS5zZ19kbWF0LAotCQkJ c2NiLT5zZ19tYXAtPmRtYW1hcCwKLQkJCS8qb2Zmc2V0Ki9zY2ItPnNnX2xpc3RfYnVzYWRkciAt IGFoZF9zZ19zaXplKGFoZCksCi0JCQkvKmxlbiovYWhkX3NnX3NpemUoYWhkKSAqIHNjYi0+c2df Y291bnQsIG9wKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9zeW5jX3NlbnNlKHN0 cnVjdCBhaGRfc29mdGMgKmFoZCwgc3RydWN0IHNjYiAqc2NiLCBpbnQgb3ApCi17Ci0JYWhkX2Rt YW1hcF9zeW5jKGFoZCwgYWhkLT5zY2JfZGF0YS5zZW5zZV9kbWF0LAotCQkJc2NiLT5zZW5zZV9t YXAtPmRtYW1hcCwKLQkJCS8qb2Zmc2V0Ki9zY2ItPnNlbnNlX2J1c2FkZHIsCi0JCQkvKmxlbiov QUhEX1NFTlNFX0JVRlNJWkUsIG9wKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVpbnQzMl90Ci1h aGRfdGFyZ2V0Y21kX29mZnNldChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IGluZGV4KQot ewotCXJldHVybiAoKCh1aW50OF90ICopJmFoZC0+dGFyZ2V0Y21kc1tpbmRleF0pCi0JICAgICAg IC0gKHVpbnQ4X3QgKilhaGQtPnFvdXRmaWZvKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioq KioqIE1pc2NlbGFuZW91cyBTdXBwb3J0IEZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioq Ki8KLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqCi0JCQlhaGRf ZmV0Y2hfdHJhbnNpbmZvKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwKLQkJCQkJICAgIGNoYXIgY2hh bm5lbCwgdV9pbnQgb3VyX2lkLAotCQkJCQkgICAgdV9pbnQgcmVtb3RlX2lkLAotCQkJCQkgICAg c3RydWN0IGFoZF90bW9kZV90c3RhdGUgKip0c3RhdGUpOwotc3RhdGljIF9faW5saW5lIHVpbnQx Nl90Ci0JCQlhaGRfaW53KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCk7Ci1zdGF0 aWMgX19pbmxpbmUgdm9pZAlhaGRfb3V0dyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBv cnQsCi0JCQkJIHVfaW50IHZhbHVlKTsKLXN0YXRpYyBfX2lubGluZSB1aW50MzJfdAotCQkJYWhk X2lubChzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQpOwotc3RhdGljIF9faW5saW5l IHZvaWQJYWhkX291dGwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBwb3J0LAotCQkJCSB1 aW50MzJfdCB2YWx1ZSk7Ci1zdGF0aWMgX19pbmxpbmUgdWludDY0X3QKLQkJCWFoZF9pbnEoc3Ry dWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBwb3J0KTsKLXN0YXRpYyBfX2lubGluZSB2b2lkCWFo ZF9vdXRxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCwKLQkJCQkgdWludDY0X3Qg dmFsdWUpOwotc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9nZXRfc2NicHRyKHN0cnVjdCBhaGRf c29mdGMgKmFoZCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfc2V0X3NjYnB0cihzdHJ1Y3Qg YWhkX3NvZnRjICphaGQsIHVfaW50IHNjYnB0cik7Ci1zdGF0aWMgX19pbmxpbmUgdV9pbnQJYWhk X2dldF9obnNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci1zdGF0aWMgX19pbmxpbmUg dm9pZAlhaGRfc2V0X2huc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB2YWx1 ZSk7Ci1zdGF0aWMgX19pbmxpbmUgdV9pbnQJYWhkX2dldF9oZXNjYl9xb2ZmKHN0cnVjdCBhaGRf c29mdGMgKmFoZCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfc2V0X2hlc2NiX3FvZmYoc3Ry dWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB2YWx1ZSk7Ci1zdGF0aWMgX19pbmxpbmUgdV9pbnQJ YWhkX2dldF9zbnNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci1zdGF0aWMgX19pbmxp bmUgdm9pZAlhaGRfc2V0X3Nuc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB2 YWx1ZSk7Ci1zdGF0aWMgX19pbmxpbmUgdV9pbnQJYWhkX2dldF9zZXNjYl9xb2ZmKHN0cnVjdCBh aGRfc29mdGMgKmFoZCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAlhaGRfc2V0X3Nlc2NiX3FvZmYo c3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB2YWx1ZSk7Ci1zdGF0aWMgX19pbmxpbmUgdV9p bnQJYWhkX2dldF9zZHNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCk7Ci1zdGF0aWMgX19p bmxpbmUgdm9pZAlhaGRfc2V0X3Nkc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2lu dCB2YWx1ZSk7Ci1zdGF0aWMgX19pbmxpbmUgdV9pbnQJYWhkX2luYl9zY2JyYW0oc3RydWN0IGFo ZF9zb2Z0YyAqYWhkLCB1X2ludCBvZmZzZXQpOwotc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9p bndfc2NicmFtKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgb2Zmc2V0KTsKLXN0YXRpYyBf X2lubGluZSB1aW50MzJfdAotCQkJYWhkX2lubF9zY2JyYW0oc3RydWN0IGFoZF9zb2Z0YyAqYWhk LCB1X2ludCBvZmZzZXQpOwotc3RhdGljIF9faW5saW5lIHVpbnQ2NF90Ci0JCQlhaGRfaW5xX3Nj YnJhbShzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IG9mZnNldCk7Ci1zdGF0aWMgX19pbmxp bmUgdm9pZAlhaGRfc3dhcF93aXRoX25leHRfaHNjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCi0J CQkJCQlzdHJ1Y3Qgc2NiICpzY2IpOwotc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3F1ZXVlX3Nj YihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHN0cnVjdCBzY2IgKnNjYik7CitzdHJ1Y3QgYWhkX2lu aXRpYXRvcl90aW5mbyAqCisJYWhkX2ZldGNoX3RyYW5zaW5mbyhzdHJ1Y3QgYWhkX3NvZnRjICph aGQsCisJCQkgICAgY2hhciBjaGFubmVsLCB1X2ludCBvdXJfaWQsCisJCQkgICAgdV9pbnQgcmVt b3RlX2lkLAorCQkJICAgIHN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICoqdHN0YXRlKTsKK3VpbnQx Nl90CisJYWhkX2ludyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQpOwordm9pZAlh aGRfb3V0dyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQsCisJCSB1X2ludCB2YWx1 ZSk7Cit1aW50MzJfdAorCWFoZF9pbmwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBwb3J0 KTsKK3ZvaWQJYWhkX291dGwoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCBwb3J0LAorCQkg dWludDMyX3QgdmFsdWUpOwordWludDY0X3QKKwlhaGRfaW5xKHN0cnVjdCBhaGRfc29mdGMgKmFo ZCwgdV9pbnQgcG9ydCk7Cit2b2lkCWFoZF9vdXRxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9p bnQgcG9ydCwKKwkJIHVpbnQ2NF90IHZhbHVlKTsKK3VfaW50CWFoZF9nZXRfc2NicHRyKHN0cnVj dCBhaGRfc29mdGMgKmFoZCk7Cit2b2lkCWFoZF9zZXRfc2NicHRyKHN0cnVjdCBhaGRfc29mdGMg KmFoZCwgdV9pbnQgc2NicHRyKTsKK3VfaW50CWFoZF9nZXRfaG5zY2JfcW9mZihzdHJ1Y3QgYWhk X3NvZnRjICphaGQpOwordm9pZAlhaGRfc2V0X2huc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAq YWhkLCB1X2ludCB2YWx1ZSk7Cit1X2ludAlhaGRfZ2V0X2hlc2NiX3FvZmYoc3RydWN0IGFoZF9z b2Z0YyAqYWhkKTsKK3ZvaWQJYWhkX3NldF9oZXNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFo ZCwgdV9pbnQgdmFsdWUpOwordV9pbnQJYWhkX2dldF9zbnNjYl9xb2ZmKHN0cnVjdCBhaGRfc29m dGMgKmFoZCk7Cit2b2lkCWFoZF9zZXRfc25zY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQs IHVfaW50IHZhbHVlKTsKK3VfaW50CWFoZF9nZXRfc2VzY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRj ICphaGQpOwordm9pZAlhaGRfc2V0X3Nlc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1 X2ludCB2YWx1ZSk7Cit1X2ludAlhaGRfZ2V0X3Nkc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAq YWhkKTsKK3ZvaWQJYWhkX3NldF9zZHNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9p bnQgdmFsdWUpOwordV9pbnQJYWhkX2luYl9zY2JyYW0oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1 X2ludCBvZmZzZXQpOwordV9pbnQJYWhkX2lud19zY2JyYW0oc3RydWN0IGFoZF9zb2Z0YyAqYWhk LCB1X2ludCBvZmZzZXQpOwordWludDMyX3QKKwlhaGRfaW5sX3NjYnJhbShzdHJ1Y3QgYWhkX3Nv ZnRjICphaGQsIHVfaW50IG9mZnNldCk7Cit1aW50NjRfdAorCWFoZF9pbnFfc2NicmFtKHN0cnVj dCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgb2Zmc2V0KTsKK3N0cnVjdCBzY2IgKgorCWFoZF9sb29r dXBfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdGFnKTsKK3ZvaWQJYWhkX3N3YXBf d2l0aF9uZXh0X2hzY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLAorCQkJCXN0cnVjdCBzY2IgKnNj Yik7Cit2b2lkCWFoZF9xdWV1ZV9zY2Ioc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2Ni ICpzY2IpOworCiBzdGF0aWMgX19pbmxpbmUgdWludDhfdCAqCiAJCQlhaGRfZ2V0X3NlbnNlX2J1 ZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsCiAJCQkJCSAgc3RydWN0IHNjYiAqc2NiKTsKQEAgLTQ2 MywyNSArMTg5LDcgQEAKIAkJCWFoZF9nZXRfc2Vuc2VfYnVmYWRkcihzdHJ1Y3QgYWhkX3NvZnRj ICphaGQsCiAJCQkJCSAgICAgIHN0cnVjdCBzY2IgKnNjYik7CiAKLS8qCi0gKiBSZXR1cm4gcG9p bnRlcnMgdG8gdGhlIHRyYW5zZmVyIG5lZ290aWF0aW9uIGluZm9ybWF0aW9uCi0gKiBmb3IgdGhl IHNwZWNpZmllZCBvdXJfaWQvcmVtb3RlX2lkIHBhaXIuCi0gKi8KLXN0YXRpYyBfX2lubGluZSBz dHJ1Y3QgYWhkX2luaXRpYXRvcl90aW5mbyAqCi1haGRfZmV0Y2hfdHJhbnNpbmZvKHN0cnVjdCBh aGRfc29mdGMgKmFoZCwgY2hhciBjaGFubmVsLCB1X2ludCBvdXJfaWQsCi0JCSAgICB1X2ludCBy ZW1vdGVfaWQsIHN0cnVjdCBhaGRfdG1vZGVfdHN0YXRlICoqdHN0YXRlKQotewotCS8qCi0JICog VHJhbnNmZXIgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBzdG9yZWQgZnJvbSB0aGUgcGVyc3BlY3RpdmUK LQkgKiBvZiB0aGUgdGFyZ2V0IHJvbGUuICBTaW5jZSB0aGUgcGFyYW1ldGVycyBmb3IgYSBjb25u ZWN0aW9uCi0JICogaW4gdGhlIGluaXRpYXRvciByb2xlIHRvIGEgZ2l2ZW4gdGFyZ2V0IGFyZSB0 aGUgc2FtZSBhcwotCSAqIHdoZW4gdGhlIHJvbGVzIGFyZSByZXZlcnNlZCwgd2UgcHJldGVuZCB3 ZSBhcmUgdGhlIHRhcmdldC4KLQkgKi8KLQlpZiAoY2hhbm5lbCA9PSAnQicpCi0JCW91cl9pZCAr PSA4OwotCSp0c3RhdGUgPSBhaGQtPmVuYWJsZWRfdGFyZ2V0c1tvdXJfaWRdOwotCXJldHVybiAo JigqdHN0YXRlKS0+dHJhbnNpbmZvW3JlbW90ZV9pZF0pOwotfQorI2lmIDAgLyogdW51c2VkICov CiAKICNkZWZpbmUgQUhEX0NPUFlfQ09MX0lEWChkc3QsIHNyYykJCQkJXAogZG8gewkJCQkJCQkJ XApAQCAtNDg5LDMwNCArMTk3LDcgQEAKIAlkc3QtPmhzY2ItPmx1biA9IHNyYy0+aHNjYi0+bHVu OwkJCVwKIH0gd2hpbGUgKDApCiAKLXN0YXRpYyBfX2lubGluZSB1aW50MTZfdAotYWhkX2ludyhz dHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQpCi17Ci0JLyoKLQkgKiBSZWFkIGhpZ2gg Ynl0ZSBmaXJzdCBhcyBzb21lIHJlZ2lzdGVycyBpbmNyZW1lbnQKLQkgKiBvciBoYXZlIG90aGVy IHNpZGUgZWZmZWN0cyB3aGVuIHRoZSBsb3cgYnl0ZSBpcwotCSAqIHJlYWQuCi0JICovCi0JdWlu dDE2X3QgciA9IGFoZF9pbmIoYWhkLCBwb3J0KzEpIDw8IDg7Ci0JcmV0dXJuIHIgfCBhaGRfaW5i KGFoZCwgcG9ydCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfb3V0dyhzdHJ1Y3Qg YWhkX3NvZnRjICphaGQsIHVfaW50IHBvcnQsIHVfaW50IHZhbHVlKQotewotCS8qCi0JICogV3Jp dGUgbG93IGJ5dGUgZmlyc3QgdG8gYWNjb21vZGF0ZSByZWdpc3RlcnMKLQkgKiBzdWNoIGFzIFBS R01DTlQgd2hlcmUgdGhlIG9yZGVyIG1hdGVycy4KLQkgKi8KLQlhaGRfb3V0YihhaGQsIHBvcnQs IHZhbHVlICYgMHhGRik7Ci0JYWhkX291dGIoYWhkLCBwb3J0KzEsICh2YWx1ZSA+PiA4KSAmIDB4 RkYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdWludDMyX3QKLWFoZF9pbmwoc3RydWN0IGFoZF9z b2Z0YyAqYWhkLCB1X2ludCBwb3J0KQotewotCXJldHVybiAoKGFoZF9pbmIoYWhkLCBwb3J0KSkK LQkgICAgICB8IChhaGRfaW5iKGFoZCwgcG9ydCsxKSA8PCA4KQotCSAgICAgIHwgKGFoZF9pbmIo YWhkLCBwb3J0KzIpIDw8IDE2KQotCSAgICAgIHwgKGFoZF9pbmIoYWhkLCBwb3J0KzMpIDw8IDI0 KSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfb3V0bChzdHJ1Y3QgYWhkX3NvZnRj ICphaGQsIHVfaW50IHBvcnQsIHVpbnQzMl90IHZhbHVlKQotewotCWFoZF9vdXRiKGFoZCwgcG9y dCwgKHZhbHVlKSAmIDB4RkYpOwotCWFoZF9vdXRiKGFoZCwgcG9ydCsxLCAoKHZhbHVlKSA+PiA4 KSAmIDB4RkYpOwotCWFoZF9vdXRiKGFoZCwgcG9ydCsyLCAoKHZhbHVlKSA+PiAxNikgJiAweEZG KTsKLQlhaGRfb3V0YihhaGQsIHBvcnQrMywgKCh2YWx1ZSkgPj4gMjQpICYgMHhGRik7Ci19Ci0K LXN0YXRpYyBfX2lubGluZSB1aW50NjRfdAotYWhkX2lucShzdHJ1Y3QgYWhkX3NvZnRjICphaGQs IHVfaW50IHBvcnQpCi17Ci0JcmV0dXJuICgoYWhkX2luYihhaGQsIHBvcnQpKQotCSAgICAgIHwg KGFoZF9pbmIoYWhkLCBwb3J0KzEpIDw8IDgpCi0JICAgICAgfCAoYWhkX2luYihhaGQsIHBvcnQr MikgPDwgMTYpCi0JICAgICAgfCAoYWhkX2luYihhaGQsIHBvcnQrMykgPDwgMjQpCi0JICAgICAg fCAoKCh1aW50NjRfdClhaGRfaW5iKGFoZCwgcG9ydCs0KSkgPDwgMzIpCi0JICAgICAgfCAoKCh1 aW50NjRfdClhaGRfaW5iKGFoZCwgcG9ydCs1KSkgPDwgNDApCi0JICAgICAgfCAoKCh1aW50NjRf dClhaGRfaW5iKGFoZCwgcG9ydCs2KSkgPDwgNDgpCi0JICAgICAgfCAoKCh1aW50NjRfdClhaGRf aW5iKGFoZCwgcG9ydCs3KSkgPDwgNTYpKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFo ZF9vdXRxKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgcG9ydCwgdWludDY0X3QgdmFsdWUp Ci17Ci0JYWhkX291dGIoYWhkLCBwb3J0LCB2YWx1ZSAmIDB4RkYpOwotCWFoZF9vdXRiKGFoZCwg cG9ydCsxLCAodmFsdWUgPj4gOCkgJiAweEZGKTsKLQlhaGRfb3V0YihhaGQsIHBvcnQrMiwgKHZh bHVlID4+IDE2KSAmIDB4RkYpOwotCWFoZF9vdXRiKGFoZCwgcG9ydCszLCAodmFsdWUgPj4gMjQp ICYgMHhGRik7Ci0JYWhkX291dGIoYWhkLCBwb3J0KzQsICh2YWx1ZSA+PiAzMikgJiAweEZGKTsK LQlhaGRfb3V0YihhaGQsIHBvcnQrNSwgKHZhbHVlID4+IDQwKSAmIDB4RkYpOwotCWFoZF9vdXRi KGFoZCwgcG9ydCs2LCAodmFsdWUgPj4gNDgpICYgMHhGRik7Ci0JYWhkX291dGIoYWhkLCBwb3J0 KzcsICh2YWx1ZSA+PiA1NikgJiAweEZGKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVfaW50Ci1h aGRfZ2V0X3NjYnB0cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0JQUhEX0FTU0VSVF9NT0RF UyhhaGQsIH4oQUhEX01PREVfVU5LTk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSyksCi0JCQkgfihB SERfTU9ERV9VTktOT1dOX01TS3xBSERfTU9ERV9DRkdfTVNLKSk7Ci0JcmV0dXJuIChhaGRfaW5i KGFoZCwgU0NCUFRSKSB8IChhaGRfaW5iKGFoZCwgU0NCUFRSICsgMSkgPDwgOCkpOwotfQotCi1z dGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX3NldF9zY2JwdHIoc3RydWN0IGFoZF9zb2Z0YyAqYWhk LCB1X2ludCBzY2JwdHIpCi17Ci0JQUhEX0FTU0VSVF9NT0RFUyhhaGQsIH4oQUhEX01PREVfVU5L Tk9XTl9NU0t8QUhEX01PREVfQ0ZHX01TSyksCi0JCQkgfihBSERfTU9ERV9VTktOT1dOX01TS3xB SERfTU9ERV9DRkdfTVNLKSk7Ci0JYWhkX291dGIoYWhkLCBTQ0JQVFIsIHNjYnB0ciAmIDB4RkYp OwotCWFoZF9vdXRiKGFoZCwgU0NCUFRSKzEsIChzY2JwdHIgPj4gOCkgJiAweEZGKTsKLX0KLQot c3RhdGljIF9faW5saW5lIHVfaW50Ci1haGRfZ2V0X2huc2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0 YyAqYWhkKQotewotCXJldHVybiAoYWhkX2lud19hdG9taWMoYWhkLCBITlNDQl9RT0ZGKSk7Ci19 Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfc2V0X2huc2NiX3FvZmYoc3RydWN0IGFoZF9z b2Z0YyAqYWhkLCB1X2ludCB2YWx1ZSkKLXsKLQlhaGRfb3V0d19hdG9taWMoYWhkLCBITlNDQl9R T0ZGLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1X2ludAotYWhkX2dldF9oZXNjYl9x b2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQlyZXR1cm4gKGFoZF9pbmIoYWhkLCBIRVND Ql9RT0ZGKSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfc2V0X2hlc2NiX3FvZmYo c3RydWN0IGFoZF9zb2Z0YyAqYWhkLCB1X2ludCB2YWx1ZSkKLXsKLQlhaGRfb3V0YihhaGQsIEhF U0NCX1FPRkYsIHZhbHVlKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVfaW50Ci1haGRfZ2V0X3Nu c2NiX3FvZmYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKQotewotCXVfaW50IG9sZHZhbHVlOwotCi0J QUhEX0FTU0VSVF9NT0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhEX01PREVfQ0NIQU5f TVNLKTsKLQlvbGR2YWx1ZSA9IGFoZF9pbncoYWhkLCBTTlNDQl9RT0ZGKTsKLQlhaGRfb3V0dyhh aGQsIFNOU0NCX1FPRkYsIG9sZHZhbHVlKTsKLQlyZXR1cm4gKG9sZHZhbHVlKTsKLX0KLQotc3Rh dGljIF9faW5saW5lIHZvaWQKLWFoZF9zZXRfc25zY2JfcW9mZihzdHJ1Y3QgYWhkX3NvZnRjICph aGQsIHVfaW50IHZhbHVlKQotewotCUFIRF9BU1NFUlRfTU9ERVMoYWhkLCBBSERfTU9ERV9DQ0hB Tl9NU0ssIEFIRF9NT0RFX0NDSEFOX01TSyk7Ci0JYWhkX291dHcoYWhkLCBTTlNDQl9RT0ZGLCB2 YWx1ZSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1X2ludAotYWhkX2dldF9zZXNjYl9xb2ZmKHN0 cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQlBSERfQVNTRVJUX01PREVTKGFoZCwgQUhEX01PREVf Q0NIQU5fTVNLLCBBSERfTU9ERV9DQ0hBTl9NU0spOwotCXJldHVybiAoYWhkX2luYihhaGQsIFNF U0NCX1FPRkYpKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9zZXRfc2VzY2JfcW9m ZihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHZhbHVlKQotewotCUFIRF9BU1NFUlRfTU9E RVMoYWhkLCBBSERfTU9ERV9DQ0hBTl9NU0ssIEFIRF9NT0RFX0NDSEFOX01TSyk7Ci0JYWhkX291 dGIoYWhkLCBTRVNDQl9RT0ZGLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1X2ludAot YWhkX2dldF9zZHNjYl9xb2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsKLQlBSERfQVNTRVJU X01PREVTKGFoZCwgQUhEX01PREVfQ0NIQU5fTVNLLCBBSERfTU9ERV9DQ0hBTl9NU0spOwotCXJl dHVybiAoYWhkX2luYihhaGQsIFNEU0NCX1FPRkYpIHwgKGFoZF9pbmIoYWhkLCBTRFNDQl9RT0ZG ICsgMSkgPDwgOCkpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX3NldF9zZHNjYl9x b2ZmKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgdmFsdWUpCi17Ci0JQUhEX0FTU0VSVF9N T0RFUyhhaGQsIEFIRF9NT0RFX0NDSEFOX01TSywgQUhEX01PREVfQ0NIQU5fTVNLKTsKLQlhaGRf b3V0YihhaGQsIFNEU0NCX1FPRkYsIHZhbHVlICYgMHhGRik7Ci0JYWhkX291dGIoYWhkLCBTRFND Ql9RT0ZGKzEsICh2YWx1ZSA+PiA4KSAmIDB4RkYpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdV9p bnQKLWFoZF9pbmJfc2NicmFtKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgb2Zmc2V0KQot ewotCXVfaW50IHZhbHVlOwotCi0JLyoKLQkgKiBXb3JrYXJvdW5kIFBDSS1YIFJldiBBLiBoYXJk d2FyZSBidWcuCi0JICogQWZ0ZXIgYSBob3N0IHJlYWQgb2YgU0NCIG1lbW9yeSwgdGhlIGNoaXAK LQkgKiBtYXkgYmVjb21lIGNvbmZ1c2VkIGludG8gdGhpbmtpbmcgcHJlZmV0Y2gKLQkgKiB3YXMg cmVxdWlyZWQuICBUaGlzIHN0YXJ0cyB0aGUgZGlzY2FyZCB0aW1lcgotCSAqIHJ1bm5pbmcgYW5k IGNhbiBjYXVzZSBhbiB1bmV4cGVjdGVkIGRpc2NhcmQKLQkgKiB0aW1lciBpbnRlcnJ1cHQuICBU aGUgd29yayBhcm91bmQgaXMgdG8gcmVhZAotCSAqIGEgbm9ybWFsIHJlZ2lzdGVyIHByaW9yIHRv IHRoZSBleGhhdXN0aW9uIG9mCi0JICogdGhlIGRpc2NhcmQgdGltZXIuICBUaGUgbW9kZSBwb2lu dGVyIHJlZ2lzdGVyCi0JICogaGFzIG5vIHNpZGUgZWZmZWN0cyBhbmQgc28gc2VydmVzIHdlbGwg Zm9yCi0JICogdGhpcyBwdXJwb3NlLgotCSAqCi0JICogUmF6b3IgIzUyOAotCSAqLwotCXZhbHVl ID0gYWhkX2luYihhaGQsIG9mZnNldCk7Ci0JaWYgKChhaGQtPmJ1Z3MgJiBBSERfUENJWF9TQ0JS QU1fUkRfQlVHKSAhPSAwKQotCQlhaGRfaW5iKGFoZCwgTU9ERV9QVFIpOwotCXJldHVybiAodmFs dWUpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdV9pbnQKLWFoZF9pbndfc2NicmFtKHN0cnVjdCBh aGRfc29mdGMgKmFoZCwgdV9pbnQgb2Zmc2V0KQotewotCXJldHVybiAoYWhkX2luYl9zY2JyYW0o YWhkLCBvZmZzZXQpCi0JICAgICAgfCAoYWhkX2luYl9zY2JyYW0oYWhkLCBvZmZzZXQrMSkgPDwg OCkpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdWludDMyX3QKLWFoZF9pbmxfc2NicmFtKHN0cnVj dCBhaGRfc29mdGMgKmFoZCwgdV9pbnQgb2Zmc2V0KQotewotCXJldHVybiAoYWhkX2lud19zY2Jy YW0oYWhkLCBvZmZzZXQpCi0JICAgICAgfCAoYWhkX2lud19zY2JyYW0oYWhkLCBvZmZzZXQrMikg PDwgMTYpKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHVpbnQ2NF90Ci1haGRfaW5xX3NjYnJhbShz dHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IG9mZnNldCkKLXsKLQlyZXR1cm4gKGFoZF9pbmxf c2NicmFtKGFoZCwgb2Zmc2V0KQotCSAgICAgIHwgKCh1aW50NjRfdClhaGRfaW5sX3NjYnJhbShh aGQsIG9mZnNldCs0KSkgPDwgMzIpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgc3RydWN0IHNjYiAq Ci1haGRfbG9va3VwX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIHVfaW50IHRhZykKLXsKLQlz dHJ1Y3Qgc2NiKiBzY2I7Ci0KLQlpZiAodGFnID49IEFIRF9TQ0JfTUFYKQotCQlyZXR1cm4gKE5V TEwpOwotCXNjYiA9IGFoZC0+c2NiX2RhdGEuc2NiaW5kZXhbdGFnXTsKLQlpZiAoc2NiICE9IE5V TEwpCi0JCWFoZF9zeW5jX3NjYihhaGQsIHNjYiwKLQkJCSAgICAgQlVTX0RNQVNZTkNfUE9TVFJF QUR8QlVTX0RNQVNZTkNfUE9TVFdSSVRFKTsKLQlyZXR1cm4gKHNjYik7Ci19Ci0KLXN0YXRpYyBf X2lubGluZSB2b2lkCi1haGRfc3dhcF93aXRoX25leHRfaHNjYihzdHJ1Y3QgYWhkX3NvZnRjICph aGQsIHN0cnVjdCBzY2IgKnNjYikKLXsKLQlzdHJ1Y3QJIGhhcmR3YXJlX3NjYiAqcV9oc2NiOwot CXN0cnVjdAkgbWFwX25vZGUgKnFfaHNjYl9tYXA7Ci0JdWludDMyX3Qgc2F2ZWRfaHNjYl9idXNh ZGRyOwotCi0JLyoKLQkgKiBPdXIgcXVldWluZyBtZXRob2QgaXMgYSBiaXQgdHJpY2t5LiAgVGhl IGNhcmQKLQkgKiBrbm93cyBpbiBhZHZhbmNlIHdoaWNoIEhTQ0IgKGJ5IGFkZHJlc3MpIHRvIGRv d25sb2FkLAotCSAqIGFuZCB3ZSBjYW4ndCBkaXNhcHBvaW50IGl0LiAgVG8gYWNoaWV2ZSB0aGlz LCB0aGUgbmV4dAotCSAqIEhTQ0IgdG8gZG93bmxvYWQgaXMgc2F2ZWQgb2ZmIGluIGFoZC0+bmV4 dF9xdWV1ZWRfaHNjYi4KLQkgKiBXaGVuIHdlIGFyZSBjYWxsZWQgdG8gcXVldWUgImFuIGFyYml0 cmFyeSBzY2IiLAotCSAqIHdlIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbmNvbWluZyBIU0NC IHRvIHRoZSBvbmUKLQkgKiB0aGUgc2VxdWVuY2VyIGtub3dzIGFib3V0LCBzd2FwIEhTQ0IgcG9p bnRlcnMgYW5kCi0JICogZmluYWxseSBhc3NpZ24gdGhlIFNDQiB0byB0aGUgdGFnIGluZGV4ZWQg bG9jYXRpb24KLQkgKiBpbiB0aGUgc2NiX2FycmF5LiAgVGhpcyBtYWtlcyBzdXJlIHRoYXQgd2Ug Y2FuIHN0aWxsCi0JICogbG9jYXRlIHRoZSBjb3JyZWN0IFNDQiBieSBTQ0JfVEFHLgotCSAqLwot CXFfaHNjYiA9IGFoZC0+bmV4dF9xdWV1ZWRfaHNjYjsKLQlxX2hzY2JfbWFwID0gYWhkLT5uZXh0 X3F1ZXVlZF9oc2NiX21hcDsKLQlzYXZlZF9oc2NiX2J1c2FkZHIgPSBxX2hzY2ItPmhzY2JfYnVz YWRkcjsKLQltZW1jcHkocV9oc2NiLCBzY2ItPmhzY2IsIHNpemVvZigqc2NiLT5oc2NiKSk7Ci0J cV9oc2NiLT5oc2NiX2J1c2FkZHIgPSBzYXZlZF9oc2NiX2J1c2FkZHI7Ci0JcV9oc2NiLT5uZXh0 X2hzY2JfYnVzYWRkciA9IHNjYi0+aHNjYi0+aHNjYl9idXNhZGRyOwotCi0JLyogTm93IHN3YXAg SFNDQiBwb2ludGVycy4gKi8KLQlhaGQtPm5leHRfcXVldWVkX2hzY2IgPSBzY2ItPmhzY2I7Ci0J YWhkLT5uZXh0X3F1ZXVlZF9oc2NiX21hcCA9IHNjYi0+aHNjYl9tYXA7Ci0Jc2NiLT5oc2NiID0g cV9oc2NiOwotCXNjYi0+aHNjYl9tYXAgPSBxX2hzY2JfbWFwOwotCi0JLyogTm93IGRlZmluZSB0 aGUgbWFwcGluZyBmcm9tIHRhZyB0byBTQ0IgaW4gdGhlIHNjYmluZGV4ICovCi0JYWhkLT5zY2Jf ZGF0YS5zY2JpbmRleFtTQ0JfR0VUX1RBRyhzY2IpXSA9IHNjYjsKLX0KLQotLyoKLSAqIFRlbGwg dGhlIHNlcXVlbmNlciBhYm91dCBhIG5ldyB0cmFuc2FjdGlvbiB0byBleGVjdXRlLgotICovCi1z dGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX3F1ZXVlX3NjYihzdHJ1Y3QgYWhkX3NvZnRjICphaGQs IHN0cnVjdCBzY2IgKnNjYikKLXsKLQlhaGRfc3dhcF93aXRoX25leHRfaHNjYihhaGQsIHNjYik7 Ci0KLQlpZiAoU0NCSURfSVNfTlVMTChTQ0JfR0VUX1RBRyhzY2IpKSkKLQkJcGFuaWMoIkF0dGVt cHQgdG8gcXVldWUgaW52YWxpZCBTQ0IgdGFnICV4XG4iLAotCQkgICAgICBTQ0JfR0VUX1RBRyhz Y2IpKTsKLQotCS8qCi0JICogS2VlcCBhIGhpc3Rvcnkgb2YgU0NCcyB3ZSd2ZSBkb3dubG9hZGVk IGluIHRoZSBxaW5maWZvLgotCSAqLwotCWFoZC0+cWluZmlmb1tBSERfUUlOX1dSQVAoYWhkLT5x aW5maWZvbmV4dCldID0gU0NCX0dFVF9UQUcoc2NiKTsKLQlhaGQtPnFpbmZpZm9uZXh0Kys7Ci0K LQlpZiAoc2NiLT5zZ19jb3VudCAhPSAwKQotCQlhaGRfc2V0dXBfZGF0YV9zY2IoYWhkLCBzY2Ip OwotCWVsc2UKLQkJYWhkX3NldHVwX25veGZlcl9zY2IoYWhkLCBzY2IpOwotCWFoZF9zZXR1cF9z Y2JfY29tbW9uKGFoZCwgc2NiKTsKLQotCS8qCi0JICogTWFrZSBzdXJlIG91ciBkYXRhIGlzIGNv bnNpc3RlbnQgZnJvbSB0aGUKLQkgKiBwZXJzcGVjdGl2ZSBvZiB0aGUgYWRhcHRlci4KLQkgKi8K LQlhaGRfc3luY19zY2IoYWhkLCBzY2IsIEJVU19ETUFTWU5DX1BSRVJFQUR8QlVTX0RNQVNZTkNf UFJFV1JJVEUpOwotCi0jaWZkZWYgQUhEX0RFQlVHCi0JaWYgKChhaGRfZGVidWcgJiBBSERfU0hP V19RVUVVRSkgIT0gMCkgewotCQl1aW50NjRfdCBob3N0X2RhdGFwdHI7Ci0KLQkJaG9zdF9kYXRh cHRyID0gYWhkX2xlNjR0b2goc2NiLT5oc2NiLT5kYXRhcHRyKTsKLQkJcHJpbnRmKCIlczogUXVl dWVpbmcgU0NCICVkOjB4JXggYnVzIGFkZHIgMHgleCAtIDB4JXgleC8weCV4XG4iLAotCQkgICAg ICAgYWhkX25hbWUoYWhkKSwKLQkJICAgICAgIFNDQl9HRVRfVEFHKHNjYiksIHNjYi0+aHNjYi0+ c2NzaWlkLAotCQkgICAgICAgYWhkX2xlMzJ0b2goc2NiLT5oc2NiLT5oc2NiX2J1c2FkZHIpLAot CQkgICAgICAgKHVfaW50KSgoaG9zdF9kYXRhcHRyID4+IDMyKSAmIDB4RkZGRkZGRkYpLAotCQkg ICAgICAgKHVfaW50KShob3N0X2RhdGFwdHIgJiAweEZGRkZGRkZGKSwKLQkJICAgICAgIGFoZF9s ZTMydG9oKHNjYi0+aHNjYi0+ZGF0YWNudCkpOwotCX0KICNlbmRpZgotCS8qIFRlbGwgdGhlIGFk YXB0ZXIgYWJvdXQgdGhlIG5ld2x5IHF1ZXVlZCBTQ0IgKi8KLQlhaGRfc2V0X2huc2NiX3FvZmYo YWhkLCBhaGQtPnFpbmZpZm9uZXh0KTsKLX0KIAogc3RhdGljIF9faW5saW5lIHVpbnQ4X3QgKgog YWhkX2dldF9zZW5zZV9idWYoc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBzdHJ1Y3Qgc2NiICpzY2Ip CkBAIC04MDEsMTUxICsyMTIsOSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiog SW50ZXJydXB0IFByb2Nlc3NpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3Rh dGljIF9faW5saW5lIHZvaWQJYWhkX3N5bmNfcW91dGZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhk LCBpbnQgb3ApOwotc3RhdGljIF9faW5saW5lIHZvaWQJYWhkX3N5bmNfdHFpbmZpZm8oc3RydWN0 IGFoZF9zb2Z0YyAqYWhkLCBpbnQgb3ApOwotc3RhdGljIF9faW5saW5lIHVfaW50CWFoZF9jaGVj a19jbWRjbXBsdHF1ZXVlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotc3RhdGljIF9faW5saW5l IGludAlhaGRfaW50cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOwotCi1zdGF0aWMgX19pbmxpbmUg dm9pZAotYWhkX3N5bmNfcW91dGZpZm8oc3RydWN0IGFoZF9zb2Z0YyAqYWhkLCBpbnQgb3ApCi17 Ci0JYWhkX2RtYW1hcF9zeW5jKGFoZCwgYWhkLT5zaGFyZWRfZGF0YV9kbWF0LCBhaGQtPnNoYXJl ZF9kYXRhX21hcC5kbWFtYXAsCi0JCQkvKm9mZnNldCovMCwKLQkJCS8qbGVuKi9BSERfU0NCX01B WCAqIHNpemVvZihzdHJ1Y3QgYWhkX2NvbXBsZXRpb24pLCBvcCk7Ci19Ci0KLXN0YXRpYyBfX2lu bGluZSB2b2lkCi1haGRfc3luY190cWluZmlmbyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCBv cCkKLXsKLSNpZmRlZiBBSERfVEFSR0VUX01PREUKLQlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfVEFS R0VUUk9MRSkgIT0gMCkgewotCQlhaGRfZG1hbWFwX3N5bmMoYWhkLCBhaGQtPnNoYXJlZF9kYXRh X2RtYXQsCi0JCQkJYWhkLT5zaGFyZWRfZGF0YV9tYXAuZG1hbWFwLAotCQkJCWFoZF90YXJnZXRj bWRfb2Zmc2V0KGFoZCwgMCksCi0JCQkJc2l6ZW9mKHN0cnVjdCB0YXJnZXRfY21kKSAqIEFIRF9U TU9ERV9DTURTLAotCQkJCW9wKTsKLQl9Ci0jZW5kaWYKLX0KLQotLyoKLSAqIFNlZSBpZiB0aGUg ZmlybXdhcmUgaGFzIHBvc3RlZCBhbnkgY29tcGxldGVkIGNvbW1hbmRzCi0gKiBpbnRvIG91ciBp bi1jb3JlIGNvbW1hbmQgY29tcGxldGUgZmlmb3MuCi0gKi8KLSNkZWZpbmUgQUhEX1JVTl9RT1VU RklGTyAweDEKLSNkZWZpbmUgQUhEX1JVTl9UUUlORklGTyAweDIKLXN0YXRpYyBfX2lubGluZSB1 X2ludAotYWhkX2NoZWNrX2NtZGNtcGx0cXVldWVzKHN0cnVjdCBhaGRfc29mdGMgKmFoZCkKLXsK LQl1X2ludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSAwOwotCWFoZF9kbWFtYXBfc3luYyhhaGQsIGFo ZC0+c2hhcmVkX2RhdGFfZG1hdCwgYWhkLT5zaGFyZWRfZGF0YV9tYXAuZG1hbWFwLAotCQkJLypv ZmZzZXQqL2FoZC0+cW91dGZpZm9uZXh0ICogc2l6ZW9mKCphaGQtPnFvdXRmaWZvKSwKLQkJCS8q bGVuKi9zaXplb2YoKmFoZC0+cW91dGZpZm8pLCBCVVNfRE1BU1lOQ19QT1NUUkVBRCk7Ci0JaWYg KGFoZC0+cW91dGZpZm9bYWhkLT5xb3V0Zmlmb25leHRdLnZhbGlkX3RhZwotCSAgPT0gYWhkLT5x b3V0Zmlmb25leHRfdmFsaWRfdGFnKQotCQlyZXR2YWwgfD0gQUhEX1JVTl9RT1VURklGTzsKLSNp ZmRlZiBBSERfVEFSR0VUX01PREUKLQlpZiAoKGFoZC0+ZmxhZ3MgJiBBSERfVEFSR0VUUk9MRSkg IT0gMAotCSAmJiAoYWhkLT5mbGFncyAmIEFIRF9UUUlORklGT19CTE9DS0VEKSA9PSAwKSB7Ci0J CWFoZF9kbWFtYXBfc3luYyhhaGQsIGFoZC0+c2hhcmVkX2RhdGFfZG1hdCwKLQkJCQlhaGQtPnNo YXJlZF9kYXRhX21hcC5kbWFtYXAsCi0JCQkJYWhkX3RhcmdldGNtZF9vZmZzZXQoYWhkLCBhaGQt PnRxaW5maWZvZm5leHQpLAotCQkJCS8qbGVuKi9zaXplb2Yoc3RydWN0IHRhcmdldF9jbWQpLAot CQkJCUJVU19ETUFTWU5DX1BPU1RSRUFEKTsKLQkJaWYgKGFoZC0+dGFyZ2V0Y21kc1thaGQtPnRx aW5maWZvbmV4dF0uY21kX3ZhbGlkICE9IDApCi0JCQlyZXR2YWwgfD0gQUhEX1JVTl9UUUlORklG TzsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gKHJldHZhbCk7Ci19Ci0KLS8qCi0gKiBDYXRjaCBhbiBp bnRlcnJ1cHQgZnJvbSB0aGUgYWRhcHRlcgotICovCi1zdGF0aWMgX19pbmxpbmUgaW50Ci1haGRf aW50cihzdHJ1Y3QgYWhkX3NvZnRjICphaGQpCi17Ci0JdV9pbnQJaW50c3RhdDsKLQotCWlmICgo YWhkLT5wYXVzZSAmIElOVEVOKSA9PSAwKSB7Ci0JCS8qCi0JCSAqIE91ciBpbnRlcnJ1cHQgaXMg bm90IGVuYWJsZWQgb24gdGhlIGNoaXAKLQkJICogYW5kIG1heSBiZSBkaXNhYmxlZCBmb3IgcmUt ZW50cmFuY3kgcmVhc29ucywKLQkJICogc28ganVzdCByZXR1cm4uICBUaGlzIGlzIGxpa2VseSBq dXN0IGEgc2hhcmVkCi0JCSAqIGludGVycnVwdC4KLQkJICovCi0JCXJldHVybiAoMCk7Ci0JfQot Ci0JLyoKLQkgKiBJbnN0ZWFkIG9mIGRpcmVjdGx5IHJlYWRpbmcgdGhlIGludGVycnVwdCBzdGF0 dXMgcmVnaXN0ZXIsCi0JICogaW5mZXIgdGhlIGNhdXNlIG9mIHRoZSBpbnRlcnJ1cHQgYnkgY2hl Y2tpbmcgb3VyIGluLWNvcmUKLQkgKiBjb21wbGV0aW9uIHF1ZXVlcy4gIFRoaXMgYXZvaWRzIGEg Y29zdGx5IFBDSSBidXMgcmVhZCBpbgotCSAqIG1vc3QgY2FzZXMuCi0JICovCi0JaWYgKChhaGQt PmZsYWdzICYgQUhEX0FMTF9JTlRFUlJVUFRTKSA9PSAwCi0JICYmIChhaGRfY2hlY2tfY21kY21w bHRxdWV1ZXMoYWhkKSAhPSAwKSkKLQkJaW50c3RhdCA9IENNRENNUExUOwotCWVsc2UKLQkJaW50 c3RhdCA9IGFoZF9pbmIoYWhkLCBJTlRTVEFUKTsKLQotCWlmICgoaW50c3RhdCAmIElOVF9QRU5E KSA9PSAwKQotCQlyZXR1cm4gKDApOwotCi0JaWYgKGludHN0YXQgJiBDTURDTVBMVCkgewotCQlh aGRfb3V0YihhaGQsIENMUklOVCwgQ0xSQ01ESU5UKTsKLQotCQkvKgotCQkgKiBFbnN1cmUgdGhh dCB0aGUgY2hpcCBzZWVzIHRoYXQgd2UndmUgY2xlYXJlZAotCQkgKiB0aGlzIGludGVycnVwdCBi ZWZvcmUgd2Ugd2FsayB0aGUgb3V0cHV0IGZpZm8uCi0JCSAqIE90aGVyd2lzZSwgd2UgbWF5LCBk dWUgdG8gcG9zdGVkIGJ1cyB3cml0ZXMsCi0JCSAqIGNsZWFyIHRoZSBpbnRlcnJ1cHQgYWZ0ZXIg d2UgZmluaXNoIHRoZSBzY2FuLAotCQkgKiBhbmQgYWZ0ZXIgdGhlIHNlcXVlbmNlciBoYXMgYWRk ZWQgbmV3IGVudHJpZXMKLQkJICogYW5kIGFzc2VydGVkIHRoZSBpbnRlcnJ1cHQgYWdhaW4uCi0J CSAqLwotCQlpZiAoKGFoZC0+YnVncyAmIEFIRF9JTlRDT0xMSVNJT05fQlVHKSAhPSAwKSB7Ci0J CQlpZiAoYWhkX2lzX3BhdXNlZChhaGQpKSB7Ci0JCQkJLyoKLQkJCQkgKiBQb3RlbnRpYWxseSBs b3N0IFNFUUlOVC4KLQkJCQkgKiBJZiBTRVFJTlRDT0RFIGlzIG5vbi16ZXJvLAotCQkJCSAqIHNp bXVsYXRlIHRoZSBTRVFJTlQuCi0JCQkJICovCi0JCQkJaWYgKGFoZF9pbmIoYWhkLCBTRVFJTlRD T0RFKSAhPSBOT19TRVFJTlQpCi0JCQkJCWludHN0YXQgfD0gU0VRSU5UOwotCQkJfQotCQl9IGVs c2UgewotCQkJYWhkX2ZsdXNoX2RldmljZV93cml0ZXMoYWhkKTsKLQkJfQotCQlhaGRfcnVuX3Fv dXRmaWZvKGFoZCk7Ci0JCWFoZC0+Y21kY21wbHRfY291bnRzW2FoZC0+Y21kY21wbHRfYnVja2V0 XSsrOwotCQlhaGQtPmNtZGNtcGx0X3RvdGFsKys7Ci0jaWZkZWYgQUhEX1RBUkdFVF9NT0RFCi0J CWlmICgoYWhkLT5mbGFncyAmIEFIRF9UQVJHRVRST0xFKSAhPSAwKQotCQkJYWhkX3J1bl90cWlu ZmlmbyhhaGQsIC8qcGF1c2VkKi9GQUxTRSk7Ci0jZW5kaWYKLQl9Ci0KLQkvKgotCSAqIEhhbmRs ZSBzdGF0dXNlcyB0aGF0IG1heSBpbnZhbGlkYXRlIG91ciBjYWNoZWQKLQkgKiBjb3B5IG9mIElO VFNUQVQgc2VwYXJhdGVseS4KLQkgKi8KLQlpZiAoaW50c3RhdCA9PSAweEZGICYmIChhaGQtPmZl YXR1cmVzICYgQUhEX1JFTU9WQUJMRSkgIT0gMCkgewotCQkvKiBIb3QgZWplY3QuICBEbyBub3Ro aW5nICovCi0JfSBlbHNlIGlmIChpbnRzdGF0ICYgSFdFUlJJTlQpIHsKLQkJYWhkX2hhbmRsZV9o d2VycmludChhaGQpOwotCX0gZWxzZSBpZiAoKGludHN0YXQgJiAoUENJSU5UfFNQTFRJTlQpKSAh PSAwKSB7Ci0JCWFoZC0+YnVzX2ludHIoYWhkKTsKLQl9IGVsc2UgewotCi0JCWlmICgoaW50c3Rh dCAmIFNFUUlOVCkgIT0gMCkKLQkJCWFoZF9oYW5kbGVfc2VxaW50KGFoZCwgaW50c3RhdCk7Ci0K LQkJaWYgKChpbnRzdGF0ICYgU0NTSUlOVCkgIT0gMCkKLQkJCWFoZF9oYW5kbGVfc2NzaWludChh aGQsIGludHN0YXQpOwotCX0KLQlyZXR1cm4gKDEpOwotfQordm9pZAlhaGRfc3luY19xb3V0Zmlm byhzdHJ1Y3QgYWhkX3NvZnRjICphaGQsIGludCBvcCk7Cit2b2lkCWFoZF9zeW5jX3RxaW5maWZv KHN0cnVjdCBhaGRfc29mdGMgKmFoZCwgaW50IG9wKTsKK3VfaW50CWFoZF9jaGVja19jbWRjbXBs dHF1ZXVlcyhzdHJ1Y3QgYWhkX3NvZnRjICphaGQpOworaW50CWFoZF9pbnRyKHN0cnVjdCBhaGRf c29mdGMgKmFoZCk7CiAKICNlbmRpZiAgLyogX0FJQzc5WFhfSU5MSU5FX0hfICovCi0tLSBsaW51 eC0yLjYuMjMtcmMxLm9yZy9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3OXh4X29zbS5jCVR1ZSBK dWwgMzEgMDA6MzA6MjkgMjAwNworKysgbGludXgtMi42LjIzLXJjMS5haWMvZHJpdmVycy9zY3Np L2FpYzd4eHgvYWljNzl4eF9vc20uYwlUdWUgSnVsIDMxIDAwOjQ3OjQwIDIwMDcKQEAgLTM2OSwx MCArMzY5LDE2NiBAQAogc3RhdGljIGludCBhaGRfbGludXhfdW5pdDsKIAogCisvKioqKioqKioq KioqKioqKioqKioqKioqKiogT1MgVXRpbGl0eSBXcmFwcGVycyAqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqLwordm9pZCBhaGRfZGVsYXkobG9uZyk7Cit2b2lkCithaGRfZGVsYXkobG9u ZyB1c2VjKQoreworCS8qCisJICogdWRlbGF5IG9uIExpbnV4IGNhbiBoYXZlIHByb2JsZW1zIGZv cgorCSAqIG11bHRpLW1pbGxpc2Vjb25kIHdhaXRzLiAgV2FpdCBhdCBtb3N0CisJICogMTAyNHVz IHBlciBjYWxsLgorCSAqLworCXdoaWxlICh1c2VjID4gMCkgeworCQl1ZGVsYXkodXNlYyAlIDEw MjQpOworCQl1c2VjIC09IDEwMjQ7CisJfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioq KioqKioqKiBMb3cgTGV2ZWwgSS9PICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov Cit1aW50OF90IGFoZF9pbmIoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0KTsKK3Vp bnQxNl90IGFoZF9pbndfYXRvbWljKHN0cnVjdCBhaGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCk7 Cit2b2lkIGFoZF9vdXRiKHN0cnVjdCBhaGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCwgdWludDhf dCB2YWwpOwordm9pZCBhaGRfb3V0d19hdG9taWMoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwKKwkJ CQkgICAgIGxvbmcgcG9ydCwgdWludDE2X3QgdmFsKTsKK3ZvaWQgYWhkX291dHNiKHN0cnVjdCBh aGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCwKKwkJCSAgICAgICB1aW50OF90ICosIGludCBjb3Vu dCk7Cit2b2lkIGFoZF9pbnNiKHN0cnVjdCBhaGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCwKKwkJ CSAgICAgICB1aW50OF90ICosIGludCBjb3VudCk7CisKK3VpbnQ4X3QKK2FoZF9pbmIoc3RydWN0 IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0KQoreworCXVpbnQ4X3QgeDsKKworCWlmIChhaGQt PnRhZ3NbMF0gPT0gQlVTX1NQQUNFX01FTUlPKSB7CisJCXggPSByZWFkYihhaGQtPmJzaHNbMF0u bWFkZHIgKyBwb3J0KTsKKwl9IGVsc2UgeworCQl4ID0gaW5iKGFoZC0+YnNoc1socG9ydCkgPj4g OF0uaW9wb3J0ICsgKChwb3J0KSAmIDB4RkYpKTsKKwl9CisJbWIoKTsKKwlyZXR1cm4gKHgpOwor fQorCit1aW50MTZfdAorYWhkX2lud19hdG9taWMoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9u ZyBwb3J0KQoreworCXVpbnQ4X3QgeDsKKworCWlmIChhaGQtPnRhZ3NbMF0gPT0gQlVTX1NQQUNF X01FTUlPKSB7CisJCXggPSByZWFkdyhhaGQtPmJzaHNbMF0ubWFkZHIgKyBwb3J0KTsKKwl9IGVs c2UgeworCQl4ID0gaW53KGFoZC0+YnNoc1socG9ydCkgPj4gOF0uaW9wb3J0ICsgKChwb3J0KSAm IDB4RkYpKTsKKwl9CisJbWIoKTsKKwlyZXR1cm4gKHgpOworfQorCit2b2lkCithaGRfb3V0Yihz dHJ1Y3QgYWhkX3NvZnRjICogYWhkLCBsb25nIHBvcnQsIHVpbnQ4X3QgdmFsKQoreworCWlmIChh aGQtPnRhZ3NbMF0gPT0gQlVTX1NQQUNFX01FTUlPKSB7CisJCXdyaXRlYih2YWwsIGFoZC0+YnNo c1swXS5tYWRkciArIHBvcnQpOworCX0gZWxzZSB7CisJCW91dGIodmFsLCBhaGQtPmJzaHNbKHBv cnQpID4+IDhdLmlvcG9ydCArIChwb3J0ICYgMHhGRikpOworCX0KKwltYigpOworfQorCit2b2lk CithaGRfb3V0d19hdG9taWMoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0LCB1aW50 MTZfdCB2YWwpCit7CisJaWYgKGFoZC0+dGFnc1swXSA9PSBCVVNfU1BBQ0VfTUVNSU8pIHsKKwkJ d3JpdGV3KHZhbCwgYWhkLT5ic2hzWzBdLm1hZGRyICsgcG9ydCk7CisJfSBlbHNlIHsKKwkJb3V0 dyh2YWwsIGFoZC0+YnNoc1socG9ydCkgPj4gOF0uaW9wb3J0ICsgKHBvcnQgJiAweEZGKSk7CisJ fQorCW1iKCk7Cit9CisKK3ZvaWQKK2FoZF9vdXRzYihzdHJ1Y3QgYWhkX3NvZnRjICogYWhkLCBs b25nIHBvcnQsIHVpbnQ4X3QgKmFycmF5LCBpbnQgY291bnQpCit7CisJaW50IGk7CisKKwkvKgor CSAqIFRoZXJlIGlzIHByb2JhYmx5IGEgbW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMgb24g TGludXgKKwkgKiBidXQgd2UgZG9uJ3QgdXNlIHRoaXMgZm9yIGFueXRoaW5nIHNwZWVkIGNyaXRp Y2FsIGFuZCB0aGlzCisJICogc2hvdWxkIHdvcmsuCisJICovCisJZm9yIChpID0gMDsgaSA8IGNv dW50OyBpKyspCisJCWFoZF9vdXRiKGFoZCwgcG9ydCwgKmFycmF5KyspOworfQorCit2b2lkCith aGRfaW5zYihzdHJ1Y3QgYWhkX3NvZnRjICogYWhkLCBsb25nIHBvcnQsIHVpbnQ4X3QgKmFycmF5 LCBpbnQgY291bnQpCit7CisJaW50IGk7CisKKwkvKgorCSAqIFRoZXJlIGlzIHByb2JhYmx5IGEg bW9yZSBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMgb24gTGludXgKKwkgKiBidXQgd2UgZG9uJ3Qg dXNlIHRoaXMgZm9yIGFueXRoaW5nIHNwZWVkIGNyaXRpY2FsIGFuZCB0aGlzCisJICogc2hvdWxk IHdvcmsuCisJICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCSphcnJheSsrID0g YWhkX2luYihhaGQsIHBvcnQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiBQQ0kgUm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWludDMy X3QKK2FoZF9wY2lfcmVhZF9jb25maWcoYWhkX2Rldl9zb2Z0Y190IHBjaSwgaW50IHJlZywgaW50 IHdpZHRoKQoreworCXN3aXRjaCAod2lkdGgpIHsKKwljYXNlIDE6CisJeworCQl1aW50OF90IHJl dHZhbDsKKworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2ksIHJlZywgJnJldHZhbCk7CisJCXJl dHVybiAocmV0dmFsKTsKKwl9CisJY2FzZSAyOgorCXsKKwkJdWludDE2X3QgcmV0dmFsOworCQlw Y2lfcmVhZF9jb25maWdfd29yZChwY2ksIHJlZywgJnJldHZhbCk7CisJCXJldHVybiAocmV0dmFs KTsKKwl9CisJY2FzZSA0OgorCXsKKwkJdWludDMyX3QgcmV0dmFsOworCQlwY2lfcmVhZF9jb25m aWdfZHdvcmQocGNpLCByZWcsICZyZXR2YWwpOworCQlyZXR1cm4gKHJldHZhbCk7CisJfQorCWRl ZmF1bHQ6CisJCXBhbmljKCJhaGRfcGNpX3JlYWRfY29uZmlnOiBSZWFkIHNpemUgdG9vIGJpZyIp OworCQkvKiBOT1RSRUFDSEVEICovCisJCXJldHVybiAoMCk7CisJfQorfQorCit2b2lkCithaGRf cGNpX3dyaXRlX2NvbmZpZyhhaGRfZGV2X3NvZnRjX3QgcGNpLCBpbnQgcmVnLCB1aW50MzJfdCB2 YWx1ZSwgaW50IHdpZHRoKQoreworCXN3aXRjaCAod2lkdGgpIHsKKwljYXNlIDE6CisJCXBjaV93 cml0ZV9jb25maWdfYnl0ZShwY2ksIHJlZywgdmFsdWUpOworCQlicmVhazsKKwljYXNlIDI6CisJ CXBjaV93cml0ZV9jb25maWdfd29yZChwY2ksIHJlZywgdmFsdWUpOworCQlicmVhazsKKwljYXNl IDQ6CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpLCByZWcsIHZhbHVlKTsKKwkJYnJlYWs7 CisJZGVmYXVsdDoKKwkJcGFuaWMoImFoZF9wY2lfd3JpdGVfY29uZmlnOiBXcml0ZSBzaXplIHRv byBiaWciKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KK30KKwogLyoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiBJbmxpbmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8KLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9saW51eF91bm1hcF9zY2Ioc3RydWN0IGFo ZF9zb2Z0YyosIHN0cnVjdCBzY2IqKTsKK3N0YXRpYyB2b2lkIGFoZF9saW51eF91bm1hcF9zY2Io c3RydWN0IGFoZF9zb2Z0YyosIHN0cnVjdCBzY2IqKTsKIAotc3RhdGljIF9faW5saW5lIHZvaWQK K3N0YXRpYyB2b2lkCiBhaGRfbGludXhfdW5tYXBfc2NiKHN0cnVjdCBhaGRfc29mdGMgKmFoZCwg c3RydWN0IHNjYiAqc2NiKQogewogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKQEAgLTQzMiw3ICs1 ODgsNyBAQAogCXJldHVybiBydG47CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNjc2lfdGFy Z2V0ICoqCitzdGF0aWMgc3RydWN0IHNjc2lfdGFyZ2V0ICoqCiBhaGRfbGludXhfdGFyZ2V0X2lu X3NvZnRjKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKIHsKIAlzdHJ1Y3QJYWhkX3NvZnRj ICphaGQgPQotLS0gbGludXgtMi42LjIzLXJjMS5vcmcvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWlj Nzl4eF9vc20uaAlUdWUgSnVsIDMxIDAwOjMwOjI5IDIwMDcKKysrIGxpbnV4LTIuNi4yMy1yYzEu YWljL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc5eHhfb3NtLmgJVHVlIEp1bCAzMSAwNzoyODo0 MSAyMDA3CkBAIC0yMjIsMjMgKzIyMiw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioq KiogVGltZXIgRmFjaWxpdGllcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2Rl ZmluZSBhaGRfdGltZXJfaW5pdCBpbml0X3RpbWVyCiAjZGVmaW5lIGFoZF90aW1lcl9zdG9wIGRl bF90aW1lcl9zeW5jCi10eXBlZGVmIHZvaWQgYWhkX2xpbnV4X2NhbGxiYWNrX3QgKHVfbG9uZyk7 ICAKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF90aW1lcl9yZXNldChhaGRfdGltZXJfdCAqdGlt ZXIsIGludCB1c2VjLAotCQkJCSAgICAgYWhkX2NhbGxiYWNrX3QgKmZ1bmMsIHZvaWQgKmFyZyk7 CiAKLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGRfdGltZXJfcmVzZXQoYWhkX3RpbWVyX3QgKnRp bWVyLCBpbnQgdXNlYywgYWhkX2NhbGxiYWNrX3QgKmZ1bmMsIHZvaWQgKmFyZykKLXsKLQlzdHJ1 Y3QgYWhkX3NvZnRjICphaGQ7Ci0KLQlhaGQgPSAoc3RydWN0IGFoZF9zb2Z0YyAqKWFyZzsKLQlk ZWxfdGltZXIodGltZXIpOwotCXRpbWVyLT5kYXRhID0gKHVfbG9uZylhcmc7Ci0JdGltZXItPmV4 cGlyZXMgPSBqaWZmaWVzICsgKHVzZWMgKiBIWikvMTAwMDAwMDsKLQl0aW1lci0+ZnVuY3Rpb24g PSAoYWhkX2xpbnV4X2NhbGxiYWNrX3QqKWZ1bmM7Ci0JYWRkX3RpbWVyKHRpbWVyKTsKLX0KLQog LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFNNUCBzdXBwb3J0ICoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCkBA IC0zODYsMTExICszNzAsMTkgQEAKICNkZWZpbmUgbWFsbG9jKHNpemUsIHR5cGUsIGZsYWdzKSBr bWFsbG9jKHNpemUsIGZsYWdzKQogI2RlZmluZSBmcmVlKHB0ciwgdHlwZSkga2ZyZWUocHRyKQog Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGRfZGVsYXkobG9uZyk7Ci1zdGF0aWMgX19pbmxpbmUg dm9pZAotYWhkX2RlbGF5KGxvbmcgdXNlYykKLXsKLQkvKgotCSAqIHVkZWxheSBvbiBMaW51eCBj YW4gaGF2ZSBwcm9ibGVtcyBmb3IKLQkgKiBtdWx0aS1taWxsaXNlY29uZCB3YWl0cy4gIFdhaXQg YXQgbW9zdAotCSAqIDEwMjR1cyBwZXIgY2FsbC4KLQkgKi8KLQl3aGlsZSAodXNlYyA+IDApIHsK LQkJdWRlbGF5KHVzZWMgJSAxMDI0KTsKLQkJdXNlYyAtPSAxMDI0OwotCX0KLX0KK3ZvaWQgYWhk X2RlbGF5KGxvbmcpOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMb3cgTGV2 ZWwgSS9PICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgX19pbmxp bmUgdWludDhfdCBhaGRfaW5iKHN0cnVjdCBhaGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCk7Ci1z dGF0aWMgX19pbmxpbmUgdWludDE2X3QgYWhkX2lud19hdG9taWMoc3RydWN0IGFoZF9zb2Z0YyAq IGFoZCwgbG9uZyBwb3J0KTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9vdXRiKHN0cnVjdCBh aGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCwgdWludDhfdCB2YWwpOwotc3RhdGljIF9faW5saW5l IHZvaWQgYWhkX291dHdfYXRvbWljKHN0cnVjdCBhaGRfc29mdGMgKiBhaGQsCit1aW50OF90IGFo ZF9pbmIoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0KTsKK3VpbnQxNl90IGFoZF9p bndfYXRvbWljKHN0cnVjdCBhaGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCk7Cit2b2lkIGFoZF9v dXRiKHN0cnVjdCBhaGRfc29mdGMgKiBhaGQsIGxvbmcgcG9ydCwgdWludDhfdCB2YWwpOwordm9p ZCBhaGRfb3V0d19hdG9taWMoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwKIAkJCQkgICAgIGxvbmcg cG9ydCwgdWludDE2X3QgdmFsKTsKLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9vdXRzYihzdHJ1 Y3QgYWhkX3NvZnRjICogYWhkLCBsb25nIHBvcnQsCit2b2lkIGFoZF9vdXRzYihzdHJ1Y3QgYWhk X3NvZnRjICogYWhkLCBsb25nIHBvcnQsCiAJCQkgICAgICAgdWludDhfdCAqLCBpbnQgY291bnQp Owotc3RhdGljIF9faW5saW5lIHZvaWQgYWhkX2luc2Ioc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwg bG9uZyBwb3J0LAordm9pZCBhaGRfaW5zYihzdHJ1Y3QgYWhkX3NvZnRjICogYWhkLCBsb25nIHBv cnQsCiAJCQkgICAgICAgdWludDhfdCAqLCBpbnQgY291bnQpOwogCi1zdGF0aWMgX19pbmxpbmUg dWludDhfdAotYWhkX2luYihzdHJ1Y3QgYWhkX3NvZnRjICogYWhkLCBsb25nIHBvcnQpCi17Ci0J dWludDhfdCB4OwotCi0JaWYgKGFoZC0+dGFnc1swXSA9PSBCVVNfU1BBQ0VfTUVNSU8pIHsKLQkJ eCA9IHJlYWRiKGFoZC0+YnNoc1swXS5tYWRkciArIHBvcnQpOwotCX0gZWxzZSB7Ci0JCXggPSBp bmIoYWhkLT5ic2hzWyhwb3J0KSA+PiA4XS5pb3BvcnQgKyAoKHBvcnQpICYgMHhGRikpOwotCX0K LQltYigpOwotCXJldHVybiAoeCk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1aW50MTZfdAotYWhk X2lud19hdG9taWMoc3RydWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0KQotewotCXVpbnQ4 X3QgeDsKLQotCWlmIChhaGQtPnRhZ3NbMF0gPT0gQlVTX1NQQUNFX01FTUlPKSB7Ci0JCXggPSBy ZWFkdyhhaGQtPmJzaHNbMF0ubWFkZHIgKyBwb3J0KTsKLQl9IGVsc2UgewotCQl4ID0gaW53KGFo ZC0+YnNoc1socG9ydCkgPj4gOF0uaW9wb3J0ICsgKChwb3J0KSAmIDB4RkYpKTsKLQl9Ci0JbWIo KTsKLQlyZXR1cm4gKHgpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX291dGIoc3Ry dWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0LCB1aW50OF90IHZhbCkKLXsKLQlpZiAoYWhk LT50YWdzWzBdID09IEJVU19TUEFDRV9NRU1JTykgewotCQl3cml0ZWIodmFsLCBhaGQtPmJzaHNb MF0ubWFkZHIgKyBwb3J0KTsKLQl9IGVsc2UgewotCQlvdXRiKHZhbCwgYWhkLT5ic2hzWyhwb3J0 KSA+PiA4XS5pb3BvcnQgKyAocG9ydCAmIDB4RkYpKTsKLQl9Ci0JbWIoKTsKLX0KLQotc3RhdGlj IF9faW5saW5lIHZvaWQKLWFoZF9vdXR3X2F0b21pYyhzdHJ1Y3QgYWhkX3NvZnRjICogYWhkLCBs b25nIHBvcnQsIHVpbnQxNl90IHZhbCkKLXsKLQlpZiAoYWhkLT50YWdzWzBdID09IEJVU19TUEFD RV9NRU1JTykgewotCQl3cml0ZXcodmFsLCBhaGQtPmJzaHNbMF0ubWFkZHIgKyBwb3J0KTsKLQl9 IGVsc2UgewotCQlvdXR3KHZhbCwgYWhkLT5ic2hzWyhwb3J0KSA+PiA4XS5pb3BvcnQgKyAocG9y dCAmIDB4RkYpKTsKLQl9Ci0JbWIoKTsKLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9v dXRzYihzdHJ1Y3QgYWhkX3NvZnRjICogYWhkLCBsb25nIHBvcnQsIHVpbnQ4X3QgKmFycmF5LCBp bnQgY291bnQpCi17Ci0JaW50IGk7Ci0KLQkvKgotCSAqIFRoZXJlIGlzIHByb2JhYmx5IGEgbW9y ZSBlZmZpY2llbnQgd2F5IHRvIGRvIHRoaXMgb24gTGludXgKLQkgKiBidXQgd2UgZG9uJ3QgdXNl IHRoaXMgZm9yIGFueXRoaW5nIHNwZWVkIGNyaXRpY2FsIGFuZCB0aGlzCi0JICogc2hvdWxkIHdv cmsuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCWFoZF9vdXRiKGFoZCwg cG9ydCwgKmFycmF5KyspOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhkX2luc2Ioc3Ry dWN0IGFoZF9zb2Z0YyAqIGFoZCwgbG9uZyBwb3J0LCB1aW50OF90ICphcnJheSwgaW50IGNvdW50 KQotewotCWludCBpOwotCi0JLyoKLQkgKiBUaGVyZSBpcyBwcm9iYWJseSBhIG1vcmUgZWZmaWNp ZW50IHdheSB0byBkbyB0aGlzIG9uIExpbnV4Ci0JICogYnV0IHdlIGRvbid0IHVzZSB0aGlzIGZv ciBhbnl0aGluZyBzcGVlZCBjcml0aWNhbCBhbmQgdGhpcwotCSAqIHNob3VsZCB3b3JrLgotCSAq LwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQkqYXJyYXkrKyA9IGFoZF9pbmIoYWhk LCBwb3J0KTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5pdGlhbGl6YXRp b24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludAkJYWhkX2xpbnV4X3Jl Z2lzdGVyX2hvc3Qoc3RydWN0IGFoZF9zb2Z0YyAqLAogCQkJCQlzdHJ1Y3Qgc2NzaV9ob3N0X3Rl bXBsYXRlICopOwpAQCAtNTkzLDYxICs0ODUsMTEgQEAKIGludAkJCSBhaGRfcGNpX21hcF9yZWdp c3RlcnMoc3RydWN0IGFoZF9zb2Z0YyAqYWhkKTsKIGludAkJCSBhaGRfcGNpX21hcF9pbnQoc3Ry dWN0IGFoZF9zb2Z0YyAqYWhkKTsKIAotc3RhdGljIF9faW5saW5lIHVpbnQzMl90IGFoZF9wY2lf cmVhZF9jb25maWcoYWhkX2Rldl9zb2Z0Y190IHBjaSwKK3VpbnQzMl90CQkgYWhkX3BjaV9yZWFk X2NvbmZpZyhhaGRfZGV2X3NvZnRjX3QgcGNpLAogCQkJCQkgICAgIGludCByZWcsIGludCB3aWR0 aCk7Ci0KLXN0YXRpYyBfX2lubGluZSB1aW50MzJfdAotYWhkX3BjaV9yZWFkX2NvbmZpZyhhaGRf ZGV2X3NvZnRjX3QgcGNpLCBpbnQgcmVnLCBpbnQgd2lkdGgpCi17Ci0Jc3dpdGNoICh3aWR0aCkg ewotCWNhc2UgMToKLQl7Ci0JCXVpbnQ4X3QgcmV0dmFsOwotCi0JCXBjaV9yZWFkX2NvbmZpZ19i eXRlKHBjaSwgcmVnLCAmcmV0dmFsKTsKLQkJcmV0dXJuIChyZXR2YWwpOwotCX0KLQljYXNlIDI6 Ci0JewotCQl1aW50MTZfdCByZXR2YWw7Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaSwgcmVn LCAmcmV0dmFsKTsKLQkJcmV0dXJuIChyZXR2YWwpOwotCX0KLQljYXNlIDQ6Ci0JewotCQl1aW50 MzJfdCByZXR2YWw7Ci0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2ksIHJlZywgJnJldHZhbCk7 Ci0JCXJldHVybiAocmV0dmFsKTsKLQl9Ci0JZGVmYXVsdDoKLQkJcGFuaWMoImFoZF9wY2lfcmVh ZF9jb25maWc6IFJlYWQgc2l6ZSB0b28gYmlnIik7Ci0JCS8qIE5PVFJFQUNIRUQgKi8KLQkJcmV0 dXJuICgwKTsKLQl9Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkIGFoZF9wY2lfd3JpdGVfY29u ZmlnKGFoZF9kZXZfc29mdGNfdCBwY2ksCit2b2lkCQkJIGFoZF9wY2lfd3JpdGVfY29uZmlnKGFo ZF9kZXZfc29mdGNfdCBwY2ksCiAJCQkJCSAgaW50IHJlZywgdWludDMyX3QgdmFsdWUsCiAJCQkJ CSAgaW50IHdpZHRoKTsKLQotc3RhdGljIF9faW5saW5lIHZvaWQKLWFoZF9wY2lfd3JpdGVfY29u ZmlnKGFoZF9kZXZfc29mdGNfdCBwY2ksIGludCByZWcsIHVpbnQzMl90IHZhbHVlLCBpbnQgd2lk dGgpCi17Ci0Jc3dpdGNoICh3aWR0aCkgewotCWNhc2UgMToKLQkJcGNpX3dyaXRlX2NvbmZpZ19i eXRlKHBjaSwgcmVnLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJcGNpX3dyaXRlX2Nv bmZpZ193b3JkKHBjaSwgcmVnLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJcGNpX3dy aXRlX2NvbmZpZ19kd29yZChwY2ksIHJlZywgdmFsdWUpOwotCQlicmVhazsKLQlkZWZhdWx0Ogot CQlwYW5pYygiYWhkX3BjaV93cml0ZV9jb25maWc6IFdyaXRlIHNpemUgdG9vIGJpZyIpOwotCQkv KiBOT1RSRUFDSEVEICovCi0JfQotfQogCiBzdGF0aWMgX19pbmxpbmUgaW50IGFoZF9nZXRfcGNp X2Z1bmN0aW9uKGFoZF9kZXZfc29mdGNfdCk7CiBzdGF0aWMgX19pbmxpbmUgaW50Ci0tLSBsaW51 eC0yLjYuMjMtcmMxLm9yZy9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X2NvcmUuYwlNb24g SnVsICA5IDAwOjMyOjE3IDIwMDcKKysrIGxpbnV4LTIuNi4yMy1yYzEuYWljL2RyaXZlcnMvc2Nz aS9haWM3eHh4L2FpYzd4eHhfY29yZS5jCVR1ZSBKdWwgMzEgMDE6NTk6NTUgMjAwNwpAQCAtMjM3 LDYgKzIzNyw1MTAgQEAKIHN0YXRpYyBpbnQJCWFoY19oYW5kbGVfdGFyZ2V0X2NtZChzdHJ1Y3Qg YWhjX3NvZnRjICphaGMsCiAJCQkJCSAgICAgIHN0cnVjdCB0YXJnZXRfY21kICpjbWQpOwogI2Vu ZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFNlcXVlbmNlciBFeGVjdXRpb24gQ29u dHJvbCAqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogV29yayBhcm91bmQgYW55IGNo aXAgYnVncyByZWxhdGVkIHRvIGhhbHRpbmcgc2VxdWVuY2VyIGV4ZWN1dGlvbi4KKyAqIE9uIFVs dHJhMiBjb250cm9sbGVycywgd2UgbXVzdCBjbGVhciB0aGUgQ0lPQlVTIHN0cmV0Y2ggc2lnbmFs IGJ5CisgKiByZWFkaW5nIGEgcmVnaXN0ZXIgdGhhdCB3aWxsIHNldCB0aGlzIHNpZ25hbCBhbmQg ZGVhc3NlcnQgaXQuCisgKiBXaXRob3V0IHRoaXMgd29ya2Fyb3VuZCwgaWYgdGhlIGNoaXAgaXMg cGF1c2VkLCBieSBhbiBpbnRlcnJ1cHQgb3IKKyAqIG1hbnVhbCBwYXVzZSB3aGlsZSBhY2Nlc3Np bmcgc2NiIHJhbSwgYWNjZXNzZXMgdG8gY2VydGFpbiByZWdpc3RlcnMKKyAqIHdpbGwgaGFuZyB0 aGUgc3lzdGVtIChpbmZpbml0ZSBwY2kgcmV0cmllcykuCisgKi8KK3ZvaWQKK2FoY19wYXVzZV9i dWdfZml4KHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBB SENfVUxUUkEyKSAhPSAwKQorCQkodm9pZClhaGNfaW5iKGFoYywgQ0NTQ0JDVEwpOworfQorCisv KgorICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlcXVlbmNlciBoYXMgaGFsdGVkIGNvZGUgZXhl Y3V0aW9uLgorICogUmV0dXJucyBub24temVybyBzdGF0dXMgaWYgdGhlIHNlcXVlbmNlciBpcyBz dG9wcGVkLgorICovCitpbnQKK2FoY19pc19wYXVzZWQoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQor eworCXJldHVybiAoKGFoY19pbmIoYWhjLCBIQ05UUkwpICYgUEFVU0UpICE9IDApOworfQorCisv KgorICogUmVxdWVzdCB0aGF0IHRoZSBzZXF1ZW5jZXIgc3RvcCBhbmQgd2FpdCwgaW5kZWZpbml0 ZWx5LCBmb3IgaXQKKyAqIHRvIHN0b3AuICBUaGUgc2VxdWVuY2VyIHdpbGwgb25seSBhY2tub3ds ZWRnZSB0aGF0IGl0IGlzIHBhdXNlZAorICogb25jZSBpdCBoYXMgcmVhY2hlZCBhbiBpbnN0cnVj dGlvbiBib3VuZGFyeSBhbmQgUEFVU0VESVMgaXMKKyAqIGNsZWFyZWQgaW4gdGhlIFNFUUNUTCBy ZWdpc3Rlci4gIFRoZSBzZXF1ZW5jZXIgbWF5IHVzZSBQQVVTRURJUworICogZm9yIGNyaXRpY2Fs IHNlY3Rpb25zLgorICovCit2b2lkCithaGNfcGF1c2Uoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQor eworCWFoY19vdXRiKGFoYywgSENOVFJMLCBhaGMtPnBhdXNlKTsKKworCS8qCisJICogU2luY2Ug dGhlIHNlcXVlbmNlciBjYW4gZGlzYWJsZSBwYXVzaW5nIGluIGEgY3JpdGljYWwgc2VjdGlvbiwg d2UKKwkgKiBtdXN0IGxvb3AgdW50aWwgaXQgYWN0dWFsbHkgc3RvcHMuCisJICovCisJd2hpbGUg KGFoY19pc19wYXVzZWQoYWhjKSA9PSAwKQorCQk7CisKKwlhaGNfcGF1c2VfYnVnX2ZpeChhaGMp OworfQorCisvKgorICogQWxsb3cgdGhlIHNlcXVlbmNlciB0byBjb250aW51ZSBwcm9ncmFtIGV4 ZWN1dGlvbi4KKyAqIFdlIGNoZWNrIGhlcmUgdG8gZW5zdXJlIHRoYXQgbm8gYWRkaXRpb25hbCBp bnRlcnJ1cHQKKyAqIHNvdXJjZXMgdGhhdCB3b3VsZCBjYXVzZSB0aGUgc2VxdWVuY2VyIHRvIGhh bHQgaGF2ZSBiZWVuCisgKiBhc3NlcnRlZC4gIElmLCBmb3IgZXhhbXBsZSwgYSBTQ1NJIGJ1cyBy ZXNldCBpcyBkZXRlY3RlZAorICogd2hpbGUgd2UgYXJlIGZpZWxkaW5nIGEgZGlmZmVyZW50LCBw YXVzaW5nLCBpbnRlcnJ1cHQgdHlwZSwKKyAqIHdlIGRvbid0IHdhbnQgdG8gcmVsZWFzZSB0aGUg c2VxdWVuY2VyIGJlZm9yZSBnb2luZyBiYWNrCisgKiBpbnRvIG91ciBpbnRlcnJ1cHQgaGFuZGxl ciBhbmQgZGVhbGluZyB3aXRoIHRoaXMgbmV3CisgKiBjb25kaXRpb24uCisgKi8KK3ZvaWQKK2Fo Y191bnBhdXNlKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwlpZiAoKGFoY19pbmIoYWhjLCBJ TlRTVEFUKSAmIChTQ1NJSU5UIHwgU0VRSU5UIHwgQlJLQURSSU5UKSkgPT0gMCkKKwkJYWhjX291 dGIoYWhjLCBIQ05UUkwsIGFoYy0+dW5wYXVzZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioq KioqKioqKiBNZW1vcnkgbWFwcGluZyByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioq KiovCitzdHJ1Y3QgYWhjX2RtYV9zZWcgKgorYWhjX3NnX2J1c190b192aXJ0KHN0cnVjdCBzY2Ig KnNjYiwgdWludDMyX3Qgc2dfYnVzYWRkcikKK3sKKwlpbnQgc2dfaW5kZXg7CisKKwlzZ19pbmRl eCA9IChzZ19idXNhZGRyIC0gc2NiLT5zZ19saXN0X3BoeXMpL3NpemVvZihzdHJ1Y3QgYWhjX2Rt YV9zZWcpOworCS8qIHNnX2xpc3RfcGh5cyBwb2ludHMgdG8gZW50cnkgMSwgbm90IDAgKi8KKwlz Z19pbmRleCsrOworCisJcmV0dXJuICgmc2NiLT5zZ19saXN0W3NnX2luZGV4XSk7Cit9CisKK3Vp bnQzMl90CithaGNfc2dfdmlydF90b19idXMoc3RydWN0IHNjYiAqc2NiLCBzdHJ1Y3QgYWhjX2Rt YV9zZWcgKnNnKQoreworCWludCBzZ19pbmRleDsKKworCS8qIHNnX2xpc3RfcGh5cyBwb2ludHMg dG8gZW50cnkgMSwgbm90IDAgKi8KKwlzZ19pbmRleCA9IHNnIC0gJnNjYi0+c2dfbGlzdFsxXTsK KworCXJldHVybiAoc2NiLT5zZ19saXN0X3BoeXMgKyAoc2dfaW5kZXggKiBzaXplb2YoKnNjYi0+ c2dfbGlzdCkpKTsKK30KKwordWludDMyX3QKK2FoY19oc2NiX2J1c2FkZHIoc3RydWN0IGFoY19z b2Z0YyAqYWhjLCB1X2ludCBpbmRleCkKK3sKKwlyZXR1cm4gKGFoYy0+c2NiX2RhdGEtPmhzY2Jf YnVzYWRkcgorCQkrIChzaXplb2Yoc3RydWN0IGhhcmR3YXJlX3NjYikgKiBpbmRleCkpOworfQor Cit2b2lkCithaGNfc3luY19zY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpz Y2IsIGludCBvcCkKK3sKKwlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNjYl9kYXRhLT5oc2Ni X2RtYXQsCisJCQlhaGMtPnNjYl9kYXRhLT5oc2NiX2RtYW1hcCwKKwkJCS8qb2Zmc2V0Ki8oc2Ni LT5oc2NiIC0gYWhjLT5oc2NicykgKiBzaXplb2YoKnNjYi0+aHNjYiksCisJCQkvKmxlbiovc2l6 ZW9mKCpzY2ItPmhzY2IpLCBvcCk7Cit9CisKK3ZvaWQKK2FoY19zeW5jX3NnbGlzdChzdHJ1Y3Qg YWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYiwgaW50IG9wKQoreworCWlmIChzY2ItPnNn X2NvdW50ID09IDApCisJCXJldHVybjsKKworCWFoY19kbWFtYXBfc3luYyhhaGMsIGFoYy0+c2Ni X2RhdGEtPnNnX2RtYXQsIHNjYi0+c2dfbWFwLT5zZ19kbWFtYXAsCisJCQkvKm9mZnNldCovKHNj Yi0+c2dfbGlzdCAtIHNjYi0+c2dfbWFwLT5zZ192YWRkcikKKwkJCQkqIHNpemVvZihzdHJ1Y3Qg YWhjX2RtYV9zZWcpLAorCQkJLypsZW4qL3NpemVvZihzdHJ1Y3QgYWhjX2RtYV9zZWcpICogc2Ni LT5zZ19jb3VudCwgb3ApOworfQorCit1aW50MzJfdAorYWhjX3RhcmdldGNtZF9vZmZzZXQoc3Ry dWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBpbmRleCkKK3sKKwlyZXR1cm4gKCgodWludDhfdCAq KSZhaGMtPnRhcmdldGNtZHNbaW5kZXhdKSAtIGFoYy0+cW91dGZpZm8pOworfQorCisvKioqKioq KioqKioqKioqKioqKioqKiogTWlzY2VsYW5lb3VzIFN1cHBvcnQgRnVuY3Rpb25zICoqKioqKioq KioqKioqKioqKioqKioqLworLyoKKyAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzZXF1ZW5jZXIg cmVwb3J0ZWQgYSByZXNpZHVhbAorICogZm9yIHRoaXMgU0NCL3RyYW5zYWN0aW9uLgorICovCit2 b2lkCithaGNfdXBkYXRlX3Jlc2lkdWFsKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNj YiAqc2NiKQoreworCXVpbnQzMl90IHNncHRyOworCisJc2dwdHIgPSBhaGNfbGUzMnRvaChzY2It PmhzY2ItPnNncHRyKTsKKwlpZiAoKHNncHRyICYgU0dfUkVTSURfVkFMSUQpICE9IDApCisJCWFo Y19jYWxjX3Jlc2lkdWFsKGFoYywgc2NiKTsKK30KKworLyoKKyAqIFJldHVybiBwb2ludGVycyB0 byB0aGUgdHJhbnNmZXIgbmVnb3RpYXRpb24gaW5mb3JtYXRpb24KKyAqIGZvciB0aGUgc3BlY2lm aWVkIG91cl9pZC9yZW1vdGVfaWQgcGFpci4KKyAqLworc3RydWN0IGFoY19pbml0aWF0b3JfdGlu Zm8gKgorYWhjX2ZldGNoX3RyYW5zaW5mbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGNoYXIgY2hh bm5lbCwgdV9pbnQgb3VyX2lkLAorCQkgICAgdV9pbnQgcmVtb3RlX2lkLCBzdHJ1Y3QgYWhjX3Rt b2RlX3RzdGF0ZSAqKnRzdGF0ZSkKK3sKKwkvKgorCSAqIFRyYW5zZmVyIGRhdGEgc3RydWN0dXJl cyBhcmUgc3RvcmVkIGZyb20gdGhlIHBlcnNwZWN0aXZlCisJICogb2YgdGhlIHRhcmdldCByb2xl LiAgU2luY2UgdGhlIHBhcmFtZXRlcnMgZm9yIGEgY29ubmVjdGlvbgorCSAqIGluIHRoZSBpbml0 aWF0b3Igcm9sZSB0byBhIGdpdmVuIHRhcmdldCBhcmUgdGhlIHNhbWUgYXMKKwkgKiB3aGVuIHRo ZSByb2xlcyBhcmUgcmV2ZXJzZWQsIHdlIHByZXRlbmQgd2UgYXJlIHRoZSB0YXJnZXQuCisJICov CisJaWYgKGNoYW5uZWwgPT0gJ0InKQorCQlvdXJfaWQgKz0gODsKKwkqdHN0YXRlID0gYWhjLT5l bmFibGVkX3RhcmdldHNbb3VyX2lkXTsKKwlyZXR1cm4gKCYoKnRzdGF0ZSktPnRyYW5zaW5mb1ty ZW1vdGVfaWRdKTsKK30KKwordWludDE2X3QKK2FoY19pbncoc3RydWN0IGFoY19zb2Z0YyAqYWhj LCB1X2ludCBwb3J0KQoreworCXVpbnQxNl90IHIgPSBhaGNfaW5iKGFoYywgcG9ydCsxKSA8PCA4 OworCXJldHVybiByIHwgYWhjX2luYihhaGMsIHBvcnQpOworfQorCit2b2lkCithaGNfb3V0dyhz dHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQsIHVfaW50IHZhbHVlKQoreworCWFoY19v dXRiKGFoYywgcG9ydCwgdmFsdWUgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIHBvcnQrMSwgKHZh bHVlID4+IDgpICYgMHhGRik7Cit9CisKK3VpbnQzMl90CithaGNfaW5sKHN0cnVjdCBhaGNfc29m dGMgKmFoYywgdV9pbnQgcG9ydCkKK3sKKwlyZXR1cm4gKChhaGNfaW5iKGFoYywgcG9ydCkpCisJ ICAgICAgfCAoYWhjX2luYihhaGMsIHBvcnQrMSkgPDwgOCkKKwkgICAgICB8IChhaGNfaW5iKGFo YywgcG9ydCsyKSA8PCAxNikKKwkgICAgICB8IChhaGNfaW5iKGFoYywgcG9ydCszKSA8PCAyNCkp OworfQorCit2b2lkCithaGNfb3V0bChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQs IHVpbnQzMl90IHZhbHVlKQoreworCWFoY19vdXRiKGFoYywgcG9ydCwgKHZhbHVlKSAmIDB4RkYp OworCWFoY19vdXRiKGFoYywgcG9ydCsxLCAoKHZhbHVlKSA+PiA4KSAmIDB4RkYpOworCWFoY19v dXRiKGFoYywgcG9ydCsyLCAoKHZhbHVlKSA+PiAxNikgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMs IHBvcnQrMywgKCh2YWx1ZSkgPj4gMjQpICYgMHhGRik7Cit9CisKK3VpbnQ2NF90CithaGNfaW5x KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcG9ydCkKK3sKKwlyZXR1cm4gKChhaGNfaW5i KGFoYywgcG9ydCkpCisJICAgICAgfCAoYWhjX2luYihhaGMsIHBvcnQrMSkgPDwgOCkKKwkgICAg ICB8IChhaGNfaW5iKGFoYywgcG9ydCsyKSA8PCAxNikKKwkgICAgICB8IChhaGNfaW5iKGFoYywg cG9ydCszKSA8PCAyNCkKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIoYWhjLCBwb3J0KzQp KSA8PCAzMikKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIoYWhjLCBwb3J0KzUpKSA8PCA0 MCkKKwkgICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIoYWhjLCBwb3J0KzYpKSA8PCA0OCkKKwkg ICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIoYWhjLCBwb3J0KzcpKSA8PCA1NikpOworfQorCit2 b2lkCithaGNfb3V0cShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQsIHVpbnQ2NF90 IHZhbHVlKQoreworCWFoY19vdXRiKGFoYywgcG9ydCwgdmFsdWUgJiAweEZGKTsKKwlhaGNfb3V0 YihhaGMsIHBvcnQrMSwgKHZhbHVlID4+IDgpICYgMHhGRik7CisJYWhjX291dGIoYWhjLCBwb3J0 KzIsICh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKwlhaGNfb3V0YihhaGMsIHBvcnQrMywgKHZhbHVl ID4+IDI0KSAmIDB4RkYpOworCWFoY19vdXRiKGFoYywgcG9ydCs0LCAodmFsdWUgPj4gMzIpICYg MHhGRik7CisJYWhjX291dGIoYWhjLCBwb3J0KzUsICh2YWx1ZSA+PiA0MCkgJiAweEZGKTsKKwlh aGNfb3V0YihhaGMsIHBvcnQrNiwgKHZhbHVlID4+IDQ4KSAmIDB4RkYpOworCWFoY19vdXRiKGFo YywgcG9ydCs3LCAodmFsdWUgPj4gNTYpICYgMHhGRik7Cit9CisKKy8qCisgKiBHZXQgYSBmcmVl IHNjYi4gSWYgdGhlcmUgYXJlIG5vbmUsIHNlZSBpZiB3ZSBjYW4gYWxsb2NhdGUgYSBuZXcgU0NC LgorICovCitzdHJ1Y3Qgc2NiICoKK2FoY19nZXRfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYykK K3sKKwlzdHJ1Y3Qgc2NiICpzY2I7CisKKwlpZiAoKHNjYiA9IFNMSVNUX0ZJUlNUKCZhaGMtPnNj Yl9kYXRhLT5mcmVlX3NjYnMpKSA9PSBOVUxMKSB7CisJCWFoY19hbGxvY19zY2JzKGFoYyk7CisJ CXNjYiA9IFNMSVNUX0ZJUlNUKCZhaGMtPnNjYl9kYXRhLT5mcmVlX3NjYnMpOworCQlpZiAoc2Ni ID09IE5VTEwpCisJCQlyZXR1cm4gKE5VTEwpOworCX0KKwlTTElTVF9SRU1PVkVfSEVBRCgmYWhj LT5zY2JfZGF0YS0+ZnJlZV9zY2JzLCBsaW5rcy5zbGUpOworCXJldHVybiAoc2NiKTsKK30KKwor LyoKKyAqIFJldHVybiBhbiBTQ0IgcmVzb3VyY2UgdG8gdGhlIGZyZWUgbGlzdC4KKyAqLwordm9p ZAorYWhjX2ZyZWVfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKQor eyAgICAgICAKKwlzdHJ1Y3QgaGFyZHdhcmVfc2NiICpoc2NiOworCisJaHNjYiA9IHNjYi0+aHNj YjsKKwkvKiBDbGVhbiB1cCBmb3IgdGhlIG5leHQgdXNlciAqLworCWFoYy0+c2NiX2RhdGEtPnNj YmluZGV4W2hzY2ItPnRhZ10gPSBOVUxMOworCXNjYi0+ZmxhZ3MgPSBTQ0JfRlJFRTsKKwloc2Ni LT5jb250cm9sID0gMDsKKworCVNMSVNUX0lOU0VSVF9IRUFEKCZhaGMtPnNjYl9kYXRhLT5mcmVl X3NjYnMsIHNjYiwgbGlua3Muc2xlKTsKKworCS8qIE5vdGlmeSB0aGUgT1NNIHRoYXQgYSByZXNv dXJjZSBpcyBub3cgYXZhaWxhYmxlLiAqLworCWFoY19wbGF0Zm9ybV9zY2JfZnJlZShhaGMsIHNj Yik7Cit9CisKK3N0cnVjdCBzY2IgKgorYWhjX2xvb2t1cF9zY2Ioc3RydWN0IGFoY19zb2Z0YyAq YWhjLCB1X2ludCB0YWcpCit7CisJc3RydWN0IHNjYiogc2NiOworCisJc2NiID0gYWhjLT5zY2Jf ZGF0YS0+c2NiaW5kZXhbdGFnXTsKKwlpZiAoc2NiICE9IE5VTEwpCisJCWFoY19zeW5jX3NjYihh aGMsIHNjYiwKKwkJCSAgICAgQlVTX0RNQVNZTkNfUE9TVFJFQUR8QlVTX0RNQVNZTkNfUE9TVFdS SVRFKTsKKwlyZXR1cm4gKHNjYik7Cit9CisKK3ZvaWQKK2FoY19zd2FwX3dpdGhfbmV4dF9oc2Ni KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKQoreworCXN0cnVjdCBoYXJk d2FyZV9zY2IgKnFfaHNjYjsKKwl1X2ludCAgc2F2ZWRfdGFnOworCisJLyoKKwkgKiBPdXIgcXVl dWluZyBtZXRob2QgaXMgYSBiaXQgdHJpY2t5LiAgVGhlIGNhcmQKKwkgKiBrbm93cyBpbiBhZHZh bmNlIHdoaWNoIEhTQ0IgdG8gZG93bmxvYWQsIGFuZCB3ZQorCSAqIGNhbid0IGRpc2FwcG9pbnQg aXQuICBUbyBhY2hpZXZlIHRoaXMsIHRoZSBuZXh0CisJICogU0NCIHRvIGRvd25sb2FkIGlzIHNh dmVkIG9mZiBpbiBhaGMtPm5leHRfcXVldWVkX3NjYi4KKwkgKiBXaGVuIHdlIGFyZSBjYWxsZWQg dG8gcXVldWUgImFuIGFyYml0cmFyeSBzY2IiLAorCSAqIHdlIGNvcHkgdGhlIGNvbnRlbnRzIG9m IHRoZSBpbmNvbWluZyBIU0NCIHRvIHRoZSBvbmUKKwkgKiB0aGUgc2VxdWVuY2VyIGtub3dzIGFi b3V0LCBzd2FwIEhTQ0IgcG9pbnRlcnMgYW5kCisJICogZmluYWxseSBhc3NpZ24gdGhlIFNDQiB0 byB0aGUgdGFnIGluZGV4ZWQgbG9jYXRpb24KKwkgKiBpbiB0aGUgc2NiX2FycmF5LiAgVGhpcyBt YWtlcyBzdXJlIHRoYXQgd2UgY2FuIHN0aWxsCisJICogbG9jYXRlIHRoZSBjb3JyZWN0IFNDQiBi eSBTQ0JfVEFHLgorCSAqLworCXFfaHNjYiA9IGFoYy0+bmV4dF9xdWV1ZWRfc2NiLT5oc2NiOwor CXNhdmVkX3RhZyA9IHFfaHNjYi0+dGFnOworCW1lbWNweShxX2hzY2IsIHNjYi0+aHNjYiwgc2l6 ZW9mKCpzY2ItPmhzY2IpKTsKKwlpZiAoKHNjYi0+ZmxhZ3MgJiBTQ0JfQ0RCMzJfUFRSKSAhPSAw KSB7CisJCXFfaHNjYi0+c2hhcmVkX2RhdGEuY2RiX3B0ciA9CisJCSAgICBhaGNfaHRvbGUzMihh aGNfaHNjYl9idXNhZGRyKGFoYywgcV9oc2NiLT50YWcpCisJCQkgICAgICArIG9mZnNldG9mKHN0 cnVjdCBoYXJkd2FyZV9zY2IsIGNkYjMyKSk7CisJfQorCXFfaHNjYi0+dGFnID0gc2F2ZWRfdGFn OworCXFfaHNjYi0+bmV4dCA9IHNjYi0+aHNjYi0+dGFnOworCisJLyogTm93IHN3YXAgSFNDQiBw b2ludGVycy4gKi8KKwlhaGMtPm5leHRfcXVldWVkX3NjYi0+aHNjYiA9IHNjYi0+aHNjYjsKKwlz Y2ItPmhzY2IgPSBxX2hzY2I7CisKKwkvKiBOb3cgZGVmaW5lIHRoZSBtYXBwaW5nIGZyb20gdGFn IHRvIFNDQiBpbiB0aGUgc2NiaW5kZXggKi8KKwlhaGMtPnNjYl9kYXRhLT5zY2JpbmRleFtzY2It PmhzY2ItPnRhZ10gPSBzY2I7Cit9CisKKy8qCisgKiBUZWxsIHRoZSBzZXF1ZW5jZXIgYWJvdXQg YSBuZXcgdHJhbnNhY3Rpb24gdG8gZXhlY3V0ZS4KKyAqLwordm9pZAorYWhjX3F1ZXVlX3NjYihz dHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlhaGNfc3dhcF93aXRo X25leHRfaHNjYihhaGMsIHNjYik7CisKKwlpZiAoc2NiLT5oc2NiLT50YWcgPT0gU0NCX0xJU1Rf TlVMTAorCSB8fCBzY2ItPmhzY2ItPm5leHQgPT0gU0NCX0xJU1RfTlVMTCkKKwkJcGFuaWMoIkF0 dGVtcHQgdG8gcXVldWUgaW52YWxpZCBTQ0IgdGFnICV4OiV4XG4iLAorCQkgICAgICBzY2ItPmhz Y2ItPnRhZywgc2NiLT5oc2NiLT5uZXh0KTsKKworCS8qCisJICogU2V0dXAgZGF0YSAib2RkbmVz cyIuCisJICovCisJc2NiLT5oc2NiLT5sdW4gJj0gTElEOworCWlmIChhaGNfZ2V0X3RyYW5zZmVy X2xlbmd0aChzY2IpICYgMHgxKQorCQlzY2ItPmhzY2ItPmx1biB8PSBTQ0JfWEZFUkxFTl9PREQ7 CisKKwkvKgorCSAqIEtlZXAgYSBoaXN0b3J5IG9mIFNDQnMgd2UndmUgZG93bmxvYWRlZCBpbiB0 aGUgcWluZmlmby4KKwkgKi8KKwlhaGMtPnFpbmZpZm9bYWhjLT5xaW5maWZvbmV4dCsrXSA9IHNj Yi0+aHNjYi0+dGFnOworCisJLyoKKwkgKiBNYWtlIHN1cmUgb3VyIGRhdGEgaXMgY29uc2lzdGVu dCBmcm9tIHRoZQorCSAqIHBlcnNwZWN0aXZlIG9mIHRoZSBhZGFwdGVyLgorCSAqLworCWFoY19z eW5jX3NjYihhaGMsIHNjYiwgQlVTX0RNQVNZTkNfUFJFUkVBRHxCVVNfRE1BU1lOQ19QUkVXUklU RSk7CisKKwkvKiBUZWxsIHRoZSBhZGFwdGVyIGFib3V0IHRoZSBuZXdseSBxdWV1ZWQgU0NCICov CisJaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpICE9IDApIHsKKwkJYWhjX291 dGIoYWhjLCBITlNDQl9RT0ZGLCBhaGMtPnFpbmZpZm9uZXh0KTsKKwl9IGVsc2UgeworCQlpZiAo KGFoYy0+ZmVhdHVyZXMgJiBBSENfQVVUT1BBVVNFKSA9PSAwKQorCQkJYWhjX3BhdXNlKGFoYyk7 CisJCWFoY19vdXRiKGFoYywgS0VSTkVMX1FJTlBPUywgYWhjLT5xaW5maWZvbmV4dCk7CisJCWlm ICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19BVVRPUEFVU0UpID09IDApCisJCQlhaGNfdW5wYXVzZShh aGMpOworCX0KK30KKworc3RydWN0IHNjc2lfc2Vuc2VfZGF0YSAqCithaGNfZ2V0X3NlbnNlX2J1 ZihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYikKK3sKKwlpbnQgb2Zmc2V0 OworCisJb2Zmc2V0ID0gc2NiIC0gYWhjLT5zY2JfZGF0YS0+c2NiYXJyYXk7CisJcmV0dXJuICgm YWhjLT5zY2JfZGF0YS0+c2Vuc2Vbb2Zmc2V0XSk7Cit9CisKK3VpbnQzMl90CithaGNfZ2V0X3Nl bnNlX2J1ZmFkZHIoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCit7CisJ aW50IG9mZnNldDsKKworCW9mZnNldCA9IHNjYiAtIGFoYy0+c2NiX2RhdGEtPnNjYmFycmF5Owor CXJldHVybiAoYWhjLT5zY2JfZGF0YS0+c2Vuc2VfYnVzYWRkcgorCSAgICAgICsgKG9mZnNldCAq IHNpemVvZihzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhKSkpOworfQorCisvKioqKioqKioqKioqKioq KioqKioqKioqKiogSW50ZXJydXB0IFByb2Nlc3NpbmcgKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqLwordm9pZAorYWhjX3N5bmNfcW91dGZpZm8oc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBp bnQgb3ApCit7CisJYWhjX2RtYW1hcF9zeW5jKGFoYywgYWhjLT5zaGFyZWRfZGF0YV9kbWF0LCBh aGMtPnNoYXJlZF9kYXRhX2RtYW1hcCwKKwkJCS8qb2Zmc2V0Ki8wLCAvKmxlbiovMjU2LCBvcCk7 Cit9CisKK3ZvaWQKK2FoY19zeW5jX3RxaW5maWZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgaW50 IG9wKQoreworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorCWlmICgoYWhjLT5mbGFncyAmIEFIQ19U QVJHRVRST0xFKSAhPSAwKSB7CisJCWFoY19kbWFtYXBfc3luYyhhaGMsIGFoYy0+c2hhcmVkX2Rh dGFfZG1hdCwKKwkJCQlhaGMtPnNoYXJlZF9kYXRhX2RtYW1hcCwKKwkJCQlhaGNfdGFyZ2V0Y21k X29mZnNldChhaGMsIDApLAorCQkJCXNpemVvZihzdHJ1Y3QgdGFyZ2V0X2NtZCkgKiBBSENfVE1P REVfQ01EUywKKwkJCQlvcCk7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBTZWUgaWYgdGhlIGZp cm13YXJlIGhhcyBwb3N0ZWQgYW55IGNvbXBsZXRlZCBjb21tYW5kcworICogaW50byBvdXIgaW4t Y29yZSBjb21tYW5kIGNvbXBsZXRlIGZpZm9zLgorICovCisjZGVmaW5lIEFIQ19SVU5fUU9VVEZJ Rk8gMHgxCisjZGVmaW5lIEFIQ19SVU5fVFFJTkZJRk8gMHgyCit1X2ludAorYWhjX2NoZWNrX2Nt ZGNtcGx0cXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYykKK3sKKwl1X2ludCByZXR2YWw7CisK KwlyZXR2YWwgPSAwOworCWFoY19kbWFtYXBfc3luYyhhaGMsIGFoYy0+c2hhcmVkX2RhdGFfZG1h dCwgYWhjLT5zaGFyZWRfZGF0YV9kbWFtYXAsCisJCQkvKm9mZnNldCovYWhjLT5xb3V0Zmlmb25l eHQsIC8qbGVuKi8xLAorCQkJQlVTX0RNQVNZTkNfUE9TVFJFQUQpOworCWlmIChhaGMtPnFvdXRm aWZvW2FoYy0+cW91dGZpZm9uZXh0XSAhPSBTQ0JfTElTVF9OVUxMKQorCQlyZXR2YWwgfD0gQUhD X1JVTl9RT1VURklGTzsKKyNpZmRlZiBBSENfVEFSR0VUX01PREUKKwlpZiAoKGFoYy0+ZmxhZ3Mg JiBBSENfVEFSR0VUUk9MRSkgIT0gMAorCSAmJiAoYWhjLT5mbGFncyAmIEFIQ19UUUlORklGT19C TE9DS0VEKSA9PSAwKSB7CisJCWFoY19kbWFtYXBfc3luYyhhaGMsIGFoYy0+c2hhcmVkX2RhdGFf ZG1hdCwKKwkJCQlhaGMtPnNoYXJlZF9kYXRhX2RtYW1hcCwKKwkJCQlhaGNfdGFyZ2V0Y21kX29m ZnNldChhaGMsIGFoYy0+dHFpbmZpZm9mbmV4dCksCisJCQkJLypsZW4qL3NpemVvZihzdHJ1Y3Qg dGFyZ2V0X2NtZCksCisJCQkJQlVTX0RNQVNZTkNfUE9TVFJFQUQpOworCQlpZiAoYWhjLT50YXJn ZXRjbWRzW2FoYy0+dHFpbmZpZm9uZXh0XS5jbWRfdmFsaWQgIT0gMCkKKwkJCXJldHZhbCB8PSBB SENfUlVOX1RRSU5GSUZPOworCX0KKyNlbmRpZgorCXJldHVybiAocmV0dmFsKTsKK30KKworLyoK KyAqIENhdGNoIGFuIGludGVycnVwdCBmcm9tIHRoZSBhZGFwdGVyCisgKi8KK2ludAorYWhjX2lu dHIoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQoreworCXVfaW50CWludHN0YXQ7CisKKwlpZiAoKGFo Yy0+cGF1c2UgJiBJTlRFTikgPT0gMCkgeworCQkvKgorCQkgKiBPdXIgaW50ZXJydXB0IGlzIG5v dCBlbmFibGVkIG9uIHRoZSBjaGlwCisJCSAqIGFuZCBtYXkgYmUgZGlzYWJsZWQgZm9yIHJlLWVu dHJhbmN5IHJlYXNvbnMsCisJCSAqIHNvIGp1c3QgcmV0dXJuLiAgVGhpcyBpcyBsaWtlbHkganVz dCBhIHNoYXJlZAorCQkgKiBpbnRlcnJ1cHQuCisJCSAqLworCQlyZXR1cm4gKDApOworCX0KKwkv KgorCSAqIEluc3RlYWQgb2YgZGlyZWN0bHkgcmVhZGluZyB0aGUgaW50ZXJydXB0IHN0YXR1cyBy ZWdpc3RlciwKKwkgKiBpbmZlciB0aGUgY2F1c2Ugb2YgdGhlIGludGVycnVwdCBieSBjaGVja2lu ZyBvdXIgaW4tY29yZQorCSAqIGNvbXBsZXRpb24gcXVldWVzLiAgVGhpcyBhdm9pZHMgYSBjb3N0 bHkgUENJIGJ1cyByZWFkIGluCisJICogbW9zdCBjYXNlcy4KKwkgKi8KKwlpZiAoKGFoYy0+Zmxh Z3MgJiAoQUhDX0FMTF9JTlRFUlJVUFRTfEFIQ19FREdFX0lOVEVSUlVQVCkpID09IDAKKwkgJiYg KGFoY19jaGVja19jbWRjbXBsdHF1ZXVlcyhhaGMpICE9IDApKQorCQlpbnRzdGF0ID0gQ01EQ01Q TFQ7CisJZWxzZSB7CisJCWludHN0YXQgPSBhaGNfaW5iKGFoYywgSU5UU1RBVCk7CisJfQorCisJ aWYgKChpbnRzdGF0ICYgSU5UX1BFTkQpID09IDApIHsKKyNpZiBBSENfUENJX0NPTkZJRyA+IDAK KwkJaWYgKGFoYy0+dW5zb2xpY2l0ZWRfaW50cyA+IDUwMCkgeworCQkJYWhjLT51bnNvbGljaXRl ZF9pbnRzID0gMDsKKwkJCWlmICgoYWhjLT5jaGlwICYgQUhDX1BDSSkgIT0gMAorCQkJICYmIChh aGNfaW5iKGFoYywgRVJST1IpICYgUENJRVJSU1RBVCkgIT0gMCkKKwkJCQlhaGMtPmJ1c19pbnRy KGFoYyk7CisJCX0KKyNlbmRpZgorCQlhaGMtPnVuc29saWNpdGVkX2ludHMrKzsKKwkJcmV0dXJu ICgwKTsKKwl9CisJYWhjLT51bnNvbGljaXRlZF9pbnRzID0gMDsKKworCWlmIChpbnRzdGF0ICYg Q01EQ01QTFQpIHsKKwkJYWhjX291dGIoYWhjLCBDTFJJTlQsIENMUkNNRElOVCk7CisKKwkJLyoK KwkJICogRW5zdXJlIHRoYXQgdGhlIGNoaXAgc2VlcyB0aGF0IHdlJ3ZlIGNsZWFyZWQKKwkJICog dGhpcyBpbnRlcnJ1cHQgYmVmb3JlIHdlIHdhbGsgdGhlIG91dHB1dCBmaWZvLgorCQkgKiBPdGhl cndpc2UsIHdlIG1heSwgZHVlIHRvIHBvc3RlZCBidXMgd3JpdGVzLAorCQkgKiBjbGVhciB0aGUg aW50ZXJydXB0IGFmdGVyIHdlIGZpbmlzaCB0aGUgc2NhbiwKKwkJICogYW5kIGFmdGVyIHRoZSBz ZXF1ZW5jZXIgaGFzIGFkZGVkIG5ldyBlbnRyaWVzCisJCSAqIGFuZCBhc3NlcnRlZCB0aGUgaW50 ZXJydXB0IGFnYWluLgorCQkgKi8KKwkJYWhjX2ZsdXNoX2RldmljZV93cml0ZXMoYWhjKTsKKwkJ YWhjX3J1bl9xb3V0ZmlmbyhhaGMpOworI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQorCQlpZiAoKGFo Yy0+ZmxhZ3MgJiBBSENfVEFSR0VUUk9MRSkgIT0gMCkKKwkJCWFoY19ydW5fdHFpbmZpZm8oYWhj LCAvKnBhdXNlZCovRkFMU0UpOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBIYW5kbGUgc3RhdHVz ZXMgdGhhdCBtYXkgaW52YWxpZGF0ZSBvdXIgY2FjaGVkCisJICogY29weSBvZiBJTlRTVEFUIHNl cGFyYXRlbHkuCisJICovCisJaWYgKGludHN0YXQgPT0gMHhGRiAmJiAoYWhjLT5mZWF0dXJlcyAm IEFIQ19SRU1PVkFCTEUpICE9IDApIHsKKwkJLyogSG90IGVqZWN0LiAgRG8gbm90aGluZyAqLwor CX0gZWxzZSBpZiAoaW50c3RhdCAmIEJSS0FEUklOVCkgeworCQlhaGNfaGFuZGxlX2Jya2Fkcmlu dChhaGMpOworCX0gZWxzZSBpZiAoKGludHN0YXQgJiAoU0VRSU5UfFNDU0lJTlQpKSAhPSAwKSB7 CisKKwkJYWhjX3BhdXNlX2J1Z19maXgoYWhjKTsKKworCQlpZiAoKGludHN0YXQgJiBTRVFJTlQp ICE9IDApCisJCQlhaGNfaGFuZGxlX3NlcWludChhaGMsIGludHN0YXQpOworCisJCWlmICgoaW50 c3RhdCAmIFNDU0lJTlQpICE9IDApCisJCQlhaGNfaGFuZGxlX3Njc2lpbnQoYWhjLCBpbnRzdGF0 KTsKKwl9CisJcmV0dXJuICgxKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKiogU2Vx dWVuY2VyIEV4ZWN1dGlvbiBDb250cm9sICoqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAg KiBSZXN0YXJ0IHRoZSBzZXF1ZW5jZXIgcHJvZ3JhbSBmcm9tIGFkZHJlc3MgemVybwotLS0gbGlu dXgtMi42LjIzLXJjMS5vcmcvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9pbmxpbmUuaAlN b24gSnVsICA5IDAwOjMyOjE3IDIwMDcKKysrIGxpbnV4LTIuNi4yMy1yYzEuYWljL2RyaXZlcnMv c2NzaS9haWM3eHh4L2FpYzd4eHhfaW5saW5lLmgJVHVlIEp1bCAzMSAwNzozMzozMyAyMDA3CkBA IC00Niw3NSArNDYsMTEgQEAKICNkZWZpbmUgX0FJQzdYWFhfSU5MSU5FX0hfCiAKIC8qKioqKioq KioqKioqKioqKioqKioqKioqIFNlcXVlbmNlciBFeGVjdXRpb24gQ29udHJvbCAqKioqKioqKioq KioqKioqKioqKioqKiovCi1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfcGF1c2VfYnVnX2ZpeChz dHJ1Y3QgYWhjX3NvZnRjICphaGMpOwotc3RhdGljIF9faW5saW5lIGludCAgYWhjX2lzX3BhdXNl ZChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwotc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3BhdXNl KHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfdW5wYXVz ZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwordm9pZCBhaGNfcGF1c2VfYnVnX2ZpeChzdHJ1Y3Qg YWhjX3NvZnRjICphaGMpOworaW50ICBhaGNfaXNfcGF1c2VkKHN0cnVjdCBhaGNfc29mdGMgKmFo Yyk7Cit2b2lkIGFoY19wYXVzZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwordm9pZCBhaGNfdW5w YXVzZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwogCi0vKgotICogV29yayBhcm91bmQgYW55IGNo aXAgYnVncyByZWxhdGVkIHRvIGhhbHRpbmcgc2VxdWVuY2VyIGV4ZWN1dGlvbi4KLSAqIE9uIFVs dHJhMiBjb250cm9sbGVycywgd2UgbXVzdCBjbGVhciB0aGUgQ0lPQlVTIHN0cmV0Y2ggc2lnbmFs IGJ5Ci0gKiByZWFkaW5nIGEgcmVnaXN0ZXIgdGhhdCB3aWxsIHNldCB0aGlzIHNpZ25hbCBhbmQg ZGVhc3NlcnQgaXQuCi0gKiBXaXRob3V0IHRoaXMgd29ya2Fyb3VuZCwgaWYgdGhlIGNoaXAgaXMg cGF1c2VkLCBieSBhbiBpbnRlcnJ1cHQgb3IKLSAqIG1hbnVhbCBwYXVzZSB3aGlsZSBhY2Nlc3Np bmcgc2NiIHJhbSwgYWNjZXNzZXMgdG8gY2VydGFpbiByZWdpc3RlcnMKLSAqIHdpbGwgaGFuZyB0 aGUgc3lzdGVtIChpbmZpbml0ZSBwY2kgcmV0cmllcykuCi0gKi8KLXN0YXRpYyBfX2lubGluZSB2 b2lkCi1haGNfcGF1c2VfYnVnX2ZpeChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCi17Ci0JaWYgKChh aGMtPmZlYXR1cmVzICYgQUhDX1VMVFJBMikgIT0gMCkKLQkJKHZvaWQpYWhjX2luYihhaGMsIEND U0NCQ1RMKTsKLX0KLQotLyoKLSAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzZXF1ZW5jZXIgaGFz IGhhbHRlZCBjb2RlIGV4ZWN1dGlvbi4KLSAqIFJldHVybnMgbm9uLXplcm8gc3RhdHVzIGlmIHRo ZSBzZXF1ZW5jZXIgaXMgc3RvcHBlZC4KLSAqLwotc3RhdGljIF9faW5saW5lIGludAotYWhjX2lz X3BhdXNlZChzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCi17Ci0JcmV0dXJuICgoYWhjX2luYihhaGMs IEhDTlRSTCkgJiBQQVVTRSkgIT0gMCk7Ci19Ci0KLS8qCi0gKiBSZXF1ZXN0IHRoYXQgdGhlIHNl cXVlbmNlciBzdG9wIGFuZCB3YWl0LCBpbmRlZmluaXRlbHksIGZvciBpdAotICogdG8gc3RvcC4g IFRoZSBzZXF1ZW5jZXIgd2lsbCBvbmx5IGFja25vd2xlZGdlIHRoYXQgaXQgaXMgcGF1c2VkCi0g KiBvbmNlIGl0IGhhcyByZWFjaGVkIGFuIGluc3RydWN0aW9uIGJvdW5kYXJ5IGFuZCBQQVVTRURJ UyBpcwotICogY2xlYXJlZCBpbiB0aGUgU0VRQ1RMIHJlZ2lzdGVyLiAgVGhlIHNlcXVlbmNlciBt YXkgdXNlIFBBVVNFRElTCi0gKiBmb3IgY3JpdGljYWwgc2VjdGlvbnMuCi0gKi8KLXN0YXRpYyBf X2lubGluZSB2b2lkCi1haGNfcGF1c2Uoc3RydWN0IGFoY19zb2Z0YyAqYWhjKQotewotCWFoY19v dXRiKGFoYywgSENOVFJMLCBhaGMtPnBhdXNlKTsKLQotCS8qCi0JICogU2luY2UgdGhlIHNlcXVl bmNlciBjYW4gZGlzYWJsZSBwYXVzaW5nIGluIGEgY3JpdGljYWwgc2VjdGlvbiwgd2UKLQkgKiBt dXN0IGxvb3AgdW50aWwgaXQgYWN0dWFsbHkgc3RvcHMuCi0JICovCi0Jd2hpbGUgKGFoY19pc19w YXVzZWQoYWhjKSA9PSAwKQotCQk7Ci0KLQlhaGNfcGF1c2VfYnVnX2ZpeChhaGMpOwotfQotCi0v KgotICogQWxsb3cgdGhlIHNlcXVlbmNlciB0byBjb250aW51ZSBwcm9ncmFtIGV4ZWN1dGlvbi4K LSAqIFdlIGNoZWNrIGhlcmUgdG8gZW5zdXJlIHRoYXQgbm8gYWRkaXRpb25hbCBpbnRlcnJ1cHQK LSAqIHNvdXJjZXMgdGhhdCB3b3VsZCBjYXVzZSB0aGUgc2VxdWVuY2VyIHRvIGhhbHQgaGF2ZSBi ZWVuCi0gKiBhc3NlcnRlZC4gIElmLCBmb3IgZXhhbXBsZSwgYSBTQ1NJIGJ1cyByZXNldCBpcyBk ZXRlY3RlZAotICogd2hpbGUgd2UgYXJlIGZpZWxkaW5nIGEgZGlmZmVyZW50LCBwYXVzaW5nLCBp bnRlcnJ1cHQgdHlwZSwKLSAqIHdlIGRvbid0IHdhbnQgdG8gcmVsZWFzZSB0aGUgc2VxdWVuY2Vy IGJlZm9yZSBnb2luZyBiYWNrCi0gKiBpbnRvIG91ciBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgZGVh bGluZyB3aXRoIHRoaXMgbmV3Ci0gKiBjb25kaXRpb24uCi0gKi8KLXN0YXRpYyBfX2lubGluZSB2 b2lkCi1haGNfdW5wYXVzZShzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCi17Ci0JaWYgKChhaGNfaW5i KGFoYywgSU5UU1RBVCkgJiAoU0NTSUlOVCB8IFNFUUlOVCB8IEJSS0FEUklOVCkpID09IDApCi0J CWFoY19vdXRiKGFoYywgSENOVFJMLCBhaGMtPnVucGF1c2UpOwotfQotCiAvKioqKioqKioqKioq KioqKioqKioqKiogVW50YWdnZWQgVHJhbnNhY3Rpb24gUm91dGluZXMgKioqKioqKioqKioqKioq KioqKioqKioqLwogc3RhdGljIF9faW5saW5lIHZvaWQJYWhjX2ZyZWV6ZV91bnRhZ2dlZF9xdWV1 ZXMoc3RydWN0IGFoY19zb2Z0YyAqYWhjKTsKIHN0YXRpYyBfX2lubGluZSB2b2lkCWFoY19yZWxl YXNlX3VudGFnZ2VkX3F1ZXVlcyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwpAQCAtMTQ3LDc5ICs4 MywyMiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogTWVtb3J5IG1hcHBpbmcg cm91dGluZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIF9faW5saW5lIHN0 cnVjdCBhaGNfZG1hX3NlZyAqCi0JCQlhaGNfc2dfYnVzX3RvX3ZpcnQoc3RydWN0IHNjYiAqc2Ni LAotCQkJCQkgICB1aW50MzJfdCBzZ19idXNhZGRyKTsKLXN0YXRpYyBfX2lubGluZSB1aW50MzJf dAotCQkJYWhjX3NnX3ZpcnRfdG9fYnVzKHN0cnVjdCBzY2IgKnNjYiwKLQkJCQkJICAgc3RydWN0 IGFoY19kbWFfc2VnICpzZyk7Ci1zdGF0aWMgX19pbmxpbmUgdWludDMyX3QKLQkJCWFoY19oc2Ni X2J1c2FkZHIoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBpbmRleCk7Ci1zdGF0aWMgX19p bmxpbmUgdm9pZAlhaGNfc3luY19zY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjLAotCQkJCSAgICAg c3RydWN0IHNjYiAqc2NiLCBpbnQgb3ApOwotc3RhdGljIF9faW5saW5lIHZvaWQJYWhjX3N5bmNf c2dsaXN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKLQkJCQkJc3RydWN0IHNjYiAqc2NiLCBpbnQg b3ApOwotc3RhdGljIF9faW5saW5lIHVpbnQzMl90Ci0JCQlhaGNfdGFyZ2V0Y21kX29mZnNldChz dHJ1Y3QgYWhjX3NvZnRjICphaGMsCi0JCQkJCSAgICAgdV9pbnQgaW5kZXgpOworc3RydWN0IGFo Y19kbWFfc2VnICoKKwlhaGNfc2dfYnVzX3RvX3ZpcnQoc3RydWN0IHNjYiAqc2NiLAorCQkJICAg dWludDMyX3Qgc2dfYnVzYWRkcik7Cit1aW50MzJfdAorCWFoY19zZ192aXJ0X3RvX2J1cyhzdHJ1 Y3Qgc2NiICpzY2IsCisJCQkgICBzdHJ1Y3QgYWhjX2RtYV9zZWcgKnNnKTsKK3VpbnQzMl90CisJ YWhjX2hzY2JfYnVzYWRkcihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IGluZGV4KTsKK3Zv aWQJYWhjX3N5bmNfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJICAgICBzdHJ1Y3Qgc2Ni ICpzY2IsIGludCBvcCk7Cit2b2lkCWFoY19zeW5jX3NnbGlzdChzdHJ1Y3QgYWhjX3NvZnRjICph aGMsCisJCQlzdHJ1Y3Qgc2NiICpzY2IsIGludCBvcCk7Cit1aW50MzJfdAorCWFoY190YXJnZXRj bWRfb2Zmc2V0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCSAgICAgdV9pbnQgaW5kZXgpOwog Ci1zdGF0aWMgX19pbmxpbmUgc3RydWN0IGFoY19kbWFfc2VnICoKLWFoY19zZ19idXNfdG9fdmly dChzdHJ1Y3Qgc2NiICpzY2IsIHVpbnQzMl90IHNnX2J1c2FkZHIpCi17Ci0JaW50IHNnX2luZGV4 OwotCi0Jc2dfaW5kZXggPSAoc2dfYnVzYWRkciAtIHNjYi0+c2dfbGlzdF9waHlzKS9zaXplb2Yo c3RydWN0IGFoY19kbWFfc2VnKTsKLQkvKiBzZ19saXN0X3BoeXMgcG9pbnRzIHRvIGVudHJ5IDEs IG5vdCAwICovCi0Jc2dfaW5kZXgrKzsKLQotCXJldHVybiAoJnNjYi0+c2dfbGlzdFtzZ19pbmRl eF0pOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdWludDMyX3QKLWFoY19zZ192aXJ0X3RvX2J1cyhz dHJ1Y3Qgc2NiICpzY2IsIHN0cnVjdCBhaGNfZG1hX3NlZyAqc2cpCi17Ci0JaW50IHNnX2luZGV4 OwotCi0JLyogc2dfbGlzdF9waHlzIHBvaW50cyB0byBlbnRyeSAxLCBub3QgMCAqLwotCXNnX2lu ZGV4ID0gc2cgLSAmc2NiLT5zZ19saXN0WzFdOwotCi0JcmV0dXJuIChzY2ItPnNnX2xpc3RfcGh5 cyArIChzZ19pbmRleCAqIHNpemVvZigqc2NiLT5zZ19saXN0KSkpOwotfQotCi1zdGF0aWMgX19p bmxpbmUgdWludDMyX3QKLWFoY19oc2NiX2J1c2FkZHIoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1 X2ludCBpbmRleCkKLXsKLQlyZXR1cm4gKGFoYy0+c2NiX2RhdGEtPmhzY2JfYnVzYWRkcgotCQkr IChzaXplb2Yoc3RydWN0IGhhcmR3YXJlX3NjYikgKiBpbmRleCkpOwotfQotCi1zdGF0aWMgX19p bmxpbmUgdm9pZAotYWhjX3N5bmNfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNj YiAqc2NiLCBpbnQgb3ApCi17Ci0JYWhjX2RtYW1hcF9zeW5jKGFoYywgYWhjLT5zY2JfZGF0YS0+ aHNjYl9kbWF0LAotCQkJYWhjLT5zY2JfZGF0YS0+aHNjYl9kbWFtYXAsCi0JCQkvKm9mZnNldCov KHNjYi0+aHNjYiAtIGFoYy0+aHNjYnMpICogc2l6ZW9mKCpzY2ItPmhzY2IpLAotCQkJLypsZW4q L3NpemVvZigqc2NiLT5oc2NiKSwgb3ApOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhj X3N5bmNfc2dsaXN0KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiLCBpbnQg b3ApCi17Ci0JaWYgKHNjYi0+c2dfY291bnQgPT0gMCkKLQkJcmV0dXJuOwotCi0JYWhjX2RtYW1h cF9zeW5jKGFoYywgYWhjLT5zY2JfZGF0YS0+c2dfZG1hdCwgc2NiLT5zZ19tYXAtPnNnX2RtYW1h cCwKLQkJCS8qb2Zmc2V0Ki8oc2NiLT5zZ19saXN0IC0gc2NiLT5zZ19tYXAtPnNnX3ZhZGRyKQot CQkJCSogc2l6ZW9mKHN0cnVjdCBhaGNfZG1hX3NlZyksCi0JCQkvKmxlbiovc2l6ZW9mKHN0cnVj dCBhaGNfZG1hX3NlZykgKiBzY2ItPnNnX2NvdW50LCBvcCk7Ci19Ci0KLXN0YXRpYyBfX2lubGlu ZSB1aW50MzJfdAotYWhjX3RhcmdldGNtZF9vZmZzZXQoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1 X2ludCBpbmRleCkKLXsKLQlyZXR1cm4gKCgodWludDhfdCAqKSZhaGMtPnRhcmdldGNtZHNbaW5k ZXhdKSAtIGFoYy0+cW91dGZpZm8pOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiogRGVidWdnaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3Rh dGljIF9faW5saW5lIGNoYXIgKmFoY19uYW1lKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CiAKQEAg LTIzMCw0MjEgKzEwOSw0NCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKiogTWlzY2Vs YW5lb3VzIFN1cHBvcnQgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqLwordm9pZAlh aGNfdXBkYXRlX3Jlc2lkdWFsKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCSAgICBzdHJ1Y3Qg c2NiICpzY2IpOworc3RydWN0IGFoY19pbml0aWF0b3JfdGluZm8gKgorCWFoY19mZXRjaF90cmFu c2luZm8oc3RydWN0IGFoY19zb2Z0YyAqYWhjLAorCQkJICAgIGNoYXIgY2hhbm5lbCwgdV9pbnQg b3VyX2lkLAorCQkJICAgIHVfaW50IHJlbW90ZV9pZCwKKwkJCSAgICBzdHJ1Y3QgYWhjX3Rtb2Rl X3RzdGF0ZSAqKnRzdGF0ZSk7Cit1aW50MTZfdAorCWFoY19pbncoc3RydWN0IGFoY19zb2Z0YyAq YWhjLCB1X2ludCBwb3J0KTsKK3ZvaWQJYWhjX291dHcoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1 X2ludCBwb3J0LAorCQkgdV9pbnQgdmFsdWUpOwordWludDMyX3QKKwlhaGNfaW5sKHN0cnVjdCBh aGNfc29mdGMgKmFoYywgdV9pbnQgcG9ydCk7Cit2b2lkCWFoY19vdXRsKHN0cnVjdCBhaGNfc29m dGMgKmFoYywgdV9pbnQgcG9ydCwKKwkJIHVpbnQzMl90IHZhbHVlKTsKK3VpbnQ2NF90CisJYWhj X2lucShzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQpOwordm9pZAlhaGNfb3V0cShz dHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQsCisJCSB1aW50NjRfdCB2YWx1ZSk7Citz dHJ1Y3Qgc2NiKgorCWFoY19nZXRfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7Cit2b2lkCWFo Y19mcmVlX3NjYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYik7CitzdHJ1 Y3Qgc2NiICoKKwlhaGNfbG9va3VwX3NjYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHRh Zyk7Cit2b2lkCWFoY19zd2FwX3dpdGhfbmV4dF9oc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywK KwkJCQlzdHJ1Y3Qgc2NiICpzY2IpOwordm9pZAlhaGNfcXVldWVfc2NiKHN0cnVjdCBhaGNfc29m dGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKTsKK3N0cnVjdCBzY3NpX3NlbnNlX2RhdGEgKgorCWFo Y19nZXRfc2Vuc2VfYnVmKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKKwkJCSAgc3RydWN0IHNjYiAq c2NiKTsKK3VpbnQzMl90CisJYWhjX2dldF9zZW5zZV9idWZhZGRyKHN0cnVjdCBhaGNfc29mdGMg KmFoYywKKwkJCSAgICAgIHN0cnVjdCBzY2IgKnNjYik7CiAKLXN0YXRpYyBfX2lubGluZSB2b2lk CWFoY191cGRhdGVfcmVzaWR1YWwoc3RydWN0IGFoY19zb2Z0YyAqYWhjLAotCQkJCQkgICAgc3Ry dWN0IHNjYiAqc2NiKTsKLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3QgYWhjX2luaXRpYXRvcl90aW5m byAqCi0JCQlhaGNfZmV0Y2hfdHJhbnNpbmZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYywKLQkJCQkJ ICAgIGNoYXIgY2hhbm5lbCwgdV9pbnQgb3VyX2lkLAotCQkJCQkgICAgdV9pbnQgcmVtb3RlX2lk LAotCQkJCQkgICAgc3RydWN0IGFoY190bW9kZV90c3RhdGUgKip0c3RhdGUpOwotc3RhdGljIF9f aW5saW5lIHVpbnQxNl90Ci0JCQlhaGNfaW53KHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQg cG9ydCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfb3V0dyhzdHJ1Y3QgYWhjX3NvZnRjICph aGMsIHVfaW50IHBvcnQsCi0JCQkJIHVfaW50IHZhbHVlKTsKLXN0YXRpYyBfX2lubGluZSB1aW50 MzJfdAotCQkJYWhjX2lubChzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQpOwotc3Rh dGljIF9faW5saW5lIHZvaWQJYWhjX291dGwoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBw b3J0LAotCQkJCSB1aW50MzJfdCB2YWx1ZSk7Ci1zdGF0aWMgX19pbmxpbmUgdWludDY0X3QKLQkJ CWFoY19pbnEoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBwb3J0KTsKLXN0YXRpYyBfX2lu bGluZSB2b2lkCWFoY19vdXRxKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcG9ydCwKLQkJ CQkgdWludDY0X3QgdmFsdWUpOwotc3RhdGljIF9faW5saW5lIHN0cnVjdCBzY2IqCi0JCQlhaGNf Z2V0X3NjYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwotc3RhdGljIF9faW5saW5lIHZvaWQJYWhj X2ZyZWVfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKTsKLXN0YXRp YyBfX2lubGluZSB2b2lkCWFoY19zd2FwX3dpdGhfbmV4dF9oc2NiKHN0cnVjdCBhaGNfc29mdGMg KmFoYywKLQkJCQkJCXN0cnVjdCBzY2IgKnNjYik7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNf cXVldWVfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKTsKLXN0YXRp YyBfX2lubGluZSBzdHJ1Y3Qgc2NzaV9zZW5zZV9kYXRhICoKLQkJCWFoY19nZXRfc2Vuc2VfYnVm KHN0cnVjdCBhaGNfc29mdGMgKmFoYywKLQkJCQkJICBzdHJ1Y3Qgc2NiICpzY2IpOwotc3RhdGlj IF9faW5saW5lIHVpbnQzMl90Ci0JCQlhaGNfZ2V0X3NlbnNlX2J1ZmFkZHIoc3RydWN0IGFoY19z b2Z0YyAqYWhjLAotCQkJCQkgICAgICBzdHJ1Y3Qgc2NiICpzY2IpOwotCi0vKgotICogRGV0ZXJt aW5lIHdoZXRoZXIgdGhlIHNlcXVlbmNlciByZXBvcnRlZCBhIHJlc2lkdWFsCi0gKiBmb3IgdGhp cyBTQ0IvdHJhbnNhY3Rpb24uCi0gKi8KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGNfdXBkYXRl X3Jlc2lkdWFsKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3RydWN0IHNjYiAqc2NiKQotewotCXVp bnQzMl90IHNncHRyOwotCi0Jc2dwdHIgPSBhaGNfbGUzMnRvaChzY2ItPmhzY2ItPnNncHRyKTsK LQlpZiAoKHNncHRyICYgU0dfUkVTSURfVkFMSUQpICE9IDApCi0JCWFoY19jYWxjX3Jlc2lkdWFs KGFoYywgc2NiKTsKLX0KLQotLyoKLSAqIFJldHVybiBwb2ludGVycyB0byB0aGUgdHJhbnNmZXIg bmVnb3RpYXRpb24gaW5mb3JtYXRpb24KLSAqIGZvciB0aGUgc3BlY2lmaWVkIG91cl9pZC9yZW1v dGVfaWQgcGFpci4KLSAqLwotc3RhdGljIF9faW5saW5lIHN0cnVjdCBhaGNfaW5pdGlhdG9yX3Rp bmZvICoKLWFoY19mZXRjaF90cmFuc2luZm8oc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBjaGFyIGNo YW5uZWwsIHVfaW50IG91cl9pZCwKLQkJICAgIHVfaW50IHJlbW90ZV9pZCwgc3RydWN0IGFoY190 bW9kZV90c3RhdGUgKip0c3RhdGUpCi17Ci0JLyoKLQkgKiBUcmFuc2ZlciBkYXRhIHN0cnVjdHVy ZXMgYXJlIHN0b3JlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZQotCSAqIG9mIHRoZSB0YXJnZXQgcm9s ZS4gIFNpbmNlIHRoZSBwYXJhbWV0ZXJzIGZvciBhIGNvbm5lY3Rpb24KLQkgKiBpbiB0aGUgaW5p dGlhdG9yIHJvbGUgdG8gYSBnaXZlbiB0YXJnZXQgYXJlIHRoZSBzYW1lIGFzCi0JICogd2hlbiB0 aGUgcm9sZXMgYXJlIHJldmVyc2VkLCB3ZSBwcmV0ZW5kIHdlIGFyZSB0aGUgdGFyZ2V0LgotCSAq LwotCWlmIChjaGFubmVsID09ICdCJykKLQkJb3VyX2lkICs9IDg7Ci0JKnRzdGF0ZSA9IGFoYy0+ ZW5hYmxlZF90YXJnZXRzW291cl9pZF07Ci0JcmV0dXJuICgmKCp0c3RhdGUpLT50cmFuc2luZm9b cmVtb3RlX2lkXSk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB1aW50MTZfdAotYWhjX2ludyhzdHJ1 Y3QgYWhjX3NvZnRjICphaGMsIHVfaW50IHBvcnQpCi17Ci0JdWludDE2X3QgciA9IGFoY19pbmIo YWhjLCBwb3J0KzEpIDw8IDg7Ci0JcmV0dXJuIHIgfCBhaGNfaW5iKGFoYywgcG9ydCk7Ci19Ci0K LXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGNfb3V0dyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHVf aW50IHBvcnQsIHVfaW50IHZhbHVlKQotewotCWFoY19vdXRiKGFoYywgcG9ydCwgdmFsdWUgJiAw eEZGKTsKLQlhaGNfb3V0YihhaGMsIHBvcnQrMSwgKHZhbHVlID4+IDgpICYgMHhGRik7Ci19Ci0K LXN0YXRpYyBfX2lubGluZSB1aW50MzJfdAotYWhjX2lubChzdHJ1Y3QgYWhjX3NvZnRjICphaGMs IHVfaW50IHBvcnQpCi17Ci0JcmV0dXJuICgoYWhjX2luYihhaGMsIHBvcnQpKQotCSAgICAgIHwg KGFoY19pbmIoYWhjLCBwb3J0KzEpIDw8IDgpCi0JICAgICAgfCAoYWhjX2luYihhaGMsIHBvcnQr MikgPDwgMTYpCi0JICAgICAgfCAoYWhjX2luYihhaGMsIHBvcnQrMykgPDwgMjQpKTsKLX0KLQot c3RhdGljIF9faW5saW5lIHZvaWQKLWFoY19vdXRsKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9p bnQgcG9ydCwgdWludDMyX3QgdmFsdWUpCi17Ci0JYWhjX291dGIoYWhjLCBwb3J0LCAodmFsdWUp ICYgMHhGRik7Ci0JYWhjX291dGIoYWhjLCBwb3J0KzEsICgodmFsdWUpID4+IDgpICYgMHhGRik7 Ci0JYWhjX291dGIoYWhjLCBwb3J0KzIsICgodmFsdWUpID4+IDE2KSAmIDB4RkYpOwotCWFoY19v dXRiKGFoYywgcG9ydCszLCAoKHZhbHVlKSA+PiAyNCkgJiAweEZGKTsKLX0KLQotc3RhdGljIF9f aW5saW5lIHVpbnQ2NF90Ci1haGNfaW5xKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgcG9y dCkKLXsKLQlyZXR1cm4gKChhaGNfaW5iKGFoYywgcG9ydCkpCi0JICAgICAgfCAoYWhjX2luYihh aGMsIHBvcnQrMSkgPDwgOCkKLQkgICAgICB8IChhaGNfaW5iKGFoYywgcG9ydCsyKSA8PCAxNikK LQkgICAgICB8IChhaGNfaW5iKGFoYywgcG9ydCszKSA8PCAyNCkKLQkgICAgICB8ICgoKHVpbnQ2 NF90KWFoY19pbmIoYWhjLCBwb3J0KzQpKSA8PCAzMikKLQkgICAgICB8ICgoKHVpbnQ2NF90KWFo Y19pbmIoYWhjLCBwb3J0KzUpKSA8PCA0MCkKLQkgICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIo YWhjLCBwb3J0KzYpKSA8PCA0OCkKLQkgICAgICB8ICgoKHVpbnQ2NF90KWFoY19pbmIoYWhjLCBw b3J0KzcpKSA8PCA1NikpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhjX291dHEoc3Ry dWN0IGFoY19zb2Z0YyAqYWhjLCB1X2ludCBwb3J0LCB1aW50NjRfdCB2YWx1ZSkKLXsKLQlhaGNf b3V0YihhaGMsIHBvcnQsIHZhbHVlICYgMHhGRik7Ci0JYWhjX291dGIoYWhjLCBwb3J0KzEsICh2 YWx1ZSA+PiA4KSAmIDB4RkYpOwotCWFoY19vdXRiKGFoYywgcG9ydCsyLCAodmFsdWUgPj4gMTYp ICYgMHhGRik7Ci0JYWhjX291dGIoYWhjLCBwb3J0KzMsICh2YWx1ZSA+PiAyNCkgJiAweEZGKTsK LQlhaGNfb3V0YihhaGMsIHBvcnQrNCwgKHZhbHVlID4+IDMyKSAmIDB4RkYpOwotCWFoY19vdXRi KGFoYywgcG9ydCs1LCAodmFsdWUgPj4gNDApICYgMHhGRik7Ci0JYWhjX291dGIoYWhjLCBwb3J0 KzYsICh2YWx1ZSA+PiA0OCkgJiAweEZGKTsKLQlhaGNfb3V0YihhaGMsIHBvcnQrNywgKHZhbHVl ID4+IDU2KSAmIDB4RkYpOwotfQotCi0vKgotICogR2V0IGEgZnJlZSBzY2IuIElmIHRoZXJlIGFy ZSBub25lLCBzZWUgaWYgd2UgY2FuIGFsbG9jYXRlIGEgbmV3IFNDQi4KLSAqLwotc3RhdGljIF9f aW5saW5lIHN0cnVjdCBzY2IgKgotYWhjX2dldF9zY2Ioc3RydWN0IGFoY19zb2Z0YyAqYWhjKQot ewotCXN0cnVjdCBzY2IgKnNjYjsKLQotCWlmICgoc2NiID0gU0xJU1RfRklSU1QoJmFoYy0+c2Ni X2RhdGEtPmZyZWVfc2NicykpID09IE5VTEwpIHsKLQkJYWhjX2FsbG9jX3NjYnMoYWhjKTsKLQkJ c2NiID0gU0xJU1RfRklSU1QoJmFoYy0+c2NiX2RhdGEtPmZyZWVfc2Nicyk7Ci0JCWlmIChzY2Ig PT0gTlVMTCkKLQkJCXJldHVybiAoTlVMTCk7Ci0JfQotCVNMSVNUX1JFTU9WRV9IRUFEKCZhaGMt PnNjYl9kYXRhLT5mcmVlX3NjYnMsIGxpbmtzLnNsZSk7Ci0JcmV0dXJuIChzY2IpOwotfQotCi0v KgotICogUmV0dXJuIGFuIFNDQiByZXNvdXJjZSB0byB0aGUgZnJlZSBsaXN0LgotICovCi1zdGF0 aWMgX19pbmxpbmUgdm9pZAotYWhjX2ZyZWVfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3Ry dWN0IHNjYiAqc2NiKQoteyAgICAgICAKLQlzdHJ1Y3QgaGFyZHdhcmVfc2NiICpoc2NiOwotCi0J aHNjYiA9IHNjYi0+aHNjYjsKLQkvKiBDbGVhbiB1cCBmb3IgdGhlIG5leHQgdXNlciAqLwotCWFo Yy0+c2NiX2RhdGEtPnNjYmluZGV4W2hzY2ItPnRhZ10gPSBOVUxMOwotCXNjYi0+ZmxhZ3MgPSBT Q0JfRlJFRTsKLQloc2NiLT5jb250cm9sID0gMDsKLQotCVNMSVNUX0lOU0VSVF9IRUFEKCZhaGMt PnNjYl9kYXRhLT5mcmVlX3NjYnMsIHNjYiwgbGlua3Muc2xlKTsKLQotCS8qIE5vdGlmeSB0aGUg T1NNIHRoYXQgYSByZXNvdXJjZSBpcyBub3cgYXZhaWxhYmxlLiAqLwotCWFoY19wbGF0Zm9ybV9z Y2JfZnJlZShhaGMsIHNjYik7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSBzdHJ1Y3Qgc2NiICoKLWFo Y19sb29rdXBfc2NiKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgdV9pbnQgdGFnKQotewotCXN0cnVj dCBzY2IqIHNjYjsKLQotCXNjYiA9IGFoYy0+c2NiX2RhdGEtPnNjYmluZGV4W3RhZ107Ci0JaWYg KHNjYiAhPSBOVUxMKQotCQlhaGNfc3luY19zY2IoYWhjLCBzY2IsCi0JCQkgICAgIEJVU19ETUFT WU5DX1BPU1RSRUFEfEJVU19ETUFTWU5DX1BPU1RXUklURSk7Ci0JcmV0dXJuIChzY2IpOwotfQot Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhjX3N3YXBfd2l0aF9uZXh0X2hzY2Ioc3RydWN0IGFo Y19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCi17Ci0Jc3RydWN0IGhhcmR3YXJlX3NjYiAq cV9oc2NiOwotCXVfaW50ICBzYXZlZF90YWc7Ci0KLQkvKgotCSAqIE91ciBxdWV1aW5nIG1ldGhv ZCBpcyBhIGJpdCB0cmlja3kuICBUaGUgY2FyZAotCSAqIGtub3dzIGluIGFkdmFuY2Ugd2hpY2gg SFNDQiB0byBkb3dubG9hZCwgYW5kIHdlCi0JICogY2FuJ3QgZGlzYXBwb2ludCBpdC4gIFRvIGFj aGlldmUgdGhpcywgdGhlIG5leHQKLQkgKiBTQ0IgdG8gZG93bmxvYWQgaXMgc2F2ZWQgb2ZmIGlu IGFoYy0+bmV4dF9xdWV1ZWRfc2NiLgotCSAqIFdoZW4gd2UgYXJlIGNhbGxlZCB0byBxdWV1ZSAi YW4gYXJiaXRyYXJ5IHNjYiIsCi0JICogd2UgY29weSB0aGUgY29udGVudHMgb2YgdGhlIGluY29t aW5nIEhTQ0IgdG8gdGhlIG9uZQotCSAqIHRoZSBzZXF1ZW5jZXIga25vd3MgYWJvdXQsIHN3YXAg SFNDQiBwb2ludGVycyBhbmQKLQkgKiBmaW5hbGx5IGFzc2lnbiB0aGUgU0NCIHRvIHRoZSB0YWcg aW5kZXhlZCBsb2NhdGlvbgotCSAqIGluIHRoZSBzY2JfYXJyYXkuICBUaGlzIG1ha2VzIHN1cmUg dGhhdCB3ZSBjYW4gc3RpbGwKLQkgKiBsb2NhdGUgdGhlIGNvcnJlY3QgU0NCIGJ5IFNDQl9UQUcu Ci0JICovCi0JcV9oc2NiID0gYWhjLT5uZXh0X3F1ZXVlZF9zY2ItPmhzY2I7Ci0Jc2F2ZWRfdGFn ID0gcV9oc2NiLT50YWc7Ci0JbWVtY3B5KHFfaHNjYiwgc2NiLT5oc2NiLCBzaXplb2YoKnNjYi0+ aHNjYikpOwotCWlmICgoc2NiLT5mbGFncyAmIFNDQl9DREIzMl9QVFIpICE9IDApIHsKLQkJcV9o c2NiLT5zaGFyZWRfZGF0YS5jZGJfcHRyID0KLQkJICAgIGFoY19odG9sZTMyKGFoY19oc2NiX2J1 c2FkZHIoYWhjLCBxX2hzY2ItPnRhZykKLQkJCSAgICAgICsgb2Zmc2V0b2Yoc3RydWN0IGhhcmR3 YXJlX3NjYiwgY2RiMzIpKTsKLQl9Ci0JcV9oc2NiLT50YWcgPSBzYXZlZF90YWc7Ci0JcV9oc2Ni LT5uZXh0ID0gc2NiLT5oc2NiLT50YWc7Ci0KLQkvKiBOb3cgc3dhcCBIU0NCIHBvaW50ZXJzLiAq LwotCWFoYy0+bmV4dF9xdWV1ZWRfc2NiLT5oc2NiID0gc2NiLT5oc2NiOwotCXNjYi0+aHNjYiA9 IHFfaHNjYjsKLQotCS8qIE5vdyBkZWZpbmUgdGhlIG1hcHBpbmcgZnJvbSB0YWcgdG8gU0NCIGlu IHRoZSBzY2JpbmRleCAqLwotCWFoYy0+c2NiX2RhdGEtPnNjYmluZGV4W3NjYi0+aHNjYi0+dGFn XSA9IHNjYjsKLX0KLQotLyoKLSAqIFRlbGwgdGhlIHNlcXVlbmNlciBhYm91dCBhIG5ldyB0cmFu c2FjdGlvbiB0byBleGVjdXRlLgotICovCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhjX3F1ZXVl X3NjYihzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYikKLXsKLQlhaGNfc3dh cF93aXRoX25leHRfaHNjYihhaGMsIHNjYik7Ci0KLQlpZiAoc2NiLT5oc2NiLT50YWcgPT0gU0NC X0xJU1RfTlVMTAotCSB8fCBzY2ItPmhzY2ItPm5leHQgPT0gU0NCX0xJU1RfTlVMTCkKLQkJcGFu aWMoIkF0dGVtcHQgdG8gcXVldWUgaW52YWxpZCBTQ0IgdGFnICV4OiV4XG4iLAotCQkgICAgICBz Y2ItPmhzY2ItPnRhZywgc2NiLT5oc2NiLT5uZXh0KTsKLQotCS8qCi0JICogU2V0dXAgZGF0YSAi b2RkbmVzcyIuCi0JICovCi0Jc2NiLT5oc2NiLT5sdW4gJj0gTElEOwotCWlmIChhaGNfZ2V0X3Ry YW5zZmVyX2xlbmd0aChzY2IpICYgMHgxKQotCQlzY2ItPmhzY2ItPmx1biB8PSBTQ0JfWEZFUkxF Tl9PREQ7Ci0KLQkvKgotCSAqIEtlZXAgYSBoaXN0b3J5IG9mIFNDQnMgd2UndmUgZG93bmxvYWRl ZCBpbiB0aGUgcWluZmlmby4KLQkgKi8KLQlhaGMtPnFpbmZpZm9bYWhjLT5xaW5maWZvbmV4dCsr XSA9IHNjYi0+aHNjYi0+dGFnOwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgb3VyIGRhdGEgaXMgY29u c2lzdGVudCBmcm9tIHRoZQotCSAqIHBlcnNwZWN0aXZlIG9mIHRoZSBhZGFwdGVyLgotCSAqLwot CWFoY19zeW5jX3NjYihhaGMsIHNjYiwgQlVTX0RNQVNZTkNfUFJFUkVBRHxCVVNfRE1BU1lOQ19Q UkVXUklURSk7Ci0KLQkvKiBUZWxsIHRoZSBhZGFwdGVyIGFib3V0IHRoZSBuZXdseSBxdWV1ZWQg U0NCICovCi0JaWYgKChhaGMtPmZlYXR1cmVzICYgQUhDX1FVRVVFX1JFR1MpICE9IDApIHsKLQkJ YWhjX291dGIoYWhjLCBITlNDQl9RT0ZGLCBhaGMtPnFpbmZpZm9uZXh0KTsKLQl9IGVsc2Ugewot CQlpZiAoKGFoYy0+ZmVhdHVyZXMgJiBBSENfQVVUT1BBVVNFKSA9PSAwKQotCQkJYWhjX3BhdXNl KGFoYyk7Ci0JCWFoY19vdXRiKGFoYywgS0VSTkVMX1FJTlBPUywgYWhjLT5xaW5maWZvbmV4dCk7 Ci0JCWlmICgoYWhjLT5mZWF0dXJlcyAmIEFIQ19BVVRPUEFVU0UpID09IDApCi0JCQlhaGNfdW5w YXVzZShhaGMpOwotCX0KLX0KLQotc3RhdGljIF9faW5saW5lIHN0cnVjdCBzY3NpX3NlbnNlX2Rh dGEgKgotYWhjX2dldF9zZW5zZV9idWYoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2Ni ICpzY2IpCi17Ci0JaW50IG9mZnNldDsKLQotCW9mZnNldCA9IHNjYiAtIGFoYy0+c2NiX2RhdGEt PnNjYmFycmF5OwotCXJldHVybiAoJmFoYy0+c2NiX2RhdGEtPnNlbnNlW29mZnNldF0pOwotfQot Ci1zdGF0aWMgX19pbmxpbmUgdWludDMyX3QKLWFoY19nZXRfc2Vuc2VfYnVmYWRkcihzdHJ1Y3Qg YWhjX3NvZnRjICphaGMsIHN0cnVjdCBzY2IgKnNjYikKLXsKLQlpbnQgb2Zmc2V0OwotCi0Jb2Zm c2V0ID0gc2NiIC0gYWhjLT5zY2JfZGF0YS0+c2NiYXJyYXk7Ci0JcmV0dXJuIChhaGMtPnNjYl9k YXRhLT5zZW5zZV9idXNhZGRyCi0JICAgICAgKyAob2Zmc2V0ICogc2l6ZW9mKHN0cnVjdCBzY3Np X3NlbnNlX2RhdGEpKSk7Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBJbnRlcnJ1 cHQgUHJvY2Vzc2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgX19p bmxpbmUgdm9pZAlhaGNfc3luY19xb3V0ZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBv cCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAlhaGNfc3luY190cWluZmlmbyhzdHJ1Y3QgYWhjX3Nv ZnRjICphaGMsIGludCBvcCk7Ci1zdGF0aWMgX19pbmxpbmUgdV9pbnQJYWhjX2NoZWNrX2NtZGNt cGx0cXVldWVzKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7Ci1zdGF0aWMgX19pbmxpbmUgaW50CWFo Y19pbnRyKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1h aGNfc3luY19xb3V0ZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBvcCkKLXsKLQlhaGNf ZG1hbWFwX3N5bmMoYWhjLCBhaGMtPnNoYXJlZF9kYXRhX2RtYXQsIGFoYy0+c2hhcmVkX2RhdGFf ZG1hbWFwLAotCQkJLypvZmZzZXQqLzAsIC8qbGVuKi8yNTYsIG9wKTsKLX0KLQotc3RhdGljIF9f aW5saW5lIHZvaWQKLWFoY19zeW5jX3RxaW5maWZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgaW50 IG9wKQotewotI2lmZGVmIEFIQ19UQVJHRVRfTU9ERQotCWlmICgoYWhjLT5mbGFncyAmIEFIQ19U QVJHRVRST0xFKSAhPSAwKSB7Ci0JCWFoY19kbWFtYXBfc3luYyhhaGMsIGFoYy0+c2hhcmVkX2Rh dGFfZG1hdCwKLQkJCQlhaGMtPnNoYXJlZF9kYXRhX2RtYW1hcCwKLQkJCQlhaGNfdGFyZ2V0Y21k X29mZnNldChhaGMsIDApLAotCQkJCXNpemVvZihzdHJ1Y3QgdGFyZ2V0X2NtZCkgKiBBSENfVE1P REVfQ01EUywKLQkJCQlvcCk7Ci0JfQotI2VuZGlmCi19Ci0KLS8qCi0gKiBTZWUgaWYgdGhlIGZp cm13YXJlIGhhcyBwb3N0ZWQgYW55IGNvbXBsZXRlZCBjb21tYW5kcwotICogaW50byBvdXIgaW4t Y29yZSBjb21tYW5kIGNvbXBsZXRlIGZpZm9zLgotICovCi0jZGVmaW5lIEFIQ19SVU5fUU9VVEZJ Rk8gMHgxCi0jZGVmaW5lIEFIQ19SVU5fVFFJTkZJRk8gMHgyCi1zdGF0aWMgX19pbmxpbmUgdV9p bnQKLWFoY19jaGVja19jbWRjbXBsdHF1ZXVlcyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpCi17Ci0J dV9pbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gMDsKLQlhaGNfZG1hbWFwX3N5bmMoYWhjLCBhaGMt PnNoYXJlZF9kYXRhX2RtYXQsIGFoYy0+c2hhcmVkX2RhdGFfZG1hbWFwLAotCQkJLypvZmZzZXQq L2FoYy0+cW91dGZpZm9uZXh0LCAvKmxlbiovMSwKLQkJCUJVU19ETUFTWU5DX1BPU1RSRUFEKTsK LQlpZiAoYWhjLT5xb3V0Zmlmb1thaGMtPnFvdXRmaWZvbmV4dF0gIT0gU0NCX0xJU1RfTlVMTCkK LQkJcmV0dmFsIHw9IEFIQ19SVU5fUU9VVEZJRk87Ci0jaWZkZWYgQUhDX1RBUkdFVF9NT0RFCi0J aWYgKChhaGMtPmZsYWdzICYgQUhDX1RBUkdFVFJPTEUpICE9IDAKLQkgJiYgKGFoYy0+ZmxhZ3Mg JiBBSENfVFFJTkZJRk9fQkxPQ0tFRCkgPT0gMCkgewotCQlhaGNfZG1hbWFwX3N5bmMoYWhjLCBh aGMtPnNoYXJlZF9kYXRhX2RtYXQsCi0JCQkJYWhjLT5zaGFyZWRfZGF0YV9kbWFtYXAsCi0JCQkJ YWhjX3RhcmdldGNtZF9vZmZzZXQoYWhjLCBhaGMtPnRxaW5maWZvZm5leHQpLAotCQkJCS8qbGVu Ki9zaXplb2Yoc3RydWN0IHRhcmdldF9jbWQpLAotCQkJCUJVU19ETUFTWU5DX1BPU1RSRUFEKTsK LQkJaWYgKGFoYy0+dGFyZ2V0Y21kc1thaGMtPnRxaW5maWZvbmV4dF0uY21kX3ZhbGlkICE9IDAp Ci0JCQlyZXR2YWwgfD0gQUhDX1JVTl9UUUlORklGTzsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gKHJl dHZhbCk7Ci19Ci0KLS8qCi0gKiBDYXRjaCBhbiBpbnRlcnJ1cHQgZnJvbSB0aGUgYWRhcHRlcgot ICovCi1zdGF0aWMgX19pbmxpbmUgaW50Ci1haGNfaW50cihzdHJ1Y3QgYWhjX3NvZnRjICphaGMp Ci17Ci0JdV9pbnQJaW50c3RhdDsKLQotCWlmICgoYWhjLT5wYXVzZSAmIElOVEVOKSA9PSAwKSB7 Ci0JCS8qCi0JCSAqIE91ciBpbnRlcnJ1cHQgaXMgbm90IGVuYWJsZWQgb24gdGhlIGNoaXAKLQkJ ICogYW5kIG1heSBiZSBkaXNhYmxlZCBmb3IgcmUtZW50cmFuY3kgcmVhc29ucywKLQkJICogc28g anVzdCByZXR1cm4uICBUaGlzIGlzIGxpa2VseSBqdXN0IGEgc2hhcmVkCi0JCSAqIGludGVycnVw dC4KLQkJICovCi0JCXJldHVybiAoMCk7Ci0JfQotCS8qCi0JICogSW5zdGVhZCBvZiBkaXJlY3Rs eSByZWFkaW5nIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyLAotCSAqIGluZmVyIHRoZSBj YXVzZSBvZiB0aGUgaW50ZXJydXB0IGJ5IGNoZWNraW5nIG91ciBpbi1jb3JlCi0JICogY29tcGxl dGlvbiBxdWV1ZXMuICBUaGlzIGF2b2lkcyBhIGNvc3RseSBQQ0kgYnVzIHJlYWQgaW4KLQkgKiBt b3N0IGNhc2VzLgotCSAqLwotCWlmICgoYWhjLT5mbGFncyAmIChBSENfQUxMX0lOVEVSUlVQVFN8 QUhDX0VER0VfSU5URVJSVVBUKSkgPT0gMAotCSAmJiAoYWhjX2NoZWNrX2NtZGNtcGx0cXVldWVz KGFoYykgIT0gMCkpCi0JCWludHN0YXQgPSBDTURDTVBMVDsKLQllbHNlIHsKLQkJaW50c3RhdCA9 IGFoY19pbmIoYWhjLCBJTlRTVEFUKTsKLQl9Ci0KLQlpZiAoKGludHN0YXQgJiBJTlRfUEVORCkg PT0gMCkgewotI2lmIEFIQ19QQ0lfQ09ORklHID4gMAotCQlpZiAoYWhjLT51bnNvbGljaXRlZF9p bnRzID4gNTAwKSB7Ci0JCQlhaGMtPnVuc29saWNpdGVkX2ludHMgPSAwOwotCQkJaWYgKChhaGMt PmNoaXAgJiBBSENfUENJKSAhPSAwCi0JCQkgJiYgKGFoY19pbmIoYWhjLCBFUlJPUikgJiBQQ0lF UlJTVEFUKSAhPSAwKQotCQkJCWFoYy0+YnVzX2ludHIoYWhjKTsKLQkJfQotI2VuZGlmCi0JCWFo Yy0+dW5zb2xpY2l0ZWRfaW50cysrOwotCQlyZXR1cm4gKDApOwotCX0KLQlhaGMtPnVuc29saWNp dGVkX2ludHMgPSAwOwotCi0JaWYgKGludHN0YXQgJiBDTURDTVBMVCkgewotCQlhaGNfb3V0Yihh aGMsIENMUklOVCwgQ0xSQ01ESU5UKTsKLQotCQkvKgotCQkgKiBFbnN1cmUgdGhhdCB0aGUgY2hp cCBzZWVzIHRoYXQgd2UndmUgY2xlYXJlZAotCQkgKiB0aGlzIGludGVycnVwdCBiZWZvcmUgd2Ug d2FsayB0aGUgb3V0cHV0IGZpZm8uCi0JCSAqIE90aGVyd2lzZSwgd2UgbWF5LCBkdWUgdG8gcG9z dGVkIGJ1cyB3cml0ZXMsCi0JCSAqIGNsZWFyIHRoZSBpbnRlcnJ1cHQgYWZ0ZXIgd2UgZmluaXNo IHRoZSBzY2FuLAotCQkgKiBhbmQgYWZ0ZXIgdGhlIHNlcXVlbmNlciBoYXMgYWRkZWQgbmV3IGVu dHJpZXMKLQkJICogYW5kIGFzc2VydGVkIHRoZSBpbnRlcnJ1cHQgYWdhaW4uCi0JCSAqLwotCQlh aGNfZmx1c2hfZGV2aWNlX3dyaXRlcyhhaGMpOwotCQlhaGNfcnVuX3FvdXRmaWZvKGFoYyk7Ci0j aWZkZWYgQUhDX1RBUkdFVF9NT0RFCi0JCWlmICgoYWhjLT5mbGFncyAmIEFIQ19UQVJHRVRST0xF KSAhPSAwKQotCQkJYWhjX3J1bl90cWluZmlmbyhhaGMsIC8qcGF1c2VkKi9GQUxTRSk7Ci0jZW5k aWYKLQl9Ci0KLQkvKgotCSAqIEhhbmRsZSBzdGF0dXNlcyB0aGF0IG1heSBpbnZhbGlkYXRlIG91 ciBjYWNoZWQKLQkgKiBjb3B5IG9mIElOVFNUQVQgc2VwYXJhdGVseS4KLQkgKi8KLQlpZiAoaW50 c3RhdCA9PSAweEZGICYmIChhaGMtPmZlYXR1cmVzICYgQUhDX1JFTU9WQUJMRSkgIT0gMCkgewot CQkvKiBIb3QgZWplY3QuICBEbyBub3RoaW5nICovCi0JfSBlbHNlIGlmIChpbnRzdGF0ICYgQlJL QURSSU5UKSB7Ci0JCWFoY19oYW5kbGVfYnJrYWRyaW50KGFoYyk7Ci0JfSBlbHNlIGlmICgoaW50 c3RhdCAmIChTRVFJTlR8U0NTSUlOVCkpICE9IDApIHsKLQotCQlhaGNfcGF1c2VfYnVnX2ZpeChh aGMpOwotCi0JCWlmICgoaW50c3RhdCAmIFNFUUlOVCkgIT0gMCkKLQkJCWFoY19oYW5kbGVfc2Vx aW50KGFoYywgaW50c3RhdCk7Ci0KLQkJaWYgKChpbnRzdGF0ICYgU0NTSUlOVCkgIT0gMCkKLQkJ CWFoY19oYW5kbGVfc2NzaWludChhaGMsIGludHN0YXQpOwotCX0KLQlyZXR1cm4gKDEpOwotfQor dm9pZAlhaGNfc3luY19xb3V0ZmlmbyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMsIGludCBvcCk7Cit2 b2lkCWFoY19zeW5jX3RxaW5maWZvKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgaW50IG9wKTsKK3Vf aW50CWFoY19jaGVja19jbWRjbXBsdHF1ZXVlcyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOworaW50 CWFoY19pbnRyKHN0cnVjdCBhaGNfc29mdGMgKmFoYyk7CiAKICNlbmRpZiAgLyogX0FJQzdYWFhf SU5MSU5FX0hfICovCi0tLSBsaW51eC0yLjYuMjMtcmMxLm9yZy9kcml2ZXJzL3Njc2kvYWljN3h4 eC9haWM3eHh4X29zbS5jCVR1ZSBKdWwgMzEgMDA6MzA6MjkgMjAwNworKysgbGludXgtMi42LjIz LXJjMS5haWMvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljN3h4eF9vc20uYwlUdWUgSnVsIDMxIDAx OjUwOjQyIDIwMDcKQEAgLTM4OCwxNCArMzg4LDgzIEBACiBzdGF0aWMgaW50IGFoY19saW51eF91 bml0OwogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBPUyBVdGlsaXR5IFdyYXBwZXJz ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCithaGNfZGVsYXkobG9uZyB1 c2VjKQoreworCS8qCisJICogdWRlbGF5IG9uIExpbnV4IGNhbiBoYXZlIHByb2JsZW1zIGZvcgor CSAqIG11bHRpLW1pbGxpc2Vjb25kIHdhaXRzLiAgV2FpdCBhdCBtb3N0CisJICogMTAyNHVzIHBl ciBjYWxsLgorCSAqLworCXdoaWxlICh1c2VjID4gMCkgeworCQl1ZGVsYXkodXNlYyAlIDEwMjQp OworCQl1c2VjIC09IDEwMjQ7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioq KiogTG93IExldmVsIEkvTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordWlu dDhfdAorYWhjX2luYihzdHJ1Y3QgYWhjX3NvZnRjICogYWhjLCBsb25nIHBvcnQpCit7CisJdWlu dDhfdCB4OworCisJaWYgKGFoYy0+dGFnID09IEJVU19TUEFDRV9NRU1JTykgeworCQl4ID0gcmVh ZGIoYWhjLT5ic2gubWFkZHIgKyBwb3J0KTsKKwl9IGVsc2UgeworCQl4ID0gaW5iKGFoYy0+YnNo LmlvcG9ydCArIHBvcnQpOworCX0KKwltYigpOworCXJldHVybiAoeCk7Cit9CisKK3ZvaWQKK2Fo Y19vdXRiKHN0cnVjdCBhaGNfc29mdGMgKiBhaGMsIGxvbmcgcG9ydCwgdWludDhfdCB2YWwpCit7 CisJaWYgKGFoYy0+dGFnID09IEJVU19TUEFDRV9NRU1JTykgeworCQl3cml0ZWIodmFsLCBhaGMt PmJzaC5tYWRkciArIHBvcnQpOworCX0gZWxzZSB7CisJCW91dGIodmFsLCBhaGMtPmJzaC5pb3Bv cnQgKyBwb3J0KTsKKwl9CisJbWIoKTsKK30KKwordm9pZAorYWhjX291dHNiKHN0cnVjdCBhaGNf c29mdGMgKiBhaGMsIGxvbmcgcG9ydCwgdWludDhfdCAqYXJyYXksIGludCBjb3VudCkKK3sKKwlp bnQgaTsKKworCS8qCisJICogVGhlcmUgaXMgcHJvYmFibHkgYSBtb3JlIGVmZmljaWVudCB3YXkg dG8gZG8gdGhpcyBvbiBMaW51eAorCSAqIGJ1dCB3ZSBkb24ndCB1c2UgdGhpcyBmb3IgYW55dGhp bmcgc3BlZWQgY3JpdGljYWwgYW5kIHRoaXMKKwkgKiBzaG91bGQgd29yay4KKwkgKi8KKwlmb3Ig KGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJYWhjX291dGIoYWhjLCBwb3J0LCAqYXJyYXkrKyk7 Cit9CisKK3ZvaWQKK2FoY19pbnNiKHN0cnVjdCBhaGNfc29mdGMgKiBhaGMsIGxvbmcgcG9ydCwg dWludDhfdCAqYXJyYXksIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogVGhlcmUg aXMgcHJvYmFibHkgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcyBvbiBMaW51eAorCSAq IGJ1dCB3ZSBkb24ndCB1c2UgdGhpcyBmb3IgYW55dGhpbmcgc3BlZWQgY3JpdGljYWwgYW5kIHRo aXMKKwkgKiBzaG91bGQgd29yay4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykK KwkJKmFycmF5KysgPSBhaGNfaW5iKGFoYywgcG9ydCk7Cit9CisKIC8qKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiogSW5saW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKiovCi1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfbGludXhfdW5tYXBfc2NiKHN0cnVjdCBh aGNfc29mdGMqLCBzdHJ1Y3Qgc2NiKik7CitzdGF0aWMgdm9pZCBhaGNfbGludXhfdW5tYXBfc2Ni KHN0cnVjdCBhaGNfc29mdGMqLCBzdHJ1Y3Qgc2NiKik7CiAKLXN0YXRpYyBfX2lubGluZSBpbnQg YWhjX2xpbnV4X21hcF9zZWcoc3RydWN0IGFoY19zb2Z0YyAqYWhjLCBzdHJ1Y3Qgc2NiICpzY2Is CitzdGF0aWMgaW50IGFoY19saW51eF9tYXBfc2VnKHN0cnVjdCBhaGNfc29mdGMgKmFoYywgc3Ry dWN0IHNjYiAqc2NiLAogCQkgCQkgICAgICBzdHJ1Y3QgYWhjX2RtYV9zZWcgKnNnLAogCQkJCSAg ICAgIGRtYV9hZGRyX3QgYWRkciwgYnVzX3NpemVfdCBsZW4pOwogCi1zdGF0aWMgX19pbmxpbmUg dm9pZAorc3RhdGljIHZvaWQKIGFoY19saW51eF91bm1hcF9zY2Ioc3RydWN0IGFoY19zb2Z0YyAq YWhjLCBzdHJ1Y3Qgc2NiICpzY2IpCiB7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kOwpAQCAtNDA2 LDcgKzQ3NSw3IEBACiAJc2NzaV9kbWFfdW5tYXAoY21kKTsKIH0KIAotc3RhdGljIF9faW5saW5l IGludAorc3RhdGljIGludAogYWhjX2xpbnV4X21hcF9zZWcoc3RydWN0IGFoY19zb2Z0YyAqYWhj LCBzdHJ1Y3Qgc2NiICpzY2IsCiAJCSAgc3RydWN0IGFoY19kbWFfc2VnICpzZywgZG1hX2FkZHJf dCBhZGRyLCBidXNfc2l6ZV90IGxlbikKIHsKLS0tIGxpbnV4LTIuNi4yMy1yYzEub3JnL2RyaXZl cnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtLmgJVHVlIEp1bCAzMSAwMDozMDoyOSAyMDA3Cisr KyBsaW51eC0yLjYuMjMtcmMxLmFpYy9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbS5o CVR1ZSBKdWwgMzEgMDE6NDk6MDggMjAwNwpAQCAtMzc1LDgzICszNzUsMTcgQEAKICNkZWZpbmUg bWFsbG9jKHNpemUsIHR5cGUsIGZsYWdzKSBrbWFsbG9jKHNpemUsIGZsYWdzKQogI2RlZmluZSBm cmVlKHB0ciwgdHlwZSkga2ZyZWUocHRyKQogCi1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfZGVs YXkobG9uZyk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhjX2RlbGF5KGxvbmcgdXNlYykKLXsK LQkvKgotCSAqIHVkZWxheSBvbiBMaW51eCBjYW4gaGF2ZSBwcm9ibGVtcyBmb3IKLQkgKiBtdWx0 aS1taWxsaXNlY29uZCB3YWl0cy4gIFdhaXQgYXQgbW9zdAotCSAqIDEwMjR1cyBwZXIgY2FsbC4K LQkgKi8KLQl3aGlsZSAodXNlYyA+IDApIHsKLQkJdWRlbGF5KHVzZWMgJSAxMDI0KTsKLQkJdXNl YyAtPSAxMDI0OwotCX0KLX0KK3ZvaWQgYWhjX2RlbGF5KGxvbmcpOwogCiAKIC8qKioqKioqKioq KioqKioqKioqKioqKioqKioqKiBMb3cgTGV2ZWwgSS9PICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovCi1zdGF0aWMgX19pbmxpbmUgdWludDhfdCBhaGNfaW5iKHN0cnVjdCBhaGNf c29mdGMgKiBhaGMsIGxvbmcgcG9ydCk7Ci1zdGF0aWMgX19pbmxpbmUgdm9pZCBhaGNfb3V0Yihz dHJ1Y3QgYWhjX3NvZnRjICogYWhjLCBsb25nIHBvcnQsIHVpbnQ4X3QgdmFsKTsKLXN0YXRpYyBf X2lubGluZSB2b2lkIGFoY19vdXRzYihzdHJ1Y3QgYWhjX3NvZnRjICogYWhjLCBsb25nIHBvcnQs Ci0JCQkgICAgICAgdWludDhfdCAqLCBpbnQgY291bnQpOwotc3RhdGljIF9faW5saW5lIHZvaWQg YWhjX2luc2Ioc3RydWN0IGFoY19zb2Z0YyAqIGFoYywgbG9uZyBwb3J0LAotCQkJICAgICAgIHVp bnQ4X3QgKiwgaW50IGNvdW50KTsKK3VpbnQ4X3QgYWhjX2luYihzdHJ1Y3QgYWhjX3NvZnRjICog YWhjLCBsb25nIHBvcnQpOwordm9pZCBhaGNfb3V0YihzdHJ1Y3QgYWhjX3NvZnRjICogYWhjLCBs b25nIHBvcnQsIHVpbnQ4X3QgdmFsKTsKK3ZvaWQgYWhjX291dHNiKHN0cnVjdCBhaGNfc29mdGMg KiBhaGMsIGxvbmcgcG9ydCwKKwkgICAgICAgdWludDhfdCAqLCBpbnQgY291bnQpOwordm9pZCBh aGNfaW5zYihzdHJ1Y3QgYWhjX3NvZnRjICogYWhjLCBsb25nIHBvcnQsCisJICAgICAgIHVpbnQ4 X3QgKiwgaW50IGNvdW50KTsKIAotc3RhdGljIF9faW5saW5lIHVpbnQ4X3QKLWFoY19pbmIoc3Ry dWN0IGFoY19zb2Z0YyAqIGFoYywgbG9uZyBwb3J0KQotewotCXVpbnQ4X3QgeDsKLQotCWlmIChh aGMtPnRhZyA9PSBCVVNfU1BBQ0VfTUVNSU8pIHsKLQkJeCA9IHJlYWRiKGFoYy0+YnNoLm1hZGRy ICsgcG9ydCk7Ci0JfSBlbHNlIHsKLQkJeCA9IGluYihhaGMtPmJzaC5pb3BvcnQgKyBwb3J0KTsK LQl9Ci0JbWIoKTsKLQlyZXR1cm4gKHgpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhj X291dGIoc3RydWN0IGFoY19zb2Z0YyAqIGFoYywgbG9uZyBwb3J0LCB1aW50OF90IHZhbCkKLXsK LQlpZiAoYWhjLT50YWcgPT0gQlVTX1NQQUNFX01FTUlPKSB7Ci0JCXdyaXRlYih2YWwsIGFoYy0+ YnNoLm1hZGRyICsgcG9ydCk7Ci0JfSBlbHNlIHsKLQkJb3V0Yih2YWwsIGFoYy0+YnNoLmlvcG9y dCArIHBvcnQpOwotCX0KLQltYigpOwotfQotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhjX291 dHNiKHN0cnVjdCBhaGNfc29mdGMgKiBhaGMsIGxvbmcgcG9ydCwgdWludDhfdCAqYXJyYXksIGlu dCBjb3VudCkKLXsKLQlpbnQgaTsKLQotCS8qCi0JICogVGhlcmUgaXMgcHJvYmFibHkgYSBtb3Jl IGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcyBvbiBMaW51eAotCSAqIGJ1dCB3ZSBkb24ndCB1c2Ug dGhpcyBmb3IgYW55dGhpbmcgc3BlZWQgY3JpdGljYWwgYW5kIHRoaXMKLQkgKiBzaG91bGQgd29y ay4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJYWhjX291dGIoYWhjLCBw b3J0LCAqYXJyYXkrKyk7Ci19Ci0KLXN0YXRpYyBfX2lubGluZSB2b2lkCi1haGNfaW5zYihzdHJ1 Y3QgYWhjX3NvZnRjICogYWhjLCBsb25nIHBvcnQsIHVpbnQ4X3QgKmFycmF5LCBpbnQgY291bnQp Ci17Ci0JaW50IGk7Ci0KLQkvKgotCSAqIFRoZXJlIGlzIHByb2JhYmx5IGEgbW9yZSBlZmZpY2ll bnQgd2F5IHRvIGRvIHRoaXMgb24gTGludXgKLQkgKiBidXQgd2UgZG9uJ3QgdXNlIHRoaXMgZm9y IGFueXRoaW5nIHNwZWVkIGNyaXRpY2FsIGFuZCB0aGlzCi0JICogc2hvdWxkIHdvcmsuCi0JICov Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCSphcnJheSsrID0gYWhjX2luYihhaGMs IHBvcnQpOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBJbml0aWFsaXphdGlv biAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50CQlhaGNfbGludXhfcmVn aXN0ZXJfaG9zdChzdHJ1Y3QgYWhjX3NvZnRjICosCiAJCQkJCXN0cnVjdCBzY3NpX2hvc3RfdGVt cGxhdGUgKik7CkBAIC01NTUsNjEgKzQ4OSwxMiBAQAogaW50CQkJIGFoY19wY2lfbWFwX3JlZ2lz dGVycyhzdHJ1Y3QgYWhjX3NvZnRjICphaGMpOwogaW50CQkJIGFoY19wY2lfbWFwX2ludChzdHJ1 Y3QgYWhjX3NvZnRjICphaGMpOwogCi1zdGF0aWMgX19pbmxpbmUgdWludDMyX3QgYWhjX3BjaV9y ZWFkX2NvbmZpZyhhaGNfZGV2X3NvZnRjX3QgcGNpLAordWludDMyX3QJCSBhaGNfcGNpX3JlYWRf Y29uZmlnKGFoY19kZXZfc29mdGNfdCBwY2ksCiAJCQkJCSAgICAgaW50IHJlZywgaW50IHdpZHRo KTsKIAotc3RhdGljIF9faW5saW5lIHVpbnQzMl90Ci1haGNfcGNpX3JlYWRfY29uZmlnKGFoY19k ZXZfc29mdGNfdCBwY2ksIGludCByZWcsIGludCB3aWR0aCkKLXsKLQlzd2l0Y2ggKHdpZHRoKSB7 Ci0JY2FzZSAxOgotCXsKLQkJdWludDhfdCByZXR2YWw7Ci0KLQkJcGNpX3JlYWRfY29uZmlnX2J5 dGUocGNpLCByZWcsICZyZXR2YWwpOwotCQlyZXR1cm4gKHJldHZhbCk7Ci0JfQotCWNhc2UgMjoK LQl7Ci0JCXVpbnQxNl90IHJldHZhbDsKLQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCByZWcs ICZyZXR2YWwpOwotCQlyZXR1cm4gKHJldHZhbCk7Ci0JfQotCWNhc2UgNDoKLQl7Ci0JCXVpbnQz Ml90IHJldHZhbDsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaSwgcmVnLCAmcmV0dmFsKTsK LQkJcmV0dXJuIChyZXR2YWwpOwotCX0KLQlkZWZhdWx0OgotCQlwYW5pYygiYWhjX3BjaV9yZWFk X2NvbmZpZzogUmVhZCBzaXplIHRvbyBiaWciKTsKLQkJLyogTk9UUkVBQ0hFRCAqLwotCQlyZXR1 cm4gKDApOwotCX0KLX0KLQotc3RhdGljIF9faW5saW5lIHZvaWQgYWhjX3BjaV93cml0ZV9jb25m aWcoYWhjX2Rldl9zb2Z0Y190IHBjaSwKLQkJCQkJICBpbnQgcmVnLCB1aW50MzJfdCB2YWx1ZSwK LQkJCQkJICBpbnQgd2lkdGgpOwotCi1zdGF0aWMgX19pbmxpbmUgdm9pZAotYWhjX3BjaV93cml0 ZV9jb25maWcoYWhjX2Rldl9zb2Z0Y190IHBjaSwgaW50IHJlZywgdWludDMyX3QgdmFsdWUsIGlu dCB3aWR0aCkKLXsKLQlzd2l0Y2ggKHdpZHRoKSB7Ci0JY2FzZSAxOgotCQlwY2lfd3JpdGVfY29u ZmlnX2J5dGUocGNpLCByZWcsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlwY2lfd3Jp dGVfY29uZmlnX3dvcmQocGNpLCByZWcsIHZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlw Y2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaSwgcmVnLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCWRlZmF1 bHQ6Ci0JCXBhbmljKCJhaGNfcGNpX3dyaXRlX2NvbmZpZzogV3JpdGUgc2l6ZSB0b28gYmlnIik7 Ci0JCS8qIE5PVFJFQUNIRUQgKi8KLQl9Ci19Cit2b2lkCQkJIGFoY19wY2lfd3JpdGVfY29uZmln KGFoY19kZXZfc29mdGNfdCBwY2ksCisJCQkJCSAgICAgIGludCByZWcsIHVpbnQzMl90IHZhbHVl LAorCQkJCQkgICAgICBpbnQgd2lkdGgpOwogCiBzdGF0aWMgX19pbmxpbmUgaW50IGFoY19nZXRf cGNpX2Z1bmN0aW9uKGFoY19kZXZfc29mdGNfdCk7CiBzdGF0aWMgX19pbmxpbmUgaW50Ci0tLSBs aW51eC0yLjYuMjMtcmMxLm9yZy9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3eHh4X29zbV9wY2ku YwlNb24gSnVsICA5IDAwOjMyOjE3IDIwMDcKKysrIGxpbnV4LTIuNi4yMy1yYzEuYWljL2RyaXZl cnMvc2NzaS9haWM3eHh4L2FpYzd4eHhfb3NtX3BjaS5jCVR1ZSBKdWwgMzEgMDE6NTE6MDUgMjAw NwpAQCAtMTMwLDYgKzEzMCw1NyBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWhjX2xp bnV4X3BjaV9pZF90YWJsZSk7CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFBD SSBSb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1aW50MzJfdAor YWhjX3BjaV9yZWFkX2NvbmZpZyhhaGNfZGV2X3NvZnRjX3QgcGNpLCBpbnQgcmVnLCBpbnQgd2lk dGgpCit7CisJc3dpdGNoICh3aWR0aCkgeworCWNhc2UgMToKKwl7CisJCXVpbnQ4X3QgcmV0dmFs OworCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaSwgcmVnLCAmcmV0dmFsKTsKKwkJcmV0dXJu IChyZXR2YWwpOworCX0KKwljYXNlIDI6CisJeworCQl1aW50MTZfdCByZXR2YWw7CisJCXBjaV9y ZWFkX2NvbmZpZ193b3JkKHBjaSwgcmVnLCAmcmV0dmFsKTsKKwkJcmV0dXJuIChyZXR2YWwpOwor CX0KKwljYXNlIDQ6CisJeworCQl1aW50MzJfdCByZXR2YWw7CisJCXBjaV9yZWFkX2NvbmZpZ19k d29yZChwY2ksIHJlZywgJnJldHZhbCk7CisJCXJldHVybiAocmV0dmFsKTsKKwl9CisJZGVmYXVs dDoKKwkJcGFuaWMoImFoY19wY2lfcmVhZF9jb25maWc6IFJlYWQgc2l6ZSB0b28gYmlnIik7CisJ CS8qIE5PVFJFQUNIRUQgKi8KKwkJcmV0dXJuICgwKTsKKwl9Cit9CisKK3ZvaWQKK2FoY19wY2lf d3JpdGVfY29uZmlnKGFoY19kZXZfc29mdGNfdCBwY2ksIGludCByZWcsIHVpbnQzMl90IHZhbHVl LCBpbnQgd2lkdGgpCit7CisJc3dpdGNoICh3aWR0aCkgeworCWNhc2UgMToKKwkJcGNpX3dyaXRl X2NvbmZpZ19ieXRlKHBjaSwgcmVnLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcGNp X3dyaXRlX2NvbmZpZ193b3JkKHBjaSwgcmVnLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgNDoK KwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2ksIHJlZywgdmFsdWUpOworCQlicmVhazsKKwlk ZWZhdWx0OgorCQlwYW5pYygiYWhjX3BjaV93cml0ZV9jb25maWc6IFdyaXRlIHNpemUgdG9vIGJp ZyIpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorfQorCisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2Ry aXZlciBhaWM3eHh4X3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCT0gImFpYzd4eHgiLAogCS5wcm9i ZQkJPSBhaGNfbGludXhfcGNpX2Rldl9wcm9iZSwK ------=_Part_39676_15670452.1185876892413--