From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31625 invoked by alias); 9 Nov 2014 23:30:04 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 31611 invoked by uid 89); 9 Nov 2014 23:30:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW,SPF_PASS,T_FILL_THIS_FORM_SHORT autolearn=ham version=3.3.2 X-HELO: mail-pa0-f41.google.com Received: from mail-pa0-f41.google.com (HELO mail-pa0-f41.google.com) (209.85.220.41) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Sun, 09 Nov 2014 23:29:59 +0000 Received: by mail-pa0-f41.google.com with SMTP id rd3so7004883pab.28 for ; Sun, 09 Nov 2014 15:29:57 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:date:from:user-agent:mime-version:to :cc:subject:references:in-reply-to:content-type; bh=Qar4mqdvWglwXvD9ta86qUdDwq5Qn3XHiHcASJE/fmo=; b=X+OoEXRAFcNNNBv5a3YsjfbOVJj/x5Cqrb0CXEy/GVP8NhV0/xlreh+k8aucLeErzy iyFgEETudWThcwjcFV8qwzt0wyCgI3QmgIQZF3W2w3V5lVLN8k9ySgv7UGVhVnbxttrI kLKt+ganGLxYgZcaS+DcSiip+T0HkuNpyCJC8Mb3CWwExrPqe4F98u2VsG4W95bcC1VT 6nEOp9k/Uis3YknIeFsERUoakwwtKoRR3UVDDsIQeea0RZqBvPJqpUfM0RETV6NtxRIN Y3hi/eS7SWRB+M2hnKIS+0ZeMwqcelqhrvj/ngxN/BPbQTlij6dWmq+nWBvwvGnaFZpO V5dg== X-Gm-Message-State: ALoCoQlTw2GnIgvzjMWevW5WpKnAiYxtmDjpM2VXn7L6vED8BhcuE6xTAoySgKFj1aqgYxy28+hn X-Received: by 10.68.65.68 with SMTP id v4mr27677661pbs.52.1415575797081; Sun, 09 Nov 2014 15:29:57 -0800 (PST) Received: from [10.1.1.2] (58-6-183-210.dyn.iinet.net.au. [58.6.183.210]) by mx.google.com with ESMTPSA id u1sm14750308pdj.29.2014.11.09.15.29.52 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 09 Nov 2014 15:29:56 -0800 (PST) Message-ID: <545FF8EE.1090900@linaro.org> Date: Sun, 09 Nov 2014 23:30:00 -0000 From: Kugan User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.0 MIME-Version: 1.0 To: Richard Biener CC: Uros Bizjak , "gcc-patches@gcc.gnu.org" , Jakub Jelinek Subject: [RFC] Elimination of zext/sext - type promotion pass References: <53FEDF34.4090605@linaro.org> <5407DF57.2040902@linaro.org> <540912E1.30505@linaro.org> In-Reply-To: Content-Type: multipart/mixed; boundary="------------070501070107000607060106" X-IsSubscribed: yes X-SW-Source: 2014-11/txt/msg00756.txt.bz2 This is a multi-part message in MIME format. --------------070501070107000607060106 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-length: 3535 > Well - the best way would be to expose the target specifics to GIMPLE > at some point in the optimization pipeline. My guess would be that it's > appropriate after loop optimizations (but maybe before induction variable > optimization). > > That is, have a pass that applies register promotion to all SSA names > in the function, inserting appropriate truncations and extensions. That > way you'd never see (set (subreg...) on RTL. The VRP and DOM > passes running after that pass would then be able to aggressively > optimize redundant truncations and extensions. > > Effects on debug information are to be considered. You can change > the type of SSA names in-place but you don't want to do that for > user DECLs (and we can't have the SSA name type and its DECL > type differ - and not sure if we might want to lift that restriction). Thanks for the comments. Here is a prototype patch that implements a type promotion pass. This pass records SSA variables that will have values in higher bits (than the original type precision) if promoted and uses this information in inserting appropriate truncations and extensions. This pass also classifies some of the stmts that sets ssa's to be unsafe to promote. Here is a gimple difference for the type promotion as compared to previous dump for a testcase. crc2 (short unsigned int crc, unsigned char data) { unsigned char carry; unsigned char x16; unsigned char i; - unsigned char ivtmp_5; + unsigned int _2; + unsigned char _3; + unsigned int _4; + unsigned int _5; unsigned char _9; - unsigned char _10; - unsigned char ivtmp_18; + unsigned int _10; + unsigned int _11; + unsigned int _12; + unsigned int _13; + unsigned int _15; + unsigned int _16; + unsigned int _18; + unsigned int _21; + unsigned int _22; + unsigned int _24; + short unsigned int _26; + unsigned char _27; + unsigned int _28; + unsigned int _29; + unsigned int _30; : + _12 = (unsigned int) data_8(D); + _2 = (unsigned int) crc_7(D); : - # crc_28 = PHI - # data_29 = PHI - # ivtmp_18 = PHI - _9 = (unsigned char) crc_28; - _10 = _9 ^ data_29; - x16_11 = _10 & 1; - data_12 = data_29 >> 1; - if (x16_11 == 1) + # _30 = PHI <_28(5), _2(2)> + # _16 = PHI <_29(5), _12(2)> + # _4 = PHI <_18(5), 8(2)> + _9 = (unsigned char) _30; + _5 = (unsigned int) _9; + _22 = _5 ^ _16; + _10 = _22 & 1; + _29 = _16 >> 1; + _27 = (unsigned char) _10; + if (_27 == 1) goto ; else goto ; : - crc_13 = crc_28 ^ 16386; - crc_24 = crc_13 >> 1; - crc_15 = crc_24 | 32768; + _11 = _30 ^ 16386; + _13 = _11 >> 1; + _24 = _13 | 32768; : - # crc_2 = PHI - ivtmp_5 = ivtmp_18 - 1; - if (ivtmp_5 != 0) + # _28 = PHI <_24(4), _15(7)> + _18 = _4 - 1; + _3 = (unsigned char) _18; + if (_3 != 0) goto ; else goto ; : - # crc_19 = PHI - return crc_19; + # _21 = PHI <_28(5)> + _26 = (short unsigned int) _21; + return _26; : - crc_21 = crc_28 >> 1; + _15 = _30 >> 1; goto ; } I experimented with few simple test-cases and results so far are mixed. It also seems that subsequent passes are not always optimising as expected. I haven't looked in detail but will look into it based on the feedback. Please also note that this pass still doest handle debug instructions and there are couple regression failures for ARM. Thanks, Kugan --------------070501070107000607060106 Content-Type: text/plain; charset=UTF-8; name="p.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="p.txt" Content-length: 45445 ZGlmZiAtLWdpdCBhL2djYy9DaGFuZ2VMb2cgYi9nY2MvQ2hhbmdlTG9nCmlu ZGV4IDRhNTEzOTMuLjFlMjYxNzIgMTAwNjQ0Ci0tLSBhL2djYy9DaGFuZ2VM b2cKKysrIGIvZ2NjL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEzIEBACisyMDE0 LTExLTA4ICBLdWdhbiBWaXZla2FuYW5kYXJhamFoICA8a3VnYW52QGxpbmFy by5vcmc+CisKKwkqIE1ha2VmaWxlLmluIChPQkpTKTogQWRkIHRyZWUtdHlw ZS1wcm10bi5vLgorCSogY29tbW9uLm9wdCAoZnRyZWUtdHlwZS1wcm10KTog TmV3IGZsYWcuCisJKiBvcHRzLmMgKE9QVF9mdHJlZV90eXBlX3BybXQpOiBO ZXcgb3B0aW9uIGFkZGVkLgorCSogcGFzc2VzLmRlZjogTmV3IHBhc3MgaW5j bHVkZWQuCisJKiB0cmVlLXBhc3MuaDogTGlrZVdpc2UuCisJKiB0aW1ldmFy LmRlZiAoVFZfVFJFRV9UWVBFX1BSTVQpOiBOZXcgdGltZXZhci4KKwkqIHRy ZWUtdHlwZS1wcm10bi5jOiBOZXcgZmlsZS4KKwogMjAxNC0xMS0wOCAgUmlj aGFyZCBTYW5kaWZvcmQgIDxyaWNoYXJkLnNhbmRpZm9yZEBhcm0uY29tPgog CiAJKiBjb25maWcvYWFyY2g2NC9hYXJjaDY0LmM6IEluY2x1ZGUgcnRsLWl0 ZXIuaC4KZGlmZiAtLWdpdCBhL2djYy9NYWtlZmlsZS5pbiBiL2djYy9NYWtl ZmlsZS5pbgppbmRleCAyYzNmMDJlLi4yYzI1N2I5IDEwMDY0NAotLS0gYS9n Y2MvTWFrZWZpbGUuaW4KKysrIGIvZ2NjL01ha2VmaWxlLmluCkBAIC0xNDYz LDYgKzE0NjMsNyBAQCBPQkpTID0gXAogCXRyZWUtdmVjdC1zbHAubyBcCiAJ dHJlZS12ZWN0b3JpemVyLm8gXAogCXRyZWUtdnJwLm8gXAorCXRyZWUtdHlw ZS1wcm10bi5vIFwKIAl0cmVlLm8gXAogCXZhbHRyYWNrLm8gXAogCXZhbHVl LXByb2YubyBcCmRpZmYgLS1naXQgYS9nY2MvY29tbW9uLm9wdCBiL2djYy9j b21tb24ub3B0CmluZGV4IGI0MDA2MzYuLjQ1NTZlMGEgMTAwNjQ0Ci0tLSBh L2djYy9jb21tb24ub3B0CisrKyBiL2djYy9jb21tb24ub3B0CkBAIC0yMzA0 LDYgKzIzMDQsMTAgQEAgZnRyZWUtdnJwCiBDb21tb24gUmVwb3J0IFZhcihm bGFnX3RyZWVfdnJwKSBJbml0KDApIE9wdGltaXphdGlvbgogUGVyZm9ybSBW YWx1ZSBSYW5nZSBQcm9wYWdhdGlvbiBvbiB0cmVlcwogCitmdHJlZS10eXBl LXBybXQKK0NvbW1vbiBSZXBvcnQgVmFyKGZsYWdfdHJlZV90eXBlX3BybXQp IEluaXQoMCkgT3B0aW1pemF0aW9uCitQZXJmb3JtIFR5cGUgUHJvbW90aW9u IG9uIHRyZWVzCisKIGZ1bml0LWF0LWEtdGltZQogQ29tbW9uIFJlcG9ydCBW YXIoZmxhZ191bml0X2F0X2FfdGltZSkgSW5pdCgxKSBPcHRpbWl6YXRpb24K IENvbXBpbGUgd2hvbGUgY29tcGlsYXRpb24gdW5pdCBhdCBhIHRpbWUKZGlm ZiAtLWdpdCBhL2djYy9vcHRzLmMgYi9nY2Mvb3B0cy5jCmluZGV4IDc1MmNj ODQuLjc4NGM3NGYgMTAwNjQ0Ci0tLSBhL2djYy9vcHRzLmMKKysrIGIvZ2Nj L29wdHMuYwpAQCAtNTAwLDYgKzUwMCw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1 Y3QgZGVmYXVsdF9vcHRpb25zIGRlZmF1bHRfb3B0aW9uc190YWJsZVtdID0K ICAgICB7IE9QVF9MRVZFTFNfMl9QTFVTLCBPUFRfZmlwYV9pY2YsIE5VTEws IDEgfSwKICAgICB7IE9QVF9MRVZFTFNfMl9QTFVTLCBPUFRfZmlzb2xhdGVf ZXJyb25lb3VzX3BhdGhzX2RlcmVmZXJlbmNlLCBOVUxMLCAxIH0sCiAgICAg eyBPUFRfTEVWRUxTXzJfUExVUywgT1BUX2Z1c2VfY2FsbGVyX3NhdmUsIE5V TEwsIDEgfSwKKyAgICB7IE9QVF9MRVZFTFNfMl9QTFVTLCBPUFRfZnRyZWVf dHlwZV9wcm10LCBOVUxMLCAxIH0sCiAKICAgICAvKiAtTzMgb3B0aW1pemF0 aW9ucy4gICovCiAgICAgeyBPUFRfTEVWRUxTXzNfUExVUywgT1BUX2Z0cmVl X2xvb3BfZGlzdHJpYnV0ZV9wYXR0ZXJucywgTlVMTCwgMSB9LApkaWZmIC0t Z2l0IGEvZ2NjL3Bhc3Nlcy5kZWYgYi9nY2MvcGFzc2VzLmRlZgppbmRleCAy MzA1ZDY3Li41MGM1Zjk2IDEwMDY0NAotLS0gYS9nY2MvcGFzc2VzLmRlZgor KysgYi9nY2MvcGFzc2VzLmRlZgpAQCAtMjY0LDYgKzI2NCw3IEBAIGFsb25n IHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2Vl CiAgICAgICBQVVNIX0lOU0VSVF9QQVNTRVNfV0lUSElOIChwYXNzX3RyZWVf bm9fbG9vcCkKIAkgIE5FWFRfUEFTUyAocGFzc19zbHBfdmVjdG9yaXplKTsK ICAgICAgIFBPUF9JTlNFUlRfUEFTU0VTICgpCisgICAgICBORVhUX1BBU1Mg KHBhc3NfdHlwZV9wcm9tb3Rpb24pOwogICAgICAgTkVYVF9QQVNTIChwYXNz X2xvd2VyX3ZlY3Rvcl9zc2EpOwogICAgICAgTkVYVF9QQVNTIChwYXNzX2Nz ZV9yZWNpcHJvY2Fscyk7CiAgICAgICBORVhUX1BBU1MgKHBhc3NfcmVhc3Nv Yyk7CmRpZmYgLS1naXQgYS9nY2MvdGltZXZhci5kZWYgYi9nY2MvdGltZXZh ci5kZWYKaW5kZXggYjc0Y2JiMC4uMDQxMGY5YiAxMDA2NDQKLS0tIGEvZ2Nj L3RpbWV2YXIuZGVmCisrKyBiL2djYy90aW1ldmFyLmRlZgpAQCAtMjY2LDYg KzI2Niw3IEBAIERFRlRJTUVWQVIgKFRWX1BMVUdJTl9SVU4gICAgICAgICAg ICAsICJwbHVnaW4gZXhlY3V0aW9uIikKIERFRlRJTUVWQVIgKFRWX0dJTVBM RV9TTFNSICAgICAgICAgICAsICJzdHJhaWdodC1saW5lIHN0cmVuZ3RoIHJl ZHVjdGlvbiIpCiBERUZUSU1FVkFSIChUVl9WVEFCTEVfVkVSSUZJQ0FUSU9O ICAgLCAidnRhYmxlIHZlcmlmaWNhdGlvbiIpCiBERUZUSU1FVkFSIChUVl9U UkVFX1VCU0FOICAgICAgICAgICAgLCAidHJlZSB1YnNhbiIpCitERUZUSU1F VkFSIChUVl9UUkVFX1RZUEVfUFJNVCAgICAgICAgLCAidHJlZSB0eXBlIHBy b21vdGlvbiIpCiAKIC8qIEV2ZXJ5dGhpbmcgZWxzZSBpbiByZXN0X29mX2Nv bXBpbGF0aW9uIG5vdCBpbmNsdWRlZCBhYm92ZS4gICovCiBERUZUSU1FVkFS IChUVl9FQVJMWV9MT0NBTAkgICAgICwgImVhcmx5IGxvY2FsIHBhc3NlcyIp CmRpZmYgLS1naXQgYS9nY2MvdHJlZS1wYXNzLmggYi9nY2MvdHJlZS1wYXNz LmgKaW5kZXggYTNlZmRkOC4uMGFjYzE1ZiAxMDA2NDQKLS0tIGEvZ2NjL3Ry ZWUtcGFzcy5oCisrKyBiL2djYy90cmVlLXBhc3MuaApAQCAtNDI0LDYgKzQy NCw3IEBAIGV4dGVybiBnaW1wbGVfb3B0X3Bhc3MgKm1ha2VfcGFzc19mcmUg KGdjYzo6Y29udGV4dCAqY3R4dCk7CiBleHRlcm4gZ2ltcGxlX29wdF9wYXNz ICptYWtlX3Bhc3NfY2hlY2tfZGF0YV9kZXBzIChnY2M6OmNvbnRleHQgKmN0 eHQpOwogZXh0ZXJuIGdpbXBsZV9vcHRfcGFzcyAqbWFrZV9wYXNzX2NvcHlf cHJvcCAoZ2NjOjpjb250ZXh0ICpjdHh0KTsKIGV4dGVybiBnaW1wbGVfb3B0 X3Bhc3MgKm1ha2VfcGFzc19pc29sYXRlX2Vycm9uZW91c19wYXRocyAoZ2Nj Ojpjb250ZXh0ICpjdHh0KTsKK2V4dGVybiBnaW1wbGVfb3B0X3Bhc3MgKm1h a2VfcGFzc190eXBlX3Byb21vdGlvbiAoZ2NjOjpjb250ZXh0ICpjdHh0KTsK IGV4dGVybiBnaW1wbGVfb3B0X3Bhc3MgKm1ha2VfcGFzc192cnAgKGdjYzo6 Y29udGV4dCAqY3R4dCk7CiBleHRlcm4gZ2ltcGxlX29wdF9wYXNzICptYWtl X3Bhc3NfdW5jcHJvcCAoZ2NjOjpjb250ZXh0ICpjdHh0KTsKIGV4dGVybiBn aW1wbGVfb3B0X3Bhc3MgKm1ha2VfcGFzc19yZXR1cm5fc2xvdCAoZ2NjOjpj b250ZXh0ICpjdHh0KTsKZGlmZiAtLWdpdCBhL2djYy90cmVlLXR5cGUtcHJt dG4uYyBiL2djYy90cmVlLXR5cGUtcHJtdG4uYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwLi4xZTc5YzhkCi0tLSAvZGV2L251bGwKKysr IGIvZ2NjL3RyZWUtdHlwZS1wcm10bi5jCkBAIC0wLDAgKzEsMTEwMyBAQAor LyogVHlwZSBwcm9tb3Rpb24gb2YgU1NBIG5hbWVzIHRvIG1pbmltaXNlIHJl ZHVuZGFudCB6ZXJvL3NpZ24gZXh0ZW5zaW9uLgorICAgQ29weXJpZ2h0IChD KSAyMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlz IGZpbGUgaXMgcGFydCBvZiBHQ0MuCisKK0dDQyBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1 bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGFzIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0IHlvdXIgb3B0aW9uKQor YW55IGxhdGVyIHZlcnNpb24uCisKK0dDQyBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQg QU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu dHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSBy ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlCithbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkczLiAg SWYgbm90IHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAg Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInN5c3RlbS5o IgorI2luY2x1ZGUgImNvcmV0eXBlcy5oIgorI2luY2x1ZGUgInRtLmgiCisj aW5jbHVkZSAidHJlZS5oIgorI2luY2x1ZGUgInN0b3ItbGF5b3V0LmgiCisj aW5jbHVkZSAiY2FsbHMuaCIKKyNpbmNsdWRlICJwcmVkaWN0LmgiCisjaW5j bHVkZSAibWFjaG1vZGUuaCIKKyNpbmNsdWRlICJoYXJkLXJlZy1zZXQuaCIK KyNpbmNsdWRlICJmdW5jdGlvbi5oIgorI2luY2x1ZGUgImRvbWluYW5jZS5o IgorI2luY2x1ZGUgImNmZy5oIgorI2luY2x1ZGUgImJhc2ljLWJsb2NrLmgi CisjaW5jbHVkZSAidHJlZS1zc2EtYWxpYXMuaCIKKyNpbmNsdWRlICJnaW1w bGUtZm9sZC5oIgorI2luY2x1ZGUgInRyZWUtZWguaCIKKyNpbmNsdWRlICJn aW1wbGUtZXhwci5oIgorI2luY2x1ZGUgImlzLWEuaCIKKyNpbmNsdWRlICJn aW1wbGUuaCIKKyNpbmNsdWRlICJnaW1wbGUtaXRlcmF0b3IuaCIKKyNpbmNs dWRlICJnaW1wbGUtc3NhLmgiCisjaW5jbHVkZSAidHJlZS1jZmcuaCIKKyNp bmNsdWRlICJ0cmVlLXBoaW5vZGVzLmgiCisjaW5jbHVkZSAic3NhLWl0ZXJh dG9ycy5oIgorI2luY2x1ZGUgInN0cmluZ3Bvb2wuaCIKKyNpbmNsdWRlICJ0 cmVlLXNzYW5hbWVzLmgiCisjaW5jbHVkZSAidHJlZS1zc2EuaCIKKyNpbmNs dWRlICJ0cmVlLXBhc3MuaCIKKyNpbmNsdWRlICJnaW1wbGUtcHJldHR5LXBy aW50LmgiCisjaW5jbHVkZSAibGFuZ2hvb2tzLmgiCisjaW5jbHVkZSAic2Jp dG1hcC5oIgorI2luY2x1ZGUgImRvbXdhbGsuaCIKKworLyogVGhpcyBwYXNz IGFwcGxpZXMgdHlwZSBwcm9tb3Rpb24gdG8gU1NBIG5hbWVzIGluIHRoZSBm dW5jdGlvbiBhbmQKKyAgIGluc2VydHMgYXBwcm9wcmlhdGUgdHJ1bmNhdGlv bnMuICBJZGVhIG9mIHRoaXMgcGFzcyBpcyB0byBwcm9tb3RlIG9wZXJhdGlv bnMKKyAgIHN1Y2ggYSB3YXkgdGhhdCB3ZSBjYW4gbWluaW1pc2UgZ2VuZXJh dGlvbiBvZiBzdWJyZWcgaW4gUlRMLAorICAgdGhhdCBpbnRlcm4gcmVzdWx0 cyBpbiByZW1vdmFsIG9mIHJlZHVuZGFudCB6ZXJvL3NpZ24gZXh0ZW5zaW9u cy4gIFRoaXMgcGFzcworICAgd2lsbCBydW4gcHJpb3IgdG8gVGhlIFZSUCBh bmQgRE9NIHN1Y2ggdGhhdCB0aGV5IHdpbGwgYmUgYWJsZSB0byBvcHRpbWlz ZQorICAgcmVkdW5kYW50IHRydW5jYXRpb25zIGFuZCBleHRlbnNpb25zLiAg VGhpcyBpcyBiYXNlZCBvbiB0aGUgZGlzY3Vzc2lvbiBmcm9tCisgICBodHRw czovL2djYy5nbnUub3JnL21sL2djYy1wYXRjaGVzLzIwMTQtMDkvbXNnMDA0 NzIuaHRtbC4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBuX3NzYV92YWw7Citz dGF0aWMgc2JpdG1hcCBzc2Ffbm90X3NhZmVfYml0bWFwOworc3RhdGljIHNi aXRtYXAgc3NhX3RvX2JlX3Byb21vdGVkX2JpdG1hcDsKK3N0YXRpYyBzYml0 bWFwIHNzYV9zZXRzX2hpZ2hlcl9iaXRzX2JpdG1hcDsKKworLyogUmV0dXJu IHRoZSBwcm9tb3RlZCB0eXBlIGZvciBUWVBFIGFzIGRlZmluZWQgYnkgUFJP TU9URV9NT0RFIG9mIHRoZQorICAgdGFyZ2V0LiAgKi8KK3N0YXRpYyB0cmVl CitnZXRfcHJvbW90ZWRfdHlwZSAodHJlZSB0eXBlKQoreworI2lmZGVmIFBS T01PVEVfTU9ERQorICB0cmVlIHByb21vdGVkX3R5cGU7CisgIGVudW0gbWFj aGluZV9tb2RlIG1vZGUgPSBUWVBFX01PREUgKHR5cGUpOworICBpbnQgdW5z ID0gVFlQRV9TSUdOICh0eXBlKTsKKworICBpZiAoUE9JTlRFUl9UWVBFX1Ag KHR5cGUpCisgICAgICB8fCBUWVBFX1BSRUNJU0lPTiAodHlwZSkgPT0gMQor ICAgICAgfHwgIUlOVEVHUkFMX1RZUEVfUCAodHlwZSkpCisgICAgcmV0dXJu IHR5cGU7CisKKyAgUFJPTU9URV9NT0RFIChtb2RlLCB1bnMsIHR5cGUpOwor ICB1bnMgPSBUWVBFX1NJR04gKHR5cGUpOworICBwcm9tb3RlZF90eXBlID0g bGFuZ19ob29rcy50eXBlcy50eXBlX2Zvcl9tb2RlIChtb2RlLCB1bnMpOwor CisgIGlmIChUWVBFX1BSRUNJU0lPTiAocHJvbW90ZWRfdHlwZSkgPiBUWVBF X1BSRUNJU0lPTiAodHlwZSkpCisgICAgeworICAgICAgcHJvbW90ZWRfdHlw ZSA9IGJ1aWxkX3R5cGVfYXR0cmlidXRlX3F1YWxfdmFyaWFudCAocHJvbW90 ZWRfdHlwZSwKKwkJCQkJCSAgICBUWVBFX0FUVFJJQlVURVMgKHR5cGUpLAor CQkJCQkJICAgIFRZUEVfUVVBTFMgKHR5cGUpKTsKKyAgICAgIHR5cGUgPSBw cm9tb3RlZF90eXBlOworICAgIH0KKyNlbmRpZgorICByZXR1cm4gdHlwZTsK K30KKworLyogUHJlZGljYXRlIHRoYXQgdGVsbHMgaWYgcHJvbW90aW5nIGNv bXB1dGF0aW9uIHdpdGggc3NhIE5BTUUgaXMgc2FmZS4gICovCitzdGF0aWMg Ym9vbAorcHJvbW90aW9uX3NhZmVfcCAodHJlZSBuYW1lKQoreworICBpZiAo VFJFRV9DT0RFIChuYW1lKSA9PSBTU0FfTkFNRSkKKyAgICB7CisgICAgICBn aW1wbGUgc3RtdCA9IFNTQV9OQU1FX0RFRl9TVE1UIChuYW1lKTsKKyAgICAg IHVuc2lnbmVkIGludCBpbmRleCA9IFNTQV9OQU1FX1ZFUlNJT04gKG5hbWUp OworCisgICAgICBpZiAoZ2ltcGxlX3ZkZWYgKHN0bXQpICE9IE5VTExfVFJF RQorCSAgfHwgZ2ltcGxlX3Z1c2UgKHN0bXQpICE9IE5VTExfVFJFRSkKKwly ZXR1cm4gZmFsc2U7CisgICAgICBpZiAoaW5kZXggPCBuX3NzYV92YWwpCisJ cmV0dXJuICFiaXRtYXBfYml0X3AgKHNzYV9ub3Rfc2FmZV9iaXRtYXAsIGlu ZGV4KTsKKyAgICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLyogUmV0dXJu IHRydWUgaWYgc3NhIE5BTUUgaXMgYWxyZWFkeSBjb25zaWRlcmVkIGZvciBw cm9tb3Rpb24uICAqLworc3RhdGljIGJvb2wKK3NzYV9wcm9tb3RlZF9wICh0 cmVlIG5hbWUpCit7CisgIGlmIChUUkVFX0NPREUgKG5hbWUpID09IFNTQV9O QU1FKQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGludCBpbmRleCA9IFNTQV9O QU1FX1ZFUlNJT04gKG5hbWUpOworICAgICAgaWYgKGluZGV4IDwgbl9zc2Ff dmFsKQorCXJldHVybiAhYml0bWFwX2JpdF9wIChzc2FfdG9fYmVfcHJvbW90 ZWRfYml0bWFwLCBpbmRleCk7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30K KworLyogUmV0dXJuIHRydWUgaWYgc3NhIE5BTUUgd2lsbCBiZSBjb25zaWRl cmVkIGZvciBwcm9tb3Rpb24uICAqLworc3RhdGljIGJvb2wKK3NzYV90b2Jl X3Byb21vdGVkX3AgKHRyZWUgbmFtZSkKK3sKKyAgaWYgKFRSRUVfQ09ERSAo bmFtZSkgPT0gU1NBX05BTUUpCisgICAgeworICAgICAgdW5zaWduZWQgaW50 IGluZGV4ID0gU1NBX05BTUVfVkVSU0lPTiAobmFtZSk7CisgICAgICBpZiAo aW5kZXggPCBuX3NzYV92YWwpCisJcmV0dXJuIGJpdG1hcF9iaXRfcCAoc3Nh X3RvX2JlX3Byb21vdGVkX2JpdG1hcCwgaW5kZXgpOworICAgIH0KKyAgcmV0 dXJuIGZhbHNlOworfQorCisvKiBTZXQgc3NhIE5BTUUgdG8gYmUgYWxyZWFk eSBjb25zaWRlcmVkIGZvciBwcm9tb3Rpb24uICAqLworc3RhdGljIHZvaWQK K3NldF9zc2FfcHJvbW90ZWQgKHRyZWUgbmFtZSkKK3sKKyAgaWYgKFRSRUVf Q09ERSAobmFtZSkgPT0gU1NBX05BTUUpCisgICAgeworICAgICAgdW5zaWdu ZWQgaW50IGluZGV4ID0gU1NBX05BTUVfVkVSU0lPTiAobmFtZSk7CisgICAg ICBpZiAoaW5kZXggPCBuX3NzYV92YWwpCisJYml0bWFwX2NsZWFyX2JpdCAo c3NhX3RvX2JlX3Byb21vdGVkX2JpdG1hcCwgaW5kZXgpOworICAgIH0KK30K KworLyogU2V0IHNzYSBOQU1FIHdpbGwgaGF2ZSBoaWdoZXIgYml0cyBpZiBw cm9tb3RlZC4gICovCitzdGF0aWMgdm9pZAorc2V0X3NzYV9vdmVyZmxvd3Mg KHRyZWUgbmFtZSkKK3sKKyAgaWYgKFRSRUVfQ09ERSAobmFtZSkgPT0gU1NB X05BTUUpCisgICAgeworICAgICAgdW5zaWduZWQgaW50IGluZGV4ID0gU1NB X05BTUVfVkVSU0lPTiAobmFtZSk7CisgICAgICBpZiAoaW5kZXggPCBuX3Nz YV92YWwpCisJYml0bWFwX3NldF9iaXQgKHNzYV9zZXRzX2hpZ2hlcl9iaXRz X2JpdG1hcCwgaW5kZXgpOworICAgIH0KK30KKworLyogUmV0dXJuIHRydWUg aWYgc3NhIE5BTUUgd2lsbCBoYXZlIGhpZ2hlciBiaXRzIGlmIHByb21vdGVk LiAgKi8KK3N0YXRpYyBib29sCitzc2Ffb3ZlcmZsb3dzX3AgKHRyZWUgbmFt ZSkKK3sKKyAgaWYgKFRSRUVfQ09ERSAobmFtZSkgPT0gU1NBX05BTUUpCisg ICAgeworICAgICAgdW5zaWduZWQgaW50IGluZGV4ID0gU1NBX05BTUVfVkVS U0lPTiAobmFtZSk7CisgICAgICBpZiAoaW5kZXggPCBuX3NzYV92YWwpCisJ cmV0dXJuIGJpdG1hcF9iaXRfcCAoc3NhX3NldHNfaGlnaGVyX2JpdHNfYml0 bWFwLCBpbmRleCk7CisgICAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8q IENyZWF0ZSBhbiBzc2Egd2l0aCBUWVBFIHRvIGNvcHkgc3NhIFZBUi4gICov CitzdGF0aWMgdHJlZQorbWFrZV9wcm9tb3RlZF9jb3B5ICh0cmVlIHZhciwg Z2ltcGxlIGRlZl9zdG10LCB0cmVlIHR5cGUpCit7CisgIHRyZWUgbmV3X2xo cyA9IG1ha2Vfc3NhX25hbWUgKHR5cGUsIGRlZl9zdG10KTsKKyAgaWYgKFNT QV9OQU1FX09DQ1VSU19JTl9BQk5PUk1BTF9QSEkgKHZhcikpCisgICAgU1NB X05BTUVfT0NDVVJTX0lOX0FCTk9STUFMX1BISSAobmV3X2xocykgPSAxOwor ICByZXR1cm4gbmV3X2xoczsKK30KKworLyogUmV0dXJuIHNpbmdsZSBzdWNj ZXNzb3IgKGV4Y2x1ZGluZyBFSCBlZGdlKSBiYXNpYyBibG9jay4gIElmIHRo ZXJlIGFyZSBtb3JlCisgICB0aGFuIG9uZSBzdWNjZXNzb3JzLCByZXR1cm4g TlVMTC4gICovCitzdGF0aWMgYmFzaWNfYmxvY2sKK2dldF9uZXh0X2JiIChi YXNpY19ibG9jayBiYikKK3sKKyAgZWRnZSBlLCByZXMgPSBOVUxMOworICBl ZGdlX2l0ZXJhdG9yIGVpOworCisgIEZPUl9FQUNIX0VER0UgKGUsIGVpLCBi Yi0+c3VjY3MpCisgICAgaWYgKCEoZS0+ZmxhZ3MgJiBFREdFX0VIKSkKKyAg ICAgIHsKKwlpZiAocmVzKQorCSAgcmV0dXJuIE5VTEw7CisJcmVzID0gZTsK KyAgICAgIH0KKyAgcmV0dXJuIHJlcy0+ZGVzdDsKK30KKworLyogSW5zZXJ0 IENPUFlfU1RNVCBhZnRlciBTVE1UIHdoZW4gU1RNVCBjYW4gdGhyb3cuICBD cmVhdGUgYSBuZXcgYmFzaWMgYmxvY2sKKyAgIGJldHdlZW4gYmFzaWMgYmxv Y2sgY29udGFpbmluZyBTVE1UIGFuZCBpdHMgc3VjY2Vzc29yLiAgKi8KK3N0 YXRpYyB2b2lkCitpbnNlcnRfbmV4dF9iYiAoZ2ltcGxlIHN0bXQsIGdpbXBs ZSBjb3B5X3N0bXQpCit7CisgIGVkZ2VfaXRlcmF0b3IgZWk7CisgIGVkZ2Ug ZSwgZWRnZSA9IE5VTEw7CisgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaTsK KyAgYmFzaWNfYmxvY2sgYmIgPSBnaW1wbGVfYmIgKHN0bXQpOworCisgIEZP Ul9FQUNIX0VER0UgKGUsIGVpLCBiYi0+c3VjY3MpCisgICAgaWYgKCEoZS0+ ZmxhZ3MgJiBFREdFX0VIKSkKKyAgICAgIHsKKwlnY2NfYXNzZXJ0IChlZGdl ID09IE5VTEwpOworCWVkZ2UgPSBlOworICAgICAgfQorCisgIGdjY19hc3Nl cnQgKGVkZ2UpOworICBiYXNpY19ibG9jayBuZXdfYmIgPSBzcGxpdF9lZGdl IChlZGdlKTsKKyAgZ3NpID0gZ3NpX2FmdGVyX2xhYmVscyAobmV3X2JiKTsK KyAgZ3NpX2luc2VydF9hZnRlciAoJmdzaSwgY29weV9zdG10LCBHU0lfTkVX X1NUTVQpOworfQorCisKKy8qIFJldHVybiBmYWxzZSBpZiByaHMgdHlwZSBj YW5ub3QgYmUgcHJvbW90ZWQgaW4gdGhlIHN0bXQuICBSZXR1cm4gdHJ1ZQor ICAgb3RoZXJ3aXNlLiAgKi8KK3N0YXRpYyBib29sCithc3NpZ25fcmhzX3By b21vdGFibGVfcCAoZ2ltcGxlIHN0bXQsIHRyZWUgcHJvbW90ZWRfdHlwZSkK K3sKKyAgZ2NjX2Fzc2VydCAoZ2ltcGxlX2NvZGUgKHN0bXQpID09IEdJTVBM RV9BU1NJR04pOworICBlbnVtIHRyZWVfY29kZSBjb2RlID0gZ2ltcGxlX2Fz c2lnbl9yaHNfY29kZSAoc3RtdCk7CisgIHRyZWUgbGhzID0gZ2ltcGxlX2Fz c2lnbl9saHMgKHN0bXQpOworICB0cmVlIHJoczEgPSBnaW1wbGVfYXNzaWdu X3JoczEgKHN0bXQpOworICB0cmVlIHJoczIgPSBnaW1wbGVfYXNzaWduX3Jo czIgKHN0bXQpOworCisgIC8qIElmIHRoZSBPUCBpcyBwYXJ0IG9mIGNvbmRp dGlvbiBpbiBDT05EX0VYUFIsIGl0IGNhbiBiZSBwcm9tb3RlZCBvbmx5IGlm CisgICAgIGhpZ2hlcl9iaXRzIGZvciBib3RoIHRoZSBvcGVyYW5kcyBhcmUg bm90IHNldC4gICovCisgIGlmIChUUkVFX0NPREVfQ0xBU1MgKGNvZGUpID09 IHRjY19jb21wYXJpc29uKQorICAgIHsKKyAgICAgIC8qIExIUyBhbmQgUkhT IGNhbiBiZSBwcm9tb3RlZCB3aXRob3V0IGNoYW5naW5nIHRoZSByZXN1bHRz IG9mCisJIGNvbXBhcmlzb24uICAqLworICAgICAgaWYgKCgoc3NhX3RvYmVf cHJvbW90ZWRfcCAocmhzMSkKKwkgICAgJiYgcHJvbW90aW9uX3NhZmVfcCAo cmhzMSkKKwkgICAgJiYgIXNzYV9vdmVyZmxvd3NfcCAocmhzMSkpCisJICAg fHwgKFRSRUVfQ09ERSAocmhzMSkgPT0gSU5URUdFUl9DU1QpKQorCSAgJiYg KChzc2FfdG9iZV9wcm9tb3RlZF9wIChyaHMyKQorCSAgICAgICAmJiBwcm9t b3Rpb25fc2FmZV9wIChyaHMyKQorCSAgICAgICAmJiAhc3NhX292ZXJmbG93 c19wIChyaHMyKSkKKwkgICAgICB8fCAoVFJFRV9DT0RFIChyaHMyKSA9PSBJ TlRFR0VSX0NTVCkpKQorCXJldHVybiB0cnVlOworICAgICAgLyogTEhTIG9y IFJIUyBvZiB0aGUgY29tcGFyaXNvbiBpcyBhbHJlYWR5IHByb21vdGVkLiAg Ki8KKyAgICAgIGVsc2UgaWYgKChUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBF IChyaHMxKSkKKwkJPT0gVFlQRV9QUkVDSVNJT04gKHByb21vdGVkX3R5cGUp KQorCSAgICAgICB8fCAoVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAocmhz MikpCisJCSAgID09IFRZUEVfUFJFQ0lTSU9OIChwcm9tb3RlZF90eXBlKSkp CisJcmV0dXJuIHRydWU7CisgICAgICBlbHNlCisJcmV0dXJuIGZhbHNlOwor ICAgIH0KKworICBpZiAoVFJFRV9DT0RFX0NMQVNTIChjb2RlKSA9PSB0Y2Nf cmVmZXJlbmNlCisgICAgICB8fCBjb2RlID09IFZJRVdfQ09OVkVSVF9FWFBS CisgICAgICB8fCBjb2RlID09IENPTVBMRVhfRVhQUgorICAgICAgfHwgY29k ZSA9PSBBU01fRVhQUgorICAgICAgfHwgY29kZSA9PSBPQkpfVFlQRV9SRUYK KyAgICAgIHx8IGdpbXBsZV92ZGVmIChzdG10KQorICAgICAgfHwgVkVDVE9S X1RZUEVfUCAoVFJFRV9UWVBFIChsaHMpKSkKKyAgICByZXR1cm4gZmFsc2U7 CisgIHJldHVybiB0cnVlOworfQorCisvKiBQcm9tb3RlIGNvbnN0YW50cyBp biBTVE1UIHRvIFRZUEUuICAqLworc3RhdGljIHZvaWQKK3Byb21vdGVfY3N0 X2luX3N0bXQgKGdpbXBsZSBzdG10LCB0cmVlIHR5cGUpCit7CisgIHRyZWUg b3A7CisgIHNzYV9vcF9pdGVyIGl0ZXI7CisgIHVzZV9vcGVyYW5kX3Agb3By bmQ7CisgIGludCBpbmRleDsKKworICBzd2l0Y2ggKGdpbXBsZV9jb2RlIChz dG10KSkKKyAgICB7CisgICAgY2FzZSBHSU1QTEVfQVNTSUdOOgorICAgICAg b3AgPSBnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpOworICAgICAgaWYgKG9w ICYmIFRSRUVfQ09ERSAob3ApID09IElOVEVHRVJfQ1NUKQorCWdpbXBsZV9h c3NpZ25fc2V0X3JoczEgKHN0bXQsIGZvbGRfY29udmVydCAodHlwZSwgb3Ap KTsKKyAgICAgIG9wID0gZ2ltcGxlX2Fzc2lnbl9yaHMyIChzdG10KTsKKyAg ICAgIGlmIChvcCAmJiBUUkVFX0NPREUgKG9wKSA9PSBJTlRFR0VSX0NTVCkK KwlnaW1wbGVfYXNzaWduX3NldF9yaHMyIChzdG10LCBmb2xkX2NvbnZlcnQg KHR5cGUsIG9wKSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgR0lNUExF X1BISToKKyAgICAgIEZPUl9FQUNIX1BISV9BUkcgKG9wcm5kLCBzdG10LCBp dGVyLCBTU0FfT1BfVVNFKQorCXsKKwkgIG9wID0gVVNFX0ZST01fUFRSIChv cHJuZCk7CisJICBpbmRleCA9IFBISV9BUkdfSU5ERVhfRlJPTV9VU0UgKG9w cm5kKTsKKwkgIGlmIChUUkVFX0NPREUgKG9wKSA9PSBJTlRFR0VSX0NTVCkK KwkgICAgU0VUX1BISV9BUkdfREVGIChzdG10LCBpbmRleCwgZm9sZF9jb252 ZXJ0ICh0eXBlLCBvcCkpOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2Fz ZSBHSU1QTEVfQ09ORDoKKyAgICAgIG9wID0gZ2ltcGxlX2NvbmRfbGhzIChz dG10KTsKKyAgICAgIGlmIChvcCAmJiBUUkVFX0NPREUgKG9wKSA9PSBJTlRF R0VSX0NTVCkKKwlnaW1wbGVfY29uZF9zZXRfbGhzIChzdG10LCBmb2xkX2Nv bnZlcnQgKHR5cGUsIG9wKSk7CisgICAgICBvcCA9IGdpbXBsZV9jb25kX3Jo cyAoc3RtdCk7CisgICAgICBpZiAob3AgJiYgVFJFRV9DT0RFIChvcCkgPT0g SU5URUdFUl9DU1QpCisJZ2ltcGxlX2NvbmRfc2V0X3JocyAoc3RtdCwgZm9s ZF9jb252ZXJ0ICh0eXBlLCBvcCkpOworCisgICAgZGVmYXVsdDoKKyAgICAg IGJyZWFrOworICAgIH0KK30KKworLyogUHJvbW90ZSB1c2UgaW4gYW4gYXNz aWdubWVudC4gIERlcGVuZGluZyBvbiB0aGUgZ2ltcGxlX2Fzc2lnbl9yaHNf Y29kZSwKKyAgIHZhbHVlcyBpbiBORVdfVVNFIG1pZ2h0IGhhdmUgdG8gYmUg dHJ1bmNhdGVkIHRvIHRoZSB0eXBlIG9mIFVTRS4gICovCitzdGF0aWMgdm9p ZAorcHJvbW90ZV9hc3NpZ25fc3RtdF91c2UgKGdpbXBsZSBzdG10LAorCQkJ IHRyZWUgdXNlLAorCQkJIGltbV91c2VfaXRlcmF0b3IgKnVpLAorCQkJIHRy ZWUgbmV3X3VzZSwKKwkJCSB0cmVlIGNvcHlfb2ZfdXNlLAorCQkJIHRyZWUg cHJvbW90ZWRfdHlwZSkKK3sKKyAgdHJlZSBsaHMgPSBnaW1wbGVfYXNzaWdu X2xocyAoc3RtdCk7CisgIHRyZWUgcmhzMSA9IGdpbXBsZV9hc3NpZ25fcmhz MSAoc3RtdCk7CisgIHRyZWUgcmhzMiA9IGdpbXBsZV9hc3NpZ25fcmhzMiAo c3RtdCk7CisgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaTsKKyAgdXNlX29w ZXJhbmRfcCBvcDsKKyAgdHJlZSB0eXBlOworICBlbnVtIHRyZWVfY29kZSBj b2RlID0gZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoc3RtdCk7CisgIC8qIElm IHByb21vdGVkIGFuZCBmaXggdXAgaXMgdG9iZSBwZXJmb3JtZWQsIGZpeCBp cyB0cnVlLiAgKi8KKyAgYm9vbCBmaXggPSBmYWxzZTsKKyAgLyogSWYgc3Rt dCBjb2RlIHNwZWNpZmMgYW5kIGZpeCB1cGlzICBwZXJmb3JtZWQsIGRvbmUg aXMgdHJ1ZS4gICovCisgIGJvb2wgZG9uZSA9IGZhbHNlOworCisgIHN3aXRj aCAoY29kZSkKKyAgICB7CisgICAgQ0FTRV9DT05WRVJUOgorICAgICAgLyog SWYgdGhpcyBpcyB3aGVyZSBwcmVjaXNpb24gaXMgbG9zdCwganVzdCByZXBs YWNlIHRoZSB1c2Ugd2l0aAorCSBuZXdfdXNlLiAqLworICAgICAgaWYgKFRZ UEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKGxocykpIDwgVFlQRV9QUkVDSVNJ T04gKFRSRUVfVFlQRSAocmhzMSkpKQorCXsKKwkgIGRvbmUgPSB0cnVlOwor CSAgRk9SX0VBQ0hfSU1NX1VTRV9PTl9TVE1UIChvcCwgKnVpKQorCSAgICBT RVRfVVNFIChvcCwgbmV3X3VzZSk7CisJICB1cGRhdGVfc3RtdCAoc3RtdCk7 CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJTSElGVF9FWFBSOgor ICAgIGNhc2UgTFNISUZUX0VYUFI6CisgICAgY2FzZSBXSURFTl9MU0hJRlRf RVhQUjoKKyAgICAgIGlmICh1c2UgPT0gcmhzMgorCSAgJiYgc3NhX292ZXJm bG93c19wICh1c2UpKQorCWZpeCA9IHRydWU7CisgICAgICBicmVhazsKKwor ICAgIGNhc2UgVFJVTkNfTU9EX0VYUFI6CisgICAgY2FzZSBDRUlMX01PRF9F WFBSOgorICAgIGNhc2UgRkxPT1JfTU9EX0VYUFI6CisgICAgY2FzZSBST1VO RF9NT0RfRVhQUjoKKyAgICBjYXNlIFRSVU5DX0RJVl9FWFBSOgorICAgIGNh c2UgQ0VJTF9ESVZfRVhQUjoKKyAgICBjYXNlIEZMT09SX0RJVl9FWFBSOgor ICAgIGNhc2UgUkRJVl9FWFBSOgorICAgIGNhc2UgUk9VTkRfRElWX0VYUFI6 CisgICAgY2FzZSBFWEFDVF9ESVZfRVhQUjoKKyAgICAgIGlmIChzc2Ffb3Zl cmZsb3dzX3AgKHVzZSkpCisJZml4ID0gdHJ1ZTsKKyAgICAgIGJyZWFrOwor CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiAo Zml4ICYmICFkb25lKQorICAgIHsKKyAgICAgIGlmIChwcm9tb3Rpb25fc2Fm ZV9wIChsaHMpKQorCXsKKwkgIHRyZWUgdGVtcCA9IG1ha2VfcHJvbW90ZWRf Y29weSAodXNlLCBOVUxMLCBwcm9tb3RlZF90eXBlKTsKKwkgIGdpbXBsZSBj b3B5X3N0bXQKKwkgICAgPSBnaW1wbGVfYnVpbGRfYXNzaWduX3dpdGhfb3Bz IChDT05WRVJUX0VYUFIsIHRlbXAsCisJCQkJCSAgICBuZXdfdXNlLCBOVUxM X1RSRUUpOworCSAgZ3NpID0gZ3NpX2Zvcl9zdG10IChzdG10KTsKKwkgIGdz aV9pbnNlcnRfYmVmb3JlICgmZ3NpLCBjb3B5X3N0bXQsIEdTSV9ORVdfU1RN VCk7CisJICBGT1JfRUFDSF9JTU1fVVNFX09OX1NUTVQgKG9wLCAqdWkpCisJ ICAgIFNFVF9VU0UgKG9wLCB0ZW1wKTsKKwkgIHVwZGF0ZV9zdG10IChzdG10 KTsKKwl9CisgICAgICBlbHNlCisJeworCSAgdHJlZSB0ZW1wOworCSAgaWYg KGNvcHlfb2ZfdXNlKQorCSAgICB0ZW1wID0gY29weV9vZl91c2U7CisJICBl bHNlCisJICAgIHsKKwkgICAgICB0ZW1wID0gbWFrZV9wcm9tb3RlZF9jb3B5 ICh1c2UsIE5VTEwsIFRSRUVfVFlQRSAodXNlKSk7CisJICAgICAgZ2ltcGxl IGNvcHlfc3RtdAorCQk9IGdpbXBsZV9idWlsZF9hc3NpZ25fd2l0aF9vcHMg KENPTlZFUlRfRVhQUiwgdGVtcCwKKwkJCQkJCW5ld191c2UsIE5VTExfVFJF RSk7CisJICAgICAgZ3NpID0gZ3NpX2Zvcl9zdG10IChzdG10KTsKKwkgICAg ICBnc2lfaW5zZXJ0X2JlZm9yZSAoJmdzaSwgY29weV9zdG10LCBHU0lfTkVX X1NUTVQpOworCSAgICB9CisKKwkgIEZPUl9FQUNIX0lNTV9VU0VfT05fU1RN VCAob3AsICp1aSkKKwkgICAgU0VUX1VTRSAob3AsIHRlbXApOworCSAgdXBk YXRlX3N0bXQgKHN0bXQpOworCX0KKyAgICB9CisgIGVsc2UgaWYgKCFkb25l KQorICAgIHsKKyAgICAgIGlmIChhc3NpZ25fcmhzX3Byb21vdGFibGVfcCAo c3RtdCwgcHJvbW90ZWRfdHlwZSkKKwkgICYmIChwcm9tb3Rpb25fc2FmZV9w IChsaHMpCisJICAgICAgfHwgKFRSRUVfQ09ERV9DTEFTUyAoY29kZSkgPT0g dGNjX2NvbXBhcmlzb24pKSkKKwl7CisJICB0eXBlID0gcHJvbW90ZWRfdHlw ZTsKKwkgIGlmIChUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFICh1c2UpKQor CSAgICAgIDwgVFlQRV9QUkVDSVNJT04gKHByb21vdGVkX3R5cGUpKQorCSAg ICBwcm9tb3RlX2NzdF9pbl9zdG10IChzdG10LCBwcm9tb3RlZF90eXBlKTsK Kwl9CisgICAgICBlbHNlCisJdHlwZSA9IFRSRUVfVFlQRSAodXNlKTsKKwor ICAgICAgaWYgKCh0eXBlICE9IFRSRUVfVFlQRSAobmV3X3VzZSkKKwkgICAm JiB0eXBlICE9IFRSRUVfVFlQRSAodXNlKSkKKwkgIHx8ICh0eXBlID09IFRS RUVfVFlQRSAodXNlKQorCSAgICAgICYmICFjb3B5X29mX3VzZSkpCisJewor CSAgdHJlZSB0ZW1wID0gbWFrZV9wcm9tb3RlZF9jb3B5ICh1c2UsIE5VTEws IHR5cGUpOworCSAgZ2ltcGxlIGNvcHlfc3RtdAorCSAgICA9IGdpbXBsZV9i dWlsZF9hc3NpZ25fd2l0aF9vcHMgKENPTlZFUlRfRVhQUiwgdGVtcCwKKwkJ CQkJICAgIG5ld191c2UsIE5VTExfVFJFRSk7CisJICBnc2kgPSBnc2lfZm9y X3N0bXQgKHN0bXQpOworCSAgZ3NpX2luc2VydF9iZWZvcmUgKCZnc2ksIGNv cHlfc3RtdCwgR1NJX05FV19TVE1UKTsKKwkgIEZPUl9FQUNIX0lNTV9VU0Vf T05fU1RNVCAob3AsICp1aSkKKwkgICAgU0VUX1VTRSAob3AsIHRlbXApOwor CSAgdXBkYXRlX3N0bXQgKHN0bXQpOworCX0KKyAgICAgIGVsc2UgaWYgKHVz ZSAhPSBuZXdfdXNlKQorCXsKKwkgIEZPUl9FQUNIX0lNTV9VU0VfT05fU1RN VCAob3AsICp1aSkKKwkgICAgaWYgKHR5cGUgPT0gVFJFRV9UWVBFIChuZXdf dXNlKSkKKwkgICAgICBTRVRfVVNFIChvcCwgbmV3X3VzZSk7CisJICAgIGVs c2UKKwkgICAgICBTRVRfVVNFIChvcCwgY29weV9vZl91c2UpOworCSAgdXBk YXRlX3N0bXQgKHN0bXQpOworCX0KKyAgICB9Cit9CisKKy8qIFByb21vdGUg c3NhIFVTRSBpbiBwaGkgU1RNVCB0byBQUk9NT1RFRF9UWVBFLiAgKi8KK3N0 YXRpYyB2b2lkCitwcm9tb3RlX3BoaV9zdG10X3VzZSAoZ2ltcGxlIHN0bXQs CisJCSAgICAgICB0cmVlIHVzZSwKKwkJICAgICAgIGltbV91c2VfaXRlcmF0 b3IgKnVpLAorCQkgICAgICAgdHJlZSBuZXdfdXNlLAorCQkgICAgICAgdHJl ZSBjb3B5X29mX3VzZSwKKwkJICAgICAgIHRyZWUgcHJvbW90ZWRfdHlwZSkK K3sKKyAgdHJlZSBsaHMgPSBQSElfUkVTVUxUIChzdG10KTsKKyAgdHJlZSB0 eXBlOworICB0cmVlIHRlbXA7CisgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdz aTsKKyAgdXNlX29wZXJhbmRfcCBvcDsKKworICBpZiAoc3NhX3RvYmVfcHJv bW90ZWRfcCAobGhzKQorICAgICAgJiYgcHJvbW90aW9uX3NhZmVfcCAobGhz KSkKKyAgICB0eXBlID0gcHJvbW90ZWRfdHlwZTsKKyAgZWxzZQorICAgIHR5 cGUgPSBUUkVFX1RZUEUgKGxocyk7CisKKyAgLyogQ2hlY2sgaWYgd2UgbmVl ZCBhIGNvbnZlcnQgc3RtdCB0byBnZXQgdGhlIHJlcXVpcmVkIHR5cGUuICAq LworICBpZiAoKHR5cGUgIT0gVFJFRV9UWVBFIChuZXdfdXNlKSAmJiB0eXBl ICE9IFRSRUVfVFlQRSAodXNlKSkKKyAgICAgIHx8ICh0eXBlID09IFRSRUVf VFlQRSAodXNlKSAmJiAhY29weV9vZl91c2UpKQorICAgIHsKKyAgICAgIHRl bXAgPSBtYWtlX3Byb21vdGVkX2NvcHkgKHVzZSwgTlVMTCwgdHlwZSk7Cisg ICAgICBnaW1wbGUgY29weV9zdG10CisJPSBnaW1wbGVfYnVpbGRfYXNzaWdu X3dpdGhfb3BzIChDT05WRVJUX0VYUFIsIHRlbXAsCisJCQkJCW5ld191c2Us IE5VTExfVFJFRSk7CisgICAgICBpZiAoZ2ltcGxlX2NvZGUgKFNTQV9OQU1F X0RFRl9TVE1UIChuZXdfdXNlKSkgPT0gR0lNUExFX05PUCkKKwl7CisJICBi YXNpY19ibG9jayBiYiA9IEVOVFJZX0JMT0NLX1BUUl9GT1JfRk4gKGNmdW4p OworCSAgYmIgPSBnZXRfbmV4dF9iYiAoYmIpOworCSAgZ2NjX2Fzc2VydCAo YmIpOworCSAgZ3NpID0gZ3NpX2FmdGVyX2xhYmVscyAoYmIpOworCSAgZ3Np X2luc2VydF9iZWZvcmUgKCZnc2ksIGNvcHlfc3RtdCwgR1NJX05FV19TVE1U KTsKKwl9CisgICAgICBlbHNlIGlmIChnaW1wbGVfY29kZSAoU1NBX05BTUVf REVGX1NUTVQgKG5ld191c2UpKQorCSAgICAgICAhPSBHSU1QTEVfUEhJKQor CXsKKwkgIGdzaSA9IGdzaV9mb3Jfc3RtdCAoU1NBX05BTUVfREVGX1NUTVQg KG5ld191c2UpKTsKKwkgIGlmIChsb29rdXBfc3RtdF9laF9scCAoU1NBX05B TUVfREVGX1NUTVQgKG5ld191c2UpKSA+IDApCisJICAgIGluc2VydF9uZXh0 X2JiIChTU0FfTkFNRV9ERUZfU1RNVCAobmV3X3VzZSksIGNvcHlfc3RtdCk7 CisJICBlbHNlCisJICAgIGdzaV9pbnNlcnRfYWZ0ZXIgKCZnc2ksIGNvcHlf c3RtdCwgR1NJX05FV19TVE1UKTsKKwl9CisgICAgICBlbHNlCisJeworCSAg Z3NpID0gZ3NpX2FmdGVyX2xhYmVscworCSAgICAoZ2ltcGxlX2JiIChTU0Ff TkFNRV9ERUZfU1RNVCAobmV3X3VzZSkpKTsKKwkgIGdzaV9pbnNlcnRfYmVm b3JlICgmZ3NpLCBjb3B5X3N0bXQsIEdTSV9ORVdfU1RNVCk7CisJfQorICAg IH0KKyAgZWxzZSBpZiAodHlwZSA9PSBUUkVFX1RZUEUgKG5ld191c2UpKQor ICAgIHRlbXAgPSBuZXdfdXNlOworICBlbHNlCisgICAgdGVtcCA9IGNvcHlf b2ZfdXNlOworCisgIEZPUl9FQUNIX0lNTV9VU0VfT05fU1RNVCAob3AsICp1 aSkKKyAgICBTRVRfVVNFIChvcCwgdGVtcCk7CisgIHVwZGF0ZV9zdG10IChz dG10KTsKK30KKworLyogUHJvbW90ZSBzc2EgVVNFIGluIFNUTVQgdG8gUFJP TU9URURfVFlQRS4gICovCitzdGF0aWMgdm9pZAorcHJvbW90ZV9jb25kX3N0 bXRfdXNlIChnaW1wbGUgc3RtdCwKKwkJICAgICAgIHRyZWUgdXNlLAorCQkg ICAgICAgaW1tX3VzZV9pdGVyYXRvciAqdWksCisJCSAgICAgICB0cmVlIG5l d191c2UsCisJCSAgICAgICB0cmVlIGNvcHlfb2ZfdXNlLAorCQkgICAgICAg dHJlZSBwcm9tb3RlZF90eXBlKQoreworICBib29sIHByb21vdGU7CisgIHRy ZWUgbGhzID0gZ2ltcGxlX2NvbmRfbGhzIChzdG10KTsKKyAgdHJlZSByaHMg PSBnaW1wbGVfY29uZF9yaHMgKHN0bXQpOworICBnaW1wbGVfc3RtdF9pdGVy YXRvciBnc2k7CisgIHVzZV9vcGVyYW5kX3Agb3A7CisKKyAgLyogY2hlY2sg aWYgTEhTIGFuZCBSSFMgY2FuIGJlIHByb21vdGVkIHdpdGhvdXQgY2hhbmdp bmcgdGhlIHJlc3VsdHMKKyAgICAgb2YgY29tcGFyaXNvbi4gICovCisgIGlm ICgoKHNzYV90b2JlX3Byb21vdGVkX3AgKGxocykKKwkmJiBwcm9tb3Rpb25f c2FmZV9wIChsaHMpCisJJiYgIXNzYV9vdmVyZmxvd3NfcCAobGhzKSkKKyAg ICAgICB8fCAoVFJFRV9DT0RFIChsaHMpID09IElOVEVHRVJfQ1NUKSkKKyAg ICAgICYmICgoIHNzYV90b2JlX3Byb21vdGVkX3AgKHJocykKKwkgICAmJiBw cm9tb3Rpb25fc2FmZV9wIChyaHMpCisJICAgJiYgIXNzYV9vdmVyZmxvd3Nf cCAocmhzKSkKKwkgIHx8IChUUkVFX0NPREUgKHJocykgPT0gSU5URUdFUl9D U1QpKSkKKyAgICBwcm9tb3RlID0gdHJ1ZTsKKyAgLyogTEhTIG9yIFJIUyBv ZiB0aGUgY29tcGFyc2lvbiBpcyBhbHJlYWR5IHByb21vdGVkLiAgKi8KKyAg ZWxzZSBpZiAoKFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKGxocykpCisJ ICAgID09IFRZUEVfUFJFQ0lTSU9OIChwcm9tb3RlZF90eXBlKSkKKwkgICB8 fCAoVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAocmhzKSkKKwkgICAgICAg PT0gVFlQRV9QUkVDSVNJT04gKHByb21vdGVkX3R5cGUpKSkKKyAgICBwcm9t b3RlID0gdHJ1ZTsKKyAgZWxzZQorICAgIHByb21vdGUgPSBmYWxzZTsKKwor ICBpZiAocHJvbW90ZSkKKyAgICB7CisgICAgICAvKiBDb3BtcGFyaXNvbiB3 aWxsIGhhcHBlbiBpbiBwcm9tb3RlZCB0eXBlLiAgKi8KKyAgICAgIHRyZWUg dGVtcDsKKyAgICAgIGlmIChUUkVFX1RZUEUgKHVzZSkgIT0gVFJFRV9UWVBF IChuZXdfdXNlKSkKKwl0ZW1wID0gbmV3X3VzZTsKKyAgICAgIGVsc2UKKwl7 CisJICB0ZW1wID0gbWFrZV9wcm9tb3RlZF9jb3B5ICh1c2UsIE5VTEwsIHBy b21vdGVkX3R5cGUpOworCSAgZ2ltcGxlIGNvcHlfc3RtdAorCSAgICA9IGdp bXBsZV9idWlsZF9hc3NpZ25fd2l0aF9vcHMgKENPTlZFUlRfRVhQUiwgdGVt cCwKKwkJCQkJICAgIG5ld191c2UsIE5VTExfVFJFRSk7CisJICBnc2kgPSBn c2lfZm9yX3N0bXQgKHN0bXQpOworCSAgZ3NpX2luc2VydF9iZWZvcmUgKCZn c2ksIGNvcHlfc3RtdCwgR1NJX05FV19TVE1UKTsKKwl9CisgICAgICBGT1Jf RUFDSF9JTU1fVVNFX09OX1NUTVQgKG9wLCAqdWkpCisJU0VUX1VTRSAob3As IHRlbXApOworICAgICAgdXBkYXRlX3N0bXQgKHN0bXQpOworICAgICAgcHJv bW90ZV9jc3RfaW5fc3RtdCAoc3RtdCwgcHJvbW90ZWRfdHlwZSk7CisgICAg fQorICBlbHNlIGlmIChUUkVFX1RZUEUgKHVzZSkgIT0gVFJFRV9UWVBFIChu ZXdfdXNlKSkKKyAgICB7CisgICAgICAvKiBDb3BtcGFyaXNvbiB3aWxsIGhh cHBlbiBpbiBvcmlnaW5hbCB0eXBlLiAgKi8KKyAgICAgIHRyZWUgdGVtcDsK KyAgICAgIGlmIChjb3B5X29mX3VzZSkKKwl0ZW1wID0gY29weV9vZl91c2U7 CisgICAgICBlbHNlCisJeworCSAgdGVtcCA9IG1ha2VfcHJvbW90ZWRfY29w eSAodXNlLCBOVUxMLCBUUkVFX1RZUEUgKHVzZSkpOworCSAgZ2ltcGxlIGNv cHlfc3RtdAorCSAgICA9IGdpbXBsZV9idWlsZF9hc3NpZ25fd2l0aF9vcHMg KENPTlZFUlRfRVhQUiwgdGVtcCwKKwkJCQkJICAgIG5ld191c2UsIE5VTExf VFJFRSk7CisJICBnc2kgPSBnc2lfZm9yX3N0bXQgKHN0bXQpOworCSAgZ3Np X2luc2VydF9iZWZvcmUgKCZnc2ksIGNvcHlfc3RtdCwgR1NJX05FV19TVE1U KTsKKwl9CisKKyAgICAgIEZPUl9FQUNIX0lNTV9VU0VfT05fU1RNVCAob3As ICp1aSkKKwlTRVRfVVNFIChvcCwgdGVtcCk7CisgICAgICB1cGRhdGVfc3Rt dCAoc3RtdCk7CisgICAgfQorfQorCisvKiBQcm9tb3RlIGRlZmluaXRpb24g REVGIHRvIE5FV19UWVBFLiAgSWYgdGhlIERFRiBpcyByZXBsYWNlZCBhbmQg aGFzIHRvCisgICBiZSByZWxlYXNlZCwgc2V0IFJFTEVBU0VfREVGLiAgQWxz byByZXR1cm4gQ09QWV9PRl9ERUYgd2l0aCB0aGUgb3JpZ2luYWwKKyAgIHR5 cGUgZm9yIGFueSB1c2Ugc3RhdGVtZW50IHRoYXQgbmVlZHMgdHJ1bmNhdGlv bi4gICovCitzdGF0aWMgdHJlZQorcHJvbW90ZV9kZWZpbml0aW9uICh0cmVl IGRlZiwKKwkJICAgIHRyZWUgcHJvbW90ZWRfdHlwZSwKKwkJICAgIHRyZWUg KmNvcHlfb2ZfZGVmLAorCQkgICAgYm9vbCAqcmVsZWFzZV9kZWYpCit7Cisg IGdpbXBsZSBkZWZfc3RtdCA9IFNTQV9OQU1FX0RFRl9TVE1UIChkZWYpOwor ICBnaW1wbGUgY29weV9zdG10ID0gTlVMTDsKKyAgdHJlZSBuZXdfZGVmOwor ICBiYXNpY19ibG9jayBiYjsKKyAgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgZ3Np OworICBnY2NfYXNzZXJ0IChyZWxlYXNlX2RlZik7CisgICpyZWxlYXNlX2Rl ZiA9IGZhbHNlOworCisgIHN3aXRjaCAoZ2ltcGxlX2NvZGUgKGRlZl9zdG10 KSkKKyAgICB7CisgICAgY2FzZSBHSU1QTEVfUEhJOgorICAgICAgbmV3X2Rl ZiA9IG1ha2VfcHJvbW90ZWRfY29weSAoZGVmLCBkZWZfc3RtdCwgcHJvbW90 ZWRfdHlwZSk7CisgICAgICAqY29weV9vZl9kZWYgPSBOVUxMOworICAgICAg Z2ltcGxlX3BoaV9zZXRfcmVzdWx0IChkZWZfc3RtdCwgbmV3X2RlZik7Cisg ICAgICBTRVRfUEhJX1JFU1VMVCAoZGVmX3N0bXQsIG5ld19kZWYpOworICAg ICAgKnJlbGVhc2VfZGVmID0gdHJ1ZTsKKyAgICAgIHVwZGF0ZV9zdG10IChk ZWZfc3RtdCk7CisgICAgICBwcm9tb3RlX2NzdF9pbl9zdG10IChkZWZfc3Rt dCwgcHJvbW90ZWRfdHlwZSk7CisgICAgICBicmVhazsKKworICAgIGNhc2Ug R0lNUExFX05PUDoKKyAgICAgIC8qIENyZWF0ZSBhIHByb21vdGVkIHR5cGUg Y29weSBvZiBwYXJhbWV0ZXJzLiAgKi8KKyAgICAgIGJiID0gRU5UUllfQkxP Q0tfUFRSX0ZPUl9GTiAoY2Z1bik7CisgICAgICBiYiA9IGdldF9uZXh0X2Ji IChiYik7CisgICAgICBnY2NfYXNzZXJ0IChiYik7CisgICAgICBnc2kgPSBn c2lfYWZ0ZXJfbGFiZWxzIChiYik7CisgICAgICBuZXdfZGVmID0gbWFrZV9w cm9tb3RlZF9jb3B5IChkZWYsIE5VTEwsIHByb21vdGVkX3R5cGUpOworICAg ICAgY29weV9zdG10ID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbl93aXRoX29wcyAo Q09OVkVSVF9FWFBSLCBuZXdfZGVmLAorCQkJCQkJZGVmLCBOVUxMX1RSRUUp OworICAgICAgZ3NpX2luc2VydF9iZWZvcmUgKCZnc2ksIGNvcHlfc3RtdCwg R1NJX05FV19TVE1UKTsKKyAgICAgICpjb3B5X29mX2RlZiA9IGRlZjsKKyAg ICAgIGJyZWFrOworCisgICAgY2FzZSBHSU1QTEVfQVNTSUdOOgorICAgICAg bmV3X2RlZiA9IG1ha2VfcHJvbW90ZWRfY29weSAoZGVmLCBkZWZfc3RtdCwg cHJvbW90ZWRfdHlwZSk7CisgICAgICBnaW1wbGVfYXNzaWduX3NldF9saHMg KGRlZl9zdG10LCBuZXdfZGVmKTsKKyAgICAgIHVwZGF0ZV9zdG10IChkZWZf c3RtdCk7CisgICAgICBpZiAoVFJFRV9DT0RFX0NMQVNTIChnaW1wbGVfYXNz aWduX3Joc19jb2RlIChkZWZfc3RtdCkpCisJICAhPSB0Y2NfY29tcGFyaXNv bikKKwlwcm9tb3RlX2NzdF9pbl9zdG10IChkZWZfc3RtdCwgcHJvbW90ZWRf dHlwZSk7CisgICAgICAqcmVsZWFzZV9kZWYgPSB0cnVlOworICAgICAgKmNv cHlfb2ZfZGVmID0gTlVMTDsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVs dDoKKyAgICAgIG5ld19kZWYgPSBtYWtlX3Byb21vdGVkX2NvcHkgKGRlZiwg TlVMTCwgcHJvbW90ZWRfdHlwZSk7CisgICAgICBjb3B5X3N0bXQgPSBnaW1w bGVfYnVpbGRfYXNzaWduX3dpdGhfb3BzIChDT05WRVJUX0VYUFIsIG5ld19k ZWYsCisJCQkJCQlkZWYsIE5VTExfVFJFRSk7CisgICAgICBnc2kgPSBnc2lf Zm9yX3N0bXQgKGRlZl9zdG10KTsKKyAgICAgIGlmIChsb29rdXBfc3RtdF9l aF9scCAoZGVmX3N0bXQpID4gMCkKKwlpbnNlcnRfbmV4dF9iYiAoZGVmX3N0 bXQsIGNvcHlfc3RtdCk7CisgICAgICBlbHNlCisJZ3NpX2luc2VydF9hZnRl ciAoJmdzaSwgY29weV9zdG10LCBHU0lfTkVXX1NUTVQpOworICAgICAgdXBk YXRlX3N0bXQgKGNvcHlfc3RtdCk7CisgICAgICAqY29weV9vZl9kZWYgPSBk ZWY7CisgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiBuZXdfZGVmOwor fQorCisKKy8qIFByb21vdGUgYWxsIHRoZSBVU0Ugd2l0aCBORVdfVVNFLiAg Ki8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3Byb21vdGVfYWxsX3VzZXMgKHRy ZWUgdXNlLCB0cmVlIG5ld191c2UsIHRyZWUgY29weV9vZl91c2UsIHRyZWUg cHJvbW90ZWRfdHlwZSkKK3sKKyAgZ2ltcGxlIHN0bXQ7CisgIGltbV91c2Vf aXRlcmF0b3IgdWk7CisgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIGdzaTsKKyAg dXNlX29wZXJhbmRfcCBvcDsKKworICAvKiBSZXBsYWNlIGFsbCB0aGUgdXNl IHdpdGggdGhlIHByb21vdGVkIHZhcmlhYmxlLiAgKi8KKyAgRk9SX0VBQ0hf SU1NX1VTRV9TVE1UIChzdG10LCB1aSwgdXNlKQorICAgIHsKKyAgICAgIGlm IChzdG10ID09IFNTQV9OQU1FX0RFRl9TVE1UIChuZXdfdXNlKSkKKwljb250 aW51ZTsKKworICAgICAgc3dpdGNoIChnaW1wbGVfY29kZSAoc3RtdCkpCisJ eworCWNhc2UgR0lNUExFX0FTU0lHTjoKKwkgIHByb21vdGVfYXNzaWduX3N0 bXRfdXNlIChzdG10LCB1c2UsICZ1aSwgbmV3X3VzZSwKKwkJCQkgICBjb3B5 X29mX3VzZSwgcHJvbW90ZWRfdHlwZSk7CisJICBicmVhazsKKwljYXNlIEdJ TVBMRV9QSEk6CisJICBwcm9tb3RlX3BoaV9zdG10X3VzZSAoc3RtdCwgdXNl LCAmdWksIG5ld191c2UsCisJCQkJY29weV9vZl91c2UsIHByb21vdGVkX3R5 cGUpOworCSAgYnJlYWs7CisJY2FzZSBHSU1QTEVfQ09ORDoKKwkgIHByb21v dGVfY29uZF9zdG10X3VzZSAoc3RtdCwgdXNlLCAmdWksIG5ld191c2UsCisJ CQkJIGNvcHlfb2ZfdXNlLCBwcm9tb3RlZF90eXBlKTsKKwkgIGJyZWFrOwor CWNhc2UgR0lNUExFX0RFQlVHOgorCSAgaWYgKFRSRUVfVFlQRSAodXNlKSAh PSBUUkVFX1RZUEUgKG5ld191c2UpKQorCSAgICB7CisJICAgICAgZ3NpID0g Z3NpX2Zvcl9zdG10IChzdG10KTsKKwkgICAgICBnc2lfcmVtb3ZlICgmZ3Np LCB0cnVlKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBHSU1QTEVfUkVU VVJOOgorCWRlZmF1bHQ6CisJICBpZiAoVFJFRV9UWVBFICh1c2UpICE9IFRS RUVfVFlQRSAobmV3X3VzZSkpCisJICAgIHsKKwkgICAgICB0cmVlIHRlbXA7 CisJICAgICAgaWYgKGNvcHlfb2ZfdXNlKQorCQl0ZW1wID0gY29weV9vZl91 c2U7CisJICAgICAgZWxzZQorCQl7CisJCSAgdGVtcCA9IG1ha2VfcHJvbW90 ZWRfY29weSAodXNlLCBOVUxMLCBUUkVFX1RZUEUgKHVzZSkpOworCQkgIGdp bXBsZSBjb3B5X3N0bXQKKwkJICAgID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbl93 aXRoX29wcyAoQ09OVkVSVF9FWFBSLCB0ZW1wLAorCQkJCQkJICAgIG5ld191 c2UsIE5VTExfVFJFRSk7CisJCSAgZ3NpID0gZ3NpX2Zvcl9zdG10IChzdG10 KTsKKwkJICBnc2lfaW5zZXJ0X2JlZm9yZSAoJmdzaSwgY29weV9zdG10LCBH U0lfTkVXX1NUTVQpOworCQl9CisKKwkgICAgICBGT1JfRUFDSF9JTU1fVVNF X09OX1NUTVQgKG9wLCB1aSkKKwkJU0VUX1VTRSAob3AsIHRlbXApOworCSAg ICAgIHVwZGF0ZV9zdG10IChzdG10KTsKKwkgICAgfQorCSAgYnJlYWs7CisJ fQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qIFByb21vdGUgZGVmaW5p dGlvbiBvZiBOQU1FIGFuZCB1c2VzLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBp bnQKK3Byb21vdGVfZGVmX2FuZF91c2VzICh0cmVlIG5hbWUpCit7CisgIHRy ZWUgdHlwZSwgbmV3X25hbWUsIGNvcHlfb2ZfbmFtZTsKKyAgYm9vbCByZWxl YXNlX2RlZiA9IGZhbHNlOworCisgIGlmIChUUkVFX0NPREUgKG5hbWUpICE9 IFNTQV9OQU1FCisgICAgICB8fCBQT0lOVEVSX1RZUEVfUCAoVFJFRV9UWVBF IChuYW1lKSkKKyAgICAgIHx8ICFJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQ RSAobmFtZSkpCisgICAgICB8fCBWRUNUT1JfVFlQRV9QIChUUkVFX1RZUEUg KG5hbWUpKQorICAgICAgfHwgc3NhX3Byb21vdGVkX3AgKG5hbWUpCisgICAg ICB8fCAodHlwZSA9IGdldF9wcm9tb3RlZF90eXBlIChUUkVFX1RZUEUgKG5h bWUpKSkgPT0gVFJFRV9UWVBFIChuYW1lKSkKKyAgICByZXR1cm4gMDsKKwor ICBpZiAocHJvbW90aW9uX3NhZmVfcCAobmFtZSkpCisgICAgeworICAgICAg bmV3X25hbWUgPSBwcm9tb3RlX2RlZmluaXRpb24gKG5hbWUsIHR5cGUsICZj b3B5X29mX25hbWUsCisJCQkJICAgICAmcmVsZWFzZV9kZWYpOworICAgICAg cHJvbW90ZV9hbGxfdXNlcyAobmFtZSwgbmV3X25hbWUsIGNvcHlfb2ZfbmFt ZSwgdHlwZSk7CisgICAgfQorICBlbHNlCisgICAgcHJvbW90ZV9hbGxfdXNl cyAobmFtZSwgbmFtZSwgbmFtZSwgdHlwZSk7CisgIHNldF9zc2FfcHJvbW90 ZWQgKG5hbWUpOworCisgIGlmIChyZWxlYXNlX2RlZikKKyAgICByZWxlYXNl X3NzYV9uYW1lIChuYW1lKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qIE1hcmsg dGhlIGNhbmRpZGF0ZXMuICAqLworc3RhdGljIHZvaWQKK3NldF9zc2FfdG9f YmVfcHJvbW90ZWRfZmxhZyAoZ2ltcGxlIHN0bXQpCit7CisgIHNzYV9vcF9p dGVyIGk7CisgIHRyZWUgZGVmOworICB1c2Vfb3BlcmFuZF9wIG9wOworCisg IHN3aXRjaCAoZ2ltcGxlX2NvZGUgKHN0bXQpKQorICAgIHsKKyAgICBjYXNl IEdJTVBMRV9QSEk6CisgICAgICBkZWYgPSBQSElfUkVTVUxUIChzdG10KTsK KyAgICAgIGJpdG1hcF9zZXRfYml0IChzc2FfdG9fYmVfcHJvbW90ZWRfYml0 bWFwLCBTU0FfTkFNRV9WRVJTSU9OIChkZWYpKTsKKyAgICAgIEZPUl9FQUNI X1BISV9BUkcgKG9wLCBzdG10LCBpLCBTU0FfT1BfVVNFKQorCXsKKwkgIGRl ZiA9IFVTRV9GUk9NX1BUUiAob3ApOworCSAgaWYgKFRSRUVfQ09ERSAoZGVm KSA9PSBTU0FfTkFNRSkKKwkgICAgYml0bWFwX3NldF9iaXQgKHNzYV90b19i ZV9wcm9tb3RlZF9iaXRtYXAsIFNTQV9OQU1FX1ZFUlNJT04gKGRlZikpOwor CX0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIEZPUl9F QUNIX1NTQV9UUkVFX09QRVJBTkQgKGRlZiwgc3RtdCwgaSwgU1NBX09QX1VT RSB8IFNTQV9PUF9ERUYpCisJeworCSAgaWYgKFRSRUVfQ09ERSAoZGVmKSA9 PSBTU0FfTkFNRSkKKwkgICAgYml0bWFwX3NldF9iaXQgKHNzYV90b19iZV9w cm9tb3RlZF9iaXRtYXAsIFNTQV9OQU1FX1ZFUlNJT04gKGRlZikpOworCX0K KyAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogVmlzaXQgUEhJIHN0bXQg YW5kIHJlY29yZCBpZiB2YXJpYWJsZXMgbWlnaHQgaGF2ZSBoaWdoZXIgYml0 cyBzZXQgaWYKKyAgIHByb21vdGVkLiAgKi8KK3N0YXRpYyBib29sCityZWNv cmRfdmlzaXRfcGhpX25vZGUgKGdpbXBsZSBwaGkpCit7CisgIHRyZWUgZGVm OworICBzc2Ffb3BfaXRlciBpOworICB1c2Vfb3BlcmFuZF9wIG9wOworICBi b29sIGhpZ2hfYml0c19zZXQgPSBmYWxzZTsKKyAgdHJlZSBsaHMgPSBQSElf UkVTVUxUIChwaGkpOworCisgIGlmIChUUkVFX0NPREUgKGxocykgIT0gU1NB X05BTUUKKyAgICAgIHx8IFBPSU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKGxo cykpCisgICAgICB8fCAhSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKGxo cykpCisgICAgICB8fCBzc2Ffb3ZlcmZsb3dzX3AgKGxocykpCisgICAgcmV0 dXJuIGZhbHNlOworCisgIEZPUl9FQUNIX1BISV9BUkcgKG9wLCBwaGksIGks IFNTQV9PUF9VU0UpCisgICAgeworICAgICAgZGVmID0gVVNFX0ZST01fUFRS IChvcCk7CisgICAgICBpZiAoc3NhX292ZXJmbG93c19wIChkZWYpKQorCWhp Z2hfYml0c19zZXQgPSB0cnVlOworICAgIH0KKworICBpZiAoaGlnaF9iaXRz X3NldCkKKyAgICB7CisgICAgICBzZXRfc3NhX292ZXJmbG93cyAobGhzKTsK KyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgZWxzZQorICAgIHJldHVy biBmYWxzZTsKK30KKworLyogVmlzaXQgU1RNVCBhbmQgcmVjb3JkIGlmIHZh cmlhYmxlcyBtaWdodCBoYXZlIGhpZ2hlciBiaXRzIHNldCBpZgorICAgcHJv bW90ZWQuICAqLworc3RhdGljIGJvb2wKK3JlY29yZF92aXNpdF9zdG10IChn aW1wbGUgc3RtdCkKK3sKKyAgdHJlZSBkZWY7CisgIHNzYV9vcF9pdGVyIGk7 CisgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICBnY2NfYXNzZXJ0IChnaW1w bGVfY29kZSAoc3RtdCkgPT0gR0lNUExFX0FTU0lHTik7CisgIGVudW0gdHJl ZV9jb2RlIGNvZGUgPSBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KTsK KyAgdHJlZSBsaHMgPSBnaW1wbGVfYXNzaWduX2xocyAoc3RtdCk7CisgIHRy ZWUgcmhzMSA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RtdCk7CisKKyAgaWYg KFRSRUVfQ09ERSAobGhzKSAhPSBTU0FfTkFNRQorICAgICAgfHwgUE9JTlRF Ul9UWVBFX1AgKFRSRUVfVFlQRSAobGhzKSkKKyAgICAgIHx8ICFJTlRFR1JB TF9UWVBFX1AgKFRSRUVfVFlQRSAobGhzKSkpCisgICAgcmV0dXJuIGZhbHNl OworCisgIHN3aXRjaCAoY29kZSkKKyAgICB7CisgICAgICAvKiBDb252ZXJz aW9uIGV4cHJlc3Npb25zIHRoYXQgbWF5IG5lZWQgdG8gYmUgcHJlc2VydmVk LiAgKi8KKyAgICBDQVNFX0NPTlZFUlQ6CisgICAgICBiaXRtYXBfc2V0X2Jp dCAoc3NhX25vdF9zYWZlX2JpdG1hcCwgU1NBX05BTUVfVkVSU0lPTiAobGhz KSk7CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1NBX05BTUU6CisgICAg ICBpZiAoIXNzYV9vdmVyZmxvd3NfcCAobGhzKQorCSAgJiYgc3NhX292ZXJm bG93c19wIChyaHMxKSkKKwl7CisJICBzZXRfc3NhX292ZXJmbG93cyAobGhz KTsKKwkgIGNoYW5nZWQgPSB0cnVlOworCX0KKyAgICAgIGJyZWFrOworCisg ICAgY2FzZSBORV9FWFBSOgorICAgIGNhc2UgTFRfRVhQUjoKKyAgICBjYXNl IExFX0VYUFI6CisgICAgY2FzZSBHVF9FWFBSOgorICAgIGNhc2UgR0VfRVhQ UjoKKyAgICBjYXNlIEVRX0VYUFI6CisgICAgY2FzZSBVTkxUX0VYUFI6Cisg ICAgY2FzZSBVTkxFX0VYUFI6CisgICAgY2FzZSBVTkdUX0VYUFI6CisgICAg Y2FzZSBVTkdFX0VYUFI6CisgICAgY2FzZSBVTkVRX0VYUFI6CisgICAgY2Fz ZSBMVEdUX0VYUFI6CisgICAgY2FzZSBSU0hJRlRfRVhQUjoKKyAgICBjYXNl IExTSElGVF9FWFBSOgorICAgIGNhc2UgV0lERU5fTFNISUZUX0VYUFI6Cisg ICAgICBicmVhazsKKworICAgIGNhc2UgVFJVTkNfRElWX0VYUFI6CisgICAg Y2FzZSBDRUlMX0RJVl9FWFBSOgorICAgIGNhc2UgRkxPT1JfRElWX0VYUFI6 CisgICAgY2FzZSBSRElWX0VYUFI6CisgICAgY2FzZSBST1VORF9ESVZfRVhQ UjoKKyAgICBjYXNlIEVYQUNUX0RJVl9FWFBSOgorICAgICAgaWYgKCFzc2Ff b3ZlcmZsb3dzX3AgKGxocykpCisJeworCSAgc2V0X3NzYV9vdmVyZmxvd3Mg KGxocyk7CisJICBjaGFuZ2VkID0gdHJ1ZTsKKwl9CisgICAgICBicmVhazsK KworICAgICAgLyogRXhwcmVzc2lvbnMgd2hpY2ggbWF5IHByb2R1Y2UgcmVz dWx0cyB0aGF0IHdpbGwgaGF2ZSBoaWdoZXIgYml0cyBpZgorCSBjb21wdXRl ZCBpbiBwcm9tb3RlZCB0eXBlLiAgKGkuZS4gIHJlc3VsdHMgbWF5IG92ZXJm bG93KSAqLworICAgIGNhc2UgTVVMVF9ISUdIUEFSVF9FWFBSOgorICAgIGNh c2UgUExVU19FWFBSOgorICAgIGNhc2UgTUlOVVNfRVhQUjoKKyAgICBjYXNl IE1VTFRfRVhQUjoKKyAgICBjYXNlIEJJVF9YT1JfRVhQUjoKKyAgICBjYXNl IEJJVF9OT1RfRVhQUjoKKyAgICBjYXNlIFdJREVOX01VTFRfRVhQUjoKKyAg ICBjYXNlIFdJREVOX01VTFRfUExVU19FWFBSOgorICAgIGNhc2UgV0lERU5f TVVMVF9NSU5VU19FWFBSOgorICAgIGNhc2UgV0lERU5fU1VNX0VYUFI6Cisg ICAgY2FzZSBCSVRfSU9SX0VYUFI6CisgICAgY2FzZSBCSVRfQU5EX0VYUFI6 CisgICAgICBpZiAoIXNzYV9vdmVyZmxvd3NfcCAobGhzKSkKKwl7CisJICBz ZXRfc3NhX292ZXJmbG93cyAobGhzKTsKKwkgIGNoYW5nZWQgPSB0cnVlOwor CX0KKyAgICAgIGJyZWFrOworCisgICAgICAvKiBFeHByZXNzaW9ucyBmb3Ig d2hpY2ggb3BlcmF0aW9uIGhhcyB0byBiZSBwZXJmb3JtZWQgaW4gb3JpZ2lu YWwKKwkgdHlwZXMgaWYgcHJvbW90ZWQgb3BlcmFuZHMgbWF5IGhhdmUgaGln aGVyIGJpdHMuICAqLworICAgIGNhc2UgTUlOX0VYUFI6CisgICAgY2FzZSBN QVhfRVhQUjoKKyAgICBjYXNlIFJBTkdFX0VYUFI6CisgICAgY2FzZSBBQlNf RVhQUjoKKyAgICBjYXNlIE5FR0FURV9FWFBSOgorICAgIGNhc2UgVFJVTkNf TU9EX0VYUFI6CisgICAgY2FzZSBDRUlMX01PRF9FWFBSOgorICAgIGNhc2Ug RkxPT1JfTU9EX0VYUFI6CisgICAgY2FzZSBST1VORF9NT0RfRVhQUjoKKyAg ICAgIEZPUl9FQUNIX1NTQV9UUkVFX09QRVJBTkQgKGRlZiwgc3RtdCwgaSwg U1NBX09QX1VTRSkKKwl7CisJICBpZiAoc3NhX292ZXJmbG93c19wIChkZWYp KQorCSAgICBiaXRtYXBfc2V0X2JpdCAoc3NhX25vdF9zYWZlX2JpdG1hcCwg U1NBX05BTUVfVkVSU0lPTiAobGhzKSk7CisJfQorICAgICAgYnJlYWs7CisK KyAgICAgIC8qIEV4cHJlc3Npb25zIHRoYXQgaGFzIHRvIGJlIGRvbmUgaW4g b3JpZ2luYWwgdHlwZXMuICAqLworICAgIGNhc2UgTFJPVEFURV9FWFBSOgor ICAgIGNhc2UgUlJPVEFURV9FWFBSOgorICAgICAgYml0bWFwX3NldF9iaXQg KHNzYV9ub3Rfc2FmZV9iaXRtYXAsIFNTQV9OQU1FX1ZFUlNJT04gKGxocykp OworICAgICAgYnJlYWs7CisKKyAgICAgIC8qIFRvIGJlIHNhZmUsIGFsbCBv dGhlciBoYXZlIHRvIGJlIGRvbmUgaW4gb3JpZ2luYWwgdHlwZXMuICAqLwor ICAgIGRlZmF1bHQ6CisgICAgICBiaXRtYXBfc2V0X2JpdCAoc3NhX25vdF9z YWZlX2JpdG1hcCwgU1NBX05BTUVfVkVSU0lPTiAobGhzKSk7CisgICAgICBi cmVhazsKKyAgICB9CisgIHJldHVybiBjaGFuZ2VkOworfQorCisKKy8qIFBy b21vdGUgYWxsIHRoZSBzdG10cyBpbiB0aGUgYmFzaWMgYmxvY2suICAqLwor c3RhdGljIHZvaWQKK3Byb21vdGVfYWxsX3N0bXRzIChiYXNpY19ibG9jayBi YikKK3sKKyAgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgZ3NpOworICBzc2Ffb3Bf aXRlciBpdGVyOworICB0cmVlIGRlZjsKKyAgZm9yIChnc2kgPSBnc2lfc3Rh cnRfcGhpcyAoYmIpOyAhZ3NpX2VuZF9wIChnc2kpOyBnc2lfbmV4dCAoJmdz aSkpCisgICAgeworICAgICAgZ2ltcGxlIHN0bXQgPSBnc2lfc3RtdCAoZ3Np KTsKKyAgICAgIHVzZV9vcGVyYW5kX3Agb3A7CisKKyAgICAgIGRlZiA9IFBI SV9SRVNVTFQgKHN0bXQpOworICAgICAgcHJvbW90ZV9kZWZfYW5kX3VzZXMg KGRlZik7CisgICAgICBGT1JfRUFDSF9QSElfQVJHIChvcCwgc3RtdCwgaXRl ciwgU1NBX09QX1VTRSkKKwl7CisJICBkZWYgPSBVU0VfRlJPTV9QVFIgKG9w KTsKKwkgIHByb21vdGVfZGVmX2FuZF91c2VzIChkZWYpOworCX0KKyAgICB9 CisgIGZvciAoZ3NpID0gZ3NpX3N0YXJ0X2JiIChiYik7ICFnc2lfZW5kX3Ag KGdzaSk7IGdzaV9uZXh0ICgmZ3NpKSkKKyAgICB7CisgICAgICBnaW1wbGUg c3RtdCA9IGdzaV9zdG10IChnc2kpOworCisgICAgICBGT1JfRUFDSF9TU0Ff VFJFRV9PUEVSQU5EIChkZWYsIHN0bXQsIGl0ZXIsIFNTQV9PUF9VU0UgfCBT U0FfT1BfREVGKQorCXByb21vdGVfZGVmX2FuZF91c2VzIChkZWYpOworICAg IH0KK30KKworc3RhdGljIHZvaWQKK3Byb2Nlc3NfYWxsX3N0bXRzX2Zvcl91 bnNhZmVfcHJvbW90aW9uICgpCit7CisgIGJhc2ljX2Jsb2NrIGJiOworICBn aW1wbGVfc3RtdF9pdGVyYXRvciBnc2k7CisgIGF1dG9fdmVjPGdpbXBsZT4g d29ya19saXN0OworCisgIEZPUl9FQUNIX0JCX0ZOIChiYiwgY2Z1bikKKyAg ICB7CisgICAgICBmb3IgKGdzaSA9IGdzaV9zdGFydF9waGlzIChiYik7ICFn c2lfZW5kX3AgKGdzaSk7IGdzaV9uZXh0ICgmZ3NpKSkKKwl7CisJICBnaW1w bGUgcGhpID0gZ3NpX3N0bXQgKGdzaSk7CisJICBzZXRfc3NhX3RvX2JlX3By b21vdGVkX2ZsYWcgKHBoaSk7CisJICB3b3JrX2xpc3Quc2FmZV9wdXNoIChw aGkpOworCX0KKworICAgICAgZm9yIChnc2kgPSBnc2lfc3RhcnRfYmIgKGJi KTsgIWdzaV9lbmRfcCAoZ3NpKTsgZ3NpX25leHQgKCZnc2kpKQorCXsKKwkg IGdpbXBsZSBzdG10ID0gZ3NpX3N0bXQgKGdzaSk7CisJICBzZXRfc3NhX3Rv X2JlX3Byb21vdGVkX2ZsYWcgKHN0bXQpOworCSAgaWYgKGdpbXBsZV9jb2Rl IChzdG10KSA9PSBHSU1QTEVfQVNTSUdOKQorCSAgICB3b3JrX2xpc3Quc2Fm ZV9wdXNoIChzdG10KTsKKwl9CisgICAgfQorCisgIHdoaWxlICh3b3JrX2xp c3QubGVuZ3RoICgpID4gMCkKKyAgICB7CisgICAgICBib29sIGNoYW5nZWQ7 CisgICAgICBnaW1wbGUgc3RtdCA9IHdvcmtfbGlzdC5wb3AgKCk7CisgICAg ICB0cmVlIGxoczsKKworICAgICAgc3dpdGNoIChnaW1wbGVfY29kZSAoc3Rt dCkpCisJeworCWNhc2UgR0lNUExFX0FTU0lHTjoKKwkgIGNoYW5nZWQgPSBy ZWNvcmRfdmlzaXRfc3RtdCAoc3RtdCk7CisJICBsaHMgPSBnaW1wbGVfYXNz aWduX2xocyAoc3RtdCk7CisJICBicmVhazsKKwljYXNlIEdJTVBMRV9QSEk6 CisJICBjaGFuZ2VkID0gcmVjb3JkX3Zpc2l0X3BoaV9ub2RlIChzdG10KTsK KwkgIGxocyA9IFBISV9SRVNVTFQgKHN0bXQpOworCSAgYnJlYWs7CisJZGVm YXVsdDoKKwkgIGdjY19hc3NlcnQgKGZhbHNlKTsKKwkgIGJyZWFrOworCX0K KworICAgICAgaWYgKGNoYW5nZWQpCisJeworCSAgZ2ltcGxlIHVzZV9zdG10 OworCSAgaW1tX3VzZV9pdGVyYXRvciB1aTsKKwkgIEZPUl9FQUNIX0lNTV9V U0VfU1RNVCAodXNlX3N0bXQsIHVpLCBsaHMpCisJICAgIHsKKwkgICAgICBp ZiAoZ2ltcGxlX2NvZGUgKHVzZV9zdG10KSA9PSBHSU1QTEVfQVNTSUdOCisJ CSAgfHwgZ2ltcGxlX2NvZGUgKHVzZV9zdG10KSA9PSBHSU1QTEVfUEhJKQor CQl3b3JrX2xpc3Quc2FmZV9wdXNoICh1c2Vfc3RtdCk7CisJICAgIH0KKwl9 CisgICAgfQorfQorCitjbGFzcyB0eXBlX3Byb21vdGlvbl9kb21fd2Fsa2Vy IDogcHVibGljIGRvbV93YWxrZXIKK3sKK3B1YmxpYzoKKyAgdHlwZV9wcm9t b3Rpb25fZG9tX3dhbGtlciAoY2RpX2RpcmVjdGlvbiBkaXJlY3Rpb24pCisg ICAgOiBkb21fd2Fsa2VyIChkaXJlY3Rpb24pIHt9CisgIHZpcnR1YWwgdm9p ZCBiZWZvcmVfZG9tX2NoaWxkcmVuIChiYXNpY19ibG9jayBiYikKKyAgICB7 CisgICAgICBwcm9tb3RlX2FsbF9zdG10cyAoYmIpOworICAgIH0KK307CisK Ky8qIE1haW4gZW50cnkgcG9pbnQgdG8gdGhlIHBhc3MuICAqLworc3RhdGlj IHVuc2lnbmVkIGludAorZXhlY3V0ZV90eXBlX3Byb21vdGlvbiAodm9pZCkK K3sKKyAgbl9zc2FfdmFsID0gbnVtX3NzYV9uYW1lczsKKyAgc3NhX25vdF9z YWZlX2JpdG1hcCA9IHNiaXRtYXBfYWxsb2MgKG5fc3NhX3ZhbCk7CisgIGJp dG1hcF9jbGVhciAoc3NhX25vdF9zYWZlX2JpdG1hcCk7CisgIHNzYV90b19i ZV9wcm9tb3RlZF9iaXRtYXAgPSBzYml0bWFwX2FsbG9jIChuX3NzYV92YWwp OworICBiaXRtYXBfY2xlYXIgKHNzYV90b19iZV9wcm9tb3RlZF9iaXRtYXAp OworICBzc2Ffc2V0c19oaWdoZXJfYml0c19iaXRtYXAgPSBzYml0bWFwX2Fs bG9jIChuX3NzYV92YWwpOworICBiaXRtYXBfY2xlYXIgKHNzYV9zZXRzX2hp Z2hlcl9iaXRzX2JpdG1hcCk7CisKKyAgcHJvY2Vzc19hbGxfc3RtdHNfZm9y X3Vuc2FmZV9wcm9tb3Rpb24gKCk7CisgIC8qIFdhbGsgdGhlIENGRyBpbiBk b21pbmF0b3Igb3JkZXIuICAqLworICB0eXBlX3Byb21vdGlvbl9kb21fd2Fs a2VyIChDRElfRE9NSU5BVE9SUykKKyAgICAud2FsayAoRU5UUllfQkxPQ0tf UFRSX0ZPUl9GTiAoY2Z1bikpOworCisgIHNiaXRtYXBfZnJlZSAoc3NhX25v dF9zYWZlX2JpdG1hcCk7CisgIHNiaXRtYXBfZnJlZSAoc3NhX3RvX2JlX3By b21vdGVkX2JpdG1hcCk7CisgIHNiaXRtYXBfZnJlZSAoc3NhX3NldHNfaGln aGVyX2JpdHNfYml0bWFwKTsKKyAgcmV0dXJuIDA7Cit9CisKK25hbWVzcGFj ZSB7Citjb25zdCBwYXNzX2RhdGEgcGFzc19kYXRhX3R5cGVfcHJvbW90aW9u ID0KK3sKKyAgR0lNUExFX1BBU1MsIC8qIHR5cGUgKi8KKyAgInByb21vdGlv biIsIC8qIG5hbWUgKi8KKyAgT1BUR1JPVVBfTk9ORSwgLyogb3B0aW5mb19m bGFncyAqLworICBUVl9UUkVFX1RZUEVfUFJNVCwgLyogdHZfaWQgKi8KKyAg UFJPUF9zc2EsIC8qIHByb3BlcnRpZXNfcmVxdWlyZWQgKi8KKyAgMCwgLyog cHJvcGVydGllc19wcm92aWRlZCAqLworICAwLCAvKiBwcm9wZXJ0aWVzX2Rl c3Ryb3llZCAqLworICAwLCAvKiB0b2RvX2ZsYWdzX3N0YXJ0ICovCisgIChU T0RPX2NsZWFudXBfY2ZnIHwgVE9ET191cGRhdGVfc3NhIHwgVE9ET192ZXJp ZnlfYWxsKSwKK307CisKK2NsYXNzIHBhc3NfdHlwZV9wcm9tb3Rpb24gOiBw dWJsaWMgZ2ltcGxlX29wdF9wYXNzCit7CitwdWJsaWM6CisgIHBhc3NfdHlw ZV9wcm9tb3Rpb24gKGdjYzo6Y29udGV4dCAqY3R4dCkKKyAgICA6IGdpbXBs ZV9vcHRfcGFzcyAocGFzc19kYXRhX3R5cGVfcHJvbW90aW9uLCBjdHh0KQor ICB7fQorCisgIC8qIG9wdF9wYXNzIG1ldGhvZHM6ICovCisgIG9wdF9wYXNz ICogY2xvbmUgKCkgeyByZXR1cm4gbmV3IHBhc3NfdHlwZV9wcm9tb3Rpb24g KG1fY3R4dCk7IH0KKyAgdmlydHVhbCBib29sIGdhdGUgKGZ1bmN0aW9uICop IHsgcmV0dXJuIGZsYWdfdHJlZV90eXBlX3BybXQgIT0gMDsgfQorICB2aXJ0 dWFsIHVuc2lnbmVkIGludCBleGVjdXRlIChmdW5jdGlvbiAqKQorICAgIHsK KyAgICAgIHJldHVybiBleGVjdXRlX3R5cGVfcHJvbW90aW9uICgpOworICAg IH0KKworfTsgLy8gY2xhc3MgcGFzc190eXBlX3Byb21vdGlvbgorCit9IC8v IGFub24gbmFtZXNwYWNlCisKK2dpbXBsZV9vcHRfcGFzcyAqCittYWtlX3Bh c3NfdHlwZV9wcm9tb3Rpb24gKGdjYzo6Y29udGV4dCAqY3R4dCkKK3sKKyAg cmV0dXJuIG5ldyBwYXNzX3R5cGVfcHJvbW90aW9uIChjdHh0KTsKK30KKwo= --------------070501070107000607060106--